LinuxでXFSファイルシステムのOSのディスクを別のディスクにコピーする場合のメモ。

ミラーリングをしたくない場合でバックアップ用ディスクを作りたい場合や、ディスクの内容をまるごと別のディスクに移したい場合などに。

以下のログは SLES10 SP1 で試した時のもので、1本目のディスクは、swap と / の2パーティション構成の場合とします。

node01:~ # df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              74G  4.6G   69G   7% /
udev                  501M  124K  501M   1% /dev
node01:~ # 
fdisk や parted で2本目のディスクにパーティションを作成。
今回はまったく同じ構成にしてみました。
(サイズやパーティション構成を変更したい場合にも使えます)
node01:~ # fdisk -l /dev/sd[ab]

Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         131     1052226   82  Linux swap / Solaris
/dev/sda2             132        9729    77095935   83  Linux

Disk /dev/sdb: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         131     1052226   82  Linux swap / Solaris
/dev/sdb2             132        9729    77095935   83  Linux
node01:~ # 
mkfsでファイルシステム作成。
ext3と違って一瞬で完了するのが嬉しい。
node01:~ # mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2              isize=256    agcount=16, agsize=1204623 blks
         =                       sectsz=512   attr=0
data     =                       bsize=4096   blocks=19273968, imaxpct=25
         =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096  
log      =internal log           bsize=4096   blocks=9411, version=1
         =                       sectsz=512   sunit=0 blks
realtime =none                   extsz=4096   blocks=0, rtextents=0
node01:~ # 
swap作成。
node01:~ # mkswap /dev/sdb1
Setting up swapspace version 1, size = 1077473 kB
node01:~ # 
2本目のディスクの / パーティションを /new にマウント。
node01:~ # mount /dev/sdb2 /new
node01:~ # df -h / /new
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              74G  4.6G   69G   7% /
/dev/sdb2              74G  544K   74G   1% /new
node01:~ # 
あと、OSのDVD等に含まれるxfsdumpパッケージが必要。
これでdump/restoreの準備完了です。
/ から /new ファイルシステムへのコピーは、manページにあるように、基本的に以下で可能。
# xfsdump -J - / | xfsrestore -J - /new
この -J はdump inventory databaseを更新しないというオプション。
xfsdumpはインクリメンタルバックアップなどのために、databaseとして /var/lib/xfsdump/inventory を使用するが、今回のようなコピーの場合には必要がないため。

あと、私は -p 60 といったオプションを付けたりします。
指定秒毎に進捗を表示してくれます。

実際のログは以下。
node01:~ # xfsdump -J - / | xfsrestore -J -p 60 - /new
xfsrestore: using file dump (drive_simple) strategy
xfsdump: xfsrestore: version 2.2.43 (dump format 3.0) - Running single-threaded
using file dump (drive_simple) strategy
xfsdump: version 2.2.43 (dump format 3.0) - Running single-threaded
xfsdump: level 0 dump of node01:/
xfsdump: dump date: Thu Jan  8 19:17:11 2009
xfsdump: session id: b52423b6-bc30-4859-89cb-c1b6b478fdbc
xfsdump: session label: ""
xfsrestore: media label: ""
xfsrestore: file system id: cf274d72-c6f4-41ff-9f17-38b6fbc281dc
xfsrestore: session id: b52423b6-bc30-4859-89cb-c1b6b478fdbc
xfsrestore: media id: 59d1444a-04c8-4cac-a425-7b57f0ad1689
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsdump: dumping non-directory files
xfsrestore: 8796 directories and 101172 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: status at 19:18:11: 9955/89299 files restored, 5.7% complete, 60 seconds elapsed
xfsrestore: status at 19:19:11: 19612/89299 files restored, 11.5% complete, 120 seconds elapsed
(中略)
xfsrestore: status at 19:26:11: 75234/89299 files restored, 98.1% complete, 540 seconds elapsed
xfsdump: ending media file
xfsdump: media file size 4674038560 bytes
xfsdump: dump size (non-dir files) : 4641927160 bytes
xfsdump: dump complete: 564 seconds elapsed
xfsdump: Dump Status: SUCCESS
xfsrestore: restore complete: 573 seconds elapsed
xfsrestore: Restore Status: SUCCESS
node01:~ # 
dfなどで確認。
node01:~ # df -h / /new
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              74G  4.6G   69G   7% /
/dev/sdb2              74G  4.6G   69G   7% /new
node01:~ # 
/etc/fstab , /boot/grub/menu.lst を確認。
/dev/sda1などのデバイス名で指定してあれば問題ないが、LABELやUUIDで指定してある場合には変更などが必要。

最後に、このままでは、2本目のディスクには GRUB がインストールされていないので手動でインストールする必要がある。
今回、2本目のディスクの /boot はこの時点では /dev/sdb2 にあるので、grub で root (hd1,1) を指定して setup すればインストールされる。
node01:~ # grub

grub> root (hd1,1)
 Filesystem type is xfs, partition type 0x83

grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/xfs_stage1_5" exists... yes
 Running "embed /boot/grub/xfs_stage1_5 (hd1)"...  18 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd1) (hd1)1+18 p (hd1,1)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.

grub> 

以上で、2本目のディスクに入れ替えれば、同じOSで起動するはずです。

ちなみに、どのファイルシステムが好きかと言えば、やはりXFSですね。
サポートされていれば、XFSを使いたいです。