利用chroot修复Linux系统问题
Tofloor
poster avatar
MattD
deepin
2014-05-12 08:31
Author
在某些情况下,我们可能操作上稍有不慎而导致系统整个挂掉,例如,不小心删除了内核而导致系统无法启动。

这个时候,可以利用chroot来修复这些小问题。当然,chroot的作用远不止于此,我只是以这一典型案例来说明chroot的作用。

前提条件:需要有一张LiveCD,理论上任何发行版的都可以,除非LiveCD的某些环境变量(如全局$PATH)和目标系统有太大差距。我在这里使用的是Deepin 2014 alpha的LiveCD。

直接进入手头的LiveCD环境,分别将目标系统的/分区(如果/usr、/boot、/var等挂载点单独进行了分区,也请按照系统结构相应挂载,不需要挂载/home)和几个虚拟文件系统挂载到/mnt。以我的为例,目标系统的/为/dev/sdc4,/boot为/dev/sdc2。注意,因为我用btrfs+subvolume将多个发行版安装到了同一分区,因此我需要用-o subvol=deepin来指定要挂载的subvolume。否则,一般情况下直接mount即可。

为了方便起见,我直接切换到root进行操作:
  1. deepin@deepin:~$ sudo -i
  2. root@deepin:~# mount -o subvol=deepin /dev/sdc4 /mnt
  3. root@deepin:~# mount --bind /dev /mnt/dev
  4. root@deepin:~# mount --bind /dev/pts /mnt/dev/pts
  5. root@deepin:~# mount --bind /proc /mnt/proc
  6. root@deepin:~# mount --bind /sys /mnt/sys
  7. root@deepin:~# mount /dev/sdc2 /mnt/boot
Copy the Code
确保LiveCD已联网,然后把LiveCD环境下的/etc/resolv.conf复制到目标系统中去:
  1. cp /etc/resolv.conf /mnt/etc/
Copy the Code
如果你在LiveCD中的网络环境和你之前使用目标系统时的网络环境一致,那么应该会看到以下提示:
  1. root@deepin:~# cp /etc/resolv.conf /mnt/etc/
  2. cp: "/etc/resolv.conf" 与"/mnt/etc/resolv.conf" 为同一文件
Copy the Code
此时直接忽略即可。

做完这些步骤之后,就可以chroot过去了,然后像平常一样,直接操作安装缺少的内核即可:
  1. apt-get install linux-image-3.13.0-24-generic linux-headers-3.13.0-24-generic
Copy the Code
内核安装完之后会自动触发update-grub,只要目标系统的/etc/mtab没问题,grub就可以根据这个文件正确探测到/文件系统并生成grub配置文件。

OK了,别忘了先卸载掉所有挂载的文件系统:
  1. umount -l /mnt/{dev/pts,dev,sys,proc}
  2. umount /mnt/boot
  3. umount /mnt
Copy the Code
然后重新启动即可。
Reply Favorite View the author
All Replies
Bluek404
deepin
2014-05-12 08:56
#1
这个说的就是我啊 :cry:
Reply View the author
electricface
deepin
2014-05-12 18:59
#2
我喜欢写成一行
for m in dev dev/pts proc sys ;do mount --bind /$m /mnt/$m ;done
Reply View the author