TT Lab
开始
学习 学习路径 课程

LFCS — Linux 基金会认证系统管理员

从 LVM 到 autofs — 亲手搭建存储

在 TT Lab 中继续学习

目标

在两个回环设备上搭建 LVM,以 UUID 把 ext4 登记到 fstab,在线扩大它,启用交换文件,在同一个 VM 内配置 NFS 服务器和 autofs 客户端,最后用 iostat、vmstat 留下指标。这一切都真实挂载。

为什么重要

LFCS 的 Storage 领域(20%)在 Pod 中一行也做不了——pvcreate 和 mount 都因为缺少 capability 而被禁用。本实验在 Ubuntu 24.04 VM 中以 root 运行。不过没有空磁盘。暂存磁盘已经被平台格式化为 ext4 并挂载,所以从让文件看起来像块设备的回环设备(losetup)开始。这正是实际工作中在没有磁盘时试验 LVM 或 RAID 所用的方法。

本实验有三根骨架。第一,LVM 分为 PV → VG → LV 三层,而且扩大要在两层分别进行(lvextend 之后执行 resize2fs)。第二,fstab 中写的不是设备名,而是 UUID——设备顺序可能每次启动都不同。第三,修改配置文件与守护进程知道这一修改是两回事(exportfs -ra、systemctl restart autofs)。

会话从 60 分钟开始,最长可延长到 180 分钟,会话结束后 VM 会消失。

步骤

  1. 把 /var/lib/lfcs/disk1.img 和 /var/lib/lfcs/disk2.img 分别创建为 1GiB 大小(稀疏文件即可),并将两者都挂接为回环设备。挂接后,把 losetup -a 的输出保存到 /root/lfcs/storage/loop.txt。
  2. 把两个回环设备初始化为 LVM 物理卷(PV),再把二者合并,创建卷组 vg_lfcs。
  3. 在 vg_lfcs 中创建大小为 600MiB 的逻辑卷 lv_data,并格式化为 ext4。
  4. 把 lv_data 挂载到 /srv/data,并在 /etc/fstab 中添加一行以 UUID= 开头的记录(类型 ext4,选项 defaults,dump 为 0,pass 为 2),使其在重启后仍然挂载。用 findmnt --verify 检查时,fstab 中不得有错误。
  5. 把 lv_data 再扩大 300MiB(总计至少 900MiB),并在不卸载的前提下,让 ext4 文件系统一同增大。用 df 查看到的 /srv/data 的大小必须变大。
  6. 把 /var/swap/lfcs.swap 创建为 256MiB 的交换文件并启用。权限必须是 600,并在 /etc/fstab 中添加一行(类型 swap),使其在重启后仍然启用。
  7. 把 /srv/share 通过 NFS 导出,但只允许 127.0.0.1 访问(选项 rw,sync,no_subtree_check)。在 /srv/share/hello.txt 中写入任意内容,再把该共享以 NFS 方式挂载到 /mnt/share,使同一个文件可见。
  8. 让 autofs 在访问的瞬间挂载同一个共享。在主映射文件 /etc/auto.master.d/lfcs.autofs 中把 /nfs 关联到映射文件 /etc/auto.lfcs,并在该映射文件中写入键 share,使其以 nfs4 指向 127.0.0.1:/srv/share。重启 autofs 后,ls /nfs/share 必须显示 hello.txt。(如果服务器就是本机,autofs 会以 bind 方式而不是 NFS 方式挂载——所以 findmnt /nfs/share 的 SOURCE 显示为 [/srv/share] 也是正常的。)
  9. 把 iostat -dxk 1 3 的输出保存到 /root/lfcs/storage/iostat.txt,把 vmstat 1 3 的输出保存到 /root/lfcs/storage/vmstat.txt。然后把 /root/lfcs/storage/summary.txt 写成四行:VG=vg_lfcs、PVS=<vg_lfcs 의 PV 개수>、LV_MB=<lv_data 의 크기(MiB, 정수)>、SWAP=<켜져 있는 스왑 파일 경로>(后三行的占位符依次为 vg_lfcs 中 PV 的数量、lv_data 的大小(MiB,整数)、已启用的交换文件路径)。

参考

创建两个回环设备

把 /var/lib/lfcs/disk1.img 和 /var/lib/lfcs/disk2.img 分别创建为 1GiB 大小(稀疏文件即可),并将两者都挂接为回环设备。挂接后,把 losetup -a 的输出保存到 /root/lfcs/storage/loop.txt。

用 truncate -s 可以创建稀疏文件。回环设备的编号,snap 已经占用了几个,所以不要写死,请用 losetup -f --show 获取空闲的设备。

用两个 PV 创建 VG

把两个回环设备初始化为 LVM 物理卷(PV),再把二者合并,创建卷组 vg_lfcs。

pvcreate 针对每个设备执行,vgcreate 则在 VG 名称之后依次列出各个设备。用 losetup -j <文件> 可以找回某个文件对应的是哪个回环设备。

切出 LV 并格式化为 ext4

在 vg_lfcs 中创建大小为 600MiB 的逻辑卷 lv_data,并格式化为 ext4。

lvcreate 用 -L 指定大小,用 -n 指定名称。设备路径有 /dev// 和 /dev/mapper/- 两种显示形式。

挂载并以 UUID 写入 fstab

把 lv_data 挂载到 /srv/data,并在 /etc/fstab 中添加一行以 UUID= 开头的记录(类型 ext4,选项 defaults,dump 为 0,pass 为 2),使其在重启后仍然挂载。用 findmnt --verify 检查时,fstab 中不得有错误。

UUID 用 blkid 查看。设备路径(/dev/loopN)可能每次启动都不同,所以不能写进 fstab。写入之后,请用 systemctl daemon-reload 和 mount -a 确认 fstab 中这一行本身能正常工作。

在线扩大 LV 和文件系统

把 lv_data 再扩大 300MiB(总计至少 900MiB),并在不卸载的前提下,让 ext4 文件系统一同增大。用 df 查看到的 /srv/data 的大小必须变大。

即使用 lvextend -L +300M 扩大了 LV,文件系统也不知道。必须另外运行 resize2fs,或者给 lvextend 加上 -r,df 才会变化。

创建并启用交换文件

把 /var/swap/lfcs.swap 创建为 256MiB 的交换文件并启用。权限必须是 600,并在 /etc/fstab 中添加一行(类型 swap),使其在重启后仍然启用。

用 fallocate 或 dd 创建文件,顺序是 chmod 600 → mkswap → swapon。用 swapon --show 查看是否已启用。fstab 的这一行有六个字段,挂载点的位置写 none,类型写 swap(例如 /var/swap/sample.swap none swap sw 0 0)。

导出为本地 NFS 服务器并挂载

把 /srv/share 通过 NFS 导出,但只允许 127.0.0.1 访问(选项 rw,sync,no_subtree_check)。在 /srv/share/hello.txt 中写入任意内容,再把该共享以 NFS 方式挂载到 /mnt/share,使同一个文件可见。

顺序是在 /etc/exports 中写一行 → exportfs -ra → mount -t nfs4 127.0.0.1:/srv/share /mnt/share。请用 exportfs -v 确认是否真的导出了——只修改文件,服务器并不知道。

用 autofs 在访问时挂载

让 autofs 在访问的瞬间挂载同一个共享。在主映射文件 /etc/auto.master.d/lfcs.autofs 中把 /nfs 关联到映射文件 /etc/auto.lfcs,并在该映射文件中写入键 share,使其以 nfs4 指向 127.0.0.1:/srv/share。重启 autofs 后,ls /nfs/share 必须显示 hello.txt。(如果服务器就是本机,autofs 会以 bind 方式而不是 NFS 方式挂载——所以 findmnt /nfs/share 的 SOURCE 显示为 [/srv/share] 也是正常的。)

主映射文件的行是“挂载点 映射文件”,映射文件的行是“键 -fstype=nfs4 服务器:/路径”。修改映射文件后如果忘了 systemctl restart autofs,/nfs 就只是个空目录。

用 iostat 和 vmstat 留下性能指标

把 iostat -dxk 1 3 的输出保存到 /root/lfcs/storage/iostat.txt,把 vmstat 1 3 的输出保存到 /root/lfcs/storage/vmstat.txt。然后把 /root/lfcs/storage/summary.txt 写成四行:VG=vg_lfcs、PVS=<vg_lfcs 의 PV 개수>、LV_MB=<lv_data 의 크기(MiB, 정수)>、SWAP=<켜져 있는 스왑 파일 경로>。(后三行的占位符依次为 vg_lfcs 中 PV 的数量、lv_data 的大小(MiB,整数)、已启用的交换文件路径。)

iostat 位于 sysstat 软件包中。第一次采样是开机以来的累计值,所以要采样三次。数值不要手写,请从 vgs、lvs --units m --nosuffix 和 swapon --show 中提取。