使用tar/rsync 备份迁移linux系统

使用 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. 参考链接

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇