harry’s memorandum

おれおれメモ

Xenのディスクイメージファイルを拡張してみた

Xenのディスクイメージファイルを拡張してみました。]]Ubuntu Japan[[ にXenのディスクイメージの拡張方法が書いてあったので試してみたのですが、なかなかうまくいきませんでした。

# cd /etc/xen/images
# mv sarge-root.img sarge-root.img.old
# dd if=/dev/zero of=zero-1gb.img bs=1024k count=1024
# cat sarge-root.img.old zero-1gb.img > sarge-root.img
# e2fsck -fv sarge-root.img
# resize2fs sarge-root.img
# e2fsck -fv sarge-root.img
# xm create /etc/xen/sarge -c

上記の手順だと少なくともOSがLinuxでLVMでインストールした場合はうまくいきません。とりあえず色々調べてみて、一応できるようになったので備忘録として残しておきます。

手順はこんな感じ

作業はすべてrootでおこなっています。

  1. DomainUを停止
  2. ddやcatでディスクイメージのサイズを大きくする
  3. losetupでXenイメージファイルをループバックデバイスで制御できるようにする
  4. fdiskで区画を変更する
  5. 使ったループバックデバイスを削除する
  6. DomainUを起動
  7. pvresizeでFree領域を拡張する
  8. lvresizeでlvを拡張
  9. resize2fsでスライス拡張

DomainUを停止

適当に停止してください。

$ xm destroy test001

ディスクイメージのサイズを大きくする

通常の場合。ここでは3GB増やしてみる。

$ mv test001.img test001.img.bak
$ dd if=/dev/zero bs=1M count=0 seek=3072 of=./zerofile.img
$ cat test001.img.bak zerofile.img > test001.img

スパースファイルの場合(ここ参考)

$ cp -p --sparse=auto test001.img test001.img.bak # sparse-fileを維持してコピー
$ ls -ls test001.img
1081764 -rwxr-xr-x 1 root root 2147483649 Apr 16 03:16 test001.img
$ ruby -e 'File.open("test001.img","a").truncate(5<<30)'
$ ls -ls test001.img
1081764 -rwxr-xr-x 1 root root 5368709120 Apr 16 03:45 test001.img

losetupでXenイメージファイルをループバックデバイスで制御

空きloopbackデバイスを調べてループバックデバイスを設定します。

$ losetup -f
/dev/loop0
$ losetup /dev/loop0 ./test001.img
$ losetup -a
/dev/loop0: [fd00]:19367365 (./test001.img)
$ fdisk -lu /dev/loop0

Disk /dev/loop0: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders, total 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *          63      208844      104391   83  Linux
/dev/loop0p2          208845     4192964     1992060   8e  Linux LVM

fdiskで区画を変更する

fdiskで対象のスライスをいったん削除してシリンダサイズを再設定します。

$ fdisk  /dev/loop0

Command (m for help): d
Partition number (1-4): 2

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (14-652, default 14):
Using default value 14
Last cylinder or +size or +sizeM or +sizeK (14-652, default 652):
Using default value 652

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/loop0: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *           1          13      104391   83  Linux
/dev/loop0p2              14         652     5132767+  8e  Linux LVM

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 22: Invalid argument.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

使ったループバックデバイスを削除する

マナーとしてちゃんと後処理をする。

$ losetup -d /dev/loop0

DomainUを起動

$ xm create test001 -c

pvresizeでFree領域を拡張する

最初のpvscanでは "0 free" だが、pvresizeのpvscanでは "3.00 GB free" になっていることを確認。

$ pvscan
  PV /dev/xvda2   VG VolGroup00   lvm2 [1.88 GB / 0    free]
  Total: 1 [1.88 GB] / in use: 1 [1.88 GB] / in no VG: 0 [0   ]
$ pvresize /dev/xvda2
  Physical volume "/dev/xvda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized
$ pvscan
  PV /dev/xvda2   VG VolGroup00   lvm2 [4.88 GB / 3.00 GB free]
  Total: 1 [4.88 GB] / in use: 1 [4.88 GB] / in no VG: 0 [0   ]

lvresizeでlvを拡張

$ lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [1.47 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [416.00 MB] inherit
$ lvdisplay /dev/VolGroup00/LogVol00
  --- Logical volume ---
  LV Name                /dev/VolGroup00/LogVol00
  VG Name                VolGroup00
  LV UUID                oeAdv9-Cml8-04Ja-uZDM-3cvt-ZwIn-KXzEAM
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                1.47 GB
  Current LE             47
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

$ lvresize -L +3G /dev/VolGroup00/LogVol00
  Extending logical volume LogVol00 to 4.47 GB
  Logical volume LogVol00 successfully resized

resize2fsでスライス拡張

resize2fsでスライスを拡張します。LV Sizeは 先ほどは 1.47GBだったのが 4.47GBになっていることを確認。

$ resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 1171456 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 1171456 blocks long.

$ lvdisplay /dev/VolGroup00/LogVol00 | grep "LV Size"
  LV Size                4.47 GB
$ df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                      4.4G  901M  3.3G  22% /
/dev/xvda1             99M   13M   81M  14% /boot
tmpfs                 151M     0  151M   0% /dev/shm