Xen の使い方メモ
LastUpdate : 11/07/16
Xenを使ってサーバの仮想化をする際の、Tipみたいなのをまとめてあります。
私個人の、メモみたいなものなので、内容が正確かどーかとか、内容が完全であるかどーななどは、全然保障できませんので、あしからずー。
私の環境で、行ったらできたから、まぁ、これでいいやー的なノリなので、間違ってることもあるかと思いますので、そこは適時、「あー、かわいそうなやつだなぁ」と、生暖かい目で見守ってやってくださいtt
私の目的は、Xenを使い準仮想化を使い、仮想化ホストをいくらか作成することです。なので、ここでは完全仮想化の話は扱いません。
また、すべての操作をCUIで行います。
マザーボードがP5B-V の場合、1GBを4枚いれても、デフォルトの状態でBIOSが認識するのは2.7GBぐらいでした(私の環境の場合。
この場合、BIOSの設定メニューにて、「Memory Remap Feature」をenableに設定すると(たしか、Northブリッジの設定あたりにあったはず)すんなりと4GB認識しました。
CentOSのインストール中、インストールするパッケージを選択するところで「virtualization」を選択しておくと、自動的にXenがインストール(xendやxen用カーネルなど)されます。
ここでvirtualizationを選ばず、後からインストールすることも可能ですが・・・。
カーネルの名前の後ろに、「Xen」などがついているのが、Xen用のカーネルです。
virt-install というツールを使うと、簡単にdomain-uを作成することができます(virt-install はデフォルトでインストールされています)。
ただし、ひとつ下準備が必要で、Web経由で、ディストリビューションディストリビューションのインストールディスクの内容すべてが、参照できる環境がなければなりません。オンラインでインストールを行ってもいいのですが、遅いです。
なので、自前で用意します。
httpd のデフォルトのトップページの位置は /var/www/html/ 以下です(ためしに、htmlディレクトリの下にaaa.htmlというファイルを作成しブラウザで「http://192.168.xxx.xxx/aaa.html」などとアクセスするとaaa.htmlの内容が表示される)。
なので、このhtmlディレクトリ以下に、ディストリビューションのCDの内容すべてをコピーしておきます。
私の場合、htmlディレクトリの下に、centos5 というディレクトリを作成し、そこに Domain-0をインストールしたときに使ったDVDの内容をすべてコピーしました。
で、以下のコマンドを実行
virt-install --paravirt --name=postgres_server --vcpu=2 --ram=256 --file=/var/xen/postgres_server/postgres_server.vm --file-size=8 --location=http://192.168.11.65/centos5/ --nographics --nonsparse |
オプションの説明:
たぶん、こんな意味があったかと思います。
上記のコマンドを実行すると、しばらくすると、いつもどおりのディストリビューションのインストーラの画面が表示されると思います。
いつもどおりに、インストーラを実行するだけです(grubはインストールする)。
※ Domain0がBondingドライバを使用している場合について!
私の環境(NICを二つ使いBondingドライバをDomain0が使ってる)の場合、Bondingドライバを使用する場合、上記だけではうまく行きませんでした。上記のオプションに加え、どのブリッジを使用するのか、指定すると、うまい具合にいきました。 例→ 「 --bridge=xenbr0 」
まぁ、タイトルでは意味不明かもしれませんが、domain-Uをインストールした際に、作成されるファイル(domain-Uではこれをディスクとして扱う)の内容をdomain-0から、マウントしたい場合の話です。
もちろん、対象のdomain-Uは動いていない状態にしてください(shutdownされている状態)
前提として、domain-Uをインストールする際、LVMを使用せず、ext3+swapのみを指定した場合です(以下のように配置)。
1 : /boot ext3
2 : swap
3 : / ext3
以下のようすると、できます。
[root@chiki ~]# losetup -f /dev/loop0 ←loop0 が空いていることがわかった [root@chiki ~]# losetup /dev/loop0 /var/xen/postgres_server/postgres_server.vm ←domainUが使っているファイルをloop0に接続 [root@chiki ~]# kpartx -a /dev/loop0 ←loop0の内容をマッピングする [root@chiki ~]# ls -al /dev/mapper/ total 0 drwxr-xr-x 2 root root 120 Apr 7 18:51 . drwxr-xr-x 13 root root 4480 Apr 7 18:47 .. crw------- 1 root root 10, 62 Apr 7 15:56 control brw-rw---- 1 root disk 253, 0 Apr 7 18:51 loop0p1 ← /boot brw-rw---- 1 root disk 253, 1 Apr 7 18:51 loop0p2 ← swap brw-rw---- 1 root disk 253, 2 Apr 7 18:51 loop0p3 ← / [root@chiki ~]# mount /dev/mapper/loop0p3 /mnt ← loopOp3 をマウントする [root@chiki ~]# cd /mnt [root@chiki mnt]# ls ← lsコマンドをで、/(ルート)でディレクトリ・ファイルの一覧を表示させている。 bin dev home lib64 media mnt poweroff root selinux sys usr boot etc lib lost+found misc opt proc sbin srv tmp var [root@chiki mnt]# cd ← バックアップなど、作業が終了したらアンマウントする [root@chiki ~]# umount /mnt [root@chiki ~]# kpartx -d /dev/loop0 ← 終了作業(-dのdはたぶんdeleteの頭文字?)。 [root@chiki ~]# losetup -d /dev/loop0 ← 終了作業(-dのdはたぶんdeleteの頭文字?)。 [root@chiki ~]# losetup -f ←ちゃんと開放されているか念のため調べる /dev/loop0 [root@chiki ~]# |
ドメインUに、ハードディスクなど、domain-0が認識しているものを、追加する方法についてです(← 日本語がたぶんおかしいです。まぁ・・・、ブロックデバイスをアタッチする方法、みたいな?
状況から説明すると、サーバ機に、2台ハードディスクを追加し、それをDomain-0にて、ソフトウェアRAID(RAID1)化しました。
このドライブのデバイス名前は「 /dev/md4 」です(私が勝手に作った)。
ext3でフォーマットした状態です。
この領域を、Domain-Uにて使わせたい場合、どうやってやるか、が、今回の内容です(domain-0がマウントしているものを、domain-Uにマウントさせると、えらい事になるそうですので、domain-0もdomain-Uもマウントするようなデバイスは、domain-Uを起動させる前に、umountしてからdomain-Uを起動させないといけない。)
作業内容としては、(1)domain-0にて、domain-uの設定ファイルの編集、(2)domain-uにて、ドライブへのlabel設定、(3)/etc/fstabファイルを編集、とこれだけでOKの様子です(たぶん)。
(1) domain-0にて、domain-uの設定ファイルの編集
CentOS5では、domain-uの設定ファイルは「 /etc/xen/ 」のディレクトリ以下にあります(ここに、domain-Uの名前のファイルが、そのdomain-Uの設定ファイルです。ちなみに、ここで使っている「設定ファイル」という言葉は、便宜上、私が勝手に名前をつけているだけで、正式にはなんて名前なのか、知りませんw)。
その設定ファイルの中に、次のような行があるかと思います(改行されているかもしれませんが、1行です)。
disk = [ "tap:aio:/var/xen/file_server/file_server.vm,xvda,w" ] |
domain-Uが、HDDだと認識させるものを、ここで設定しています。
diskのところの書式は
disk = [ "仮想ブロックデバイスとして認識させるもの" ]
となっています。複数指定したい場合は
disk = [ "仮想ブロックデバイスとして認識させるもの" , "仮想ブロックデバイスとして認識させるもの" , <以下、左記と同じフォーマット> ]
と、コンマをいれて、区切ります。最大いくつまで指定できるかは、私は知りません(私は2個までしかやったことがありません)。
で、この「"仮想ブロックデバイスとして認識させるもの"」と書いた部分ですが、ハードディスクのイメージファイルを指定する場合と、普通のブロックデバイスを指定する場合とで、書式が異なります。
上記の例では、「/var/xen/file_server/file_server.vm」のイメージファイルを、仮想ブロックデバイス名を「xvda」という名前にし、(domain-Uから見ると、/dev/xvdaというデバイスが見えるようになる。仮想ブロックデバイス名前は、xvdと先頭につけ、xvdaやxvda1、xvda2、xvdb、xvdb1、xvdb2・・・などにしたほうがよいそうです(便宜上などの問題?・・・ちなみに、xvdとは、Xen
Virtual block Deviceの頭文字なんだそうです))。
< ちなみに、この file_server.vm は3つのパーティーションを含んでいるファイルです(swapと/bootと/がマウントするパーティーションが入っています。) >
イメージファイルを指定する場合
"tap:aio:/var/xen/file_server/file_server.vm,xvda,w"
というように、「 tap:aop:<イメージファイルのフルパス>,仮想ブロックデバイスの名,オプション 」と記述します(ちなみに、オプションの意味は私はわかってないですttたぶん、「w」とか指定すると書き込みOKになるとか?みたいな理解しかしてませんw)。
ブロックデバイスを指定する場合
"phy:md3,xvda4,w"
というように、「 phy:domain-0のブロックデバイス名,仮想ブロックデバイスの名,オプション 」と記述します(サンプルは、実際の私の環境から引っ張ってきました。md4になってるのはRAID構成になってるからです)。
(2)domain-uにて、ドライブへのlabel設定
fstabファイルの設定ですが、普通に
domain-Uの /etc/fstab ファイルの内容 |
LABEL=/ / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 /dev/xvda4 /file_server ext3 defaults 1 2 itmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 LABEL=SWAP-xvda2 swap swap defaults 0 0 |
3行目が、書き加えたものです。
これを書き加えて、rebootさせると、普通に、/file_server(このディレクトリはてきとーに作った)に、domain-0の/dev/md4がマウントできている様子です。
が、今の時代(?)これではよろしくないらしい。
上の二行を見ればわかりますが、ラベルというものを使うらしいです。
ラベルをつけるには、「 e2label 」というコマンドを使用します。
[root@minerva ~]# e2label /dev/xvda4 nyannyan [root@minerva ~]# e2label /dev/xvda4 nyannyan [root@minerva ~]# |
デフォルトでは、ラベルはつけられていない様子です。
ここではテストのため、 /dev/xvda4 に、「 nyannyan 」というラベルをつけてみました。e2labelで、デバイスのみ指定すると、つけられているラベルを表示するそうです。
(3)/etc/fstabファイルを編集
(2)にもでてきましたが、fstabファイルを以下のように変更します。
domain-Uの /etc/fstab ファイルの内容 |
LABEL=/ / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 LABEL=nyannyan /file_server ext3 defaults 1 2 itmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 LABEL=SWAP-xvda2 swap swap defaults 0 0 |
(2)との違う点は、3行目を「 LABEL=nyannyan 」にしてみました(ラベルで指定した文字列)。
これで、rebootなどをすれば、/file_server に自動的にマウントされているはずです。
※おまけ(単なる、ぐだぐだ)
個人的な感想なのですが、domain-Uにて、e2labelで、デバイスに名前をつける点について、ちと、ひっかかりがあります。
domain-Uにて、割り当てられた仮想ブロックデバイスに対し、e2labelを実行し、domain-0にて、domain-Uにて割り当てていたブロックデバイスに対し、e2labelで、ラベルを表示させると、domain-0からでも、domain-Uがつけたラベルになっています。
まぁ、当然といえば、当然なのかもしれません。実際の操作対象は、domain-0上のブロックデバイスなのですから。
しかしまぁ・・・、domain-Uはdomain-Uで、閉じた世界で、動かしたいなぁというのが個人的感想です(イメージファイルのみ使うようにするか、fstabファイルで(2)のように、直接デバイス名を指定するなどすれば、問題ないわけですが)。
Domain-Uを新規で作成し、yumでupdateをしていたら、こんなことになった
[root@localhost ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/xvda1 1517232 1438244 672 100% / tmpfs 131072 0 131072 0% /dev/shm [root@localhost ~]# |
ワロタ。ディスクの拡張を行います。仕方ないね。
Domain-UはLVMを使っていません。単純にswap領域と、OSのインストール領域があるだけです。
現在、1.5GBほどしか割り当てられていないので、これを拡張したいと思います。
やり方については、以下のURLに手順が載っていた。これを参考にしながらやってみた。
→ http://www.jaddog.org/2009/08/12/expanding-a-xen-disk-images-space/
すべてDomain-0からの操作となります。
1.ディスクイメージファイルのサイズを増やす
既存のディスクイメージファイルのサイズに、追加したい容量分のファイルを作成します。
私の場合、ディスクイメージファイルが2GB、追加したい容量が1GBなので、1GBの空のファイルを作成することになります。
[root@chiki bind_server]# dd if=/dev/zero of=blank_file bs=1024k count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 2.16266 seconds, 496 MB/s [root@chiki bind_server]#
現在あるディスクイメージファイル(bind_server.vm.old)と、上記で作った空ファイルをマージします。
[root@chiki bind_server]# cat bind_server.vm.old blank_file > bind_server.vm [root@chiki bind_server]# ls -lh total 6.1G -rw-r--r-- 1 root root 3.0G Jul 16 12:31 bind_server.vm -rwxr-xr-x 1 root root 2.0G Jul 16 12:04 bind_server.vm.old -rw-r--r-- 1 root root 1.0G Jul 16 12:28 blank_file [root@chiki bind_server]#
これで、ディスクイメージファイル自体は3GBの容量をもったこととなります。blank_fileはもう不要なので、消してOKです。
2.ディスクイメージファイルにアタッチする
/dev/xvdaへディスクイメージファイルをアタッチします。ついでにディスクチェックも行います。
[root@chiki ~]# modprobe xenblk [root@chiki ~]# xm block-attach 0 'file:/var/xen/bind_server/bind_server.vm' xvda w [root@chiki ~]# e2fsck -f /dev/xvda1 e2fsck 1.39 (29-May-2006) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /: 42390/391680 files (0.6% non-contiguous), 371783/391584 blocks [root@chiki ~]#
3.ジャーナルを削除
ジャーナルを削除しておく。
[root@chiki ~]# tune2fs -O^has_journal /dev/xvda1 tune2fs 1.39 (29-May-2006) [root@chiki ~]#
4.fdiskでパーティーションを作成。
拡張したいパーティーションの開始シリンダを覚えておきます。
拡張対象のパーティーションを削除し、それから、パーティーションを新規に作ります。え?削除しちゃうの?って思ったのですが、この新パーティーションの開始シリンダ位置を同じにすればOKみたい。
[root@chiki ~]# e2fsck -f /dev/xvda1 e2fsck 1.39 (29-May-2006) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /: 42390/391680 files (0.6% non-contiguous), 371783/391584 blocks [root@chiki ~]# fdisk /dev/xvda Command (m for help): p Disk /dev/xvda: 3221 MB, 3221225472 bytes 255 heads, 63 sectors/track, 391 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/xvda1 * 67 261 1566337+ 83 Linux /dev/xvda2 1 66 530113+ 82 Linux swap / Solaris Partition table entries are not in disk order Command (m for help): d Partition number (1-4): 1 Command (m for help): p Disk /dev/xvda: 3221 MB, 3221225472 bytes 255 heads, 63 sectors/track, 391 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/xvda2 1 66 530113+ 82 Linux swap / Solaris Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (67-391, default 67): Using default value 67 Last cylinder or +size or +sizeM or +sizeK (67-391, default 391): Using default value 391 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@chiki ~]# fdisk /dev/xvda -l Disk /dev/xvda: 3221 MB, 3221225472 bytes 255 heads, 63 sectors/track, 391 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/xvda1 67 391 2610562+ 83 Linux /dev/xvda2 1 66 530113+ 82 Linux swap / Solaris Partition table entries are not in disk order [root@chiki ~]#
5.ジャーナルを再設定
さきほど、ジャーナルを消したので、付け直します。
[root@chiki ~]# e2fsck /dev/xvda1 e2fsck 1.39 (29-May-2006) /: clean, 42390/391680 files, 363581/391584 blocks [root@chiki ~]# tune2fs -j /dev/xvda1 tune2fs 1.39 (29-May-2006) Creating journal inode: done This filesystem will be automatically checked every -1 mounts or 0 days, whichever comes first. Use tune2fs -c or -i to override. [root@chiki ~]#
6.ファイルシステムを拡張&後処理
後処理は忘れずにやる必要があります・・・。
[root@chiki ~]# resize2fs -f /dev/xvda1 resize2fs 1.39 (29-May-2006) Resizing the filesystem on /dev/xvda1 to 652640 (4k) blocks. The filesystem on /dev/xvda1 is now 652640 blocks long. [root@chiki ~]# xm block-detach 0 xvda [root@chiki ~]#
以上の手順を踏んでから、Domain-Uを起動すると、以下のようにちゃんと容量が増えています。
[root@localhost ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/xvda1 2528752 1436440 987892 60% / tmpfs 131072 0 131072 0% /dev/shm [root@localhost ~]# |