备份和迁移 Linux 系统
最近折腾了一下,把装在移动硬盘的 Manjaro 复制到笔记本的硬盘里面了。如果你需要备份自己的的 Linux 系统,然后到另一台电脑上安装的话,这篇文章可能会帮到你。
如果你只是想创建一个系统快照,方便将来搞砸的时候还原回来,可以不用这么麻烦,用 Timeshift 就可以了。
准备工作 / 配置要求
- 一个安装好的,可以启动的 Linux 系统,使用启动引导是 GRUB 2
- 硬盘分区格式是 GPT,BIOS 引导模式是 UEFI
- 待备份的系统分区有超过一半的未使用空间(得放得下备份文件)
- 目标电脑的硬盘上分好分区,准备存放迁移过来的系统
- 一个 Linux Live CD 启动盘U盘,最好就是安装 Linux 时用的那个镜像
准备完成后就可以开始了!
备份系统
Wiki 上面提供了很多方式1,我从中选了最简单的一种,就是打包成 tar 压缩包2。
从 Live CD 启动后,查询和挂载你的 Linux 分区:
1 | su root |
要使用的其他分区(如果有的话)需要装载到适当的位置(例如,如果有单独的 /home
分区,就把它挂载到 /mnt/home
)。
然后,使用 chroot
把环境切换到分区,准备备份:
1 | chroot /mnt |
执行 tar 命令:
1 | # -p、--acls 和 --xattrs 存储所有权限、ACL 和扩展属性。如果没有这些属性,许多程序会停止工作! |
执行之后,会开始备份系统到 /opt/backup
目录下。--exclude
可以指定想要排除的文件和目录。等到备份结束,把压缩包拷贝出来,放到新电脑的磁盘里面。
恢复系统
在新电脑用 Live CD 启动后,挂载并 cd
到想要还原的分区,解压文件:
1 | tar --acls --xattrs -xpf backupfile |
修改 fstab 文件
接下来需要修改 fstab 文件。fstab 文件是系统开机时需要挂载的分区信息,我们只需要稍加修改,把 UUID 改成新分区的 UUID 就可以了。
1 | cat /etc/fstab |
我的 fstab 是这样:
1 | # /etc/fstab: static file system information. |
这些命令都可以查询磁盘的信息:
1 | fdisk -l |
这一步的 fstab 文件也可以通过挂载好所有目录之后使用 genfstab -U <挂载根目录>
来生成。
重建 initramfs
initramfs 包含了能够让系统访问根文件系统的模块。如果迁移的设备有变化,就需要重新生成。
需要准备 chroot 环境:
1 | mount /dev/sda2 /mnt |
挂载临时文件系统目录:
1 | cd /mnt |
如果你用的是 Arch,可以不需要挂载上面的临时文件系统:
1 | arch-chroot /mnt |
重建 initramfs:
1 | mkinitcpio -p linux |
安装启动引导
目前新系统还是没有启动引导的,需要手动安装引导。
在之前 chroot 环境,执行命令安装 grub。
1 | grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB --recheck |
没有报错的话,就是成功了,可以重启系统。
进入系统之后,再执行一次 update-grub
或者 grub-mkconfig -o /boot/grub/grub.cfg
。如果启用了os-probe3,会扫描磁盘上的其他系统,比如 Windows,会被添加到启动菜单中。
附:手动引导
如果由于一些原因,比如你的 Live CD 里面没有 grub-install
命令,或者不想安装启动引导到磁盘里面,只是临时启动一下系统,那么可以利用 GRUB 的命令行手动引导启动系统4。
要进入到 GRUB 命令行,可以在开机进入 Live CD 的 GRUB 启动菜单页面的时候按 C。
1 | grub> ls -l |
ls -l
是可以查看分区信息和对应的 UUID,linux
命令找 /boot 下 vmlinuz 开头的文件,initrd
命令找 initrd 开头的文件。命令和文件都可以按 Tab 自动补全,但是那个 UUID 参数得手打,有点累。

进入系统后,也可以再把启动引导装回来:
1 | # bootloader-id 会成为 BIOS 启动项的文本 |
参见