在Linux系统中存在一种特殊的块设备,这种设备本身以一般文件的形式存在于一般文件系统中,但是又可以被制作成其他文件系统从而被mount上。这种理解方式比较绕,举个例子:在ext4文件系统中存在一个文件为loop_dev.img的文件其大小为1000Kib,但是其又可以作为一个独立的块设备被挂载在系统的某一目录下面,比如mount。这种设备也称作LOOP设备。
本质上来说loop设备的文件盘以普通文件的形式存在于系统中的,当文件模拟成块设备后(比如使用dd if=/dev/zero of=xxxx bs=2K count=xxxx制作一个模拟磁盘)使用losetup命令和/dev/loop*相关联我们就可以把虚拟磁盘当做普通硬盘来进行访问了。
loop设备的使用
- 在loop设备使用前,先要制作本地模拟块设备或者叫做模拟硬盘也或者叫做本地镜像以下简称虚拟镜像或者本地镜像:
dd if=/dev/zero of=./loop_dev.img bs=2K count=1000
bs和count可以调整本地磁盘的大小。
-
loop设备和本地镜像相关联:
losetup /dev/loop0 ./loop_dev.img #也可以使用-e参数,-e参数是磁盘的加密方式.
-
loop设备格式化文件系统类型(ext2,ext3,ext4…)我们使用ext2文件系统,所以需要格式化成ext2文件系统类型(注意:一旦模拟硬盘已经有内容,此步骤一定要小心,否则模拟硬盘的内容会一同被格式化掉,这个原理和格式化磁盘差不多)
mkfs -t ext2 /dev/loop0
- loop设备的挂载,需要与第三步骤指定相同或者兼容的文件系统。
mount -t ext2 /dev/loop0 /mnt
经历过以上步骤我们就可以对于/dev/loop0
可以以一个块设备进行访问了,而且已经挂载在/mnt
目录下。
- loop设备的卸载:
umount /mnt # 先把LOOP设备卸载掉
losetup -d /dev/loop0 # 然后把loop设备和虚拟镜像去关联
通过以上五个步骤我们可以正常使用loop设备并且把loop设备和虚拟镜像去关联。我们还有对于loop设备的进一步高级讨论:
疑问
1. 经过上述步骤在制作虚拟镜像时候虽然指定了虚拟镜像的磁盘大小,我们在loop设备的时候是否能够指定虚拟磁盘大小呢?
2. 在制作文件系统的时候能不能指定文件大小呢?
3. 在操作过程中如果把虚拟镜像和/dev/loop0关联了,但是如果忘了去关联的话是否能够关联的上呢?
下面就开始一一解答上述疑问:
- 经过上述步骤在制作虚拟镜像时候虽然指定了虚拟镜像的磁盘大小,我们在loop设备的时候是否能够指定虚拟磁盘大小呢?答案是当然可以,那什么时候可以指定大小呢?如何指定呢?
在本地镜像和回环设备驱动关联之后可以使用如下命令指定偏移量和大小:
losetup /dev/loop0 -o 2KiB
losetup /dev/loop0 --sizelimit 80Kib
上述命令的具体操作过程如下:
root@ubuntu:/home/alex# dd if=/dev/zero of=./loop_dev.img bs=2K count=1000
1000+0 records in
1000+0 records out
2048000 bytes (2.0 MB) copied, 0.0072437 s, 283 MB/s
root@ubuntu:/home/alex# losetup /dev/loop0 ./loop_dev.img
root@ubuntu:/home/alex# losetup /dev/loop0 -o 2KiB
/dev/loop0: [0801]:700701 (/home/alex/loop_dev.img)
root@ubuntu:/home/alex# losetup /dev/loop0 --sizelimit 100KiB
/dev/loop0: [0801]:700701 (/home/alex/loop_dev.img)
root@ubuntu:/home/alex# mkfs -t ext2 /dev/loop0 88
mke2fs 1.42.9 (4-Feb-2014)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
16 inodes, 88 blocks
4 blocks (4.55%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
16 inodes per group
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
root@ubuntu:/home/alex# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 21G 26G 45% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 3.1G 12K 3.1G 1% /dev
tmpfs 621M 1.6M 620M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 3.1G 152K 3.1G 1% /run/shm
none 100M 36K 100M 1% /run/user
/dev/loop0 81K 14K 63K 19% /mnt
-
在制作文件系统的时候能不能指定文件大小呢? 当然可以,不过要注意要和loop设备指定文件系统小,否则可能制作失败。上述截图就有指定大小操作。
-
在操作过程中如果把虚拟镜像和/dev/loop0关联了,但是如果忘了去关联的话是否能够关联的上呢?有一个
losetup -f
命令来查找第一个可用的loop设备的设备名,如下:
root@ubuntu:/home/alex# losetup -f
/dev/loop1