我发现,针对一个生产服务器的linux进行备份和恢复,不是一件容易的事,这两天经过实践,把过程写下来,节省大家的时间。
### 备份
思路:备份分区表,引导分区、/boot和根分区的内容
1、启动sysresccd的图形界面。
2、设置网络和备份目录
```
mkdir -p /mnt/custom/backup/pmx5-os-backup && cd /mnt/custom/backup/pmx5-os-backup
```
3、备份分区表
```
sgdisk --backup=/mnt/backup/sda-gpt.bak /dev/sda
sgdisk --backup=/mnt/backup/sdb-gpt.bak /dev/sdb
```
4、备份lvm 的pv、vg和lv的metadata
备份物理卷元数据(pv metadata)
```
mkdir /mnt/custom/root
mount /dev/pve/root /mnt/custom/root
```
在pmx5的/etc/lvm/archive目录里面有所有lvm vg的信息,可以考虑仅备份最后一个。
```
cd /mnt/custom/root/ && ll ./etc/lvm/archive
...
loc_00011-927590291.vg...
pve_00003-1143708246.vg...
cp
loc_00011-927590291.vg pve_00003-1143708246.vg /mnt/backup/pmx5-os-backup
```
备份vg和lv metadata
```
vgcfgbackup -f /mnt/backup/pmx5-os-backup/lvm-vg-loc.bak /dev/loc
vgcfgbackup -f /mnt/backup/pmx5-os-backup/lvm-vg-pve.bak /dev/pve
```
5、备份引导分区
```
dd if=/dev/sda1 of=/mnt/backup/pmx5-os-backup/sda1-boot-sector.img bs=512
```
6、备份/boot分区
```
mkdir /mnt/custom/boot && mount /dev/sda2 /mnt/custom/boot
cd /mnt/custom/boot
tar -czvpf /mnt/backup/pmx5-os-backup/sda2-boot-fs.tar.gz ./
```
7、备份根分区及uuid
```
mkdir /mnt/custom/root && mount /dev/pve/root /mnt/custom/root
cd /mnt/custom/root
tar -czvpf /mnt/backup/pmx5-os-backup/sda3-lvm-pve-root-fs.tar.gz ./
blkid > /mnt/backup/pmx5-os-backup/uuid.bak
```
8、备份其它分区
```
mkdir /mnt/custom/data && mount /dev/loc/data /mnt/custom/data
cd /mnt/custom/data
tar -czvpf /mnt/backup/pmx5-os-backup/sda3-lvm-loc-data-fs.tar.gz ./
blkid > /mnt/backup/pmx5-os-backup/uuid.bak
```
9、打包并发送到备份服务器
```
cd /mnt/custom/backup/pmx5-os-backup
tar -cvf pmx5-os-backup.tar --exclude=./pmx5-os-backup.tar ./*
scp pmx5-os-backup.tar root@<backup-server-ip>:/mnt/backup
```
### 恢复或克隆
不是一般的麻烦,能用dd,就用dd吧。
uuid仅在本地有效,两个物理服务器的相同块设备,其uuid可以一样,这是克隆的基础。
1、先用HP的iLO创建阵列和两块逻辑盘,类型和大小跟原服务器一致。
2、将将备份文件拷贝到sysresccd的临时硬盘中。
```
mkdir /mnt/backup/pmx5-os-backup && cd /mnt/backup/pmx5-os-backup
scp root@<backup-server-ip>:/mnt/backup/pmx5-os-backup/* .
```
3、恢复分区表
```
sgdisk --load-backup=sda-gpt.bak /dev/sda
sgdisk --load-backup=sdb-gpt.bak /dev/sdb
```
4、恢复boot-sector
```
dd if=./boot-sector.img of=/dev/sda1 bs=1M
tune2fs -U 8e3cb37f-cb8c-4cc6-949f-102eb451b552 /dev/sda2
```
说明:因为sgdisk不会恢复原有块设备的uuid,所以需要把块设备的uuid改成旧的uuid,否则启动的时候会出现no such device的错误提示。通过tune2fs可以更改分区的uuid,当然也可以使用update-grub2来实现,不过要麻烦一点。
5、恢复/boot
```
mkdir /mnt/custom/boot
mount /dev/sda2 /mnt/custom/boot
tar -zxvf ./boot-fs.tar.gz -C /mnt/custom/boot
umount /mnt/custom/boot
```
6、恢复pv
从uuid.bak中找到/dev/sdb1中的loc pv的uuid
```
pvcreate --uuid "<dev-sda3-pv-uuid>" --restorefile=./
pve_00003-927590291.vgpvcreate --uuid "<dev-sdb1-pv-uuid>" --restorefile=./
loc_00011-927590291.vg```
这一步的作用是创建与原uuid一致的pv,如果直接使用vgcfgrestore的话,会出现“xxx”的错误提示。
7、恢复vg和lv
```
vgcfgrestore -f ./lvm-vg-loc.bak /dev/sdb1
vgcfgrestore -f ./lvm-vg-pve.bak /dev/sda3
```
8、恢复文件系统
```
vgchange -ay
mkfs.ext4 /dev/pve/root
mkdir /mnt/custom/root && mount /dev/pve/root /mnt/custom/root
tar -zxvf ./root-fs.tar.gz -C /mnt/custom/root
umount /mnt/custom/root
mkfs.ext4 /dev/sdb1
mkdir /mnt/custom/data && mount /dev/loc/data /mnt/custom/data
tar -zxvf ./vz-fs.tar.gz -C /mnt/custom/data
umount /mnt/custom/data
```
9、恢复swap分区
```
mkswap /dev/pve/swap
```
使用lsblk和blkid检查分区表和uuid,确认无误后即可重启服务器。
===========
1、tar打包root分区的时候,不能exclude /dev /proc /sys,否则启动会报错。
2、uuid要前后一致
3、用dd吧,恢复的过程还可以偷懒,没必要为了节省那么丁点硬盘空间,瞎折腾。