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

news2024/11/18 2:50:05

目录

前言

1. 从“/”开始

2. 物理设备命名规则

3. 文件系统与数据资料

4. 挂载硬件设备

5. 添加硬盘设备

6. 添加交换分区

7. 磁盘容量配额

8. VDO虚拟数据优化

9. 软硬方式链接


前言

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

第一版我已经全部放到我的精选里了,大家可以点开我的头像主页,选择精选观看,本系列依照《Linux就该这么学》第二版随书学习练习操作,将一些课本上不顺畅的地方,全部以最简方式免费开源展示给大家,资源大家可以自行百度,学习起来我们既要多巴胺也要内啡肽。

centos8的前5章学完,发现和centos7差别不大,但也要小心学习,避免学混学乱,细水长流,青山不倒。孔子说的“知不可而为之”是告诉世人做事时不问可不可能,但问应不应该,人要有一点锲而不舍的追求精神,许多事情都是经过艰苦努力和奋斗而得来的,送上一首天王的<兰亭序-周杰伦>。

小作一首《盼君行》希望可以激励大家,勇敢迈出学习第一步。

吾辈中人,皆碌碌于案牍,屋价溢高,年俸不过寸厕金,物价横飞,顿饭邀客褡裢浅,昼兴夜寐求不得,职责非卷不可为。世人皆叹天大寒,众生苦解待来年,年复一年又何如?愿君醒寤,当以高技博厚薪,远卷近舒,人穷则思变,志穷则思远,反躬自省,以小错不改受大忌,俯首垂叹,非吾辈之志也,从善如流,宜哉!君之志向上天厅,躬身笃行始作难,盼君乘风行万里,披荆斩棘过千山。

1. 从“/”开始

Linux系统中一切都是文件,都是从“根”目录(/)开始的,Linux系统中的文件和目录名称是严格区分大小写,Linux系统中的文件存储结构如下:

image

Linux系统中,最常见的目录以及所对应的存放内容如表:

Linux系统中常见目录名称及相应内容

目录名称应放置文件的内容
/boot开机所需文件—内核、开机菜单以及所需配置文件等
/dev以文件形式存放任何设备与接口
/etc配置文件
/home用户主目录
/bin存放单用户模式下还可以操作的命令
/lib开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数
/sbin开机过程中需要的命令
/media用于挂载设备文件的目录
/opt放置第三方的软件
/root系统管理员的家目录
/srv一些网络服务的数据文件目录
/tmp任何人均可使用的“共享”临时目录
/proc虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local用户自行安装的软件
/usr/sbinLinux系统开机时不会使用到的软件/命令/脚本
/usr/share帮助与说明文件,也可放置共享文件
/var主要存放经常变化的文件,如日志
/lost+found当文件系统发生错误时,将一些丢失的文件片段存放在这里

路径指的是如何定位到某个文件,分为绝对路径与相对路径。绝对路径指的是从根目录(/)开始写起的文件或目录名称,而相对路径则指的是相对于当前路径的写法。

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表示这个设备是一个逻辑分区。

image

硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表占用64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。第一个扇区中的数据信息

image

可以将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针—一个指向另外一个分区的指针。

扩展分区,严格地讲它不是一个实际意义的分区,而仅仅是一个指向其他分区的指针,这种指针结构将形成一个单向链表。因此扩展分区自身不能存储数据,用户需要在其指向的对应分区(称之为逻辑分区)上进行操作。

image

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块的内容串到一起,就能够让用户读到完整的文件内容了。

image

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 /

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. 添加交换分区

交换(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

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

8. VDO虚拟数据优化

VDO(Virtual Data Optimize,虚拟数据优化)是一种通过压缩或删除存储设备上的数据来优化存储空间的技术,VDO针对各种类型文件的压缩效果

对各种类型文件压缩效果汇总表

文件名描述类型原始大小(KB)实际占用空间(KB)
dickens狄更斯文集英文原文99539948
mozillaMozilla的1.0可执行文件执行程序5002033228
mr医用resonanse图像图片97369272
nci结构化的化学数据库数据库3276710168
oofficeOpen Office.org 1.01 DLL可执行程序60085640
osdb基准测试用的MySQL格式示例数据库数据库98499824
reymont瓦迪斯瓦夫·雷蒙特的书PDF64716312
sambasamba源代码src源码2110011768
sao星空数据天文格式的bin文件70817036
webster辞海HTML4048740144
xmlXML文件HTML52202180
x-ray透视医学图片医院数据82758260

VDO技术支持本地存储和远程存储,可以作为本地文件系统、iSCSI或Ceph存储下的附加存储层使用。

司服务器上已有的dm-crypt之类的技术是可以与VDO技术兼容的,但记得要先对卷进行加密再使用VDO。因为加密会使重复的数据变得有所不同,因此删重操作无法实现。

image

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 

9. 软硬方式链接

Linux系统中存在软链接和硬链接两种不同的类型。

软链接(soft link):也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路径,很像一个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问。可以针对文件、目录设置软链接,跨文件系统进行链接也不是问题。

硬链接(hard link):可以将它理解为一个“指向原始文件block的指针”,系统会创建出一个与原来一模一样的inode信息块。所以,硬链接文件与原始文件其实是一模一样的,只是名字不同。每添加一个硬链接,该文件的inode个数就会增加1;而且只有当该文件的inode个数为0时,才算彻底将它删除。

image

image

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1253170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF绘图技术介绍

作者&#xff1a;令狐掌门 技术交流QQ群&#xff1a;675120140 csdn博客&#xff1a;https://mingshiqiang.blog.csdn.net/ 文章目录 WPF绘图基本用法绘制直线在XAML中绘制直线在C#代码中绘制直线使用Path绘制直线注意 矩形绘制在XAML中绘制矩形在C#代码中绘制矩形设置矩形的位…

2.1 总线问题

同一时间只能有一个去控制总线,因此需要一个输出开关去确保总线不出错 一旦同时开启输出开关,下面的锁存器还会被上面的数据修改如果上下同时开启可写,且同时开启可输出, 则短路

前端vue3——html2canvas给网站截图生成宣传海报

文章目录 ⭐前言⭐选择html2canvas实现网页截图&#x1f496; 截图 ⭐图片url截图显示不出来问题&#x1f496; 解决 ⭐最终效果&#x1f496; 定义海报 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端vue3——html2canvas给网站截图生成宣传…

什么是无监督学习

1 概况 1.1 定义 无监督学习&#xff08;Unsupervised Learning&#xff09;是机器学习的一种类型&#xff0c;它涉及从未标记的数据中发现隐藏的模式。与监督学习不同&#xff0c;无监督学习的数据没有显式的标签或已知的结果变量。其核心目的是探索数据的内在结构和关系。无…

OSG粒子系统与阴影-自定义粒子系统示例<2>(5)

自定义粒子系统示例(二) 目前自定义粒子的方法有很多&#xff0c;在OSG 中使用的是 Billboard 技术与色彩融合技术。色彩融合是一种高级的渲染技术&#xff0c;如果读者有兴趣&#xff0c;可参看 OSG 粒子系统实现的源代码。这里采用简单的布告牌技术(osg::Billboard)与动画来实…

在 STM32 上实现温度补偿和校正

本文介绍了如何在 STM32 微控制器上实现温度补偿和校正&#xff0c;以提高温度传感器的测量精度。首先&#xff0c;我们将简要介绍温度补偿和校正的原理和目的。然后&#xff0c;我们将详细讨论在 STM32 上实现温度补偿和校正的步骤和方法。同时&#xff0c;提供了一个简单的示…

K8s 中 Pod OOMKilled 原因

目录 Exit Code 137 解决方案 JVM 感知 cgroup 限制 使用 JDK9 的容器感知机制尝试 问题分析 容器内部感知 CGroup 资源限制 在 Java10 中&#xff0c;改进了容器集成 JVM 参数 MaxDirectMemorySize -XX:MaxDirectMemorySize 的默认值是什么&#xff1f; 其他获取 ma…

AI先行者第四辑:AI落地铁路的快与慢

人工智能的模型不能解决所有的问题&#xff0c;它可能只能做到80%&#xff0c;剩下10%、20%都是靠你对项目的理解&#xff0c;一点点做针对性的优化。 本篇作者顾子晨&#xff0c;中国铁道科学研究院集团有限公司基础设施检测 研究所 高级工程师&#xff5c;AICA首席AI架构师培…

[蓝桥杯训练]———高精度乘法、除法

高精度乘法、除法 一、高精度乘法⭐1.1 初步理解1.1.1 高精度的定义1.1.2 为什么会有高精度1.1.3 高精度乘法的复杂度 1.2 思想讲解1.3 代码实现1.3.1 声明1.3.2 实现高精度乘法1.3.3 整体实现1.3.4 代码测试 二、高精度除法⭐2.1 初步理解2.2 思想讲解2.3 代码实现2.3.1 声明2…

ubuntu20.04配置OpenCV的C++环境

ubuntu20.04配置OpenCV的C环境 这里以opencv-3.4.16为例 复现https://github.com/raulmur/ORB_SLAM2此项目&#xff0c;需安装opencv及其他依赖&#xff0c;可见README.md详情 1.下载opencv源代码 https://opencv.org/releases/ 2.下载OpenCV的扩展包opencv_contrib&#x…

免杀原理(php)

免杀原理 0x01 前言 何为免杀&#xff0c;免杀就是一种逃脱杀毒软件查杀的方法&#xff0c;免杀的目的就是绕过“墙”&#xff0c;去执行危险的操作。那么如何绕过这堵“墙”&#xff0c;就是免杀的本质。有句俗话说得好“知己知彼&#xff0c;百战不殆”&#xff0c;想要用好…

【Vulnhub靶机】Jarbas--Jenkins

文章目录 信息收集主机发现端口扫描目录爆破 漏洞探测whatwebhash-identifierwhatweb 文档说明&#xff1a;https://www.vulnhub.com/entry/jarbas-1,232/ 靶机下载&#xff1a;Download (Mirror): 信息收集 主机发现 扫描C段 sudo nmap -sn 10.9.75.0/24端口扫描 sudo nma…

通过视频文件地址截取图像生成图片保存为封面图

安装 RPM Fusion 软件库 FFmpeg并不包含在 CentOS 官方软件库中&#xff0c;需要使用第三方软件库安装。可以使用 RPM Fusion 软件库来获取 FFmpeg。 首先&#xff0c;使用以下命令安装 RPM Fusion 软件库&#xff1a; sudo yum install epel-release -y sudo rpm -Uvh https…

BTC 复兴:Ordinals 带来创新活力,BitVM 与 BitStream 相继问世

除了备受瞩目的 ETF&#xff0c;今年 Bitcoin 生态迎来全新的发展活力和机遇。Ordinals 协议的横空出世&#xff0c;以此为基础诞生的 BRC20 协议给整个比特币生态带去了一波新的能量&#xff0c;迎来铭文热度高涨。而诸如 BitVM、BitStream 等新技术甫一问世&#xff0c;便引发…

vulnhub6

靶机地址&#xff1a;https://download.vulnhub.com/evilbox/EvilBox---One.ova 准备工作 可以先安装 kali 的字典: sudo apt install seclists ​ 或者直接输入 seclists​&#xff0c;系统会问你是否安装&#xff0c;输入 y 即可自动安装 733 x 3751414 x 723 ​ 默认路…

引用、动态内存分配、函数、结构体

引用 定义和初始化 **数据类型 &引用名 目标名;**引用和目标共用同一片空间&#xff08;相当于对一片空间取别名&#xff09;。 引用的底层实现&#xff1a;数据类型 * const p&#xff1b; ------> 常指针 int const *p; -----> 修饰 *p const int *p; ----->…

解决github无法访问的办法

方法/步骤 1.问题描述&#xff1a;能联网但不能访问github.com 2.找到hosts文件。地址&#xff1a;C:\Windows\System32\drivers\etc &#xff08;一般是在这的&#xff09; 3.不要直接在这修改hosts文件&#xff0c;需要将hosts文件复制粘贴到桌面&#xff08;或其它地方自…

Oracle 中的操作符

1.union:对两个结果集进行并集操作&#xff0c;不包括重复行&#xff0c;同时进行默认规则的排序&#xff1b; SELECT * FROM emp WHERE sal < 1500 UNION SELECT * FROM emp WHERE sal BETWEEN 1000 AND 2000 order by 1 2.union All&#xff1a;对两个结果集进行并集操…

Innux(特殊位与权限)

特殊位与权限 目录&#xff1a; 1. SUID 2. SGID 3. SBIT 4. 文件系统属性chattr权限 5. 管理员权限sudo 1. SUID 1.1 什么是SUID SUID只对二进制可执行文件才有效&#xff08;文件必须具备x权限&#xff09; 执行者对该程序有 x 权限 当前程序拥有SUID时&#xff0…

nova组件简介

目录 组件关系图 controller节点 openstack-nova-api.service: openstack-nova-conductor.service: openstack-nova-consoleauth.service: openstack-nova-novncproxy.service: openstack-nova-scheduler.service: openstack-nova-conductor.service详解 作用和功能&…