简介

在类 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