新トップページへ | Tip

Xen の使い方メモ

LastUpdate : 11/07/16

 Xenを使ってサーバの仮想化をする際の、Tipみたいなのをまとめてあります。
私個人の、メモみたいなものなので、内容が正確かどーかとか、内容が完全であるかどーななどは、全然保障できませんので、あしからずー。

私の環境で、行ったらできたから、まぁ、これでいいやー的なノリなので、間違ってることもあるかと思いますので、そこは適時、「あー、かわいそうなやつだなぁ」と、生暖かい目で見守ってやってくださいtt
私の目的は、Xenを使い準仮想化を使い、仮想化ホストをいくらか作成することです。なので、ここでは完全仮想化の話は扱いません。

また、すべての操作をCUIで行います。

☆もくじ

下準備など・・・
4GB以上のメモリを搭載する場合
インストール時に仮想化を選択しておくと楽
Domain-Uのインストール
virt-install を使い、domain-Uを作成
xm コマンド
私がよく使うコマンド一覧
雑多なTip
domain-Uで、ディスクのフォーマットをext3で指定した場合の、domain-Uのディスク用のファイルへのアクセス方法
domain-Uに、ハードディスクを追加する
ディスクイメージファイルのサイズを拡張する






4GB以上のメモリを搭載する場合

マザーボードが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 というツールを使うと、簡単に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

オプションの説明:

--paravirt
準仮想化であることを指定します。
--name
domain-Uの識別用の名前を指定します(名前なので、好きな名前を指定します)。
--vcpu
domain-uから見えるCPUの数を指定します(domain-uが何個CPUがあるのかと、思わせさせる数を指定します
--ram
domain-0が動いているホストが持っているメモリのうち、このdomain-uにどのぐらいメモリを割り当てるかを指定します(MB単位)
--file
domain-uがhddとして使用する領域をファイルとして保存を行うための、そのファイルの保存場所、ファイル名を指定します。ファイル(上記例ではpostgres_server.vm)のおき場所のディレクトリは事前に作成しておく必要があります。
--file_size
--file で指定したファイルのサイズを指定します(GB単位)
--location
ディストリビューションのデータがある場所を指定します(ローカルのファイルパスを直接指定できません(/var/tmp/などは不可))。
--nographics
CUIでインストールするように指定
--nonsparse
--file で指定したファイルをsparseファイルとして作成しないことを指定します(すべての領域をあらかじめ、HDD上に作成しておく)

たぶん、こんな意味があったかと思います。

上記のコマンドを実行すると、しばらくすると、いつもどおりのディストリビューションのインストーラの画面が表示されると思います。
いつもどおりに、インストーラを実行するだけです(grubはインストールする)。

※ Domain0がBondingドライバを使用している場合について!
 私の環境(NICを二つ使いBondingドライバをDomain0が使ってる)の場合、Bondingドライバを使用する場合、上記だけではうまく行きませんでした。上記のオプションに加え、どのブリッジを使用するのか、指定すると、うまい具合にいきました。 例→ 「 --bridge=xenbr0 」

私がよく使うコマンド一覧

xm list
現在のDomain-0/Domain-Uのステータスの一覧を表示します。
xm create /etc/xen/postgres_server
指定したdomain-Uを起動します。create の後ろには、domain-Uの設定ファイルを指定します(例では/etc/xen/postgres_serverになっている)。
xm shutdown postgres_server
指定したdomain-Uをシャットダウンします。shutdownの後ろには「xm list」で表示されるdomain-Uの名前を指定します(例ではpostgres_erverになっている)。
また -w オプションをつけると、対象のOSが終了するまで、制御が帰ってこないようにすることができます(-wをつけないと、すぐにコンソールの制御が帰ってくる。)
xm destroy postgres_server
指定したdomain-Uを強制的に終了します(最後の手段用?)。通常はxm shutdownを使う。
xm top
topコマンドのように、それぞれのdomainの負荷状況などが表示されます。
xm console postgres_server
指定したdomainのコンソールに切り替える(例ではpostgres_server)
ctrlキー + ] キー
コンソールをdomain-0のものに戻す

domain-Uで、ディスクのフォーマットをext3で指定した場合の、domain-Uのディスク用のファイルへのアクセス方法

まぁ、タイトルでは意味不明かもしれませんが、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 ~]#

domain-Uに、ハードディスクを追加する

ドメイン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 ~]#