我有个 linux 根分区和 lvm 想备份,使用什么工具?

2015-02-12 23:08:58 +08:00
 ioiioi
在物理服务器安装了centos,采用的是gpt分区方式,而且用了lvm,硬盘大小为40G(使用了hp P420i做了阵列,划分了一个40G的逻辑盘,在操作系统中视为一个独立的物理盘)。
分区表如下:

```
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: HP LOGICAL VOLUME (scsi)
Disk /dev/sda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number Start End Size File system Name Flags
1 262kB 2097kB 1835kB primary bios_grub
2 2097kB 537MB 535MB ext4 primary boot
3 537MB 42.9GB 42.4GB primary lvm

```
其中分区3通过lvm划分了两个lv:root和swap,root为20G,仅用了3.2G,swap为8G。

我初步以下备份方式:
使用system rescue cd,备份分区表和lvm,然后对partition1和partition2做dd备份,接着使用tar对/root分区的内容做备份,最后scp到backup server。
问题:
1、如何备份分区表和lvm
2、恢复的步骤是怎样的?

说明:
我尝试过使用sgdisk,虽然可以备份分区表,但是恢复的时候并不正确,无法正常启动,似乎无法备份lvm信息。
4833 次点击
所在节点    问与答
8 条回复
ToughGuy
2015-02-13 00:22:08 +08:00
备份分区表:
sfdisk -d /dev/sda > sda-partition.backup
恢复分区表
cat sda-partition.backup | sfdisk -f /dev/sda
同里克隆sda分区表到sdb(需要两块盘一样)
sfdisk -d /dev/sda | sfdisk -f /dev/sda

至于root分区备份
tar -czvpf /path/to/root.tar.gz --exclude=/path/to/root.tar.gz --exclude=proc --exclude=mnt --exclude=sys --exclude=dev --exclude=tmp/* --exclude=media --exclude=WhatYouWant /
恢复
tar -xzvpf /path/to/root.tar.gz -C /

备份主引导记录
dd if=/dev/sda of=/path/to/mbr.backup bs=512 count=1
恢复祝引导记录
dd if=/path/to/mbr.backup of=/dev/sda

如果分区信息有改变记得修改过/etc/fstab和/boot/grub/menu.lst里面的UUID

LVM分区也可以直接使用lvm快照功能,更省事儿。
ToughGuy
2015-02-13 00:22:49 +08:00
恢复分区后vgchange -ay 就能识别到lvm分区了
ioiioi
2015-02-13 08:38:00 +08:00
@ToughGuy
有两个问题
1、gpt分区方式,sfdisk应该是无法识别的,应该用sgdisk

2、备份主引导记录
dd if=/dev/sda of=/path/to/mbr.backup bs=512 count=1

同样,gpt,也能用bs=512 count=1这个参数来进行备份吗?

嗯,恢复分区后,使用vgchange -ay我倒是没有试过,我试试。
ioiioi
2015-02-13 08:40:27 +08:00
@ToughGuy
对了,还有恢复的步骤
1、恢复分区表;
2、vgchange -ay 识别所有lvm;
3、恢复引导记录
4、挂载根分区
5、将根分区的内容解压到挂在点;
6、umount && reboot
是这样的吗?
ToughGuy
2015-02-13 09:26:24 +08:00
@ioiioi

sorry 昨晚急着去洗澡,文章内容真没注意看, gpt分区的确无法使用sfdisk来备份或者还原。
主引导记录不论是DOS分区还是GPT分区都会有, 不过这个在GPT分区下是否对引导有影响还不得而知。
ToughGuy
2015-02-13 09:31:33 +08:00
@ioiioi
恢复步骤没错, 恢复后记得使用命令检查blkid 对比下/etc/fstab和/boot/grub/menu.lst(grub.cfg)的是否对的上号。
ioiioi
2015-02-13 09:45:49 +08:00
@ToughGuy
谢谢,menu.lst的话,我准备直接用/dev/sda1这种方式了,uuid太费事。
ioiioi
2015-02-15 16:58:24 +08:00
我发现,针对一个生产服务器的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.vg
pvcreate --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吧,恢复的过程还可以偷懒,没必要为了节省那么丁点硬盘空间,瞎折腾。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/170607

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX