使用 tar/rsync 备份迁移 linux 系统
起因是 NAS 系统固态硬盘坏了,临时用移动硬盘做的系统,跑了2周。这两周期间逐渐的回复里面的功能。用的是 debian 12 作为基础系统,添加了 mergerfs,webdav,aria2 服务等。
本次使用的 rsync 完成,tar 部分属于参考整理。
1. 基本原理
- 备份根文件系统。不包括虚拟文件系统。
- 然后在 livecd 下,把当前系统的虚拟文件系统 bind 绑定到挂载的 /mnt下
- /mnt 里面是新的硬盘的复制过来的根文件系统。
- 绑定这些临时生成的目录以后我们 chroot 就可以正常的使用 /mnt 作为根文件系统了
- 在这个 /mnt 的根文件系统下 重建 grub,更新 grub 即可。
1.1. 虚拟文件系统
虚拟文件系统是在系统运行的时候临时生成的,所以不要备份他们。常见的有
/proc, /sys, /tmp, 和 /run 目录 这几个都是特殊目录,不要备份,他们都是虚拟文件系统。
chroot 的时候也要额外再加几个子目录的情况比如:/dev/pts,/sys/firmware/efi/efivars。
/proc
为每个正在运行的进程提供了一个子目录,目录的名字就是进程标识符(PID)。需要读取进程信息的系统工具,如 ps(),可以从这个目录结构获得信息。
/sys
以下的目录包含了内核输出的数据结构,它们的属性,以及它们之间的链接。它同时也包含了改变某些内核运行时参数的接口。
/dev
设备文件的挂载点,包含所有的硬件设备和特殊的文件接口。键鼠,硬盘,等等都在这下面。
/tmp
临时文件夹。每次重启自动清空
/run
系统运行时候的临时文件,系统日志,锁文件,临时设备都在这个目录下。/run 是 /var/run 的软连接,所以重启不会清空。
/dev/pts
里面存在着 linux 系统下的伪终端设备,ubuntu 的 livecd 在chroot 的时候会用到,否则有些命令无法执行
/sys/firmware/efi/efivars
它里面存储着 UEFI 的 EFI 变量。EFI 里面存着各种键值对,只在 uefi 系统下才有效。所以如果是要做根 uefi 相关的必须要把这个目录单独的去挂载,否则 grub-install 会报错,不支持 EFI 的安装。
有些 livecd 如 clonezilla 就没有开启 EFI 变量的功能,我们需要在 livecd 在 grub 启动时候 -e 更改添加 efi=runtime
启动 livecd 后
ls /sys/firmware/efi/efivars
看下里面有没有内容。如果没有,modprobe efivarfs
再查看一下有没有。
2. 使用 rsync 迁移
从移动硬盘上的系统迁移到 msata
移动硬盘 /dev/sdb
msata /dev/sda
2.1. 准备工作
分区创建 在 livecd 下,用 lsblk -f
查看原来的分区有几个,类型是什么。
这次要创建的比较典型有 3 个分区 EFI ,/,SWAP
因为 移动硬盘的临时系统安装的时候采用的 UFEI 的引导,所以,还要重启一下,在 livecd 在 grub 启动时候 -e 更改添加 efi=runtime quiet
2.2. 创建分区
每一步可以按p来打印当前的状态。
在Linux系统中,可以使用以下命令来创建EFI分区:
使用 fdisk 命令来对磁盘进行分区。例如,假设我们要对 /dev/sda 磁盘进行操作,可以执行以下命令:
fdisk /dev/sda
这时候可以输入 p 先查看一下状态
输入g
命令以创建 GPT 分区表。如果磁盘已经是 GPT 分区表,则可以跳过此步骤。
输入n
命令以创建新分区。(如果不是全新的硬盘可以先用 d 删除了所有的分区)
选择分区类型。输入1
表示创建第一个分区。
输入分区大小。根据需要输入分区的大小,可以按照 MB 或 GB 进行指定。输入+512M
以创建一个大小为 512MB 的分区。
输入t
命令以更改分区类型。
输入1
或适当的分区代码以选择EFI分区类型。(输入 L 可以查看,1 就是 EFI)
继续 n,此时重建的是根分区,输入-1024M
给 swap 留 1024 MB,从后面往前划分
继续 n,一路回车
最后,输入w
命令来保存并退出 fdisk。
完成上述步骤后,成功创建了 EFI 分区。请记住,EFI 分区必须使用 fat32 文件系统格式化,以便在引导过程中被识别。使用mkfs.fat命令对EFI分区进行格式化。
mkfs.fat -F32 /dev/sda1
mkfs.ext4 /dev/sda2
mkswap /dev/sda3
2.3. 使用 rsync 迁移/备份根分区
移动硬盘 /dev/sdb
msata /dev/sda
sudo mkdir /mnt/old
sudo mkdir /mnt/new
sudo monut /dev/sdb2/old
sudo mount /dev/sda2/new
sudo rsync -av --progress /mnt/old /mnt/new
2.3.1. 更改uuid
去 /mnt/new/etc/fstab
中,更改里面分区的 uuid,把 efi,swap,/分区的 uuid 都改成新的。也就是sdb的改成sda的
使用 blkid -f
可以查询 uuid
2.4. 重建grub-efi
sudo mount /dev/sda2 /mnt
sudo mount --bind /dev/ /mnt/dev
sudo mount --bind /sys/ /mnt/sys
sudo mount --bind /proc/ /mnt/proc
sudo mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars
sudo mount /dev/sda1 /mnt/boot/efi
之后
sudo chroot /mnt #更改mnt为当前的root系统,上面挂载的虚拟文件系统就是为它准备的
grub-install /dev/sda
update-grub
因为以前安装就是 EFI 的所以这样可以直接修复好 EFI 的引导。
也可以写的比较精确像这样
grub-install --target=x86_64-efi /dev/sda1 # target默认是x86_64-efi
grub-grub-mkconfig -o /boot/grub/grub.cfg
update-grub
3. tar打包
tar 打包最大的好处是可以在线的备份还原!!!
tar 本来是打包用的系统
可用来做系统的备份还原使用。
基本的原理是,在指定的目录,打 tar 包,打包时候用 tar 的 --exclude
选项来排除掉不必要备份的内容,最后在 livecd 中,创建几个排除的目录,挂载虚拟出来的排除目录。重新安装grub就好了。
3.1. 离线备份
我比较推荐离线备份,我觉得这样的更加简单。
在livdcd里面不用考虑 虚拟文件系统的事直接挂载根分区备份就好了。
livecd 里面挂载移动硬盘到 /opt
原硬盘挂载在 /mnt
cd /opt && tar cvf data.tgz /mnt
3.2. 在线备份
ubuntu 官方提出的一个脚本如下,这是在当前的系统下做备份,直接备份 backup.tar.gz 到根目录
tar -cvpzf backup.tar.gz \
--exclude=/backup.tar.gz \
--exclude=/proc \
--exclude=/tmp \
--exclude=/mnt \
--exclude=/dev \
--exclude=/sys \
--exclude=/run \
--exclude=/media \
--exclude=/var/log \
--exclude=/var/cache/apt/archives \
--exclude=/usr/src/linux-headers* \
--exclude=/home/*/.gvfs \
--exclude=/home/*/.cache \
--exclude=/home/*/.local/share/Trash /
/var/log
/var/cache/apt/archives
/usr/src/linux-headers
/home//{.cache,.gvfs,.local/share/Trash} 这几个目录就是为减小备份的体积,但是我觉得还是有点用的。
3.3. 分割大小
3.3.1. 打包时分割
tar -cvpz <put options here> / | split -d -b 3900m - /name/of/backup.tar.gz
备份阶段分割
tar -cvpz
:创建并压缩归档文件。<put options here>
:放置其他选项的位置。/
:要归档的目录或文件的路径。|
:管道符,将前一个命令的输出传递给后一个命令。split -d -b 3900m -
:分割文件,每个文件大小为3900MB。/name/of/backup.tar.gz.
:分割文件的前缀名。
3.3.2. 完成后分割
split -d -b 3900m /path/to/backup.tar.gz /name/of/backup.tar.gz.
3.4. 还原
sudo tar -xvpzf /path/to/backup.tar.gz -C /media/whatever --numeric-owner
-x:表示解包(extract)。
-v:表示详细模式(verbose),在解包过程中会显示文件列表。
-p:表示保留原文件的权限。
-z:表示通过gzip解压缩文件。
-f:后面跟的是要处理的文件名,这里是/path/to/backup.tar.gz。
-C:后面跟的是解包后文件存放的目录,这里是/media/whatever。
--numeric-owner:表示在解包时使用数字ID而不是用户名来表示文件所有者和组。
根文件系统完成还原以后,其余部分和rsync 的步骤一样。
4. 参考链接
- https://help.ubuntu.com/community/BackupYourSystem/TAR
- https://jiajunhuang.com/articles/2020_05_22-linux_clone_sys.md.html* https://unix.stackexchange.com/questions/91620/efi-variables-are-not-supported-on-this-system
- https://blog.csdn.net/songchunlei8/article/details/104579554
- https://worktile.com/kb/ask/362199.html
- efi-variables-are-not-supported-on-this-system
- https://www.cnblogs.com/fly2wind/p/11939209.html