06 存储结构与管理硬盘
- 从 Linux 系统中的文件存储结构开始,讲述文件系统层次标准(Filesystem Hierarchy Standard,FHS)、udev 硬件命名规则以及硬盘设备的原理。
- 详细分析 Linux 系统中最常见的 Ext3、Ext4 与 XFS 文件系统的不同之处,着重练习硬盘设备分区、格式化以及挂载等常用的硬盘管理操作,以便熟练掌握文件系统的使用方法。
- 在打下坚实的理论基础并完成一些相关的实践练习后,我们将进一步完整地部署交换(SWAP)分区、配置 quota 磁盘配额服务、使用 VDO(虚拟数据优化)技术,以及掌握 ln 命令带来的软硬链接。
一切从 "/" 开始
- 在 Windows 操作系统中,想要找到一个文件,要依次进入该文件所在的磁盘分区(也叫盘符),然后再进入该分区下的具体目录,最终找到这个文件。
- 但是在 Linux 系统中并不存在
C、D、E、F等盘符,Linux 系统中的一切文件都是从 "根" 目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途。 - 另外,Linux 系统中的文件和目录名称是严格区分大小写的。例如,
root、rOOt、Root、rooT均代表不同的目录,并且文件名称中不得包含斜杠(/)。
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 |
当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
路径
路径:如何定位到某个文件,分为绝对路径与相对路径。
- 绝对路径(absolute path):从根目录(
/)开始写起的文件或目录名称。- 例如:首先坐飞机来到中国,到了北京后出首都机场,坐机场快轨到三元桥,然后换乘 10 号线到潘家园站,出站后坐 34 路公交车到农光里,下车后路口左转。
- 相对路径(relative path):相对于当前路径的写法。
- 例如:前面路口左转。
物理设备的命名规则
磁盘设备
应包括磁盘驱动器、适配器及盘片,它们既可以作为输入设备,也可作为输出设备或称载体。控制软盘读和写,即输入或输出是由磁盘驱动器及其适配器来完成的,从功能上来说,一台磁盘设备与一台录放机的作用是相同的,一盘录音带可反复地录音,那么软盘片或硬盘片,或称信息载体,也可以反复地被改写。
常见的硬件设备
- IDE (Integrated Drive Electronics) 是一种迄今为止在计算机系统中用得最广泛的硬盘接口类型之一。IDE 物理接口有 40 根线,支持两个 IDE 硬盘,它的传输速率为 33MB/s。对于 Linux 系统来说,IDE 设备是指使用 IDE 接口连接的硬盘,包括 ATA 和 ATAPI 设备。在 Linux 中,IDE 设备的命名规则是
/dev/hdX,其中 X 代表硬盘的小写字母标识符,例如/dev/hda表示系统上的第一个 IDE 设备,/dev/hdb表示第二个 IDE 设备,以此类推。每个 IDE 设备的编号显示在启动 BIOS 信息中,因此你可以在系统启动时查看。如果系统上只有一块 IDE 硬盘,则其设备名称应该是/dev/hda。 - SCSI(Small Computer System Interface)是一种通用的接口标准,可以用于连接多种设备,包括硬盘、CD-ROM、磁带机、扫描仪等等。在 Linux 中,SCSI 设备的命名规则是
/dev/sdX,其中X代表 SCSI 设备的字母标识符,例如/dev/sda表示系统上的第一个 SCSI 设备,/dev/sdb表示第二个 SCSI 设备,以此类推。SCSI 设备通常具有多个分区,这些分区可以使用类似/dev/sda1这样的命名方案来命名。 - SATA(Serial Advanced Technology Attachment)主要用于连接硬盘、光驱等存储设备,它提供了更高速的数据传输速率。在 Linux 中,SATA 设备的命名规则和 SCSI 设备类似,设备文件通常为
/dev/sdX,其中X是字母a、b、c等表示不同的硬盘。 - USB(Universal Serial Bus)是一种小型便携式存储设备,可以通过 USB 接口连接到计算机上。在 Linux 中,U 盘默认会被自动挂载到
/media目录下,并分配名称为/media/username/usbname的挂载点。然后可以使用命令mount或umount挂载或卸载 U 盘。 - virtio 虚拟化设备是一种高效的虚拟设备类型,常用于 KVM、Xen 这种虚拟机监控器(Hypervisor)中。virtio 设备通过将通用设备 I/O 操作转换为底层设备的 I/O 操作来提高虚拟机的性能,并支持直接内存访问(DMA)和虚拟化 I/O 标志,以实现更好的数据传输效率。
- 软驱(Floppy Disk Drive)是一种古老的存储设备,其存储介质是软盘,使用磁性材料记录数据。在 Linux 系统中,软驱设备通常是通过连接到系统的软驱控制器(Floppy Disk Controller)来操作软盘。但是,随着硬件技术的发展,这种存储设备已经被淘汰,现在已经很少使用。在 Linux 中,软驱设备通常被命名为
/dev/fd0或/dev/fd1,分别代表第一块和第二块软盘设备。
| 硬件设备 | 文件名称 |
|---|---|
| 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 开始,到 4 结束;
- 逻辑分区从编号 5 开始。
/dev目录中sda设备之所以是a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的,而恰巧很多主板的插槽顺序就是系统内核的识别顺序,因此才会被命名为/dev/sda。大家以后在使用 iSCSI 网络存储设备时就会发现,明明主板上第二个插槽是空着的,但系统却能识别到/dev/sdb这个设备—就是这个道理。- 分区的数字编码不一定是强制顺延下来的,也有可能是手工指定的。例如,
sda3只能表示是编号为 3 的分区,而不能判断sda设备上已经存在了 3 个分区。
设备文件名称

/dev/sda5表示的就是这是系统中第一块被识别到的硬件设备中分区编号为 5 的逻辑分区的设备文件- /dev/目录: 保存的应当是硬件设备文件
- sd: 存储设备
- a: 系统中同类接口中第一个被识别到的设备
- 5: 这个设备是一个逻辑分区
扇区
- 硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。
- 就第一个扇区来讲,主引导记录需要占用 446 字节,分区表占用 64 字节,结束符占用 2 字节
- 其中分区表中每记录一个分区信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,这 4 个分区就是 4 个主分区。

硬盘分区的规划
- 问题来了—每块硬盘最多只能创建出 4 个分区?于是为了解决分区个数不够的问题,可以将第一个扇区的分区表中 16 字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。
- 也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用 16 字节分区表空间的指针—一个指向另外一个分区的指针。
- 这样一来,用户一般会选择使用 3 个主分区加 1 个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于 4 个)的需求。
/dev/hdc8:这是第 3 块 IDE 设备(现在比较少见)中编号为 8 的逻辑分区。- IDE 接口上可以连接多个硬盘,每个硬盘都有一个编号,例如
hda、hdb、hdc等,其中从hda开始递增编号。因此,/dev/hdc表示的就是 IDE 接口上的第 3 个硬盘。 - 对于每个硬盘,我们可以将其划分为多个分区,以更好地管理数据。每个分区都有一个编号,从 1 开始递增。因此,
/dev/hdc8表示 IDE 接口的第 3 个硬盘(hdc)的第 8 个分区。
- IDE 接口上可以连接多个硬盘,每个硬盘都有一个编号,例如

所谓扩展分区,严格地讲它不是一个实际意义的分区,而仅仅是一个指向其他分区的指针,这种指针结构将形成一个单向链表。因此扩展分区自身不能存储数据,用户需要在其指向的对应分区(称之为逻辑分区)上进行操作。
文件系统与数据资料
文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。
常见的文件系统
- Ext2:最早可追溯到 1993 年,是 Linux 系统的第一个商业级文件系统,它基本沿袭了 UNIX 文件系统的设计标准。但由于不包含日志读写功能,数据丢失的可能性很大,因此能不用就不用,或者顶多建议用于 SD 存储卡或 U 盘。
- Ext3:Ext3 能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能 100% 地保证资料不会丢失。
- Ext4:Ext3 的改进版本,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。Ext4 文件系统能够批量分配 block(块),从而极大地提高了读写效率。
- XFS:高性能的日志文件系统,可以快速地恢复可能被破坏的文件,而且强大的日志功能只需花费极低的计算和存储性能。它支持的最大存储容量为 18EB,这几乎满足了所有需求。
- RHEL 7/8 系统中一个比较大的变化就是使用了 XFS 作为文件系统,这不同于 RHEL 6 使用的 Ext4。
- XFS 虽然在性能方面比 Ext4 有所提升,但绝不是压倒性的,因此 XFS 文件系统最卓越的亮点应该当属可支持高达 18EB 的存储容量。
- 在拿到一块新的硬盘存储设备后,先需要分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;也可以选择不进行分区,但是必须对硬盘进行格式化处理。
- 就像拿到了一张未裁切的完整纸张那样,首先要进行裁切以方便使用(分区),接下来在裁切后的纸张上画格以便能书写工整(格式化),最后是正式的使用(挂载)。
数据资料
- Linux 只是把每个文件的权限与属性记录在 inode 中,而且每个文件占用一个独立的 inode 表格,该表格的大小默认为 128 字节,其中包含了以下信息:
- 该文件的访问权限(read、write、execute);
- 该文件的所有者与所属组(owner、group);
- 该文件的大小(size);
- 该文件的创建或内容修改时间(Ctime);
- 该文件的最后一次访问时间(Atime);
- 该文件的修改时间(Mtime);
- 文件的特殊权限(SUID、SGID、SBIT);
- 该文件的真实数据地址(point)。
存储文件内容的 block 块
-
文件的实际内容则保存在 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 File System,VFS)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
- 实际文件系统在 VFS 下隐藏了自己的特性和细节,这样用户在日常使用时会觉得 "文件系统都是一样的",也就可以随意使用各种命令在任何文件系统中进行各种操作了(比如使用
cp命令来复制文件)。
- 实际文件系统在 VFS 下隐藏了自己的特性和细节,这样用户在日常使用时会觉得 "文件系统都是一样的",也就可以随意使用各种命令在任何文件系统中进行各种操作了(比如使用

挂载硬件设备
mount
-
mount命令用于挂载文件系统,格式为mount 文件系统 挂载目录。挂载是在使用硬件设备前所执行的最后一步操作。 -
mount命令中的参数以及作用:参数 作用 -a挂载所有在 /etc/fstab中定义的文件系统-t指定文件系统的类型
[root@linuxprobe ~]# mount /dev/sdb2 /backup # 把设备 /dev/sdb2 挂载到 /backup 目录
blkid
blkid命令用于显示设备的属性信息,英文全称为block id,语法格式为blkid [设备名]。- 如果在工作中要挂载一块网络存储设备,该设备的名字可能会变来变去,这样再写为
sdb就不太合适了。这时推荐用 UUID(Universally Unique Identifier,通用唯一识别码)进行挂载操作。- UUID 是一串用于标识每块独立硬盘的字符串,具有唯一性及稳定性,特别适合用来挂载网络设备。
[root@linuxprobe ~]# blkid
/dev/sda1: UUID="73159c7d-b179-4ef9-a83f-3f6f6ce390ed" TYPE="xfs" PARTUUID="5fef684b-01"
/dev/sda2: UUID="oBY3nX-axGY-bavU-eCJf-1l8K-dpPW-Lgfm2K" TYPE="LVM2_member" PARTUUID="5fef684b-02"
/dev/sr0: UUID="2022-06-29-06-15-46-00" LABEL="RHEL-8-2-0-BaseOS-x86_64" TYPE="iso9660" PTUUID="72cfe76b" PTTYPE="dos"
/dev/mapper/rhel-root: UUID="34630964-7974-4d0a-a1cb-9686da83698c" TYPE="xfs"
/dev/mapper/rhel-swap: UUID="77b404e5-2bbb-45d4-8885-60a4d9318b17" TYPE="swap"
[root@linuxprobe ~]#
[root@linuxprobe ~]# mount UUID=oBY3nX-axGY-bavU-eCJf-1l8K-dpPW-Lgfm2K /backup # 有了设备的 UUID 值之后,就可以用它挂载网络设备
开机自动挂载
-
执行
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 则不自检 -
写入到
/etc/fstab文件中的设备信息并不会立即生效,需要使用mount -a参数进行自动挂载。 -
对于网络存储设备,建议您在 fstab 文件挂载信息中加上
_netdev参数。加上后系统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况。
[root@linuxprobe ~]# vim /etc/fstab
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun 4 03:05:37 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults 0 0
[root@linuxprobe ~]#
[root@linuxprobe ~]# vim /etc/fstab # 把光盘设备挂载到 /media/cdrom 目录中
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun 4 03:05:37 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
[root@linuxprobe ~]# mount -a # 写入到 /etc/fstab 文件中的设备信息并不会立即生效,需要使用 mount -a 参数进行自动挂载
[root@linuxprobe ~]#
[root@linuxprobe ~]# vim /etc/fstab # 对于网络存储设备,在 fstab 文件挂载信息中加上 `_netdev` 参数。加上后系统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun 4 03:05:37 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults,_netdev 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
[root@linuxprobe ~]#
df
df命令用于查看已挂载的磁盘空间使用情况,英文全称为disk free,语法格式为df -h。-h参数便捷地对存储容量进行 "进位" 操作。例如,在遇到 10240K 的时候会自动进位写成 10M,非常方便我们的阅读。
[linuxprobe@linuxprobe ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 952M 0 952M 0% /dev
tmpfs 981M 0 981M 0% /dev/shm
tmpfs 981M 19M 962M 2% /run
tmpfs 981M 0 981M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 4.3G 13G 26% /
/dev/sda1 1014M 211M 804M 21% /boot
tmpfs 196M 1.2M 195M 1% /run/user/42
tmpfs 196M 4.6M 192M 3% /run/user/1000
/dev/sr0 7.9G 7.9G 0 100% /media/cdrom
tmpfs 196M 4.6M 192M 3% /run/user/0
[linuxprobe@linuxprobe ~]$
umount
umount命令用于卸载设备或文件系统,英文全称为un mount,语法格式为umount [设备文件/挂载目录]。- 挂载文件系统的目的是为了使用硬件资源,而卸载文件系统则意味不再使用硬件的设备资源。既然挂载操作就是把硬件设备与目录两者进行关联的动作,那么卸载操作只需要说明想要取消关联的设备文件或挂载目录的其中一项即可,一般不需要加其他额外的参数。
- 如果我们当前就处于设备所挂载的目录,系统会提示该设备繁忙,此时只需要退出到其他目录后再尝试一次就行了。
[root@linuxprobe ~]# cd /media/cdrom/
[root@linuxprobe cdrom]# umount /dev/cdrom # 当前就处于设备所挂载的目录,系统会提示该设备繁忙
umount: /media/cdrom: target is busy.
[root@linuxprobe cdrom]# cd ~
[root@linuxprobe ~]# umount /dev/cdrom # 退出到其他目录后再尝试一次就行了
[root@linuxprobe ~]#
lsblk
-
lsblk命令用于查看系统的磁盘使用情况,英文全称为list block devices的缩写,语法格式:lsblk [参数]。 -
lsblk命令中的参数以及作用:参数 作用 -a,--all显示所有设备。 -b,--bytes以 bytes 方式显示设备大小。 -d,--nodeps不显示 slaves 或 holders。 -D,--discardprint discard capabilities。 -e,--exclude <list>排除设备 (default: RAM disks)。 -f,--fs显示文件系统信息。 -h,--help显示帮助信息。 -i,--asciiuse ascii characters only。 -m,--perms显示权限信息。 -l,--list使用列表格式显示。 -n,--noheadings不显示标题。 -o,--output <list>输出列。 -P,--pairs使用 key="value"格式显示。-r,--raw使用原始格式显示。 -t,--topology显示拓扑结构信息。 -
7 个栏目名称如下:
NAME:这是块设备名。MAJ:MIN:本栏显示主要和次要设备号。RM:本栏显示设备是否可移动设备。注意,在本例中设备 sdb 和 sr0 的 RM 值等于 1,这说明他们是可移动设备。SIZE:本栏列出设备的容量大小信息。例如 298.1G 表明该设备大小为 298.1GB,而 1K 表明该设备大小为 1KB。RO:该项表明设备是否为只读。在本案例中,所有设备的 RO 值为 0,表明他们不是只读的。TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda 和 sdb 是磁盘,而 sr0 是只读存储(rom)。MOUNTPOINT:本栏指出设备挂载的挂载点。
[linuxprobe@linuxprobe ~]$ lsblk -a
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 7.9G 0 rom /media/cdrom
[linuxprobe@linuxprobe ~]$
添加硬盘设备
虚拟机中添加硬盘设备
- 首先把虚拟机系统关机,稍等几分钟会自动返回到虚拟机管理主界面,然后单击 "编辑虚拟机设置" 选项,在弹出的界面中单击 "添加" 按钮,新增一块硬件设备,
- 在虚拟机中模拟添加入一块新的硬盘存储设备,再进行分区、格式化、挂载等操作,最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。
- 选择虚拟硬盘的类型为
SATA,并单击 "下一步" 按钮,如图 3 所示。这样虚拟机中的设备名称过一会儿后应该为/dev/sdb。

- 将 "最大磁盘大小" 设置为默认的 20GB。这个数值是限制这台虚拟机所使用的最大硬盘空间,而不是立即将其填满,因此默认 20GB 就很合适了。


- 在虚拟机中模拟添加了硬盘设备后就应该能看到抽象后的硬盘设备文件了。
- 按照前文讲解的
udev服务命名规则,第二个被识别的 SATA 设备应该会被保存为/dev/sdb,这个就是硬盘设备文件了。
[linuxprobe@linuxprobe ~]$ lsblk -a # 新添加的硬盘为 sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sr0 11:0 1 7.9G 0 rom /media/cdrom
[linuxprobe@linuxprobe ~]$
fdisk
-
fdisk命令用于新建、修改及删除磁盘的分区表信息,英文全称为format disk,语法格式为fdisk 磁盘名称。 -
在 Linux 系统中,管理硬盘设备最常用的方法就当属
fdisk命令了。它提供了集添加、删除、转换分区等功能于一身的 "一站式分区服务" 。 -
fdisk命令中的参数以及作用:参数 作用 m查看全部可用的参数 n添加新的分区 d删除某个分区信息 l列出所有可用的分区类型 t改变某个分区的类型 p查看分区表信息 w保存并退出 q不保存直接退出
[linuxprobe@linuxprobe ~]$ su - root
Password:
[root@linuxprobe ~]# fdisk /dev/sdb # 使用 fdisk 命令来尝试管理 /dev/sdb 硬盘设备
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 0x67e306b2.
Command (m for help): m # 输入参数 m 查看全部可用的参数
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
Command (m for help): p # 输入参数 p 来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息
Disk /dev/sdb: 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: 0x67e306b2
Command (m for help): n # 输入参数 n 尝试添加新的分区
Partition type
p primary (0 primary, 0 extended, 4 free) # 输入参数 p 来创建主分区
e extended (container for logical partitions) # 输入参数 e 来创建扩展分区
Select (default p): p
Partition number (1-4, default 1): 1 # 输入主分区的编号,主分区的编号范围是 1~4,因此这里输入默认的 1 就可以了
First sector (2048-41943039, default 2048): # 定义起始的扇区位置,这不需要改动,敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +2G # 定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入 +2G 即可创建出一个容量为 2GB 的硬盘分区。
Created a new partition 1 of type 'Linux' and of size 2 GiB.
Command (m for help): p # 输入参数 p 来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息
Disk /dev/sdb: 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: 0x67e306b2
Device Boot Start End Sectors Size Id Type
/dev/sdb1 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.
[root@linuxprobe ~]# fdisk /dev/sdb
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 # 使用 l 参数查看一下磁盘编码都有哪些 (82 Linux swap)
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-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto
1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
[root@linuxprobe ~]#
[root@linuxprobe ~]# lsblk -a # Linux 系统会自动把这个硬盘主分区抽象成 /dev/sdb1 设备文件
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part
sr0 11:0 1 7.9G 0 rom /media/cdrom
partprobe
-
partprobe命令用于在不重启的情况下重读分区表。当出现删除文件后,出现仍然占用空间,可以partprobe在不重启的情况下重读分区。 -
partprobe英文全称为partition probe,语法格式为partprobe [参数] [设备名]。 -
partprobe命令功能是用于重读分区表信息。将磁盘分区表变化信息通知给系统内核,请求操作系统重新加载分区表,有时当我们创建或删除分区设备后,系统并不会立即生效,这时就需要使用partprobe命令在不重启的情况下重新读取分区表信息,使得新设备信息被同步。 -
partprobe命令中的参数以及作用:参数 作用 -d不更新内核 -h显示帮助信息 -l显示分区信息 -s显示摘要和分区信息 -t设置分区类型 -v显示版本信息
- 有些时候系统并没有自动把分区信息同步给 Linux 内核,而且这种情况似乎还比较常见(但不能算作严重的 bug)。
- 可以输入 partprobe 命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。
- 如果使用这个命令都无法解决问题,那么就重启计算机吧,这个 "杀手锏" 百试百灵,一定会有用的。
[root@linuxprobe ~]# file /dev/sdb1 # 使用 file 命令查看该文件的属性
/dev/sdb1: cannot open `/dev/sdb1' (No such file or directory)
[root@linuxprobe ~]# partprobe
[root@linuxprobe ~]# partprobe
[root@linuxprobe ~]# file /dev/sdb1
/dev/sdb1: block special (8/17)
[root@linuxprobe ~]#
mkfs
对存储设备进行分区后还需要进行格式化操作。
mkfs命令英文全称为make file system,其功能是用于对设备进行格式化文件系统操作,语法格式为mkfs [参数] 设备名。- 在挂载使用硬盘空间前的最后一步,运维人员需要对整块硬盘或指定分区进行格式化文件系统操作,Linux 系统支持的文件系统包含 ext2、ext3、ext4、xfs、fat、msdos、vfat、minix 等多种格式。
- 在 Shell 终端中输入
mkfs名后再敲击两下用于补齐命令的Tab键,mkfs命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单 —mkfs.文件类型名称。- 例如要将分区为 XFS 的文件系统进行格式化,则命令应为
mkfs.xfs /dev/sdb1。
- 例如要将分区为 XFS 的文件系统进行格式化,则命令应为
[root@linuxprobe ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 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@linuxprobe ~]#
挂载并使用存储设备
完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。
- 首先是创建一个用于挂载设备的挂载点目录;
- 然后使用
mount命令将存储设备与挂载点进行关联; - 最后使用
df -h命令来查看挂载状态和硬盘使用量信息。
[root@linuxprobe ~]# mkdir /newFS # 创建挂载点目录
[root@linuxprobe ~]# mount /dev/sdb1 /newFS # 将存储设备与挂载点进行关联
[root@linuxprobe ~]# df -h # 查看挂载状态和硬盘使用量信息
Filesystem Size Used Avail Use% Mounted on
devtmpfs 952M 0 952M 0% /dev
tmpfs 981M 0 981M 0% /dev/shm
tmpfs 981M 9.5M 971M 1% /run
tmpfs 981M 0 981M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 4.3G 13G 25% /
/dev/sr0 7.9G 7.9G 0 100% /media/cdrom
/dev/sda1 1014M 211M 804M 21% /boot
tmpfs 196M 3.4M 193M 2% /run/user/1000
/dev/sdb1 2.0G 47M 2.0G 3% /newFS
[root@linuxprobe ~]#
du
du命令用查看分区或目录所占用的磁盘容量大小,英文全称为disk usage,语法格式为du -sh 目录名称。- 简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。
- 在 Linux 系统中可以使用
du -sh /*命令来查看在 Linux 系统根目录下所有一级目录分别占用的空间大小,在 1s 之内就能找到哪个目录占用的空间最多。
[root@linuxprobe ~]# du -sh /*
20K /backup.acl
0 /bin
171M /boot
0 /dev
30M /etc
9.3M /home
0 /lib
0 /lib64
8.0G /media
0 /mnt
0 /newFS
0 /opt
0 /proc
8.4M /root
9.5M /run
0 /sbin
0 /srv
0 /sys
52K /tmp
3.8G /usr
191M /var
[root@linuxprobe ~]# cp -rf /etc/* /newFS
[root@linuxprobe ~]# du -sh /newFS/
30M /newFS/
[root@linuxprobe ~]#
[root@linuxprobe ~]# vim /etc/fstab # 想让这个设备文件的挂载永久有效,则需要把挂载的信息写入 fstab 配置文件中
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun 4 03:05:37 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults,_netdev 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
[root@linuxprobe ~]#
添加交换分区
交换 SWAP 分区
- 通过在硬盘中预先划分一定的空间,然后把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。
- 通俗来讲就是让硬盘帮内存分担压力。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。
交换分区的创建过程
与前文讲到的挂载并使用存储设备的过程非常相似。在对 /dev/sdb 存储设备进行分区操作前,有必要先说一下交换分区的划分建议:在生产环境中,交换分区的大小一般为真实物理内存的 1.5 ~ 2 倍。
[root@linuxprobe ~]# fdisk /dev/sdb # 使用 fdisk 命令来尝试管理 /dev/sdb 硬盘设备
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 # 容量为 5GB
Created a new partition 2 of type 'Linux' and of size 5 GiB.
Command (m for help): l # 查看磁盘编码 (82 Linux swap)
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-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto
1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT
Command (m for help): t # 改变分区类型
Partition number (1,2, default 2): 2 # 选择刚才创建的分区
Hex code (type L to list all codes): 82 # 设置为 swap 分区
Changed type of partition 'Linux' to 'Linux swap / Solaris'.
Command (m for help): p # 查看已有分区信息
Disk /dev/sdb: 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: 0x67e306b2
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4196351 4194304 2G 83 Linux
/dev/sdb2 4196352 14682111 10485760 5G 82 Linux swap / Solaris
Command (m for help): w # 保存分区信息并退出
The partition table has been altered.
Syncing disks.
[root@linuxprobe ~]#
mkswap
mkswap命令用于对新设备进行交换分区格式化,英文全称为make swap,语法格式为mkswap 设备名称。
[root@linuxprobe ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 5 GiB (5368705024 bytes)
no label, UUID=e4fe2da9-c060-495c-a55c-2c4978e8efa0
swapon
swapon命令用于激活新的交换分区设备,英文全称为swap on,语法格式为swapon 设备名称。- 使用
swapon命令把准备好的 SWAP 硬盘设备正式挂载到系统中。可以使用free -m命令查看交换分区的大小变化。 - 经常使用
swapon -s(等价于cat /proc/swaps)查看当前的 swap 空间。
[root@linuxprobe ~]# swapon -s # 查看当前的 swap 空间
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 1292 -2
[root@linuxprobe ~]# free -m # 使用 free -m 命令查看交换分区的大小变化
total used free shared buff/cache available
Mem: 1960 1026 69 12 863 738
Swap: 2047 1 2046
[root@linuxprobe ~]#
[root@linuxprobe ~]# swapon /dev/sdb2 # 使用 swapon 命令把准备好的 swap 硬盘设备正式挂载到系统中
[root@linuxprobe ~]# free -m
total used free shared buff/cache available
Mem: 1960 1030 65 12 864 733
Swap: 7167 1 7166
[root@linuxprobe ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 1292 -2
/dev/sdb2 partition 5242876 0 -3
[root@linuxprobe ~]# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 1292 -2
/dev/sdb2 partition 5242876 0 -3
为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入 fstab 配置文件中。
[root@linuxprobe ~]# vim /etc/fstab
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun 4 03:05:37 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults,_netdev 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0
[root@linuxprobe ~]#
磁盘容量配额
- 硬件资源是固定且有限的,如果某些用户不断地在 Linux 系统上创建文件或者存放电影,硬盘空间总有一天会被占满。
- 针对这种情况,root 管理员就需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。
- 可以使用 quota 技术进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。
- quota 技术还有软限制和硬限制的功能。
- 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
- 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
- RHEL 8 系统中已经安装了 quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对 quota 技术的支持,此时需要手动编辑配置文件并重启一次系统,让系统中的启动目录(
/boot)能够支持 quota 磁盘配额技术。- 早期的 Linux 系统要想让硬盘设备支持 quota 磁盘容量配额服务,使用的是
usrquota参数,而 RHEL 7/8 系统使用的则是uquota参数。
- 早期的 Linux 系统要想让硬盘设备支持 quota 磁盘容量配额服务,使用的是
[root@linuxprobe ~]# vim /etc/fstab
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun 4 03:05:37 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot xfs defaults,uquota 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults,_netdev 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0
[root@linuxprobe ~]#
在重启系统后使用 mount 命令查看,即可发现 /boot 目录已经支持 quota 磁盘配额技术了:
[linuxprobe@linuxprobe ~]$ mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
[linuxprobe@linuxprobe ~]$
xfs_quota
xfs_quota命令用于管理设备的磁盘容量配额,语法格式为xfs_quota [参数] 配额 文件系统。- 这是一个专门针对 XFS 文件系统来管理 quota 磁盘容量配额服务而设计的命令。
-c参数用于以参数的形式设置要执行的命令;-x参数是专家模式,让运维人员能够对 quota 服务进行更多复杂的配置。
xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 jaime' /boot- 设置用户 jaime 对
/boot目录的 quota 磁盘容量配额。 - 硬盘使用量的软限制 bsoft 和硬限制 bhard 分别为 3MB 和 6MB。
- 创建文件数量的软限制 isoft 和硬限制 ihard 分别为 3 个和 6 个。
- 设置用户 jaime 对
- 在 Linux 系统中每个文件都会使用一个独立的 inode 信息块来保存属性信息,一个文件对应一个 inode 信息块,所以 isoft 和 ihard 就是通过限制系统最大使用的 inode 个数来限制了文件数量。
- bsoft 和 bhard 则是代表文件所占用的 block 大小,也就是文件占用的最大容量的总统计。
- soft 是软限制,超过该限制后也只是将操作记录写到日志中,不对用户行为进行限制。
- hard 是硬限制,一旦超过系统就会马上禁止,用户再也不能创建或新占任何的硬盘容量。
[root@linuxprobe ~]# useradd jaime # 创建一个用于检查 quota 磁盘容量配额效果的用户 jaime
[root@linuxprobe ~]# chmod -R o+w /boot # 针对 /boot 目录增加其他人的写权限,保证用户能够正常写入数据
[root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 jaime' /boot # 设置用户 jaime 对 /boot 目录的 quota 磁盘容量配额: 硬盘使用量的软限制和硬限制分别为 3MB 和 6MB;创建文件数量的软限制和硬限制分别为 3 个和 6 个。
[root@linuxprobe ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 174528 0 0 00 [--------]
jaime 0 3072 6144 00 [--------]
[root@linuxprobe ~]#
当配置好上述各种软硬限制后,尝试切换到一个普通用户,然后分别尝试创建一个体积为 5MB 和 8MB 的文件。可以发现,在创建 8MB 的文件时受到了系统限制:
[root@linuxprobe ~]# su - jaime
[jaime@linuxprobe ~]$ cd /boot
[jaime@linuxprobe boot]$ dd if=/dev/zero of=/boot/jaime bs=5M count=1 # 5MB 文件创建成功
1+0 records in
1+0 records out
5242880 bytes (5.2 MB, 5.0 MiB) copied, 0.0324882 s, 161 MB/s
[jaime@linuxprobe boot]$ dd if=/dev/zero of=/boot/jaime bs=8M count=1 # 8MB 文件创建失败
dd: error writing '/boot/jaime': Disk quota exceeded
1+0 records in
0+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.0271308 s, 155 MB/s
edquota
-
edquota命令用于管理系统的磁盘配额,英文全称为edit quota,语法格式为edquota [参数] 用户名。 -
在为用户设置了 quota 磁盘容量配额限制后,可以使用
edquota命令按需修改限额的数值。-u参数表示要针对哪个用户进行设置;-g参数表示要针对哪个用户组进行设置。
-
edquota命令中可用的参数以及作用:参数 作用 -u对某个用户进行设置 -g对某个用户组进行设置 -p复制原有的规则到新的用户/组 -t限制宽限期限
[jaime@linuxprobe boot]$ logout
[root@linuxprobe ~]# edquota -u jaime # 针对 jaime 用户进行设置(硬盘使用量的硬限额从 6MB/6144 提升到 8MB/8192)
Disk quotas for user jaime (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sda1 4096 3072 8192 1 3 6
[root@linuxprobe ~]# su - jaime
[jaime@linuxprobe ~]$ cd /boot/
[jaime@linuxprobe boot]$ dd if=/dev/zero of=/boot/jaime bs=8M count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.055455 s, 151 MB/s
[jaime@linuxprobe boot]$
VDO 虚拟数据优化
- VDO(Virtual Data Optimize,虚拟数据优化)是一种通过压缩或删除存储设备上的数据来优化存储空间的技术。
- VDO 是红帽公司收购了 Permabit 公司后获取的新技术,并与 2019-2020 年前后,多次在 RHEL 7.5/7.6/7.7 上进行测试,最终随 RHEL 8 系统正式公布。
- VDO 技术的关键就是对硬盘内原有的数据进行删重操作,它有点类似于我们平时使用的网盘服务,在第一次正常上传文件时速度特别慢,在第二次上传相同的文件时仅作为一个数据指针,几乎可以达到
秒传的效果,无须再多占用一份空间,也不用再漫长等待。 - 除了删重操作,VDO 技术还可以对日志和数据库进行自动压缩,进一步减少存储浪费的情况。
- 简而言之,VDO 技术能省空间!
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 |
特殊情况
- 公司服务器上已有的 dm-crypt 之类的技术是可以与 VDO 技术兼容的,但记得要先对卷进行加密再使用 VDO。因为加密会使重复的数据变得有所不同,因此删重操作无法实现。要始终记得把加密层放到 VDO 之下。
- VDO 技术不可叠加使用,1TB 的物理存储提升成 10TB 的逻辑存储没问题,但是再用 10TB 翻成 100TB 就不行了。

-
把虚拟机关闭,添加一块容量为 20GB 的新 SATA 硬盘进来。
-
查看系统的磁盘使用情况。
[root@linuxprobe ~]# lsblk -a # 查看系统的磁盘使用情况 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─rhel-root 253:0 0 17G 0 lvm / └─rhel-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk ├─sdb1 8:17 0 2G 0 part └─sdb2 8:18 0 5G 0 part sdc 8:32 0 20G 0 disk sr0 11:0 1 7.9G 0 rom /media/cdrom [root@linuxprobe ~]# ls -l /dev/sdc # 查看新添加的 SATA 硬盘 brw-rw----. 1 root disk 8, 32 Jun 13 08:18 /dev/sdc -
RHEL/CentOS 8 系统中默认已经启用了 VDO 技术。如果系统没有安装 VDO,用
dnf install kmod-kvdo vdo命令安装。[root@linuxprobe ~]# dnf install kmod-kvdo vdo # 安装 VDO Updating Subscription Management repositories. Unable to read consumer identity This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. Last metadata expiration check: 1:48:09 ago on Tue 13 Jun 2023 06:31:19 AM CST. Package kmod-kvdo-6.2.2.117-65.el8.x86_64 is already installed. Package vdo-6.2.2.117-13.el8.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete! -
使用 vdo 命令
vdo create --name=storage --device=/dev/sdc --vdoLogicalSize=200G来管理新添加进来的物理设备。依据红帽公司推荐的原则,20GB 硬盘将翻成 200GB 的逻辑存储。- 其中 name 参数代表新的设备卷的名称;
- device 参数代表由哪块磁盘进行制作;
- vdoLogicalSize 参数代表制作后的设备大小。
[root@linuxprobe ~]# vdo create --name=storage --device=/dev/sdc --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 -
查看新建卷的概述信息。在输出信息中包含了 VDO 卷创建的时间、主机名、版本、是否压缩 Compression 及是否删重 Deduplication 等关键信息。
[root@linuxprobe ~]# vdo status --name=storage VDO status: Date: '2023-06-13 08:19:50+08:00' Node: linuxprobe.com Kernel module: Loaded: true Name: kvdo Version information: kvdo version: 6.2.2.117 Configuration: File: /etc/vdoconf.yml ………………省略部分输出信息……………… write amplification ratio: 0.0 write policy: sync -
格式化新建卷。
[root@linuxprobe ~]# 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 -
挂载前同步分区表,对设备进行一次刷新操作,避免刚才的配置没有生效。
[root@linuxprobe ~]# udevadm settle -
创建挂载点,挂载新建卷。
[root@linuxprobe ~]# mkdir /storage [root@linuxprobe ~]# mount /dev/mapper/storage /storage -
查看设备的实际使用情况。
human-readable参数的作用是将存储容量自动进位,以人们更易读的方式输出- 比如,显示 20G 而不是 20971520K
- 这里显示的 Size 是实际物理存储的空间大小(即 20.0GB 是硬盘的大小),查看逻辑存储空间使用
df -h命令。
[root@linuxprobe ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/storage 20.0G 4.0G 16.0G 20% 99% [root@linuxprobe ~]# df -h # 查看逻辑存储空间 Filesystem Size Used Avail Use% Mounted on devtmpfs 952M 0 952M 0% /dev tmpfs 981M 0 981M 0% /dev/shm tmpfs 981M 9.5M 971M 1% /run tmpfs 981M 0 981M 0% /sys/fs/cgroup /dev/mapper/rhel-root 17G 4.3G 13G 25% / /dev/sr0 7.9G 7.9G 0 100% /media/cdrom /dev/sda1 1014M 219M 796M 22% /boot tmpfs 196M 3.4M 193M 2% /run/user/1000 /dev/mapper/storage 200G 1.5G 199G 1% /storage -
复制文件,查看占用了多少容量,以及空间节省率 Space saving。
[root@linuxprobe ~]# ls -lh /media/cdrom/images/install.img # 查看要复制的文件的信息 -r--r--r--. 1 root root 532M Jun 29 2022 /media/cdrom/images/install.img [root@linuxprobe ~]# cp /media/cdrom/images/install.img /storage/ # 复制文件 [root@linuxprobe ~]# ls -lh /storage/install.img -r--r--r--. 1 root root 532M Jun 13 08:27 /storage/install.img [root@linuxprobe ~]# vdostats --human-readable # 查看占用了多少容量,以及空间节省率(Space saving) Device Size Used Available Use% Space saving% /dev/mapper/storage 20.0G 4.5G 15.5G 22% 15% -
再次复制文件,查看占用了多少容量,以及空间节省率 Space saving。
- 可以看到原先 532MB 的文件基本不占容量,空间节省率从 15% 提升到了 54%
[root@linuxprobe ~]# cp /media/cdrom/images/install.img /storage/rhel.img [root@linuxprobe ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/storage 20.0G 4.5G 15.5G 22% 54% -
查看设备 UUID。
[root@linuxprobe ~]# blkid /dev/mapper/storage /dev/mapper/storage: UUID="1f86fda9-e273-4894-acfe-08168f7d71f1" TYPE="xfs" -
将设备设置成永久挂载生效,一直提供服务。使用
_netdev参数后系统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况。[root@linuxprobe ~]# vim /etc/fstab [root@linuxprobe ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Sun Jun 4 03:05:37 2023 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/rhel-root / xfs defaults 0 0 UUID=73159c7d-b179-4ef9-a83f-3f6f6ce390ed /boot xfs defaults,uquota 0 0 /dev/mapper/rhel-swap swap swap defaults 0 0 /dev/cdrom /media/cdrom iso9660 defaults 0 0 /dev/sdb2 /backup ext4 defaults,_netdev 0 0 /dev/cdrom /media/cdrom iso9660 defaults 0 0 /dev/sdb1 /newFS xfs defaults 0 0 /dev/sdb2 swap swap defaults 0 0 UUID=1f86fda9-e273-4894-acfe-08168f7d71f1 /storage xfs defaults,_netdev 0 0
软硬方式链接
- 软链接 soft link:也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路径,很像一个记录地址的标签。
- 硬链接 hard link:可以将它理解为一个
指向原始文件 block 的指针,系统会创建出一个与原来一模一样的 inode 信息块。

ln
-
ln命令用于创建文件的软硬链接,英文全称为link,语法格式为ln [参数] 原始文件名 链接文件名。 -
ln命令中可用的参数以及作用:参数 作用 -s创建 "符号链接" (如果不带 -s参数,则默认创建硬链接)-f强制创建文件或目录的链接 -i覆盖前先询问 -v显示创建链接的过程
软链接
-
创建文件。
[linuxprobe@linuxprobe ~]$ echo "Welcome to linuxprobe.com" > old.txt -
创建软链接。
[linuxprobe@linuxprobe ~]$ ln -s old.txt new.txt -
查看两文件。
[linuxprobe@linuxprobe ~]$ cat old.txt Welcome to linuxprobe.com [linuxprobe@linuxprobe ~]$ cat new.txt Welcome to linuxprobe.com [linuxprobe@linuxprobe ~]$ ls -ald old.txt new.txt lrwxrwxrwx. 1 linuxprobe linuxprobe 7 Jun 13 09:00 new.txt -> old.txt -rw-rw-r--. 1 linuxprobe linuxprobe 26 Jun 13 09:00 old.txt -
删除原始文件,再次查看软链接文件。
[linuxprobe@linuxprobe ~]$ rm -f old.txt [linuxprobe@linuxprobe ~]$ ls -ald old.txt new.txt ls: cannot access 'old.txt': No such file or directory lrwxrwxrwx. 1 linuxprobe linuxprobe 7 Jun 13 09:00 new.txt -> old.txt
硬链接
-
创建文件。
[linuxprobe@linuxprobe ~]$ echo "Welcome to linuxprobe.com" > old.txt -
创建硬链接,即相当于针对原始文件的硬盘存储位置创建了一个指针。
- 这样一来,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会因为原始文件的删除而导致无法读取了。
[linuxprobe@linuxprobe ~]$ ln old.txt new.txt -
查看两文件。
- 可以看到创建硬链接后,原始文件的硬盘链接数量增加到了 2,这个数字表示的是文件的 inode 信息块的数量。
[linuxprobe@linuxprobe ~]$ cat old.txt Welcome to linuxprobe.com [linuxprobe@linuxprobe ~]$ cat new.txt Welcome to linuxprobe.com [linuxprobe@linuxprobe ~]$ ls -ald old.txt new.txt -rw-rw-r--. 2 linuxprobe linuxprobe 26 Jun 13 09:07 new.txt -rw-rw-r--. 2 linuxprobe linuxprobe 26 Jun 13 09:07 old.txt -
删除原始文件,再次查看硬链接文件。
[linuxprobe@linuxprobe ~]$ rm -f old.txt [linuxprobe@linuxprobe ~]$ ls -ald new.txt old.txt ls: cannot access 'old.txt': No such file or directory -rw-rw-r--. 1 linuxprobe linuxprobe 26 Jun 13 09:07 new.txt
总结
/home 目录与 /root 目录内存放的文件有何相同点以及不同点?
这两个目录都是用来存放用户家目录数据的,但是,/root 目录存放的是 root 管理员的家目录数据。
/dev/sdb,可以确认它是主板第二个插槽上的设备吗?不一定,因为设备的文件名称是由系统的识别顺序来决定的。
可以选用创建 3 个主分区 +1 个扩展分区的方法,然后把扩展分区再分成 2 个逻辑分区,即有了 5 个分区。
/dev/sda5 是主分区还是逻辑分区?逻辑分区。
/dev 目录中的名称?
udev 设备管理器服务。
当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是 "挂载" 。
不一定,软限制数值可以小于等于硬限制数值。
不可以,VDO 是通过压缩或删重操作来提高硬盘的逻辑空间大小。
可以。