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構成などを意識する必要性がない点もメリットといえる。
仮想マシンのためのストレージデバイスとしては、以下の様な種類がある。
イメージファイルを利用する方法からやるのがスジではあるが、すでに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
インストール準備はここまで(のはず…)なのだが、やたら長くなってきたのでここで一度区切りを。