labunix's blog

labunixのラボUnix

CentOS6上にchrootのdebian wheezyを構築

■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
#!/bin/bash
#http_proxy=http://your.proxy.address:8080/
#ftp_proxy=http://your.proxy.address:8080/
#HTTP_PROXY=http://your.proxy.address:8080/
#FTP_PROXY=http://your.proxy.address:8080/

■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
#https_proxy = http://proxy.yoyodyne.com:18023/
#http_proxy = http://proxy.yoyodyne.com:18023/
#ftp_proxy = http://proxy.yoyodyne.com:18023/
# If you do not want to use proxy at all, set this to off.
#use_proxy = on

■準備が出来たら、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  821 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.