五、存储结构与管理硬盘
Linux
系统中颇具特色的文件存储结构常常搞得新手头昏脑涨,本章将从
Linux 系统中的文件存储结构开始,讲述文件系统层次标准(
Filesystem Hierarchy Standard
,
FHS
)、
udev 硬 件命名规则以及硬盘设备的原理。
本章详细地分析
Linux 系统中最常见的
Ext3
、
Ext4 与 XFS 文件系统的不同之处,并带领各位读者着重练习硬盘设备分区、格 式化以及挂载等常用的硬盘管理操作,以便熟练掌握文件系统的使用方法。进一步完整地部署交换(
SWAP
)分区、配置
quota
磁盘配额服务、使用
VDO
(虚拟数据优化)技术,以及掌握 ln 命令带来的软硬链接。
1.一切从“/”开始
在
Linux 系统中,目录、字符设备、套接字、硬盘、光驱、打印机等都被抽象成文件形式,“
Linux 系统中一切都是文件”。既然平时我们打交道的都是文件,那么又应该如何找到它们呢?在Windows 操作系统中,想要找到一个文件,要依次进入该文 件所在的磁盘分区(也叫盘符),然后再进入该分区下的具体目录,最终找到这个文件。但是在
Linux
系统中并不存在
C
、
D
、
E
、
F
等盘符,
Linux 系统中的一切文件都是从“根”目录(/) 开始的,并按照文件系统层次标准(
FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途。
另外,
Linux
系统中的文件和目录名称是严格区分大小写的。例如,
root
、
rOOt
、
Root、rooT 均代表不同的目录,并且文件名称中不得包含斜杠(/
)。
Linux 系统中的文件存储结构如图
前文提到的
FHS
是根据以往无数
Linux 系统用户和开发者的经验而总结出来的,是用户在
Linux 系统中存储文件时需要遵守的规则,用于指导用户应该把文件保存到什么位置,以及告诉用户应该在何处找到所需的文件。但是,
FHS 对于用户来讲只能算是一种道德上的约束,有些用户就是懒得遵守,依然会把文件到处乱放,有些甚至从来没有听说过它。
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 当文件系统发生错误时,将一些丢失的文件片段存放在这里
存储结构与管理硬盘
在
Linux
系统中另外还有一个重要的概念—路径。路径指的是如何定位到某个文件,分为绝对路径与相对路径。绝对路径指的是从根目录(/)开始写起的文件或目录名称,而相对路径则指的是相对于当前路径的写法。
2.物理设备的命名规则
在
Linux 系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的
udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理
/dev 目录下的设备文件。
常见的硬件设备及其文件名称
IDE 设备 /dev/hd[a-d]
SCSI/SATA/U 盘 /dev/sd[a-z]
Virtio 设备 /dev/vd[a-z]
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-15]
光驱 /dev/cdrom
鼠标 /dev/mouse
磁带机 /dev/st0 或/dev/ht0
由于现在的
IDE
设备已经很少见了,所以一般的硬盘设备都是以“
/dev/sd”开头。而一台主机上可以有多块硬盘,因此系统采用
a
~
z
来代表
26
块不同的硬盘(默认从
a 开始分配),而且硬盘的分区编号也很有讲究:
1.主分区或扩展分区的编号从
1
开始,到
4
结束;
2.逻辑分区从编号
5
开始。
分析一下
/dev/sda5
这个设备文件名称包含哪些信息,
首先,
/dev/
目录中保存的应当是硬件设备文件;其次,
sd
表示的是存储设备;然后,a表示系统中同类接口中第一个被识别到的设备;最后,
5 表示这个设备是一个逻辑分区。一言以蔽之,“
/dev/sda5
”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为
5 的逻辑分区的设备文件”。
硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用
446
字节,分区表占用
64
字节,结束符占用
2 字节;其中分区表中每记录一个分区信息就需要
16
字节,这样一来最多只有
4
个分区信息可以写到第一个扇区中,这
4 个分区就是
4
个主分区。第一个扇区中的数据信息如图
每块硬盘最多只能创建出
4
个分区,这明显不合情理也不够用。
为了解决分区个数不够的问题,可以将第一个扇区的分区表中 16 字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用
16
字节分区表空间的指针
—一个指向另外一个分区的指针。这样一来,用户一般会选择使用
3
个主分区加
1 个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于
4 个)的需求。当然,就目前来讲大家只要明白为什么主分区不能超过
4 个就足够了。主分区、扩展分区、逻辑分区可以像图
6-4
那样来规划。
如果参加红帽
RHCE
考试或者购买了一台云主机,还会看到类似于
/dev/vda、/dev/vdb
这样的设备。这种以
vd
开头的设备叫作
Virtio 设备,简单来说就是一种虚拟化设备。像
KVM
、
Xen
这种虚拟机监控器(
Hypervisor
)默认就都是这种设备
3.文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。
Linux
系统支持数十种文件系统,而最常见的文件系统如下所示。
Ext2:最早可追溯到 1993 年,是 Linux 系统的第一个商业级文件系统,它基本沿袭了 UNIX 文件系统的设计标准。但由于不包含日志读写功能,数据丢失的可能性很大,因此大家能不用就不用,或者顶多建议用于 SD 存储卡或 U 盘。
Ext3:是一款日志文件系统,它会把整个硬盘的每个写入动作的细节都预先记录下来,然后再进行实际操作,以便在发生异常宕机后能回溯追踪到被中断的部分。Ext3 能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能 100%地保证资料不会丢失。
Ext4:Ext3 的改进版本,作为 RHEL 6 系统中默认的文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4 文件系统能够批量分配 block(块),从而极大地提高了读写效率。现在很多主流服务器也会使用 Ext4 文件系统。
XFS:是一种高性能的日志文件系统,而且是 RHEL 7/8 中默认的文件管理系统。它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只需花费极低的计算和存储性能。它支持的最大存储容量为 18EB,这几乎满足了所有需求。
RHEL 7/8
系统中一个比较大的变化就是使用了
XFS
作为文件系统,这不同于
RHEL 6 使用的
Ext4
。
在拿到一块新的硬盘存储设备后,先需要分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;也可以选择不进行分区,但是必须对硬盘进行格式化处理。
日常需要保存在硬盘中的数据实在太多了,因此
Linux
系统中有一个名为
super block 的“硬盘地图”。Linux 并不是把文件内容直接写入到这个“硬盘地图”里面,而是在里面记录着整个文件系统的信息。因为如果把所有的文件内容都写入到这里面,它的体积将变得非常大,而且文件内容的查询与写入速度也会变得很慢。
Linux
只是把每个文件的权限与属性记录在
inode 中,而且每个文件占用一个独立的
inode
表格,该表格的大小默认为
128
字节,里面记录着如下信息:
该文件的访问权限(
read
、
write
、
execute
);
该文件的所有者与所属组(
owner
、
group
);
该文件的大小(
size
);
该文件的创建或内容修改时间(
Ctime
);
该文件的最后一次访问时间(
Atime
);
该文件的修改时间(
Mtime
);
文件的特殊权限(
SUID
、
SGID
、
SBIT
);
该文件的真实数据地址(
point
)。
而文件的实际内容则保存在
block
块中(大小一般是
1KB
、
2KB
或
4KB
),一个
inode 的默认大小仅为
128
字节,记录一个
block
则消耗
4
字节。当文件的
inode
被写满后,
Linux 系统会自动分配出一个
block
,专门用于像
inode
那样记录其他
block
块的信息,这样把各个 block块的内容串到一起,就能够让用户读到完整的文件内容了。对于存储文件内容的
block 块,有下面两种常见的情况(以
4KB
大小的
block
为例进行说明)。
情况
1
:文件很小(
1KB
),但依然会占用一个
block
,因此会潜在地浪费
3KB
。
情况
2
:文件很大(
5KB
),那么会占用两个
block
(
5KB−4KB
后剩下的
1KB 也要占用一个
block
)。
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,
Linux
内核中的软件层为用户程序提供了一个虚拟文件系统(Virtual FileSystem
,
VFS)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
从中可见,实际文件系统在 VFS 下隐藏了自己的特性和细节,这样用户在日常使用时会觉得“文件系统都是一样的”,也就可以随意使用各种命令在任何文件系统中进行各种操作了(比如使用
cp 命令来复制文件)。
VFS
也有点像一个翻译官。我们不需要知道对方的情况,只要告诉 VFS 想进行的操作是什么,它就会自动判断对方能够听得懂什么指令,然后翻译并交代下去。这可以让用户不用操心这些“小事情”,专注于自己的操作。
4.挂载硬件设备
我们在用惯了
Windows
系统后总觉得一切都是理所当然的,平时把
U 盘插入到电脑后也从来没有考虑过
Windows
系统做了哪些事情,才使得我们可以访问这个
U 盘的。接下来学习在
Linux 系统中挂载和卸载存储设备的方法,以便更好地了解 Linux 系统添加硬件设备的工作原理和流程。前面讲到,在拿到一块全新的硬盘存储设备后要先分区,然后格式化,最后才能挂载并正常使用。“分区”和“格式化”大家以前经常听到,但“挂载”又是什么呢?
当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。
1.mount命令
mount
命令用于挂载文件系统,格式为“
mount
文件系统 挂载目录”。
挂载是在使用硬件设备前所执行的最后一步操作。只需使用mount 命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设备中的数据了。对于比较新的
Linux
系统来讲,一般不需要使用
-t 参数来指定文件系统的类型,Linux
系统会自动进行判断。而
mount
中的
-a
参数则厉害了,它会在执行后自动检查/etc/fstab文件中有无被疏漏挂载的设备文件,如果有,则进行自动挂载操作。
mount
命令中的参数以及作用
-a 挂载所有在/etc/fstab
中定义的文件系统
-t 指定文件系统的类型
例如,要把设备
/dev/sda2
挂载到
/backup
目录,只需要在
mount 命令中填写设备与挂载目录参数就行,系统会自动判断要挂载文件的类型,命令如下:
如果在工作中要挂载一块网络存储设备,该设备的名字可能会变来变去,这样再写为sdb
就不太合适了。这时推荐用
UUID
(
Universally Unique Identifier,通用唯一识别码)进行挂载操作。UUID 是一串用于标识每块独立硬盘的字符串,具有唯一性及稳定性,特别适合用来挂载网络设备。使用 blkid命令,来获取独立硬盘的
UUID 。
blkid
命令用于显示设备的属性信息,英文全称为“
block id
”,语法格式为“
blkid [设备名
]
”。使用
blkid
命令来查询设备
UUID
的示例如下:
有了设备的
UUID
值之后,就可以用它挂载网络设备
虽然按照上面的方法执行 mount 命令后就能立即使用文件系统了,但系统在重启后挂载就会失效,也就是说需要每次开机后都手动挂载一下。这肯定不是我们想要的效果,如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”
写入到
/etc/fstab 文件中。这个文件中包含着挂载所需的诸多信息项目,一旦配置好之后就能 一劳永逸了。
用于挂载信息的指定填写格式中,各字段所表示的意义
设备文件 一般为设备的路径+
设备名称,也可以写通用唯一识别码(
UUID
)
189
挂载目录 指定要挂载到的目录,需在挂载前创建好
格式类型 指定文件系统的格式,比如 Ext3
、
Ext4
、
XFS
、
SWAP
、
iso9660
(此为光盘设备)等
权限选项 若设置为 defaults
,则默认权限为
rw
、
suid
、
dev
、
exec
、
auto
、
nouser
、
async
是否备份 若为 1
则开机后使用
dump
进行磁盘备份,为
0
则不备份
是否自检 若为 1
则开机后自动进行磁盘自检,为
0
则不自检
如果想将文件系统为
Ext4
的硬件设备
/dev/sdb2
在开机后自动挂载到
/backup 目录上,并保持默认权限且无须开机自检,就需要在
/etc/fstab 文件中写入下面的信息,这样在系统重启后也会成功挂载。
由于后面需要使用系统镜像制作
Yum/DNF 软件仓库,我们提前把光盘设备挂载到/media/cdrom
目录中。光盘设备的文件系统格式是
iso9660
:
写入到
/etc/fstab
文件中的设备信息并不会立即生效,需要使用
mount -a 参数进行自动挂载:
2.df命令
df
命令用于查看已挂载的磁盘空间使用情况,英文全称为“
disk free”,语法格式为“
df -h
”。
df命令能查看当前系统中设备的挂载情况
。它不仅能够列出系统中正在使用的设备有哪些,还可以用
-h 参数便捷地对存储容量进行“进位”操作。例如,在遇到
10240K
的时候会自动进位写成
10M
,非常方便我们的阅读。
建议在
fstab
文件挂载信息中加上
_netdev 参数。加上后系统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况
。
3.umount命令
挂载文件系统的目的是为了使用硬件资源,而卸载文件系统则意味不再使用硬件的设备资源。既然挂载操作就是把硬件设备与目录两者进行关联的动作,那么卸载操作只需要说明想要取消关联的设备文件或挂载目录的其中一项即可,一般不需要加其他额外的参数。
umount
命令用于卸载设备或文件系统,英文全称为“
un mount
”,语法格式为“
umount [设备文件
/
挂载目录
]
”。
如果我们当前就处于设备所挂载的目录,系统会提示该设备繁忙,此时只需要退出到其他目录后再尝试一次就行了。轻松搞定。
如果系统中硬盘特别多,分区特别多,我们都不知道它们是否有被使用,又或者是做了些什么。此时,就可以用
lsblk 命令以树状图的形式列举一下了。
lsblk
命令用于查看已挂载的磁盘的空间使用情况,英文全称为“
list block id”,输入该命令后按回车键执行即可。
5.添加硬盘设备
添加硬盘设备的操作思路:首先需要在虚拟机中模拟添加入一块新的硬盘存储设备,然后再进行分区、格式化、挂载等操作,最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。
不需要为了做这个实验而特意买一块真实的硬盘,而是通过虚拟机软件进行硬件模拟,
首先把虚拟机系统关机,稍等几分钟会自动返回到虚拟机管理主界面,然后单击“编辑虚拟机设置”选项,在弹出的界面中单击“添加”按钮,新增一块硬件设备
选择想要添加的硬件类型为“硬盘”,然后单击“下一步”按钮
选择虚拟硬盘的类型为
SATA
,并单击“下一步”按钮。这样虚拟机中的设备名称过一会儿后应该为
/dev/sdb
。
选中“创建新虚拟磁盘”单选按钮(而不是其他选项),再次单击“下一步”按钮
将“最大磁盘大小”设置为默认的
20GB。这个数值是限制这台虚拟机所使用的最大硬盘空间,而不是立即将其填满,因此默认
20GB
就很合适了。单击“下一步”按钮,
设置磁盘文件的文件名和保存位置(这里采用默认设置即可,无须修改),直接单击“完成”按钮。
将新硬盘添加好后就可以看到设备信息了。这里不需要做任何修改,直接单击“确定”按钮后就可以启虚拟机了,
在虚拟机中模拟添加了硬盘设备后就应该能看到抽象后的硬盘设备文件了。按照前文讲解的
udev
服务命名规则,第二个被识别的
SATA
设备应该会被保存为
/dev/sdb,这个就是硬盘设备文件了。但在开始使用该硬盘之前还需要进行分区操作,例如从中取出一个
2GB 的分区设备以供后面的操作使用。
1.fdisk命令
fdisk
命令用于新建、修改及删除磁盘的分区表信息,英文全称为“
format disk”,语法格式为“
fdisk
磁盘名称”。
在
Linux
系统中,管理硬盘设备最常用的方法就当属 fdisk 命令了。它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。不过与前面讲解的直接写到命令后面的参数不同,这条命令的参数
是交互式的一问一答的形式,因此在管理硬盘设备时特别方便,可以根据需求动态调整
fdisk
命令中的参数以及作用
m 查看全部可用的参数
n 添加新的分区
d 删除某个分区信息
l 列出所有可用的分区类型
t 改变某个分区的类型
p 查看分区表信息
w 保存并退出
q 不保存直接退出
首先使用
fdisk
命令来尝试管理
/dev/sdb
硬盘设备。在看到提示信息后输入参数
p 来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:
输入参数
n
尝试添加新的分区。系统会要求用户是选择继续输入参数
p 来创建主分区,还是输入参数
e
来创建扩展分区。这里输入参数
p
来创建一个主分区:
在确认创建一个主分区后,系统要求用户先输入主分区的编号。在前文得知,主分区的编号范围是
1
~
4,因此这里输入默认的 1 就可以了。接下来系统会提示定义起始的扇区位置,这不需要改动,敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入
+2G
即可创建出一个容量为 2GB的硬盘分区。
再次使用参数
p
来查看硬盘设备中的分区信息。果然就能看到一个名称为
/dev/sdb1、起始扇区位置为
2048
、结束扇区位置为
4196351 的主分区了。这时千万不要直接关闭窗口,而应该敲击参数
w
后按回车键,这样分区信息才是真正地写入成功啦。
分区信息中第
6
个字段的
Id 值是一个编码,用于标识该分区的作用,可帮助用户快速了解该分区的作用,一般没必要修改。使用
l
参数查看一下磁盘编码都有哪些,然后在后面
进行
SWAP
操作时再修改吧:
在上述步骤执行完毕之后,
Linux
系统会自动把这个硬盘主分区抽象成
/dev/sdb1 设备文件。可以使用
file 命令查看该文件的属性,有些时候系统并没有自动把分区信息同步给
Linux
内核,而且这种情况似乎还比较常见(但不能算作严重的
bug)。可以输入
partprobe 命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧,这个“杀手锏”百试百灵,一定会有用的。
如果硬件存储设备没有进行格式化,则
Linux 系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在
Linux 系统中用于格式化操作的命令是mkfs
。这条命令很有意思,因为在
Shell
终端中输入
mkfs
名后再敲击两下用于补齐命令的 Tab键,会有如下所示的效果:
这个
mkfs 命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单
—
mkfs.
文件类型名称。例如要将分区为
XFS 的文件系统进行格式化,则命令应为
mkfs.xfs /dev/sdb1
。
接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用 mount命令将存储设备与挂载点进行关联;最后使用
df -h 命令来查看挂载状态和硬盘使用量信息。
2.du命令
du
命令用查看分区或目录所占用的磁盘容量大小,英文全称为“
disk usage”,语法格式为“
du -sh
目录名称”。
既然存储设备已经顺利挂载,接下来就可以尝试通过挂载点目录向存储设备中写入文件了。在写入文件之前,先来看一个用于查看文件数据占用量的
du 命令。简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。
在
Linux
系统中可以使用
du -sh /*
命令来查看在
Linux 系统根目录下所有一级目录分别占用的空间大小,在
1s
之内就能找到哪个目录占用的空间最多:
先从某些目录中复制过来一批文件,然后查看这些文件总共占用了多大的容量:
到,使用 mount 命令挂载的设备文件会在系统下一次重启的时候失效。如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入配置文件中:
6.添加交换分区
交换(SWAP)分区是一种通过在硬盘中预先划分一定的空间,然后把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。通俗来讲就是让硬盘帮内存分担压力。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。
交换分区的创建过程与前文讲到的挂载并使用存储设备的过程非常相似。在对/dev/sdb存储设备进行分区操作前,有必要先说一下交换分区的划分建议:在生产环境中,交换分区的大小一般为真实物理内存的
1.5
~
2 倍。为了让大家更明显地感受交换分区空间的变化,这里取出一个大小为
5GB
的主分区作为交换分区资源:
在上面的操作结束后,我们就得到了一个容量为
5GB 的新分区。然后尝试修改硬盘的标识码,这里将其改成
82
(
Linux swap
)以方便以后知道它的作用:
搞定!敲击
w
参数退出分区表编辑工具
下面来看一下两个与交换分区相关的简单命令。
mkswap
命令用于对新设备进行交换分区格式化,英文全称为“
make swap”,语法格式为“
mkswap
设备名称”。
swapon
命令用于激活新的交换分区设备,英文全称为“
swap on
”,语法格式为“swapon设备名称”。
使用
swapon
命令把准备好的
SWAP
硬盘设备正式挂载到系统中。可以使用
free -m 命令查看交换分区的大小变化(由
2047MB
增加到
7167MB
):
取消激活:
为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入
存储结构与
配置文件中,并记得保存:
或者使用none来定义所要挂载的目录
7.磁盘容量配额
Linux 系统的设计初衷就是让许多人一起使用并执行各自的任务,从而成为多用户、多任务的操作系统。但是,硬件资源是固定且有限的,如果某些用户不断地在
Linux 系统上创建文件或者存放电影,硬盘空间总有一天会被占满。针对这种情况,root管理员就需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用 quota技术进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota技术还有软限制和硬限制的功能。
软限制:
当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
硬限制:
当达到硬限制时会提示用户,且强制终止用户的操作。
RHEL 8
系统中已经安装了
quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对
quota 技术的支持,此时需要手动编辑配置文件并重启一次系统,让系统中的启动目录(
/boot
)能够支持
quota 磁盘配额技术。
早期的
Linux
系统要想让硬盘设备支持
quota 磁盘容量配额服务,使用的是usrquota
参数,而
RHEL 7/8
系统使用的则是
uquota
参数。
在重启系统后使用
mount 命令查看,即可发现
/boot
目录已经支持
quota
磁盘配额技术了:
接下来创建一个用于检查
quota
磁盘容量配额效果的用户
tom
,并针对
/boot 目录增加其他人的写权限,保证用户能够正常写入数据:
1.xfs_quota命令
xfs
_
quota
命令用于管理设备的磁盘容量配额,语法格式为“
xfs
_
quota [
参数
] 配额 文件系统”。
这是一个专门针对
XFS
文件系统来管理
quota 磁盘容量配额服务而设计的命令。其中,-c
参数用于以参数的形式设置要执行的命令;
-x
参数是专家模式,让运维人员能够对 quota服务进行更多复杂的配置。接下来使用
xfs
_
quota
命令来设置用户
tom
对
/boot
目录的
quota 磁盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为
3MB
和
6MB;创建文件数量的软限制和硬限制分别为
3
个和
6
个。
上面所使用的参数分为两组,分别是
isoft/ihard
与
bsoft/bhard。
在
Linux
系统中每个文件都会使用一个独立的
inode 信息块来保存属性信息,一个文件对应一个
inode
信息块,所以
isoft
和
ihard
就是通过限制系统最大使用的 inode个数来限制了文件数量。
bsoft
和
bhard
则是代表文件所占用的
block 大小,也就是文件占用的最大容量的总统计。
soft 是软限制,超过该限制后也只是将操作记录写到日志中,不对用户行为进行限制。而
hard 是硬限制,一旦超过系统就会马上禁止,用户再也不能创建或新占任何的硬盘容量。
当配置好上述各种软硬限制后,尝试切换到一个普通用户,然后分别尝试创建一个体积为
5MB
和
8MB
的文件。可以发现,在创建
8MB
的文件时受到了系统限制:
2.edquota命令
edquota
命令用于管理系统的磁盘配额,英文全称为“
edit quota
”,语法格式为“
edquota [参数
]
用户名”。
在为用户设置了
quota
磁盘容量配额限制后,可以使用
edquota 命令按需修改限额的数值。其中,
-u
参数表示要针对哪个用户进行设置;-g 参数表示要针对哪个用户组进行设置,
edquota
命令中可用的参数以及作用
-u 对某个用户进行设置
-g 对某个用户组进行设置
-p 复制原有的规则到新的用户/
组
-t 限制宽限期限
edquota
命令会调用
Vi
或
Vim
编辑器来让
root 管理员修改要限制的具体细节,记得用wq
保存退出。下面把用户
tom
的硬盘使用量的硬限额从
5MB
提升到
8MB
:
使用rhel9操作:
对某个目录开启磁盘容量限额
基于用户设置磁盘容量限额
对用户组配置需要使用主要组,拓展组不管用
对容量和文件个数进行限制,当容量达到限制条件后不管文件个数达没达到限制都不能在创建文件。
8.VDO(虚拟数据优化)
VDO
(
Virtual Data Optimize,虚拟数据优化)是一种通过压缩或删除存储设备上的数据来优化存储空间的技术。
VDO
是红帽公司收购了
Permabit 公司后获取的新技术,并与2019-2020
年前后,多次在
RHEL 7.5/7.6/7.7 上进行测试,最终随 RHEL 8 系统正式公布。VDO技术的关键就是对硬盘内原有的数据进行删重操作,它有点类似于我们平时使用的网盘服务,在第一次正常上传文件时速度特别慢,在第二次上传相同的文件时仅作为一个数据指针,几乎可以达到“秒传”的效果,无须再多占用一份空间,也不用再漫长等待。除了删重操作,VDO
技术还可以对日志和数据库进行自动压缩,进一步减少存储浪费的情况。
VDO
技术支持本地存储和远程存储,可以作为本地文件系统、
iSCSI
或
Ceph 存储下的附加存储层使用。红帽公司在
VDO 介绍页面中提到,在部署虚拟机或容器时,建议采用逻辑存储与物理存储为
10
∶
1
的比例进行配置,即
1TB
物理存储对应
10TB 逻辑存储;而部署对象存储时(例如使用
Ceph
)则采用逻辑存储与物理存储为
3
∶
1
的比例进行配置,即使用 1TB物理存储对应 3TB 逻辑存储。
简而言之,
VDO
技术能省空间!
有两种特殊情况需要提前讲一下。其一,公司服务器上已有的
dm-crypt 之类的技术是可以与
VDO
技术兼容的,但记得要先对卷进行加密再使用
VDO。因为加密会使重复的数据变得有所不同,因此删重操作无法实现。要始终记得把加密层放到
VDO
之下。
其二,
VDO
技术不可叠加使用,
1TB
的物理存储提升成
10TB 的逻辑存储没问题,但是再用
10TB
翻成
100TB
就不行了。
把虚拟机关闭,添加一块容量为
20GB
的新
SATA 硬盘进来,开机后就能看到这块名称为
/dev/sdc
的新硬盘了:
RHEL/CentOS 8
系统中默认已经启用了
VDO
技术。
VDO 技术现在是红帽公司自己的技术,兼容性自然没得说。如果您所用的系统没有安装
VDO
的话也不要着急,用
dnf
命令即可
完成安装:
dnf install kmod-kvdo vdo
首先,创建一个全新的
VDO
卷。
新添加进来的物理设备就是使用
vdo
命令来管理的,其中
name 参数代表新的设备卷的名称;
device
参数代表由哪块磁盘进行制作;
vdoLogicalSize 参数代表制作后的设备大小。依 据红帽公司推荐的原则,
20GB
硬盘将翻成
200GB
的逻辑存储:
在创建成功后,使用
status
参数查看新建卷的概述信息:
有上可见,在输出信息中包含了
VDO
卷创建的时间、主机名、版本、是否压缩(
Compression
)
及是否删重(
Deduplication
)等关键信息。
接下来,对新建卷进行格式化操作并挂载使用。
新建的
VDO
卷设备会被乖乖地存放在
/dev/mapper 目录下,并以设备名称命名,对它操作就行。另外,挂载前可以用
udevadm settle 命令对设备进行一次刷新操作,避免刚才的配置没有生效:
如果想查看设备的实际使用情况,使用
vdostats
命令即可。
human-readable 参数的作用是将存储容量自动进位,以人们更易读的方式输出(比如,显示
20G
而不是
20971520K
):
这里显示的
Size
是实际物理存储的空间大小(即
20.0GB 是硬盘的大小),如果想看逻辑存储空间,可以使用
df
命令进行查看:
随便复制一个大文件过来,看看占用了多少容量,以及空间节省率(
Space saving
)是多少:
效果不明显,再复制一份相同的文件过来,看看这次占用了多少空间:
原先
448MB
的文件这次只占用了不到
100MB 的容量,空间节省率也从
18%
提升到了
55%。当然这还仅仅是两次操作而已,好处就已经如此明显了。
最后,将设备设置成永久挂载生效,一直提供服务。
VDO
设备卷在创建后会一直存在,但需要手动编辑
/etc/fstab 文件后才能在下一次重启后自动挂载生效,为我们所用。对于这种逻辑存储设备,其实不太建议使用/dev/mapper/storage作为设备名进行挂载。不如试试前面所说的
UUID
吧:
打开
/etc/fstab
文件,把对应的字段填写完整。建议再加上
_
netdev 参数,表示等系统及网络都启动后再挂载
VDO
设备卷,以保证万无一失。
9.软硬方式链接
在学习完本章所有的硬盘管理知识之后,接下来解Linux
系统中的“快捷方式”了。在 Windows 系统中,快捷方式就是指向原始文件的一个链接文件,可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方,会导致链接文件失效。但是,这个看似简单的东西在
Linux
系统中可不太一样。
Linux
系统中存在软链接和硬链接两种不同的类型。
软链接:也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路径,很像一个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问。可以针对文件、目录设置软链接,跨文件系统进行链接也不是问题。从这一点来看,它与 Windows 系统的“快捷方式”具有一样的性质。
硬链接:可以将它理解为一个“指向原始文件 block 的指针”,系统会创建出一个与原来一模一样的 inode 信息块。所以,硬链接文件与原始文件其实是一模一样的,只是名字不同。每添加一个硬链接,该文件的 inode 个数就会增加 1;而且只有当该文件的 inode 个数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件 block 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,不能跨分区对目录文件进行硬链接。
ln命令
ln
命令用于创建文件的软硬链接,英文全称为“
link
”,语法格式为“
ln [
参数
]
原始文件
名 链接文件名”。
在使用
ln
命令时,是否添加-s 参数,将创建出性质不同的两种“快捷方式”。因此如果没有扎实的理论知识和实践经验做铺垫,尽管能够成功完成实验,但永远不会明白为什么会成功。
ln
命令中可用的参数以及作用
-s 创建“符号链接”(如果不带-s
参数,则默认创建硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程
为了更好地理解软链接、硬链接的不同性质,我们先创建出一个文件,为其创建一个软链接:
原始文件名为
old
,新的软链接文件名为
new。删掉原始文件后,软链接文件立刻就无法读取了:
接下来针对原始文件 old 创建一个硬链接,即相当于针对原始文件的硬盘存储位置创建了一个指针。这样一来,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会因为原始文件的删除而导致无法读取了。同时可以看到创建硬链接后,原始文件的硬盘链接数量增加到了
2
。
创建的硬链接文件竟然会让文件属性第二列的数字变成了2
,这个数字表示的是文件的
inode 信息块的数量。相信同学们已经非常肯定地知道,即便删除了原始文件,新的文件也会一如既往地可以读取,因为只有当文件
inode 数量被“清零”时,才真正代表这个文件被删除了。
删除软连接目录的时候后面不要加 / 否则不仅没有删除软连接的目录(里面的内容删除了,目录没有删除,还跟原始文件相连接),反而把原始目录中的数据给清空了
六、使用RAID与LVM磁盘阵列技术
本章讲解各个常用
RAID
(
Redundant Array of Independent Disks,独立冗余磁盘阵列)技术方案的特性,并通过实际部署
RAID 10
、
RAID 5+
备份盘等方案来更直观地查看
RAID 的强大效果,以便进一步满足生产环境对硬盘设备的
IO 读写速度和数据冗余备份机制的需求。同时,考虑到用户可能会动态调整存储资源,本章还将介绍
LVM
(Logical Volume Manager,逻辑卷管理器)的部署、扩容、缩小、快照以及卸载删除的相关知识。相信读者在学完本章内容后,可以在企业级生产环境中灵活运用
RAID
和
LVM
来满足对存储资源的高级管理需求。
1.RAID(独立冗余磁盘阵列)
近年来,
CPU
的处理性能保持着高速增长。
硬盘设备的性能提升却不是很大,逐渐成为当代计算机整体性能的瓶颈。而且,由于硬盘设备需要进行持续、频繁、大量的
IO 操作,相较于其他设备,其损坏几率也大幅增加,导致重要数据丢失的几率也随之增加。
硬盘设备是计算机中较容易出现故障的元器件之一,加之由于其需要存储数据的特殊性质,不能像
CPU、内存、电源甚至主板那样在出现故障后更换新的就好,所以在生产环境中一定要未雨绸缪,提前做好数据的冗余及异地备份等工作
1988 年,美国加利福尼亚大学伯克利分校首次提出并定义了 RAID 技术的概念。RAID技术通过把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上,然后利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数据冗余备份效果。
任何事物都有它的两面性。RAID 技术确实具有非常好的数据冗余备份功能,但是它也相应地提高了成本支出。就像原本我们只有一个电话本,但是为了避免遗失,我们把联系人号码信息写成了两份,自然要为此多买一个电话本,这也就相应地提升了成本支出。RAID 技术的设计初衷是减少因为采购硬盘设备带来的费用支出,但是与数据本身的价值相比较,现代企业更看重的则是
RAID 技术所具备的冗余备份机制以及带来的硬盘吞吐量的提升。也就是说,
RAID 不仅降低了硬盘设备损坏后丢失数据的几率,还提升了硬盘设备的读写速度,所以它在绝大多数运营商或大中型企业中得到了广泛部署和应用。
出于成本和技术方面的考虑,需要针对不同的需求在数据可靠性及读写性能上做出权衡,制定出满足各自需求的不同方案。目前已有的
RAID 磁盘阵列的方案至少有十几种,接下来会详细讲解
RAID 0
、
RAID 1
、
RAID 5
与
RAID 10
这
4
种最常见的方案。
1.RAID 0
RAID 0 技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依次写入各个物理硬盘中。这样一来,在最理想的状态下,硬盘设备的读写性能会提升数倍,但是若任意一块硬盘发生故障,将导致整个系统的数据都受到破坏。通俗来说,
RAID 0 技术能够有效地提升硬盘数据的吞吐速度,但是不具备数据备份和错误修复能力。如图
7-1
所示,数据被分别写入到不同的硬盘设备中,即硬盘
A
和硬盘
B 设备会分别保存数据资料,最终实现提升读取、写入速度的效果。
2.RAID 1
尽管 RAID 0 技术提升了硬盘设备的读写速度,但它是将数据依次写入到各个物理硬盘中。也就是说,它的数据是分开存放的,其中任何一块硬盘发生故障都会损坏整个系统的数据。因此,如果生产环境对硬盘设备的读写速度没有要求,而是希望增加数据的安全性时,就需要用到
RAID 1
技术了。
它是把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备份)。当其中某一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常使用。
考虑到在进行写入操作时因硬盘切换带来的开销,因此
RAID 1 的速度会比 RAID 0 有微弱地降低。但在读取数据的时候,操作系统可以分别从两块硬盘中读取信息,因此理论读取速度的峰值可以是硬盘数量的倍数。另外,平时只要保证有一块硬盘稳定运行,数据就不会出现损坏的情况,可靠性较高。
RAID 1 技术虽然十分注重数据的安全性,但是因为是在多块硬盘设备中写入了相同的数据,因此硬盘设备的利用率得以下降。从理论上来说,
硬盘空间的真实可用率只有
50%
,由
3
块硬盘设备组成的
RAID 1
磁盘阵列的可用率只有 33%左右;以此类推。而且,由于需要把数据同时写入到两块以上的硬盘设备,这无疑也在一定程度上增大了系统计算功能的负载。
3.RAID 5
RAID5 技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。RAID 5 磁盘阵列中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上。这样的好处是,其中任何一设备损坏后不至于出现致命缺陷。图
7-3
中
Parity
部分存放的就是数据的奇偶校验信息。换句话说,就是 RAID 5 技术实际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据。
RAID 这样的技术特性“妥协”地兼顾了硬盘设备的读写速度、数据安全性与存储成本问题。
RAID 5
最少由
3
块硬盘组成,使用的是硬盘切割(
Disk Striping)技术。相较于 RAID 1级别,好处就在于保存的是奇偶校验信息而不是一模一样的文件内容,所以当重复写入某个文件时,
RAID 5 级别的磁盘阵列组只需要对应一个奇偶校验信息就可以,效率更高,存储成本也会随之降低。
4.RAID 10
RAID 10
技术是
RAID 1+RAID 0
技术的一个“组合体”。
RAID10
技术需要至少
4
块硬盘来组建,其中先分别两两制作成
RAID 1 磁盘阵列,以保证数据的安全性;然后再对两个
RAID 1
磁盘阵列实施
RAID 0 技术,进一步提高硬盘设备的读写速度。这样从理论上来讲,只要坏的不是同一阵列中的所有硬盘,那么最多可以损坏
50%的硬盘设备而不丢失数据。由于
RAID 10
技术继承了
RAID 0
的高读写速度和
RAID 1 的数据安全性,在不考虑成本的情况下
RAID 10
的性能也超过了
RAID 5
,因此当前成为广泛使用的一种存储技术。
RAID 10 是先对信息进行分割,然后再两两一组制作镜像。也就是先将
RAID 1
作为最低级别的组合,然后再使用
RAID 0
技术将
RAID 1 磁盘阵列组合到一起,将它们视为“一整块”硬盘。而
RAID 01 则相反,它是先将硬盘分为两组,然后使用
RAID 0
作为最低级别的组合,再将这两组
RAID 0
硬盘通过
RAID 1
技术组合到一起。
RAID 10
技术和
RAID 01
技术的区别非常明显。在
RAID 10 中,任何一块硬盘损坏都不会影响到数据安全性,其余硬盘均会正常运作。但在
RAID 01 中,只要有任何一块硬盘损坏,最低级别的
RAID 0
磁盘阵列马上会停止运作,这可能造成严重隐患。所以
RAID 10
远比 RAID01
常见,很多主板甚至不支持
RAID 01
。
5.部署磁盘阵列
首先,需要在虚拟机中添加
4
块硬盘设备来制作一个
RAID 10
磁盘阵列
。记得硬盘要用
SCSI
或
SATA 接口的类型,大小默认
20GB
就可以。
这几块硬盘设备是模拟出来的,不需要特意去买几块真实的物理硬盘插到电脑上。需要注意的是,一定要记得在关闭系统之后,再在虚拟机中添加硬盘设备,否则可能会因为计算机架构的不同而导致虚拟机系统无法识别新添加的硬盘设备
mdadm
命令用于创建、调整、监控和管理
RAID
设备,英文全称为“multiple devices admin
”,语法格式为“
mdadm
参数 硬盘名称”。
mdadm
命令中的常用参数及作用
-a 检测设备名称
-n 指定设备数量
-l 指定 RAID
级别
-C 创建
-v 显示过程
-f 模拟设备损坏
-r 移除设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止 RAID
磁盘阵列
接下来,使用
mdadm
命令创建
RAID 10
,名称为“
/dev/md0
”。
udev
是
Linux 系统内核中用来给硬件命名的服务,其命名规则也非常简单。我们可以通过命名规则猜测到第二个
SCSI
存储设备的名称会是
/dev/sdb,然后依此类推。使用硬盘设备来部署
RAID 磁盘阵列很像是将几位同学组成一个班级,但总不能将班级命名为
/dev/sdbcde 吧。尽管这样可以一眼看出它是由哪些元素组成的,但是并不利于记忆和阅读。 更何况如果使用
10
、
50
、
100
个硬盘来部署
RAID
磁盘阵列呢?
此时,就需要使用
mdadm
中的参数了。其中,
-C
参数代表创建一个
RAID
阵列卡;
-v
参数显示创建的过程,同时在后面追加一个设备名称
/dev/md0
,这样
/dev/md0
就是创建后的
RAID
磁盘阵列的名称;
-n 4
参数代表使用
4
块硬盘来部署这个
RAID
磁盘阵列;而
-l 10
参数
则代表
RAID 10
方案;最后再加上
4
块硬盘设备的名称就搞定了。
初始化过程大约需要
1
分钟左右,期间可以用
-D
参数进行查看。也可以用
-Q 参数查看简要信息:
RAID 10
技术的原理。它通过两两一组硬盘组成的
RAID 1 磁盘阵列保证了数据的可靠性,其中每一份数据都会被保存两次,因此导致硬盘存在
50%
的使用率和 50%的冗余率。这样一来,
80GB
的硬盘容量也就只有一半了。
等两三分钟后,把制作好的
RAID
磁盘阵列格式化为
Ext4
格式:
随后,创建挂载点,将硬盘设备进行挂载操作:
来查看
/dev/md0
磁盘阵列设备的详细信息,确认
RAID
级别(
Raid Level)、阵列大小(
Array Size
)和总硬盘数(
Total Devices
)都是否正确:
如果想让创建好的
RAID 磁盘阵列能够一直提供服务,不会因每次的重启操作而取消,那么一定要记得将信息添加到
/etc/fstab
文件中,这样可以确保在每次重启后
RAID 磁盘阵列都是有效的。
6.损坏磁盘阵列及修复
之所以在生产环境中部署
RAID 10
磁盘阵列,就是为了提高存储设备的 IO 读写速度及数据的安全性,但因为我们的硬盘设备是在虚拟机中模拟出来的,所以对于读写速度的改善可能并不直观。下面决定给同学们讲解一下
RAID 磁盘阵列损坏后的处理方法,以确保大家以后在步入运维岗位后不会因为突发事件而手忙脚乱。
在确认有一块物理硬盘设备出现损坏而不能再继续正常使用后,应该使用
mdadm 命令将其移除,然后查看
RAID
磁盘阵列的状态,可以发现状态已经改变:
刚刚使用的
-f 参数是让硬盘模拟损坏的效果。为了能够彻底地将故障盘移除,还要再执行一步操作:
在
RAID 10
级别的磁盘阵列中,当
RAID 1
磁盘阵列中存在一个故障盘时并不影响 RAID10
磁盘阵列的使用。当购买了新的硬盘设备后再使用
mdadm 命令予以替换即可,在此期间可以在
/RAID 目录中正常地创建或删除文件。由于我们是在虚拟机中模拟硬盘,所以先重启系统,然后再把新的硬盘添加到
RAID
磁盘阵列中。
更换硬盘后再次使用
-a 参数进行添加操作,系统默认会自动开始数据的同步工作。使用-D
参数即可看到整个过程和进度(用百分比表示)
7.磁盘阵列+备份盘
RAID 10
磁盘阵列中最多允许
50%的硬盘设备发生故障,但是存在这样一种极端情况,即同一
RAID 1
磁盘阵列中的硬盘设备若全部损坏,也会导致数据丢失。换句话说,在 RAID 10磁盘阵列中,如果
RAID 1 中的某一块硬盘出现了故障,而我们正在前往修复的路上,恰巧该RAID 1
磁盘阵列中的另一块硬盘设备也出现故障,那么数据就被彻底丢失了。
其实,完全可以使用
RAID 备份盘技术来预防这类事故。该技术的核心理念就是准备一块足够大的硬盘,这块硬盘平时处于闲置状态,一旦
RAID 磁盘阵列中有硬盘出现故障后则会马上自动顶替上去。
为了避免多个实验之间相互发生冲突,我们需要保证每个实验的相对独立性,为此需要大家自行将虚拟机还原到初始状态
。部署
RAID 5
磁盘阵列时,至少需要用到
3 块硬盘,还需要再加一块备份硬盘(也叫热备盘),所以总计需要在虚拟机中模拟
4
块硬盘设备,如
现在创建一个
RAID 5
磁盘阵列
+
备份盘。在下面的命令中,参数
-n 3
代表创建这个 RAID5
磁盘阵列所需的硬盘数,参数
-l 5
代表
RAID
的级别,而参数
-x 1 则代表有一块备份盘。当查看
/dev/md0
(即
RAID 5
磁盘阵列的名称)磁盘阵列的时候,就能看到有一块备份盘在等
待中了。
现在将部署好的
RAID 5
磁盘阵列格式化为
Ext4 文件格式,然后挂载到目录上,之后就能够使用了:
由
3
块硬盘组成的
RAID 5
磁盘阵列,其对应的可用空间是
n
-1
,也就是
40GB。热备盘的空间不计算进来,平时完全就是在“睡觉”,只有在意外出现时才会开始工作。
我们再次把硬盘设备
/dev/sdb 移出磁盘阵列,然后迅速查看/dev/md0
磁盘阵列的状态,就会发现备份盘已经被自动顶替上去并开始了数据同步。
RAID 中的这种备份盘技术非常实用,可以在保证
RAID 磁盘阵列数据安全性的基础上进一步提高数据可靠性。
8.删除磁盘阵列
RAID 磁盘阵列部署后一般不会被轻易停用。但万一赶上了,还是要知道怎么将磁盘阵列删除。前面那种
RAID 5+热备盘损坏的情况是比较复杂的,所以以这种情形来进行讲解是再好不过了。
首先,需要将所有的磁盘都设置成停用状态:
然后再逐一移除出去:
将所有的硬盘都移除后,再来查看磁盘阵列组的状态:
下面继续停用整个
RAID
磁盘阵列,
在有一些老版本的服务器中,在使用
--stop
参数后依然会保留设备文件。这很明显是没有处理
干净,这时再执行一下“
mdadm --remove /dev/md0
”命令即可。
RHEL9:
查看磁盘阵列状态 cat /proc/mdstats
实时查看状态 watch -n 1 cat /proc/mdstats
先保存磁盘阵列的信息mdadm -Ds /dev/md1 > /etc/mdadm.conf
暂停磁盘阵列 mdadm -S /dev/md1
然后启动磁盘阵列 mdadm -A /dev/md1
mdadm --zero-superblock /dev/sdb /dev/sdc清空硬盘头部信息
mdadm -a /dev/sdb 向磁盘阵列中添加磁盘
mdadm -add-spare /dev/sdb 向磁盘阵列中添加 热备磁盘
2.LVM(逻辑卷管理器)
在硬盘分好区或者部署为 RAID 磁盘阵列之后,再想修改硬盘分区大小就不容易了。换句话说,当用户想要随着实际需求的变化调整硬盘分区的大小时,会受到硬盘“灵活性”的限制。这时就需要用到另外一项非常普及的硬盘设备资源管理技术了
—逻辑卷管理器(
Logical Volume Manager
,
LVM
)。
LVM
允许用户对硬盘资源进行动态调整。
LVM 是 Linux 系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而 LVM 技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的底层架构和布局,就可以实现对硬盘分区的动态调整。
在日常的使用中,如果卷组(
VG
)的剩余容量不足,可以随时将新的物理卷(PV)加入到里面,进行不断地扩容。
物理卷处于
LVM 中的最底层,可以将其理解为物理硬盘、硬盘分区或0者 RAID 磁盘阵列。 卷组建立在物理卷之上,一个卷组能够包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是
LVM
的核心理念。
1.部署逻辑卷
部署时,需要逐个配置物理卷、卷组和逻辑卷
。
添加两块新硬盘设备,
然后开机。
在虚拟机中添加两块新硬盘设备的目的,是为了更好地演示 LVM 理念中用户无须关心底层物理硬盘设备的特性。我们先对这两块新硬盘进行创建物理卷的操作,可以将该操作简单理解成让硬盘设备支持
LVM
技术,或者理解成是把硬盘设备加入到
LVM 技术可用的硬件资源池中,然后对这两块硬盘进行卷组合并,卷组的名称允许由用户自定义。接下来,根据需求把合并后的卷组切割出一个约为 150MB 的逻辑卷设备,最后把这个逻辑卷设备格式化成Ext4 文件系统后挂载使用。下文将对每一个步骤做一些简单的描述。
第一步:
让新添加的两块硬盘设备支持
LVM
技术。
第二步:
把两块硬盘设备加入到
storage
卷组中,然后查看卷组的状态。
使用vgs查看
第三步:
切割出一个约为
150MB
的逻辑卷设备。
这里需要注意切割单位的问题。在对逻辑卷进行切割时有两种计量单位。第一种是以容量为单位,所使用的参数为
-L
。例如,使用
-L 150M
生成一个大小为
150MB 的逻辑卷。另外一种是以基本单元的个数为单位,所使用的参数为
-l
。每个基本单元的大小默认为
4MB。例如,使用
-l 37
可以生成一个大小为
37×4MB=148MB
的逻辑卷。
第四步:把生成好的逻辑卷进行格式化,然后挂载使用。
Linux
系统会把
LVM
中的逻辑卷设备存放在
/dev 设备目录中(实际上就是个快捷方式),同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即
/dev/
卷组名称/逻辑卷名称)
对了,如果使用了逻辑卷管理器,则不建议用
XFS
文件系统,因为
XFS 文件系统自身就可以使用
xfs
_
growfs
命令进行磁盘扩容。这虽然不比
LVM 灵活,但起码也够用。在实测阶段我们发现,在有一些服务器上,
XFS
与
LVM
的兼容性并不好。
第五步:
查看挂载状态,并写入配置文件,使其永久生效。
2.扩容逻辑卷
卷组是由两块硬盘设备共同组成的。用户在使用存储设备时感知不到设备底层的架构和布局,更不用关心底层是由多少块硬盘组成的,只要卷组中有足够的资源,就可以一直为逻辑卷扩容。扩容前请一定要记得卸载设备和挂载点的关联。使用ext4
第一步:
把上一个实验中的逻辑卷
vo
扩展至
290MB
。
增加容量
第二步:检查硬盘的完整性,确认目录结构、内容和文件内容没有丢失。一般情况下没有报错,均为正常情况。
第三步:重置设备在系统中的容量。刚刚是对 LV(逻辑卷)设备进行了扩容操作,但系统内核还没有同步到这部分新修改的信息,需要手动进行同步。
使用xfs_growfs 对所挂载的磁盘或者目录进行扩容 xfs支持在线扩容,不用取消挂载,而ext4需要取消挂载
第四步:
重新挂载硬盘设备并查看挂载状态。
或者使用lvextent -rL +2G /dev/storage/vo 支持ext4在线扩容
3.缩小逻辑卷
相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,数据丢失的风险更大。所以在生产环境中执行相应操作时,一定要提前备份好数据。另外,
Linux
系统规定,在对 LVM 逻辑卷进行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证数据的安全)。在执行缩容操作前记得先把文件系统卸载掉。
第一步:
检查文件系统的完整性。
第二步:
通知系统内核将逻辑卷
vo
的容量减小到
120MB
。
第三步:
将
LV
(逻辑卷)的容量修改为
120MB
。
先通知系统内核自己想缩小逻辑卷,如果在执行
resize2fs 命令后系统没有报错,再正式操作。
第四步:
重新挂载文件系统并查看系统状态。
使用xfs进行缩容
xfsdump -l 0 -f /root/lv01.dump /lv01 备份分区 0完整备份 f 备份位置
删除分区,重新创建指定大小的分区
xfsrestore -f /root/lv01 /lv01 恢复之前备份的数据
4.逻辑卷快照
LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。
LVM
的快照卷功能有两个特点:
快照卷的容量必须等同于逻辑卷的容量;
快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。
在正式操作前,先看看
VG
(卷组)中的容量是否够用:
通过卷组的输出信息可以清晰看到,卷组中已经使用了
120MB 的容量,空闲容量还有39.88GB
。接下来用重定向往逻辑卷设备所挂载的目录中写入一个文件。
第一步:使用-s 参数生成一个快照卷,使用-L 参数指定切割的大小,需要与要做快照的设备容量保持一致。另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作,稍后数据也会还原到这个相应的设备上。
第二步:在逻辑卷所挂载的目录中创建一个 100MB 的垃圾文件,然后再查看快照卷的状态。可以发现存储空间的占用量上升了。
第三步:为了校验快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载。
lvconvert
命令用于管理逻辑卷的快照,语法格式为“
lvconvert [
参数
]快照卷名称”。
使用
lvconvert
命令能自动回复逻辑卷的快照,在早期的
RHEL/CentOS 5 版本中要写全格式:“
--mergesnapshot
”,而从
RHEL 6
到
RHEL 8
,已经允许用户只输入
--merge 参数进行操作了,系统会自动分辨设备的类型。
第四步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的 100MB 的垃圾文件也被清除了。
5.删除逻辑卷
当生产环境中想要重新部署
LVM
或者不再需要使用
LVM
时,则需要执行 LVM 的删除操作。为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒。
第一步:
取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。
第二步:
删除逻辑卷设备,需要输入
y
来确认操作。
第三步
:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。
第四步:
删除物理卷设备。
在上述操作执行完毕之后,再执行
lvdisplay
、
vgdisplay
、
pvdisplay
命令来查看
LVM 的信息时就不会再看到相关信息了(前提是上述步骤的操作是正确的)。
VDO:
创建vod:
查看vdo状态:
使用xfs格式化 -k快速格式化
格式化ext4系统:
写入fstab文件不用写_netdev,和普通文件一样
七、使用iptables与firewalld防火墙
本章将分别使用
iptables
、
firewall-cmd
、
firewall-config 和 TCP Wrapper 等防火墙策略配置服务来完成数十个根据真实工作需求而设计的防火墙策略配置实验。在学习完这些实验之后,不仅能够熟练地过滤请求的流量、基于服务程序的名称对流量进行允许和拒绝操作,还可以使用
Cockpit
轻松监控系统的运行状态,确保
Linux
系统的安全性万无一失。
1.防火墙管理工具
众所周知,相较于企业内网,外部的公网环境更加恶劣,罪恶丛生。在公网与企业内网之间充当保护屏障的防火墙虽然有软件或硬件之分,但主要功能都是依据策略对 穿越防火墙自身的流量进行过滤。就像家里安装的防盗门一样,目的是保护亲人和财产安全。 防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。这样一来,就能够保证仅有合法的流量在企业内网和外部公网之间流动了。
从
RHEL 7
系统开始,
firewalld
防火墙正式取代了
iptables 防火墙。其实,
iptables
与 firewalld 都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已;或者说,它们只是一种服务。
iptables
服务会把配置好的防火墙策略交由内核层面的
netfilter
网络过滤器来处理,而
firewalld
服务则是把配置好的防火墙策略交由内核层面的
nftables 包过滤框架来处理。换句话说,当前在
Linux
系统中其实存在多个防火墙管理工具,旨在方便运维人员管理
Linux 系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。
虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是保持一致的。大家甚至可以不用完全掌握本章介绍的内容,只要在这多个防火墙管理工具中任选一款并将其学透,就足以满足日常的工作需求了。
2.iptables
在早期的
Linux
系统中,默认使用的是
iptables 防火墙管理服务来配置防火墙。尽管新型的
firewalld 防火墙管理服务已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用
iptables
。
iptables 在当前生产环境中还具有顽强的生命力在掌握了
iptables 后再学习其他防火墙管理工具时,也有借鉴意义。
1.策略与规则链
防火墙会按照从上到下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。一般而言,防火墙策略规则的设置有两种:“通”(即放行)和“堵”(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。
iptables 服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:
在进行路由选择前处理数据包(
PREROUTING
);
处理流入的数据包(
INPUT
);
处理流出的数据包(
OUTPUT
);
处理转发的数据包(
FORWARD
);
在进行路由选择后处理数据包(
POSTROUTING
)。
一般来说,从内网向外网发送的流量一般都是可控且良性的,因此使用最多的就是 INPUT规则链,该规则链可以增大黑客人员从外网入侵内网的难度。
仅有策略规则还不能保证社区的安全,还应该知道采用什么样的动作来处理这些匹配的流量,比如“允许”“拒绝”“登记”“不理它”。这些动作对应到
iptables 服务的术语中分别是
ACCEPT
(允许流量通过)、
REJECT
(拒绝流量通过)、
LOG(记录日志信息)、DROP(拒绝流量通过)。“允许流量通过”和“记录日志信息”都比较好理解,这里需要着重讲解的是
REJECT
和
DROP
的不同点。就
DROP 来说,它是直接将流量丢弃而且不响应;REJECT 则会在拒绝流量后再回复一条“信息已经收到,但是被扔掉了”信息,从而让流量发送方清晰地看到数据被拒绝的响应信息。
当把
Linux
系统中的防火墙策略设置为 REJECT 动作后,流量发送方会看到端口不可达的响应;
而把
Linux
系统中的防火墙策略修改成
DROP 动作后,流量发送方会看到响应超时的提醒。但是流量发送方无法判断流量是被拒绝,还是接收方主机当前不在线;
2.基本的命令参数
iptables 是一款基于命令行的防火墙策略管理工具,具有大量的参数,学习难度较大。好在对于日常的防火墙策略配置来讲,大家无须深入了解诸如“四表五链”的理论概念,只需要掌握常用的参数并做到灵活搭配即可,这就足以应对日常工作了。
根据
OSI
七层模型的定义,
iptables 属于数据链路层的服务,所以可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配;一旦匹配成功,iptables 就会根据策略规则所预设的动作来处理这些流量。另外,再次提醒一下,防火墙策略规则的匹配顺序是从上到下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。表
8-1 总结归纳了常用的
iptables 命令参数。再次强调,无须死记硬背这些参数,只需借助下面的实验来理解掌握即可。
常用的 iptables 命令参数:
实验1.在iptables命令后添加-L参数查看已有的防火墙规则链
实验2:在iptables命令后添加-F清空已有的防火墙规则链
实验3:把INPUT规则链的默认策略设置为拒绝
,防火墙策略规则的设置无非有两种方式:“通”和“堵”。当把 INPUT 链设置为默认拒绝后,就要往里面写入允许策略了,否则所有流入的数据包都会被默认拒绝掉。同学们需要留意的是,规则链的默认策略拒绝动作只能是
DROP
,而不能是
REJECT
。
实验4:向INPUT链中添加允许ICMP流量进入的策略规则
在日常运维工作中,经常会使用
ping
命令来检查对方主机是否在线,而向防火墙的INPUT规则链中添加一条允许
ICMP
流量进入的策略规则就默认允许了这种
ping
命令检测行为。
实验5:删除INPUT规则链中刚刚加入的那条策略(允许ICMP流量),并把默认策略设置为允许
使用
-F
参数会清空已有的所有防火墙策略;使用
-D 参数可以删除某一条指定的策略,因此更加安全和准确。
实验6:将INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝其他所有主机的流量。
要对某台主机进行匹配,可直接写出它的
IP 地址 ;如需对网段进行匹配,则需要写为子网掩码的形式(比如
192.168.10.0/24
)。
防火墙策略规则是按照从上到下的顺序匹配的,因此一定要把允许动作放到拒绝动作前面,否则所有的流量就将被拒绝掉,从而导致任何主机都无法访问我们的服务。
在设置完上述
INPUT
规则链之后,使用
IP
地址在
192.168.10.0/24 网段内的主机访问服务器(即前面提到的设置了
INPUT
规则链的主机)的
22
端口,效果如下:
然后,再使用
IP
地址在
192.168.20.0/24
网段内的主机访问服务器的
22 端口(虽网段不同,但已确认可以相互通信),效果如下:
实验7:向INPUT规则链中添加拒绝所有人访问主机12345端口的策略规则
实验8:向INPUT规则链中添加拒绝192.168.10.5主机访问本机80端口(web服务器)的策略规则
实验9:向INPUT规则链中添加拒绝所有主机访问本机1000~1024端口的策略规则。
前面在添加防火墙策略时,使用的是
-I 参数,它默认会把规则添加到最上面的位置,因此优先级是最高的。如果工作中需要添加一条最后“兜底”的规则,那就用
-A 参数吧。这两个参数的效果差别还是很大的:
使用
iptables 命令配置的防火墙规则默认会在系统下一次重启时失效,如果想让配置的防火墙策略永久生效,还要执行保存命令:
如果公司服务器是
5/6/7
版本的话,对应的保存命令应该是:
RHEL9安装iptables
-t指定查看那个表:
--line-number
修改iptables命令:
重启生效:
端口文件 /etc/services
3.firewalld
RHEL 8
系统中集成了多款防火墙管理工具,其中
firewalld
(Dynamic Firewall Manager ofLinux systems
,
Linux 系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于
CLI
(命令行界面)和基于
GUI
(图形用户界面)的两种管理方式。
相较于传统的防火墙管理配置工具,firewalld 支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是 firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。例如,我们有一台笔记本电脑,每天都要在办公室、咖啡厅和家里使用。按常理来讲,这三者的安全性按照由高到低的顺序来排列,应该是家庭、公司办公室、咖啡厅。当前,我们希望为这台笔记本电脑制定如下防火墙策略规则:在家中允许访问所有服务;在办公室内仅允许访问文件共享服务;在咖啡厅仅允许上网浏览。在以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,然后轻点鼠标就可以自动切换了,从而极大地提升了防火墙策略的应用效率。
firewalld 中常见的区域名称(默认为 public)以及相应的策略规则:
1.终端管理工具
命令行终端是一种极富效率的工作方式,firewall-cmd
是
firewalld
防火墙配置管理工具的
CLI(命令行界面)版本。它的参数一般都是以“长格式”来提供的。大家不要一听到长格式就头大,因为
RHEL 8 系统支持部分命令的参数补齐,其中就包含这条命令(很酷吧)。也就是说,现在除了能用
Tab 键自动补齐命令或文件名等内容之外,还可以用
Tab
键来补齐表
8-3
中所示的长格式参数。
firewall-cmd
命令中使用的参数以及作用 :
与
Linux
系统中其他的防火墙策略配置工具一样,使用
firewalld 配置的防火墙策略默认为运行时(
Runtime)模式,又称为当前生效模式,而且会随着系统的重启而失效。如果想让配置策略一直存在,就需要使用永久(
Permanent
)模式了,方法就是在用
firewall-cmd 命令正常设置防火墙策略时添加--permanent 参数,这样配置的防火墙策略就可以永久生效了。但是,永久生效模式有一个“不近人情”的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立即生效,需要手动执行
firewall-cmd --reload
命令。
一定要仔细查看使用的是
Runtime
模式还是Permanent模式。如果不关注这个细节,就算正确配置了防火墙策略,也可能无法达到预期的效果。
实验1:查看firewalld服务当前所使用的区域。
实验2:查询指定网卡在firewalld服务中绑定的区域。
实验3:把网卡默认区域修改为external,并在系统重启后生效。
实验4:把firewalld服务的默认区域设置为public。
默认区域也叫全局配置,指的是对所有网卡都生效的配置,优先级较低。在下面的代码中可以看到,当前默认区域为
public
,而
ens160
网卡的区域为
external
。此时便是以网卡的区域名称为准。
通俗来说,默认区域就是一种通用的政策。例如,食堂为所有人准备了一次性餐具,而环保主义者则会自己携带碗筷。如果您自带了碗筷,就可以用自己的;反之就用食堂统一提供的。
RHEL9
实验5:启动和关闭firewalld防火墙服务的应急状况模式。
使用
--panic-on 参数会立即切断一切网络连接,而使用--panic-off则会恢复网络连接。切记,紧急模式会切断一切网络连接,因此在远程管理服务器时,在按下回车键前一定要三思。
实验6:查询SSH和HTTPS协议的流量是否允许放行。
在工作中可以不使用
--zone
参数指定区域名称,firewall-cmd 命令会自动依据默认区域进行查询,从而减少用户输入量。但是,如果默认区域与网卡所绑定的不一致时,就会发生冲突,因此规范写法的
zone
参数是一定要加的。
实验7:把HTTPS协议的流量设置为永久允许放行,并立即生效。
默认情况下进行的修改都属于
Runtime 模式,即当前生效而重启后失效,因此在工作和考试中尽量避免使用。而在使用
--permanent 参数时,则是当前不会立即看到效果,而在重启或重新加载后方可生效。于是,在添加了允许放行
HTTPS 流量的策略后,查询当前模式策略,发现依然是不允许放行
HTTPS
协议的流量:
不想重启服务器的话,就用
--reload
参数:
实验8:把HTTP协议的流量设置为永久拒绝,并立即生效。
由于在默认情况下
HTTP
协议的流量就没有被允许,所以会有“
Warning: NOT
_ENABLED:http
”这样的提示信息,因此对实际操作没有影响。
实验9:把访问8080端口和8081端口的流量策略设置为允许,但权限当前生效。
实验10:把原本本机888端口的流量转发到22端口,而且当前和长期有效、
如果想让用户通过其他端口号也能访问
ssh 服务,就可以试试端口转发技术了。通过这项技术,新的端口号在收到用户请求后会自动转发到原本服务的端口上,使得用户能够通过新的端口访问到原本的服务。
目标
IP
地址一般是服务器本机的
IP
地址:
在客户端使用
ssh
命令尝试访问
192.168.10.10
主机的
888
端口,访问成功:
实验11:富规则的设置
富规则也叫复规则,表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比如,我们可以在
firewalld 服务中配置一条富规则,使其拒绝192.168.10.0/24
网段的所有用户访问本机的
ssh
服务(
22
端口):
在客户端使用
ssh
命令尝试访问
192.168.10.10
主机的
ssh
服务(
22
端口)
2.图形管理工具
在各种版本的
Linux 系统中,几乎没有能让刘遄老师欣慰并推荐的图形化工具,但是firewall-config
做到了。它是
firewalld
防火墙配置管理工具的
GUI(图形用户界面)版本,几乎可以实现所有以命令行来执行的操作。毫不夸张地说,即使读者没有扎实的
Linux 命令基础,也完全可以通过它来妥善配置
RHEL 8 中的防火墙策略。但在默认情况下系统并没有提供
firewall-config
命令,我们需要自行用
dnf
命令进行安装,所以需要先配置软件仓库。
首先将虚拟机的“
CD/DVD
(
SATA
)”光盘选项设置为“使用
ISO 映像文件”,然后选择已经下载好的系统镜像,
然后,把光盘设备中的系统镜像挂载到
/media/cdrom
目录
最后,使用
Vim
文本编辑器创建软件仓库的配置文件。与之前版本的系统不同,RHEL 8需要配置两个软件仓库(即
[BaseOS]
与
[AppStream]
),且缺一不可。
在正确配置完软件仓库文件后,就可以开始用
yum
或
dnf 命令安装软件了。这两个命令在实际操作中除了名字不同外,执行方法完全一致,大家可随时用
yum
来替代
dnf 命令。下面安装
firewalld
图形用户界面工具:
里使用
firewall-config
工具进行了重新演示:将本机
888 端口的流量转发到
22
端口,且要求当前和长期均有效,
4.服务的服务控制列表
TCP Wrapper
是
RHEL 6/7 系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序做出允许或拒绝的操作。在
RHEL 8
版本中,它已经被 firewalld正式替代。换句话说,
Linux
系统中其实有两个层面的防火墙,第一种是前面讲到的基于 TCP/IP协议的流量过滤工具,而
TCP Wrapper
服务则是能允许或禁止
Linux 系统提供服务的防火墙,从而在更高层面保护了
Linux
系统的安全运行。
TCP Wrapper 服务的防火墙策略由两个控制列表文件所控制,用户可以编辑允许控制列表文件来放行对服务的请求流量,也可以编辑拒绝控制列表文件来阻止对服务的请求流量。控制列表文件修改后会立即生效,系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;如果没有匹配,则会进一步匹配拒绝控制列表文件(
/etc/hosts.deny
),若找到匹配项则拒绝该流量。如果这两个文件都没有匹配到,则默认放行
流量。
5.Cockpit驾驶舱管理器
Cockpit
是一个英文单词,即“(飞机、船或赛车的)驾驶舱、驾驶座”
它用名字传达出了功能丰富的特性。其次,
Cockpit
是一个基于 Web 的图形化服务管理工具,对用户相当友好,即便是新手也可以轻松上手。而且它天然具备很好的跨平台性,因此被广泛应用于服务器、容器、虚拟机等多种管理场景。最后,红帽公司对
Cockpit 也十分看重,直接将它默认安装到了
RHEL 8
系统中,由此衍生的
CentOS
和
Fedora
也都标配有
Cockpit
。
Cockpit
在默认情况下就已经被安装到系统中。下面执行
dnf
命令对此进行确认:
但是,
Cockpit
服务程序在
RHEL 8 版本中没有自动运行,下面将它开启并加入到开机启动项中:
RHEL9需要配置文件:允许root登录
在
Cockpit
服务启动后,打开系统自带的浏览器,在地址栏中输入“本机地址
:9090”即可访问。由于访问
Cockpit
的流量会使用
HTTPS 进行加密,而证书又是在本地签发的,因此还需要进行添加并信任本地证书的操作,
进入
Cockpit
的
Web
界面,发现里面可谓“别有洞天”。
Cockpit
总共分为
13 个功能模块:系统状态(
System
)、日志信息(
Logs
)、硬盘存储(
Storage
)、网卡网络(
Networking)、账户安全(
Accounts
)、服务程序(
Services
)、软件仓库(
Applications),
报告分析(
DiagnosticReports)、 内核排错(
Kernel Dump
)、
SElinux
、更新软件(
SoftwareUpdates)
、订阅服务(Subscriptions)、终端界面(
Terminal
)
1.System
进入
Cockpit
界面后默认显示的便是
System(系统)界面,在该界面中能够看到系统架构、版本、主机名与时间等信息,还能够动态地展现出
CPU、硬盘、内存和网络的复杂情况,这有点类似于
Web
版的“
Winodws
系统任务管理器”,属实好用,
2.Logs
这个模块能够提供系统的全部日志,但是同学们可能会好奇,“为什么图
中的内容这么有限呢”?原因出在图
中的两个选项中:时间和日志级别。通过这两个选项可以让用户更快地找到所需信息,而不是像
/var/log/message
文件那样一股脑儿地都抛给用户。
3.Storage
这个模块不仅显示了硬盘的
I/O 读写负载情况,而且可以让用户通过该界面,用鼠标创建出
RAID
、
LVM
、
VDO
和
iSCSI 等存储设备,
4.Networking
既然名为
Networking 模块,那么动态看网卡的输出和接收值肯定是这个模块的标配功能了。
不仅可以在这里进行网卡的绑定(
Bonding
)和聚合(
Team),还可以创建桥接网卡及添加
VLAN
。图
的最下方会单独列出与网卡相关的日志信息。
5.Accounts
虽然它的功能界面有些简陋(见图 8-23),只有一个用于创建账户的按钮,但只要点击进入某个用户的管理界面中,马上会发现“别有洞天”,这个界面中的功能非常丰富,我们在这里可以对用户进行重命名,设置用户的权限,还可以锁定、修改密码以及创建 SSH 密钥信息。
6.Service
在
Services
功能模块的界面中
,可以查看系统中已有的服务列表和运行状态。单击某一服务,进入该服务的管理界面后
,可以对具体的服务进行开启、关闭操作。在
Services 功能模块中设置了服务并将其加入到开机启动项后,在系统重启后也依然会为用户提供服务。
7.Applications
后期采用
Cockpit
或红帽订阅服务安装的软件都会显示在这个功能模块中,
8.Diagnostic Report
Diagnostic Report 模块的功能是帮助用户收集及分析系统的信息,找到系统出现问题的原因
就是将
sosreport
命令做成了一个网页按钮。
9.Kernel Dump
Kernel Dump
(
Kdump)是一个在系统崩溃、死锁或死机时用来收集内核参数的一个服务。举例来说,如果有一天系统崩溃了,这时
Kdump 服务就会开始工作,将系统的运行状态和内核数据收集到一个名为
dump core 的文件中,以便后续让运维人员分析并找出问题所在。由于我们在安装系统时没有启动该服务,所以可以等到后续使用时再开启该功能界面
10.SELinux
SELinux
服务的控制按钮和警告信息界面
11.Software Updates
这里提到的 Software Updates 并不是我们用来更新其他常规软件的一个界面,而是用来对红帽客户订阅的服务进行更新的界面。用户只有在购买了红帽第三方服务后才能使用这里面的功能。在购买了红帽订阅服务后,用户便可以在这里下载到相应服务程序的最新版本和稳定版本
12.Subscriptions
这里依然是一则红帽公司的“小广告”—如果想成为尊贵的红帽服务用户,要付费购买订阅服务。个人用户无须购买,而且这对我们的后续实验没有任何影响。
13.Terminal
压轴的总是在最后。
Cockpit 服务提供了 Shell终端的在线控制平台,可方便用户通过网页上的终端功能管理服务器。这个功能深受运维人员喜爱。
下载虚拟机
八、使用ssh服务管理远程主机
本章深入介绍了
SSH
协议与
sshd
服务程序的理论知识、
Linux 系统的远程管理方法以及在系统中配置服务程序的方法,并采用实验的形式演示了使用基于密码与密钥验证的
sshd 服务程序进行远程访问,以及使用
Tmux
服务程序远程管理
Linux 系统的不间断会话等技术。本章详细讲解了日志系统的理论知识,并使用
journalctl 命令基于各种条件进行日志信息的检索,以快速定位工作中的故障点。
1.配置网络服务
1.配置网卡参数
在
RHEL 8 系统中至少有
5
种网络的配置方法
在
RHEL 5
、
RHEL 6
系统及其他大多数早期的
Linux
系统中,网卡的名称一直都是
eth0、eth1
、
eth2
、……;在
RHEL 7
中则变成了类似于
eno16777736
这样的名字;而在
RHEL 8 系统中网卡的最新名称是类似于
ens160
、ens192 这样的,所以经常丰富的运维老手光看网卡名称大致就能猜出系统的版本了。不过除了网卡的名称发生变化之外,其他一切几乎照旧,因此这里演示的网络配置实验完全可以适用于各种版本的
Linux
系统。
现在,在服务器主机的网络配置信息中填写
IP
地址
192.168.10.10/24
。
24 表示子网掩码中的前
24
位为网络号,后
8
位是主机号(与写成
255.255.255.0
的效果一样)。网关、
DNS 等信息暂可不必填写,等用到时再补充。
1.使用nmtui图形化界面配置
激活
2.修改配置文件在 /etc/sysconfig/network-scripts/ifcfg-ens160
ONBOOT修改为yes
当修改完
Linux 系统中的服务配置文件后,并不会对服务程序立即产生效果。要想让服务程序获取到最新的配置文件,需要手动重启相应的服务,之后就可以看到网络畅通了:
2.创建网络会话
RHEL
和
CentOS
系统默认使用
NetworkManager 来提供网络服务,这是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。可以使用
nmcli
命令来管理
NetworkManager 服务程序。
nmcli 是一款基于命令行的网络配置工具,功能丰富,参数众多。它可以轻松地查看网络信息或网络状态:
另外,
RHEL 8 系统支持网络会话功能,允许用户在多个配置文件中快速切换(非常类似于
firewalld 防火墙服务中的区域技术)。如果我们在公司网络中使用笔记本电脑时需要手动指定网络的
IP
地址,而回到家中则是使用
DHCP
自动分配
IP 地址,这就需要麻烦地频繁修改IP
地址,但是使用了网络会话功能后一切就简单多了
—只需在不同的使用环境中激活相应的网络会话,就可以实现网络配置信息的自动切换了。
使用
nmcli
命令并按照“
connection add con-name type ifname”的格式来创建网络会话。假设将公司网络中的网络会话称之为
company
,将家庭网络中的网络会话称之为
house,现在依次创建各自的网络会话。
使用
con-name
参数指定公司所使用的网络会话名称
company
,然后依次用
ifname 参数指定本机的网卡名称(千万要以实际环境为准,不要照抄书上的
ens160
),用
autoconnect no 参数将网络会话设置为默认不被自动激活,以及用
ip4
及
gw4
参数手动指定网络的
IP
地址:
使用
con-name
参数指定家庭所使用的网络会话名称
house
。因为要从外部
DHCP 服务器自动获得
IP
地址,所以这里不需要进行手动指定。
在成功创建网络会话后,可以使用
nmcli
命令查看创建的所有网络会话:
使用
nmcli
命令配置过的网络会话是永久生效的,这样当我们上班后,顺手启动 company网络会话,网卡信息就自动配置好了:
请把虚拟机系统的网卡(网络适配器)切换成桥接模式
如果启用
company
会话成功,但启用
house 会话失败且不能获取到动态地址,则证明您的配置是正确的,问题出在了外部网络环境。有
3 种常见的情况,首先,您家中的设备没有连接路由器,而是通过拨号网络或共享 WiFi 的方式上网;其次,还在上学或上班的读者在浏览网页前必须通过学校或公司的验证页面才能访问互联网;最后,检查物理机的防火墙设置,可暂时关闭后再重试。
后续不需要网络会话时,直接用
delete
命令就能删除,特别简单:
3.绑定两块网卡
在虚拟机系统中再添加一块网卡设备,请确保两块网卡都处在同一种网络连接模式中
。处于相同模式的网卡设备才可以进行网卡绑定,否则这两块网卡无法互相传送数据。
网卡绑定的理论知识类似于前面的
RAID
硬盘组,我们需要对参与绑定的网卡设备逐个进行“初始
设置”。需要注意的是,如图
9-12
所示,左侧的
ens160
及
ens192 这些原本独立的网卡设备此时需要被配置成为一块“从属”网卡,服务于右侧的
bond0“主”网卡,不应该再有自己的IP
地址等信息。在进行了初始设置之后,它们就可以支持网卡绑定。
1.创建一个bond网卡
首先使用如下命令创建一个
bond
网卡。其中,命令与参数的意思是创建一个类型为
bond(绑定)、名称为
bond0
、网卡名为
bond0
的绑定设备,绑定模式为
balance-rr
:
这里使用的是
balance-rr
网卡绑定模式,其中
rr
是 round-robin 的缩写,全称为轮循模式。round-robin 的特点是会根据设备顺序依次传输数据包,提供负载均衡的效果,让带宽的性能更好一些;而且一旦某个网卡发生故障,会马上切换到另外一台网卡设备上,保证网络传输不被中断。active-backup 是另外一种比较常用的网卡绑定模式,它的特点是平时只有一块网卡正常工作,另一个网卡随时待命,一旦工作中的网卡发生损坏,待命的网卡会自动顶替上去。可见,这种网卡绑定模式的冗余能力比较强,因此也称为主备模式。
2.向bond0设备添加从属网卡
刚才创建成功的
bond0 设备当前仅仅是个名称,里面并没有真正能为用户传输数据的网卡设备,接下来使用下面的命令把
ens160
和
ens192
网卡添加进来。其中,
con-name 参数后面接的是从属网卡的名称(可以随时设置);
ifname 参数后面接的是两块网卡的名称。大家一定要以真实的网卡名称为准,不要直接复制这里的名字:
3.配置bond0设备的网络信息
用nmcli
命令依次配置网络的
IP
地址及子网掩码、网关、
DNS
、搜索域和手动配置等参数。
4.启动
启动它吧!再顺便看一下设备的详细列表:
当用户接下来访问主机
IP
地址 192.168.10.10 时,主机实际上是由两块网卡在共同提供服务。可以在本地主机执行 ping 192.168.10.10 命令检查网络的连通性。为了检验网卡绑定技术的自动备援功能,可以突然在虚拟机硬件配置中随机移除一块网卡设备
一般只丢失一个数据包,另外一块网卡会继续为用户提供服务。
启用网卡的混合模式:
2.远程控制服务
1.配置sshd服务
SSH
(
Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux 系统的首选方式。在此之前,一般使用 FTP 或 Telnet 来进行远程登录。但是因为它们以明文的形式在网络中传输账户密码和数据信息,因此很不安全,很容易受到黑客发起的中间人攻击,轻则篡改传输的数据信息,重则直接抓取服务器的账户密码。
想要使用
SSH
协议来远程管理
Linux
系统,则需要配置部署
sshd
服务程序。
sshd
是基于SSH协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供两种安全验证的方法:
基于密码的验证--用账户和密码来验证登录;
基于密钥的验证--需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全。
“
Linux
系统中的一切都是文件”,因此在
Linux 系统中修改服务程序的运行参数,实际上就是在修改程序配置文件的过程。
sshd 服务的配置信息保存在/etc/ssh/sshd
_
config文件中。运维人员一般会把保存着最主要配置信息的文件称为主配置文件,而配置文件中有许多以井号(
#)开头的注释行,要想让这些配置参数生效,需要在修改参数后再去掉前面的井号。
接下来的实验会使用两台虚拟机,一台充当服务器192.168.10.10,另外一台充当客户端其 IP
地址为192.168.10.20
在
RHEL 8
系统中,已经默认安装并启用了
sshd
服务程序。接下来在客户端使用
ssh 命令远程连接服务器,其格式为“ssh [参数]主机 IP 地址”,要退出登录则执行 exit 命令。第一次访问时需要输入 yes 来确认对方主机的指纹信息:
如果禁止以
root 管理员的身份远程登录到服务器,则可以大大降低被黑客暴力破解密码的概率。下面进行相应配置。首先使用
Vim
文本编辑器打开服务器上的
sshd 服务主配置文件,然后把第
46
行
#PermitRootLogin yes
参数前的井号(
#
)去掉,并把参数值
yes
改成
no,这样就不再允许
root
管理员远程登录了。记得最后保存文件并退出。
一般的服务程序并不会在配置文件修改之后立即获得最新的参数。如果想让新配置文件生效,则需要手动重启相应的服务程序。最好也将这个服务程序加入到开机启动项中,这样系统在下一次启动时,该服务程序便会自动运行,继续为用户提供服务。
为了避免后续实验中不能用
root 管理员账号登录,把上面的参数修改回来:
2.安全密钥验证
加密是对信息进行编码和解码的技术,它通过一定的算法(密钥)将原本能被直接阅读的明文信息转换成密文形式。密钥即是密文的钥匙,有私钥和公钥之分。在传输数据时,如果担心被他人监听或截获,就可以在传输前先使用公钥对数据加密处理,然后再进行传送。这样,只有掌握私钥的用户才能解密这段数据,除此之外的其他人即便截获了数据,一般也很难将其破译为明文信息
第一步:
在客户端主机中生成“密钥对”,记住是客户端。
第二步:
把客户端主机中生成的公钥文件传送至远程服务器。
第三步:
对服务器进行设置,使其只允许密钥验证,拒绝传统的密码验证方式。记得在修改配置文件后保存并重启
sshd
服务程序。
第四步:
客户端尝试登录到服务器,此时无须输入密码也可成功登录,特别方便。
3.远程传输命令
scp
(
secure copy
)是一个基于
SSH
协议在网络之间进行安全传输的命令,其格式为“scp [
参数
]
本地文件 远程账户
@
远程
IP
地址
:
远程目录”。
与
cp
命令不同,
cp
命令只能在本地硬盘中进行文件复制,而 scp 不仅能够通过网络传送数据,而且所有的数据都将进行加密处理。例如,如果想把一些文件通过网络从一台主机传递到其他主机,这两台主机又恰巧都是
Linux
系统,这时使用
scp 命令就可以轻松完成文件的传递了。
scp
命令中可用的参数以及作用:
在使用
scp 命令把文件从本地复制到远程主机时,首先需要以绝对路径的形式写清本地文件的存放位置。如果要传送整个文件夹内的所有数据,还需要额外添加参数
-r 进行递归操作。然后写上要传送到的远程主机的
IP 地址,远程服务器便会要求进行身份验证了。当前用户名称为
root,而密码则为远程服务器的密码。如果想使用指定用户的身份进行验证,可使用用户名
@
主机地址的参数格式。最后需要在远程主机的 IP 地址后面添加冒号,并在后面写上要传送到远程主机的哪个文件夹中。只要参数正确并且成功验证了用户身份,即可开始传送工作。由于
scp
命令是基于
SSH
协议进行文件传送的,而
又设置好了密钥验证,因此当前在传输文件时,并不需要账户和密码。
登录服务器中:
还可以使用
scp
命令把远程服务器上的文件下载到本地主机,其命令格式为“scp[
参数
]
远程用户
@
远程
IP
地址
:远程文件 本地目录”。这样就无须先登录远程主机再进行文件传送了,也就省去了很多周折。例如,可以把远程主机的系统版本信息文件下载过来。
3.不间断会话服务
如果正在使用命令来打包文件,或者正在使用脚本安装某个服务程序,中途是绝对不能关闭在本地打开的终端窗口或断开网络连接的,甚至连网速的波动都有可能导致任务中断,此时只能重新进行远程连接并重新开始任务。还有些时候,我们正在执行文件打包操作,同时又想用脚本来安装某个服务程序,这时会因为打包操作的输出信息占满用户的屏幕界面,而只能再打开一个执行远程会话的终端窗口。时间久了,难免会忘记这些打开的终端窗口是做什么用的了。
Terminal Multiplexer
(终端复用器,简称为 Tmux)是一款能够实现多窗口远程控制的开源服务程序。简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用
Tmux
服务程序同时在多个远程会话中自由切换,能够实现如下功能。
会话恢复:
即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享。
在
RHEL 8
系统中,默认没有安装
Tmux 服务程序,因此需要配置软件仓库来安装它。
这里直接开始安装
Tmux
:
1.管理远程会话
Tmux 服务能做的事情非常多,例如创建不间断会话、恢复离线工作、将界面切分为不同的窗格、共享会话等。下面直接敲击
tmux
命令进入会话窗口中,
会话窗口的底部出现了一个绿色的状态栏,里面分别显示的是会话编号、名称、主机名及系统时间。
退出会话窗口的命令是
exit
,敲击后即可返回到正常的终端界面
会话窗口的编号是从
0
开始自动排序(即
0
、
1
、
2
、
3、……),会话窗口数量少的时候还没关系,数量多的时候区分起来就很麻烦了。接下来创建一个指定名称为 backup 的会话窗口。当在命令行中敲下下面这条命令的一瞬间,屏幕会快速闪动一下,这时就已经进入
Tmux
会话中了,在里面执行的任何操作都会被后台记录下来。
假设我们突然要去忙其他事情,但会话窗口中执行的进程还不能被中断,此时便可以用detach 参数将会话隐藏到后台。虽然看起来与刚才没有不同,但实际上可以看到当前的会话正在工作中:
如果觉得每次输入
detach
参数都很麻烦,可以直接
关闭中断窗口(这与进行远程连接时突然断网具有相同的效果),
Tmux
服务程序会自动帮我们进行保存。
这样操作之后,服务和进程都会一直在后台默默运行,不会因为窗口被关闭而造成数据丢失。不放心的话可以查看一下后台有哪些会话:
在传统的远程控制中,如果突然关闭会话窗口,一定会导致正在运行的命令也突然终止,但是在
Tmux 的不间断会话服务中则不会这样。我们只需查看一下刚刚关闭的离线会话名称,然后尝试恢复回来,这个会话就可以继续工作了。回归到
backup 会话中的方法很简单,直接在
tmux
命令后面加
attach 和会话编号或会话名称就可以。关闭会话窗口之前正在进行的一切工作状态都会被原原本本地呈现出来,丝毫不受影响:
在日常的生产环境中,其实并不是必须先创建会话,然后再开始工作。可以直接使用 tmux命令执行要运行的指令,这样命令中的一切操作都会被记录下来,当命令执行结束后,后台会话也会自动结束。
2.管理多窗格
在实际工作中,一个 Shell 终端窗口总是不够用,这怎么办呢?Tmux 服务有个多窗格功能,能够把一个终端界面按照上下或左右进行切割,从而使得能同时做多件事情,而且之间
互不打扰,特别方便。
先创建一个会话。使用“
tmux split-window”命令可以创建上下切割的多窗格终端界面,
使用“
tmux split-window -h”命令可以创建左右切割的多窗格终端界面,
同时按下“
Ctrl + B +方向键”调整窗格的尺寸。例如,现在使用的窗格有些小,想向右扩大一些,则同时如下“
Ctrl + B +
右箭头键”就行了。
如果需要切换到其他窗格进行工作,但又不能关闭当前的窗格
。
假如想调整窗格的位置,把上面与下面的窗格位置互换,
原本执行过
uptime
命令的窗格在下方,只需要在该窗格中执行“tmux swap-pane -U
”命令即可与上方窗格互换位置,
快捷键来执行窗格的切换。方法是先同时按下
Ctrl+B 组合键,然后松手后再迅速按下其他后续按键,而不是一起按下。
在通过快捷键来操作会话窗格时,一定是先按下
Ctrl+B 组合键后, 再敲击其他按键,否则操作不生效。假设现在有
两个窗格,我们想将这两个窗口的位置互换。操作方法是先同时按下
Ctrl+B 组合键,然后松手,再按下“}
”键,即可实现,
3.会话共享功能
Tmux 服务不仅可以确保用户在极端情况下也不丢失对系统的远程控制,保证了生产境中远程工作的不间断性,而且它还具有会话共享、分屏切割窗格、会话锁定等实用的功能。 其中,会话共享功能是一件很酷的事情,当多个用户同时控制服务器的时候,它可以把服务器屏幕内容共享出来。也就是说,每个用户都能够看到相同的内容,还能一起同时操作。
要实现会话共享功能,首先使用
ssh
服务将客户端
A
远程连接到服务器,随后使用 Tmux服务创建一个新的会话窗口,名称为
share
:
操作完成后,两台客户端的所有终端信息都会被实时同步,它们可以一起共享同一个会话窗口,特别方便。
4.检索日志信息
Linux 系统拥有十分强大且灵活的日志系统,用于保存几乎所有的操作记录和服务运行状态,并且按照“报错”“警告”“提示”和“其他”等标注进行了分类。运维管理员可以根据所需的信息进行检索,快速找出想要的信息,因此对于了解系统运行状态有着不错的帮助作用。
在
RHEL 8
系统中,默认的日志服务程序是
rsyslog
。可以将
rsyslog 理解成之前的 syslogd服务的增强版本,它更加注重日志的安全性和性能指标。为了便于日后的检索,不同的日志信息会被写入到不同的文件中。
在日常工作中,
/var/log/message
这个综合性的文件用得最多。在处理 Linux 系统中出现的各种故障时,一般是最先发现故障的症状,而找到故障的原因则一定离不开日志信息的帮忙。
从理论上讲,日志文件分为下面
3
种类型。
系统日志:
主要记录系统的运行情况和内核信息。
用户日志:主要记录用户的访问信息,包含用户名、终端名称、登入及退出时间、来源 IP 地址和执行过的操作等。
程序日志:稍微大一些的服务一般都会保存一份与其同名的日志文件,里面记录着服务运行过程中各种事件的信息;每个服务程序都有自己独立的日志文件,且格式相差较大。
每个稍微大一些的服务都有自己独立的日志文件,为了让用户在检索信息时不至于特别麻烦,
journalctl
命令应运而生。
journalctl 命令用于检索和管理系统日志信息,英文全称为“
journal control
”,语法格式为“
journalctl 参数”。它可以根据事件、类型、服务名称等信息进行信息检索,从而大大提高了日常排错的效率。
journalctl
命令的常见参数:
首先查看系统中最后
5
条日志信息:
还可以使用
-f
参数实时刷新日志的最新内容(这与
tail -f /var/log/message命令的效果相同):
在
rsyslog
服务程序中,日志根据重要程度被分为
9
个等级
。这样的好处是,我们可以直击最重要的信息,而不用担心会被海啸般的输出内容所淹没。
如果只想看系统中较高级别的报错信息,可以在
journalctl
命令中用
-p
参数进行指定:
我们不仅能够根据日志等级进行检索,还可以用
--since
参数按照今日(
today
)、近
N 小时(
hour
)、指定时间范围的格式进行检索,找出最近的日志数据。来看下面几个例子。
仅查询今日的日志信息:
仅查询最近
1
小时的日志信息:
仅查询
12
点整到
14
点整的日志信息:
仅查询从
2020
年
7
月
1
日至
2020
年
8
月
1
日的日志信息:
查询指定服务的日志信息。在默认情况下,所有的日志信息都是混在一起的。如果想看具体某项服务的日志信息,可以使用
_
SYSTEMD
_
UNIT 参数进行查询,服务名称的后面要有“
.service
”,这是标准服务名称的写法。