きまぐれほげほげひろば

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

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

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

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

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

# gdisk -l /dev/sda 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 # df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/mapper/vgRestoreTest-lvroot 26201600 3333036 22868564 13% / devtmpfs 498312 0 498312 0% /dev tmpfs 508200 80 508120 1% /dev/shm tmpfs 508200 7040 501160 2% /run tmpfs 508200 0 508200 0% /sys/fs/cgroup /dev/vda2 508588 100300 408288 20% /boot /dev/vda1 204580 9996 194584 5% /boot/efi /dev/mapper/vgRestoreTest-lvvar 4507648 110760 4396888 3% /var # pvdisplay --- Physical volume --- PV Name /dev/vda3 VG Name vgRestoreTest PV Size 31.31 GiB / not usable 2.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 8016 Free PE 1 Allocated PE 8015 PV UUID f4OvWJ-56V9-HmvU-CtyO-37fl-m7On-7krJfX # vgdisplay --- Volume group --- VG Name vgRestoreTest System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 3 Open LV 3 Max PV 0 Cur PV 1 Act PV 1 VG Size 31.31 GiB PE Size 4.00 MiB Total PE 8016 Alloc PE / Size 8015 / 31.31 GiB Free PE / Size 1 / 4.00 MiB VG UUID LqpORh-Kye3-YAe6-v3qz-nQye-hW5e-b8Kvqe # lvdisplay --- Logical volume --- LV Path /dev/vgRestoreTest/lvroot LV Name lvroot VG Name vgRestoreTest LV UUID X8WWUd-sjfW-8DdU-dGOi-bxOC-sped-SP0iZH LV Write Access read/write LV Creation host, time localhost, 2015-12-10 09:12:40 +0900 LV Status available # open 1 LV Size 25.00 GiB Current LE 6400 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0 --- Logical volume --- LV Path /dev/vgRestoreTest/lvswap LV Name lvswap VG Name vgRestoreTest LV UUID uuNWoQ-yYiP-xPZx-ozSh-garF-lemR-uN5jAu LV Write Access read/write LV Creation host, time localhost, 2015-12-10 09:12:41 +0900 LV Status available # open 2 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/vgRestoreTest/lvvar LV Name lvvar VG Name vgRestoreTest LV UUID SjncKR-8SPC-OOLV-UEI1-nhxH-1uET-714MIJ LV Write Access read/write LV Creation host, time localhost, 2015-12-10 09:12:42 +0900 LV Status available # open 1 LV Size 4.31 GiB Current LE 1103 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:2 # mount /dev/mapper/vgRestoreTest-lvroot on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota) /dev/vda2 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota) /dev/vda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro) /dev/mapper/vgRestoreTest-lvvar on /var type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

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

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/mapper/vgTest-lvvar | gzip -c > /backup/var.dump.gz # xfsdump -l 0 - /dev/mapper/vgTest-lvroot | gzip -c > /backup/root.dump.gz

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

# gdisk -l > /<NFS上の任意ディレクトリ>/gdisk_<デバイス名>.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 CentOS system を選択
ファイルシステムを/mnt/sysiamge以下にマウントするか?を聞かれるが、マウントしない。「skip」を選択
キーボードを日本語配列にする
# localectl set-keymap jp106
ネットワークを手動で有効化する
# ifconfig eth0 192.168.1.xxx netmask 255.255.255.0
ディスクのvgが有効化されていないので有効化する
# lvm vgchagne -ay
ディスクのパーティションを定義
# gdisk <ディスクデバイスファイルパス>
  • 初めはcommand:oで空のGUIDパーティションテーブルを作成
  • lvm領域はタイプを8e00(LinuxLVM)にする
  • CentOS7の場合、2番目のパーティションは/bootでxfsファイルシステムのはずであるが、タイプは何故か0700(Micorsoft Basic)になる。デフォルトがそうだから気にしない。
# gdisk /dev/vda Command (? for help): o This option deletes all partitions and creates a new protective MBR. Proceed? (Y/N): Y Command (? for help): n Partition number (1-128, default 1): First sector (34-2097118, default = 2048) or {+-}size{KMGTP}: Last sector (2048-2097118, default = 2097118) or {+-}size{KMGTP}: 411647 Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): EF00 Changed type of partition to 'EFI System' Command (? for help): n Partition number (2-128, default 2): First sector (34-2097118, default = 411648) or {+-}size{KMGTP}: Last sector (411648-2097118, default = 2097118) or {+-}size{KMGTP}: 1435647 Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): 0700 Changed type of partition to 'Microsoft basic data' Command (? for help): n Partition number (3-128, default 3): First sector (34-2097118, default = 1435648) or {+-}size{KMGTP}: Last sector (1435648-2097118, default = 2097118) or {+-}size{KMGTP}: Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): 8E00 Changed type of partition to 'Linux LVM' Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): Y OK; writing new GUID partition table (GPT) to /dev/vda. The operation has completed successfully.
まずは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を定義
# lvm pvcreate <デバイス> # lvm vgcreate <vg名> <pvデバイスファイル> # lvm lvcreate --size <lv容量> --name <lv名> <VG名>
  • vg名は以前のvg名とあわせる
  • エクステントサイズを決めるときのvgcreateのオプションは-s サイズ、エクステント数を指定するlvcreateのオプションは-l 個数
# pvcreate /dev/vda3 # vgcreate vgTest /dev/vda3 # lvcreate --extents 6400 --name lvroot vgTest # lvcreate --extents 512 --name lvswap vgTest # lvcreate --extents 1103 --name lvvar vgTest
ファイルシステム作成
# mkfs.xfs <ファイルシステムデバイスファイルパス>
スワップ領域作成
# mkswap <swap用パーティションデバイスファイルパス>
# mkfs.xfs /dev/vgRestoreTest/lvroot # mkfs.xfs /dev/vgRestoreTest/lvvar # mkswap /dev/vgRestoreTest/lvswap
※完全にリストアが完了するまでに中断(電源落とす)して再開した場合、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 # mount -t nfs -o rsize=8192,wsize=8192,intr 192.168.1.2:/nfs /backup
”復旧させるファイルシステムのルートディレクトリ”に移動して、リストアする。
一番最初に復旧させる/にマウントするファイルシステムを/restoreにマウントしリストアする。その後、復旧させる/bootなどにマウントするファイルシステムを/restore/boot(/をリストアことによって復活している)マウントしてリストアする。他も同様に順にリストアする。
# mkdir /restore # mount -t xfs <ファイルシステムデバイス> /restore/<従来のマウントポイント> # cd /restore/<従来のマウントポイント> # gzip -dc /backup/<バックアップイメージ> | xfsrestore - ./ # sync
(mountから繰り返し)
  • mountするときは、ファイルシステムタイプを必ず指定すること。rescueモードでは自動的にファイルシステムタイプを認識しない。(よって、 ext3でもタイプを指定しなければext2でマウントされてしまう → バックアップイメージが2G超だとrestoreがフリーズする)
  • restore時に-Tオプションで大容量ファイルが格納できるディレクトリを指定する。1ファイルをバックアップイメージから抜き出すときに使用するため。この領域がなければrestoreは失敗する(restoreがデフォルトで使用するrescueモードの/tmpは小さい)。復旧予定のディスクの /tmpになるファイルシステムをマウントして、そのディレクトリを指定しておけば良い。
  • 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/vgTest/lvroot /restore # cd /restore # gzip -dc /backup/root.dump.gz | xfsrestore - ./ # # mount -t xfs /dev/vgTest/lvvar /restore/var # cd /restore/var # gzip -dc /backup/var.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 <マウントしているパーティションデバイスファイルパス> # vi /restore/etc/fstab
# blkid /dev/vda1 /dev/vda1: UUID="C355-B095" TYPE="vfat" PARTLABEL="EFI System" PARTUUID="214a1c1c-6131-4f8c-b470-b7fb219f3988" # blkid /dev/vda2 /dev/vda2: UUID="ad4bde00-c644-4ceb-a2f4-702c17902ad7" TYPE="xfs" PARTLABEL="Microsoft basic data" PARTUUID="88c57518-882c-4e69-b768-73018e914fa2" # vi /restore/etc/fstab UUID=ad4bde00-c644-4ceb-a2f4-702c17902ad7 /boot xfs defaults 0 0 UUID=C355-B095 /boot/efi vfat umask=0077,shortname=winnt 0 0
ネットワークインターフェース
# nmcli connection show vi /restore/etc/sysconfig/network-scripts/ifcfg-eth0
# nmcli connection show 名前 UUID タイプ デバイス eth0 44964187-649c-41bd-ba63-bff2538ce513 802-3-ethernet eth0 # vi /restore/etc/sysconfig/network-scripts/ifcfg-eth0 : NAME="eth0" UUID="44964187-649c-41bd-ba63-bff2538ce513" DEVICE="eth0" :
など・・・
ブート設定時に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
UEFIのブート順指定設定にも、ブートローダが配置されるパーティションの古いUUIDが存在しているので設定し直します。
現在の起動順を表示し、既存の設定を削除する。
# efibootmgr -v #起動順の参照 BootCurrent: 0000 Timeout: 1 seconds BootOrder: 0000,0001 Boot0000* CentOS HD(1,800,64000,7e44aa01-f593-4ce4-8ec8-b3afba558cfc)File(\EFI\CENTOS\SHIM.EFI) Boot0001* UEFI OS HD(1,800,64000,7e44aa01-f593-4ce4-8ec8-b3afba558cfc)File(\EFI\BOOT\BOOTX64.EFI) # efibootmgr -b 1 -B # 削除 # efibootmgr -b 0 -B # 削除
起動順を登録します。
# efibootmgr -c -d /dev/vda -p 1 -l '\EFI\CENTOS\SHIM.EFI' -L 'CentOS' # efibootmgr -o 0000 # efibootmgr -t 1 #タイムアウトの設定
  • -dはディスクのデバイスファイルパス
  • -pは/boot/efiのパーティション番号
  • -lはファイルシステム内のブートローダファイルへのパス(実際のパスが/boot/efi/EFI/CENTOS/shim.efiであれば\EFI\CENTOS\SHIM.EFI)
  • -lのフォルダを示す記号はFATなのでバックスラッシュ
  • -lのパスは全て大文字
grub2ブート設定(/boot/efi/EFI/CENTOS/grub.cfg)にも、古いパーティションへのUUIDが定義されているので再作成し直します。
# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
  • 「/run/lvm/lvmetad.socket: connect failed:No such file or directory」という警告がたくさん出力される
こちらも古いディスクを探しに行くので再作成し直します。
# cd /boot # ls vmlinuz-* # ls initramfs-* # mv initramfs-3.10.0-229.el7.x86_64.img initramfs-3.10.0-229.el7.x86_64.img.old # dracut -f initramfs-3.10.0-229.el7.x86_64.img 3.10.0-229.el7.x86_64
キャッシュに残っているファイル変更内容を書き込みます。これを忘れるとブートできません。
# sync;sync;sync #←石橋を叩きたい数だけ(笑)
chrootを終了します。
# exit
キャッシュに残っているファイル変更内容を書き込んで終了します、
# sync;sync;sync # exit
UEFIではブートローダは/boot/efi以下に存在しており、バックアップ時点でファイルとしてバックアップしているのでgrub2-installは不要です。
以上。
戻る