当前位置: 首页 > 工具软件 > loop > 使用案例 >

回环设备文件(即/dev/loop*)与losetup命令

陈渊
2023-12-01

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

一、回环设备

1、命名方式

回环设备文件一般以 /dev/loop* 方式命名。

xjh@ubuntu:/dev$ ls loo*
loop0  loop1  loop2  loop3  loop4  loop5  loop6  loop7  loop-control
xjh@ubuntu:/dev$ 

2、回环设备的含义

这里的回环设备,是“回环设备文件”的简称,因为linux中一切皆文件。 

回环设备是一种伪设备,是使用文件来模拟块设备的一种技术。当使用losetup命令,将回环设备文件与一个普通文件关联起来后,这个回环设备文件就像一个块设备文件,可以像磁盘设备那样被挂载起来。

之所以叫回环设备,是从文件系统这一层来考虑的,因为这种(通过挂载回环设备而)被挂载起来的普通文件本身也包含有文件系统,这就像文件系统之上再绕了一圈的文件系统,所以称为回环。

注意,访问回环设备文件只能像访问普通文件一样,不能像实际的磁盘通过扇区读写访问。 

3、应用举例

比如将另外一种文件系统的镜像文件保存到一个文件中,然后将一个回环设备关联该文件,接着将该回环设备挂载到主文件系统的一个目录,则我们可以像访问一个文件系统一样,正常地访问该镜像中的内容。

我们就是利用这个原理来制作ext2格式的根文件系统镜像的。见下文描述。

4、其他说明

(1)每个回环设备可以虚拟一个块设备。

(2)只有root用户才有权限设置回环设备。

(3)linux中一般有8个loop设备。可用通过losetup -a查看所有loop设备,如果没有输出就说明所有的loop设备都没有被占用。

root@ubuntu:/dev# ls loo*
loop0  loop1  loop2  loop3  loop4  loop5  loop6  loop7  loop-control
root@ubuntu:/dev# losetup -a
root@ubuntu:/dev# 

二、制作ext2格式的根文件系统镜像

(1)利用dd命令创建一个空白文件rootfs.ext2(只是出于易读目的而添加后缀)。

root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# ls -F
rootfs_xjh/ #这是已经构建好的文件夹形式的根文件系统
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# dd if=/dev/zero of=./rootfs.ext2 bs=1024 count=10240
记录了10240+0 的读入
记录了10240+0 的写出
10485760字节(10 MB)已复制,0.146392 秒,71.6 MB/秒
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# ls 
rootfs.ext2  rootfs_xjh
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# du rootfs.ext2 -h
10M	rootfs.ext2
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# file rootfs.ext2 
rootfs.ext2: data
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs#

(2)使用losetup命令,将回环设备文件/dev/loop1与普通文件rootfs.ext2关联。

root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# losetup -a #查看loop设备
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# lsblk      #查看所有的块设备
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0    20G  0 disk 
├─sda1   8:1    0    18G  0 part /
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0     2G  0 part [SWAP]
sr0     11:0    1  1024M  0 rom  
sr1     11:1    1  1024M  0 rom  
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# losetup /dev/loop1 ./rootfs.ext2 
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# losetup -a 
/dev/loop1: [0801]:20826 (/home/xjh/iot/embedded_basic/rootfs/rootfs.ext2)
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0    20G  0 disk 
├─sda1   8:1    0    18G  0 part /
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0     2G  0 part [SWAP]
sr0     11:0    1  1024M  0 rom  
sr1     11:1    1  1024M  0 rom  
loop1    7:1    0    10M  0 loop                            #这里出现了回环设备
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# 

(3)上述步骤后得到了一个磁盘loop1,接着利用mke2fs命令把这个磁盘格式化为ext2文件系统。

关于mke2fs命令的介绍,见博客mke2fs命令:制作文件系统_天糊土的博客-CSDN博客

root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# mke2fs -m 0 /dev/loop1 10240
mke2fs 1.42.9 (4-Feb-2014)
Discarding device blocks: 完成                            
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
2560 inodes, 10240 blocks
0 blocks (0.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=10485760
2 block groups
8192 blocks per group, 8192 fragments per group
1280 inodes per group
Superblock backups stored on blocks: 
	8193

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Writing superblocks and filesystem accounting information: 完成

root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# 

(4)将该磁盘loop1挂载到主文件系统中的一个目录,比如/mnt/LOOPDEVICE目录。

root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# mount -t ext2 /dev/loop1 /mnt/LOOPDEVICE/
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# df -h
文件系统        容量  已用  可用 已用% 挂载点
udev            490M  4.0K  490M    1% /dev
tmpfs           101M  1.2M   99M    2% /run
/dev/sda1        18G   11G  5.8G   66% /
none            4.0K     0  4.0K    0% /sys/fs/cgroup
none            5.0M     0  5.0M    0% /run/lock
none            501M  152K  501M    1% /run/shm
none            100M   56K  100M    1% /run/user
vmhgfs-fuse     238G  159G   79G   67% /mnt/hgfs
/dev/loop1      9.7M   92K  9.6M    1% /mnt/LOOPDEVICE
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# fdisk -l /dev/loop1

Disk /dev/loop1: 10 MB, 10485760 bytes
255 heads, 63 sectors/track, 1 cylinders, total 20480 sectors
Units = 扇区 of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/loop1 does not contain a valid partition table
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# file rootfs.ext2  #对比(1)发现已经改变
rootfs.ext2: Linux rev 1.0 ext2 filesystem data, UUID=55393794-1d85-41fb-bf0c-68d94dbfaa5e
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# 

(5)将文件夹形式的根文件系统中的文件复制到挂载目录中。

root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# cp rootfs_xjh/* /mnt/LOOPDEVICE/ -rf
root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# cd /mnt/LOOPDEVICE/
root@ubuntu:/mnt/LOOPDEVICE# ls
bin  dev  etc  home  lib  linuxrc  lost+found  mnt  proc  root  sbin  sys  tmp  usr  var
root@ubuntu:/mnt/LOOPDEVICE# 

(6)取消挂载。如果提示设备忙,可能你是在要取消挂载的路径下输入取消挂载的指令。

root@ubuntu:/mnt/LOOPDEVICE# umount /dev/loop1
umount:/mnt/LOOPDEVICE:设备忙。
        (有些情况下在 lsof(8) 或 fuser(1)) 中可以找到
         有关使用该设备的进程的有用信息
root@ubuntu:/mnt/LOOPDEVICE# cd ..
root@ubuntu:/mnt# umount /dev/loop1
root@ubuntu:/mnt# df 
文件系统           1K-块      已用     可用 已用% 挂载点
udev              501320         4   501316    1% /dev
tmpfs             102540      1168   101372    2% /run
/dev/sda1       18447100  11418900  6068100   66% /
none                   4         0        4    0% /sys/fs/cgroup
none                5120         0     5120    0% /run/lock
none              512680       152   512528    1% /run/shm
none              102400        56   102344    1% /run/user
vmhgfs-fuse    248821060 166329464 82491596   67% /mnt/hgfs 
root@ubuntu:/mnt# 

(7)删除块设备。

root@ubuntu:/mnt# losetup -a
/dev/loop1: [0801]:3376 (/home/xjh/iot/embedded_basic/rootfs/rootfs.ext2)
root@ubuntu:/mnt# losetup -d /dev/loop1 #删除伪设备
root@ubuntu:/mnt# losetup -a
root@ubuntu:/mnt# losetup /dev/loop1 #查看是否有伪设备关联文件
loop: 无法获取设备 /dev/loop1 的信息:没有那个设备或地址
root@ubuntu:/mnt#

 上述步骤之后,rootfs.ext2文件就是做好的rootfs镜像,可以利用fastboot工具来进行烧录。

 类似资料: