[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:13114] Re: Chroot woody setup in 15 minutes



佐野@浜松です。

今朝、ひさしぶりに debian-devel@Org を web から眺めていて、
以下のメールに気がつきました。

   Title            Re: Anyone willing to NMU lbreakout?
   Current URL      http://lists.debian.org/debian-devel-0010/msg01256.html

   Title            Chroot woody setup in 15 minutes
   Current URL      http://lists.debian.org/debian-devel-0010/msg01257.html

   Title            Re: Chroot woody setup in 15 minutes
   Current URL      http://lists.debian.org/debian-devel-0010/msg01270.html

   Title            Re: Chroot woody setup in 15 minutes
   Current URL      http://lists.debian.org/debian-devel-0010/msg01282.html

   Title            Re: Chroot woody setup in 15 minutes
   Current URL      http://lists.debian.org/debian-devel-0010/msg01273.html

簡単に言うと、XFree86 4.0.1 の実験パッケージを main の woody 環境に
入れてしまった人が、 pure woody な環境でパッケージを build できないから
誰か NMU してくれ、とリクエストしたのに対して、Joey Hess が clean woody な
環境を chroot で構築できるよ、という話を出して、Ben Gertzfield がその手順を
紹介したものです。

  | Joey is right. Doing a chroot woody setup really does only take                 
  | about 15 minutes. Here's some rough notes on what I had to do                   
  | to set one up on my potato box; I did GIMP builds there with no                 
  | problems.                                                                       
  |                                                                                 
  | 1) download base2_2.tgz                                                         
  | 2) as root, untar in safe place (homedir, /usr/local/woody, whatever)           
  | 3) as root, chroot /usr/local/woody /bin/sh                                     
  | 4) mount proc -t proc /proc                                                     
  | 5) put name servers in /etc/resolv.conf                                         
  | 6) put the REAL machine name in /etc/hostname. run hostname -F /etc/hostname. 
  |    Copy /etc/hosts from real machine.
  | 7) edit /etc/apt/sources.list, change stable to unstable, 
  |    comment-out security.debian.org
  | 8) use *dselect* to Update and install build-essential.. removing tetex packages
  |                                                                                 
  | Sorry these aren't more detailed, but I hope they help.                         

で、それについてさらに Frank Belew が

  | Skip dselect, just use ``apt-get install build-essential dpkg-dev''             
  | The reason it messes up without explicitly saying dpkg-dev is the               
  | whacked out stuff we had to do                                                  
  | to perl between 5.004 and 5.005                                                 
  |                                                                                 
  | Doing it this way manages to skip all of standard, and just get that            
  | which is truly essential                                                        
  |                                                                                 
  | After you are done installing build-essential, exit and tar this tree up        
  | for multiple uses                                                               

と補足して、最後に Adam Hess が

  | Once you get the chroot configured with apt, the following script is helpful    
  | to automate the above(allows for easy start/stop, and keeps the chroot in a     
  | semi-updated state with the host).                                              
  |                                                                                 
  | ---                                                                             
  | #!/bin/sh -e                                                                    
  | if [ -e /etc/init.d/$(basename $0) ]; then                                      
  |         # starting inside chroot                                                
  |         hostname -F /etc/hostname                                               
  |         exec /bin/sh --login                                                    
  | else                                                                            
  |         # starting outside the chroot                                           
  |         dir=$(dirname $0)                                                       
  |         files="/etc/resolv.conf /etc/hosts /etc/hostname"                       
  |         for f in $files; do                                                     
  |                 cp $f $dir/$f                                                   
  |         done                                                                    
  |         mount proc -t proc $dir/proc                                            
  |         chroot $dir /etc/init.d/$(basename $0)                                  
  |         umount $dir/proc                                                        
  | fi                                                                              
  | ---                                                                             
  |                                                                                 
  | The file can be named anything, but it must exist in $chroot_base/etc/init.d/.  

と chroot 環境に出入りするためのシェルスクリプトを紹介しています。

が、実は上記のスクリプトにはちょっとバグがあるみたいで、私の
環境ではうまく動きませんでした。

以下に修正したスクリプトと、補足を merge した手順を書きます。

  1) base2_2.tgz を入手する。
                                                         
  2) root になって、 base2_2.tgz を好きな場所 (homedir, /usr/local/woody など。
     私は実験用パーティション (/Test) を作って /Test/Debian/build-depends に
     入れました) に展開する。(tar -xvzpf base2_2.tgz)

  3) root で chroot <installed base tree> /bin/sh を実行

  4) mount proc -t proc /proc を実行

  5) ネームサーバー (DNS サーバー) を /etc/resolv.conf に設定

  6) 適切なマシン名を /etc/hostname に設定し、 hostname -F /etc/hostname を実行。
     
  7) /etc/apt/sources.list を編集し、stable を unstable に変更、かつ
     security.debian.org をコメントアウト。

     ここで、lib6 をバージョンアップする際に、一時的に DNS にアクセスできなく
     なるかもしれません。なんか最近はもう IP アドレスじゃなくても大丈夫みたい
     なんですが。たしか以前、FQDN でアクセスできなくて IP アドレスを設定して
     回避したことがあったような。

  8) apt-get update を実行した後、apt-get install build-essentail dpkg-dev を
     実行。

     ここで dpkg-dev を指定する理由は perl 5.004 から perl 5.005 への
     移行に必要だから。(ここの訳はちょっと自信無し)

  これで本当に essential な環境が構築できます。この環境を使えば
  きちんと Build-Depends を指定できているかどうかを検証できるでしょう。

さらに、いったん上記の手順で環境を構築できてしまえば、以下のスクリプトで
 chroot 環境へ出入りする際に必要な処理 (/proc のマウントと resolve.conf の
設定) を自動化できます。

 ===== BEGIN: etc/init.d/chroot-setup.sh =====
#!/bin/sh -e
if [ -e /etc/init.d/$(basename $0) ]; then
	# starting inside chroot
	hostname -F /etc/hostname
	exec /bin/bash --login
else
	# starting outside the chroot
	dir=$(dirname $0)/../
	# files="/etc/resolv.conf /etc/hosts /etc/hostname"
	files="/etc/resolv.conf"
	for f in $files; do
	        cp $f $dir/$(basename $f)
	done
	dir=$dir/../
	mount proc -t proc $dir/proc
	chroot $dir /etc/init.d/$(basename $0)
	umount $dir/proc
fi
 ===== END: etc/init.d/chroot-setup.sh =====

なお私の場合は /etc/hosts と /etc/hostname は既に設定済みのものを
そのまま活用するために resolve.conf だけをコピーするようにしていますが
すべてコピーしたい場合は上記の files= のコメントアウトを付け換えて
ください。

 Adam Hess のスクリプトからの修正箇所は

 if [ -e /etc/init.d/$(basename $0) ]; then
  	# starting inside chroot
 	hostname -F /etc/hostname
- 	exec /bin/sh --login
+ 	exec /bin/bash --login
 else
 	# starting outside the chroot
-	dir=$(dirname $0)
+	dir=$(dirname $0)/../
-	files="/etc/resolv.conf /etc/hosts /etc/hostname"
+	# files="/etc/resolv.conf /etc/hosts /etc/hostname"
+	files="/etc/resolv.conf"
 	for f in $files; do
-	        cp $f $dir/$f
+	        cp $f $dir/$(basename $f)
	done
+	dir=$dir/../
	mount proc -t proc $dir/proc
	chroot $dir /etc/init.d/$(basename $0)
	umount $dir/proc

です。

以上、御参考まで。

 # JP diary には、やはり既に記載済みですね。さすが。
 #  <http://www.debian.or.jp/diary/?2000101&to=2000101811S4#2000101811S4>

--
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)