以下内容源于网络资源的学习与整理,如有侵权请告知删除。
一、回环设备
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工具来进行烧录。