Chroot

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Chroot and the translation is 100% complete.

Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎italiano • ‎日本語 • ‎한국어 • ‎português do Brasil • ‎русский • ‎Türkçe • ‎中文(中国大陆)‎


Resources

Chroot (Change Root) 是一个Unix系统应用,用来改变根目录来创建一个与主系统隔离的新环境。这个新环境就是著名的“Chroot监狱(chroot jail)。”用户在这个“监狱”中进行的操作,不能访问和读写此环境之外的数据文件。

任何Chroot之后的操作都是为了在当前环境中创建一个虚拟Linux系统,来测试系统及软件的兼容性。Chroot一般被视为一个轻量级的虚拟环境,因为它可以不依赖虚拟化环境来运行。

准备

设置环境

当你创建一个新的环境时,首先要做的就是创建一个你将chroot进入的目录,比如 /mnt/mychroot:

user $mkdir /mnt/mychroot
user $cd /mnt/mychroot

如果你想挂载一个已经装好系统的分区,你可以使用以下命令。一定要更换 <DEVICE>字符串,在下面的驱动器和现有安装的分区中,例如:

user $mkdir /mnt/mychroot
user $mount /dev/DEVICE /mnt/mychroot

如果你有一个已经安装在根目录下某个子目录中的系统,就不需要再做上述操作。

为新建环境解压系统文件和portage树(新安装)

当你已经开始安装,下一步就是下载stage3和portage包,并将它们放到要chroot的位置。获取此操作更多信息,请看Gentoo Handbook中的Downloading the stage tarballUnpacking the stage tarball章节。

root #tar xvjpf stage3-*.tar.bz2 -C /mnt/mychroot
root #tar xvjf portage-*.tar.bz2 -C /mnt/mychroot/usr

配置

在进入chroot之前,我们挂载一些目录。

root #mount --rbind /dev /mnt/mychroot/dev
root #mount --make-rslave /mnt/mychroot/dev
root #mount -t proc /proc /mnt/mychroot/proc
root #mount --rbind /sys /mnt/mychroot/sys
root #mount --make-rslave /mnt/mychroot/sys
root #mount --rbind /tmp /mnt/mychroot/tmp

然后你还要从主系统复制一些基本配置文件,如果你使用一个已装好的系统,就不要复制make.conf

user $cp /etc/portage/make.conf /mnt/mychroot/etc/portage # 如果你使用一个已装好的系统,请忽略这条命令。
user $cp /etc/resolv.conf /mnt/mychroot/etc

使用

做完这几步,你就可以通过执行下面的命令chroot进入新环境了。

root #chroot /mnt/mychroot /bin/bash
root #env-update
root #source /etc/profile
root #export PS1="(chroot) $PS1"

创建好环境后,你就应该同步portage,更新到最新状态。

root #emerge --sync

现在系统就已经准备好了,你可以安装软件、随意设置、测试包和配置环境,都不会影响到你的主系统。离开chroot环境只需要输入exit,或者按Ctrl+d键,将会回到你的控制台。最后不要忘记unmount你已经挂载的目录。

初始化脚本

如果你需要经常这样做,可以用一个初始化脚本来实现快速挂载你所需要的chroot目录。这个脚本可以添加到默认运行级别进而在系统引导时自动设置。

FILE /etc/init.d/mychroot
#!/sbin/openrc-run
 
depend() {
   need localmount
   need bootmisc
}
 
start() {
     ebegin "Mounting chroot directories"
     mount -o rbind /dev /mnt/mychroot/dev > /dev/null &
     mount -t proc none /mnt/mychroot/proc > /dev/null &
     mount -o bind /sys /mnt/mychroot/sys > /dev/null &
     mount -o bind /tmp /mnt/mychroot/tmp > /dev/null &
     eend $? "An error occurred while mounting chroot directories"
}
 
stop() {
     ebegin "Unmounting chroot directories"
     umount -f /mnt/mychroot/dev > /dev/null &
     umount -f /mnt/mychroot/proc > /dev/null &
     umount -f /mnt/mychroot/sys > /dev/null &
     umount -f /mnt/mychroot/tmp > /dev/null &
     eend $? "An error occurred while unmounting chroot directories"
}

当你正在使用其他目录或分区,在the start()部分添加必要的挂载命令,另外,如果你使用的不同目录名,修改/mnt/chroot为适当的名字即可。

另请参阅