文件系统与磁盘管理

LinuxBeginner
立即练习

简介

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

分析文件系统和目录的使用情况

在本步骤中,你将对比 dfdudf 报告整个文件系统的空间使用情况,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 回答的是:「包含此路径的文件系统已使用和可用多少空间?」其中重要的列包括 SizeUsedAvailUse%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 errors0 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 存储的主要层次:设备、分区、文件系统和挂载点。你使用 lsblkblkidfindmnt 检查这些对象,然后对比了 df 提供的整个文件系统空间使用情况和 du 提供的文件、目录空间使用情况。

你在临时镜像中创建并标记了 ext4 文件系统,通过回环设备挂载它,在卸载后保留了其中的数据,并在不修改真实磁盘的情况下检查了分区信息。最后,你学习了 fstab 的六个字段、稳定 UUID 的重要性,以及如何在使用练习 fstab 之前安全地验证独立文件。