このページでは、ファームウェアとして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上の任意ディレクトリ>/<バックアップイメージ名>
# 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
# localectl set-keymap jp106
# ifconfig eth0 192.168.1.xxx netmask 255.255.255.0
# lvm vgchagne -ay
# gdisk <ディスクデバイスファイルパス>
# 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.
# mkfs.vfat -v -c -F32 -s2 <UEFI(/boot/efi)用パーティションデバイスファイルパス>
# mkfs.vfat -v -c -F32 -s2 /dev/vda1
# mkfs.xfs <boot(/boot)用パーティションデバイスファイルパス>
# mkfs.xfs /dev/vda2
# lvm pvcreate <デバイス>
# lvm vgcreate <vg名> <pvデバイスファイル>
# lvm lvcreate --size <lv容量> --name <lv名> <VG名>
# 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
# lvm vgchagne -ay
# mkdir /backup
# mount -t nfs -o rsize=8192,wsize=8192,intr <NFSサーバーエクスポートディレクトリ> /backup
# mkdir /backup
# mount -t nfs -o rsize=8192,wsize=8192,intr 192.168.1.2:/nfs /backup
# mkdir /restore
# mount -t xfs <ファイルシステムデバイス> /restore/<従来のマウントポイント>
# cd /restore/<従来のマウントポイント>
# gzip -dc /backup/<バックアップイメージ> | xfsrestore - ./
# sync
# mount -t vfat <UEFI用パーティションデバイスファイルパス> /restore/boot/efi
# cd /restore
# tar xf <バックアップイメージ>
# sync
# 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
# 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"
:
# mount -t proc proc /restore/proc
# mount --bind /dev /restore/dev
# mount -t sysfs sysfs /restore/sys
# chroot /restore
# 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 #タイムアウトの設定
# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
# 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 #←石橋を叩きたい数だけ(笑)
# exit
# sync;sync;sync
# exit