本文同步自(最佳显示效果请点击):https://zohead.com/archives/livecd-mod-linux/
最近需要使用一个 LiveCD Linux 系统时发现原来的 root 密码忘了,无法进入系统,因此想到在另外一个 Linux 系统直接修改 LiveCD 系统里的 root 密码。
经过分析下 LiveCD 里 squashfs 文件系统的处理脚本中的流程,下面以 在 CentOS 6.1 Linux 系统中修改 RHEL 6.3 64位 USB LiveCD 为例介绍实际流程。
1、首先挂载 LiveCD 设备分区(假设为 sdb1 设备):
[root@localhost /]# mount /dev/sdb1 /mnt [root@localhost /]# ls /mnt/LiveOS/ livecd-iso-to-disk osmin.img overlay-LIVE-B2C5-F047 squashfs.img
然后查看 /mnt 挂载路径下的文件,可以在 /mnt/LiveOS 下看到 squashfs.img 这个只读的 image 这个就是初始的 Linux 文件系统。
2、挂载初始 image 映像:
[root@localhost /]# mount -t squashfs -o ro,loop /mnt/LiveOS/squashfs.img /media [root@localhost /]# mount /dev/sda3 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) nfsd on /proc/fs/nfsd type nfsd (rw) /dev/sdb1 on /mnt type vfat (rw) /mnt/LiveOS/squashfs.img on /media type squashfs (ro,loop=/dev/loop0) [root@localhost /]# ls /media/LiveOS ext3fs.img
这里将初始 image 映像挂载到 /media 路径下,需要注意的是新的 LiveCD 系统使用的基本都是最新的 squashfs 4.0 版本的映像,如果 Linux kernel 版本比较老的话可能无法正常挂载。
/media/LiveOS/ext3fs.img 就是映像中的 ext3 文件系统,如果想确认其中的内容,也可以手工挂载查看:
[root@localhost /]# mount -t ext3 -o ro,loop /media/LiveOS/ext3fs.img /misc [root@localhost /]# ls /misc bin boot dev etc home lib lib64 media misc mnt net opt proc root sbin selinux srv sys tmp usr var [root@localhost /]# umount /misc
这里我们先不直接挂载 ext3 映像,而是使用下面快照的方式生成可读写的设备。
3、生成 ext3 文件系统的 loop 设备:
[root@localhost /]# losetup -f /media/LiveOS/ext3fs.img [root@localhost /]# losetup -a /dev/loop0: [0811]:124 (/mnt/LiveOS/squashfs.img) /dev/loop1: [0700]:3 (/media/LiveOS/ext3fs.img)
完成之后使用 losetup -a 命令可以看到当前系统中所有的 loop 设备,初始 image 映像对应的 loop 设备为:/dev/loop0,ext3 loop 设备即为:/dev/loop1。
接着查看 LiveCD 设备分区中的 overlay 可读写快照文件:
[root@localhost /]# ls /mnt/LiveOS/overlay* /mnt/LiveOS/overlay-LIVE-B2C5-F047
可以看到当前的 overlay 快照文件名为:overlay-LIVE-B2C5-F047(每个 LiveCD 系统的 overlay 文件名可能都不同),下面就可以生成 overlay loop 设备了:
[root@localhost /]# losetup -f /mnt/LiveOS/overlay-LIVE-B2C5-F047 [root@localhost /]# losetup -a /dev/loop0: [0811]:124 (/mnt/LiveOS/squashfs.img) /dev/loop1: [0700]:3 (/media/LiveOS/ext3fs.img) /dev/loop2: [0811]:125 (/mnt/LiveOS/overlay-LIVE-B2C5-F047)
使用 losetup -a 命令可以看到 overlay loop 设备为:/dev/loop2。
4、生成快照 DM 设备:
[root@localhost /]# echo 0 `blockdev --getsz /dev/loop1` snapshot /dev/loop1 /dev/loop2 p 8 | dmsetup create live-rw [root@localhost /]# dmsetup ls VolGroup00-LogVol01 (253, 1) live-rw (253, 2) VolGroup00-LogVol00 (253, 0)
生成 DM 设备就需要用到上面生成的两个 loop 设备了,这里使用了 snapshot device mapper target 生成一个快照设备,/dev/loop1 表示源设备,/dev/loop2 表示存放差异数据的设备。
最终生成的 /dev/mapper/live-rw DM 设备就是我们最终需要的设备了,可以使用 dmsetup 命令查询到。
5、使用 DM 设备:
到这一步就可以直接挂载 DM 设备进行各种修改操作了:
[root@localhost /]# mount /dev/mapper/live-rw /misc [root@localhost /]# mount /dev/sda3 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) nfsd on /proc/fs/nfsd type nfsd (rw) /dev/sdb1 on /mnt type vfat (rw) /mnt/LiveOS/squashfs.img on /media type squashfs (ro,loop=/dev/loop0) /dev/mapper/live-rw on /misc type ext4 (rw) [root@localhost /]# ls /misc bin boot dev etc home lib lib64 lost+found media misc mnt net opt p proc root sbin selinux srv sys tmp usr var
修改完成之后不能忘记依次的释放操作:
[root@localhost /]# umount /misc [root@localhost /]# dmsetup remove live-rw [root@localhost /]# losetup -d /dev/loop2 [root@localhost /]# losetup -d /dev/loop1 [root@localhost /]# umount -d /media [root@localhost /]# umount /mnt
上面几步依次为卸载挂载路径及释放 loop 设备的操作,最后重启回到修改之后的 LiveCD 系统就可以看到修改生效了。