一、前言
悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。舟遥遥以轻飏,风飘飘而吹衣。问征夫以前路,恨晨光之熹微。
第一版我已经全部放到我的精选里了,大家可以点开我的头像主页,选择精选观看,本系列依照《Linux就该这么学》第二版随书学习练习操作,将一些课本上不顺畅的地方,全部以最简方式免费开源展示给大家,资源大家可以自行百度,学习起来我们既要多巴胺也要内啡肽。
centos8的前5章学完,发现和centos7差别不大,但也要小心学习,避免学混学乱,细水长流,青山不倒。孔子说的“知不可而为之”是告诉世人做事时不问可不可能,但问应不应该,人要有一点锲而不舍的追求精神,许多事情都是经过艰苦努力和奋斗而得来的,送上一首天王的<兰亭序-周杰伦>。
小作一首《盼君行》希望可以激励大家,勇敢迈出学习第一步。
吾辈中人,皆碌碌于案牍,屋价溢高,年俸不过寸厕金,物价横飞,顿饭邀客褡裢浅,昼兴夜寐求不得,职责非卷不可为。世人皆叹天大寒,众生苦解待来年,年复一年又何如?愿君醒寤,当以高技博厚薪,远卷近舒,人穷则思变,志穷则思远,反躬自省,以小错不改受大忌,俯首垂叹,非吾辈之志也,从善如流,宜哉!君之志向上天厅,躬身笃行始作难,盼君乘风行万里,披荆斩棘过千山。
6.1 从“/”开始
Linux系统中一切都是文件,都是从“根”目录(/)开始的,Linux系统中的文件和目录名称是严格区分大小写,Linux系统中的文件存储结构如下:
Linux系统中,最常见的目录以及所对应的存放内容如表:
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 物理设备命名规则
Linux系统中常见的硬件设备及其文件名称
常见的硬件设备及其文件名称
硬件设备 | 文件名称 |
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 |
/dev/目录中保存的应当是硬件设备文件;其次,sd表示的是存储设备;然后,a表示系统中同类接口中第一个被识别到的设备;最后,5表示这个设备是一个逻辑分区。
硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表占用64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。第一个扇区中的数据信息
可以将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针—一个指向另外一个分区的指针。
扩展分区,严格地讲它不是一个实际意义的分区,而仅仅是一个指向其他分区的指针,这种指针结构将形成一个单向链表。因此扩展分区自身不能存储数据,用户需要在其指向的对应分区(称之为逻辑分区)上进行操作。
6.3 文件系统与数据资料
首先要进行裁切以方便使用(分区),接下来在裁切后的纸张上画格以便能书写工整(格式化),最后是正式的使用(挂载)。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块的内容串到一起,就能够让用户读到完整的文件内容了。
6.4 挂载硬件设备
mount命令用于挂载文件系统,格式为“mount文件系统 挂载目录”一般不需要使用-t参数来指定文件系统的类型,Linux系统会自动进行判断。而mount中的-a参数则厉害了,它会在执行后自动检查/etc/fstab文件中有无被疏漏挂载的设备文件,如果有,则进行自动挂载操作。
mount命令中参数及作用
参数 | 作用 |
-a | 挂载所有在/etc/fstab中定义的文件系统 |
-t | 指定文件系统的类型 |
设备/dev/nvme0n1p2挂载到/backup目录,只需要在mount命令中填写设备与挂载目录参数就行,系统会自动判断要挂载文件的类型,命令如下:
[root@localhost dev]# fdisk -l
查看一下自己的磁盘名称
Disk /dev/nvme0n1: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xaddfec92
Device Boot Start End Sectors Size Id Type
/dev/nvme0n1p1 * 2048 616447 614400 300M 83 Linux
/dev/nvme0n1p2 616448 4810751 4194304 2G 82 Linux swap / Solaris
/dev/nvme0n1p3 4810752 41943039 37132288 17.7G 83 Linux
挂载
[root@localhost dev]# mount /dev/nvme0n1p2 /backup
用UUID(Universally Unique Identifier,通用唯一识别码)进行挂载操作。UUID是一串用于标识每块独立硬盘的字符串,具有唯一性及稳定性,特别适合用来挂载网络设备
blkid命令用于显示设备的属性信息,语法格式为“blkid [设备名]”。使用blkid命令来查询设备UUID
[root@localhost dev]# blkid
/dev/nvme0n1: PTUUID="addfec92" PTTYPE="dos"
/dev/nvme0n1p1: UUID="b7107860-5e6f-4ff5-abb3-880ab7e6caca" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="addfec92-01"
/dev/nvme0n1p2: UUID="1396ecbf-4d87-4e65-898b-28048721d05e" TYPE="swap" PARTUUID="addfec92-02"
[root@localhost dev]# mount UUID=1396ecbf-4d87-4e65-898b-28048721d05e /backup
虽然按照上面的方法执行mount命令后就能立即使用文件系统了,但系统在重启后挂载就会失效,也就是说需要每次开机后都手动挂载一下,把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”写入到/etc/fstab文件中。这个文件中包含着挂载所需的诸多信息项目
用于挂载信息的指定填写格式中,各字段所表示的意义
字段 | 意义 |
设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) |
挂载目录 | 指定要挂载到的目录,需在挂载前创建好 |
格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 |
权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async |
是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 |
是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 |
将文件系统为Ext4的硬件设备/dev/nvme0n2在开机后自动挂载到/backup目录上,并保持默认权限且无须开机自检,就需要在/etc/fstab文件中写入下面的信息,这样在系统重启后也会成功挂载。由于后面需要使用系统镜像制作Yum/DNF软件仓库,我们提前把光盘设备挂载到/media/cdrom目录中。光盘设备的文件系统格式是iso9660:
[root@localhost dev]# vim /etc/fstab
UUID=147464a6-27ee-477f-8dfd-0c157a0aabc7 / xfs defaults 0 0
UUID=b7107860-5e6f-4ff5-abb3-880ab7e6caca /boot xfs defaults 0 0
UUID=1396ecbf-4d87-4e65-898b-28048721d05e none swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
写入到/etc/fstab文件中的设备信息并不会立即生效,需要使用mount -a参数进行自动挂载:
[root@localhost dev]# mount -a
df命令用于查看已挂载的磁盘空间使用情况,语法格式为“df -h”用-h参数便捷地对存储容量进行“进位”操作
[root@localhost dev]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 878M 0 878M 0% /dev
tmpfs 896M 0 896M 0% /dev/shm
tmpfs 896M 9.3M 886M 2% /run
tmpfs 896M 0 896M 0% /sys/fs/cgroup
/dev/nvme0n1p3 18G 7.1G 11G 41% /
/dev/sr0 11G 11G 0 100% /media/cdrom
/dev/nvme0n1p1 295M 193M 102M 66% /boot
tmpfs 179M 12K 179M 1% /run/user/42
tmpfs 179M 0 179M 0% /run/user/0
在fstab文件挂载信息中加上_netdev参数。加上后系统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况
[root@localhost dev]# vim /etc/fstab
UUID=147464a6-27ee-477f-8dfd-0c157a0aabc7 / xfs defaults 0 0
UUID=b7107860-5e6f-4ff5-abb3-880ab7e6caca /boot xfs defaults 0 0
UUID=1396ecbf-4d87-4e65-898b-28048721d05e none swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults,_netdev 0 0
挂载文件系统的目的是为了使用硬件资源,而卸载文件系统则意味不再使用硬件的设备资源。
umount命令用于卸载设备或文件系统,语法格式为“umount [设备文件/挂载目录]”
[root@localhost dev]# umount /dev/nvme0n1p2
当前就处于设备所挂载的目录,系统会提示该设备繁忙,此时只需要退出到其他目录后再尝试一次
lsblk命令用于查看已挂载的磁盘的空间使用情况
[root@localhost dev]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 10.1G 0 rom /media/cdrom
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 300M 0 part /boot
├─nvme0n1p2 259:2 0 2G 0 part [SWAP]
└─nvme0n1p3 259:3 0 17.7G 0 part /
6.5 添加硬盘设备
首先把虚拟机系统关机,稍等几分钟会自动返回到虚拟机管理主界面,然后单击“编辑虚拟机设置”选项,在弹出的界面中单击“添加”按钮,新增一块硬件设备
选择虚拟硬盘的类型为SATA(用推荐的也可以,比SATA更好一些,踩坑了,必须和你原有的硬盘保持一致,我的事NVMe的,所以也要用这个),并单击“下一步”按钮
选中“创建新虚拟磁盘”单选按钮,再次单击“下一步”按钮
将“最大磁盘大小”设置为默认的20GB,单击“下一步”按钮
设置磁盘文件的文件名和保存位置(这里采用默认设置即可,无须修改),直接单击“完成”按钮
fdisk命令用于新建、修改及删除磁盘的分区表信息,语法格式为“fdisk磁盘名称”提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”
fdisk命令中参数及作用
参数 | 作用 |
m | 查看全部可用的参数 |
n | 添加新的分区 |
d | 删除某个分区信息 |
l | 列出所有可用的分区类型 |
t | 改变某个分区的类型 |
p | 查看分区表信息 |
w | 保存并退出 |
q | 不保存直接退出 |
启动虚拟机,使用fdisk命令来尝试管理/dev/nvme0n2硬盘设备,在看到提示信息后输入参数p来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 10.1G 0 rom /media/cdrom
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 300M 0 part /boot
├─nvme0n1p2 259:2 0 2G 0 part [SWAP]
└─nvme0n1p3 259:3 0 17.7G 0 part /
nvme0n2 259:4 0 20G 0 disk
找到这个硬盘nvme0n2
[root@localhost ~]# fdisk /dev/nvme0n2
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xac249528.
Command (m for help):
p
Disk /dev/nvme0n2: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xac249528
输入参数n尝试添加新的分区。系统会要求用户是选择继续输入参数p来创建主分区,还是输入参数e来创建扩展分区
Command (m for help):
n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p):
p
创建一个主分区后,系统要求用户先输入主分区的编号,主分区的编号范围是1~4,因此这里输入默认的1,输入+2G即可创建出一个容量为2GB的硬盘分区。
Partition number (1-4, default 1):
1
First sector (2048-41943039, default 2048):
回车
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039):
+2G
Created a new partition 1 of type 'Linux' and of size 2 GiB.
再次使用参数p来查看硬盘设备中的分区信息,参数w后按回车键,完成分区信息写入
Command (m for help):
p
Disk /dev/nvme0n2: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xac249528
Device Boot Start End Sectors Size Id Type
/dev/nvme0n2p1 2048 4196351 4194304 2G 83 Linux
Command (m for help):
w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
使用l参数查看一下磁盘编码都有哪些
[root@localhost ~]# fdisk /dev/nvme0n2
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): l
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
使用file命令查看该文件的属性
[root@localhost ~]# file /dev/nvme0n2
/dev/nvme0n2: block special (259/4)
输入partprobe命令手动将分区信息同步到内核,如果执行没结果的话
Linux系统中用于格式化操作的命令是mkfs,如果实现有问题有分区表了,可以加-f强制执行
[root@localhost ~]# mkfs.xfs /dev/nvme0n2p1
meta-data=/dev/nvme0n2p1 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
完成存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备
[root@localhost ~]# mkdir /newfile
[root@localhost ~]# mount /dev/nvme0n2p1 /newfile
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 878M 0 878M 0% /dev
tmpfs 896M 0 896M 0% /dev/shm
tmpfs 896M 9.3M 886M 2% /run
tmpfs 896M 0 896M 0% /sys/fs/cgroup
/dev/nvme0n1p3 18G 7.1G 11G 41% /
/dev/sr0 11G 11G 0 100% /media/cdrom
/dev/nvme0n1p1 295M 193M 102M 66% /boot
tmpfs 179M 12K 179M 1% /run/user/42
tmpfs 179M 0 179M 0% /run/user/0
/dev/nvme0n2p1 2.0G 78M 2.0G 4% /newfile
du命令用查看分区或目录所占用的磁盘容量大小,语法格式为“du -sh目录名称”
Linux系统中可以使用du -sh /*命令来查看在Linux系统根目录下所有一级目录分别占用的空间大小,在1s之内就能找到哪个目录占用的空间最多:
[root@localhost ~]# du -sh /*
0 /a
60K /backup.acl
0 /bin
176M /boot
从某些目录中复制过来一批文件,然后查看这些文件总共占用了多大的容量:
[root@localhost ~]# cp -rf /etc/* /newfile
[root@localhost ~]# du -sh /newfile
31M /newfile
挂载永久有效,则需要把挂载的信息写入配置文件中(红色部分):
[root@localhost ~]# vim /etc/fstab
UUID=147464a6-27ee-477f-8dfd-0c157a0aabc7 / xfs defaults 0 0
UUID=b7107860-5e6f-4ff5-abb3-880ab7e6caca /boot xfs defaults 0 0
UUID=1396ecbf-4d87-4e65-898b-28048721d05e none swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/nvme0n2p1 /newfile xfs defaults 0 0
6.6 添加交换分区
交换(SWAP)分区是一种通过在硬盘中预先划分一定的空间,交换分区的创建过程与前文讲到的挂载并使用存储设备的过程非常相似。在对/dev/nvme0n2存储设备进行分区操作前,有必要先说一下交换分区的划分建议:在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍,取出一个大小为5GB的主分区作为交换分区资源:
[root@localhost ~]# fdisk /dev/nvme0n2
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help):
n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p):
p
Partition number (2-4, default 2):
回车
First sector (4196352-41943039, default 4196352):
回车
Last sector, +sectors or +size{K,M,G,T,P} (4196352-41943039, default 41943039):
+5G
Created a new partition 2 of type 'Linux' and of size 5 GiB.
修改硬盘的标识码,这里将其改成82(Linux swap)以方便以后知道它的作用:
Command (m for help):
t
Partition number (1,2, default 2):
2
Hex code (type L to list all codes):
82
Changed type of partition 'Linux' to 'Linux swap / Solaris'.
Command (m for help):
p
Disk /dev/nvme0n2: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3fac72e1
Device Boot Start End Sectors Size Id Type
/dev/nvme0n2p1 2048 4196351 4194304 2G 83 Linux
/dev/nvme0n2p2 4196352 14682111 10485760 5G 82 Linux swap / Solaris
Command (m for help):
w
The partition table has been altered.
Syncing disks.
mkswap命令用于对新设备进行交换分区格式化,语法格式为“mkswap设备名称”
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 10.1G 0 rom /media/cdrom
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 300M 0 part /boot
├─nvme0n1p2 259:2 0 2G 0 part [SWAP]
└─nvme0n1p3 259:3 0 17.7G 0 part /
nvme0n2 259:4 0 20G 0 disk
├─nvme0n2p2 259:5 0 5G 0 part
└─nvme0n2p1 259:6 0 2G 0 part /newfile
[root@localhost ~]# mkswap /dev/nvme0n2p2
Setting up swapspace version 1, size = 5 GiB (5368705024 bytes)
no label, UUID=6fc92e71-8ee2-4883-96b5-dab84a2336ce
swapon命令用于激活新的交换分区设备,语法格式为“swapon设备名称”
使用swapon命令把准备好的SWAP硬盘设备正式挂载到系统中,可以使用free -m命令查看交换分区的大小变化
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1790 718 280 10 790 877
Swap:
2047
0 2047
[root@localhost ~]# swapon /dev/nvme0n2p2
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1790 723 275 10 790 873
Swap:
7167
0 7167
新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入配置文件中
[root@localhost ~]# vim /etc/fstab
UUID=147464a6-27ee-477f-8dfd-0c157a0aabc7 / xfs defaults 0 0
UUID=b7107860-5e6f-4ff5-abb3-880ab7e6caca /boot xfs defaults 0 0
UUID=1396ecbf-4d87-4e65-898b-28048721d05e none swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/nvme0n2p1 /newfile xfs defaults 0 0
/dev/nvme0n2p2 swap swap defaults 0 0
6.7 磁盘容量配额
使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用quota技术进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota技术还有软限制和硬限制的功能。
软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
手动编辑配置文件并重启一次系统,让系统中的启动目录(/boot)能够支持quota磁盘配额技术
[root@localhost ~]# vim /etc/fstab
UUID=147464a6-27ee-477f-8dfd-0c157a0aabc7 / xfs defaults 0 0
UUID=b7107860-5e6f-4ff5-abb3-880ab7e6caca /boot xfs defaults
,uquota
0 0
UUID=1396ecbf-4d87-4e65-898b-28048721d05e none swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/nvme0n2p1 /newfile xfs defaults 0 0
/dev/nvme0n2p2 swap swap defaults 0 0
[root@localhost ~]# reboot
在重启系统后使用mount命令查看,即可发现/boot目录已经支持quota磁盘配额技术了:
[root@localhost ~]# mount | grep boot
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k
,usrquota
)
创建一个用于检查quota磁盘容量配额效果的用户tom,并针对/boot目录增加其他人的写权限,保证用户能够正常写入数据:
[root@localhost ~]# useradd tom
[root@localhost ~]# chmod -R o+w /boot
xfs_quota命令用于管理设备的磁盘容量配额,语法格式为“xfs_quota [参数] 配额 文件系统”
针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令。其中,-c参数用于以参数的形式设置要执行的命令;-x参数是专家模式,让运维人员能够对quota服务进行更多复杂的配置。接下来使用xfs_quota命令来设置用户tom对/boot目录的quota磁盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为3MB和6MB;创建文件数量的软限制和硬限制分别为3个和6个
[root@localhost ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot
[root@localhost ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/nvme0n1p1)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 179368 0 0 00 [--------]
tom 0 3072 6144 00 [--------]
使用的参数分为两组,分别是isoft/ihard与bsoft/bhard,isoft和ihard就是通过限制系统最大使用的inode个数来限制了文件数量。bsoft和bhard则是代表文件所占用的block大小,也就是文件占用的最大容量的总统计。
soft是软限制,超过该限制后也只是将操作记录写到日志中,不对用户行为进行限制。而hard是硬限制,一旦超过系统就会马上禁止,用户再也不能创建或新占任何的硬盘容量。
尝试切换到一个普通用户,然后分别尝试创建一个体积为5MB和8MB的文件,但是我实验起来并没有发现有限制,之前的命令也没什么问题,可能是系统问题
edquota命令用于管理系统的磁盘配额,语法格式为“edquota [参数] 用户名”
用户设置了quota磁盘容量配额限制后,可以使用edquota命令按需修改限额的数值。-u参数表示要针对哪个用户进行设置;-g参数表示要针对哪个用户组进行设置
edquota命令中可用参数及作用
参数 | 作用 |
-u | 对某个用户进行设置 |
-g | 对某个用户组进行设置 |
-p | 复制原有的规则到新的用户/组 |
-t | 限制宽限期限 |
edquota命令会调用Vi或Vim编辑器来让root管理员修改要限制的具体细节,试一下改小能不能行
[root@localhost ~]# edquota -u tom
Disk quotas for user tom (uid 8889):
Filesystem blocks soft hard inodes soft hard
/dev/nvme0n1p1 4096 3072 3072 1 3 6
终于生效了,可能是我写的hard太大了
[tom@localhost boot]$ dd if=/dev/zero of=/boot/tom bs=8M count=2
dd: error writing '/boot/tom': Disk quota exceeded
1+0 records in
0+0 records out
0 bytes copied, 0.00387253 s, 0.0 kB/s
[tom@localhost boot]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
dd: error writing '/boot/tom': Disk quota exceeded
1+0 records in
0+0 records out
0 bytes copied, 0.00278153 s, 0.0 kB/s
6.8 VDO虚拟数据优化
VDO(Virtual Data Optimize,虚拟数据优化)是一种通过压缩或删除存储设备上的数据来优化存储空间的技术,VDO针对各种类型文件的压缩效果
对各种类型文件压缩效果汇总表
文件名 | 描述 | 类型 | 原始大小(KB) | 实际占用空间(KB) |
dickens | 狄更斯文集 | 英文原文 | 9953 | 9948 |
mozilla | Mozilla的1.0可执行文件 | 执行程序 | 50020 | 33228 |
mr | 医用resonanse图像 | 图片 | 9736 | 9272 |
nci | 结构化的化学数据库 | 数据库 | 32767 | 10168 |
ooffice | Open Office.org 1.01 DLL | 可执行程序 | 6008 | 5640 |
osdb | 基准测试用的MySQL格式示例数据库 | 数据库 | 9849 | 9824 |
reymont | 瓦迪斯瓦夫·雷蒙特的书 | 6471 | 6312 | |
samba | samba源代码 | src源码 | 21100 | 11768 |
sao | 星空数据 | 天文格式的bin文件 | 7081 | 7036 |
webster | 辞海 | HTML | 40487 | 40144 |
xml | XML文件 | HTML | 5220 | 2180 |
x-ray | 透视医学图片 | 医院数据 | 8275 | 8260 |
VDO技术支持本地存储和远程存储,可以作为本地文件系统、iSCSI或Ceph存储下的附加存储层使用。
司服务器上已有的dm-crypt之类的技术是可以与VDO技术兼容的,但记得要先对卷进行加密再使用VDO。因为加密会使重复的数据变得有所不同,因此删重操作无法实现。
VDO技术不可叠加使用,1TB的物理存储提升成10TB的逻辑存储没问题,但是再用10TB翻成100TB就不行
把虚拟机关闭,添加一块容量为20GB的新硬盘进来,开机后就能看到这块名称为/dev/nvme0n3的新硬盘了:
[root@localhost ~]# ll /dev/nvme0n3
brw-rw----. 1 root disk 259, 7 Nov 21 16:45 /dev/nvme0n3
RHEL/CentOS 8系统中默认已经启用了VDO技术
[root@localhost ~]# dnf install kmod-kvdo vdo
Last metadata expiration check: 2:19:07 ago on Tue 21 Nov 2023 02:29:37 PM CST.
Package kmod-kvdo-6.2.5.72-81.el8.x86_64 is already installed.
Package vdo-6.2.5.74-14.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
创建一个全新的VDO卷,新添加进来的物理设备就是使用vdo命令来管理的,其中name参数代表新的设备卷的名称;device参数代表由哪块磁盘进行制作;vdoLogicalSize参数代表制作后的设备大小,20GB硬盘将翻成200GB的逻辑存储:
[root@localhost ~]# vdo create --name=storage --device=/dev/nvme0n3 --vdoLogicalSize=200G
Creating VDO storage
The VDO volume can address 16 GB in 8 data slabs, each 2 GB.
It can grow to address at most 16 TB of physical storage in 8192 slabs.
If a larger maximum size might be needed, use bigger slabs.
Starting VDO storage
Starting compression on VDO storage
VDO instance 0 volume is ready at /dev/mapper/storage
在创建成功后,使用status参数查看新建卷的概述信息:
[root@localhost ~]# vdo status --name=storage
VDO status:
Date: '2023-11-21 16:51:21+08:00'
Node: localhost.localdomain
Kernel module:
Loaded: true
Name: kvdo
Version information:
kvdo version: 6.2.5.72
Configuration:
File: /etc/vdoconf.yml
Last modified: '2023-11-21 16:50:47'
输出信息中包含了VDO卷创建的时间、主机名、版本、是否压缩(Compression)及是否删重(Deduplication)等
对新建卷进行格式化操作并挂载使用,新建的VDO卷设备会被乖乖地存放在/dev/mapper目录下,并以设备名称命名,对它操作就行。另外,挂载前可以用udevadm settle命令对设备进行一次刷新操作,避免刚才的配置没有生效:
[root@localhost mapper]# mkfs.xfs /dev/mapper/storage
meta-data=/dev/mapper/storage isize=512 agcount=4, agsize=13107200 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=52428800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=25600, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.
[root@localhost mapper]# udevadm settle
[root@localhost mapper]# mkdir /storage
[root@localhost mapper]# mount /dev/mapper/storage /storage
查看设备的实际使用情况,使用vdostats命令即可。human-readable参数的作用是将存储容量自动进位,以人们更易读的方式输出(比如,显示20G而不是20971520K):
[root@localhost mapper]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/storage 20.0G 4.0G 16.0G 20% 99%
显示的Size是实际物理存储的空间大小(即20.0GB是硬盘的大小),如果想看逻辑存储空间,使用df命令进行查看:
[root@localhost mapper]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 878M 0 878M 0% /dev
tmpfs 896M 0 896M 0% /dev/shm
tmpfs 896M 9.4M 886M 2% /run
tmpfs 896M 0 896M 0% /sys/fs/cgroup
/dev/nvme0n1p3 18G 7.1G 11G 41% /
/dev/nvme0n1p1 295M 193M 102M 66% /boot
/dev/sr0 11G 11G 0 100% /media/cdrom
/dev/nvme0n2p1 2.0G 78M 2.0G 4% /newfile
tmpfs 179M 12K 179M 1% /run/user/42
tmpfs 179M 0 179M 0% /run/user/0
/dev/mapper/storage
200G
1.5G 199G 1% /storage
复制一个大文件过来,看看占用了多少容量,以及空间节省率(Space saving)是多少:
[root@localhost mapper]# ls -lh /media/cdrom/images/install.img
-r--r--r--. 1 root root 681M Nov 13 2021 /media/cdrom/images/install.img
[root@localhost mapper]# cp /media/cdrom/images/install.img /storage/
[root@localhost mapper]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/storage 20.0G 4.7G 15.3G 23% 12%
再复制一份相同的文件过来,看看这次占用了多少空间,空间节省率也从12%提升到了55%,用了不到100M:
[root@localhost mapper]# cp /media/cdrom/images/install.img /storage/rhel.img
[root@localhost mapper]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/storage 20.0G 4.7G 15.3G 23% 53%
VDO设备卷在创建后会一直存在,但需要手动编辑/etc/fstab文件后才能在下一次重启后自动挂载生效
/dev/mapper/storage: UUID="debbe4ed-97e0-410c-bde4-441ac474c3ff" BLOCK_SIZE="4096" TYPE="xfs"
[root@localhost storage]# vim /etc/fstab
UUID=147464a6-27ee-477f-8dfd-0c157a0aabc7 / xfs defaults 0 0
UUID=b7107860-5e6f-4ff5-abb3-880ab7e6caca /boot xfs defaults,uquota 0 0
UUID=1396ecbf-4d87-4e65-898b-28048721d05e none swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/nvme0n2p1 /newfile xfs defaults 0 0
/dev/nvme0n2p2 swap swap defaults 0 0
UUID=debbe4ed-97e0-410c-bde4-441ac474c3ff /storage xfs defaults,_netdev 0 0
6.9 软硬方式链接
Linux系统中存在软链接和硬链接两种不同的类型。
软链接(soft link):也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路径,很像一个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问。可以针对文件、目录设置软链接,跨文件系统进行链接也不是问题。
硬链接(hard link):可以将它理解为一个“指向原始文件block的指针”,系统会创建出一个与原来一模一样的inode信息块。所以,硬链接文件与原始文件其实是一模一样的,只是名字不同。每添加一个硬链接,该文件的inode个数就会增加1;而且只有当该文件的inode个数为0时,才算彻底将它删除。
n命令用于创建文件的软硬链接,语法格式为“ln [参数]原始文件名 链接文件名”
在使用ln命令时,是否添加-s参数,将创建出性质不同的两种“快捷方式”
ln命令中可用参数及作用
参数 | 作用 |
-s | 创建“符号链接”(如果不带-s参数,则默认创建硬链接) |
-f | 强制创建文件或目录的链接 |
-i | 覆盖前先询问 |
-v | 显示创建链接的过程 |
为了更好地理解软链接、硬链接的不同性质,我们先创建出一个文件,为其创建一个软链接:
[root@localhost mapper]# echo "123" > test.txt
[root@localhost mapper]# ln -s test.txt new.txt
[root@localhost mapper]# cat test.txt
123
[root@localhost mapper]# cat new.txt
123
[root@localhost mapper]# ls -l test.txt
-rw-r--r--. 1 root root 4 Nov 21 17:33 test.txt
删掉原始文件后,软链接文件立刻就无法读取了:
[root@localhost mapper]# rm -rf test.txt
[root@localhost mapper]# cat new.txt
cat: new.txt: No such file or directory
针对原始文件old创建一个硬链接,即相当于针对原始文件的硬盘存储位置创建了一个指针。这样一来,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会因为原始文件的删除而导致无法读取了。同时可以看到创建硬链接后,原始文件的硬盘链接数量增加到了2
[root@localhost mapper]# echo "123" > test.txt
[root@localhost mapper]# ln test.txt new1.txt
[root@localhost mapper]# cat test.txt
123
[root@localhost mapper]# cat new1.txt
123
[root@localhost mapper]# ll test.txt
-rw-r--r--. 2 root root 4 Nov 21 17:37 test.txt
创建的硬链接文件竟然会让文件属性第二列的数字变成了2,这个数字表示的是文件的inode信息块的数量。相信同学们已经非常肯定地知道,即便删除了原始文件,新的文件也会一如既往地可以读取,因为只有当文件inode数量被“清零”时,才真正代表这个文件被删除了
[root@localhost mapper]# rm -rf test.txt
[root@localhost mapper]# cat new1.txt
123
二、巩固练习
1./home目录与/root目录内存放的文件有何相同点以及不同点?
答:这两个目录都是用来存放用户家目录数据的,但是,/root目录存放的是root管理员的家目录数据。
2.假如一个设备的文件名称为/dev/sdb,可以确认它是主板第二个插槽上的设备吗?
答:不一定,因为设备的文件名称是由系统的识别顺序来决定的。
3.如果硬盘中需要5个分区,则至少需要几个逻辑分区?
答:可以选用创建3个主分区+1个扩展分区的方法,然后把扩展分区再分成2个逻辑分区,即有了5个分区。
4./dev/sda5是主分区还是逻辑分区?
答:逻辑分区。
5.哪个服务决定了设备在/dev目录中的名称?
答:udev设备管理器服务。
6.用一句话来描述挂载操作。
答:当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。
7.在配置quota磁盘容量配额服务时,软限制数值必须小于硬限制数值么?
答:不一定,软限制数值可以小于等于硬限制数值。
8.VDO技术能够提升硬盘的物理存储空间么?
答:不可以,VDO是通过压缩或删重操作来提高硬盘的逻辑空间大小。
9.若原始文件被改名,那么之前创建的硬链接还能访问到这个原始文件么?
答:可以,文件属性第二列数字归零后就不能访问了
三、跋文
如果想上手操作的同学们可以通过阿里云ecs服务器免费试用参与或低价购买专属于自己的服务器入口如下↓↓↓↓↓