使用 loop device 制作安装镜像

看了下,手上的镜像中,文件系统才 100 多兆,但是整个镜像居然要 4G, 这意味着,我每次安装这个镜像到 SD 卡都要花很多没必要的时间。

所以,我提取了一些关键内容,然后,准备重新打包镜像。

 

1.新建空文件。因为文件系统只有 100M,加上其它杂七杂八内容,顶多 200M,所以,先生成一个 200M 的空文件:

$dd if=/dev/zero of=test.img bs=1M count=200

2. 将空文件关联到 loop device。然后,查看哪个 loop device 是空闲的:

$sudo losetup -f
/dev/loop0

看到 loop0 空闲,那么,我们可以放心的把 loop0 关联到 test.img 文件:

$sudo losetup /dev/loop0 test.img

3. 对 loop deivce 进行分区。因为手上的镜像中有两个 ext4 类型的分区,所以,还要新建两个分区。其中,第一个分区的起始位置还有大小,以及第二个分区的起始点,是在 boot 时要用到的,所以就直接参考原镜像了。

使用 fdisk 对 /dev/loop0 进行分区:

sudo fdisk /dev/loop0

4. 将 loopdev 上的分区 map 出来。分区完后,我们并不能直接立马看到 loop device 的分区,而是要用下面语句添加 loop0 上个分区的设备文件节点:

$ sudo kpartx -av /dev/loop0
add map loop0p1 (252:0): 0 129025 linear /dev/loop0 2048
add map loop0p2 (252:1): 0 276480 linear /dev/loop0 133120

 

如此,我们就准备好了用来安装镜像的 loop 设备,以及可以安装文件系统的两个分区。把我们需要的文件 dd 到合适位置就可以了。

这里的 /dev/loop0 相当与我们使用 U 盘或 SD 卡时候的 /dev/sdx;而 /dev/mapper/loop0p1 和 /dev/mapper/loop0p2 则相当于 /dev/sdc1 和 /dev/sdc2。

 

完成后,需要逆向的操作来取消关联:

sudo kpartx -dv /dev/loop0

sudo losetup -d /dev/loop0

到此,新的 image 文件就制作好了,已经可以直接 dd 到 sd 卡上用来启动系统。

 

ps: 文件系统重新打包

其实过程和上面一样,只不过,这个 loop device 只有一个分区:

$ dd if=/dev/zero of=new.img bs=1M count=130

$ mkfs.ext4 -q new.img

$
e2label new.img rootfs

$ sudo mount -o loop new.img /media/test/

$ cp /media/iso/* /media/test/ -r -P

 

posted @ 2017-11-07 13:24  Biiigfish  阅读(853)  评论(0编辑  收藏  举报