备份和迁移 Linux 系统

最近折腾了一下,把装在移动硬盘的 Manjaro 复制到笔记本的硬盘里面了。如果你需要备份自己的的 Linux 系统,然后到另一台电脑上安装的话,这篇文章可能会帮到你。

如果你只是想创建一个系统快照,方便将来搞砸的时候还原回来,可以不用这么麻烦,用 Timeshift 就可以了。

准备工作 / 配置要求

  1. 一个安装好的,可以启动的 Linux 系统,使用启动引导是 GRUB 2
  2. 硬盘分区格式是 GPT,BIOS 引导模式是 UEFI
  3. 待备份的系统分区有超过一半的未使用空间(得放得下备份文件)
  4. 目标电脑的硬盘上分好分区,准备存放迁移过来的系统
  5. 一个 Linux Live CD 启动盘U盘,最好就是安装 Linux 时用的那个镜像

准备完成后就可以开始了!

Konqi 也准备好了!(

备份系统

Wiki 上面提供了很多方式1,我从中选了最简单的一种,就是打包成 tar 压缩包2

从 Live CD 启动后,查询和挂载你的 Linux 分区:

1
2
3
su root
fdisk -l # 查看分区信息
mount /dev/sda2 /mnt # 假设 sda2 是你的 linux 分区,把它挂载上

要使用的其他分区(如果有的话)需要装载到适当的位置(例如,如果有单独的 /home 分区,就把它挂载到 /mnt/home)。

然后,使用 chroot 把环境切换到分区,准备备份:

1
chroot /mnt

执行 tar 命令:

1
2
3
# -p、--acls 和 --xattrs 存储所有权限、ACL 和扩展属性。如果没有这些属性,许多程序会停止工作!
# 可以安全地移除详细信息标志(-v)。如果使用的终端速度较慢,这可以加快备份过程。
tar --exclude='/tmp' --exclude='/opt/backup' --acls --xattrs -cpvf /opt/backup/$(date "+%F").tar.gz /

执行之后,会开始备份系统到 /opt/backup 目录下。--exclude 可以指定想要排除的文件和目录。等到备份结束,把压缩包拷贝出来,放到新电脑的磁盘里面。

恢复系统

在新电脑用 Live CD 启动后,挂载并 cd 到想要还原的分区,解压文件:

1
tar --acls --xattrs -xpf backupfile

修改 fstab 文件

接下来需要修改 fstab 文件。fstab 文件是系统开机时需要挂载的分区信息,我们只需要稍加修改,把 UUID 改成新分区的 UUID 就可以了。

1
cat /etc/fstab

我的 fstab 是这样:

1
2
3
4
5
6
7
8
9
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a device; this may
# be used with UUID= as a more robust way to name devices that works even if
# disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=86A4-0D24 /boot/efi vfat umask=0077 0 2
UUID=55ac4657-1043-4cb2-a727-3936a83c8d87 / ext4 defaults,noatime 0 1

这些命令都可以查询磁盘的信息:

1
2
3
fdisk -l
blkid
lsblk -o NAME,RM,SIZE,RO,FSTYPE,UUID,MOUNTPOINTS

这一步的 fstab 文件也可以通过挂载好所有目录之后使用 genfstab -U <挂载根目录>来生成。

重建 initramfs

initramfs 包含了能够让系统访问根文件系统的模块。如果迁移的设备有变化,就需要重新生成。

需要准备 chroot 环境:

1
2
mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot/efi

挂载临时文件系统目录:

1
2
3
4
5
cd /mnt
mount -t proc /proc proc/
mount --rbind /sys sys/
mount --rbind /dev dev/
chroot /mnt /bin/bash

如果你用的是 Arch,可以不需要挂载上面的临时文件系统:

1
arch-chroot /mnt

重建 initramfs:

1
mkinitcpio -p linux

安装启动引导

目前新系统还是没有启动引导的,需要手动安装引导。

在之前 chroot 环境,执行命令安装 grub。

1
2
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB --recheck
grub-mkconfig -o /boot/grub/grub.cfg

没有报错的话,就是成功了,可以重启系统。

进入系统之后,再执行一次 update-grub 或者 grub-mkconfig -o /boot/grub/grub.cfg。如果启用了os-probe3,会扫描磁盘上的其他系统,比如 Windows,会被添加到启动菜单中。

附:手动引导

如果由于一些原因,比如你的 Live CD 里面没有 grub-install 命令,或者不想安装启动引导到磁盘里面,只是临时启动一下系统,那么可以利用 GRUB 的命令行手动引导启动系统4

要进入到 GRUB 命令行,可以在开机进入 Live CD 的 GRUB 启动菜单页面的时候按 C

1
2
3
4
5
grub> ls -l
grub> set root=(hd0,msdos1)
grub> linux /boot/vmlinuz-6.1-x86_64 root=UUID=55ac4657-1043-4cb2-a727-3936a83c8d86
grub> initrd /boot/initramfs-6.1-x86_64.img
grub> boot

ls -l 是可以查看分区信息和对应的 UUID,linux 命令找 /boot 下 vmlinuz 开头的文件,initrd 命令找 initrd 开头的文件。命令和文件都可以按 Tab 自动补全,但是那个 UUID 参数得手打,有点累。

GRUB 2 的命令行模式界面

进入系统后,也可以再把启动引导装回来:

1
2
3
# bootloader-id 会成为 BIOS 启动项的文本
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=manjaro --recheck --verbose
sudo update-grub

参见

作者

Lazyb0x

发布于

2023-01-01

更新于

2023-05-24

许可协议

评论