Linux学习笔记[2-9]
《Linux就该这么学》学习笔记
HERE
笔记: Wiseer
资料来源:老刘
Linux 泡泡
欢迎交流:514165492@qq.com
转载须知: :warning: 转载请附上出处、原作者等重要信息,并告知本人获取授权
:laughing: 帅的人都会看这里:
本资料是关于Linux技术的学习笔记,这一版只包含前九章节的内容,其中第一章节不作整理,请看书自行补充
笔记中有较为详细的实验操作步骤,具体参数有做修改,参考时请小可爱们根据实际情况来实操
我是老刘的第25期学生(同门的兄弟挥挥手吖),个人听课并结合老刘书籍资料整理的,文中部分图片来源于老刘的泡泡网站
老刘讲课耐心风趣,谁听谁知道,但是确实没我帅 :cowboy_hat_face: ,没给我广告费,所以不能说他帅
笔记中只记录了本人觉得重要的内容,难免有些地方有疏露错误,欢迎指点江山,本白愿意改正
老刘教书不易,写书也辛苦,望各位支持正版,我确实比他帅就不说了,还得交学费
话不多说,直接上目录,点击下方 :arrow_down_small: 即可跳转哟!
[TOC]
:heart: :heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart:
第二章 必须掌握的Linux命令
命令名称 [命令参数] [命令对象]
长格式 : man –help
段格式: man -h
1.常用 系统工作
命令
echo – 输出字符串 或 提取Shell变量的值
# echo linuxprobe.com
date – 显示日期与时间
# date "+%Y-%m-%d %H:%M:%S"
# date -s
更新时间reboot – 重启计算机
# reboot
poweroff – 关闭操作系统并切断电源
# poweroff
wget – 文件下载
# wget -r -q -P/home http://···
下载到指定目录ps – 显示进程状态
# ps aux
显示用户、没有控制终端及其他信息进程top – 实时显示进程动态(任务管理器)
# top
pidof – 返回运行程序的进程ID
# pidof sshd
kill – 杀死进程
# kill 2156
killall – 使用进程名称来杀死一组进程
# killall httpd
Ctrl + C :停止命令
命令末尾上添加&:命令将进入系统后台来执行
2.系统状态
检测命令
history – 显示历史操纵命令
# history
# history -c
: 清空历史命令# !15
:重复执行第15行的命名sosreport –收集系统配置及架构信息并输出诊断文档
# sosreport
3. 工作目录切换
命令
4.文本文件编辑
命令
5 .文件目录管理
命令
6.打包压缩
与搜索
命令
find – 查找和搜索文件
# find / user linuxprobe -exec cp -a {} /root/findresults/ \
目的:在整个文件系统中找出所有归属于linuxprobe用户的文件并复制到/root/findresults目录。
“
-exec {} ··· \;
” :其中{}
表示find命令搜索出每一个文件,并且命令的结尾必须是“\;
”
第三章 管道符、重定向与环境变量
1.输入输出重定向
输入重定向
中用到的符号及其作用
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
输出重定向
中用到的符号及其作用
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
对于重定向中的标准输出模式,可以省略文件描述符1 不写, 但错误输出模式的文件描述符2必须要写!
2.管道命令符
命令A | 命令B
把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入
- 通过匹配关键词/sbin/nologin找出了所有被限制登录系统的用户
# grep "/sbin/nologin" /etc/passwd | wc -l
- 用翻页的形式查看/etc目录中的文件列表及属性信息
# ls -l /etc/ | more
- 密码重置
# echo "mima" | passwd --stdin root
- 邮件内容与标题打包
# echo "Content" | mail -s "Subject" linuxprobe
3.命令符的通配符
* : | 匹配零个或多个字符 | # ls -l /dev/sda* 会匹配sda sda1 sda2 sda3 |
---|---|---|
? : | 匹配单个字符 | # ls -l /dev/sda? 会匹配 sda1 sad2 几个字符就输入几个? |
[0-9] : | 匹配0~9的数字 | # ls -l /dev/sda[0-9] |
[1,3,5] : | 精确匹配 | # ls -l /dev/sda[1,3,5] 逗号最好不省略 |
[a-z] : | 匹配单个小写字母 | |
[A-Z] : | 匹配单个大写字母 |
4.常用的转义字符
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串 转义符。"\$$5" = $5
单引号(’’):转义其中所有的变量为单纯的字符串。单纯字符串
双引号(””):保留其中的变量属性,不进行转义处理。
反引号():把其中的命令执行后返回结果。:zap:注意是反引号不是单引号
如果输入的对象或参数有空格的话,用” “(双引号)括起来
# echo " Price is $PRICE"
1 | # 定义一个名为PRICE的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息 |
把命令执行后返回结果
1
2# 查看本机的linux版本和内核信息
# echo `uname -a`
5.重要环境变量
- 命令路径 :/bin /ls
- 别名命令:alias 别名 = 命令
- 内部命令:
- 外部命令:常用的命令 用 whereis 命令名
来判断是否为外部命令
Linux系统中最重要的10个环境变量
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
小写是命令,大写是变量PATH
第四章 vim编辑器与shell 命令脚本
1 Vim文本编辑器
a:光标后面一位 i:光标当前位置 o:换行 :wq! 强制保存退出
Vim中常用的命令
命令 | 作用 |
---|---|
dd | 删除(剪切)光标所在整行 |
5dd | 删除(剪切)从光标处开始的5行 |
yy | 复制光标所在整行 |
5yy | 复制从光标处开始的5行 |
n | 显示搜索命令定位到的下一个字符串 |
N | 显示搜索命令定位到的上一个字符串 |
u | 撤销上一步的操作 |
p | 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 |
末行模式中可用的命令
命令 | 作用 |
---|---|
:w | 保存 |
:q | 退出 |
:q! | 强制退出(放弃对文档的修改内容) |
:wq! | 强制保存退出 |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
:命令 | 执行该命令 |
:整数 | 跳转到该行 |
:s/one/two | 将当前光标所在行的第一个one替换成two |
:s/one/two/g | 将当前光标所在行的所有one替换成two |
:%s/one/two/g | 将全文中的所有one替换成two |
?字符串 | 在文本中从下至上搜索该字符串 |
/字符串 | 在文本中从上至下搜索该字符串 |
1.2 配置主机名称
# vim /etc/hostname
第1步:使用Vim编辑器修改“/etc/hostname”主机名称文件。
第2步:把原始主机名称删除后追加“linuxprobe.com”。注意,使用Vim编辑器修改主机名称文件后,要在末行模式下执行:wq!命令才能保存并退出文档。
第3步:保存并退出文档,然后使用hostname命令检查是否修改成功。
1.3 配置网卡信息
:bulb: 方法一:界面操作
- RHEL 7 是
# nmtui
- 重启网卡
# systemctl restart network
:bulb: 方法三 : 图形化界面操作
# nm-connection-editor
- 选择编辑 IPv4 Settings 修改
- 重启网卡
:bulb: 方法二:名编辑网卡配置文件
第一步:查看本机网卡相关信息 # ifconfig
确定ifcfg-en0xxxxxxxx的值
第二步 :打开网卡配置文件 # vim etc/sysconfig/network-scripts/ifcfg-eno16777736
第三步:编辑相关参数
TYPE=Ethernet
BOOTPROTO=static
NAME=eno16777736
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1
第四步:重启网卡 # systemctl restart network
设备类型:TYPE=Ethernet
地址分配模式:BOOTPROTO=static
网卡名称:NAME=eno16777736
是否启动:ONBOOT=yes
IP地址:IPADDR=192.168.10.10
子网掩码:NETMASK=255.255.255.0
网关地址:GATEWAY=192.168.10.1
DNS地址:DNS1=192.168.10.1
1.4 配置Yum仓库
:checkered_flag: 准备工作 : 将虚拟机的光盘设备指向ISO镜像
第一步:创建系统镜像挂载目录 # mkdir -p /media/cdrom
第二步:编辑挂载信息 # /etc/fstab
写入 /dev/cdrom /media/cdrom iso9660
第三步:进入目录 # cd /etc/yum.repos.d/
使用Vim文本编辑器创建Yum仓库的配置文件 # vim /etc/yum.repos.d/rhel7.repo
1 | [rhel] |
第三步:把光盘设备中的系统镜像挂载到/media/cdrom目录 # mount -a
第四步:查看挂载情况 # df -h
2 编写Shell脚本
运行脚本: bash
脚本申明:#!/bin/bash
脚本注释:#解释说明脚本功能
脚本命令:pwd ls -al
1 | [root@linuxprobe ~]# vim example.sh |
2.1 接收用户的参数
1 | [root@linuxprobe ~]# vim example.sh |
2.3 判断用户的参数
按照测试对象来划分,条件测试语句可以分为4种:
文件测试语句;
逻辑测试语句;
整数值比较语句;
字符串比较语句。
- 文件测试所用的参数
操作符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
:zap: echo $? 显示返回值,返回值 0 为存在,返回值 非零 为不存在 $ 符号用于提取变量的值!
1 | [root@linuxprobe ~]# [ -d /etc/fstab ] |
- 逻辑测试语句
|| : 或 && :与 ?:非
&& 若前面成功,则执行后面
|| 若前面失败,则执行后面
! 取反
1 | # 用来判断/dev/cdrom文件是否存在,若存在则输出Exist字样 |
- 可用的整数比较运算符
操作符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
1 | [ `free -m | grep Men: | awk '{print $4}'` -lt 1024 ] && echo "danger" || echo "chongzu" |
free -m
查看内存使用量情况(单位为MB)
grep Men:
过滤出剩余内存量的行
awk
: 文件逐行的读入 ,读取第四个数据
-lt 1024
: 比较是否小于1024
- 常见的字符串比较运算符
操作符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
3 流程控制语句
3.1 if
条件测试语句
- 单分支的if语句
- 双分支的if条件语句
- 多分支的if条件语句
1 | # 验证某台主机是否在线 |
1 | # 使用多分支的if条件语句来判断用户输入的分数在哪个成绩区间内,然后输出如Excellent、Pass、Fail等提示信息 |
3.2 for
条件循环语句
eg: 批量创建用户名的脚本(p89)
1 | [root@linuxprobe ~]# vim Example.sh |
/dev/null
是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。
/etc/passwd
是用来保存用户账户信息的文件。如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建的用户信息。
eg: 判断主机是否在线(p90)
1 | [root@linuxprobe ~]# vim CheckHosts.sh |
3.3 while
条件循环语句
while
循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环
1 | [root@linuxprobe~] # vim Guess.sh |
3.4 case
条件测试语句
case
语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)
中所定义的默认命令
1 | [root@linuxprobe ~]# vim Checkkeys.sh |
4 计划任务服务程序
4.1 at
命令 一次性的计划任务
# at time
设置一次性任务
# at -l
查看已设置好但还未执行的一次性计划任务
# atrm 任务序号
删除任务
- 设置在今晚23:30分自动重启网站服务
1 | [root@linuxprobe ~]# at 23:30 |
- 结合
管道符 |
1 | [root@linuxprobe ~]# echo "systemctl restart httpd" | at 23:30 |
- 删除两个相同的一次性计划任务的其中一个
1 | [root@linuxprobe ~]# atrm 3 |
4.2 crond
服务 有周期性的计划任务
# crontab -e
创建、编辑计划任务的命令
# crontab -l
查看当前计划任务的命令
# crontab -r
删除某条计划任务的命令
分 时 日 月 周 命令
如果有些字段没有设置,则需要使用星号(*)占位
:zap: 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。
使用crond设置任务的参数字段说明
字段 | 说明 |
---|---|
分钟 | 取值为0~59的整数 |
小时 | 取值为0~23的任意整数 |
日期 | 取值为1~31的任意整数 |
月份 | 取值为1~12的任意整数 |
星期 | 取值为0~7的任意整数,其中0与7均为星期日 |
命令 | 要执行的命令或程序脚本 |
eg : 每周一、三、五的凌晨3点25分,使用tar命令把某个网站的数据目录进行打包处理,使其作为一个备份文件
1 | [root@linuxprobe ~]# crontab -e #创建计划任务,自动调用vim编译器 |
用逗号(,)来分别表示多个时间段,例如“8,9,12”表示8月、9月和12月。
用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的12~15日)。
用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔2分钟执行一次任务)。
eg: 添加一条计划任务,它的功能是每周一至周五的凌晨1点钟自动清空/tmp目录内的所有文件。
1 | [root@linuxprobe ~]# whereis rm |
在
crond
服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用
whereis 命令
进行查询,
第五章 文件权限与归属
5.1 用户身份与能力
管理员
UID
为0:系统的管理员用户。系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。
通过使用用户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务
useradd
命令 –创建新的用户# useradd -d /home -u 9999 -s /sbin/nologin linuxprobe
-d
指定用户的家目录(默认为/home/username)-u
指定该用户的默认UID-s
指定该用户的默认Shell解释器
usermod
命令 – 修改用户的属性# usermod -G root linuxprobe
-c
填写用户账户的备注信息-d -m
参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去-e
账户的到期时间,格式为YYYY-MM-DD-g
变更所属用户组-G
变更扩展用户组-L
锁定用户禁止其登录系统-U
解锁用户,允许其登录系统-s
变更默认终端-u
修改用户的UID
passwd
命令 –修改用户密码、过期时间、认证信息等# passwd
-l
锁定用户,禁止其登录# passwd -l linuxprobe
--stdin
允许通过标准输入修改用户密码# echo "NewPassWord" | passwd --stdin Username
-d
使该用户可用空密码登录系统-e
强制用户在下次登录时修改密码-S
显示用户的密码是否被锁定,以及密码所采用的加密算法名称
5.2 文件权限与归属
# ls -l
# chmod +权限(-权限) 文件名称
设置文件或目录的权限 , 大写参数-R
来表示递归操作 +授权 -取消权限
# chown 用户:用户组 文件名称
设置文件或目录的所有者和所属组
-
:普通文件。
d
:目录文件。
l
:链接文件。
b
:块设备文件。
c
:字符设备文件。
p
:管道文件。
文件权限的字符与数字表示: read write execute
通过ls命令查看到的文件属性信息:
5.3 文件的特殊权限
rws
rws
rwt
7777 满权限
SUID
4
执行者临时拥有属主的权限u + s
- 将
rwx
改成rws
原有权限 - 将
rw-
改成rwS
原没有权限 # chmod u+s 文件
- 将
SGID
2
获取到文件所属组的权限g + s
- 将
rwx
改成rws
原有权限 - 将
rw-
改成rwS
原没有权限 # chmod g+s 文件
- 将
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
1 | EG : |
5.4 文件的隐藏属性
chattr
# chattr +权限 文件
# chattr -权限 文件
i
无法对文件进行修改;仅能修改其中的子文件内容而不能新建或删除文件a
仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)S
文件内容在变更后立即同步到硬盘(sync)s
彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)A
不再修改这个文件或目录的最后访问时间(atime)b
不再修改文件或目录的存取时间D
检查压缩文件中的错误d
使用dump命令备份时忽略本文件/目录c
默认将文件或目录进行压缩u
当删除该文件后依然保留其在硬盘中的数据,方便日后恢复t
让文件系统支持尾部合并(tail-merging)x
可以直接访问压缩文件中的内容把某个隐藏功能添加到文件上,命令后面追加“
+
参数”,把某个隐藏功能移出文件,追加“
-
参数”lsattr 显示文件的隐藏权限
:zap: 删除目标文件
1
2
3
4# ls
# lsattr initial.cfg 显示隐藏权限
# chattr -a initial.cfg -a就是去除无法删除权限
# rm initial.cfg
5.5 文件访问控制列表
1 | [root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root |
针对目录文件需要使用
-R
递归参数;针对普通文件则使用
-m
参数;如果想要删除某个文件的ACL,则可以使用
-b
参数。su - linuxprobe : 切换用户
:zap: 怎么去查看文件上有那些ACL呢?
1 | [root@linuxprobe ~]# ls -ld /root |
常用的ls命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(
.
)变成了加号(+
),这就意味着该文件已经设置了ACL了
5.6 su命令与sudo服务
su
命令可以解决切换用户身份的需求# su - mrxxd
-
添加减号完全切换到新的用户。# exit
注销sudo
命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务。
限制用户执行指定的命令:
记录用户执行的每一条命令;
配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
验证密码的后5分钟内(默认值)无须再让用户再次验证密码。
sudo 服务中的可用参数以及作用
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
visudo 命令
如果担心直接修改配置文件会出现问题,则可以使用sudo命令提供的visudo命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
1 | [root@linuxprobe ~]# visudo |
如果需要让某个用户只能使用root管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用whereis命令找出命令所对应的保存路径,然后把配置文件第99行的用户权限参数修改成对应的路径即可:
1 | whereis cat |
:zap: 可以添加NOPASSWD参数,使得用户执行sudo命令时不再需要密码验证:
1 | [linuxprobe@linuxprobe ~]$ exit |
第六章 存储结构与磁盘划分
6.1 一切从“/”开始
Linux系统中常见的目录名称以及相应内容
目录名称 | 应放置文件的内容 |
---|---|
/boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
/dev | 以文件形式存放任何设备与接口 |
/etc | 配置文件 |
/home | 用户主目录 |
/bin | 存放单用户模式下还可以操作的命令 |
/lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 |
/sbin | 开机过程中需要的命令 |
/media | 用于挂载设备文件的目录 |
/opt | 放置第三方的软件 |
/root | 系统管理员的家目录 |
/srv | 一些网络服务的数据文件目录 |
/tmp | 任何人均可使用的“共享”临时目录 |
/proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
/usr/local | 用户自行安装的软件 |
/usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 |
/usr/share | 帮助与说明文件,也可放置共享文件 |
/var | 主要存放经常变化的文件,如日志 |
/lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
绝对路径指的是从根目录(/)开始写起的文件或目录名称,
相对路径则指的是相对于当前路径的写法
6.2 物理设备的命名规则
常见的硬件设备及其文件名称
硬件设备 | 文件名称 |
---|---|
IDE设备 | /dev/hd[a-d] |
:star:SCSI/SATA/U盘 硬盘 | /dev/sd[a-p] sda sdb sdc |
软驱 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
:star:光驱 | /dev/cdrom |
鼠标 | /dev/mouse |
磁带机 | /dev/st0或/dev/ht0 |
:grey_question: 坑一:第一个知识点是设备名称的理解错误。很多培训讲师和Linux技术图书中会提到,比如/dev/sda表示主板上第一个插槽上的存储设备,学员或读者在实践操作的时候会发现果然如此,因此也就对这条理论知识更加深信不疑
:zap: 正解:/dev目录中sda设备之所以是a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的.
:grey_question: 坑二:第二个知识点是对分区名称的理解错误。很多Linux培训讲师会告诉学员,分区的编号代表分区的个数
:zap: 正解:sda3只能表示是编号为3的分区,而不能判断sda设备上已经存在了3个分区.
主分区
或扩展分区的编号从1开始,到4结束;
逻辑分区
从编号5
开始。
- 首先,/dev/目录中保存的应当是硬件设备文件;
- 其次,
sd
表示是存储设备;然后,a表示系统中同类接口中第一个被识别到的设备 - 最后,
5
表示这个设备是一个逻辑分区。“区的设备文件” /dev/sda5
表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分
所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。
6.3 文件系统与数据资料
Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。
Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。
XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。
独立的inode表格
- 该文件的访问权限(read、write、execute);
- 该文件的所有者与所属组(owner、group);
- 该文件的大小(size);
- 该文件的创建或内容修改时间(ctime);
- 该文件的最后一次访问时间(atime);
- 该文件的修改时间(mtime);
- 文件的特殊权限(SUID、SGID、SBIT);
- 该文件的真实数据地址(point)。
VFS的架构示意图
6.4 挂载硬件设备
mount
命令用于挂载文件系统# mount /dev/sdb2 /backup
-a
挂载所有在/etc/fstab中定义的文件系统-t
指定文件系统的类型
umount
命令用于撤销已经挂载的设备文件# umount /dev/sdb2
如果想将文件系统为ext4的硬件设备/dev/sdb2在开机后自动挂载到/backup目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab文件中写入下面的信息:
1
2
3
4
5
6
7
8
9
10
11
12[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults 0 0 <-----------------
备份 挂载 格式 权限 备份 自检
用于挂载信息的指定填写格式中,各字段所表示的意义
字段 | 意义 |
---|---|
设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) |
挂载目录 | 指定要挂载到的目录,需在挂载前创建好 |
格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 |
权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async |
是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 |
是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 |
6.5 添加硬盘设备
添加硬盘设备的操作思路:
- 首先需要在虚拟机中模拟添加入一块新的硬盘存储设备,
- 然后再进行分区、格式化、挂载等操作,
- 最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。
分区
第1步:
我们首先使用fdisk命令来尝试管理/dev/sdb硬盘设备。在看到提示信息后输入参数p
来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:
1 | [root@linuxprobe ~]# fdisk /dev/sdb <----------------管理/dev/sdb硬盘设备 |
第2步:
输入参数n
尝试添加新的分区。系统会要求您是选择继续输入参数p
来创建主分区,还是输入参数e
来创建扩展分区。这里输入参数p来创建一个主分区:
1 | Command (m for help): n <-----------------添加新的分区 |
第3步:
在确认创建一个主分区后,系统要求您先输入主分区的编号。这里输入默认的1就可以了。接下来系统会提示定义起始的扇区位置,我们敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,需要输入+2G即可创建出一个容量为2GB的硬盘分区。
1 | Partition number (1-4, default 1): 1 <-----------------输入主分区的编号 |
第4步:
再次使用参数p
来查看硬盘设备中的分区信息。这时候千万不要直接关闭窗口,而应该敲击参数w
后回车,这样分区信息才是真正的写入成功啦。
1 | Command (m for help): p <-----------------查看硬盘设备中的分区信息 |
第5步:
在上述步骤执行完毕之后,Linux系统会自动把这个硬盘主分区抽象成/dev/sdb1设备文件。我们可以使用file
命令查看该文件的属性,但是刘遄老师在讲课和工作中发现,有些时候系统并没有自动把分区信息同步给Linux内核,而且这种情况似乎还比较常见(但不能算作是严重的bug)。我们可以输入partprobe
命令手动将分区信息同步到内核,推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧,这个杀手锏百试百灵,一定会有用的。
1 | [root@linuxprobe ]# file /dev/sdb1 <----------------- 查看该文件的属性 |
格式化
这条命令很有意思,因为在Shell终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果:
1 | [root@linuxprobe ~]# mkfs |
要格式分区为XFS的文件系统,则命令应为mkfs.xfs /dev/sdb1
1 | [root@linuxprobe ~]# mkfs.xfs /dev/sdb1 <-----------------格式化分区 |
挂载
终于完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用mount
命令将存储设备与挂载点进行关联;最后使用df -h
命令来查看挂载状态和硬盘使用量信息。
1 | [root@linuxprobe ~]# mkdir /newFS # 创建一个用于挂载设备的挂载点目录 |
如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件中:
1 | [root@linuxprobe ~]# vim /etc/fstab |
6.6 添加交换分区
SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。
1 | [root@linuxprobe ~]# fdisk /dev/sdb <----------------- |
使用SWAP分区专用的格式化命令mkswap
,对新建的主分区进行格式化操作
1 | [root@linuxprobe ~]# mkswap /dev/sdb2 <----------------- |
使用swapon
命令把准备好的SWAP分区设备正式挂载到系统中
1 | [root@linuxprobe ~]# swapon /dev/sdb2 <----------------- |
为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入到配置文件中,并记得保存:
1 | [root@linuxprobe ~]# vim /etc/fstab <----------------- |
6.7 磁盘容量配额
点击查看(ctrl +) :linux 中inode
包含什么内容
软限制(bsoft=3m isoft=3):当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
硬限制(bhard=6m ihard=6):当达到硬限制时会提示用户,且强制终止用户的操作。
接下来创建一个用于检查quota磁盘容量配额效果的用户tom,并针对/boot目录增加其他人的写权限,保证用户能够正常写入数据:
1 | [root@linuxprobe ~]# useradd tom |
1 | # 具体的限额控制包括:硬盘使用量的软限制和硬限制分别为3MB和6MB;创建文件数量的软限制和硬限制分别为3个和6个。 |
把用户tom的硬盘使用量的硬限额从5MB提升到8MB:
1 | [root@linuxprobe ~]# edquota -u tom |
6.8 软硬方式链接
硬链接(hard link):可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件
软链接(soft link):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。
关于 inode
inode 相关命令
- 查看inode总数和已经使用的数量:
df -i
- 查看每个inode节点的大小:
sudo dumpe2fs -h /dev/hda | grep "Inode size"
- 查看每个文件对应的inode号码:
ls -i example.txt
- 查看整个目录文件(文件名及inode号码):
ls -i /etc
- 查看文件详细信息:
ls -l /etc
- 查看inode总数和已经使用的数量:
inode 的特殊作用
- 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
- 移动文件或重命名文件,只是改变文件名,不影响inode号码。
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名
实际问题:
在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。
查找原因:
/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。
解决方案:
1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:
1 | ln -s /opt/newcache /data/cache |
第七章 使用RAID与LVM磁盘阵列技术
7.1 RAID磁盘冗余阵列
7.1.1 部署磁盘阵列
mdadm
用于管理 Linux 系统中的软件RAID硬盘阵列-a
检测设备名称-n
指定设备数量-l
指定RAID级别-C
创建-v
显示过程-f
模拟设备损坏-r
移除设备-Q
查看摘要信息-D
查看详细信息-S
停止RAID磁盘阵列
第一步:查看一下硬盘情况: # ls -l /dev/sd*
创建磁盘阵列# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd[b-e]
查看一下md0磁盘简要的信息# mdadm -Q /dev/md0
查看一下md0磁盘详细的信息及同步状态# mdadm -D /dev/md0
-C参数代表创建一个RAID阵列卡;
-v参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0就是创建后的RAID磁盘阵列的名称;
-a yes参数代表自动创建设备文件;
-n 4参数代表使用4块硬盘来部署这个RAID磁盘阵列;
-l 10参数则代表RAID 10方案;
最后再加上4块硬盘设备的名称就搞定了
第二步:将RAID磁盘阵列格式化# mkfs.xfs /dev/md0
格式化的格式可以随意的 ext4 或者xfs 都可以
第三步:创建一个目录foot作为挂载点# mkdir /foot
第四步:挂载到foot目录上面# mount /dev/md0 /foot
查看一下挂载完后的信息# df -h
第五步: 将挂载信息写入配置文件 # vim /etc/fstab
:zap:
最底行写入 /dev/md0 /foot xfs defaults 0 0
0 不备份 0不自检
7.1.2 损坏磁盘阵列及修复
:bulb: 替换掉坏掉的硬盘,将新的硬盘插入。
第一步:先查看硬盘状态 # mdadm -D /dev/md0
第二步:卸载掉当前的挂载点:# umount /foot
第三步:为磁盘整列组添加新的磁盘:# mdadm /dev/md0 -a /dev/sd*
* 星号 代表那个盘坏了添加哪个
第四步:查看一下同步信息:# mdadm -D /dev/md0
等待它同步完成
第五步:重新挂载阵列磁盘:# mount /dev/md0 /foot
查看一下挂载完后的信息# df -h
7.1.3 磁盘阵列+备份盘
第一步 :创建一个RAID 5的磁盘整列和备份盘# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sd[b-e]
查看一下同步信息:# mdadm -D /dev/md0
等待它同步完成
-n 3代表创建这个RAID 5磁盘阵列所需的硬盘数,
-l 5代表RAID的级别
-x 1则代表有一块备份盘
第二步:将RAID 5磁盘阵列格式化# mkfs.xfs /dev/md0
第三步:创建一个目录foot作为挂载点# mkdir /foot
第四步:挂载阵列磁盘# mount -a
查看一下挂载完后的信息# df -h
第五步: 将挂载信息写入配置文件 # vim /etc/fstab
:zap:
最底行写入 /dev/md0 /foot xfs defaults 0 0
0 不备份 0不自检
效果:
- 损坏磁盘4之前:
- 损坏磁盘后备份磁盘3顶替原先损坏的磁盘位置:
简单无痛解决Linux下修改/etc/fstab导致无法启动的问题
7.2 LVM逻辑卷管理器
LVM可以允许用户对硬盘资源进行动态调整。
物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列,这都可以。
卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。
逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是LVM的核心理念。
:happy:老刘易懂例子解释:小明家里想吃馒头但是面粉不够了,于是妈妈从隔壁老王家、老李家、老张家分别借来一些面粉,准备蒸馒头吃。首先需要把这些面粉(物理卷[PV,Physical Volume])揉成一个大面团(卷组[VG,Volume Group]),然后再把这个大面团分割成一个个小馒头(逻辑卷[LV,Logical Volume]),而且每个小馒头的重量必须是每勺面粉(基本单元[PE,Physical Extent])的倍数。
7.2.1 部署逻辑卷
:card_file_box: 部署LVM时,需要逐个配置 物理卷——>卷组——>逻辑卷
常用的LVM部署命令
功能/命令 | 物理卷管理 pv | 卷组管理 vg | 逻辑卷管理 lv |
---|---|---|---|
扫描 | pvscan | vgscan | lvscan |
建立 | pvcreate | vgcreate | lvcreate |
显示 | pvdisplay | vgdisplay | lvdisplay |
删除 | pvremove | vgremove | lvremove |
扩展 | 无 | vgextend | lvextend |
缩小 | 无 | vgreduce | lvreduce |
:file_cabinet: 步骤:预先准备好两个硬盘
第一步:让新添加的两块硬盘设备支持LVM技术 # pvcreate /dev/sdb /dev/sdc
第二步:把两块硬盘设备加入到storage卷组中 # vgcreate storage /dev/sdb /dev/sdc
查看卷组的状态 # vgdisplay
storage 卷组名称 命名随意 foot 也行,主要是自己认识
第三步:切割出一个约为150MB的逻辑卷设备 # lvcreate -n vo -l 37 storage
-n vo
卷组名称统一默认vo
-l 37
生成一个大小为37×4MB=148MB的逻辑卷
-L 150M
生成一个大小为150MB的逻辑卷
第四步:把生成好的逻辑卷进行格式化 # mkfs.ext4 /dev/storage/vo
/dev/卷组名/逻辑卷名
第五步:创建挂载点进行挂载 # mkdir /foot
# mount /dev/storage/vo /foot
第六步:查看挂载状态 # df -h
写入到配置文件 # echo "/dev/storage/vo /foot ext4 defaults 0 0" >> /etc/fstab
7.2.2 扩容逻辑卷
第一步:卸载设备 # umount /foot
第二步:上一个实验中的逻辑卷vo扩展至290MB # lvextend -L 290M /dev/storage/vo
第三步:检查硬盘完整性 # e2fsck -f /dev/storage/vo
并重置硬盘容量 # resize2fs /dev/storage/vo
第四步:重新挂载硬盘设备并查看挂载状态 # mount -a
`# df -h`
7.2.3 缩小逻辑卷
注意事项:
:zap:
xfs
格式不能缩小操作:zap: 操作之前一定要做备份!!
在对LVM逻辑卷进行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)
第一步:卸载设备 # umount /foot
第二步:检查文件系统的完整性 # e2fsck -f /dev/storage/vo
第三步:把逻辑卷vo的容量减小到120MB # resize2fs /dev/storage/vo 120M
第四步:重新挂载文件系统并查看系统状态 # mount -a
# df -h
7.2.4 逻辑卷快照
注意事项:
第一步:首先查看卷组的信息 # vgdisplay
第二步:用重定向往逻辑卷设备所挂载的目录中写入一个文件 # echo "Welcome to my style" > /foot/readme.txt
第三步:用-s
参数生成一个快照卷,使用-L
参数指定切割的大小 # lvcreate -L 120M -s -n SNAP /dev/storage/vo
查看快照信息 # lvdisplay
SNAP :快照的名称!
/dev/storage/vo :快照备份对象
快照还原:
第一步:先卸载逻辑卷设备 # umount /foot
第二步: 还原快照# lvconvert --merge /dev/storage/SNAP
第三步:重新挂载 # mount -a
7.2.5 删除逻辑卷
注意事项: :zap: 需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒
第一步:取消逻辑卷与目录的挂载关联,# umount /foot
第二步:删除配置文件中永久生效的设备参数。# vim /etc/fstab
第三步:删除逻辑卷设备,需要输入y来确认操作 # lvremove /dev/storage/vo
Do you really want to remove active logical volume vo? [y/n]: y
第四步:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。 # vgremove storage
第五步:删除物理卷设备 # pvremove /dev/sdb /dev/sdc
第八章 Iptables与Firewalld防火墙
iptables、firewall-cmd、firewall-config和TCP Wrappers等防火墙策略配置服务
8.1 防火墙管理工具
8.2 Iptables
8.2.1 策略与规则链
8.2.2 基本的命令参数
8.3 Firewalld
RHEL 7系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。
firewalld中常用的区域名称及策略规则
区域 | 默认规则策略 |
---|---|
:eyes: trusted | 允许所有的数据包 |
home | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量 |
internal | 等同于home区域 |
work | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量 |
:eyes: public | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量 |
external | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
dmz | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
block | 拒绝流入的流量,除非与流出的流量相关 |
:eyes: drop | 拒绝流入的流量,除非与流出的流量相关 |
8.3.1 终端管理工具
ewall-cmd命令中使用的参数以及作用
- –get-default-zone 查询默认的区域名称
- –set-default-zone=<区域名称> 设置默认的区域,使其永久生效-
- -get-zones 显示可用的区域
- –get-services 显示预先定义的服务
- –get-active-zones 显示当前正在使用的区域与网卡名称
- –add-source= 将源自此IP或子网的流量导向指定的区域
- –remove-source= 不再将源自此IP或子网的流量导向某个指定区域
- –add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
- –change-interface= <网卡名称> 将某个网卡与区域进行关联
- –list-all 示当前区域的网卡配置参数、资源、端口以及服务等信息
- –list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
- –add-service= <服务名> 设置默认区域允许该服务的流量
- –add-port= <端口号/协议> 设置默认区域允许该端口的流量
- –remove-service= <服务名> 设置默认区域不再允许该服务的流量
- –remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
- –reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
- –panic-on 开启应急状况模式
- –panic-off 关闭应急状况模式
参数 | 作用 |
---|---|
–get-default-zone | 查询默认的区域名称 |
–set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
–get-zones | 显示可用的区域 |
–get-services | 显示预先定义的服务 |
–get-active-zones | 显示当前正在使用的区域与网卡名称 |
–add-source= | 将源自此IP或子网的流量导向指定的区域 |
–remove-source= | 不再将源自此IP或子网的流量导向某个指定区域 |
–add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
–change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
–list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
–list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
–add-service=<服务名> | 设置默认区域允许该服务的流量 |
–add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
–remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
–remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
–reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
–panic-on | 开启应急状况模式 |
–panic-off | 关闭应急状况模式 |
- 运行时(Runtime)模式
- 又称为当前生效模式,而且随着系统的重启会失效
- 永久(Permanent)模式
- 设置防火墙策略时添加
--permanent
参数,防火墙策略就可以永久生效 - 如果想让配置的策略立即生效,需要手动执行
# firewall-cmd --reload
命令
- 设置防火墙策略时添加
:bookmark_tabs: 查看 get firewall服务当前所使用的区域
# firewall-cmd --get-default-zone
:bookmark_tabs: 把firewalld服务的当前默认区域设置为 public:
# firewall-cmd --set-default-zone=public
:bookmark_tabs: 查询eno16777736网卡在firewalld服务中的区域
# firewall-cmd --get-zone-of-interface=eno16777736
:bookmark_tabs: 启动/关闭firewalld防火墙服务的应急状况模式 panic ,阻断一切网络连接
# firewall-cmd --panic-on
启动紧急状况
# firewall-cmd --panic-off
关闭紧急状况
:bookmark_tabs: 查询public区域是否允许请求 querySSH和HTTPS协议的流量:query
# firewall-cmd --zone=public --query-service=ssh
# firewall-cmd --zone=public --query-service=https
:bookmark_tabs: 把firewalld服务中请求HTTPS协议的流量设置为永久允许 add,并立即生效
# firewall-cmd --zone=public --add-service=https
# firewall-cmd --permanent --zone=public --add-service=https
永久生效
# firewall-cmd --reload
把firewalld服务中请求HTTP协议的流量设置为永久拒绝 remove,并立即生效:
# firewall-cmd --permanent --zone=public --remove-service=http
# firewall-cmd --reload
把在firewalld服务中访问8080和8081端口的流量策略设置为允许,但仅限当前生效
# firewall-cmd --zone=public --add-port=8080-8081/tcp
# firewall-cmd --zone=public --list-ports
把原本访问本机888端口的流量转发到22端口,要且求当前和长期均有效:
# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
# firewall-cmd --reload
8.3.2 图形管理工具
1:选择运行时(Runtime)模式或永久(Permanent)模式的配置。
2:可选的策略集合区域列表。
3:常用的系统服务列表。
4:当前正在使用的区域。
5:管理当前被选中区域中的服务。
6:管理当前被选中区域中的端口。
7:开启或关闭SNAT(源地址转换协议)技术。
8:设置端口转发策略。
9:控制请求icmp服务的流量。
10:管理防火墙的富规则。
11:管理网卡设备。
12:被选中区域的服务,若勾选了相应服务前面的复选框,则表示允许与之相关的流量。
13:firewall-config工具的运行状态。
8.4 服务的访问控制列表
TCP Wrappers服务的控制列表文件中常用的参数
客户端类型 | 示例 | 满足示例的客户端列表 |
---|---|---|
单一主机 | 192.168.10.10 | IP地址为192.168.10.10的主机 |
指定网段 | 192.168.10. | IP段为192.168.10.0/24的主机 |
指定网段 | 192.168.10.0/255.255.255.0 | IP段为192.168.10.0/24的主机 |
指定DNS后缀 | .linuxprobe.com | 所有DNS后缀为.linuxprobe.com的主机 |
指定主机名称 | www.linuxprobe.com | 主机名称为www.linuxprobe.com的主机 |
指定所有客户端 | ALL | 所有主机全部包括在内 |
第9章 使用ssh服务管理远程主机
9.1 配置网卡服务
9.1.1 配置网卡参数
nmtui
方法详细配置件见第四章:arrow_left: 点击查看
9.1.2 创建网络会话
使用了网络会话功能后只需在不同的使用环境中激活相应的网络会话,就可以实现网络配置信息的自动切换了
:bookmark_tabs:查看网络信息: # nmcli connection show
:bookmark_tabs:查看网络状态及详细信息: # nmcli con show eno16777736
:bookmark_tabs:创建网络会话: # nmcil connection add con-name type ifname
- 公司
# nmcli connection add con-name company ifname eno16777736 autoconnect no type ethernet ip4 192.168.10.10/24 gw4 192.168.10.1
- 家庭
# nmcli connection add con-name house type ethernet ifname eno16777736
:bookmark_tabs:查看创建的所有网络会话: # nmcli connection show
如果使用的是虚拟机,请把虚拟机系统的网卡(网络适配器)切换成桥接模式,如图9-9所示。然后重启虚拟机系统即可。
:bookmark_tabs: 启用house网络会话:# nmcli connection up house
9.1.3 绑定两块网卡
网络传输的速度变得更快;
一块网卡突然出现了故障,另外一块网卡便会立即自动顶替上去,保证数据传输不会中断
第一步: 在虚拟机系统中再添加一块网卡设备,请确保两块网卡模式相同
第二步:使用Vim文本编辑器来配置网卡设备的绑定参数
- **`# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736`**
- TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=eno16777736 确保不能输错
MASTER=bond0
SLAVE=yes- **`# vim /etc/sysconfig/network-scripts/ifcfg-eno33554968`** - **MASTER=bond0 SLAVE=yes**
第三步:将绑定后的设备命名为bond0并把IP地址等信息填写进去
# vim /etc/sysconfig/network-scripts/ifcfg-bond0
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes yes开机启用它
USERCTL=no 不通过命令行进行控制
DEVICE=bond0IPADDR=192.168.10.10
PREFIX=24 等同 255.255.255.0
DNS=192.168.10.1
NM_CONTROLLED=no
第四步:使用Vim文本编辑器创建一个用于网卡绑定的驱动文件
# vim /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=6mode0(平衡负载模式):平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术。
mode1(自动备援模式):平时只有一块网卡工作,在它故障后自动替换为另外的网卡。
mode6(平衡负载模式):平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持。
- 面使用Vim文本编辑器创建一个用于网卡绑定的驱动文件,使得绑定后的bond0网卡设备能够支持绑定技术bonding);
- 同时定义网卡以mode6模式进行绑定,且出现故障时自动切换的时间为100毫秒。
第五步:重启网络服务后网卡绑定操作即可成功
# systemctl restart network
9.2 远程控制服务
9.2.1 配置sshd服务
SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux系统的首选方式
两种安全验证的方法:
- 基于口令的验证—用账户和密码来验证登录;
- 基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;
sshd服务配置文件中包含的参数以及作用
参数 | 作用 |
---|---|
Port 22 | 默认的sshd服务端口 |
ListenAddress 0.0.0.0 | 设定sshd服务器监听的IP地址 |
Protocol 2 | SSH协议的版本号 |
HostKey /tc/ssh/ssh_host_key | SSH协议版本为1时,DES私钥存放的位置 |
HostKey /etc/ssh/ssh_host_rsa_key | SSH协议版本为2时,RSA私钥存放的位置 |
HostKey /etc/ssh/ssh_host_dsa_key | SSH协议版本为2时,DSA私钥存放的位置 |
:eyes: PermitRootLogin yes | 设定是否允许root管理员直接登录 |
StrictModes yes | 当远程用户的私钥改变时直接拒绝连接 |
MaxAuthTries 6 | 最大密码尝试次数 |
MaxSessions 10 | 最大终端数 |
PasswordAuthentication yes | 是否允许密码验证 |
PermitEmptyPasswords no | 是否允许空密码登录(很不安全) |
:bookmark_tabs: 禁止以root管理员的身份远程登录到服务器
第一步:使用Vim文本编辑器打开sshd服务的主配置文件 # vim /etc/ssh/sshd_config
第二步:修改第48
行参数
#PermitRootLogin yes
改为PermitRootLogin no
- # 井号去掉 ,并把 yes 改为 no
第三步:重启sshd # systemctl restart sshd
第四步:加入到开机启动项 # systemctl enable sshd
登录方式 : # ssh 192.168.10.10
9.2.2 安全密钥验证
第一步:在客户端主机中生成“密钥对” # ssh-keygen
第二步:把客户端主机中生成的公钥文件传送至远程主机 # ssh-copy-id 192.168.10.10
第三步:对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式 # vim /etc/ssh/sshd_config
1 | ………………省略部分输出信息……………… |
第四步:重启sshd服务 # systemctl restart sshd
第五步:在客户端尝试登录到服务器,此时无须输入密码也可成功登录 # ssh 192.168.10.10
9.2.3 远程传输命令
scp
是一个基于SSH协议在网络之间进行安全传输的命令-v
显示详细的连接进度-P
指定远程主机的sshd端口号-r
用于传送文件夹 要传送整个文件夹内的所有数据,还需要额外添加参数-r进行递归操作-6
使用IPv6协议
上传
- scp /本地文件名 IP地址:/上传路径
# scp /root/readme.txt 192.168.10.20:/home
- scp /本地文件名 IP地址:/上传路径
下载
- scp IP地址:文件名 /路径
# scp 192.168.10.20:/etc/redhat-release /root
- scp IP地址:文件名 /路径
9.3 不间断会话服务
screen
是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序
- 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
- 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
- 会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享
screen
命令-S
参数创建会话窗口-d
参数将指定会话进行离线处理-r
参数恢复指定会话;-x
参数一次性恢复所有的会话 同步;-ls
参数显示当前已有的会话;-wipe
参数把目前无法使用的会话删除
9.3.1 管理远程会话
:bookmark_tabs: 创建一个名称为backup的会话窗口 : # screen -S backup
:bookmark_tabs:查看到当前的会话 : # screen -ls
:bookmark_tabs: 退出一个会话: # exit
9.3.2 会话共享功能
screen
命令不仅可以确保用户在极端情况下也不丢失对系统的远程控制,保证了生产环境中远程工作的不间断性,而且它还具有会话共享、分屏切割、会话锁定等实用的功能。其中,会话共享功能是一件很酷的事情,当多个用户同时控制主机的时候,它可以把屏幕内容共享出来,也就是说每个用户都可以看到相同的内容。
首先使用ssh服务程序将终端A远程连接到服务器,并创建一个会话窗口
1 | [root@client A ~]# ssh 192.168.10.10 |
使用ssh服务程序将终端B远程连接到服务器,并执行获取远程会话的命令
1 | [root@client B ~]# ssh 192.168.10.10 |