■CentOS6上にchrootのdebian wheezyを構築
ドライバの都合等でCentOSを入れてるマシンってありますよね。。。
debianじゃないだけでストレスがたまりますw。。。
schrootコマンドが使えないので、今回はsshを使用する。
■まずはホストのシステムを最新におく。
※5分で終わらない更新にはsudoを使わないこと。
$ for opt in update upgrade "clean all";do echo "y" | sudo yum $opt;done
$ su root -c 'for opt in update upgrade "clean all";do echo "y" | yum $opt;done'
■chrootにwheezyを選択した場合、CentOS5ではkernelが古いと言われる。
「FATAL: kernel too old」
$ cat /etc/redhat-release
CentOS release 5.9 (Final)
$ uname -r
2.6.18-348.12.1.el5
■上記の理由でCentOS6.4を対象とする。
$ cat /etc/redhat-release
CentOS release 6.4 (Final)
■curlのプロキシはシステムと同じなので、下記ファイルの書式で設定して、
一旦ログオフ、再ログオンする。
$ grep ^# /etc/profile.d/proxy.sh
■debootstrapのパッケージの確認。
3つあるが、そのうち2つはバージョン依存。
$ curl http://ftp.debian.org/debian/pool/main/d/debootstrap/ 2>/dev/null | \
sed s/"<"/"\n&"/g | grep "href.*_all\.deb" | awk -F\" '{print $2}'
debootstrap_1.0.26+squeeze1_all.deb
debootstrap_1.0.48+deb7u1_all.deb
debootstrap_1.0.53_all.deb
■以下のようにすれば常に最新版をダウンロード出来る。
$ URL=http://ftp.debian.org/debian/pool/main/d/debootstrap/; \
curl $URL 2>/dev/null | \
sed s/"<"/"\n&"/g | grep "href.*_all\.deb" | awk -F\" '{print $2}' | \
grep -v '+' | curl -O $URL/`xargs`
$ ls debootstrap_1.0.53_all.deb
debootstrap_1.0.53_all.deb
■解凍と展開
$ test -d debootstrap || mkdir debootstrap && \
cd debootstrap && \
ar -x ../debootstrap*.deb && \
sudo tar zxvf data.tar.gz -C / && \
cd ..
■削除したくなったら以下で行う。
$ ls -ld /usr/share/debootstrap/ \
/usr/share/man/man8/debootstrap.8.gz \
/usr/share/doc/debootstrap \
/usr/sbin/debootstrap | \
awk '{print $NF}'
/usr/sbin/debootstrap
/usr/share/debootstrap/
/usr/share/doc/debootstrap
/usr/share/man/man8/debootstrap.8.gz
$ ls -ld /usr/share/debootstrap/ \
/usr/share/man/man8/debootstrap.8.gz \
/usr/share/doc/debootstrap \
/usr/sbin/debootstrap | \
awk '{print $NF}' | sudo xargs rm -fr
$ ls -ld /usr/share/debootstrap/ \
/usr/share/man/man8/debootstrap.8.gz \
/usr/share/doc/debootstrap \
/usr/sbin/debootstrap | \
awk '{print $NF}'
ls: cannot access /usr/share/debootstrap/: そのようなファイルやディレクトリはありません
ls: cannot access /usr/share/man/man8/debootstrap.8.gz: そのようなファイルやディレクトリはありません
ls: cannot access /usr/share/doc/debootstrap: そのようなファイルやディレクトリはありません
ls: cannot access /usr/sbin/debootstrap: そのようなファイルやディレクトリはありません
■削除方法も分かったので、再度、解凍と展開
$ rm -fr debootstrap
$ test -d debootstrap || mkdir debootstrap && \
cd debootstrap && \
ar -x ../debootstrap*.deb && \
sudo tar zxvf data.tar.gz -C / && \
cd ..
■wgetにプロキシの設定が必要な方はwgetrcを変更しましょう。
書式はコメントアウトの通りに。
$ sudo yum install -y wget
$ grep proxy /etc/wgetrc
■準備が出来たら、i386版のwheezyを構築。
$ test -d /var/localwheezy || \
sudo mkdir -p /var/local/wheezy && \
sudo debootstrap wheezy /var/local/wheezy
$ su root -c 'test -d /var/localwheezy || \
mkdir -p /var/local/wheezy && \
/usr/sbin/debootstrap --arch=i386 wheezy /var/local/wheezy'
■chroot環境を設定
$ sudo cp -i /etc/fstab /etc/fstab.bak && \
CHROOT_HOME="/var/local/wheezy"; \
echo "
none ${CHROOT_HOME}/dev/pts devpts gid=5,mode=620 0 3
none ${CHROOT_HOME}/dev/shm tmpfs defaults 0 3
none ${CHROOT_HOME}/proc proc defaults 0 3
none ${CHROOT_HOME}/sys sysfs defaults 0 3" | sudo tee -a /etc/fstab
$ grep ^none /etc/fstab
none /var/local/wheezy/dev/pts devpts gid=5,mode=620 0 3
none /var/local/wheezy/dev/shm tmpfs defaults 0 3
none /var/local/wheezy/proc proc defaults 0 3
none /var/local/wheezy/sys sysfs defaults 0 3
■CentOS6では以下のエラー。警告どおり存在しない場所を指しているので、ディレクトリを作成。
$ sudo mount -a
mount: マウントポイント /var/local/wheezy/dev/shm はどこもさしていないシンボリックリンクです
$ ls -l /var/local/wheezy/dev/shm
lrwxrwxrwx. 1 root root 8 8月 21 06:19 2013 /var/local/wheezy/dev/shm -> /run/shm
$ sudo mkdir -p /run/shm
$ sudo mount -a
$ mount | grep ^none
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
none on /var/local/wheezy/dev/pts type devpts (rw,gid=5,mode=620)
none on /var/local/wheezy/proc type proc (rw)
none on /var/local/wheezy/sys type sysfs (rw)
none on /run/shm type tmpfs (rw,rootcontext="unconfined_u:object_r:var_t:s0")
■chrootからのsyslog転送
※CentOS5ではsyslog、CentOS6ではrsyslogである為、対処方法が異なる点に注意。
■CentOS6+rsyslog
$ grep '/dev/log' /etc/rsyslog.conf || \
echo '$AddUnixListenSocket '"${CHROOT_HOME}/dev/log" | sudo tee -a /etc/rsyslog.conf > /dev/null
$ sudo /etc/init.d/rsyslog restart
■chroot側のAPTにプロキシ設定をし、最新に。
$ sudo sed s%"http://.*"%"http://your.proxy.address:8080/\";"% ${CHROOT_HOME}/etc/apt/apt.conf
Acquire::http::proxy "http://your.proxy.address:8080/";
$ sudo chroot ${CHROOT_HOME} apt-get update
$ sudo chroot ${CHROOT_HOME} apt-get upgrade
■openssh-serverを導入、ホストOSで使用するポートと被らないように設定
$ sudo chroot ${CHROOT_HOME} apt-get install -y openssh-server
$ sudo grep ^Port /etc/ssh/sshd_config || \
sudo sed -i s/"Port 22"/"&\nPort 8022"/ ${CHROOT_HOME}/etc/ssh/sshd_config
■ユーザの作成、rootパスワードの設定
$ CHROOT_USER=labunix; \
sudo chroot ${CHROOT_HOME} adduser ${CHROOT_USER}
$ sudo chroot ${CHROOT_HOME} passwd root
■sshを起動する為のchroot側の設定
$ echo '#!/bin/bash
export TZ=Asia/Tokyo
/etc/init.d/ssh restart' | sudo tee -a ${CHROOT_HOME}/etc/rc.chroot-ssh > /dev/null
$ sudo chmod +x ${CHROOT_HOME}/etc/rc.chroot-ssh
$ echo "UseDNS no" | sudo chroot ${CHROOT_HOME} tee -a /etc/ssh/sshd_config
UseDNS no
■上記を呼び出すホスト側の設定
$ grep 'rc.chroot\-ssh' /etc/rc.local || \
echo 'if [ -x '${CHROOT_HOME}'/etc/rc.chroot-ssh ]; then
/usr/sbin/chroot '${CHROOT_HOME}' /etc/rc.chroot-ssh restart
fi' | sudo tee -a /etc/rc.local
■sshdの起動
$ sudo chroot ${CHROOT_HOME} /etc/init.d/ssh restart
[ ok ] Restarting OpenBSD Secure Shell server: sshd.
$ sudo /etc/init.d/sshd restart
sshd を停止中: [ OK ]
sshd を起動中: [ OK ]
$ netstat -an | grep 8022
tcp 0 0 0.0.0.0:8022 0.0.0.0:* LISTEN
tcp 0 0 :::8022 :::* LISTEN
■作成したスクリプトが動作するか確認
$ sudo /etc/rc.local
[ ok ] Restarting OpenBSD Secure Shell server: sshd.
$ netstat -an | grep "\:8022"
tcp 0 0 0.0.0.0:8022 0.0.0.0:* LISTEN
tcp 0 0 :::8022 :::* LISTEN
■chrootだと分かるようにプロンプトを設定
$ echo "chroot-wheezy" | sudo tee ${CHROOT_HOME}/etc/debian_chroot
chroot-wheezy
■ログインしてssh鍵の作成
$ ssh -p 8022 localhost
(chroot-wheezy)labunix@centos6:~$ ssh-keygen -t rsa
(chroot-wheezy)labunix@centos6:~$ exit
$ sudo /etc/rc.local
[ ok ] Restarting OpenBSD Secure Shell server: sshd.