• 回环设备(/dev/loop*)与losetup命令


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

    一、前言

    之前曾利用losetup命令进行根文件系统镜像文件的制作,但不明白其命令含义。

     

    二、回环设备

    命名方式

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

    回环设备的含义

    回环设备是一种伪设备,是使用文件来模拟块设备的一种技术。它允许用户以一个普通磁盘文件来虚拟一个块设备。设想有一个磁盘设备,系统对它的所有读写操作,都将被重定向到操作一个普通文件,而非操作实际磁盘或者分区的轨道和扇区。文件模拟成块设备后,就可以像磁盘或光盘一样使用。比如像一个磁盘设备一样被mount起来。

    在使用之前,一个回环设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。

    当我们还需要使用一个分区的时候如果不想从磁盘中再进行分区,这个时候就可以通过/dev/loop来进行管理操作。但是这种伪设备只能像访问普通文件一样,不能像实际的磁盘通过扇区读写访问。

    之所以叫回环设备,其实是从文件系统这一层来考虑的,因为这种被 mount 起来的镜像文件它本身也包含有文件系统,通过回环设备把它mount起来,就像文件系统之上再绕了一圈的文件系统,所以称为回环。

    应用的例子

    比如将另外一种文件系统的镜像文件保存到一个文件中,例如iso文件,然后将一个回环设备指向该文件,之后我们就可以将该回环设备挂载到主文件系统的一个目录下,就可以像访问一个文件系统一样,正常地访问该镜像中的内容。

    其他说明

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

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

    (3)一般在linux中会有8个loop设备,一般是/dev/loop0~loop7,可用通过losetup -a查看所有的loop设备,如果命令没有输出就说明所有的loop设备都没有被占用。

    三、简单使用

    制作根文件系统的步骤:制作ext2格式的根文件系统镜像_天糊土的博客-CSDN博客

    (1)创建一个文件

    1. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# ls
    2. rootfs.ext2 rootfs_xjh tmp
    3. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# rm rootfs.ext2
    4. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# dd if=/dev/zero of=./rootfs.ext2 bs=1024 count=10240
    5. 记录了10240+0 的读入
    6. 记录了10240+0 的写出
    7. 10485760字节(10 MB)已复制,0.146392 秒,71.6 MB/秒
    8. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# ls
    9. rootfs.ext2 rootfs_xjh tmp
    10. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# du rootfs.ext2 -h
    11. 10M rootfs.ext2
    12. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs#

    (2)使用losetup命令,把伪设备/dev/loop*关联到常规文件中。

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

    (3)上述步骤后,我们就得到一个磁盘,可以将这磁盘格式化为任意系统。比如利用mke2fs命令制作ext2文件系统。

    1. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# mke2fs -m 0 /dev/loop1 10240
    2. mke2fs 1.42.9 (4-Feb-2014)
    3. Discarding device blocks: 完成
    4. 文件系统标签=
    5. OS type: Linux
    6. 块大小=1024 (log=0)
    7. 分块大小=1024 (log=0)
    8. Stride=0 blocks, Stripe width=0 blocks
    9. 2560 inodes, 10240 blocks
    10. 0 blocks (0.00%) reserved for the super user
    11. 第一个数据块=1
    12. Maximum filesystem blocks=10485760
    13. 2 block groups
    14. 8192 blocks per group, 8192 fragments per group
    15. 1280 inodes per group
    16. Superblock backups stored on blocks:
    17. 8193
    18. Allocating group tables: 完成
    19. 正在写入inode表: 完成
    20. Writing superblocks and filesystem accounting information: 完成
    21. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs#

    (4)将该磁盘挂载到主文件系统中的一个目录。这里挂载到/home/xjh/iot/embedded_basic/rootfs/rootfsxjh目录。

    1. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# ls
    2. rootfs.ext2 rootfsxjh rootfs_xjh tmp
    3. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# mount -t ext2 /dev/loop1 ./rootfsxjh/
    4. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# df -h
    5. 文件系统 容量 已用 可用 已用% 挂载点
    6. udev 490M 4.0K 490M 1% /dev
    7. tmpfs 101M 1.2M 100M 2% /run
    8. /dev/sda1 18G 14G 3.5G 80% /
    9. none 4.0K 0 4.0K 0% /sys/fs/cgroup
    10. none 5.0M 0 5.0M 0% /run/lock
    11. none 501M 228K 501M 1% /run/shm
    12. none 100M 48K 100M 1% /run/user
    13. vmhgfs-fuse 238G 194G 44G 82% /mnt/hgfs
    14. /dev/loop1 9.7M 92K 9.6M 1% /home/xjh/iot/embedded_basic/rootfs/rootfsxjh
    15. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# fdisk -l /dev/loop1
    16. Disk /dev/loop1: 10 MB, 10485760 bytes
    17. 255 heads, 63 sectors/track, 1 cylinders, total 20480 sectors
    18. Units = 扇区 of 1 * 512 = 512 bytes
    19. Sector size (logical/physical): 512 bytes / 512 bytes
    20. I/O size (minimum/optimal): 512 bytes / 512 bytes
    21. Disk identifier: 0x00000000
    22. Disk /dev/loop1 doesn't contain a valid partition table
    23. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs#

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

    即把/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh中的内容,拷到/home/xjh/iot/embedded_basic/rootfs/rootfsxjh目录中。

    1. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# ls
    2. rootfs.ext2 rootfsxjh rootfs_xjh tmp
    3. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# cp ./rootfs_xjh/* ./rootfsxjh/ -rf
    4. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# cd rootfsxjh/
    5. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs/rootfsxjh# ls
    6. bin dev etc home lib linuxrc lost+found mnt proc root sbin sys tmp usr var
    7. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs/rootfsxjh#

    (6)取消挂载与删除块设备。

    如果取消挂载时提示设备忙,参考umount报错设备繁忙(device is busy)怎么处理(另外也有一种可能,你是在(要取消挂载的)路径下输入取消挂载的指令)。

    1. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs/rootfsxjh# umount /dev/loop1
    2. umount:/home/xjh/iot/embedded_basic/rootfs/rootfsxjh:设备忙。
    3. (有些情况下在 lsof(8) 或 fuser(1)) 中可以找到
    4. 有关使用该设备的进程的有用信息
    5. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs/rootfsxjh# cd ..
    6. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# umount /dev/loop1
    7. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# df
    8. 文件系统 1K-块 已用 可用 已用% 挂载点
    9. udev 501320 4 501316 1% /dev
    10. tmpfs 102540 1128 101412 2% /run
    11. /dev/sda1 18447100 13852488 3634512 80% /
    12. none 4 0 4 0% /sys/fs/cgroup
    13. none 5120 0 5120 0% /run/lock
    14. none 512680 228 512452 1% /run/shm
    15. none 102400 48 102352 1% /run/user
    16. vmhgfs-fuse 248821060 202918208 45902852 82% /mnt/hgfs
    17. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# losetup -d /dev/loop1 //删除伪设备
    18. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# losetup -a
    19. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs# losetup /dev/loop1 //查看是否有伪设备关联文件
    20. loop: 无法获取设备 /dev/loop1 的信息:没有那个设备或地址
    21. root@ubuntu:/home/xjh/iot/embedded_basic/rootfs#

    (7)完成上述步骤之后,得到的rootfs.ext2就是做好的rootfs镜像,可以利用fastboot工具来进行烧录。

  • 相关阅读:
    【nginx】Nginx配置:
    并发编程-线程池底层原理
    FRED应用:激光二极管光源耦合到光纤的仿真
    mysql创建用户以及给用户授予权限
    一文读懂LockSupport
    【GEE】6、在 Google 地球引擎中构建各种遥感指数
    排序算法3:归并排序与计数排序
    springboot和spring使用@Async注意事项
    SpringBoot+Vue+Element-UI实现家具商城系统
    双边滤波算法及例程
  • 原文地址:https://blog.csdn.net/oqqHuTu12345678/article/details/126139462