Xen - CentOS Domain0にFedora DomainUを導入する…直前まで(^_^;)

Xenでは、Domain0が各種ハードウェアデバイスを制御しており、DomainUの各仮想マシンはDomain0が提供する仮想的なデバイス(VBD[Virtual Block Device]/仮想ブロックデバイス)を通じてハードウェアデバイスを使用する。

Linuxでは各種ハードウェアデバイスへのアクセスのほとんどはファイルへのアクセスとして処理される(たとえば、HDDへのアクセスには、/dev/配下のデバイスファイルへのアクセスとして処理される)。しかし、XenにおいてDomainUに導入された仮想マシンは物理的なハードウェアデバイスを「独占的に」使用することは出来ないため、その処理をDomain0を経由して行う。その際、DomainUからDomain0に対してデバイスアクセスを経由する仕組みをXenBusという。DomainUからはフロントエンドドライバによってXenBusにデバイスアクセスが伝えられ、Domain0に導入されたバックエンドドライバはさらにDomain0のデバイスドライバにデバイスアクセスを依頼することによって、DomainUから伝えられたデバイスアクセスを実際の物理ハードウェアデバイスに伝えている。よって、DomainUにおいて動作する仮想マシンにはフロントエンドドライバの導入が必要となる。
※準仮想化方式の話となるが、Xenの基本であるため断定的に書く。仮想マシンを使ってお勉強をしているため、完全仮想化方式のXen DomainUをテストしてみることがちょっと難しいということもあるが…。

Xenではデバイスドライバ開発の手間を省くために、Domain0が持つ通常のLinuxデバイスドライバを使用してデバイスアクセスを行う仕組みになっている。ただし、CPUおよびMemoryへのアクセスと、例外的にXenが提供する仮想デバイスについてのみはXen自身により処理される。この仕組みのため、Xenは一般的に、Domain0のLinuxが稼働する環境であればどんな環境においても動作させることができる。
DomainUに導入するゲストOS側では、上述したXenBusを経由したフロントエンドドライバによるハードウェアデバイスへのアクセスを行うため、物理マシンに搭載されている個別のハードウェアデバイス用のデバイスドライバを導入する必要はない。たとえば、Domain0が実行されている環境においてQlogic HBAが使われていたり、iSCSI Hardware Initiatorが使用されているとしても、それらのデバイスを制御するためのデバイスドライバはDomain0側にのみ導入すればよく、DomainU側の各仮想マシンデバイスドライバを導入する必要はない。同様の理由で、DomainU側の仮想マシンではディスクのRAID構成などを意識する必要性がない点もメリットといえる。

仮想マシンのためのストレージデバイスとしては、以下の様な種類がある。

  • イメージファイルを利用する
  • ハードディスクの全部/一部を利用する
  • 論理ボリュームマネージャを利用する
  • NFSエクスポート領域を利用する(NFSブート)
  • IP-SANを使用する

イメージファイルを利用する方法からやるのがスジではあるが、すでに1度"virt-install"を使用してやっているし、後回しにしてまずはハードディスクの一部を利用する方法からやってみる。なお、Domain0はこれまで同様CentOS5.1だが、ここではDomainUとしてFedora8を導入してみる。

まずは仮想マシンに新規ハードディスクデバイスを割り当て、起動する。起動したら"fdisk"でまっさらのディスクが認識されることを確認。

[root@XenCentOS ~]# fdisk /dev/sdb
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): p

Disk /dev/sdb: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System

仮想マシンを使うことのメリットはこうして簡単にディスクを追加したり削除したりすることができるところだ。というか、今回のXenのお勉強ではMacBookに導入したVMware Fusion仮想マシン上に、Xenでさらに仮想か環境を構築し、VM on VMをやっているわけで、どこまでできるかというチャレンジでもあるので。

さて、ディスクが認識されていることが確認されたら、今回はパーティションを仮想ディスクとして使用するため、以下の2つのパーティションを作成する。

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-522, default 1): 
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-522, default 522): +3500M

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 2
最初 シリンダ (428-522, default 428): 
Using default value 428
終点 シリンダ または +サイズ または +サイズM または +サイズK (428-522, default 522): +500M

コマンド (m でヘルプ): t
領域番号 (1-4): 2
16進数コード (L コマンドでコードリスト表示): 82
領域のシステムタイプを 2 から 82 (Linux swap / Solaris) に変更しました

コマンド (m でヘルプ): p

Disk /dev/sdb: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         427     3429846   83  Linux
/dev/sdb2             428         489      498015   82  Linux swap / Solaris

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。

ここでは"/dev/sdb1"を仮想マシンのルートパーティション用として3.5GB、"/dev/sda2"を仮想マシンスワップファイル用領域として500MB用意した。ルートパーティション用の方は特にタイプ変更は必要ないが、スワップ用の方はシステムタイプ82を選択し"Linux swap"に変更しておく。

つづいてファイルシステムの作成。
ルートファイルシステム用の領域の方は、普通にext3にフォーマット。

[root@XenCentOS ~]# mkfs -t ext3 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
429408 inodes, 857461 blocks
42873 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=880803840
27 block groups
32768 blocks per group, 32768 fragments per group
15904 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200

Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

続いて、スワップの方も。

[root@XenCentOS ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 509960 kB

パーティションファイルシステムが準備できたところで早速マウントパスを作ってマウント。

[root@XenCentOS mnt]# mkdir -p /mnt/VM_Fedora_1
[root@XenCentOS mnt]# mount /dev/sda1 /mnt/VM_Fedora_1/
[root@XenCentOS mnt]# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       9014656   4573672   3975680  54% /
/dev/sda1               101086     32003     63864  34% /boot
tmpfs                   719460         0    719460   0% /dev/shm
/dev/sda1               101086     32003     63864  34% /mnt/VM_Fedora_1

さて、その上で"/mnt/VM_Fedora_1/"フォルダ配下に"dev"フォルダを作成、キャラクタデバイスを作成する。

[root@XenCentOS /]# for i in console null zero tty1 tty2 tty3 tty4 tty5 tty6 tty7 tty8
> do
>    MAKEDEV -d /mnt/VM_Fedora_1/dev -x $i
> done
[root@XenCentOS dev]# ls
X0R  console  null  tty  tty1  tty2  tty3  tty4  tty5  tty6  tty7  tty8  zero

続いて、"/etc/fstab"ファイルを作成。

[root@XenCentOS etc]# cat fstab 
proc		/proc		proc	defaults	0	0
/dev/xvda1	/		ext3	defaults	0	1
none		/dev/pts	devpts	gid=5,mode=620	0	0
none		/dev/shm	tmpfs	defaults	0	0
none		/sys		sysfs	defaults	0	0		
/dev/xvda2	swap		swap	defaults	0	0

さて、CentOSがDomain0となっている環境にFedoraを入れようとしているので、Fedora用のyumを入手して事前準備が必要だ。
作業用のフォルダを用意し、まずはFedora8用のyumを入手。

[root@XenCentOS vmtemp]# wget ftp://ftp.riken.go.jp/Linux/fedora/releases/8/Fedora/x86_64/os/Packages/yum-3.2.7-1.fc8.noarch.rpm
--12:07:48--  ftp://ftp.riken.go.jp/Linux/fedora/releases/8/Fedora/x86_64/os/Packages/yum-3.2.7-1.fc8.noarch.rpm
           => `yum-3.2.7-1.fc8.noarch.rpm'
ftp.riken.go.jp をDNSに問いあわせています... 134.160.38.1
ftp.riken.go.jp|134.160.38.1|:21 に接続しています... 接続しました。
anonymous としてログインしています... ログインしました!
==> SYST ... 完了しました。    ==> PWD ... 完了しました。
==> TYPE I ... 完了しました。  ==> CWD /Linux/fedora/releases/8/Fedora/x86_64/os/Packages ... 完了しました。
==> SIZE yum-3.2.7-1.fc8.noarch.rpm ... 508278
==> PASV ... 完了しました。    ==> RETR yum-3.2.7-1.fc8.noarch.rpm ... 完了しました。
長さ: 508278 (496K)

100%[===================================================================================>] 508,278     1.04M/s   in 0.5s   

12:07:48 (1.04 MB/s) - `yum-3.2.7-1.fc8.noarch.rpm' を保存しました [508278]

rpmパッケージのダウンロードが完了したら、"rpm2cpio"と"cpio"を使ってrpmパッケージの中身を抜き出す。
"rpm2cpio"によりrpmをcpio archiveに変換、それをそのままパイプでcpioに渡してファイルを取り出す。

[root@XenCentOS vmtemp]# rpm2cpio yum-3.2.7-1.fc8.noarch.rpm | cpio -id
3391 blocks
[root@XenCentOS vmtemp]# ls
etc  usr  var  yum-3.2.7-1.fc8.noarch.rpm

こんなかんじで、実行したフォルダ直下にetc, usr, varなどのフォルダが出来ていればOK。
続いて、取り出したファイルの内、etc/yum.confファイルを仮想マシンのルートパーティション用のパーティション配下の"/etc"フォルダにコピーする。

[root@XenCentOS etc]# cp /root/vmtemp/etc/yum.conf /mnt/VM_Fedora_1/etc/

続いて、Fedora用の固有設定"fedora-release-8-3.noarch.rpm"をyum同様に入手。

[root@XenCentOS vmtemp]# wget ftp://ftp.riken.go.jp/Linux/fedora/releases/8/Fedora/x86_64/os/Packages/fedora-release-8-3.noarch.rpm
--12:29:12--  ftp://ftp.riken.go.jp/Linux/fedora/releases/8/Fedora/x86_64/os/Packages/fedora-release-8-3.noarch.rpm
           => `fedora-release-8-3.noarch.rpm'
ftp.riken.go.jp をDNSに問いあわせています... 134.160.38.1
ftp.riken.go.jp|134.160.38.1|:21 に接続しています... 接続しました。
anonymous としてログインしています... ログインしました!
==> SYST ... 完了しました。    ==> PWD ... 完了しました。
==> TYPE I ... 完了しました。  ==> CWD /Linux/fedora/releases/8/Fedora/x86_64/os/Packages ... 完了しました。
==> SIZE fedora-release-8-3.noarch.rpm ... 27548
==> PASV ... 完了しました。    ==> RETR fedora-release-8-3.noarch.rpm ... 完了しました。
長さ: 27548 (27K)

100%[===================================================================================>] 27,548      --.-K/s   in 0.09s  

12:29:13 (311 KB/s) - `fedora-release-8-3.noarch.rpm' を保存しました [27548]

これまた同じくファイルを取り出す。

[root@XenCentOS vmtemp]# rpm2cpio fedora-release-8-3.noarch.rpm | cpio -id
99 blocks

yum.confと同様、/etcフォルダ配下にできているリポジトリ設定ディレクトリ"yum.repos.d"を仮想マシン用ルートパーティション配下の"/etc"フォルダに同じようにコピー。

[root@XenCentOS etc]# cp -r yum.repos.d/ /mnt/VM_Fedora_1/etc/

ここからはちょっとした調整。
まずは変換処理。バージョン変数、アーキテクチャ変数を修正し、yumプラグインの無効化を行う。

[root@XenCentOS ~]# sed -i 's/\$releasever/8/g' /mnt/VM_Fedora_1/etc/yum.repos.d/*
[root@XenCentOS ~]# sed -i 's/\$basearch/x86_64/g' /mnt/VM_Fedora_1/etc/yum.repos.d/*
[root@XenCentOS ~]# sed -i 's/plugins=.*/plugins=0/g' /mnt/VM_Fedora_1/etc/yum.conf

続いて"firstboot-tui"の無効化を"yum.conf"ファイルに設定し、起動時のSetup Agentの起動を抑止。

[root@XenCentOS ~]# echo exclude=firstboot-tui >> /mnt/VM_Fedora_1/etc/yum.conf

最後に、"/var/log/"フォルダを用意して準備はおしまい。

[root@XenCentOS VM_Fedora_1]# mkdir -p /mnt/VM_Fedora_1/var/log

インストール準備はここまで(のはず…)なのだが、やたら長くなってきたのでここで一度区切りを。