Gentoo Linux開発者ガイド User-Mode Linuxによるシステムテスト
1.
User-Mode Linuxの入手
user-mode linuxのWEBサイト(http://user-mode-linux.sourceforge.net)にあるように、
user-mode linuxは、"Linuxの中でLinuxを実行する"ことを可能にするものです。
user-mode linuxは、バグの多いソフトウェアを実行したり、新しいLinuxカーネルやディストリビューションを試してみたり、
Linux内部動作を探索したりといった事を、あなたのメインのLinuxマシンで危険を伴わずに、行うことができる仮想マシンを提供します。
sys-apps/baselayoutやsys-libs/glibcの様な、Gentooコアパッケージに対する変更は、
システムを停止させたり、起動不能にしてしまう恐れがあります。
user-mode linuxを使えば、これらの変更を稼動しているシステムが止まってしまうかもしれないなどと気にすることなく試すことができます。
user-mode linuxのインストールは、通常のカーネルインストールと本質的には同じです。
最初に(user-mode linux用に適切にパッチが当てられた)カーネルソースをインストールします。
そして、user-mode linuxカーネルをいつものやり方で設定します:
コード表示 1.1 |
# emerge sys-kernel/usermode-sources
# cd /usr/src/uml/linux
# make menuconfig
# make linux
# cp linux /usr/local/bin/linux
|
重要:
user-mode linuxカーネルでGentooシステムを正しく起動するには、
デフォルトでは、起動時に自動的に/dev (devfs)がマウントされないようにカーネルを設定する必要があります。
また、tmpfs(仮想メモリファイルシステム)がコンパイルされるようになっているか確認してください。
これは、デフォルトでは、Gentoo linuxの起動スクリプトが小さなtmpfsパーティションにその情報を保持する為です。
(user-mode WEBサイトから入手できるカーネルのバイナリは、自動的に
/devをマウントしてしまいますし、tmpfsサポートが有効になっていません。そ
のことで悩まないように。)
|
私は、user-mode linuxのドキュメントを読むことを強くお薦めしますが、
user-mode linuxの基本的な考え方としては、/usr/local/bin/linuxを実行し、user-modeカーネルを起動し、
カレントディレクトリにあるroot_fsに書き込まれたシステムを立ち上げようとするものです。
user-mode linuxツールをインストールするのも同様に簡単です。
コード表示 1.2 |
# emerge sys-apps/usermode-utilities
|
これらのツールは、user-mode linux仮想システムとホストLinuxシステム間の通信(等)を行うことを容易にします。
2.
root_fsの作成
Gentoo chroot環境の作成
user-mode linuxに必要なroot_fsファイルは、
その一つのファイルの中に、Gentoo Linuxファイルシステム全体を含んでいます。
このファイルを作成するためには、ホスト(user-modeでは無い方)のカーネルで、
ループバックデバイスサポートを有効にしている必要があります。
root_fsの作成自体は、最終段階で行います。
まず始めに、Gentooファイルシステムを通常のchroot環境に作成しましょう。
それには、stage tarballが必要です。
個別にダウンロードするか、liveCDあるいは、liveCDのISOイメージから取り出してください。
コード表示 2.1: liveCD ISOイメージのマウント |
# mkdir /mnt/loop
# mount -o loop /path/to/build-<TAB>.iso /mnt/loop
|
chroot環境は、本質的には通常のGentoo Linux環境の構築と全く同様です。
コード表示 2.2 |
# mkdir /mnt/gentoo
# cd /mnt/gentoo
# tar xvjpf /path/to/build-<TAB>.tar.bz2
|
ISOイメージをアンマウントして次に進みましょう。ISOイメージはこれ以降は必要ありません。
コード表示 2.3 |
# cp /etc/resolv.conf /mnt/gentoo/etc/
# mount -o bind /proc /mnt/gentoo/proc
# mkdir -p /mnt/gentoo/usr/portage/distfiles
# mkdir -p /mnt/gentoo/usr/portage/packages
# mount -o bind /usr/portage/distfiles /mnt/gentoo/usr/portage/distfiles
# mount -o bind /usr/portage/packages /mnt/gentoo/usr/portage/packages
# chroot /mnt/gentoo /bin/bash
# emerge sync
# env-update
# source /etc/profile
|
/usr/portage/distfilesと/usr/portage/packagesを、
"-o bind"オプション付きでマウントすることで、
既にGentooホスト環境に存在しているパッケージをダウンロードしたり、再構築したりする無駄を避ける事ができます。
いつもの通り、ブートストラップとシステムを構築していきます:
コード表示 2.4 |
# cd /usr/portage
# nano -w /etc/make.conf
# nano -w /etc/make.profile/packages
# nano -w /usr/portage/profiles/package.mask
# scripts/bootstrap.sh && emerge --usepkg system
|
警告:
/etc/make.profile/packagesファイルにvirtual/bootloaderの行があるならを、これを修正し、
デフォルトのシステムからvirtual/bootloader ebuildを削除する必要があります。
(単純に、"*virtual/bootloader"の行の最初の"*"を削除してください。)
virtual/bootloader ebuildは、/bootパーティションをマウントしようとしますが、chroot環境では失敗します。
|
注意:
これからインストールようとしているパッケージのうち、まだテストされていないものが、
/etc/make.profile/packagesと/usr/portage/profiles/package.maskにおいてmaskされていないことを確認してください。
scripts/bootstrap.shは、そこにそう書かれている通り、ソースからブートストラップパッケージをコンパイルします。
現在既にあるパッケージを使うためには、alias emerge="emerge --usepkg"をbootstrapスクリプトのどこか最初の方に追加してください。
|
追加したいパッケージはどんなものでも追加できます。
仮想Gentooシステムにホスト名をつけるかどうかは任意です。
/etc/fstabの中の、/dev/ROOTを/dev/ubd/0に変更します。
このとき、ファイルシステムの種類は、ext2, ext3, あるいはreiserfs等にします。
/dev/SWAPを/dev/ubd/1として設定し、/dev/BOOTはコメントアウトします。
ここで、忘れずにrootのパスワードを設定しましょう。
コード表示 2.5: rootパスワードの設定 |
# passwd
|
chroot環境を抜けて、bindマウントをすべてアンマウントし、
それらをtarで新しいGentooシステムとして固めて、後片付けをします:
コード表示 2.6 |
# exit
# umount /mnt/gentoo/usr/portage/distfiles
# umount /mnt/gentoo/usr/portage/packages
# umount /mnt/gentoo/proc
# du -ks /mnt/gentoo
# cd /mnt/gentoo
# tar cvjpf ~/gentoo.tbz2 *
# cd
# rm -rf /mnt/gentoo
|
Gentoo Linux x86 Installation Guide(x86)
(日本語訳)の最後の手順も確認してみてください。
root_fsの作成
Gentoo chroot環境は、300 MBぐらいあります。
したがって、root_fsには少なくともそれぐらいのサイズが必要になります。
私達は、0.5 GBとすることにしました。
コード表示 2.7 |
# dd if=/dev/zero of=root_fs seek=500 count=1 bs=1M
# mke2fs -F root_fs
# mount -o loop root_fs /mnt/loop
# tar xvjpf gentoo.tbz2 -C /mnt/loop
# umount /mnt/loop
|
0.5 GBのスワップパーティションもあったほうが良いです。
コード表示 2.8 |
# dd if=/dev/zero of=swap_fs seek=500 count=1 bs=1M
# mkswap -f swap_fs
|
それでは、動くか試してみましょう!
コード表示 2.9 |
# linux ubd0=root_fs ubd1=swap_fs
|
注意:
User-mode linuxは、起動時に仮想コンソールとしてxterm(または、同等のターミナルソフト)を使用します。
その為、user-mode linuxを起動するterminalに$DISPLAY環境変数が適切に設定されているか確認してください(xhost/xauthの適切なパーミッションも必要です)。
|
運がよければ、user-mode linux Gentooシステム内にログインできるでしょう。
Gentooのuser-mode linuxのこのバージョンでは、ネットワークが仮想マシンとホスト間に限定されます。(訳注:後述のようにホストをNATルーターとして動作させれば外部ネットワークとも通信可能です。)
3.
ネットワーク
Martin Schlemmer (Azarah)さんのおかげで、
user-modeシステムからネットーワークを機能させる方法がわかりました。
彼は、user-modeシステムとホストシステムからなるプライベートなネットワークを構築し、
user-modeシステムはすべてのパケットをホスト向けに送信し、ホストが外部のネットワークへ転送するという方法を考えました。
ホストカーネルにおいて
Networking --> IP: Netfilter Configuration --> IP tables support
--> Full NAT --> MASQUERADE target support
及び
Network Device Support --> Ethertap network tap
がモジュールとしてコンパイルされているか確認してください。
そして、ホストマシンにおいて次のようにします(訳注:kernel2.4系では、ethertapはobsolete(時代遅れ)です。代わりにTUN/TAPを使う方法(kernelの設定で、CONFIG_TUNを有効にし、modprobe tunでロードできます)があります。):
コード表示 3.1 |
# modprobe ethertap
# modprobe iptable_nat
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# echo 1 > /proc/sys/net/ipv4/ip_forward
|
iptablesの行は、user-modeシステムが繋がっているプライベートネットワークと、
(私達の例では、eth0経由で到達可能な)インターネットの間のIPマスカレードを設定しています。
echoの行は、プライベートネットワークとデフォルトゲートウェイが設定されているインタフェース(例では、eth0です)間のルーティング開始する設定です。
それでは、user-modeシステムを立ち上げて、ネットワークが機能するか見てみましょう。
コード表示 3.2 |
# linux ubd0=root_fs ubd1=swap_fs eth0=ethertap,tap0,,192.168.0.254
# ifconfig eth0 192.168.0.1 up
# ping -c 2 192.168.0.254
PING 192.168.0.254 (192.168.0.254): 56 octets data
64 octets from 192.168.0.254: icmp_seq=0 ttl=255 time=0.8 ms
64 octets from 192.168.0.254: icmp_seq=1 ttl=255 time=0.6 ms
--- 192.168.0.254 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.7/0.8 ms
# route add default gw 192.168.0.254
# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 40 0 0 eth0
0.0.0.0 192.168.0.254 0.0.0.0 UG 40 0 0 eth0
# scp user@192.168.0.254:/etc/resolv.conf /etc/resolv.conf
# ping -c 2 www.gentoo.org
PING www.gentoo.org (207.170.82.202): 56 octets data
64 octets from 207.170.82.202: icmp_seq=0 ttl=240 time=119.6 ms
64 octets from 207.170.82.202: icmp_seq=1 ttl=240 time=92.0 ms
--- www.gentoo.org ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 92.0/105.8/119.6 ms
|
user-modeシステム上で、user-modeのeth0インタフェースにプライベートなIPアドレス192.168.0.1を割り当て、
インタフェースをUPさせます。
ホストの方は、192.168.0.254のIPアドレスを設定し、ネットワークが実際に動いているかどうか、pingを使って確認します。
routeの行では、デフォルトゲートウェイ(つまりホスト向けに)を追加します。
名前解決の為に、もし必要なら、scpを使って/etc/resolv.confをコピーします。
そして、user-modeシステムから名前解決が機能しているか(そして、インターネットへの一般的なアクセスが可能か)、
確認するためにwww.gentoo.orgに向けてpingを実行しています。
これで、好きなときにuser-modeシステムでもemergeすることができるようになりました。
4.
ISOイメージのテスト
恐らく、理想的なGentoo Linuxのテストは、user-mode linuxを使ってISOイメージを起動し、
user-mode linux仮想システム内にGentooを完全にインストールしてしまうことでしょう。
ISOイメージを起動する、実際には、ISOイメージからinitrdを起動することは、実に簡単です。
コード表示 4.1 |
# mount -o loop /path/to/build-<TAB>.iso /mnt/loop
# cp /mnt/loop/isolinux/rescue.gz .
# linux load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=22000 \
> initrd=rescue.gz root=/dev/ram0 ubd0=root_fs ubd1=swap_fs \
> ubd2=/dev/cdroms/cdrom0 eth0=ethertap,tap0,,192.168.0.254
|
これで、基本的には、Gentooインストールドキュメントに従ってインストールすることができますが、
ルートファイルシステムが/dev/ubd/0に、
スワップパーティションが/dev/ubd/1に、
CD-ROMが/dev/ubd/2になるということは知っておく必要があります。
このドキュメントの内容は
Creative Commons -
Attribution / Share Alikeライセンスです。
|