前にbios使ったVMでxfsdump/xfsrestore使ったリストアをやってみた。
業務でリクエスト受けているのは、実機が最近のものでbiosじゃなくてuefi使う。
VMのefiでもリストアうまくいくかを検証してみた。
最後に実機で違ったことや、調べたことも少し入れといた。
efi使ってVM用意する
uefiと何がちゃうんやろ?
ここに書いてた。
へぇ、intelとhpが最初のを作ったんや。
2005年頃にuefiになってMBRじゃなくGPT使えるようになったから、2TBオーバーのディスクを扱えるってか。
歴史はそこそこでええ。
VM用意してみると、パーティションはefi特有のパーティション構成になる。
efiのことあんまりよく知らなかったのでハマったから、biosのときの続きじゃなくて別枠でメモ書く。
vmwareってefi使えるんかなぁって軽く探したらすぐ出てきた。
できるん知らんかった。作者さんありがとう。
biosはシンプルでええんやけど、今はuefiが主流かな。
それはサーバの梱包解いたときのお楽しみってことで。
efiになるとlinuxの場合はパーティション構成が少し変わる。
ダンプも変わる。
gcpとかaws使ってたらほとんど意識せんことやけど・・・。
たいへん参考になるサイトがあった。作者さんありがとう。
dvd起動した後のvmはテキストの切り貼りができないから、バックアップ置き場に入力したいコマンドラインを書いておいて実行してった。
ついでに起動するときにefiのブートメニューに入るまでの待ち時間を5秒にするようvmxファイルの記述を足した。
firmware = "efi"
BIOS.BootDelay = "5000"
起動まで5秒待ってくれるので、F2キー連打せずに済む。
VMイメージを作る
bios版でやったときと同じようにインストールする。
違いはインストール先のディスクに/boot/efiって領域があること。
swapってパーティション今でもいるんかなぁ?
メモリの利用率が増えてディスクに読み書きするようになったら、ディスクがボトルネックになってシステム不安定になってまうとか。
なくてもよさげやけど、いったんパーティション自動作成したら20GBのディスクを適当に割ってくれてた。
インストール普通に終わって30GBのディスク作っておき、GUIログインして/backupのパーティションも作っておき、ディスクの状態見たらこうなってる。
[root@localhost backup]# df -hT
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 775M 9.6M 765M 2% /run
/dev/mapper/almalinux-root xfs 17G 4.9G 12G 30% /
/dev/nvme0n1p2 xfs 960M 261M 700M 28% /boot
/dev/nvme0n1p1 vfat 599M 7.1M 592M 2% /boot/efi
/dev/nvme0n2 ext4 30G 3.1G 25G 11% /backup
tmpfs tmpfs 388M 96K 388M 1% /run/user/1000
[root@localhost backup]#
/bootと/boot/efiってのがあって、/boot/efiはvfatってあるからwindowsのfat32とかかな。
前にbios版でやったのとほぼ同じことをやってく。
- システムの更新(dnf update)
- git/xfsdumpインストール(入ってた)
- selinuxの無効化(SELINUX=disabledにする)とOS再起動
- gitクローン(対象はなんでもよくてwinmerge取った)
- ディスクの情報バックアップ(fdisk/parted/blkid/parted/vgcfgbackup)
- LVMの状態バックアップ(pvdisplay/vgdisplay/lvdisplay)
- システムの状態バックアップ(systemctlのリストと、dnfのリスト)
- efi関連の設定
長いログは省略するけど、やってみたのはこんな感じ。
[root@localhost backup]# dnf update ★システムの更新
:(中略)
[root@localhost backup]# dnf install xfsdump ★インストール
メタデータの期限切れの最終確認: 0:01:15 前の 2023年12月09日 04時30分22秒 に実施しました。
パッケージ xfsdump-3.1.12-3.el9.x86_64 は既にインストールされています。
依存関係が解決しました。
行うべきことはありません。
完了しました!
[root@localhost backup]# dnf install git ★インストール
:(中略)
[root@localhost backup]# vi /etc/sysconfig/selinux ★selinuxの無効化とOS再起動
:(中略)
[root@localhost backup]# cat /etc/sysconfig/selinux | grep SELINUX=dis
# NOTE: Up to RHEL 8 release included, SELINUX=disabled would also
SELINUX=disabled
[root@localhost backup]# shutdown -r now
:(中略)
[nari@localhost ~]$ git clone https://github.com/WinMerge/winmerge.git ★gitクローン
Cloning into 'winmerge'...
remote: Enumerating objects: 147722, done.
remote: Counting objects: 100% (1938/1938), done.
remote: Compressing objects: 100% (169/169), done.
remote: Total 147722 (delta 1837), reused 1803 (delta 1769), pack-reused 145784
Receiving objects: 100% (147722/147722), 470.07 MiB | 25.62 MiB/s, done.
Resolving deltas: 100% (71905/71905), done.
[nari@localhost ~]$
[nari@localhost ~]$ su -
パスワード:
[root@localhost ~]# cd /backup
[root@localhost backup]# cp -pR /home/nari/winmerge /backup/
[root@localhost backup]# fdisk -l > ./fdisk.txt ★ディスク情報のバックアップ
[root@localhost backup]# parted -l > ./parted.txt ★ディスク情報のバックアップ
[root@localhost backup]# blkid | sort > ./blkid.txt ★ディスク情報のバックアップ
[root@localhost backup]# cp -p /etc/fstab ./fstab.txt ★ディスク情報のバックアップ
[root@localhost backup]# vgcfgbackup -f /backup/vgcfgbackup.txt ★LVMの状態バックアップ
Volume group "almalinux" successfully backed up.
[root@localhost backup]# systemctl list-unit-files -t service | grep enabled > /backup/systemctlList.txt ★システムの状態バックアップ
[root@localhost backup]# dnf list --installed > dnf.txt ★システムの状態バックアップ
[root@localhost backup]# pvdisplay > ./pvdisplay.txt ★LVMの状態バックアップ
[root@localhost backup]# vgdisplay > ./vgdisplay.txt ★LVMの状態バックアップ
[root@localhost backup]# lvdisplay > ./lvdisplay.txt ★LVMの状態バックアップ
[root@localhost backup]# efibootmgr -v > efibootmgr.txt ★efi関連の設定
[root@localhost backup]# cat /boot/efi/EFI/almalinux/grub.cfg > grub.txt ★efi関連の設定
[root@localhost backup]#
[root@localhost backup]# ls -l *.txt
-rw-r--r--. 1 root root 627 12月 13 05:42 blkid.txt
-rw-r--r--. 1 root root 110152 12月 10 05:49 dnf.txt
-rw-r--r-- 1 root root 614 12月 12 17:34 efibootmgr.txt
-rw-r--r--. 1 root root 1514 12月 10 05:48 fdisk.txt
-rw-r--r--. 1 root root 880 12月 10 05:26 fstab.txt
-rw-r--r-- 1 root root 144 12月 12 17:35 grub.txt
-rw-r--r--. 1 root root 1178 12月 10 05:49 lvdisplay.txt
-rw-r--r--. 1 root root 774 12月 10 05:48 parted.txt
-rw-r--r--. 1 root root 378 12月 10 05:49 pvdisplay.txt
-rw-r--r--. 1 root root 3286 12月 10 05:48 systemctlList.txt
-rw------- 1 root root 1842 12月 10 05:48 vgcfgbackup.txt
-rw-r--r--. 1 root root 625 12月 10 05:49 vgdisplay.txt
[root@localhost backup]#
ディスクの状態
biosのときとはefiは違ってるのでリストしてみる。
fdisk
fdiskで見てみた。
biosのときは/dev/nvme0n1のp1とp2で/bootと/の2つやった。
デバイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ
/dev/nvme0n1p1 * 2048 2099199 2097152 1G 83 Linux
/dev/nvme0n1p2 2099200 41943039 39843840 19G 8e Linux LVM
efiのときは/dev/nvme0n1のp1とp2とp3で/boot/efiと/bootと/の3つになってる。
デバイス 開始位置 終了位置 セクタ サイズ タイプ
/dev/nvme0n1p1 2048 1230847 1228800 600M EFI システム
/dev/nvme0n1p2 1230848 3327999 2097152 1G Linux ファイルシステム
/dev/nvme0n1p3 3328000 41940991 38612992 18.4G Linux LVM
ファイルシステムとしてはこうなってて、/boot/efiがvfatとして存在する。
バックアップとリストアするときのファイルシステムはvfatのが増えてる。
[root@localhost backup]# df -hT | egrep 'nvme|root' | sort
/dev/mapper/almalinux-root xfs 17G 4.8G 12G 29% /
/dev/nvme0n1p1 vfat 599M 7.1M 592M 2% /boot/efi
/dev/nvme0n1p2 xfs 960M 261M 700M 28% /boot
/dev/nvme0n2 ext4 30G 3.6G 25G 13% /bakcup
[root@localhost backup]#
parted
partedだとこう。
fdiskでは30GBで見えてるしvmwareで作ったときもそうやったんやけど、なんでbackupが32GBなんやろなぁ。
[root@localhost backup]# cat parted.txt
モデル: VMware Virtual NVMe Disk (nvme)
ディスク /dev/nvme0n1: 21.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt
ディスクフラグ:
番号 開始 終了 サイズ ファイルシステム 名前 フラグ
1 1049kB 630MB 629MB fat32 EFI System Partition boot, esp
2 630MB 1704MB 1074MB xfs
3 1704MB 21.5GB 19.8GB lvm
モデル: VMware Virtual NVMe Disk (nvme)
ディスク /dev/nvme0n2: 32.2GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: loop
ディスクフラグ:
番号 開始 終了 サイズ ファイルシステム フラグ
1 0.00B 32.2GB 32.2GB ext4
blkid
そんなコマンドあるんやって今回初めて知った。
UUID読みにくいけど、中はこんななってた。
[root@localhost backup]# cat blkid.txt
/dev/mapper/almalinux-root: UUID="a3818a0a-f2d6-4bc1-8f64-a9df795a28ed" TYPE="xfs"
/dev/mapper/almalinux-swap: UUID="576310bb-b209-4655-a011-fd57f840ca47" TYPE="swap"
/dev/nvme0n1p1: UUID="94FB-35B4" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="c57bce63-f53b-4c1b-bc18-92943b78b805"
/dev/nvme0n1p2: UUID="125bd3d4-df1d-413c-8a4c-a91028a9ddba" TYPE="xfs" PARTUUID="90299a72-0218-4580-b967-358dbbf3adf2"
/dev/nvme0n1p3: UUID="35gX10-p6hm-VMZE-2ebr-peBW-VwZ5-oiHWf7" TYPE="LVM2_member" PARTUUID="931ce558-9cb4-4913-9bc6-3b77d4d226c1"
/dev/nvme0n2: LABEL="backup2" UUID="847041eb-6cd2-4f34-82d1-9935d5155516" TYPE="ext4"
[root@localhost backup]#
LVMのための構成情報
vgcfgbackupってのも今回初めて見た。
こうなってた。
[root@localhost backup]# cat /backup/vgcfgbackup.txt
# Generated by LVM2 version 2.03.21(2) (2023-04-21): Sat Dec 9 04:34:14 2023
contents = "Text Format Volume Group"
version = 1
description = "vgcfgbackup -f /backup/vgcfgbackup.txt"
creation_host = "localhost.localdomain" # Linux localhost.localdomain 5.14.0-362.8.1.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Nov 7 14:54:22 EST 2023 x86_64
creation_time = 1702064054 # Sat Dec 9 04:34:14 2023
almalinux {
id = "kIl9Y6-AKy9-PUja-bujW-ppPs-6uKs-GwKVMV"
seqno = 3
format = "lvm2" # informational
status = ["RESIZEABLE", "READ", "WRITE"]
flags = []
extent_size = 8192 # 4 Megabytes
max_lv = 0
max_pv = 0
metadata_copies = 0
physical_volumes {
pv0 {
id = "35gX10-p6hm-VMZE-2ebr-peBW-VwZ5-oiHWf7"
device = "/dev/nvme0n1p3" # Hint only
device_id_type = "sys_wwid"
device_id = "eui.246f796db70a6b4f000c29611d35befd"
status = ["ALLOCATABLE"]
flags = []
dev_size = 38612992 # 18.4121 Gigabytes
pe_start = 2048
pe_count = 4713 # 18.4102 Gigabytes
}
}
logical_volumes {
root {
id = "FZjk3c-LC0O-YIAQ-seAS-INs1-Bgm2-xHvJGf"
status = ["READ", "WRITE", "VISIBLE"]
flags = []
creation_time = 1702062416 # 2023-12-09 04:06:56 +0900
creation_host = "localhost.localdomain"
segment_count = 1
segment1 {
start_extent = 0
extent_count = 4201 # 16.4102 Gigabytes
type = "striped"
stripe_count = 1 # linear
stripes = [
"pv0", 0
]
}
}
swap {
id = "ugY770-CPhs-fwDX-ZYXW-HqyN-HNfm-HhjdWr"
status = ["READ", "WRITE", "VISIBLE"]
flags = []
creation_time = 1702062416 # 2023-12-09 04:06:56 +0900
creation_host = "localhost.localdomain"
segment_count = 1
segment1 {
start_extent = 0
extent_count = 512 # 2 Gigabytes
type = "striped"
stripe_count = 1 # linear
stripes = [
"pv0", 4201
]
}
}
}
}
[root@localhost backup]#
pvdisplay/vgdisplay/lvdisplay
ついでにpvdisplay/vgdisplay/lvdisplayの結果。
中にalmalinux
って書いてる箇所はredhat使ったらredhat
ってなってるんやろな。
[root@localhost backup]# cat pvdisplay.txt
--- Physical volume ---
PV Name /dev/nvme0n1p3
VG Name almalinux
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 35gX10-p6hm-VMZE-2ebr-peBW-VwZ5-oiHWf7
[root@localhost backup]#
[root@localhost backup]# cat vgdisplay.txt
--- Volume group ---
VG Name almalinux
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 kIl9Y6-AKy9-PUja-bujW-ppPs-6uKs-GwKVMV
[root@localhost backup]#
[root@localhost backup]# cat lvdisplay.txt
--- Logical volume ---
LV Path /dev/almalinux/root
LV Name root
VG Name almalinux
LV UUID FZjk3c-LC0O-YIAQ-seAS-INs1-Bgm2-xHvJGf
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2023-12-09 04:06:56 +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 256
Block device 253:0
--- Logical volume ---
LV Path /dev/almalinux/swap
LV Name swap
VG Name almalinux
LV UUID ugY770-CPhs-fwDX-ZYXW-HqyN-HNfm-HhjdWr
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2023-12-09 04:06:56 +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 256
Block device 253:1
[root@localhost backup]#
efiにある起動情報
efiにはefibootmgrってコマンドがあってそれ使う。
なるほど、起動順位設定みたいなのがある。
[root@localhost backup]# cat efibootmgr.txt
BootCurrent: 0004
BootOrder: 0004,0001,0000,0002,0003
Boot0000* EFI VMware Virtual NVME Namespace (NSID 1) PciRoot(0x0)/Pci(0x16,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-00-00-00-00-00-00-00)
Boot0001* EFI VMware Virtual SATA CDROM Drive (1.0) PciRoot(0x0)/Pci(0x11,0x0)/Pci(0x0,0x0)/Sata(1,0,0)
Boot0002* EFI Network PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)/MAC(00505623689f,1)
Boot0003* EFI Internal Shell (Unsupported option) MemoryMapped(11,0xeb5a018,0xf07e017)/FvFile(c57ad6b7-0515-40a8-9d21-551652854e37)
Boot0004* AlmaLinux HD(1,GPT,c57bce63-f53b-4c1b-bc18-92943b78b805,0x800,0x12c000)/File(\EFI\almalinux\shimx64.efi)
[root@localhost backup]#
grub2を使ってるんやけど、その内容もバックアップしといた。
1行目のUUIDはパーティションとしての/bootを指定してるんやな。
[root@localhost backup]# cat grub.txt
search --no-floppy --fs-uuid --set=dev 125bd3d4-df1d-413c-8a4c-a91028a9ddba
set prefix=($dev)/grub2
export $prefix
configfile $prefix/grub.cfg
[root@localhost backup]#
念のためfstab
UUID入っててヤヤこしいなぁ。
/boot/efiはUUID短めなんやな。
[root@localhost backup]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Dec 8 19:06:59 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/almalinux-root / xfs defaults 0 0
UUID=125bd3d4-df1d-413c-8a4c-a91028a9ddba /boot xfs defaults 0 0
UUID=94FB-35B4 /boot/efi vfat umask=0077,shortname=winnt 0 2
/dev/mapper/almalinux-swap none swap defaults 0 0
/dev/disk/by-uuid/847041eb-6cd2-4f34-82d1-9935d5155516 /backup auto nosuid,nodev,nofail,x-gvfs-show 0 0
[root@localhost backup]#
あとでわかったんやけど、UUID書いてる2行はデバイス名書いてもええらしい。
blkidの結果とdfの結果で考えたらこんな感じ。
/dev/nvme0n1p2 /boot xfs defaults 0 0
/dev/nvme0n1p1 /boot/efi vfat umask=0077,shortname=winnt 0 2
フルバックアップ
vfatのパーティションはxfsdumpやなくてtar使えばええ。
# xfsdump -l0 - /dev/mapper/almalinux-root | gzip -9 > /backup/root.gz
# cd /boot/efi
# tar czf /backup/boot_efi.tar.gz ./EFI/
# xfsdump -l0 - /dev/nvme0n1p2 | gzip -9 > /backup/boot.gz
[root@localhost backup]# ls -lh /backup/* | egrep '.gz|tar'
-rw-r--r--. 1 root root 213M 12月 10 05:45 /backup/boot.gz
-rw-r--r--. 1 root root 7.0M 12月 10 05:45 /backup/boot_efi.tar
-rw-r--r-- 1 root root 2.5M 12月 13 05:48 /backup/boot_efi.tar.gz
-rw-r--r-- 1 root root 2.3G 12月 10 05:45 /backup/root.gz
[root@localhost backup]#
xfsdumpしたときの結果はbiosのときと同じぐらい時間かかった。
root.gz作るのに389秒、boot.gzは6秒。
2つ目のtarしたときの結果。1秒で戻ってくる。
[root@localhost backup]# ls -lh /backup/* | egrep '.gz|tar'
-rw-r--r--. 1 root root 213M 12月 10 05:45 /backup/boot.gz
-rw-r--r--. 1 root root 7.0M 12月 10 05:45 /backup/boot_efi.tar
-rw-r--r-- 1 root root 2.3G 12月 10 05:45 /backup/root.gz
[root@localhost backup]#
dvdブートとリストアの準備
efiの設定画面に入ってブート順番をdvd優先にしとく。
ハイライトさせてからテンキーの「+」とか押したら表示が上に上がる。
起動したらgrubの画面で選ぶ。
「Troubleshooting」、「Rescue a AlmaLinux system」、「3) Skip to shell」を選ぶ。
プロンプト待ちになったらenter押す。
バックアップを参照できるようにしとく
パーティション設定が残ってる。
backupってパーティション作っておいて、さっきバックアップしたデータを参照できるようにしとく。
今から使うコマンドラインも7つ作っといた。
LVMを初期化
LVMの設定を潰す。
やりなおしたいときはここからやったらええ。
lvremove /dev/almalinux/root
lvremove /dev/almalinux/swap
vgremove almalinux
pvremove /dev/nvme0n1p3
1つずつ入力すると打ち間違えあるし、1_lvmSettingDel
って名前で作って準備しておきbackupフォルダに置いてあるのを動かした。
パーティションを初期化
作る予定のパーティション。
デバイス 開始位置 終了位置 セクタ サイズ タイプ
/dev/nvme0n1p1 2048 1230847 1228800 600M EFI システム
/dev/nvme0n1p2 1230848 3327999 2097152 1G Linux ファイルシステム
/dev/nvme0n1p3 3328000 41940991 38612992 18.4G Linux LVM
せっかくやからfdiskやなくてparted使ってみる。
対話側でのparted入力コマンドの意味はこんな感じ。
print -> パーティションの状態表示(print)
mklabel gpt -> gptでパーティションテーブルを構成する
mkpart "EFI System Partition" fat32 2048s 600MB
->1つ目のvfatパーティション作る
set 1 esp on -> EFI System partitionのフラグを立てる
mkpart primary xfs 600MB 1600MB
-> 2つ目のパーティションを作る
mkpart primary xfs 1601MB 100%
-> 3つ目のパーティションを作る
set 3 lvm on -> 3つ目のパーティションにLVMのフラグを立てる(xfsの表記が消える)
quit
partedを対話型じゃなくてスクリプトに書いた内容はこんな感じ。
これでできるみたい。
parted -s -a optimal /dev/nvme0n1 -- mklabel gpt
parted -s -a optimal /dev/nvme0n1 -- mkpart EFI-partition fat32 2048s 601MB set 1 esp on
parted -s -a optimal /dev/nvme0n1 -- mkpart Boot-partition xfs 602MB 1602MB
parted -s -a optimal /dev/nvme0n1 -- mkpart LVM-partition xfs 1603MB 100% set 3 lvm on
サイズが601MBとか1602MBとかしてるのは、partedで確認したとき微妙にサイズがスレるから。
600MB/1000MBの箇所を端数がない数字にしてみたかっただけ。
ま、ズレててもリストアはできるんやけどね。
スクリプトにして動かしてみたらできてるっぽい。
ブートのフラグもLVMのフラグもできとる、できとる。
LVMを復元
こんな内容を動かす。
uuidはblkidでLVM memberってなってた/dev/nvme0n1p3のパーティションを指定し、vgcfgbackupでとったlvmの構成情報をリカバリする。
vgchangeでアクティブにする。
pvcreate --uuid 35gX10-p6hm-VMZE-2ebr-peBW-VwZ5-oiHWf7 --restorefile /backup/vgcfgbackup.txt /dev/nvme0n1p3
vgcfgrestore -f /backup/vgcfgbackup.txt almalinux
vgchange -ay almalinux
動かすとこんな感じ。warning出るけどこの後で作るからかまへん。
ファイルシステム作る
/boot/efiをvfat、/bootとルートパーティションはxfsで作る。
mkfs.vfat -v -c -F32 -s2 /dev/nvme0n1p1
mkfs.xfs -f /dev/nvme0n1p2
xfs_admin -U 125bd3d4-df1d-413c-8a4c-a91028a9ddba /dev/nvme0n1p2
mkfs.xfs -f /dev/mapper/almalinux-root
xfs_admin -U 35gX10-p6hm-VMZE-2ebr-peBW-VwZ5-oiHWf7 /dev/mapper/almalinux-root
やってみたらこうなる。
ここまで来たら、リストアの準備が完了。
リストアする
バックアップしといたものをリストアする。
やったことないけど、linuxのtarってvfatでも使えるんかな。
mkdir /restore
mount -t xfs /dev/mapper/almalinux-root /restore
cd /restore
zcat /backup/root.gz | xfsrestore - ./
mount -t xfs /dev/nvme0n1p2 /restore/boot
cd /restore/boot
zcat /backup/boot.gz | xfsrestore - ./
mount -t vfat /dev/nvme0n1p1 /restore/boot/efi
cd /restore/boot/efi
tar xf /backup/boot_efi.tar
sync;sync;sync
動かしたらこうなる。
bios版のときと同じぐらい待つ。
/boot/efiについてのエコーバックなんもないけど、復旧はできてるっぽい。
EFIの復旧
参考サイト読ませてもらったとき、/boot/efiに設定するときchrootする必要があるってことを理解するのに時間かかった。
mount -t proc proc /restore/proc
mount --bind /dev /restore/dev
mount -t sysfs sysfs /restore/sys
chroot /restore
リストアのための/restore
ってパーティションを基点にしてrootで使いながら、efi関連設定をする必要があるらしい。
そういうもんということで理解しましょ。
ただ、これやると用意した/backupのパーティションが見えんくなるから用意したテキストが使えんなぁ。
数行でちょっとのことやしええか。
(ホンマは何回か入力間違いしてOSリストアの後起動できんかった)
efibootmgr -c -d /dev/nvme0n1 -p 1 -l '\EFI\almalinux\shimx64.efi' -L 'AlmaLinux'
実際にはもうちょっと設定する。
この起動設定でやってるパスの入力よく間違えてOS上がって来ないことあった。
入力してすぐ動かさず、ちゃんとチェックしなはれ。
# efibootmgr -v # 設定確認
BootCurrent: 0004
BootOrder: 0004,0001,0000,0002,0003
Boot0000* EFI VMware Virtual NVME Namespace (NSID 1) PciRoot(0x0)/Pci(0x16,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-00-00-00-00-00-00-00)
Boot0001* EFI VMware Virtual SATA CDROM Drive (1.0) PciRoot(0x0)/Pci(0x11,0x0)/Pci(0x0,0x0)/Sata(1,0,0)
Boot0002* EFI Network PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)/MAC(00505623689f,1)
Boot0003* EFI Internal Shell (Unsupported option) MemoryMapped(11,0xeb5a018,0xf07e017)/FvFile(c57ad6b7-0515-40a8-9d21-551652854e37)
Boot0004* AlmaLinux HD(1,GPT,c57bce63-f53b-4c1b-bc18-92943b78b805,0x800,0x12c000)/File(\EFI\almalinux\shimx64.efi)
Boot0005* EFI VMware Virtual NVME Namespace (NSID 2) PciRoot(0x0)/Pci(0x16,0x0)/Pci(0x0,0x0)/NVMe(0x2,00-00-00-00-00-00-00-00)
# efibootmgr -b 5 -B 5 # dvdブートしたときに増えた起動設定の削除
# efibootmgr -b 4 -B 4 # alamlinux起動設定の削除
# efibootmgr -c -d /dev/nvme0n1 -p 1 -l '\EFI\almalinux\shimx64.efi' -L 'AlmaLinux' #新しいほうのディスク見に行くようにする設定の追加
# efibootmgr -o 0004
# efibootmgr -t 5 #タイムアウトの設定
やってみるとこうなる。
まずは起動順序で不要なのを削除して、最後に作ったalma9のefiパーティションの情報を追加する。
ここでは4番目の登録情報をデフォルトにしたいから、その指定をつける。
ついでに起動まで5秒のインターバルつけてみる。
blkidの出力結果に、/boot/efiのパーティションにあるuuidが入ってることが見えたらOK。
grub設定の復旧
参考サイトにはこうあった。
# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
almalinux9でやってるので読み替えてファイルの内容確認すると、grub.cnfにはblkidにあるuuidがもう書いてあるように見えたのでここはスキップ。
fstab修正せなアカンのちゃうか
思い出したのが/etc/fstabにvfatのuuid書いてたはず。
この場合、fstabにある94FB-35B4
ってあるのを7358-B27D
に修正せなアカンはず。レスキューモードはハデなvi画面やな。
最後にinitramfsのファイルをバックアップしといて作成しなおす。
# cd /boot/
# ls -l initramfs-*
# mv initramfs-5.14.0-362.8.1.el9_3.x86_64.img initramfs-5.14.0-362.8.1.el9_3.x86_64.img.ord
# dracut -f initramfs-5.14.0-362.8.1.el9_3.x86_64.img
# sync ; sync
blkidの確認
blkidのUUIDの確認。
この辻褄があってないと起動に失敗する。
biosのときも数回失敗したし、今回のefiのときも5回ぐらいは失敗したけど・・・。
dvdブートするとキーボード配列が英字になってまうから、バックスラッシュ、コロンの入力とシングルクオートの入力がツライのな。
- /dev/nvme0n1p1のUUIDは/etc/fstabに書いてあるものとそろってる。
- /dev/nvme0n1p2と/dev/nvme0n1p3のUUIDはリカバリ前のものでファイルシステム作れてる。
- /dev/mapper/almalinux-rootは作り直したから変わってええ。
syncしてOS停止と起動
参考サイトに書いてあったけど、syncはやっといたほうがええよね。
chrootからexitする直前とshutdownの直前はsync
solarisのshutdownのときいっつも手順に書いてあったな。
いったんshutdownして、dvdを起動時にマウントしないようにvmの設定しておく。
さぁ、起動してみましょ!
起動できたら嬉しいもんや。
リストア後の確認
GUIログインしてrootユーザにsuできたから、認証情報はリカバリできとんな。
念のため確認してみた。
dfとblkidの結果も想定してるとおりなんやけど、あ、swap作るの忘れてる・・・。
partedで作るときのスクリプトが欠けとる。まぁ、ええか。
[nari@localhost ~]$ su -
パスワード:
[root@localhost ~]# df -hT
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 775M 9.6M 765M 2% /run
/dev/mapper/almalinux-root xfs 17G 4.9G 12G 30% /
/dev/nvme0n2 ext4 30G 3.1G 25G 11% /backup
/dev/nvme0n1p2 xfs 890M 317M 574M 36% /boot
/dev/nvme0n1p1 vfat 568M 7.0M 561M 2% /boot/efi
tmpfs tmpfs 388M 104K 388M 1% /run/user/1000
[root@localhost ~]#
blkidとfstab
blkidはリストア前とはちょっと違う。
[root@localhost ~]# blkid | sort
/dev/mapper/almalinux-root: UUID="bb2d3b6e-7a73-4066-bb57-5e95e4fa7d16" TYPE="xfs"
/dev/nvme0n1p1: UUID="7358-B27D" TYPE="vfat" PARTLABEL="EFI-partition" PARTUUID="04cc7476-4c80-4bf9-bd35-d8e7aa23d648"
/dev/nvme0n1p2: UUID="125bd3d4-df1d-413c-8a4c-a91028a9ddba" TYPE="xfs" PARTLABEL="Boot-partition" PARTUUID="ab8beff0-6fe9-42cd-8d3d-18f4ae036690"
/dev/nvme0n1p3: UUID="35gX10-p6hm-VMZE-2ebr-peBW-VwZ5-oiHWf7" TYPE="LVM2_member" PARTLABEL="LVM-partition" PARTUUID="acb523b8-4833-4cf7-ac57-68f9bd40c84e"
/dev/nvme0n2: LABEL="backup2" UUID="847041eb-6cd2-4f34-82d1-9935d5155516" TYPE="ext4"
[root@localhost ~]#
リストア直後にも目視確認はしたけどfstabも使えてるのはなんでやろなぁ。
swapのこと書いてるのに、パーティション作るの忘れてもOS起動に失敗せんのやなぁ・・・。
[root@localhost ~]# cat /etc/fstab | grep -v ^#
/dev/mapper/almalinux-root / xfs defaults 0 0
UUID=125bd3d4-df1d-413c-8a4c-a91028a9ddba /boot xfs defaults 0 0
UUID=7358-B27D /boot/efi vfat umask=0077,shortname=winnt 0 2
/dev/mapper/almalinux-swap none swap defaults 0 0
/dev/disk/by-uuid/847041eb-6cd2-4f34-82d1-9935d5155516 /backup auto nosuid,nodev,nofail,x-gvfs-show 0 0
[root@localhost ~]#
fdiskとparted
gptではやってみたけど、fdiskも使えるみたい。
[root@localhost ~]# fdisk -l | grep nvme
ディスク /dev/nvme0n1: 20 GiB, 21474836480 バイト, 41943040 セクタ
/dev/nvme0n1p1 2048 1173503 1171456 572M EFI システム
/dev/nvme0n1p2 1175552 3129343 1953792 954M Linux ファイルシステム
/dev/nvme0n1p3 3131392 41940991 38809600 18.5G Linux LVM
ディスク /dev/nvme0n2: 30 GiB, 32212254720 バイト, 62914560 セクタ
[root@localhost ~]#
[root@localhost ~]# parted -l | grep MB
1 1049kB 601MB 600MB fat32 EFI-partition boot, esp
2 602MB 1602MB 1000MB xfs Boot-partition
3 1603MB 21.5GB 19.9GB LVM-partition lvm
[root@localhost ~]#
LVMの状態確認
使えてるしよしとしとこっか。
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/almalinux/root
LV Name root
VG Name almalinux
LV UUID FZjk3c-LC0O-YIAQ-seAS-INs1-Bgm2-xHvJGf
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2023-12-09 04:06:56 +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 256
Block device 253:0
--- Logical volume ---
LV Path /dev/almalinux/swap
LV Name swap
VG Name almalinux
LV UUID ugY770-CPhs-fwDX-ZYXW-HqyN-HNfm-HhjdWr
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2023-12-09 04:06:56 +0900
LV Status available
# open 0
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
[root@localhost backup]# vgdisplay
--- Volume group ---
VG Name almalinux
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 1
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 kIl9Y6-AKy9-PUja-bujW-ppPs-6uKs-GwKVMV
[root@localhost ~]# pvdisplay
--- Physical volume ---
PV Name /dev/nvme0n1p3
VG Name almalinux
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 35gX10-p6hm-VMZE-2ebr-peBW-VwZ5-oiHWf7
[root@localhost ~]#
efiの状態
どうしてリストが増えてるのかわからんかった。
4番目を作ったのがリストア直後で、そのあとに9番目まで増えとる。
swapパーティション作り忘れたからかもしれんけど、efiの理解がまだ足りんってことか。
[root@localhost ~]# efibootmgr -v
BootCurrent: 0004
Timeout: 5 seconds
BootOrder: 0004,0005,0006,0007,0008,0009
Boot0000* EFI VMware Virtual NVME Namespace (NSID 1) PciRoot(0x0)/Pci(0x16,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-00-00-00-00-00-00-00)
Boot0001* EFI VMware Virtual SATA CDROM Drive (1.0) PciRoot(0x0)/Pci(0x11,0x0)/Pci(0x0,0x0)/Sata(1,0,0)
Boot0002* EFI Network PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)/MAC(00505623689f,1)
Boot0003* EFI Internal Shell (Unsupported option) MemoryMapped(11,0xeb5a018,0xf07e017)/FvFile(c57ad6b7-0515-40a8-9d21-551652854e37)
Boot0004* AlmaLinux HD(1,GPT,04cc7476-4c80-4bf9-bd35-d8e7aa23d648,0x800,0x11e000)/File(\EFI\almalinux\shimx64.efi)
Boot0005* EFI VMware Virtual NVME Namespace (NSID 1) PciRoot(0x0)/Pci(0x16,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-00-00-00-00-00-00-00)
Boot0006* EFI VMware Virtual NVME Namespace (NSID 2) PciRoot(0x0)/Pci(0x16,0x0)/Pci(0x0,0x0)/NVMe(0x2,00-00-00-00-00-00-00-00)
Boot0007* EFI VMware Virtual SATA CDROM Drive (1.0) PciRoot(0x0)/Pci(0x11,0x0)/Pci(0x0,0x0)/Sata(1,0,0)
Boot0008* EFI Network PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)/MAC(00505623689f,1)
Boot0009* EFI Internal Shell (Unsupported option) MemoryMapped(11,0xeb5a018,0xf07e017)/FvFile(c57ad6b7-0515-40a8-9d21-551652854e37)
[root@localhost ~]#
モジュールとファイルとシステム状態
確認してみたら大丈夫っぽい。
[root@localhost ]# cd /backup
[root@localhost backup]# which xfsdump
/usr/sbin/xfsdump
[root@localhost backup]# which git
/usr/bin/git
[root@localhost backup]# getenforce
Disabled
[root@localhost backup]# diff -r /backup/winmerge/ /home/nari/winmerge/
[root@localhost backup]#
[root@localhost backup]# systemctl list-unit-files -t service | grep enabled > foo.txt
[root@localhost backup]# diff foo.txt systemctlList.txt
[root@localhost backup]#
OS起動できんかったり、英語配列キーボードで記号文字探したり、efiのリストアけっこうツラかったな。
そやけど、練習はできたから実務でもいけそうかな。
実機での顛末(リストア関連)
年末にお客様の実機を預かって実際にやってみた。
実機は2023年のものなでrdxドライブ使うから、そのあたりはalmalinux9(redhat9 clone)でxfsフルバックアップとフルリストアでやったこととほぼ同じことした。
守秘義務あるからログは入れられんけど、alma9では発生せずredhat9で発生した問題もあった。
ここでは実施のために調査した結果だけを入れてく。
練習できる物理マシンないから、クラウドの仮想マシンとローカルVMでリハーサルやっといてよかった。
redhatサブスクリプションの登録
サブスクリプションは利用権で、お金払うともらえるはず。
redhat特有の設定はお客様にお願いした。
自分でも調べたけど、実際はこんな感じの設定するはず。
subscrition-manager register --username <username> --password <passoword>
必要なサブスクリプションのプールID確認。
subscrition-manager list --available
表示されるプールIDをシステムに割り当てる。
subscrition-manager attach --pool=<pool_id>
ここまでやるとdnfでモジュール参照するインターネット上のリポジトリが見えるはず。
redhatのマイナーバージョンが上がらないようにリミッターつける
今はredhat9.3が今は最新やけど、ハードウェアサポート範囲の都合でもう少し古いのを使うことになった。
実際のモジュールやセキュリティアップデートは最新のマイナーバージョンに対して行われるはずやから、リミッターつけるのはあまりオススメできん。
dnfでアップグレードすると勝手に9.3になってまうから、そうならないように設定入れとく。例えば9.2の場合。
subscrition-manager release --set 9.2
確認はこうする。
subscrition-manager release --show
selinuxオンにする
お客様の社内ルールでlinuxホストのselinuxをオンにして使うリクエストがあった。
オフにして使うことしか今までなかったので、けっこうツラい。
何が普段通り使えんようになるのかまったく知らん・・・。
selinuxが出てきた当初、「なんやねんsshも繋がらんのかい!!」ってムカついたことあったし、今までの20年でオンにして使ってるお客様見たことない(たまたまかもな)。
やってみたら、ログのローテートで/var/log以外を使うとローテートしてくれんかった。rdxへのバックアップとリストアには影響なさそうやった。
時間なかったので仕方ないから、/var/logに専用のフォルダ作って置くことにしたら、ローテートできた。
リストアはスクリプト化してご提供
最初にマウントしてるところと、grubの起動順位設定だけは手動でやらなアカンけど、uuid間違わずに入力するのは苦しいはずやから、スクリプト化してuuidとかdevナントカを変数に定義しておき、6つの処理を1つずつ確認してもらいながら使ってもらうことにした。
流れはこんな感じで動かしてく。けっこう長いやん。
- インストールメディアで起動してレスキューモードに入りbash使う
- 日本語キーボード使う設定にする(# localectl set-keymap)
- バックアップ先のrdxをマウント
👉以下、パーティションを完全に作り直す場合のみ実施。 - 新品のディスクに見立てるためLVM情報を潰す(lvremove/vgremove/pvremove – スクリプト1のおよその内容)
- パーティションを作成(parted – スクリプト2のおよその内容)
👉最初は手動やったのをスクリプトにはこんな感じ。ローカルvmで練習作成した。
parted -s -a optimal /dev/sda -- mklabel gpt
parted -s -a optimal /dev/sda -- mkpart EFI-partition fat32 2048s 601MB set 1 esp on
parted -s -a optimal /dev/sda -- mkpart Boot-partition xfs 602MB 1602MB
parted -s -a optimal /dev/sda -- mkpart LVM-partition xfs 1603MB 100% set 3 lvm on
- LVMを構成情報から戻す(pvcreate/vgfcfgrestore/vgchange – スクリプト3のおよその内容)
- xfsでファイルシステム作る(mkfs/xfs_admin – スクリプト4のおよその内容)
👉元あるディスクを使うときはrdxマウントした後ここから実施。 - 手動でLVM情報が見えることを確認実施(pvdisplay/vgdisplay/lvdisplay)
- もしLVM見えてないなら有効にする(vgchange)
- リストア用のマウントポイント作ってroot/boot/boot-efiの順番にリストア実施(xfsrestore/tar – スクリプト5のおよその内容)
- リストア用のマウントポイントを一時的にルートディレクトリにする(chroot – スクリプト6のおよその内容)
👉以下、手動で実施。LVMとファイルシステムを作り直してなければ、リストアした結果そのまま使えるからチェックのみでええ。 - ブートオーダで見えるuuidの変更のためbootパーティションへの情報を削除してから再作成(efibootmgr)
- grub.cfgの中に見えるbootパーティションのuuidの情報とblkidの中のuuidをチェックする
- fstabにあるboot-efiパーティションのxxxx-xxxxってあるuuidをblkidコマンドで見えるyyyy-yyyyに更新する
- /boot/initramfs-xxを再作成(dracut)
リストア後の動作確認
バックアップとして以下の実行結果をそれぞれ取っておき(実際はバックアップスクリプトの中のxfsdumpしている箇所の前に書いてリダイレクトさせた)、リストア後に同じ内容を取得して保管フォルダごとwinmergeで比べた。
cat /etc/os-release
uname -n
ip a
cat /etc/hosts
cat /etc/resolv.conf
cat /etc/chrony.conf
parted -l
df -hT
cat /etc/fstab
cat /etc/passwd
cat /etc/group
systemctl list-unit-files -t service | grep enabled
dnf list --installed
rpm -qa | sort
blkid | sort
pvdisplay
vgdisplay
lvdisplay
vgcfgbackup -f /tmp/aaa.txt
efibootmgr -v
cat /boot/efi/almalinux/grub.cfg
getenforce
たとえば実行結果にタイムスタンプが入るsystemctlやvgcfgbackupだったり、dracut使ったときbootパーティションにバックアップ作るからdfには差異出るけど、dnfの結果とかユーザ・グループのリストには違いが出ないはず。
その他、/etcの中の設定とかも必要なら比較したらいい。
web系のサーバやったら、nginxとかapacheの設定とか、dbサーバやったらmariadbとかpostgresqlの設定とかシステム状態を拾うsql用意してもええと思う。
dockerとかkubernetesをホストしてるなら、冪等性を信じてyamlファイルの定義の比較だけでもええかもね。
etcの中なら例えば、logrotate.d/ssh/yum.repos.dとかをtarで丸々取っといたらええ。
例えばこんな感じ。
BACKUP_DIR=/backup
mkdir -p $BACKUPDIR/ssh
cp -pR /etc/ssh/* $BACKUP_DIR/ssh/
cd $BACKUP_DIR
tar czf ssh.tar.gz ssh
rm -fR $BACKUP_DIR/ssh/
なんとxfsdumpでバグ?
redhat9をそのままインストールして使うと、xfsdumpでとったバックアップをxfsrestoreで戻したら、変な動きすることあるらしいってわかった。
フルバックアップのときには特に発生してへんかったけど、LVM潰さずにファイルシステムもそのままにしてresotoreフォルダの中をrmしてからリストアしたときに見つけた。
リストアでLVM設定が有効になってないことが・・・
何度かリカバリDVDで起動して復元してたら、たまたまかもしれんけどルートパーティションが入ったLVMが見えんくなってることがあった。
LVMのvgが有効になってないと、そのまま動かすとxfsrestoreで警告出まくる(/dev/mapper/redhat-rootなんかあらへんで!!とかいう感じ)。
見えてへんときは、新品ディスクにLVM作るときの最後のコマンドライン使ってこうする。
vgchange -ay almalinux
引数のalmalinux
はLVMのvg名。
vgcfgbackupで取っておいた設定の中にも書いてある。
pvdisplayしたときのVG Name。
バックアップにLVMの設定残してたからすぐ書けた。
これやってうまく行ったらこう戻ってくる。
3 logical volume(s) in volume group "almalinux" now active
クラウドのサーバばっかりやってるから、いろいろ新鮮やったな。
ホンマはxfsdump/xfsrestoreでlinuxを元に戻せるのかって検証が目的やったんやけど、色々と枝葉がついたもんや。