きまぐれほげほげひろば

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

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

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

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

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

例(全ての情報を見るには下にスクロールしてください)
# uname -a Linux test-rocky10-uefi 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 Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: B5C52B43-490F-44EF-8D66-47F2ADD8D3EC Device Start End Sectors Size Type /dev/vda1 2048 1230847 1228800 600M EFI System /dev/vda2 1230848 3327999 2097152 1G Linux extended boot /dev/vda3 3328000 41940991 38612992 18.4G Linux LVM # df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/mapper/rl-root 17141760 2146124 14995636 13% / devtmpfs 4096 0 4096 0% /dev tmpfs 994724 0 994724 0% /dev/shm efivarfs 256 61 190 25% /sys/firmware/efi/efivars tmpfs 397892 5648 392244 2% /run tmpfs 1024 0 1024 0% /run/credentials/systemd-journald.service /dev/vda2 983040 281500 701540 29% /boot /dev/vda1 609596 8518 601078 2% /boot/efi tmpfs 1024 0 1024 0% /run/credentials/[email protected] tmpfs 198944 4 198940 1% /run/user/0 # pvdisplay --- Physical volume --- PV Name /dev/vda3 VG Name rl PV Size 18.41 GiB / not usable 2.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 4713 Free PE 0 Allocated PE 4713 PV UUID EeZFjN-qa34-nFdm-LoGW-auyN-gfx0-GdsDkA # vgdisplay --- Volume group --- VG Name rl System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 3 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 18.41 GiB PE Size 4.00 MiB Total PE 4713 Alloc PE / Size 4713 / 18.41 GiB Free PE / Size 0 / 0 VG UUID IkwOs2-m9sE-7Tg1-MI3L-Mnvy-K1ya-2OQ596 # lvdisplay --- Logical volume --- LV Path /dev/rl/swap LV Name swap VG Name rl LV UUID GyrSIY-93ao-fsKM-oPO3-OVGM-Y5oz-xWVlqg LV Write Access read/write LV Creation host, time test-rocky10-uefi, 2025-07-19 00:51:48 +0900 LV Status available # open 1 LV Size 2.00 GiB Current LE 512 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:1 --- Logical volume --- LV Path /dev/rl/root LV Name root VG Name rl LV UUID Cd3qzZ-PuBz-9uKw-roe9-D6yl-bhxa-LX4sHg LV Write Access read/write LV Creation host, time test-rocky10-uefi, 2025-07-19 00:51:48 +0900 LV Status available # open 1 LV Size 16.41 GiB Current LE 4201 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 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) /dev/vda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro)

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

ところで、ファームウェアは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

UEFI領域とその他の領域でバックアップ方法が異なります。バックアップはNFSに保存します。

UEFI領域のバックアップはtarコマンドで取得します(ファイルシステムがvfatであるので)。

# sync #念のため # cd / # tar cf <NFS上の任意ディレクトリ>/<任意のファイル名> /boot/efi
# sync # cd / # tar cf /backup/boot_efi.tar /boot/efi

マウントしているローカルディスクの全ファイルシステム(/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/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
# 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 #パーティションを復元できたことの確認
# fdisk -l # sfdisk /dev/vda < /backup/sfdisk_-d_dev_vda # fdisk -l
まずはUEFI用のファイルシステムを作成。FAT32で作成する
# mkfs.vfat -v -c -F32 -s2 <UEFI(/boot/efi)用パーティションデバイスファイルパス>
  • -s2 をつけないと「WARNING: Not enough clusters for a 32 bit FAT! 」とEFIに向かないとして怒られる
# mkfs.vfat -v -c -F32 -s2 /dev/vda1
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コマンドで見れるやつ)を無効にできる。CentOS5では拡張属性を持っているファイルがあり、無効にしておかないとrestoreでエラーになるがあまり気にしなくてもよいかも。
  • restore終了後に必ずsyncコマンドを実行してファイルキャッシュ内のファイルを書き出すこと。さもないと、再起動時に「ファイルがない」など怒られてカーネルパニックになり原因不明(これに嵌る時は解ってないからね・・・)の泣きをみる。
/boot/efiのみtarコマンドでリストアする。
# mount -t vfat <UEFI用パーティションデバイスファイルパス> /restore/boot/efi # cd /restore # tar xf <バックアップイメージ> # sync
  • 展開する前にtar tvfでアーカイブ内容を確認し、どこに展開されるか確認すると嵌らなくてすみます。
# 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 - ./ # # mount -t vfat /dev/vda1 /restore/boot/efi # cd /restore # tar xf /backup/boot_efi.tar # sync;sync;sync
使用するパーティションが各所でUUIDベースで指定されているので、ディスクやマザーボードがリストアによって変更となっている場合は気合で書き換える。
パーティション
# blkid <efiパーティションデバイスファイルパス> # blkid <bootパーティションデバイスファイルパス> # blkid <マウントしているパーティションデバイスファイルパス> # blkid <swapパーティションデバイスファイルパス> # vi /restore/etc/fstab UUID=rootパーティションUUID / xfs defaults 0 0 UUID=bootパーティションUUID /boot xfs defaults 0 0 UUID=efiパーティションUUID /boot/efi vfat umask=0077,shortname=winnt 0 2 UUID=swapパーティションUUID none swap defaults 0 0
# blkid /dev/vda1 /dev/vda1: UUID="D6EF-32DC" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="32453485-efc6-4698-b727-7f22b4ac0b9f" # blkid /dev/vda2 /dev/vda2: UUID="ff90b456-fd3f-41c4-acfb-0a2e278c0743" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="f61ef9f7-7b1f-4387-b0b1-1f58b15b5c03" # blkid /dev/rl/root /dev/rl/root: UUID="ef35c11c-2498-4992-91de-ac67901f4148" BLOCK_SIZE="512" TYPE="xfs" # blkid /dev/rl/swap /dev/rl/swap: UUID="069e0799-7f0e-410a-9635-cfc7413391a1" TYPE="swap" # vi /restore/etc/fstab UUID=ef35c11c-2498-4992-91de-ac67901f4148 / xfs defaults 0 0 UUID=ff90b456-fd3f-41c4-acfb-0a2e278c0743 /boot xfs defaults 0 0 UUID=D6EF-32DC /boot/efi vfat umask=0077,shortname=winnt 0 2 UUID=069e0799-7f0e-410a-9635-cfc7413391a1 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="069e0799-7f0e-410a-9635-cfc7413391a1" 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=069e0799-7f0e-410a-9635-cfc7413391a1 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=069e0799-7f0e-410a-9635-cfc7413391a1 rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet
grubブートローダー
# vi /restore/etc/sysconfig/grub GRUB_CMDLINE_LINUX="resume=UUID=<スワップ領域のUUID> rd.lvm.lv=<VG名>/root rd.lvm.lv=<VG名>/swap rhgb quiet" # vi /restore/boot/grub2/grub.cfg ### BEGIN /etc/grub.d/10_linux ### insmod part_gpt insmod xfs search --no-floppy --fs-uuid --set=root <bootパーティション領域のUUID> insmod part_gpt insmod fat search --no-floppy --fs-uuid --set=boot <EFIパーティション領域のUUID>
# vi /restore/etc/sysconfig/grub GRUB_CMDLINE_LINUX="resume=UUID=069e0799-7f0e-410a-9635-cfc7413391a1 rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet" # vi /restore/boot/grub2/grub.cfg ### BEGIN /etc/grub.d/10_linux ### insmod part_gpt insmod xfs search --no-floppy --fs-uuid --set=root ff90b456-fd3f-41c4-acfb-0a2e278c0743 insmod part_gpt insmod fat search --no-floppy --fs-uuid --set=boot D6EF-32DC
ネットワークインターフェースは起動時の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
grub2ブートメニューにも古いパーティションへのUUIDが定義されているので再作成し直します。
# grub2-mkconfig -o /boot/grub2/grub.cfg
次の起動直後にファイルコンテキストを再ラベル付けするように予約する。
# touch /.autorelabel
キャッシュに残っているファイル変更内容を書き込みます。これを忘れるとブートできません。
# sync;sync;sync #←石橋を叩きたい数だけ(笑)
chrootを終了します。
# exit
キャッシュに残っているファイル変更内容を書き込んで終了します、
# sync;sync;sync # exit
以上。
戻る