schroot,chroot
debian schroot
http://zh.wikipedia.org/wiki/Chroot
chroot是在unix系统的一个操作,用于对当前的程序和它的子进程改变真实的磁盘根目录。一个被改变根目录的程序不可以访问和命名在被改变根目录外的文件,那个根目录叫做“chroot监狱(chroot jail,chroot prison)”,chroot这一特殊表达可能指chroot(2)系统调用或chroot(8)前端程序。
http://www.linuxsir.org/bbs/thread332733.html
前言 这是一个小技巧,技术含量不算高,只想把前几天修理系统的一点心得分享一下而矣,四方高人请勿掷鸡蛋 :) 先决条件: 1. 网络必需正常 2. 待修理(处理)系统的 apt-get、dpkg 命令能正常使用 3. Linux LiveCD 一张作启动盘 万一受损系统不能使用 apt-get、dpkg,那麽可能要先用此法先行修理了 用 Knoppix 修理 Debian 系统 情景 办工室原有一台用作打印机服务器的 Debian 系统硬盘传输线突然坏了,引起不寻常的数据丢失,部份系统文件也损毁了,系统也无法起动。硬件修理的部份就不作描述了,主要分享的是软件修理的过程。 待修理(处理)系统分区布局如下: sda1 / sda2 /var sda3 swap 修理部骤 1. 用 Linux LiveCD (如 Knoppix、Kanotix 或较新的 Sidux 之类)启动,我自己比较喜欢用较新的 Sidux 及 SystemRescueCD 等 2. 找出可用的源的 IP 地址 如源里使用 deb http://http.us.debian.org/debian/ unstable main contrib non-free 於是执行 #ping http.us.debian.org Pinging http.us.debian.org [128.30.2.36].... 可以得出 http.us.debian.org 的 IP 地址是 128.30.2.36,在下面有机会用上的 3. 挂载待修理系统,现在是 sda1 #mount /dev/sda1 /mnt/sda1 4. 由於 /var 是独立分区,所以操作前也需要先挂载好 #mount /dev/sda2 /mnt/sda1/var 假如有其他独立分区,如法加载就行 5. 用 chroot 转到 sda1 #chroot /mnt/sda1 6. 挂载 chroot 环境下的 /proc #mount -t proc proc /proc 7. 修改 chroot 环境下的 /etc/apt/sources.list (sda1 里的 sources.list) 在 chroot 环境下会有机会无法解释域名,因此可能需要将域名转为 IP 地址,如 deb http://http.us.debian.org/debian/ unstable main contrib non-free 改为 deb http://128.30.2.36/debian/ unstable main contrib non-free 当然,如果在 chroot 环境下可以解释域名的话,此步可以省略。 8. 更新 #apt-get update #apt-get ....... (重裝、更新软件等) 9. 离开 chroot 环境 #umount /proc #exit 10. 完成 #reboot 重启,再把 /etc/apt/sources.list 改回原有的域名。 好了,企鹅仔重现,大功告成。 ![]() PS:还有其他小贴士集合在此 【毁灭小贴士】集合 :) |
http://novus.pixnet.net/blog/post/29322140-%E5%A5%BD%E7%94%A8%E7%9A%84-schroot
最近需要編譯一個很挑剔 gcc 和 glibc 版本、而且作者疑似已經沒有繼續維護的程式。雖然是可以裝多套 gcc 和 glibc,然後以不同的 suffix 和 spec file 切換使用,但我實在不願意去更動那個脆弱的 makefile,所以 chroot 自然成為最有經濟效益的方案。
我研究了一下如何自動幫 chroot 設定環境,於是找到了 schroot,花了一點時間了解之後我幾乎不會想再回去用原有的 chroot 指令。可惜的是網路上關於這個工具的介紹並不多,很多人就只是當成不用 root 權限的 chroot 來用,還有一些讓我不能理解的文章,明明花了篇幅去安裝 schroot 並且撰寫設定檔,結果最後卻還是用原始的 chroot.....
schroot 也是建立在 chroot 之上,但是比起後者有以下的優點:
- 不需要 root 權限。使用 root 權限進入 chroot 環境還是有潛在危險性。
- 可以很方便的設定多個環境。
- 自動化。可以設定進入環境時自動複製檔案、mount 位置、執行程序等等;並且在離開的時候把這些變更還原。
- 可以直接從 disk image 或 archive 進 chroot
撰寫配置檔
使用 schroot 之前要先建立偽系統目錄的內容,可使用 debootstrap 或直接從系統中複製一份,這裡不多說明。接下來要編輯 schroot.conf,對於隨用即丟的環境似乎稍微麻煩一點,這種情況直接用系統的 chroot 命令會比較單純。但對於打算重複使用的環境來說,只要一次把配置檔寫好以後就可以直接進入,還算蠻方便的。
主要配置檔位於 /etc/schroot/schroot.conf,次要配置檔放在 /etc/schroot/chroot.d,兩者的差別我不太清楚,用前者就可以了。配置檔的寫法和 Windows 的 ini 差不多,大概像這樣:
[hardy_amd64] type=directory description=Ubuntu 8.04 Hardy for amd64 directory=/srv/chroot/hardy64 root-users=foo users=foo,bar [sid_file] type=file description=Debian sid file-based chroot file=/srv/chroots/sid.tar.gz priority=3 groups=sbuild
簡單的說明
- 區段名稱和 description 可依個人偏好命名。
- 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-user: 原系統中可以透過 schroot 進入此子系統並取得 root 權限的使用者。
我懶得打了,請參考:http://manpages.ubuntu.com/manpages/natty/man5/schroot.conf.5.html
把配置存檔後可以用以下命令列舉
$ schroot -l
假如 hardy_amd64 有出現在上面的列表中,執行
$ schroot -c hardy_amd64 -u <使用者名稱>
複製與掛載檔案
由於我實在沒時間寫教學文章,以下虎頭蛇尾的點到為止,僅提供一些資訊給有興趣的人。
在 /etc/schroot/default 下面有幾個檔案,主要的功能為
- fstab
- 指定原系統當中會被掛載進子系統的目錄,格式和系統的 /etc/fstab 雷同。注意在預設的情況下 schroot 會自動把 host 的 /home 給 bind 進來,這點和 dchroot 或 chroot 不同,如果對子系統的 /home 做變更,原系統也會受到影響。這個行為可以透過編輯 fstab 加以調整,把 /home 那行註解掉即可。
- copyfiles
- 指定每次進入子系統時,原系統中會被複製進子系統的檔案
- nssdatabases
- 指定每次進入子系統時,原系統中會被複製進子系統的資料庫,如 passwd、shadow、group 等等。注意每次進入都會重新複製一次,所以在子系統內對這些資料庫做的變更都會被覆寫掉。不希望這個行為可以更改此檔案。
這裡使用的是 Ubuntu Natty 所對應的版本,舊版可能會叫做 fstab-default、copyfiles-default 這些名稱。
自動執行 script
schroot 會自動執行 /etc/schroot/setup.d/ 底下所找到的 scripts,當 chroot 啟動時會用檔名順序並且以 「setup-start」選項執行,而離開 chroot 時會用相反順序並以「setup-stop」選項執行。可以在現有的檔案中增加你想進行的動作,也可以自己建立新的 script。
其他參考資料
http://manpages.ubuntu.com/manpages/natty/man1/schroot.1.html
http://manpages.ubuntu.com/manpages/natty/man5/schroot-setup.5.html
http://manpages.ubuntu.com/manpages/natty/man7/schroot-faq.7.html
http://jacky.aiwaly.com/wp/schroot-chroot-for-any-users.html
转载本站文章请注明,转载自: 月影鹏鹏 [http://Jacky.Aiwaly.com]
本文链接: http://jacky.aiwaly.com/wp/schroot-chroot-for-any-users.html
From manpages: schroot allows the user to run a command or a login shell in a chroot environment. If no command is specified, a login shell will be started in the user current working directory inside the chroot.
I’ve been trying some virtual machines solutions to execute some programs 32bits in my machine. But it’s take very time, start a xen VM or virtualbox. Often this solutions needs some maintain additional costs to setup a X server to run any X-based program.
My initial motivation was that wengophone wasn’t in Debian lenny for amd64 until some days ago. Thus I did want to run a x-based program in a single chroot as normal user.
The schroot makes a chroot’s use easy! Very easy for end users.
- install into your original installation:
# aptitude install schroot
- configure the /etc/schroot/schroot.conf like:
[sid] description=Debian sid (unstable) type=directory location=/srv/chroot/sid priority=3 users=YOUR_USER groups=SOME_GROUP_LIKE_users root-groups=YOUR_ADMIN_USER run-setup-scripts=true run-exec-scripts=true
- creating a chroot:
# debootstrap --arch i386 sid /srv/chroot/sid http://ftp.br.debian.org/debian
- installing 32bit programs in the chroot:
# schroot -c sid -p aptitude install wengophone
- to run X programs make sure that your X session accept it and execute the schroot:
$ xhost + $ schroot -c sid -p wengophone
- there is a more safer way to run X programs like comments below and a example of wengophone_wrapper script
- it isn’t need mount /proc on fstab or other because run-setup-scripts and run-exec-scriptstake care of this, but you should look the /etc/schroot/mount-defaults to set your specific directories
Shortcuts:
- create a wrapper script /usr/local/bin/wengophone_wrapper:
#!/bin/bash ## UPDATED after the comment #16 to reduce security risk
# right way for export Xauthority file xauth extract /srv/chroot/sid$HOME/.Xauthority $DISPLAY # run your command schroot -c sid -p wengophone # remove the Xauthority rm -f /srv/chroot/sid$HOME/.Xauthority
- permissions :
# chmod +x /usr/local/bin/wengophone_wrapper
- now you could create some wengo.desktop for your users
PS: maybe wengophone example it’s trivial, but try it with others programs only 32bit like the non-free skype
使用openssh的新特性构建chroot环境
一、简述:
chroot 即 change root directory (更改 root 目录) 。在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置。
二、为什么要使用chroot
在经过 chroot 之后,系统读取到的目录和文件将不在是真实系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:
* 增加了系统的安全性,限制了用户的权力;
* 建立一个与原系统隔离的系统目录结构,方便用户的开发;
* 可以限制chroot用户的命令使用
三、目的:可开放chroot帐号供开发人员web服务器上查看日志,分析问题等。
四、chroot环境部署
如果是5.5的系统,需要升级openssh,本文是在6.2和5.5中都有使用。
#建立帐号
echo "www.elain.org" | passwd --stdin rd
#下载chroot环境
wget http://ebook.elain.org/tools/chroot_v1.0.tar.gz
tar zxvf chroot_v1.0.tar.gz
chown rd.rd /home/chroot/home/rd
rm -rf chroot_v1.0.tar.gz
#注:以上是我做好的chroot环境,大家可以直接下载使用,也可以自己去做。
#启用ssh 的chroot
#chroot
Match User rd
ChrootDirectory /home/chroot
EOF
/etc/init.d/sshd restart
#挂载日志目录
使用rd登录测试!!!
五、openssh升级(for centos 5.5)
1.升级sshd前准备
mkdir -p /opt/soft/src && cd /opt/soft/src
wget http://ftp.bit.nl/mirror/openssh/portable/openssh-5.9p1.tar.gz
#备份现有ssh
cp /etc/init.d/sshd /etc/init.d/sshd.bak
2.安装sshd
tar zxf openssh-5.9p1.tar.gz
cd openssh-5.9p1
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-zlib --with-md5-passwords
make
rpm -e --nodeps openssh-server-4.3p2-41.el5
rpm -e --nodeps openssh-4.3p2-41.el5
make install
mv /etc/init.d/sshd.bak /etc/init.d/sshd
touch /etc/ssh/ssh_host_ecdsa_key
touch /etc/ssh/ssh_host_ecdsa_key.pub
mkdir -p /var/empty/sshd/etc
#重启sshd.
升级成功.
创建chroot环境的脚本
(2013-03-12 16:54:55)http://www.systemonix.com/2012/06/chroot-linux.html
#!/bin/bash
#
# Author: Pravin Rane
#
# This script creates chroot env. Change CHROOT variable as per your requirement
# Tested on RHEL5, CentOS5, Fedora5
CHROOT="/home/chroot"
echo "chroot is $CHROOT"
echo "Creating directory sturcture"
mkdir $CHROOT
cd $CHROOT
mkdir home
mkdir etc
mkdir etc/security
mkdir bin
mkdir lib
mkdir usr
mkdir usr/bin
mkdir usr/share
mkdir usr/share/locale
mkdir var
mkdir var/log
mkdir proc
mkdir dev
mkdir dev/pts
mknod dev/null c 1 3
mknod dev/zero c 1 5
mknod dev/random c 1 8
mknod dev/tty c 5 0
chown root.tty dev/tty
chmod 666 dev/tty
mknod dev/ptmx c 5 2
# Copy basic files
echo "Copying config files"
cp -pr /etc/skel /etc/environment /etc/passwd /etc/group /etc/localtime $CHROOT/etc/
cp -p /etc/security/console.handlers /etc/security/pam_env.conf $CHROOT/etc/security/
cp -p /var/log/lastlog $CHROOT/var/log/
cp -pr /usr/share/locale/en /usr/share/locale/en_US /usr/share/locale/locale.alias $CHROOT/usr/share/locale
COMMANDS="/bin/bash /bin/ls /bin/mkdir /bin/mv /bin/pwd /bin/rm /usr/bin/id /usr/bin/ssh /bin/ping /usr/bin/dircolors"
for prog in $COMMANDS; do
cp $prog ./$prog
# obtain a list of related libraries
ldd $prog > /dev/null
if [ "$?" = 0 ] ; then
LIBS=`ldd $prog | awk '{ print $3 }'|grep -v 0x`
for l in $LIBS; do
mkdir -p ./`dirname $l` > /dev/null 2>&1
cp -p $l ./$l
done
fi
done
# Copy extra libraries
echo "Copying extra libraries"
PLDD=`which ldd`
LDD=`grep RTLDLIST= $PLDD|awk -F'=' '{print $2}'`
mkdir -p $CHROOT/`dirname $LDD` > /dev/null 2>&1
cp -p $LDD $CHROOT/$LDD
if [ $? -eq 0 ]; then
echo ".."
echo "Chroot is successfully created at $CHROOT"
echo "1. Mount proc and devpts now using following commands"
echo "mount proc $CHROOT/proc -t proc"
echo "mount devpts $CHROOT/dev/pts -t devpts -o gid=5,mode=620"
echo ""
echo "2. Do the changes in syslogd as mentioned in script and restart it."
echo "Your syslogd's extra socket should be at $CHROOT/dev/log"
echo ""
echo "As a root run command \"chroot $CHROOT\" to test your setup"
fi
最近项目需要使用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,它会下载并安装基本的系统组成部分
1 |
apt-get -y install debootstrap |
1 |
apt-get -y install schroot |
该文件是用来管理shcroot服务停止后的默认行为的,默认不需要修改。
4 schroot配置文件目录结构:
1 |
/etc/schroot |
2 |
├── buildd |
3 |
├── chroot.d |
4 |
├── default |
5 |
├── desktop |
6 |
├── minimal |
7 |
├── sbuild |
8 |
├── schroot.conf |
9 |
└── setup.d |
/etc/schroot/chroot.d 该目录是额外的chroot环境的配置文件存放目录
/etc/schroot/setup.d 该目录是chroot建立过程的setup文件目录
5 设置/etc/schroot/schroot.conf配置文件,在文件末尾追加如下:
1 |
[ test ] |
2 |
description=user test chroot |
3 |
type =directory |
4 |
directory=/opt |
5 |
users = test |
6 |
groups =root |
7 |
root- groups =root |
1 |
schroot -l |

可以看到名为test的chroot环境,说明是正确的。
7 利用debootstrap构建ubuntu12.10的chroot环境
1 |
debootstrap --variant=buildd --arch=amd64 quantal /opt/ http://10.1.1.187/ubuntu |
可以看到根据配置文件在/opt目录下已经有了一个类似小型系统的目录
8 安装完成后,登入chroot环境
1 |
schroot -c test -u root |
schroot会自动执行/etc/schroot/setup.d/底下所找到的scripts,当chroot启动时会用档名顺序并且以setup-start选项执行,而离开chroot时会用相反顺序并以setup-stop选项执行。可以在现有的配置文件中增加你想进行的动作,也可以自己建立新的script。
这样chroot环境就利用debootstrap安装完毕了,如果你认为这样就可以利用到生产环境,那就想的太简单了,我们还需要进行以下升级:
1 修改schroot的配置文件,上面我们建立了一个名为test的chroot环境,这个环境要使用到生产环境中,还需要添加一些配置参数:
01 |
[ test ] |
02 |
description=user test chroot |
03 |
type =directory |
04 |
directory=/opt |
05 |
users =root, test ,guol |
06 |
root- users =root,guol |
07 |
groups =root |
08 |
root- groups =root |
09 |
setup.copyfiles=default/copyfiles |
10 |
setup.fstab=default/fstab |
11 |
setup.nssdatabases=default/nssdatabases |
12 |
shell=/bin/ bash |
13 |
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环境时默认加载的文件:
01 |
#/etc/schroot/default/copyfiles |
02 |
/etc/hosts |
03 |
/etc/resolv.conf |
04 |
/etc/network/interfaces |
05 |
/etc/apt/sources.list |
06 |
/etc/ hostname |
07 |
/etc/sudoers |
08 |
#/etc/schroot/default/fstab |
09 |
/proc /proc none rw,bind 0 0 |
10 |
/sys /sys none rw,bind 0 0 |
11 |
/dev /dev none rw,bind 0 0 |
12 |
/dev/pts /dev/pts none rw,bind 0 0 |
13 |
/tmp /tmp none rw,bind 0 0 |
14 |
tmpfs /dev/shm tmpfs defaults 0 0 |
15 |
/run /run none rw,bind 0 0 |
16 |
/run/lock /run/lock none rw,bind 0 0 |
17 |
/dev/shm /dev/shm none rw,bind 0 0 |
18 |
/run/shm /run/shm none rw,bind 0 0 |
19 |
#/etc/schroot/default/nssdatabases |
20 |
passwd |
21 |
shadow |
22 |
group |
23 |
gshadow |
24 |
services |
25 |
protocols |
26 |
networks |
27 |
hosts |
1 |
#/etc/ssh/sshd_config |
2 |
Match User test |
3 |
ChrootDirectory /opt/ |
4 |
ForceCommand internal- sftp |
5 |
AllowTcpForwarding no |
6 |
Match User guol |
7 |
ChrootDirectory /opt |
8 |
ForceCommand internal- sftp |
9 |
AllowTcpForwarding no |
我们先测试一下目前改进的配置
1 先测试在本机直接登录chroot环境。分别用test和guol用户测试
可以看到test用户登录进入怎么有warning提示,而guol用户登录却正常。根据提示使用--directory参数。man解释如下:
1 |
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. |
2 |
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. |
改进之后如下:
2 测试通过ssh直接登陆进chroot环境
这样基本的配置就已经操作完毕,各位可以根据具体需求对chroot环境进行深度定制。
在chroot环境中使用apt-get时,遇到了以下一个错误:
1 |
dpkg: unrecoverable fatal error, aborting: |
2 |
syntax error: unknown group 'ssl-cert' in statoverride file |
3 |
E: Sub-process /usr/bin/dpkg returned an error code (2) |
如果不想使用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
http://oss.org.cn/man/linux/lfs/LFS-6.1.1/chapter06/chroot.html
http://lamp.linux.gov.cn/Linux/LFS-6.2/chapter06/chroot.html
6.4. 进入 Chroot 环境
现在将要进入 chroot 环境开始编译安装最终的 LFS 系统了,注意:在这里我们只使用临时构建的工具。以 root 身份运行以下命令进入构建环境:
chroot "$LFS" /tools/bin/env -i \ HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ /tools/bin/bash --login +h
env 命令的参数 -i 的作用是清除所有 chroot 环境变量。后面是重新设定 HOME, TERM, PS1, PATH 等变量的值。TERM=$TERM 设定虚拟根环境中的 TERM 的值与 chroot 外面的一样。这个值是让像 vim 和 less 之类的程序可以正确操作。如果还需要重新设置其它的值,如 CFLAGS 或 CXXFLAGS ,这里是个不错的位置。
从这里开始,不再需要 LFS 环境变量了,因为所有的工作都被限制在 LFS 文件系统里面。这是由于已经告诉了 Bash shell $LFS 是现在的根目录(/)。
注意,这里 /tools/bin 位于 PATH 的最后面。也就是说当软件包的最终版本安装之后就不再使用临时工具了。为了使 shell 无法"记住"可执行二进制代码的位置,需要通过使用 +h 参数关闭 bash 的散列功能。
注意此时 bash 提示符会显示:I have no name! 这是正常的,因为 /etc/passwd 还没有创建。
![[Note]](http://lamp.linux.gov.cn/Linux/LFS-6.2/images/note.png)
注意
这一章剩下的命令以及后面几章的命令都是在chroot环境下进行的。如果你离开了这个环境(比如重启), 要确保内核虚拟文件系统挂载,像在 节 6.2.2, "挂载并填充 /dev 目录" 和 节 6.2.3, "挂载虚拟内核文件系统" 描述的。在继续安装之前,再次进入chroot环境。
http://hi.baidu.com/winsx/item/dd155cfb4ff153c1a835a2c7
用 chroot 来运行不同版本的 Debian
在 Sarege 中使用 debootstrap 命令很容易构造 chroot Debian 体系。对于 Sarge 的后续发行版,用 cdebootstrap 命令加上适当的选项来代替 debootstrap。例如,在一台拥有快速 Internet 连接的机器的 /sid-root 下创建一个 Sid chroot:
root # cd /srv/chroot; mkdir sid
root# debootstrap sid sid http://ftp.debian.org/debian/
... 看它下载整个系统 ...
root # echo "proc /srv/chroot/sid/proc proc none 0 0" >> /etc/fstab
root # mount /srv/chroot/sid/proc
root # mount /dev/ /srv/chroot/sid/dev -o bind
root# cp /etc/hosts /srv/chroot/sid/etc/hosts
root# chroot /srv/chroot/sid/bin/bash
chroot# cd /dev; /sbin/MAKEDEV generic; cd -
chroot# apt-setup --创建 /etc/apt/sources.list 文件
chroot # vi /etc/apt/sources.list --将源指向 unstable
chroot # dselect --可以使用 aptitude,安装 mc 和 vim :-)
现在你就拥有了一个全功能 Debian 子系统,
可以尽情享受而不必担心主 Debian 受到不利影响。
##############################################################################################
http://forum.ubuntu.org.cn/viewtopic.php?f=171&t=376479
文章标题 : 总结下Ubuntu中chroot/schroot的安装使用
https://help.ubuntu.com/community/DebootstrapChroot
http://jacky.aiwaly.com/wp/schroot-chro ... users.html
https://help.ubuntu.com/community/BasicChroot
http://wiki.debian.org/Schroot
一、基本工具及配置、用法
1. 安装工具
$ sudo apt-get install debootstrap schroot
2. 提高安全性及避免用户配置混淆
$ sudo editor /etc/schroot/mount-defaults
注释掉/home的挂载
3. 进入系统的方法
普通用户:schroot -c XXX
管理权限:sudo schroot -c XXX 或 schroot -c XXX -u root
4. 另一种安装软件的方法
$ sudo schroot -c XXX apt-get install YYY
例如:
$ sudo schroot -c lucid apt-get install nano
$ sudo schroot -c precise apt-get install nano
二、安装32位 Ubuntu Precise
1. 编辑配置:sudo editor /etc/schroot/chroot.d/precise.conf,添加如下内容
[precise]
description=Ubuntu Precise 32Bit
type=directory
directory=/srv/chroot/precise
users=loaden
groups=users
root-groups=root
personality=linux32
2. 在/32目录安装32位系统
$ sudo debootstrap --arch i386 precise /srv/chroot/precise http://mirrors.163.com/ubuntu/
$ sudo chmod 777 /srv/chroot/precise/home
$ mkdir /srv/chroot/precise/home/loaden
3. 执行:sudo schroot -c precise 进入系统
a. 更新源
# echo "deb http://mirrors.163.com/ubuntu precise main universe" > /etc/apt/sources.list
# apt-get update
b. 语言支持
# locale-gen en_US.UTF-8 zh_CN.UTF-8
c. 时区
# dpkg-reconfigure tzdata
d. 自动完成
# apt-get install bash-completion
e. 字体
# apt-get install ttf-wqy-*
f. 图形界面
# apt-get install libgtk2.0-0 libgtk-3-0 appmenu-gtk appmenu-gtk3
# echo "export DISPLAY=:0.0" > /etc/profile.d/gui_support.sh
6. 以普通权限进入32位系统
a. 安装FoxReader
$ sudo dpkg -i FoxitReader_1.1.0_i386.deb
$ sudo apt-get install libcanberra-gtk-module
b. 安装glGo
$ sudo dpkg -i glGo-1.4.1.deb
$ sudo apt-get install libsm6 libjpeg62 libsdl-image1.2 libsdl-ttf2.0-0 libsdl-mixer1.2 libglu1-mesa libpython2.7 gnugo
$ sudo ln -s /usr/lib/libpython2.7.so.1.0 /usr/lib/libpython2.5.so.1.0
二、安装32位 Ubuntu Lucid
1. 编辑配置:sudo editor /etc/schroot/chroot.d/lucid.conf,添加如下内容
[lucid]
description=Ubuntu Lucid 32Bit
type=directory
directory=/srv/chroot/lucid
users=loaden
groups=users
root-groups=root
personality=linux32
2. 在/32目录安装32位系统
$ sudo debootstrap --arch i386 lucid /srv/chroot/lucid http://mirrors.163.com/ubuntu/
$ sudo chmod 777 /srv/chroot/lucid/home
$ mkdir /srv/chroot/lucid/home/loaden
$ ln -s ~ /srv/chroot/lucid/home/loaden/.host
3. 执行:sudo schroot -c lucid 进入系统
a. 更新源
# echo "deb http://mirrors.163.com/ubuntu lucid main universe" > /etc/apt/sources.list
# apt-get update
b. 语言支持
# locale-gen en_US.UTF-8 zh_CN.UTF-8
c. 时区
# dpkg-reconfigure tzdata
d. 自动完成
# apt-get install bash-completion
e. 字体
# apt-get install ttf-wqy-*
f. 图形界面
# apt-get install libgtk2.0-0
# echo "export DISPLAY=:0.0" > /etc/profile.d/gui_support.sh
6. 以普通权限进入32位系统
a. 安装FoxReader
$ sudo dpkg -i FoxitReader_1.1.0_i386.deb
$ sudo apt-get install libcanberra-gtk-module
b. 安装glGo
$ sudo dpkg -i glGo-1.4.1.deb
$ sudo apt-get install libsm6 libjpeg62 libsdl-image1.2 libsdl-ttf2.0-0 libsdl-mixer1.2 libglu1-mesa libpython2.6 gnugo
$ sudo ln -s /usr/lib/libpython2.6.so.1.0 /usr/lib/libpython2.5.so.1.0
http://blog.csdn.net/wwwjfy/article/details/3851549
Reference: http://www.debian-administration.org/articles/356
系统是AMD64的,很多32位的软件运行不了,因此,构建32位的chroot。
按照官方教程走。
先安装所需的软件
sudo apt-get install debootstrap
建个目录
mkdir /chroot
搭建基本的系统
debootstrap --arch i386 sid /chroot http://ftp.debian.org/debian/
源用的是官方的源,当然其它源应该也没什么问题
装好后,基本的系统就已经完成了
加载一些必要的目录
#/etc/fstab
/dev /chroot/dev none bind 0 0
/proc /chroot/proc proc defaults 0 0
/sys /chroot/sys none bind 0 0
然后mount -a加载
官方教程用的是chroot,而schroot更加强大
sudo apt-get install schroot
sudo vi /etc/schroot/schroot.conf
反注释掉第一段,这里的配置差不多用了
改掉相应的users,groups和root-groups
这里的[sid]中的sid是chroot的标识,也就是schroot时切换到哪个环境
用schroot -c sid,加上-p可以把环境变量带进来。我更倾向于自己配了
好了,在这个32位系统中可以做很多事情了。
遇到的一个问题是显示的问题,也就是chroot下的图形化的程序无法显示在外面的系统中。
这里是一个DISPLAY的环境变量的问题。
会提示unable to open display ""
网上查到的是设为DISPLAY=:0.0,可是依然提示unable to display ":0.0"
或许系统之间有所不同,在我自己的debian 4.0 x86_64下设为DISPLAY=0:0可以正常显示。
不过外面的系统确实也是DISPLAY=:0.0,不解。
还有需要在gdmsetup的security中将Deny TCP connections to Xserver的勾去掉,默认是拒绝连接的。
xhost +允许任意连接,只是在本机的话可以xhost +localhost
http://hilinux.com/man/debian/ch11s06.html
chroot是change root的缩写,顾名思义,就是改变根目录的意思。它可以让系统管理员在一个权限受到限制的根目录中执行一个shell或运行进程。如果在chroot环境下以根用户权限运行进程,则有很多种方法可以逃离chroot环境,对系统造成危害。所以运行在chroot环境下的进程一般都运行在非根用户权限下,一旦chroot环境被黑客攻破,也不会影响系统其它服务的正常运行。chroot环境是我们强化服务安全的一个有力技术,系统管理员一定要掌握好它。
创建chroot环境的步骤如下:
-
创建chroot环境的基础目录
debian:~# mkdir chroot debian:~# mkdir chroot/bin debian:~# mkdir chroot/lib debian:~# mkdir chroot/etc
-
chroot环境相当于我们系统的一个简化版,所以我们要在chroot的基础目录下创建一些相关的子目录,并拷贝一些必须的文件进来。这些文件包括我们在chroot环境下运行shell环境或进程所需的所有二进程程序文件、库文件和配置文件。strace程序可以跟踪运行程序所需的库文件、系统调用和配置文件。如:
debian:~/c# strace ls execve("/bin/ls", ["ls"], [/* 35 vars */]) = 0 uname({sys="Linux", node="debian.tigerhead", ...}) = 0 brk(0) = 0x805c000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc5000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc4000 open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=67031, ...}) = 0 mmap2(NULL, 67031, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fb3000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/tls/librt.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\35\0\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0644, st_size=26516, ...}) = 0 mmap2(NULL, 29264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7fab000 mmap2(0xb7fb1000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5) = 0xb7fb1000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/libacl.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320\23"..., 512) = 512 .....
以open开头的就是ls程序需打开的文件,如:open("/lib/libacl.so.1", O_RDONLY) = 3,说明ls程序运行时需要libacl.so.1这个动态链接库。我们也可使用ldd命令来跟踪动态链接库文件,ldd命令输出的信息比较简洁,但它不会列出运行程序所需的配置文件和系统调用,所以这两个程序我们可结合起来使用。下面是使用ldd命令输出的信息:
debian:~# ldd /bin/ls linux-gate.so.1 => (0xffffe000) librt.so.1 => /lib/tls/librt.so.1 (0xb7f1e000) libacl.so.1 => /lib/libacl.so.1 (0xb7f18000) libselinux.so.1 => /lib/libselinux.so.1 (0xb7f03000) libc.so.6 => /lib/tls/libc.so.6 (0xb7dd1000) libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb7dbf000) /lib/ld-linux.so.2 (0xb7f39000) libattr.so.1 => /lib/libattr.so.1 (0xb7dba000) libdl.so.2 => /lib/tls/libdl.so.2 (0xb7db6000) libsepol.so.1 => /lib/libsepol.so.1 (0xb7d75000)
如果我们需要在chroot环境下运行ls命令,我们首先要把/bin/ls命令拷贝到chroot/bin目录下。
debian:~# cp /bin/ls chroot/bin/.
如果现在在chroot环境下运行ls命令,则会提示出错,如:
debian:~# chroot chroot /bin/ls chroot: cannot run command `/bin/ls': No such file or directory
这里的出错提示说不能运行ls命令是因为没有文件或路径,其实不然,出错的原因应该是ls命令找不到所需的动态链接库。所以下一步我们要把运行ls程序所需的库文件拷贝到chroot/lib目录下,这些库文件在上面用ldd命令已列出。在拷贝这些库文件之前,我们要把/lib/ld-linux.so.2库文件拷贝到chroot/lib目录,因为所有的二进制程序都需要使用该文件来确定它的库文件的依赖关系,也就是说,ld-linux.so.2动态链接库是所有程序都需要用到的动态链接库。在用cp命令拷贝库文件时记住要用-p参数,这样才能把库文件的内容和所有属性原封不动地拷贝过来。我们先拷贝ld-linux.so.2这个库:
debian:~# cp -p /lib/ld-linux.so.2 chroot/lib/.
现在我们再试试运行chroot环境下的ls命令。
debian:~# chroot chroot /bin/ls /bin/ls: error while loading shared libraries: librt.so.1: cannot open shared object file: No such file or directory
有了ld-linux.so.2库后,运行chroot环境下的ls命令就会提示缺少的动态链接库的名称。这个动态链接库在ldd命令中也是有列出的。当我们把ls命令所需的链接库全部拷贝完成后就可以在chroot环境下正常运行ls命令了。
debian:~# chroot chroot /bin/ls bin lib
这里列出了chroot环境根目录下的文件和目录。按相同的步骤我们就可以创建一个完整的chroot环境来运行我们的服务器,如Apache、DNS等。在创建chroot环境中最大的挑战是确定二进程文件的动态链接库的依赖关系。如果需要为chroot环境提供一个交互式的shell,则我们可利用busybox这个软件包。它为我们提供一个完整的,静态编译的工具集,不需我们手工复制大量的shell、系统工具和动态链接库。有关busybox软件包的安装和使用请参考本笔记的相关内容。
在chroot中安装服务时,应该采用在chroot中从源码开始重新编译安装的方式,而不是采用从主系统中把服务程序目录直接复制过去的方式。因为从源码重新编译安装能确保chroot中的服务是最新和最可靠的。
-
有些应用程序需要用到设备文件与CD-ROM、USB和远程访问打交道。设备文件不能使用cp命令复制,要用MAKEDEV命令来创建。因为在chroot环境下创建设备文件系统不会对系统安全造成不良影响,所以我们可在chroot环境下用MAKEDEV命令创建一套标准的设备文件。
debian:~# cd chroot debian:~# mkdir dev debian:~# cd dev debian:~/chroot/dev# MAKEDEV generic
"generic"参数使MAKEDEV脚本创建一组默认的设备文件。
-
在chroot中我们也需要设置日志系统,记录chroot中各种活动,为系统维护和安全审计提供依据。在chroot中使用日志系统,有两种主要的方式,一种是在chroot环境下直接创建日志系统,在chroot环境的/var/log目录下创建如下的目录结构:
chroot/var/log lastlog messages secure wtmp /run
日志信息记录在chroot环境下,再通过主系统中有权限访问chroot/var/log目录和文件的用户定期采集日志信息。另一种方式是把日志信息直接发送给syslog服务器。如果采用这种方式,则需在chroot环境下创建一个/etc/syslog.conf文件。
使用chroot环境应注意的问题:
-
要用strace或ldd命令仔细检查程序的依赖关系,不要遗漏。特别注意/etc/目录下的几个常用的文件,如:resolv.conf和nsswitch.conf。
-
默认chroot环境的日志信息是写在chroot环境下的/var/log目录,而不是主系统。
-
注意检查chroot环境下各种文件的权限是否正确,尽量使用cp -p 或 tar -p选项来复制和解包文件。
-
注意chroot环境的磁盘空间,要留有足够的空间来运行程序。
-
不要把chroot系统挂装在NFS文件系统上,因为在默认情况下,NFS会自动去除文件上的根用户权限并把它们映射为"nobody"用户。
-
chroot环境配置好后,要及时做好备份工作。备份时要记住使用-p选项,如:
debian:!# tar czvfp chroot.tar.gz chroot
-
要及时为chroot中的各种软件打补丁。