从 LVM 到 autofs — 亲手搭建存储
目标
在两个回环设备上搭建 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 会消失。
步骤
- 把
/var/lib/lfcs/disk1.img和/var/lib/lfcs/disk2.img分别创建为 1GiB 大小(稀疏文件即可),并将两者都挂接为回环设备。挂接后,把losetup -a的输出保存到/root/lfcs/storage/loop.txt。 - 把两个回环设备初始化为 LVM 物理卷(PV),再把二者合并,创建卷组
vg_lfcs。 - 在
vg_lfcs中创建大小为 600MiB 的逻辑卷lv_data,并格式化为 ext4。 - 把
lv_data挂载到/srv/data,并在/etc/fstab中添加一行以 UUID= 开头的记录(类型ext4,选项defaults,dump 为 0,pass 为 2),使其在重启后仍然挂载。用findmnt --verify检查时,fstab 中不得有错误。 - 把
lv_data再扩大 300MiB(总计至少 900MiB),并在不卸载的前提下,让 ext4 文件系统一同增大。用df查看到的/srv/data的大小必须变大。 - 把
/var/swap/lfcs.swap创建为 256MiB 的交换文件并启用。权限必须是600,并在/etc/fstab中添加一行(类型swap),使其在重启后仍然启用。 - 把
/srv/share通过 NFS 导出,但只允许 127.0.0.1 访问(选项rw,sync,no_subtree_check)。在/srv/share/hello.txt中写入任意内容,再把该共享以 NFS 方式挂载到/mnt/share,使同一个文件可见。 - 让 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]也是正常的。) - 把
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,整数)、已启用的交换文件路径)。
参考
- 回环设备:
truncate -s 1G 파일→losetup -f --show 파일。用losetup -j 파일查看挂接到了哪个设备(占位符为文件名)。 - LVM:
pvcreate、vgcreate vg_lfcs 장치1 장치2、lvcreate -L 600M -n lv_data vg_lfcs、lvextend -L +300M -r。 - UUID:
blkid -o value -s UUID /dev/vg_lfcs/lv_data。修改 fstab 之后执行systemctl daemon-reload和mount -a。 - NFS:
/etc/exports→exportfs -ra→exportfs -v。autofs:映射文件 →systemctl restart autofs。 - 常见错误 1:只执行
lvextend而漏掉resize2fs,导致df保持不变。 - 常见错误 2:在
/etc/exports中,客户端与左括号之间加了空格,结果向全世界开放。 - 常见错误 3:在 fstab 中写
/dev/loopN——编号可能每次启动都不同。
创建两个回环设备
把 /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 中提取。