简介
Linux 存储由多个相互关联的层组成。设备可以包含分区,分区或镜像可以包含文件系统,而文件系统挂载到目录树中的挂载点后,才能被访问。区分这些术语后,磁盘命令会更容易理解。
在本实验中,你将安全检查存储设备、分析空间使用情况、在普通文件中创建 ext4 文件系统、挂载和卸载该文件系统、读取分区信息,并创建一个用于练习的 fstab 文件。所有写入操作都针对本实验创建的临时文件;你不会重新分区真实磁盘,也不会修改系统的 /etc/fstab。
了解 Linux 存储层
在本步骤中,你将检查块设备、文件系统和挂载点之间的关系,然后准备一个安全的工作目录。
lsblk 表示「列出块设备」。它的 -o 选项用于选择要显示的列:
lsblk -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINTS
从左到右阅读输出:
NAME标识设备或分区。TYPE区分磁盘、分区和回环设备。SIZE显示容量。FSTYPE显示检测到的文件系统类型;如果不存在文件系统,该列可能为空。MOUNTPOINTS显示文件系统连接到目录树的位置。
一个磁盘可以包含一个或多个分区。ext4 等文件系统负责在分区或其他存储对象中组织文件。挂载点是一个普通目录,Linux 通过它公开该文件系统。
使用 findmnt 确定当前包含项目目录的文件系统。-T 选项接受任意路径,并查找该路径所在的已挂载文件系统:
findmnt -T /home/labex/project
具体源设备可能不同,但输出会显示源、目标、文件系统类型和挂载选项。
blkid 命令读取文件系统签名、标签和 UUID。需要管理员权限才能检查所有可用的块设备:
sudo blkid
UUID 是文件系统标识符,即使设备名称发生变化,它通常也能保持稳定。稍后学习持久化挂载时,你会使用这一特性。
创建并进入专用工作目录:
mkdir -p /home/labex/project/storage-lab
cd /home/labex/project/storage-lab
pwd
最后的输出应为 /home/labex/project/storage-lab。
分析文件系统和目录的使用情况
在本步骤中,你将对比 df 和 du:df 报告整个文件系统的空间使用情况,du 则统计文件和目录树占用的空间。
创建两个具有已知表观大小的示例文件。truncate -s 选项可以高效设置文件大小,而无需填充有实际意义的数据:
cd /home/labex/project/storage-lab
mkdir -p usage/reports usage/archive
truncate -s 2M usage/reports/weekly.log
truncate -s 5M usage/archive/records.bin
对工作目录使用 df -h。-h 选项使用 MiB、GiB 等易读单位显示结果:
df -h /home/labex/project/storage-lab
df 回答的是:「包含此路径的文件系统已使用和可用多少空间?」其中重要的列包括 Size、Used、Avail、Use% 和 Mounted on。
使用 du -sh 汇总示例目录。这里 -s 表示汇总,-h 表示使用易读单位:
du -sh usage
与 df 不同,du 回答的是:「这个文件或目录树占用了多少空间?」使用 truncate 创建的稀疏文件可能具有较大的表观大小,但实际占用的已分配磁盘空间很少。--apparent-size 选项用于测量它们的逻辑大小:
du -h --apparent-size --max-depth=1 usage
你应该会看到 usage/archive 大于 usage/reports。将 du 与排序命令结合,按表观大小从大到小列出项目:
du -ah --apparent-size usage | sort -rh | head -n 5
管道会将 du 的输出发送给 sort;-r 反转排序顺序,-h 可以识别易读的大小后缀。head -n 5 保留前五条结果。
创建并检查 ext4 文件系统
在本步骤中,你将创建一个虚拟磁盘镜像,将其格式化为 ext4,并检查其文件系统元数据,整个过程不会接触真实磁盘。
创建一个大小为 128 MiB 的镜像文件。后续实验都会使用这个临时存储:
cd /home/labex/project/storage-lab
truncate -s 128M virtual.img
检查它的表观大小:
ls -lh virtual.img
格式化之前,file 只能将其识别为普通数据或空文件:
file virtual.img
mkfs.ext4 命令用于创建 ext4 文件系统。-F 选项确认普通文件是有意指定的目标,-L 为文件系统设置标签 LABEXDATA:
sudo mkfs.ext4 -F -L LABEXDATA virtual.img
格式化会在镜像内部创建文件系统结构。使用两个工具检查结果:
file virtual.img
sudo blkid -p virtual.img
输出应识别出 ext4,显示标签 LABEXDATA,并包含生成的 UUID。只显示该 UUID:
sudo blkid -s UUID -o value virtual.img
UUID 会在格式化时生成,因此不同学习者看到的值会不同。
挂载、使用和卸载文件系统
在本步骤中,你将把虚拟文件系统连接到 Linux 目录树中,在其中写入一个文件,然后安全地将其卸载。
挂载点是文件系统变得可见的目录。在 /mnt 下创建一个挂载点;/mnt 是临时管理挂载的标准位置:
sudo mkdir -p /mnt/labex-virtual
挂载镜像。-o loop 选项要求 Linux 将普通文件关联到回环设备,使其能够像块存储一样使用:
cd /home/labex/project/storage-lab
sudo mount -o loop virtual.img /mnt/labex-virtual
检查当前挂载:
findmnt /mnt/labex-virtual
源通常会显示为回环设备,目标是 /mnt/labex-virtual,文件系统类型是 ext4。你也可以使用 df 检查这个特定的文件系统:
df -h /mnt/labex-virtual
在已挂载的文件系统中写入一个文件。使用 sudo sh -c 是因为重定向由 shell 执行,而挂载后的根目录属于 root:
sudo sh -c 'echo "stored inside the virtual filesystem" > /mnt/labex-virtual/welcome.txt'
cat /mnt/labex-virtual/welcome.txt
卸载会刷新待写入的数据,并将文件系统从挂载点分离:
sudo umount /mnt/labex-virtual
确认它已经不再挂载:
findmnt /mnt/labex-virtual
预期不会有任何输出。由于没有在该目标位置找到活动挂载,findmnt 会返回非零状态。挂载点目录仍然存在,但在再次挂载镜像之前,无法通过该目录访问镜像中的内容。
安全检查分区表
在本步骤中,你将以只读列出模式使用 fdisk,并区分分区表与文件系统签名。
列出系统可见的磁盘和分区:
sudo fdisk -l
-l 选项表示列出。该命令会报告磁盘大小、扇区大小、分区表类型和分区信息,但不会修改它们。不要在不熟悉的生产磁盘上启动交互式分区操作。
现在检查虚拟镜像:
cd /home/labex/project/storage-lab
sudo fdisk -l virtual.img
该镜像具有磁盘大小,但没有分区条目。在这个受控示例中,ext4 是直接创建在整个镜像上的。在物理磁盘上,常见的布局是:
disk device -> partition table -> partition -> filesystem -> mount point
创建第二个空镜像进行对比:
truncate -s 64M partition-demo.img
sudo fdisk -l partition-demo.img
它同样没有分区表。使用 wipefs 的默认只读模式,对比文件系统签名:
sudo wipefs virtual.img partition-demo.img
virtual.img 应显示 ext4 签名,而空的对比镜像不应显示任何文件系统签名。在本实验中不要使用具有破坏性的 wipefs -a 选项。
创建并验证练习用 fstab
在本步骤中,你将学习 fstab 条目的六个字段,并安全测试一个独立的练习文件,而不修改 /etc/fstab。
系统会读取 /etc/fstab,以确定哪些文件系统应始终按一致方式挂载。查看其中非注释行,不要编辑该文件:
grep -Ev '^\s*(#|$)' /etc/fstab
fstab 条目包含六个以空白字符分隔的字段:
source mount-point filesystem-type options dump fsck-order
对于物理分区,UUID=<value> 通常比 /dev/sdb1 这样的名称更安全,因为硬件发现顺序变化时,设备名称可能发生变化。
获取镜像的 UUID,并在练习文件中写入一个带注释的 UUID 示例:
cd /home/labex/project/storage-lab
uuid=$(sudo blkid -s UUID -o value virtual.img)
printf '## Real block device example: UUID=%s /mnt/data ext4 defaults,nofail 0 2\n' "$uuid" > practice-fstab
由于本实验使用的是普通文件而不是物理分区,实际使用的练习条目采用镜像的绝对路径,并指定 loop 选项:
printf '%s\n' '/home/labex/project/storage-lab/virtual.img /mnt/labex-virtual ext4 loop,nofail 0 2' >> practice-fstab
显示并验证练习文件。--tab-file 告诉 findmnt 不要使用真实的 /etc/fstab:
cat practice-fstab
findmnt --verify --tab-file practice-fstab
最终摘要应报告 0 parse errors 和 0 errors。它还会报告一个关于源是普通文件的警告。由于本受控实验特意使用基于文件的回环文件系统,而不是物理块设备,因此该警告符合预期。
使用练习文件执行一次受控挂载。-T 选项告诉 mount 读取指定的备用 fstab 文件:
sudo mount -T practice-fstab /mnt/labex-virtual
findmnt /mnt/labex-virtual
之前创建的 welcome.txt 应仍然存在,这证明挂载可以公开访问文件系统中保存的数据:
cat /mnt/labex-virtual/welcome.txt
再次卸载,使实验以安全的未挂载状态结束:
sudo umount /mnt/labex-virtual
你已经在不修改系统启动配置的情况下,验证了持久化挂载的语法。真实 /etc/fstab 中的错误可能会影响系统启动,因此管理员通常会在重启前先验证修改内容。
总结
你了解了 Linux 存储的主要层次:设备、分区、文件系统和挂载点。你使用 lsblk、blkid 和 findmnt 检查这些对象,然后对比了 df 提供的整个文件系统空间使用情况和 du 提供的文件、目录空间使用情况。
你在临时镜像中创建并标记了 ext4 文件系统,通过回环设备挂载它,在卸载后保留了其中的数据,并在不修改真实磁盘的情况下检查了分区信息。最后,你学习了 fstab 的六个字段、稳定 UUID 的重要性,以及如何在使用练习 fstab 之前安全地验证独立文件。



