Please enable Javascript to view the contents

loop device 生命周期管理

 ·  ☕ 2 分钟

1. 创建镜像文件

1.1 loop存储适用场景

把普通文件当成 /dev/loopN 块设备来用,读写走块设备接口,backing file 仍是宿主机上的一个文件

  • 挂载 ISO 与磁盘镜像
  • 本地练手与压测
  • 加密卷与密文镜像
  • 模拟云盘或 CSI 块卷
  • 只读暴露文件
  • 临时挂载

和真实磁盘相比,loop 设备性能受 backing file 所在文件系统影响,关联默认不持久化,重启后一般要重新 losetup 或写进 /etc/fstab

1.2 创建镜像

在宿主机上准备 backing file

  • 稀疏文件,按需分配空间
1
truncate -s 10G /data/tmp/disk.img
  • 预分配全量空间,适合压测
1
dd if=/dev/zero of=/data/tmp/disk.img bs=1M count=10240
  • 预分配全量空间,比 dd 更快
1
fallocate -l 10G /data/tmp/disk.img
  • 指定块大小,与目标文件系统块对齐
1
dd if=/dev/zero of=/data/tmp/disk.img bs=4k count=2621440

2. 关联 loop 设备

把镜像文件挂到 /dev/loopN

  • 自动分配空闲 loop 设备并关联
1
losetup -f --show /data/tmp/disk.img
  • 指定 loop 设备关联
1
losetup /dev/loop0 /data/tmp/disk.img
  • 关联时指定扇区大小与只读模式
1
2
3
losetup /dev/loop0 /data/tmp/disk.img \
  --sector-size 4096 \
  --read-only
  • 查看所有已关联的 loop 设备
1
losetup -a
  • 查看某个 loop 设备详情
1
losetup -l /dev/loop0
  • 反查镜像文件对应的 loop 设备
1
losetup -j /data/tmp/disk.img

3. 格式化

  • 在整盘上创建 XFS
1
mkfs.xfs /dev/loop0
  • XFS 只读检查
1
xfs_repair -n /dev/loop0

4. 挂载与使用

挂载整盘 loop 设备或镜像文件

  • 创建挂载点
1
mkdir -p /mnt/looptest
  • 普通挂载
1
mount /dev/loop0 /mnt/looptest
  • 只读挂载
1
mount -o ro /dev/loop0 /mnt/looptest
  • 直接挂载镜像文件
1
mount -t xfs -o loop /data/tmp/disk.img /mnt/looptest

mount 会自动寻找空闲 loop 设备。

  • 验证挂载
1
2
findmnt /mnt/looptest
mount | grep loop0

5. 扩容

镜像扩容后,依次更新 backing file、loop 设备容量、文件系统大小。

  • 扩容镜像文件到 20G
1
fallocate -l 20G /data/tmp/disk.img
  • 仅修改镜像大小元数据
1
truncate -s 20G /data/tmp/disk.img
  • 通知 loop 设备重读容量
1
losetup -c /dev/loop0
  • XFS 在线扩容
1
xfs_growfs /mnt/looptest

6. 卸载与解除关联

按挂载 → loop 关联的顺序释放

  • 卸载文件系统
1
umount /mnt/looptest
  • lazy 卸载
1
umount -l /mnt/looptest
  • 杀掉占用挂载点的进程
1
fuser -km /mnt/looptest
  • 解除 loop 设备关联
1
losetup -d /dev/loop0
  • 解除所有 loop 设备关联
1
losetup -D

7. 清理

先解除 loop 关联,再删镜像文件。顺序反了会出现 losetup -a 里 backing file 带 (deleted) 的残留。

  • 删除镜像文件
1
2
3
umount /mnt/looptest
losetup -d /dev/loop0
rm -f /data/tmp/disk.img
  • 确认无残留 loop 设备
1
2
losetup -a
ls /dev/loop* 2>/dev/null
  • 清理 (deleted) 残留
1
2
3
findmnt /dev/loop0
umount /mnt/looptest          # 若仍挂载
losetup -d /dev/loop0

微信公众号
作者
微信公众号