备份和迁移 Linux 系统

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

最近折腾了一下,把装在移动硬盘的 Manjaro

复制到笔记本的硬盘里面了。如果你需要备份自己的的 Linux

系统,然后到另一台电脑上安装的话,这篇文章可能会帮到你。

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

Timeshift

就可以了。

准备工作 / 配置要求

一个安装好的,可以启动的 Linux 系统,使用启动引导是 GRUB 2

硬盘分区格式是 GPT,BIOS 引导模式是 UEFI

待备份的系统分区有超过一半的未使用空间(得放得下备份文件)

目标电脑的硬盘上分好分区,准备存放迁移过来的系统

一个 Linux Live CD 启动盘U盘,最好就是安装 Linux 时用的那个镜像

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

备份系统

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

tar 压缩包2。

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

123su rootfdisk -l # 查看分区信息mount /dev/sda2 /mnt # 假设 sda2 是你的 linux 分区,把它挂载上

要使用的其他分区(如果有的话)需要装载到适当的位置(例如,如果有单独的

/home 分区,就把它挂载到 /mnt/home)。

12345# 如果使用 btrfs 分区可能类似这样mount -o subvol=@ /dev/sda2 /mntmount -o subvol=@home /dev/sda2 /mnt/homemount -o subvol=@cache /dev/sda2 /mnt/var/cachemount -o subvol=@log /dev/sda2 /mnt/var/log

然后,使用 chroot

把环境切换到分区,准备备份:

1chroot /mnt

执行 tar 命令:

1234mkdir -p /opt/backup# -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

到想要还原的分区,解压文件:

1tar --acls --xattrs -xpf backupfile

修改 fstab 文件

接下来需要修改 fstab 文件。fstab

文件是系统开机时需要挂载的分区信息,我们只需要稍加修改,把 UUID

改成新分区的 UUID 就可以了。

1cat /etc/fstab

我的 fstab 是这样:

123456789# /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).## UUID=86A4-0D24 /boot/efi vfat umask=0077 0 2UUID=55ac4657-1043-4cb2-a727-3936a83c8d87 / ext4 defaults,noatime 0 1

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

123fdisk -lblkidlsblk -o NAME,RM,SIZE,RO,FSTYPE,UUID,MOUNTPOINTS

这一步的 fstab 文件也可以通过挂载好所有目录之后使用

genfstab -U <挂载根目录>来生成。

重建 initramfs

initramfs

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

需要准备 chroot 环境:

123# 挂载 Linux 分区mount /dev/sda2 /mntmount /dev/sda1 /mnt/boot/efi

挂载临时文件系统目录:

12345cd /mntmount -t proc /proc proc/mount --rbind /sys sys/mount --rbind /dev dev/chroot /mnt /bin/bash

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

1arch-chroot /mnt

重建 initramfs:

1mkinitcpio -p linux

安装启动引导

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

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

12grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB --recheckgrub-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。

12345grub> ls -lgrub> set root=(hd0,msdos1)grub> linux /boot/vmlinuz-6.1-x86_64 root=UUID=55ac4657-1043-4cb2-a727-3936a83c8d86grub> initrd /boot/initramfs-6.1-x86_64.imggrub> boot

ls -l 是可以查看分区信息和对应的

UUID,linux 命令找 /boot 下 vmlinuz

开头的文件,initrd 命令找 initrd

开头的文件。命令和文件都可以按 Tab 自动补全,但是那个 UUID

参数得手打,有点累。

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

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

参见

How to

reinstall the GRUB boot loader | Support | SUSE

Grub-probe:

error: cannot find a GRUB drive for /dev/sda1 - Support - Manjaro Linux

Forum

迁移到新硬件

- Arch Linux 中文维基

https://wiki.archlinuxcn.org/wiki/系统备份↩︎

https://wiki.archlinuxcn.org/wiki/使用_tar_备份整个系统↩︎

https://wiki.archlinuxcn.org/wiki/GRUB#探测其他操作系统↩︎

https://www.linuxfoundation.org/blog/blog/classic-sysadmin-how-to-rescue-a-non-booting-grub-2-on-linux↩︎