Linux加强篇006-存储结构与管理硬盘

简介: 山重水复疑无路,柳暗花明又一村

一、前言

悟已往之不谏知来者之可追实迷途其未远觉今而昨非。舟遥遥以轻飏风飘飘而吹衣。问征夫以前路恨晨光之熹微

第一版我已经全部放到我的精选里了,大家可以点开我的头像主页,选择精选观看,本系列依照《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 添加硬盘设备

首先把虚拟机系统关机,稍等几分钟会自动返回到虚拟机管理主界面,然后单击“编辑虚拟机设置”选项,在弹出的界面中单击“添加”按钮,新增一块硬件设备

image.png

选择虚拟硬盘的类型为SATA(用推荐的也可以,比SATA更好一些,踩坑了,必须和你原有的硬盘保持一致,我的事NVMe的,所以也要用这个),并单击“下一步”按钮

image.png

选中“创建新虚拟磁盘”单选按钮,再次单击“下一步”按钮

image.png

将“最大磁盘大小”设置为默认的20GB,单击“下一步”按钮

image.png

设置磁盘文件的文件名和保存位置(这里采用默认设置即可,无须修改),直接单击“完成”按钮

image.png

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 瓦迪斯瓦夫·雷蒙特的书 PDF 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服务器免费试用参与或低价购买专属于自己的服务器入口如下

入口一:新老同学免费试用

入口二:新人服务器特惠礼包

入口三:大学生版低价特惠服务器

入口四:云服务器首购特惠&免费试用

入口五:云服务器特惠1.5折起

入口六:低价特惠建站

目录
相关文章
|
2月前
|
存储 关系型数据库 MySQL
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
24 0
|
2月前
|
存储 Linux 虚拟化
Linux和开源存储
Linux和开源存储
Linux和开源存储
|
1天前
|
Java Linux Maven
Linux系统Docker部署Nexus Maven并实现远程访问本地管理界面
Linux系统Docker部署Nexus Maven并实现远程访问本地管理界面
|
1天前
|
缓存 Linux Shell
【linux】体系结构和os管理
【linux】体系结构和os管理
10 0
|
13天前
|
Linux
linux tree命令找不到:如何使用Linux Tree命令查看文件系统结构
linux tree命令找不到:如何使用Linux Tree命令查看文件系统结构
19 0
|
18天前
|
Linux Shell 数据安全/隐私保护
如何在Linux中使用`usermod`命令,以便你可以灵活地管理用户账户?
如何在Linux中使用`usermod`命令,以便你可以灵活地管理用户账户?
33 1
如何在Linux中使用`usermod`命令,以便你可以灵活地管理用户账户?
|
26天前
|
存储 监控 Ubuntu
揭秘 systemd:释放 Linux 服务管理的力量【systemd 一】
揭秘 systemd:释放 Linux 服务管理的力量【systemd 一】
31 0
|
1月前
|
存储 Ubuntu Linux
【Linux操作系统】探秘Linux奥秘:文件系统的管理与使用
【Linux操作系统】探秘Linux奥秘:文件系统的管理与使用
28 0
|
1月前
|
存储 缓存 关系型数据库
Mysql专栏 - Linux底层交互和Raid存储架构
Mysql专栏 - Linux底层交互和Raid存储架构
70 0
|
2月前
|
监控 Linux
Linux学习笔记十二:Linux 工作管理
Linux学习笔记十二:Linux 工作管理
Linux学习笔记十二:Linux 工作管理

热门文章

最新文章

相关产品

  • 云迁移中心