V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ioiioi
V2EX  ›  问与答

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

  •  
  •   ioiioi · 2015-02-12 23:08:58 +08:00 · 4825 次点击
    这是一个创建于 3359 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在物理服务器安装了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信息。
    8 条回复    2015-02-15 16:58:24 +08:00
    ToughGuy
        1
    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
        2
    ToughGuy  
       2015-02-13 00:22:49 +08:00
    恢复分区后vgchange -ay 就能识别到lvm分区了
    ioiioi
        3
    ioiioi  
    OP
       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
        4
    ioiioi  
    OP
       2015-02-13 08:40:27 +08:00
    @ToughGuy
    对了,还有恢复的步骤
    1、恢复分区表;
    2、vgchange -ay 识别所有lvm;
    3、恢复引导记录
    4、挂载根分区
    5、将根分区的内容解压到挂在点;
    6、umount && reboot
    是这样的吗?
    ToughGuy
        5
    ToughGuy  
       2015-02-13 09:26:24 +08:00
    @ioiioi

    sorry 昨晚急着去洗澡,文章内容真没注意看, gpt分区的确无法使用sfdisk来备份或者还原。
    主引导记录不论是DOS分区还是GPT分区都会有, 不过这个在GPT分区下是否对引导有影响还不得而知。
    ToughGuy
        6
    ToughGuy  
       2015-02-13 09:31:33 +08:00   ❤️ 1
    @ioiioi
    恢复步骤没错, 恢复后记得使用命令检查blkid 对比下/etc/fstab和/boot/grub/menu.lst(grub.cfg)的是否对的上号。
    ioiioi
        7
    ioiioi  
    OP
       2015-02-13 09:45:49 +08:00
    @ToughGuy
    谢谢,menu.lst的话,我准备直接用/dev/sda1这种方式了,uuid太费事。
    ioiioi
        8
    ioiioi  
    OP
       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吧,恢复的过程还可以偷懒,没必要为了节省那么丁点硬盘空间,瞎折腾。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1068 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:15 · PVG 06:15 · LAX 15:15 · JFK 18:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.