Linux下直接修改LiveCD系统

本文同步自(最佳显示效果请点击):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 系统就可以看到修改生效了。