Linux系统备份与还原

本文最后更新于 2024年12月2日 上午

本文主要分享了备份与还原Linux系统的方法。

命令行

备份

直接备份

实现过程

Linux秉承一切皆文件的思想,系统备份就相当于把整个/(根目录)所有文件打包压缩保存。

  1. 备份前先切换到root用户,避免权限问题。

    sudo命令可以以最高权限执行命令,而root账户下所有命令都有最高权限,也就是相当于所有命令都默认加了sudo

    1
    2
    3
    4
    5
    6
    7
    8
    # 首次进入root需要先设置密码
    # 获取root权限
    sudo passwd
    su root

    # 不是首次进入的情况下
    # 切换到root用户
    sudo su
  2. 切换到/(根目录)。

    1
    cd /
  3. 查看文件系统和挂载点,注意截图保存,方便系统还原。

    1
    2
    3
    4
    # 推荐,可查看到交换空间
    cat /etc/fstab
    # 或,信息更全,有硬盘使用率等
    df -hT

    自己当时创建Linux双系统时分配的分区:

    efi 逻辑分区 空间起始位置 用于“EFI系统分区” 2*1024MB
    swap 逻辑分区 空间起始位置 用于"swap"或"交换空间" 48*1024MB
    / 主分区 空间起始位置 用于“ext4日志文件系统” 挂载点为/ 100*1024MB
    /home 逻辑分区 空间起始位置 用于"ext4日志文件系统" 挂载点为/home (500-100-48)*1024MB
  4. 压缩前预先查看预计大小(仅供参考)。

    1
    2
    3
    # du 命令需要在root权限下操作,或者在命令行前加sudo命令也可以。但排序是乱的,不好查看。
    # 使用 sort 命令 的 -k 参数设置对第二列的值进行重排,也就是按照文件(夹)名进行排序
    du -ah --max-depth=1 --exclude=./proc --exclude=./tmp --exclude=./lost+found --exclude=./media --exclude=./mnt --exclude=./run | sort -k 2

    参数:

    • -a-all:显示目录中个别文件的大小。
    • -h--human-readable:以K,M,G为单位,提高信息的可读性。
    • --max-depth=<目录层数>:超过指定层数的目录后,予以忽略。
    • --exclude=<目录或文件>:略过指定的目录或文件。
  5. 备份系统。

    用来备份的U盘最好是是NTFS类型的,因为备份文件多会超过4GB。

    1
    2
    3
    4
    5
    cd /
    # 使用 tar 打包,并使用 gzip 压缩(使用 -z 参数)
    tar -cvpzf /media/Disk/myDisk/ubuntu_backup@`date +%Y-%m-%d`.tar.gz --exclude=/proc --exclude=/tmp --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/run -P /
    # 如果安装了 pigz,可以使用 pigz 加速压缩
    tar --use-compress-program=pigz -cvpf /media/Disk/myDisk/ubuntu_backup@`date +%Y-%m-%d`.tar.gz --exclude=/proc --exclude=/tmp --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/run -P /
    1. tar命令参数:

      • -c:新建一个备份文档。
      • -v:显示详细信息。
      • -p:保存权限,并应用到所有文件。
      • -z:用gzip压缩备份文档,减小空间。
      • -f:指定压缩包名称(带路径),只能做最后一个参数。
      • -–exclude:排除指定目录,不进行备份。
      • -P:文件名使用绝对名称,不移除文件名称前的“/”号。
    2. 备份文档的存放路径为:

      1
      /media/Disk/myDisk/ubuntu_backup@`date +%Y-%m+%d`.tar.gz

      移动硬盘名字叫myDisk,挂载在/media/Disk目录下,ubuntu_backup@date +%Y-%m+%d.tar.gz是备份文件的名字,这里用了一个shell命令date +%Y-%m+%d用于获取当前时间。然后.tar.gz是说明这个文件是用tar命令进行打包,gzip进行压缩的。所以要根据你自己情况换为你自己的备份文件目录和文件名。.tar.gz这个档案文件本身必须排除在外,否则你可能会得到一些超出常理的结果。

    3. 实际可不备份的文件夹:

      • /proc:一个虚拟文件系统,系统运行的每一个进程都会自动在这个目录下面创建一个进程目录。既然是系统自动创建,也就没必要备份的必要了。当系统关机后,所有的内容都将丢失。显示的占用内存无限大,不能备份进去。
      • /tmp:一个临时文件夹,系统的一些临时文件会放在这里。
      • /lost+found:系统发生错误时(比如非法关机),可以在这里找回一些丢失文件。
      • /media:多媒体挂载点,像U盘、移动硬盘、Windons分区等都会自动挂载到这个目录下。
      • /mnt:临时挂载点,你可以自己挂载一些文件系统到这里。
      • /run:系统从启动以来产生的一些信息文件。
    4. 可额外单独备份:

      1
      2
      tar -cvpzf /media/Disk/my_Disk/ubuntu_home_backup@`date +%Y-%m-%d`.tar.gz /home  # 用户家目录,存放用户个人文件和应用程序。
      tar -cvpzf /media/Disk/myDisk/ubuntu_boot_backup@`date +%Y-%m-%d`.tar.gz /boot # 和系统启动相关的文件,像grub相关文件都放在这里,这个目录很重要!
    5. 等等。

  6. 完成。

备份过程中会遇到的错误和警告信息:

  1. 有可能备份到最后系统会提示如下,这个警告可以忽略,没什么影响的。

    1
    tar: Exiting with failure status due to previous errors 

    这个问题其实不影响程序的执行,产生的原因是tar在压缩的过程中自动帮我们去掉了路径前的“/”,也就是tar压缩后的包是按照相对路径压缩的。可以使用-P参数来指定按照绝对路径打包。

  2. 这个“socket ignored”产生的原因是压缩的过程中文件正在使用,无需理会,不影响压缩。

    1
    2
    3
    tar: /dev/shm: file changed as we read it 
    # 或
    tar: /run/udev/control: socket ignored
  3. 这个问题不用理会,与虚拟文件系统有关,不影响压缩。

    1
    tar: /run/user/1000/gvfs: Cannot stat: Permission denied 
  4. 等等。

以LiveCD方式备份

Ubuntu系统备份

备份系统并还原到另一块硬盘上(硬盘大小均可不一致)

Ubuntu系统备份

还原

系统出问题了,但是还可以进入终端

直接解压备份文件进行还原。

1
2
3
4
5
6
7
8
9
sudo su
cd /
# 使用 tar 解打包,并使用 gzip 解压缩(使用 -z 参数)
tar -xvpzf /media/Disk/myDisk/ubuntu_boot_backup@2016-6-6.tar.gz -C /
# 或 使用 pigz 加速解压
tar --use-compress-program=pigz -xvpf /media/Disk/myDisk/ubuntu_boot_backup@2016-6-6.tar.gz -C /
# 还原系统后一定要把你之前没有备份的目录手动创建
mkdir proc tmp lost+found media mnt run
# 当你重启电脑,你会发现一切东西恢复到你创建备份时的样子了!

连系统都不能登录了

使用LiveCD(U盘启动盘)进行还原。

操作之前请确保你已经有一个制作好的Ubuntu的U盘启动盘。

进入系统后,打开终端还是先切换到root。

1
2
3
4
5
6
7
8
sudo su
cd /
mkdir /mnt/sys
mount /dev/sdaX /mnt/sys
tar -xvpzf /media/myDisk/ubuntu_boot_backup@2016-6-6.tar.gz -C /mnt/sys
# 还原系统后一定要把你之前没有备份的目录手动创建
mkdir proc tmp lost+found media mnt run
# 当你重启电脑,你会发现一切东西恢复到你创建备份时的样子了!

注意:

  1. 先创建一个临时目录用于挂载你的/根目录分区,sdaX代表你的/根目录分区,如果不知道就用fdisk -l查看一下。另外如果你的移动硬盘没有被自动挂载,你也需要手动创建一个临时目录进行挂载。

  2. 因为tar还原是只会覆盖相同的文件,但是这种方法只是恢复备份时的文件,就是说如果某些文件丢失或损坏了,这样可以恢复修复这些文件,但不能删除自备份到恢复前这期间所生成的其它文件,说白了就是假如你备份系统时有1234这四个文件,如果三天后,由于某些原因变成了1234’5(4改变了),你恢复后,就会变成12345,其中4’恢复成备份时的文件,5保留。所以要是想彻底还原成备份时候的样子最好彻底删除根目录下的所有文件,然后再还原,这样就可以还原成备份时的样子了。

  3. 删除整个文件系统,比如运行命令rm -fr /*,那么你还原系统后一定要把你之前没有备份的目录手动创建,不然重启系统是有问题的。

    1
    mkdir proc tmp lost+found media mnt run
  4. 从启动盘解压之后,进入系统在文件管理器里点击自动挂载的Windows磁盘无法打开,提示权限不足?在启动盘还原之后把media目录下挂载的文件夹删掉,系统重启以后会自动生成有权限的文件夹。

  5. 还有一个稍微复杂点的LiveCD方式还原。Ubuntu系统备份

处理一些额外(报错)的操作

Ubuntu备份系统并重装到新的机器上

Systemback

Systemback Ubuntu18.04 制作系统ISO镜像并物理机还原(20, 22皆可用)

备份

实现过程

  1. Systemback安装。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 1)在18.04上添加Ubuntu 16.04 PPA
    sudo add-apt-repository "deb http://ppa.launchpad.net/nemh/systemback/ubuntu xenial main"
    # 暂时忽略掉没有公钥的报错

    # 2)导入此PPA的GPG签名密钥
    # 可以在链接: https://launchpad.net/~nemh/+archive/ubuntu/systemback
    # 查到找到验证密钥
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 382003C2C8B7B4AB813E915B14E4942973C62A1B

    # 3)更新包列表并安装Systemback:
    sudo apt update
    sudo apt install systemback
  2. ISO文件制作

    1
    2
    3
    # 注意是以管理员身份启动 Systemback ,防止运行过程中的权限问题
    sudo systemback
    # 提示选择用户,输入系统密码并进入应用。
    1. 先选择最左侧的小圆点,在右上角存储文件夹处更改文件存储位置。

    2. 点击“Live system create”。

    3. 选择工作目录,Working directory指的是systemback生成系统镜像的位置,程序运行时产生的临时文件都会被保存在这里,所以要保证有足够大的空间。

      选择写入的目录文件夹不可以是FAT、exFAT、FAT32或者NTFS等格式,且必须是可写的Linux文件系统。这时我才恍然大悟,因为自己的U盘是格式化为NTFS格式的,怪不得选择不了。

    4. 输入文件系统名称。

    5. 勾选“Include the user data files”,这样自己主文件夹内的文件都会被包含在系统镜像中。

    6. 点击“Create new”。

    7. 该操作将会生成一个.sblive文件,制作完成后能在右上角看到结果文件。

    8. 如果文件小于4GB,可以选中Created Live images里的文件,点击Convert to ISO,借助该软件生成对应的.iso系统镜像文件。如果生成的.sblive文件大于4GB,可以通过下面两种步骤分别生成系统启动盘和对应的.iso系统镜像文件。

      1. 小步骤。

        1. 创建好大于4GB的.sblive文件之后,插入有足够空间的U盘,点击绿色的刷新按钮,会在左下方的Write target看到插入的U盘,选中之后,点击右下方的Write to target,将image写入U盘中。等待写入完成,系统启动盘就做好了。待解决的问题:听说使用Write to Target向U盘中写入33GB的.sblive时失败了。
      2. 大步骤。

        1. 解压.sblive文件。

          1
          2
          3
          mkdir sblive
          # 【systemback_live.sblive】需要更改为前面设置的名称[也可以直接到home目录下寻找对应的.sblive文件]
          tar -xf /home/systemback_live.sblive -C sblive
        2. 重命名syslinux至isolinux。

          1
          2
          mv sblive/syslinux/syslinux.cfg sblive/syslinux/isolinux.cfg
          mv sblive/syslinux sblive/isolinux
        3. 安装cdtools。

          1
          2
          3
          4
          5
          6
          7
          8
          sudo apt install aria2

          aria2c -s 10 https://nchc.dl.sourceforge.net/project/cdrtools/alpha/cdrtools-3.02a07.tar.gz

          tar -xvf cdrtools-3.02a07.tar.gz
          cd cdrtools-3.02
          make
          sudo make install

          可能的报错:请问为什么我解压之后使用make编译,提示找不到文件或目录:

          1
          2
          [root@localhost cdrtools-3.02]# make
          RULES/rules.top:47: RULES/ldummy.lnk: No such file or directory

          解决:make前下载libtool。

        4. 生成ISO文件。

          1
          2
          cd ~/
          /opt/schily/bin/mkisofs -iso-level 3 -r -V sblive -cache-inodes -J -l -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -o sblive.iso sblive
        5. 上一步完成后,将会生成一个iso文件。

    9. 完成。

  3. 系统还原点创建。

    1. 先选择最左侧的小圆点,在右上角存储文件夹处更改还原点文件存储位置。还原点操作->创建新的。

    2. 把还原点文件夹打包移动到移动硬盘里:

      1
      2
      # 要用 sudo ,不然权限不够 ,打包不了
      sudo tar --use-compress-program=pigz -cvpf /目录名/文件名.tgz (空格) /boot(压缩的文件或者目录)
    3. 移动后,删除原目录打包的.tgz文件:

      1
      2
      # 要加 sudo ,不然删不掉
      sudo rm S01_2023-10-25,20.08.18.tgz
    4. 完成。

  4. 完成。

可能的报错

  1. 生成.sblive文件袋过程中如果遇到拷贝错误,可以将对应的路径文件“exclude”。如果~/下面有swap分区文件,也需要exclude或者删除掉。删除方法为sudo swapoff xxx,然后再sudo rm -rf xxx

  2. 在备份过程中可能提示:

    1
    2
    The restore point creation is aborted!
    There has been critical changes in the file system during this operation

    这并不一定是由于系统发生了严重的更改,只要是在复制文件的过程中出现错误都会出现这个信息。详细的错误信息可以通过:

    1
    systemback-sustart

    这个指令去调试,看看具体哪一个文件复制出了问题。极有可能的是权限问题。也可以通过这个指令去调试:

    1
    DBGLEV=3 systemback-sustart

    当错误出现后会在/tmp文件夹下创建一个systemback的错误信息文件。可以方便的通过这个文件去找到错误的原因。如果依旧不能解决问题,可以考虑两个措施:

    1. 将U盘格式化为FAT,重试。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 图形界面操作
      1. 将U盘插入带有Linux系统的主机中,右键选择格式化。
      2. 格式化类型选择Ext4。
      3. 格式化成Ext4后,我们的Systemback就可以识别到我们的U盘了。

      # 命令行操作
      sudo fdisk -l
      # 找到U盘的盘符,一般是(/dev/sdx),(其中"sdx"可以是"sdb"或"sdc"等)
      # 假设我们查到盘符是/dev/sdb,那么运行:
      sudo mkfs.vfat /dev/sdb -I
      # U盘即可被格式化
    2. 格式化后依旧不行,就尝试重启电脑。

  3. 等等。

还原

ISO文件还原

实现过程

  1. 有了iso文件就可以使用U盘或移动固态制作系统盘,然后进行系统安装啦。确保使用的系统盘具有两倍以上的iso文件空间。可以使用rufus及其他软件进行系统盘制作。或者使用Ventoy做一个系统盘,直接把iso文件复制粘贴到U盘里面就可以进行安装。推荐Ventoy。

  2. 系统盘弄好后,就依照正常安装Ubuntu系统的方式去安装即可,只不过具体的安装界面稍微有些不一样。大概有4个选项:

    1
    2
    3
    4
    Boot Live system
    Boot system installer
    Boot Live in safe graphics mode
    Boot Live in debug mode

    第一个选项将会进行U盘中的系统,第二个选项将直接进行系统安装。**选择第二个选项。**如果直接使用第二个选项进行系统安装时失败了,可以选择第一个选项,进入系统之后再进行安装(可以查看报错原因,知道为什么报错!)。

    最后几步有的需要root权限,Ubuntu直接在命令前加个sudo就行了。

  3. 进入U盘中的系统之后,Ctrl+Alt+T打开终端,输入systemback-sustart即可进行系统安装。我当时使用的U盘空间不够(32G的U盘装26G的系统),就出现了下面的报错,更换为64G的U盘后就能够顺利安装成功了。

    1
    2
    An error occurred while mounting the following partition/image:
    /cdrom/casper/fLlesystem.squashfs
  4. 设置用户名。进行系统安装时,需要输入系统的用户信息,推荐输入原系统的用户名和密码。安装好的系统将会使用这里输入的用户名替换掉一些系统文件中的路径,比如说~/.bashrc中设置的工作空间路径。如果输入原系统的用户名和密码,系统是可以直接运行之前配置好的一些环境的;如果输入新的用户名,可能需要重新创建工作空间并进行编译。备份的系统会保留之前系统的一系列文件,为此工作空间中的路径也还是原来的用户名的。

  5. 设置分区。之后需要选择挂载的磁盘空间,也就是进行Ubuntu系统分区,只不过这里的分区操作和常规的Ubuntu系统安装流程不一样。

    蓝鲸ROS镜像发布

    1. 原始的分区/dev/sda是电脑的硬盘,/dev/sdb是插入的启动盘。把原来的分区删掉,修改分区。

    2. 我一般设置三个分区swap、/、/boot:swap为交换分区(8-16G都可),/为根目录(必须设置)、/boot为引导区(物理机必须设置,200MB即可,如果有/boot/efi,优先选择)。不同的电脑,该步骤出现的可选选项不同!看着来即可。

      一般设置4个区间即可,"/"(ext4), "/home"(ext4), "swap", "boot/efi"。其中:

      • 先分配"swap",大小与内存相当即可。
      • 再分配"boot/efi",大小200m即可。
      • 最后分配"/"和"/home",文件系统都选ext4即可,"/"与"/home"的大小比一般是1:10到3:10,看个人需求而定。

      经验而谈,先把4个区间按大小划分好,再设置区间的挂载点/文件系统。因为我当时是一个一个地划分大小并设置文件系统,当做到第二个时,第一个分区的文件系统就会恢复成"无"了(不知道为什么)。

    3. 注意一定要挂载/boot/efi,这样下面的Install GRUB 2 bootloader才会出现EFI的选项。

    4. 另外,记得勾选上左侧的"Transfer user configuration and data files",检查"安装grub2引导程序"选项并非"禁用",并选择'Install GRUB2 bootloader'为前面设置的/boot分区的分区号。对于虚拟机,这里的/boot分区(grub)可以不设置,并选择“AUTO”。

    5. 点击Next等待系统安装即可,安装完毕之后会提示重启电脑。

  6. 完成。

可能的报错

  1. 在恢复过程中出现了已中断,并显示文件系统发生严重改变。

    解决办法:进入systemback,选择修复系统进行给grub2修复(测试可完成,并自动安装grub2,添加windowsboot项)。修复好引导项后,在U盘系统中将本机的/目录复制到硬盘上需要安装系统的位置,对于出错的文件忽略就行,复制命令如例:

    1
    cp -r ./* /media/***/SB@/
  2. 将做好的启动盘插入新电脑中,选择从U盘启动。发现无法正确进入系统安装界面。

    只有(hd0,msdos6)被识别出了文件系统。一般情况下,通过执行下述命令即可正常启动系统:

    1
    2
    3
    4
    grub rescue> set root=(hd0,msdos6)
    grub rescue> set prefix=(hd0,msdos6)/boot/grub
    grub rescue> insmod normal
    grub rescue> normal

    然而,在执行insmod normal之后会报错提示在(hd0,msdos6)/boot/grub/路径下找不到i386-pc/normal.mod。查看启动盘里面的文件,确实没有这个文件。使用这种方式制作的启动盘无法正确引导系统安装。

    推测:systemback自带的Convert to ISO和Write to target除了写入image之外,还写入了系统引导的相关文件。对于大于4GB的image,用Write to target制作的启动盘,插入电脑时挂载了SBLIVE和SBROOT两个分区。而使用其他方式制作的启动盘,插入电脑时只挂载了sblive一个分区,可能确实丢失了系统引导项。

  3. 上述方式做出的系统镜像,在单Ubuntu系统中能够成功地安装并运行。听说在Windows10下安装双系统失败了,不插着镜像启动盘无法进入系统。

系统还原点还原

使用系统还原不会还原你自己的文件、音乐、电子邮件或者其他任何类型的私人文件。

  1. 把移动硬盘里的还原点.tgz复制到/home/Systemback

    1
    sudo cp S01_2023-10-25,20.08.18.tgz /home/Systemback 
  2. 解包:

    1
    sudo tar --use-compress-program=pigz -xvpf S01_2023-10-25,20.08.18.tgz
  3. 打开Systemback:

    1. 勾选还原点(以时间作为标记)后面的方框对钩,然后点击系统还原。

    2. 依据自己需求配置,一般默认即可,点击下一步。

    3. 点击开始,还原结束后即可得到还原点时候的系统。

    4. 还原结束后重启。

  4. 完成。


Linux系统备份与还原
http://zeyulong.com/posts/73f02fc4/
作者
龙泽雨
发布于
2024年11月29日
许可协议