Ubuntu で xfs ファイルシステム間でのドライブコピー
Ubuntu で、xfsdumpとxfsrestoreを用いてXFSファイルシステムの内容を別のドライブへ論理的にコピーする。xfsdumpはマウント済みのファイルシステムを対象とするため、コピー元とコピー先の両方をマウントした状態で実行する。コピー先はあらかじめmkfs.xfsでフォーマットする。必要に応じてxfs_adminでコピー先のUUIDを変更する。xfsdumpパッケージとxfsprogsパッケージを使用する。
この方法は、ddのような物理的なブロック単位のコピーとは異なる。ファイルやディレクトリの構造、および拡張属性を保ったまま、別のXFSファイルシステムへ内容をコピーする論理コピーである。パーティションテーブルやブートローダーはコピーされない。
Ubuntu環境での手順例
以下の手順は、Ubuntu 24.04 LTS 環境での実行を想定している。
必要なパッケージのインストール
xfsdumpとxfsrestoreはxfsdumpパッケージに、mkfs.xfs、xfs_admin、xfs_repairはxfsprogsパッケージに含まれる。端末で次のコマンドを実行してインストールする。
# パッケージリストの情報を更新
sudo apt update
sudo apt -y install xfsprogs xfsdump
前提条件と準備
- コピー元とコピー先のデバイス(パーティション)を
lsblkやblkidコマンドで確認する。lsblk -f - コピー先のデバイスにXFSファイルシステムを作成する。この操作によりコピー先の既存データは失われる。
/dev/sdXnの部分は、実際のデバイス名に置き換える。sudo mkfs.xfs /dev/sdXn - コピー先をマウントする。
sudo mkdir -p /path/to/destination sudo mount /dev/sdXn /path/to/destination xfsdumpはマウントされていないファイルシステムをダンプできないため、コピー元もマウントした状態にする。コピー中の書き込みは取りこぼしの原因になるので、コピー元は読み取り専用で再マウントするか、コピー元を使用するサービスを停止しておく。sudo mount -o remount,ro /path/to/sourcexfsdumpとxfsrestoreの実行にはroot権限が必要である。
コピーの実行
コピー元とコピー先がマウントされた状態で、次のコマンドを実行する。
sudo sh -c 'xfsdump -J - /path/to/source | xfsrestore -J -p 60 - /path/to/destination'
xfsdumpがコピー元の内容を標準出力へ書き出し、パイプ(|)経由でxfsrestoreがコピー先へ書き戻す。各要素の説明は次の通りである。
xfsdump -J - /path/to/source: コピー元の内容をダンプする。-Jはダンプ記録(インベントリ)の更新を行わないオプションで、/var/lib/xfsdump/inventoryに記録を残さずにコピーする場合に使う。-はダンプデータを標準出力へ送ることを示す。/path/to/sourceはコピー元のマウントポイントまたはデバイス名である。xfsrestore -J -p 60 - /path/to/destination: ダンプデータを受け取り、コピー先へ書き戻す。-Jはこちら側でも指定する。-は標準入力からデータを読むことを示す。-p 60は進捗状況を60秒間隔で表示するオプションで、容量が大きい場合に進行状況を確認できる。/path/to/destinationはコピー先のマウントポイントである。
オプション: コピー先ファイルシステムのUUIDを変更する
/etc/fstabでファイルシステムをUUIDで指定している場合、コピー先のUUIDをコピー元と同じ値にすると、/etc/fstabを書き換えずに起動できる。OSドライブの交換時に使う手順である。
UUIDが同じファイルシステムを同時に接続すると、どちらがマウントされるか定まらない。UUIDを一致させたときは、コピー元のドライブを取り外してからコピー先を使用する。
手順は次の通りである。/dev/sda1をコピー元、/dev/sdb1をコピー先とする。
- コピー元のUUIDを確認する:
blkidコマンドを実行する。
表示されたUUID(sudo blkid /dev/sda1abcdefab-1234-5678-abcd-abcdefabcdefのような形式)を控えておく。 - コピー先をアンマウントする:
xfs_adminはマウント中のデバイスを変更できない。sudo umount /path/to/destination - コピー先のUUIDを変更する:
xfs_adminコマンドを使用する。abcdefab-1234-5678-abcd-abcdefabcdefの部分は、コピー元で確認した実際のUUIDに置き換える。
UUIDの変更にはログ(ジャーナル)が処理済みである必要がある。正常にアンマウントしていればこの条件を満たす。ログが未処理であるという趣旨のメッセージが出た場合は、いったんマウントして再びアンマウントすることでログが処理される。sudo xfs_admin -U abcdefab-1234-5678-abcd-abcdefabcdef /dev/sdb1xfs_repair -Lはログを破棄するコマンドであり、書き込み途中のデータが失われるため、マウントによる復旧ができない場合に限り使用する。 - 変更後のUUIDを確認する: 再度
blkidコマンドを実行する。sudo blkid /dev/sdb1 - コピー元と異なるUUIDのまま使用する場合は、
/etc/fstabの該当行を新しいUUIDに書き換える。
注意点
- コピーされるのはファイルシステムの内容である。パーティションテーブルとブートローダーは別途設定する。
- 容量が大きい場合、実行に時間がかかる。
-p 60オプションで進捗を確認できる。 - 各コマンドの詳細は
man xfsdump、man xfsrestore、man xfs_adminで確認できる。