きまぐれほげほげひろば

Linux システムバックアップリストア(xfs dump restoreおよびbios)

このページでは、ファームウェアとしてbiosを使用し、Linuxにてxfsファイルシステムを使用しているときのシステムバックアップリストア方法について記載しています。

xfsdumpを使用してファイルシステムイメージでバックアップしているので、OS付属のコマンドのみでバックアップリストアを実現し、aclやselinuxにも対応できます。(aclやselinuxの場合は権限の箇所を適時読み替えてください)

OS標準機能のみでバックアップリストアをしてみたい貧乏人もしくは玄人変人向けです。安全に確実に安定性を求めたバックアップをしたい人は大人しく製品を使用してください。このページを真似して損害が発生しても筆者は一切責任を負いません。
(こんな苦労しなくてもClonezillaというオープンソースもあります)

(この方法を記載するにあたり検証した環境は、KVMベースの仮想マシンに、OSはRocky Linux10です。RHEL10でも通用するはずです。以下のような構成です。)

例(全ての情報を見るには下にスクロールしてください)
# uname -a Linux test-rocky10 6.12.0-55.12.1.el10_0.x86_64 #1 SMP PREEMPT_DYNAMIC Fri May 23 17:41:02 UTC 2025 x86_64 GNU/Linux # cat /etc/redhat-release Rocky Linux release 10.0 (Red Quartz) # fdisk -l /dev/vda Device Start End Sectors Size Type /dev/vda1 2048 4095 2048 1M BIOS boot /dev/vda2 4096 2101247 2097152 1G Linux extended boot /dev/vda3 2101248 83884031 81782784 39G Linux LVM # df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/mapper/rl-root 38682624 4686240 33996384 13% / devtmpfs 4096 0 4096 0% /dev tmpfs 1004280 0 1004280 0% /dev/shm tmpfs 401712 8808 392904 3% /run tmpfs 1024 0 1024 0% /run/credentials/systemd-journald.service /dev/vda2 983040 295220 687820 31% /boot tmpfs 200856 116 200740 1% /run/user/986 tmpfs 200856 60 200796 1% /run/user/0 # pvdisplay --- Physical volume --- PV Name /dev/vda3 VG Name rl PV Size <39.00 GiB / not usable 0 Allocatable yes (but full) PE Size 4.00 MiB Total PE 9983 Free PE 0 Allocated PE 9983 PV UUID XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX # vgdisplay --- Volume group --- VG Name rl System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size <39.00 GiB PE Size 4.00 MiB Total PE 9983 Alloc PE / Size 9983 / <39.00 GiB Free PE / Size 0 / 0 VG UUID XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX # lvdisplay --- Logical volume --- LV Path /dev/rl/swap LV Name swap VG Name rl LV UUID XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX LV Write Access read/write LV Creation host, time test-rocky10, 2025-06-26 00:39:07 +0900 LV Status available # open 1 LV Size 2.04 GiB Current LE 523 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:1 --- Logical volume --- LV Path /dev/rl/root LV Name root VG Name rl LV UUID XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX LV Write Access read/write LV Creation host, time test-rocky10, 2025-06-26 00:39:07 +0900 LV Status available # open 1 LV Size 36.95 GiB Current LE 9460 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 # mount | egrep "(xfs|fat)" /dev/mapper/rl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) selinuxfs on /sys/fs/selinux type selinuxfs (rw,nosuid,noexec,relatime) /dev/vda2 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

以下の条件がそろっていることを前提とします。

ところで、ファームウェアはBIOSかUEFIかどっち?はfdisk -lコマンドで1番目のパーティションタイプを参照すれば分かります。

BIOSの場合
# fdisk -l /dev/vda Device Start End Sectors Size Type /dev/vda1 2048 4095 2048 1M BIOS boot /dev/vda2 4096 2101247 2097152 1G Linux extended boot /dev/vda3 2101248 83884031 81782784 39G Linux LVM
UEFIの場合
# gdisk -l /dev/vda Number Start (sector) End (sector) Size Code Name 1 2048 411647 200.0 MiB EF00 EFI System Partition 2 411648 1435647 500.0 MiB 0700 3 1435648 3907028991 1.8 TiB 8E00

マウントしているローカルディスクの全ファイルシステム(/tmp以外)をバックアップします。

# sync #念のため # xfsdump -l 0 - <ファイルシステムデバイスファイルパス> | gzip -c > /<NFS上の任意ディレクトリ>/<バックアップイメージ名>
  • <ファイルシステムデバイスファイルパス>は/dev/sda2や/dev/<vg名>/<lv名>など
  • ファイルシステムの数だけ繰り返してください
  • シングルユーザモードでバックアップを取得した方が良いですが、経験上DBの書き込み等がなければ、そこまで神経質にならなくてもよいのではと思います。(書き込み中だったファイルが失われるだけ。→ログファイル等→この目的のバックアップで必要??別のバックアップ方法でとっているのでは?? 各自で判断してください。)
  • オンラインでバックアップを取得してバックアップファイルを潰すことが心配であるなら、LVMのスナップショットを組み合わせて使用したほうがよいでしょう(vgに空き領域が必要です)。LVMスナップショットについては、こちらを参照してください。
  • gzipしないほうが確実です。(でも破損することってあるの?こちらもリスクと運用・コストなどつき合わせて各自で判断してください。)
# sync # xfsdump -l 0 - /dev/vda2 | gzip -c > /backup/boot.dump.gz # xfsdump -l 0 - /dev/mapper/rl-root | gzip -c > /backup/root.dump.gz

あとで泣かないように、パーティション構造、lvm構造とかも記録しておきます。

# sfdisk -d /dev/vda > /<NFS上の任意ディレクトリ>/sfdisk_-d_dev_vda # vgcfgbackup -f /<NFS上の任意ディレクトリ>/vgcfgbackup # fdisk -l > /<NFS上の任意ディレクトリ>/fdisk_<デバイス名>.txt # df > /<NFS上の任意ディレクトリ>/df.txt # cat /etc/fstab > /<NFS上の任意ディレクトリ>/fs.txt # pvdisplay > /<NFS上の任意ディレクトリ>/lv.txt # vgdisplay > /<NFS上の任意ディレクトリ>/vg.txt # lvdisplay > /<NFS上の任意ディレクトリ>/vp.txt # mount > /<NFS上の任意ディレクトリ>/mount.txt
# sfdisk -d /dev/vda > /backup/sfdisk_-d_dev_vda # vgcfgbackup -f /backup/vgcfgbackup Volume group "rl" successfully backed up. # fdisk -l > /backup/fdisk_-l WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion. # gdisk -l /dev/vda > /backup/gdisk # df > /backup/df # pvdisplay > /backup/pvdisplay # vgdisplay > /backup/vgdisplay # lvdisplay > /backup/lvdisplay # mount > /backup/mount

TroubleShooting -> Rescue a Rocky Linux system を選択
ファイルシステムを/mnt/sysiamge以下にマウントするか?を聞かれるが、マウントしない。「3) Skip to Shell」を選択
キーボードを日本語配列にする
# localectl set-keymap jp106
DHCPで自動的にネットワーク接続されているが、手動で設定する場合は以下でネットワークを手動で有効化する
# ifconfig eth0 192.168.1.xxx netmask 255.255.255.0
ディスクのvgが有効化されていないので有効化する
# lvm vgchagne -ay
/backup 以下にバックアップイメージを置いたNFS領域をマウント
# mkdir /backup # mount -t nfs -o rsize=8192,wsize=8192,intr <NFSサーバーエクスポートディレクトリ> /backup
大抵のディストリビューションのrescueモードはnfsマウントしかできないはず・・・ (家庭用NASでsmbfs(cifs)のみのものがあるので注意!)
# mkdir /backup # nfsの場合 # mount -t nfs -o rsize=8192,wsize=8192,intr 192.168.1.2:/nfs /backup # smbfsの場合 # mount -t cifs -o vers=1.0,guest //192.168.1.2/smb /backup
バックアップしたパーティション情報を読み込んでディスクパーティション作成
# sfdisk <ディスクデバイスファイルパス> < /backup/sfdisk_-d_dev_vda
# fdisk -l # sfdisk /dev/vda < /backup/sfdisk_-d_dev_vda # fdisk -l
boot用のファイルシステムを作成。xfsで作成する
# mkfs.xfs <boot(/boot)用パーティションデバイスファイルパス>
# mkfs.xfs /dev/vda2
バックアップしたLVM VG情報を基にlvm PVを再作成する。
pv0内のid=の値を確認
# less /backup/vgcfgbackup <vg名> { physical_volumes { pv0 { id = "<pv0のuuid>"
pv再作成
# pvcreate --uuid "<pv0のuuid>" --restorefile /backup/vgcfgbackup <LVM用パーティションデバイスファイルパス>
# less /backup/vgcfgbackup physical_volumes { pv0 { id = "vZ3hT0-qYEX-1b28-05DN-F7Id-PfK6-E1FSuR" device = "/dev/vda3" # Hint only status = ["ALLOCATABLE"] # pvcreate --uuid "vZ3hT0-qYEX-1b28-05DN-F7Id-PfK6-E1FSuR" --restorefile /backup/vgcfgbackup /dev/vda3
バックアップしたLVM VG情報を読み込んでLVM VGおよびLVを再作成する。
# vgcfgrestore -f /backup/vgcfgbackup <VG名>
PV/VG/LVが再作成されたか確認
# pvs # vgs # lvs # vgchange -ay <VG名> #これしないと/dev/以下にlvのデバイスが見えない
# vgcfgrestore -f /backup/vgcfgbackup rl # pvs # vgs # lvs # vgchange -ay rl
ファイルシステム作成
# mkfs.xfs <ファイルシステムデバイスファイルパス>
スワップ領域作成
# mkswap <swap用パーティションデバイスファイルパス>
# mkfs.xfs /dev/rl/root # mkswap /dev/rl/swap
※完全にリストアが完了するまでに中断(電源落とす)して再開した場合、vgが有効化されていないので有効化する
# lvm vgchagne -ay
”復旧させるファイルシステムのルートディレクトリ”に移動して、リストアする。
一番最初に復旧させる/にマウントするファイルシステムを/restoreにマウントしリストアする。その後、復旧させる/bootなどにマウントするファイルシステムを/restore/boot(/をリストアことによって復活している)マウントしてリストアする。他も同様に順にリストアする。
# mkdir /restore # mount -t xfs <ファイルシステムデバイス> /restore/<従来のマウントポイント> # cd /restore/<従来のマウントポイント> # gzip -dc /backup/<バックアップイメージ> | xfsrestore - ./ # sync
(mountから繰り返し)
  • mountするときは、ファイルシステムタイプを必ず指定すること。rescueモードでは自動的にファイルシステムタイプを認識しない。(よって、 ext3でもタイプを指定しなければext2でマウントされてしまう → バックアップイメージが2G超だとrestoreがフリーズする)
  • mountコマンドで、nouser_xattrオプションで拡張属性(lsattrコマンドで見れるやつ)を無効にできる。
  • restore終了後に必ずsyncコマンドを実行してファイルキャッシュ内のファイルを書き出すこと。さもないと、再起動時に「ファイルがない」など怒られてカーネルパニックになり原因不明(これに嵌る時は解ってないからね・・・)の泣きをみます。
# mkdir /restore # mount -t xfs /dev/rl/root /restore # cd /restore # gzip -dc /backup/root.dump.gz | xfsrestore - ./ # # mount -t xfs /dev/vda2 /restore/boot # cd /restore/boot # gzip -dc /backup/boot.dump.gz | xfsrestore - ./ # sync;sync;sync
使用するパーティションが各所でUUIDベースで指定されているので、ディスクやマザーボードがリストアによって変更となっている場合は気合で書き換える。
パーティション
# blkid <マウントしているパーティションデバイスファイルパス> # blkid <swapパーティションデバイスファイルパス> # vi /restore/etc/fstab UUID=<パーティションデバイスのUUID> / xfs defaults 0 0 UUID=<swapパーティションデバイスのUUID> none swap defaults 0 0
# blkid /dev/vda2 /dev/vda2: UUID="ca203617-2efe-40d2-afe3-43f7841e251c" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="27d1279b-e041-45f2-8a43-801e24a5f33a" # blkid /dev/rl/root /dev/rl/root: UUID="69e5479e-3f61-4f5c-8576-566bc299e023" BLOCK_SIZE="512" TYPE="xfs" # blkid /dev/rl/swap /dev/rl/swap: UUID="65bfdb15-d689-4f2a-add5-3dfc4e2599ff" TYPE="swap" # vi /restore/etc/fstab UUID=69e5479e-3f61-4f5c-8576-566bc299e023 / xfs defaults 0 0 UUID=ca203617-2efe-40d2-afe3-43f7841e251c /boot xfs defaults 0 0 UUID=65bfdb15-d689-4f2a-add5-3dfc4e2599ff none swap defaults 0 0
カーネルパラメータ(swap領域のUUIDが指定されている)
# blkid <swapパーティションデバイスファイルパス> # vi /restore/boot/loader/entries/<マシンID>-<カーネルリリース番号>.conf options root=/dev/mapper/rl-root ro resume=UUID=<スワップ領域のUUID> rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet # vi /restore/boot/loader/entries/<マシンID>-0-rescue.conf options root=/dev/mapper/rl-root ro resume=UUID=<スワップ領域のUUID> rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet
# blkid /dev/rl/swap /dev/rl/swap: UUID="65bfdb15-d689-4f2a-add5-3dfc4e2599ff" TYPE="swap" # vi /restore/boot/loader/entries/2e0dd30dc9c149258994175d4ef856fc-6.12.0-55.12.1.el10_0.x86_64.conf options root=/dev/mapper/rl-root ro resume=UUID=65bfdb15-d689-4f2a-add5-3dfc4e2599ff rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet # vi /restore/boot/loader/entries/2e0dd30dc9c149258994175d4ef856fc-0-rescue.conf options root=/dev/mapper/rl-root ro resume=UUID=65bfdb15-d689-4f2a-add5-3dfc4e2599ff rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet
ネットワークインターフェースは起動時のdracutで自動的にUUIDを書き換えてくれるので不要
など・・・
ブート設定時にchrootするが、その時に必要となるdev,proc,sysをchroot先のディレクトリにマウントする
# mount -t proc proc /restore/proc # mount --bind /dev /restore/dev # mount -t sysfs sysfs /restore/sys
リストア先パスにchrootする
# chroot /restore
ディスクのMBRにブートローダをインストールする。
# grub2-install <ディスクデバイスパス>
# grub2-install /dev/vda
こちらも古いディスクを探しに行くので再作成し直します。
# cd /boot # ls initramfs-* # mv initramfs-<カーネルリリース番号>.img initramfs-<カーネルリリース番号>.img.old # dracut -f /boot/initramfs-<カーネルリリース番号>.img <カーネルリリース番号>
# cd /boot # ls initramfs-* # mv initramfs-6.12.0-55.12.1.el10_0.x86_64.img initramfs-6.12.0-55.12.1.el10_0.x86_64.img.old # dracut -f /boot/initramfs-6.12.0-55.12.1.el10_0.x86_64.img 6.12.0-55.12.1.el10_0.x86_64
grub2ブート設定(/boot/grub2/grub.cfg)にも、古いパーティションへのUUIDが定義されているので再作成し直します。
# grub2-mkconfig -o /boot/grub2/grub.cfg
キャッシュに残っているファイル変更内容を書き込みます。これを忘れるとブートできません。
# sync;sync;sync #←石橋を叩きたい数だけ(笑)
chrootを終了します。
# exit
キャッシュに残っているファイル変更内容を書き込んで終了します、
# sync;sync;sync # exit
以上。
戻る