简介
在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。
在使用之前,一个 loop 设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。
上面说的文件格式,我们经常见到的是 CD 或 DVD 的 ISO 光盘镜像文件或者是软盘(硬盘)的 *.img 镜像文件。通过这种 loop mount (回环mount)的方式,这些镜像文件就可以被 mount 到当前文件系统的一个目录下。
ANCNHFILSUPSH1A:/data # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 8G 0 loop /data/workstation loop1 7:1 0 2G 0 loop /data/tmp/lucas sda 8:0 0 500G 0 disk ├─sda1 8:1 0 8M 0 part ├─sda2 8:2 0 100M 0 part ...data omitted... sr0 11:0 1 376.2M 0 rom
losetup
ANCNHFILSUPSH1A:/data # losetup --help Usage: losetup [options] [<loopdev>] losetup [options] -f | <loopdev> <file> Set up and control loop devices. Options: -a, --all list all used devices -d, --detach <loopdev>... detach one or more devices -D, --detach-all detach all used devices -f, --find find first unused device -c, --set-capacity <loopdev> resize the device -j, --associated <file> list all devices associated with <file> -L, --nooverlap avoid possible conflict between devices -o, --offset <num> start at offset <num> into file --sizelimit <num> device is limited to <num> bytes of the file -b, --sector-size <num> set the logical sector size to <num> -P, --partscan create a partitioned loop device -r, --read-only set up a read-only loop device --direct-io[=<on|off>] open backing file with O_DIRECT --show print device name after setup (with -f) -v, --verbose verbose mode -J, --json use JSON --list output format -l, --list list info about all or specified (default) -n, --noheadings don't print headings for --list output -O, --output <cols> specify columns to output for --list --output-all output all columns --raw use raw --list output format -h, --help display this help -V, --version display version Available output columns: NAME loop device name AUTOCLEAR autoclear flag set BACK-FILE device backing file BACK-INO backing file inode number BACK-MAJ:MIN backing file major:minor device number MAJ:MIN loop device major:minor number OFFSET offset from the beginning PARTSCAN partscan flag set RO read-only device SIZELIMIT size limit of the file in bytes DIO access backing file with direct-io LOG-SEC logical sector size in bytes For more details see losetup(8).
找到loop的镜像文件
ANCNHFILSUPSH1A:/data # losetup -a /dev/loop1: [65025]:13 (/data/.lucas.ext4) /dev/loop0: [65025]:12 (/data/.workstation.ext4)
创建loop镜像文件
创建一个文件,大小为2G
ANCNHFILSUPSH1A:/data # dd if=/dev/zero of=/data/.lucas.ext4 bs=1M count=2048 2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB, 2.0 GiB) copied, 14.6235 s, 147 MB/s
对镜像文件格式化
ANCNHFILSUPSH1A:/data # mkfs.ext4 /data/.lucas.ext4 mke2fs 1.43.8 (1-Jan-2018) Discarding device blocks: done Creating filesystem with 524288 4k blocks and 131072 inodes Filesystem UUID: 079d6ef8-8a05-4d58-9254-f30c05195d86 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done
以loop挂载镜像文件
ANCNHFILSUPSH1A:/data # mount /data/.lucas.ext4 /data/tmp/lucas/ ANCNHFILSUPSH1A:/data # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 8G 0 loop /data/workstation loop1 7:1 0 2G 0 loop /data/tmp/lucas sda 8:0 0 500G 0 disk ├─sda1 8:1 0 8M 0 part ├─sda2 8:2 0 100M 0 part ...data omitted... sr0 11:0 1 376.2M 0 rom
扩容
在镜像后增加2G大小
ANCNHFILSUPSH1A:/data # dd if=/dev/zero of=/data/.lucas.ext4 bs=1M conv=notrunc oflag=append count=2048 2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB, 2.0 GiB) copied, 13.7 s, 157 MB/s
调整loop配置大小
ANCNHFILSUPSH1A:/data # losetup -c /dev/loop1 ANCNHFILSUPSH1A:/data # resize2fs -p /dev/loop1 4G resize2fs 1.43.8 (1-Jan-2018) Filesystem at /dev/loop1 is mounted on /data/tmp/lucas; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 1 The filesystem on /dev/loop1 is now 1048576 (4k) blocks long.
缩盘
卸载镜像
ANCNHFILSUPSH1A:/data # umount /data/.lucas.ext4
检查镜像错误
ANCNHFILSUPSH1A:/data # e2fsck -f /data/.lucas.ext4 e2fsck 1.43.8 (1-Jan-2018) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /data/.lucas.ext4: 11/262144 files (0.0% non-contiguous), 34894/1048576 blocks
缩盘
ANCNHFILSUPSH1A:/data # resize2fs /data/.lucas.ext4 2G resize2fs 1.43.8 (1-Jan-2018) Resizing the filesystem on /data/.lucas.ext4 to 524288 (4k) blocks. The filesystem on /data/.lucas.ext4 is now 524288 (4k) blocks long.
缩小镜像大小
ANCNHFILSUPSH1A:/data # ll -h ./.lucas.ext4 -rw-r--r-- 1 root root 4.0G Jul 11 17:05 ./.lucas.ext4 ANCNHFILSUPSH1A:/data # dd if=/dev/zero of=/data/.lucas.ext4 bs=1M seek=2048 count=0 0+0 records in 0+0 records out 0 bytes copied, 5.5993e-05 s, 0.0 kB/s ANCNHFILSUPSH1A:/data # ll -h ./.lucas.ext4 -rw-r--r-- 1 root root 2.0G Jul 11 17:06 ./.lucas.ext4
挂载
ANCNHFILSUPSH1A:/data # mount /data/.lucas.ext4 /data/tmp/lucas/ ANCNHFILSUPSH1A:/data # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 8G 0 loop /data/workstation loop1 7:1 0 2G 0 loop /data/tmp/lucas sda 8:0 0 500G 0 disk ├─sda1 8:1 0 8M 0 part ├─sda2 8:2 0 100M 0 part ...data omitted... sr0 11:0 1 376.2M 0 rom ANCNHFILSUPSH1A:/data # df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 2.3G 58M 2.3G 3% /dev/shm tmpfs tmpfs 735M 82M 654M 12% /run tmpfs tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup /dev/mapper/prodis-root ext4 20G 3.4G 16G 19% / ...data ommited... /dev/loop1 ext4 2.0G 6.0M 1.8G 1% /data/tmp/lucas