ファイヤープロジェクト
Debian GNU/Linux(sarge)でUMLを試してみる
2006-06-10T17:50+09:00   matsu
UML(User Mode Linux)は,Linux上で動作するLinuxということで,Debian GNU/Linux(srge)上でDebian GNU/Linux(sarge)を起動してみた.
今回は以下の構成で環境を作成する.
ホストOS
Debian GNU/Linux sarge,kernel 2.6.15
  • ゲストOS
    Debian GNU/Linux sarge,kernel 2.6.16.11
  • ホストOSは既存のものをそのまま使用. したがってゲストOSのための作業から始める. 大まかなな作業の流れは以下.
    1. UML用カーネルの構築.
    2. ゲストOS用ルートFSの作成
    3. ゲストOS起動
    4. ゲストOS用にいろいろと設定
    DebianのetchなどではUML用カーネルをapt-getできるようだが,私の環境はsargeなので,UML用カーネルを構築する必要がある. まずソースの展開と設定.
    $ tar zxvf linux-2.6.16.11.tar.gz 
    $ cd linux-2.6.16.11
    $ cp arch/um/config.release .config
    $ make oldconfig ARCH=um
    
    いろいろ質問された. プロセッサファミリをAthlon64に変更した以外は全部デフォルトで回答. そしてビルド.
    $ fakeroot make-kpkg clean
    $ fakeroot make-kpkg --revision uml.20060428 --arch um kernel_image
    
    これで kernel-uml-2.6.16.11_uml.20060428_i386.deb のできあがり. あとはインストール. カーネルイメージは
    /usr/bin/linux-2.6.16.11
    
    ライブラリは
    /usr/lib/uml/modules/
    
    に作成されるので,ホストOSにてdpkgすればよい.
    # dpkg -i \
    kernel-uml-2.6.16.11_uml.20060428_i386.deb 
    
    ゲストOSのためのルートFSを作成する. 今回はホストOSにてルートFS用ファイルを作成する. debootstrapをインストール.
    # apt-get install debootstrap
    
    次にルートFSとするファイルを作成.
    ~$ mkdir uml
    ~$ cd uml/
    ~/uml$ dd if=/dev/zero of=root_fs bs=8192 count=65536
    読み込んだブロック数は 65536+0
    書き込んだブロック数は 65536+0
    536870912 bytes transferred in 5.738106 seconds (93562392 bytes/sec)
    
    UMLカーネルは,デフォルトでは
    ./root_fs
    
    をルートFSとして使用するので,今回のファイル名もroot_fsとした. 作成したファイルをext2として初期化.
    $ /sbin/mke2fs -F ./root_fs 
    mke2fs 1.37 (21-Mar-2005)
    ./root_fs is mounted; mke2fs forced anyway.  Hope /etc/mtab is incorrect.
    Filesystem label=
    OS type: Linux
    Block size=1024 (log=0)
    Fragment size=1024 (log=0)
    131072 inodes, 524288 blocks
    26214 blocks (5.00%) reserved for the super user
    First data block=1
    64 block groups
    8192 blocks per group, 8192 fragments per group
    2048 inodes per group
    Superblock backups stored on blocks: 
            8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
    
    Writing inode tables: done                            
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 36 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
    
    マウントしてルートFS作成.
    ~# mount -t ext2 root_fs /mnt/ -o loop
    /mnt# debootstrap sarge /mnt http://ftp.jp.debian.org/debian
    
    そしてdevファイルを作成.
    #cd /mnt/dev
    #MAKEDEV ubd
    
    etc/fstabを作成. こんなん.
    proc       /proc proc defaults 0 0
    /dev/ubda1 /     ext2 defaults,errors=remount-ro 0 0
    
    とりあえず必要最小限のもので.
    では,いよいよ起動.
    ~/uml$ ls 
    root_fs
    ~/uml$ linux-2.6.16.11 ubda1=./root_fs
    
    上はfstabの/をマウントポイントとするデバイスubda1をroot_fsファイルとして指定して起動している. 起動したターミナルとは別にxtermウィンドウが表示され,ログインプロンプトとなる. 先に作成したroot_fsでは,ユーザ名rootとするとパスワードなしでログインできるので,そのあとパスワード設定したり,ユーザを作成したりする.
    最終的には,UMLがホストOSと同じネットワーク上(同一ネットワークアドレス)にて1ホストとして他のマシンと疎通できるような状態にしたい. まず,ホストOSをデフォルトゲートウェイとして,ホストOSまで到達できるように,ネットワーク設定してみる. では,自分の環境にあわせて以下を設定してみる.
    /etc/hostname
    UMLで起動した仮想マシンのホスト名.
    /etc/hosts
    名前解決用ホスト名. とりあえず,ホストOSとlocalhostの設定をしてみる.
    /etc/network/interfaces
    ネットワークインタフェース設定. ホストOSのネットワーク環境に合わせて設定する.
    auto lo eth0 
    
    iface lo inet loopback
    
    iface eth0 inet static
            address 仮想マシン用の新しい値
            netmask 255.255.255.0
            network ホストOSのそれと同じ値
            gateway ホストOSのIP
    
    続いて一旦UMLをshutdown. そして,ホストOSにて,UMLのためのネットワークの設定をする. まず,ホストOSにおける,UML用ネットワークデバイスの作成.
    ~/uml# tunctl -u umluser
    Set 'tap0' persistent and owned by uid 9999
    
    -uの後には,UMLを起動するユーザのuidかユーザ名を指定する. tap0というのが用意される. 次に,このtap0をホストOSにおいてネットワーク設定する.
    ~/uml# ifconfig tap0 ホストOSにおけるUML用IPアドレス up
    
    ホストOSにおけるUML用IPアドレスは,先にUMLで設定したアドレスと重複してはならず,当然ホストOSのネットワークにおいて通信可能なものでなければならない. そして,UMLがtunデバイスにアクセスできるように,パーミッションを修正する.
    ~/#chmod 666 /dev/net/tun
    
    さらに,ホストOSにてルーティング設定.
    route add -host 仮想マシン用の新しい値(アドレス) dev tap0
    
    あとはeth0に準備したtap0を指定しつつUMLを起動.
    ~/uml$ linux-2.6.16.11 ubda1=./root_fs eth0=tuntap,tap0,,ホストOSでのUML用IPアドレス
    
    これで,UMLからホストOSへの疎通ができるようになる.
    matsu(C)
    Since 2002
    Mail to matsu