Change root (简体中文)
Chroot 是将当前磁盘根路径(和当前进程和它们的子进程)更改到另一个根目录。当你更改根路径到另一个目录下时,你不能在那个目录外存取文件和使用命令。这个目录叫作 chroot jail。切换根目录通常为了系统维护,例如重装引导程序或者重置遗忘的密码。
必要条件
- 你需要从另一个运行的linux环境启动(例如从liveCD或USB闪存介质,或者从另一个已经安装的linux发行版中)。
- 为了chroot需要root特权。
- 确定你启动进的linux环境的架构符合你想要更改的根路径的架构(例如,i686,x86_64)。你可以用以下命令得到你的当前环境架构:
-
# uname -m
- 如果你需要任何在chroot环境中使用的内核模块,在chroot之前加载它。初始化你的swap (
swapon /dev/sdxY
)估计也很有用,并且在chroot之前建立网络连接。
挂载分区
你想尝试chroot进去的linux系统根分区需要先被挂载。为了找出内核分配的设备名称,运行:
# lsblk /dev/sda
你也能运行如下命令获取你的分区布局
# fdisk -l
现在创建一个你想要挂载root分区的目录并且挂载到它:
# mkdir /mnt/arch # mount /dev/sda3 /mnt/arch
接着,如果你的系统的其它分区有单独分区(比如说 /boot
, /home
,/var
等等),你也需要挂载他们:
# mount /dev/sda1 /mnt/arch/boot/ # mount /dev/sdb5 /mnt/arch/home/ # mount ...
尽管你chroot之后可以挂载文件系统,之前完事更加方便。原因就是你将不得不在退出chroot之前卸载临时文件系统,而这样做将让你用一个单个命令卸载所有文件系统。这也使得关机更加安全。因为外部linux环境知道所有挂载的分区,它能安全的在关机时卸载他们。
Change root
作为root挂载临时文件系统:
# cd /mnt/arch # mount -t proc proc proc/ # mount -t sysfs sys sys/ # mount -o bind /dev dev/ # mount -t devpts pts dev/pts/
如果你已经建立了一个网络连接并且想要在chroot环境中使用它,你可能不得不拷贝你的DNS服务器配置让你能够解析主机名:
# cp -L /etc/resolv.conf etc/resolv.conf
现在chroot到你之前安装的系统中并且指定你的shell
# chroot /mnt/arch /usr/bin/bash
可选地,source你的Bash配置文件(~/.bashrc
和/etc/bash.bashrc
),运行:
# source ~/.bashrc # source /etc/profile
可选的,创建一个独特的提示符来区别你的chroot环境:
# export PS1="(chroot) $PS1"
运行图形化的chroot应用
如果你在系统上运行了X,你可以在chroot环境启动图形应用。
为了chroot环境能连接到你的X服务器,在X服务器中打开一个终端(例如,在用户当前登录的桌面中),然后运行如下命令给任何人连接到用户X服务器的权限:
$ xhost +
然后,从chroot环境中将应用指向你的X服务器,将chroot中的DISPLAY环境变量设定成和拥有X服务器的用户DISPLAY变量相匹配。例如,运行:
$ echo $DISPLAY
作为拥有X服务器的用户查看DISPLAY的值。如果是“:0”(例如是),然后在chroot环境中运行
# export DISPLAY=:0
现在你可以从chroot命令行启动图形界面应用;)
系统维护
此时你可以执行任何你需要在chroot环境中执行的系统维护操作。一些常见的例子是:
退出chroot环境
当你完成系统维护后,退出chroot:
# exit
然后卸载临时文件系统和任何挂载的设备:
# umount {proc,sys,dev/pts,boot,[...],}
最后,尝试卸载你的根分区:
# cd .. # umount arch/
这之后,你可以安全地的重启了。
示例
这也许能在浏览期间保护你的系统免于网络攻击:
# # as root: # cd /home/user # mkdir myroot # pacman -S arch-install-scripts # # pacstrap must see myroot as mounted: # mount --bind myroot myroot # pacstrap -i myroot base base-devel # mount -t proc proc myroot/proc/ # mount -t sysfs sys myroot/sys/ # mount -o bind /dev myroot/dev/ # mount -t devpts pts myroot/dev/pts/ # cp -i /etc/resolv.conf myroot/etc/ # chroot myroot # # inside chroot: # passwd # set a password # useradd -m -s /usr/bin/bash user # passwd user # set a password # # in a shell outside the chroot: # pacman -S xorg-server-xnest # # in a shell outside the chroot you can run this as user: $ Xnest -ac -geometry 1024x716+0+0 :1 # # continue inside the chroot: # pacman -S xterm # DISPLAY=:1 # xterm # # xterm is now running in Xnest # pacman -S xorg-server xorg-xinit xorg-server-utils # pacman -S openbox # # for java we need icedtea-web which requires some fonts: # nano /etc/locale.gen # # uncomment en_US.UTF-8 UTF-8, save and exit # locale-gen # echo LANG=en_US.UTF-8 > /etc/locale.conf # export LANG=en_US.UTF-8 # pacman -S ttf-dejavu # pacman -S icedtea-web # pacman -S firefox # firefox # # firefox is now running in Xnest # exit # # outside chroot: # chroot --userspec=user myroot # # inside chroot as user: $ DISPLAY=:1 $ openbox & $ HOME="/home/user" $ firefox
参见: Basic Chroot