最近项目需要使用chroot环境,不了解chroot的可以自行google补脑,google做了一些了解后,发现一般有三种做法:
1 使用宿主机系统现有的文件copy一个子系统出来,copy时容易遗漏重要的文件。
2 使用makejail工具,快速生成一个chroot环境,初步了解了一下makejail工具,发现该工具是根据配置文件配置的服务生成一个环境,在软件包中自带了一些服务模版,应该可以生成能运行该服务的最小chroot环境吧。当然也可以利用多个配置文件生成一个复杂的环境。
3 使用debootstrap工具,该工具是用来构建基本的debian系统的。也就是说利用该工具可以构建一个小型系统,那我们也就可以利用该软件快速的构建一个比较完整的chroot环境了。
经过综合评估后,觉得第三种方法最适合我,虽然它构建的chroot环境会比较大,所以下面的实验就以debootstrap为基础来构建chroot环境。
物理服务器:10.1.6.235 Ubuntu 12.10
虚拟机:10.1.6.28 Ubuntu 12.10
1 安装debootstrap,它会下载并安装基本的系统组成部分
apt-get -y install debootstrap2 安装schroot,它可以用来管理chroot环境
apt-get -y install schroot3 /etc/default/schroot文件
该文件是用来管理shcroot服务停止后的默认行为的,默认不需要修改。
4 schroot配置文件目录结构:
/etc/schroot ├── buildd ├── chroot.d ├── default ├── desktop ├── minimal ├── sbuild ├── schroot.conf └── setup.d/etc/schroot/schroot.conf 这是chroot环境定义文件
5 设置/etc/schroot/schroot.conf配置文件,在文件末尾追加如下:
[test] description=user test chroot type=directory directory=/opt users=test groups=root root-groups=root6 检查配置文件是否有错误
schroot -l
可以看到名为test的chroot环境,说明是正确的。
7 利用debootstrap构建ubuntu12.10的chroot环境
debootstrap --variant=buildd --arch=amd64 quantal /opt/ http://10.1.1.187/ubuntu
可以看到根据配置文件在/opt目录下已经有了一个类似小型系统的目录
8 安装完成后,登入chroot环境
schroot -c test -u root
schroot会自动执行/etc/schroot/setup.d/底下所找到的scripts,当chroot启动时会用档名顺序并且以setup-start选项执行,而离开chroot时会用相反顺序并以setup-stop选项执行。可以在现有的配置文件中增加你想进行的动作,也可以自己建立新的script。
这样chroot环境就利用debootstrap安装完毕了,如果你认为这样就可以利用到生产环境,那就想的太简单了,我们还需要进行以下升级:
1 修改schroot的配置文件,上面我们建立了一个名为test的chroot环境,这个环境要使用到生产环境中,还需要添加一些配置参数:
[test] description=user test chroot type=directory directory=/opt users=root,test,guol root-users=root,guol groups=root root-groups=root setup.copyfiles=default/copyfiles setup.fstab=default/fstab setup.nssdatabases=default/nssdatabases shell=/bin/bash preserve-environment=true简单的解释一下各个参数:
[test]:是该chroot环境的名称
description:是对该chroot环境的描述
type:可为plain、directory、file、loopback、block-device、btrfs-snapshot、lvm-snapshot之一。其中plain和directory都是资料夹,差别在于directory 会自动执行预设的setup script和挂载一些目录,而plain什么都不会做。使用file可以直接把archive当成chroot 目标。
directory:当type为plain或directory时,用来指定目标的位置。
file:当type为file时,用来指定目标的位置。
users:原系统中可以透过schroot进入此子系统的使用者。
root-users:原系统中可以透过schroot进入此子系统并取得root权限的使用者。
groups:原系统中可以透过schroot进入此子系统的group。
root-groups:原系统中可以透过schroot进入此子系统并取得root权限的group。
setup.copyfiles:指定每次进入子系统时,原系统中会被复制进子系统的文件。
setup.fstab:指定原系统当中会被挂载进子系统的目录,格式和系统的/etc/fstab一样。 注意在预设的情况下schroot会自动把host的/home给bind 进来,如果对子系统的/home做变更,原系统也会受到影响。如果没有必要,建议注释掉该行。
setup.nssdatabases:指定每次进入子系统时,原系统中会被复制进子系统的资料库,如passwd、shadow、group等等。注意每次进入都会重新复制一次,所以在子系统内对这些资料库做的变更都会被覆写掉。这个很重要,因为我们希望在原系统增加用户,然后让该用户登陆进chroot环境,所以如果你在chroot中增加一个用户后,再次进入chroot环境时,相关文件会被原系统的覆盖掉。
shell:指定登录chroot环境后使用的shell。
2 修改登入chroot环境时默认加载的文件:
#/etc/schroot/default/copyfiles /etc/hosts /etc/resolv.conf /etc/network/interfaces /etc/apt/sources.list /etc/hostname /etc/sudoers #/etc/schroot/default/fstab /proc /proc none rw,bind 0 0 /sys /sys none rw,bind 0 0 /dev /dev none rw,bind 0 0 /dev/pts /dev/pts none rw,bind 0 0 /tmp /tmp none rw,bind 0 0 tmpfs /dev/shm tmpfs defaults 0 0 /run /run none rw,bind 0 0 /run/lock /run/lock none rw,bind 0 0 /dev/shm /dev/shm none rw,bind 0 0 /run/shm /run/shm none rw,bind 0 0 #/etc/schroot/default/nssdatabases passwd shadow group gshadow services protocols networks hosts3 修改ssh配置,让普通用户通过ssh可以直接登录进ssh环境,在openssh 4.9版本后就支持该功能了。在配置文件末尾添加如下:
#/etc/ssh/sshd_config Match User test ChrootDirectory /opt/ ForceCommand internal-sftp AllowTcpForwarding no Match User guol ChrootDirectory /opt ForceCommand internal-sftp AllowTcpForwarding no为啥一定加到ssh配置文件的末尾呢,因为Match配置段的结束是以下一个Match配置开始为止的。Match除了可以匹配user还可以根据很多选项来匹配,具体信息可以man一下。
我们先测试一下目前改进的配置
1 先测试在本机直接登录chroot环境。分别用test和guol用户测试
可以看到test用户登录进入怎么有warning提示,而guol用户登录却正常。根据提示使用--directory参数。man解释如下:
Change to directory inside the chroot before running the command or login shell. If directory is not available, schroot will exit with an error status. The default behaviour is as follows (all directory paths are inside the chroot). A login shell is run in the current working directory. If this is not available, it will try $HOME (when --preserve-environment is used), then the user's home directory, and / inside the chroot in turn. A command is always run in the current working directory inside the chroot. If none of the directories are available, schroot will exit with an error status.根据解释,在登录chroot环境的shell时,会给你选择一个登入时的目录,如果没有设置,默认选择当前执行进入chroot环境的目录,如果当前目录不可用,则会寻找你的家目录、然后寻找根目录。看来执行schroot登录chroot时还和当前上下文有关系。chroot环境重肯定没有/etc/schroot目录了,并且我们在fstab的bind时把/home目录给取消掉了,所以在chroot环境中并没有相关用户的家目录。
改进之后如下:
2 测试通过ssh直接登陆进chroot环境
这样基本的配置就已经操作完毕,各位可以根据具体需求对chroot环境进行深度定制。
在chroot环境中使用apt-get时,遇到了以下一个错误:
dpkg: unrecoverable fatal error, aborting: syntax error: unknown group 'ssl-cert' in statoverride file E: Sub-process /usr/bin/dpkg returned an error code (2)提示在使用dpkg时系统没有ssl-cert组,但是看了宿主系统的group文件,也没有该组,新键该组后就可以正常使用了。
如果不想使用schroot管理chroot环境,也可以在使用debootstrap安装完小型chroot环境后,执行如下操作:
cp /etc/resolv.conf /opt/etc/resolv.conf
cp /etc/resolv.conf /opt/etc/resolv.conf
cp /etc/hosts /opt/etc/hosts
cp /etc/network/interfaces /opt/etc/network/interfaces
cp /etc/apt/sources.list /opt/etc/apt/sources.list
cp /etc/hostname /opt/etc/hostname
cp /etc/sudoers /opt/etc/sudoers
cp /etc/passwd /opt/etc/passwd
cp /etc/shadow /opt/etc/shadow
cp /etc/group /opt/etc/group
cp /etc/gshadow /opt/etc/gshadow
cp /etc/services /opt/etc/services
cp /etc/protocols /opt/etc/protocols
cp /etc/networks /opt/etc/networks
mount -o bind /proc /opt/proc
mount -o bind /dev /opt/dev
mount -o bind /dev/pts /opt/dev/pts
mount -o bind /dev/shm /opt/dev/shm
mount -o bind /tmp /opt/tmp
mount -o bind /home /opt/home
mount -o bind /sys /opt/sys
以上操作类似于shcroot管理chroot环境时做的初始化。
参考:
http://www.ibm.com/developerworks/cn/aix/library/au-new_openssh/index.html?ca=drs-?
http://ftp.gnumonks.org/pub/doc/chroot-howto.html
https://help.ubuntu.com/community/DebootstrapChroot
http://www.option-c.com/xwiki/Create_a_Debian_VM_with_debootstrap