XenのDomain-Uディスク拡張(LVMを使用しない)

XenのDomain-Uのディスク拡張方法として、LVMで構築されたゲストの拡張方法はよく見かけますが、LVMを使用していないゲストのディスク拡張方法があまり見つからず、e2fsckでエラーが出まくり、ハマっていたのですが、以下のページで紹介されていた方法をそのままやったらできました。
http://www.jaddog.org/2009/08/12/expanding-a-xen-disk-images-space/


環境は、Red Hat Enterprise Linux 5.4です。xenのバージョンは、xen-3.0.3-94.el5_4.3を使用しています。
xenのバージョンや依存したような作業ではないと思うので、他のディストリビューションでも試す価値はあると思います。


ポイントは、xm block-attachです。


ちなみに、Linuxコマンドライン操作をはてなダイアリーで貼り付けるときは、何記法が一番見やすいのかな。


■拡張前のDomain-Uのディスクの状況

[root@domu1 ~]# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/xvda3             34G   31G  1.4G  96% /
/dev/xvda1             99M   18M   77M  19% /boot
tmpfs                 1.1G     0  1.1G   0% /dev/shm


■ディスク拡張を行います。

[root@xen-dom0 images]# xm shutdown domu1
[root@xen-dom0 images]# mv domu1.img domu1.img.old  
[root@xen-dom0 images]# dd if=/dev/zero of=zero-40gb.img bs=1024k count=40960
[root@xen-dom0 images]# cat domu1.img.old zero-40gb.img > domu1.img

ここまでの手順は一般的に紹介されています。
ゲストを落として、ddコマンドで作成したファイルをイメージファイルと結合して、
拡張したディスクイメージファイルを作成します。
ddコマンドは、例の場合は40GBのファイルを作成します。+1GBならcountは1024に指定します。値を変えて、追加したいディスクサイズに変更してください。

この後の手順では、e2fsckを行うのですが、以下の方法では失敗します。


■e2fsckが失敗してしまうパターン
(1)イメージファイルをfsckしてもダメ

[root@xen-dom0 images]# e2fsck -fv domu1.img
e2fsck 1.39 (29-May-2006)
Couldn't find ext2 superblock, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/loop0

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>


(2)ループバックにマウントしてfsckしてもダメ

[root@xen-dom0 images]# losetup /dev/loop0 pre-kp-cmsp01.img
[root@xen-dom0 images]# e2fsck -fv /dev/loop0
e2fsck 1.39 (29-May-2006)
Couldn't find ext2 superblock, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/loop0

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>


■イメージファイルのアタッチ
正解は、xm-block attachです。attachした後であれば、fsckが通ります。

[root@xen-dom0 images]# modprobe xenblk
[root@xen-dom0 images]# xm block-attach 0 'file:/var/lib/xen/images/domu1.img' xvda w


■アタッチの状況を確認(xvda1は/boot,xvda3が/です。xvda3を拡張します。)

[root@xen-dom0 images]# fdisk -l /dev/xvda

Disk /dev/xvda: 84.8 GB, 84892712960 bytes
255 heads, 63 sectors/track, 10320 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/xvda1   *           1          13      104391   83  Linux
/dev/xvda2              14         535     4192965   82  Linux swap / Solaris
/dev/xvda3             536        5099    36660330   83  Linux


fsckでディスクチェック(swapを除く)

[root@xen-dom0 images]# 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
/boot: 40/26104 files (10.0% non-contiguous), 20964/104388 blocks
[root@xen-dom0 images]# e2fsck -f /dev/xvda3
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
/: 295171/9166080 files (3.9% non-contiguous), 8352833/9165082 blocks


ext3->ext2に一時的に変更

[root@xen-dom0 images]# tune2fs -O^has_journal  /dev/xvda3
tune2fs 1.39 (29-May-2006)
[root@xen-dom0 images]# tune2fs -O^has_journal  /dev/xvda1
tune2fs 1.39 (29-May-2006)


■fdiskでディスク拡張
fdiskで拡張対象のパーティションを一度削除して、再作成します。
私の環境の場合3(xvda3)ですが、環境によってパーティションは変わりますので、気をつけましょう。fdiskの操作方法が分らない人は、調べてからやりましょう。

[root@xen-dom0 images]# fdisk /dev/xvda

このディスクのシリンダ数は 10320 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

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

Disk /dev/xvda: 84.8 GB, 84892712960 bytes
255 heads, 63 sectors/track, 10320 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/xvda1   *           1          13      104391   83  Linux
/dev/xvda2              14         535     4192965   82  Linux swap / Solaris
/dev/xvda3             536        5099    36660330   83  Linux

コマンド (m でヘルプ): d
領域番号 (1-4): 3

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

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

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

fsckで再チェック

[root@xen-dom0 images]# e2fsck -f /dev/xvda3
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
/: 295171/9166080 files (3.9% non-contiguous), 8320031/9165082 blocks


ext2->ext3に戻す

[root@xen-dom0 images]# 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@xen-dom0 images]# tune2fs -j /dev/xvda3
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@xen-dom0 images]# resize2fs -f /dev/xvda3
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/xvda3 to 19649503 (4k) blocks.
The filesystem on /dev/xvda3 is now 19649503 blocks long.


■最後にディタッチ

[root@xen-dom0 images]# xm block-detach 0 xvda


■ゲストの起動

[root@xen-dom0 images]# xm create domu1
Using config file "/etc/xen/domu1".
Started domain domu1


■Domain-Uディスクの確認

[root@domu1 ~]# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/xvda3             73G   31G   39G  45% /
/dev/xvda1             99M   18M   77M  19% /boot
tmpfs                 1.1G     0  1.1G   0% /dev/shm