一、什么是chroot
chroot,顾名思义,就是change root,我们都知道Linux有个权限最高的用户root,同时也有个根目录root,通过change,就可以切换程序工作的目录和系统了。因为在切换后,程序就只能访问到chroot后的系统和用户目录,这实际上就相当于是做了一个简单的隔离。因此,使用chroot可以带来如下好处:
1、增加了系统的安全性,同时可以限制用户的权力。
chroot 之后,在新root下旧系统的根目录结构和文件是访问不到的,这样就增强了系统的安全性。
2、可以建立一个与原系统隔离的系统目录结构。
使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。是不是很像docker?
3、切换系统的根目录位置,这样就可以在原系统启动不了时进行修复。
chroot 的作用就是切换系统的根位置,当系统出现一些问题时,
我们也可以使用 chroot 来切换到一个临时的系统。明明是从临时的系统切换到正式的系统。
二、啥是livecd?
一些 Linux 发行版,比如 Ubuntu,允许直接从 LiveCD 安装整个发行版。这使你可以从 CD 引导启动,先体验一下此 Linux 发行版,如果喜欢的话,再把它安装到硬盘上。这个功能极其方便易用。当然,这个CD只是可移动存储介质的代称,更多的只是指代这一类设备,并不是真正的光盘。
它很像是Windows的PE,相当于一个简化的系统。不过,它又比Windows的PE要复杂得多,可以看成是一个完整的系统。不过,这玩意儿因为是运行在移动介质上的,多少会受这些设备的性能影响。而且,用户在使用时产生的数据是临时的,重启即恢复。我就见过有小公司因为运维人员粗心,把livecd当生产环境的,然后某次重启....
三、如何使用
首先需要确保你的设备能满足启动Ubuntu的安装镜像,不要一按回车,就直接黑屏。没错,还记得你安装Ubuntu时做的哪个安装U盘吗?其实你安装时就是在livecd环境里进行的,只不过当你点击intsall ubuntu时,它启动的是安装程序罢了。
你可以选择试用Ubuntu,这样GUI会重新加载,然后你就可以进入livecd了。
进去后,直接打开终端,输入sudo fdisk -l
sudo fdisk -l
Disk /dev/nvme0n1: 119.24 GiB, 128035676160 bytes, 250069680 sectors
Disk model: SAMSUNG MZVLW128HEGR-000L2
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F23679DC-240C-4505-8F9F-461929C20B13
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 194559 192512 94M EFI System
/dev/nvme0n1p2 194560 250068991 249874432 119.1G Linux filesystem
Disk /dev/sda: 298.09 GiB, 320072933376 bytes, 625142448 sectors
Disk model: WDBUZG5000ABK-0B
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 527291D8-5A89-4EDC-AC22-E75E84E10298
Device Start End Sectors Size Type
/dev/sda1 2048 625141759 625139712 298.1G Linux filesystem
Disk /dev/zram0: 9.22 GiB, 9904779264 bytes, 2418159 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
这句命令列出了这台设备上的所有存储设备和硬盘上的分区,你可以在这里面很清楚的看到。
假定我现在的这个系统挂掉了,现在想进入这个系统去救援。现在就需要确定自己的之前的/
是哪一个分区,通过输出的标识/dev/nvme0n1p2 194560 250068991 249874432 119.1G Linux filesystem
,我可以确认/dev/nvme0n1p2
,这个设备就是我的/
目录,现在我要把它挂载到当前livecd系统的/mnt
下面:
然后依次输入:
sudo mount -t proc /proc /mnt/proc
sudo mount --rbind /sys /mnt/sys
sudo mount --rbind /dev /mnt/dev
sudo mount --rbind /run /mnt/run
把这些所需要的系统环境依次挂载到要修复的系统里。
注意,在Debian和早期版本的Ubuntu内,你还需要额外配置resolv.conf
,路径在/etc/
里,不然你的dns解析是有问题的,会上不了网。
如果不幸碰到了,把livecd里的复制一份过去,替换掉就可以了,记得做好备份。
最后
sudo chroot /mnt
你会发现用户名和@的设备变了。
当前是坏掉系统里的root
,我们切换用户:
假设用户名是abc
然后输入su abc
,输入之前的密码就完成了切换,现在就可以做你想做的事情了。