电商网站建设与运营方向就业前景,1一2万电动汽车,建网站的域名,建站前端模板#xff08;首发地址#xff1a;学习日记 https://www.learndiary.com/2024/03/migrate-linux-with-bsdtar/ #xff09;
我们在做 Linux 全系统迁移的时候#xff0c;可以直接备份磁盘或分区#xff08;如 dd #xff09;#xff0c;也可以备份全部文件#xff08;如…首发地址学习日记 https://www.learndiary.com/2024/03/migrate-linux-with-bsdtar/
我们在做 Linux 全系统迁移的时候可以直接备份磁盘或分区如 dd 也可以备份全部文件如 tar 。前者在硬盘分区一样的情况下比较方便但备份文件尺寸较大并且目的磁盘不得小于源磁盘。备份全部文件再恢复的方法比较灵活备份文件尺寸跟实际文件多少有关可以很小但需要额外恢复引导和修改挂载参数稍微复杂一点。本文在VirtualBox 虚拟机环境中以把默认安装的 Deepin 20.9 Linux磁盘 64G迁移到另一台 16G 磁盘的虚拟机中为示范演示一下使用 BSD 版 tar即 bsdtar 作 Linux 全系统迁移的基本步骤。演示视频链接【用 bsdtar 做 Linux 全系统迁移 - 最省空间、最灵活的Linux系统迁移方式但需要那么一点点技巧】 https://www.bilibili.com/video/BV1Rj421d7D3/ 用 bsdtar 做 Linux 全系统迁移 - 最省空间、最灵活的Linux系统迁移方式但需要那么一点点技巧 之所以不用 GNU tar 而使用 bsdtar是因为 bsdtar 保留文件特殊属性方面更全面和简便具体参见我前面关于 GNU tar 和 bsdtar 在保留文件特殊属性方面的测试日记参考链接1、2。
系统最好是在关机状态下备份避免在备份过程中数据发生变化。
选择跟源系统一样版本或差不多版本的 livecd 启动系统进行备份和恢复从而完成全系统迁移。我这里使用的是 Deepin 官方的“deepin-live-system-2.0-amd64.iso”。
在源系统上进入 livecd 环境后我们先在 live 环境中安装 bsdtar 用于备份操作。安装 openssh-server并为 live 环境的 deepin 用户设置密码用于远程传输备份文件。 命令如下
deepindeepin:~$ sudo apt update; sudo apt install bsdtar openssh-server -y
deepindeepin:~$ sudo passwd deepin
deepindeepin:~$
查看一下源系统的分区情况
deepindeepin:~$ lsblk -f /dev/sda
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 vfat EFI 3726-096F
├─sda2 ext4 Boot 536ccefb-fda4-4d7b-b453-234bcc51ed57 /media/deepin/Boot
├─sda3 ext4 Roota da61922c-599a-4104-8fee-531529ff4a0c /media/deepin/Roota
├─sda4 ext4 Rootb 62675cba-483e-41a9-8490-3a0899547167 /media/deepin/Rootb
├─sda5 ext4 _dde_data 5fb706dc-3c05-4836-9883-2e6afc965aed /media/deepin/_dde_
├─sda6 ext4 Backup 7528aaf1-a3b3-459e-b94e-5f96a5602069 /media/deepin/Backu
└─sda7 swap SWAP 98a4522b-a822-4a2e-891e-af4e7349c0ac
deepindeepin:~$
为了简单起见我们不迁移 Deepin 默认安装时自身用于数据备份恢复的辅助分区和交换分区 sda4、sda6、sda7。先把需要数据迁移的 sda3、sda2、sda1 和 sda5 挂载到 live 环境的 /mnt 目录下。注意必须按源系统目录层次结构按顺序进行分区挂载比如/、/boot、/boot/efi。
deepindeepin:~$ sudo mount /dev/sda3 /mnt -v
mount: /dev/sda3 mounted on /mnt.
deepindeepin:~$ sudo mount /dev/sda2 /mnt/boot -v
mount: /dev/sda2 mounted on /mnt/boot.
deepindeepin:~$ sudo mount /dev/sda1 /mnt/boot/efi -v
mount: /dev/sda1 mounted on /mnt/boot/efi.
deepindeepin:~$ sudo mount /dev/sda5 /mnt/data -v
mount: /dev/sda5 mounted on /mnt/data.
deepindeepin:~$ cd /mnt
deepindeepin:/mnt$ ls
bin dev lib libx32 mnt recovery sbin tmp
boot etc lib32 lostfound opt root srv usr
data home lib64 media proc run sys var
deepindeepin:/mnt$ sudo df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 2.0G 0 2.0G 0% /dev
tmpfs 395M 5.6M 389M 2% /run
/dev/sr0 385M 385M 0 100% /lib/live/mount/medium
/dev/loop0 303M 303M 0 100% /lib/live/mount/rootfs/filesystem.squashfs
tmpfs 2.0G 0 2.0G 0% /lib/live/mount/overlay
overlay 2.0G 212M 1.8G 11% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
tmpfs 2.0G 4.0K 2.0G 1% /tmp
tmpfs 395M 16K 395M 1% /run/user/1000
/dev/sda6 11G 7.5G 2.8G 74% /media/deepin/Backup
/dev/sda3 15G 6.7G 7.3G 48% /mnt
/dev/sda4 15G 41M 14G 1% /media/deepin/Rootb
/dev/sda2 1.5G 218M 1.2G 16% /mnt/boot
/dev/sda5 15G 573M 14G 4% /mnt/data
/dev/sda1 300M 9.1M 291M 4% /mnt/boot/efi
deepindeepin:/mnt$
下面对系统进行备份
deepindeepin:/mnt$ time sudo bsdtar --excludesysbak.btar.gz -czvf sysbak.btar.gz *
a bin
a boot
a boot/vmlinuz-5.15.77-amd64-desktop
略...
a var/cache/fontconfig/39a7f1b3-6a3c-4b85-a424-827e510fa6d6-le64.cache-7
a var/cache/fontconfig/288c2344-6f48-412f-b675-b58dc4683ee2-le64.cache-7
a var/cache/fontconfig/8f32e591-21ad-45e9-8f64-16eeb77322bf-le64.cache-7real 5m43.539s
user 3m54.286s
sys 0m59.084s
deepindeepin:/mnt$ ls -lh sysbak.btar.gz
-rw-r--r-- 1 root root 3.3G 2月 28 16:21 sysbak.btar.gz
deepindeepin:/mnt$
建一个16G磁盘的目的虚拟机用 deepin livecd 启动系统。
安装 ssh、bsdtar
deepindeepin:/mnt$ sudo apt install ssh libarchive-tools -y
deepindeepin:/mnt$
用 gparted 软件创建用于 /boot/efi 的 FAT32 EFI 分区、用于 / 的 EXT4 系统分区、用于 /data 的 EXT4 数据分区。 分区信息如下
deepindeepin:~$ sudo parted /dev/sda print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 17.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: Number Start End Size File system Name Flags1 1049kB 316MB 315MB fat32 EFI boot, esp2 316MB 13.2GB 12.9GB ext4 ROOT3 13.2GB 17.2GB 3978MB ext4 DATA
deepindeepin:~$
创建目录并挂载分区
deepindeepin:~$ sudo mount /dev/sda2 /mnt -v
mount: /dev/sda2 mounted on /mnt.
deepindeepin:~$ sudo mkdir /mnt/{boot/efi,data} -pv
mkdir: 已创建目录 /mnt/boot
mkdir: 已创建目录 /mnt/boot/efi
mkdir: 已创建目录 /mnt/data
deepindeepin:~$ sudo mount /dev/sda1 /mnt/boot/efi -v
mount: /dev/sda1 mounted on /mnt/boot/efi.
deepindeepin:~$ sudo mount /dev/sda3 /mnt/data -v
mount: /dev/sda3 mounted on /mnt/data.
deepindeepin:~$ cd /mnt
deepindeepin:/mnt$ ls
boot data lostfound
deepindeepin:/mnt$
用 scp 把源系统创建的备份文件通过网络传输到目的系统挂载的 / 分区中。
deepindeepin:/mnt$ sudo scp deepin192.168.1.19:/mnt/sysbak.btar.gz ./
The authenticity of host 192.168.1.19 (192.168.1.19) cant be established.
ECDSA key fingerprint is SHA256:cLph0YP2SqmuXTbDMTZmAoedyhPNiQBmsdG9v6ngzn8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 192.168.1.19 (ECDSA) to the list of known hosts.
deepin192.168.1.19s password:
sysbak.btar.gz 100% 3320MB 87.6MB/s 00:37
deepindeepin:/mnt$
在目的系统中恢复备份系统
deepindeepin:/mnt$ time sudo bsdtar -xzvf sysbak.btar.gz
x bin
x boot/
x boot/vmlinuz-5.15.77-amd64-desktop
x boot/initrd.img-5.15.77-amd64-desktop
略...
x var/cache/fontconfig/39a7f1b3-6a3c-4b85-a424-827e510fa6d6-le64.cache-7
x var/cache/fontconfig/288c2344-6f48-412f-b675-b58dc4683ee2-le64.cache-7
x var/cache/fontconfig/8f32e591-21ad-45e9-8f64-16eeb77322bf-le64.cache-7real 1m20.898s
user 0m23.647s
sys 0m29.094s
deepindeepin:/mnt$
挂载各种虚拟文件系统
deepindeepin:/mnt$ for i in /dev /dev/pts /proc /sys /sys/firmware/efi/efivars /run; do sudo mount -B $i /mnt$i -v; done
mount: /dev bound on /mnt/dev.
mount: /dev/pts bound on /mnt/dev/pts.
mount: /proc bound on /mnt/proc.
mount: /sys bound on /mnt/sys.
mount: /sys/firmware/efi/efivars bound on /mnt/sys/firmware/efi/efivars.
mount: /run bound on /mnt/run.
deepindeepin:/mnt$
进入 chroot 环境修改 /etc/fstab 分区挂载参数重装引导参考链接5更新 grub 菜单
deepindeepin:/mnt$ sudo chroot .
rootdeepin:/# lsblk -f /dev/sda
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1
│ vfat FAT32 017D-4B18 290.4M 3% /boot/efi
├─sda2
│ ext4 1.0 66f14f2f-405b-4abb-b33f-76a48406e4f6 1G 86% /
└─sda3ext4 1.0 c0ffaf7c-5a55-4b99-ba09-e81f3dd4e0b4 2.9G 15% /data
rootdeepin:/# sudo cp /etc/fstab /etc/fstab.orig -v
/etc/fstab - /etc/fstab.orig
rootdeepin:/# vim /etc/fstab # 或者在 livecd 环境中执行 sudo gedit /mnt/etc/fstab 修改
rootdeepin:/# cat /etc/fstab
# /dev/sda2
UUID66f14f2f-405b-4abb-b33f-76a48406e4f6 / ext4 rw,relatime 0 1# /dev/sda1
UUID017D-4B18 /boot/efi vfat rw,relatime,fmask0022,dmask0022,codepage437,iocharsetiso8859-1,shortnamemixed,utf8,errorsremount-ro 0 2# /dev/sda3
UUIDc0ffaf7c-5a55-4b99-ba09-e81f3dd4e0b4 /data ext4 rw,relatime 0 2# /swapfile
# /swapfile none swap defaults,pri-2 0 0/data/home /home none defaults,bind 0 0
/data/opt /opt none defaults,bind 0 0
/data/root /root none defaults,bind 0 0
/data/var /var none defaults,bind 0 0
rootdeepin:/# grub-install /dev/sda
get rootb uuid error: failed to get rootb uuid
正在为 x86_64-efi 平台进行安装。
安装完成。没有报告错误。
rootdeepin:/# update-grub
get rootb uuid error: failed to get rootb uuid
正在生成 grub 配置文件 ...
找到主题/boot/grub/themes/deepin-fallback/theme.txt
Found background image: /boot/grub/themes/deepin-fallback/background.jpg
找到 Linux 镜像/boot/vmlinuz-5.15.77-amd64-desktop
找到 initrd 镜像/boot/initrd.img-5.15.77-amd64-desktop
Found image: /boot/vmlinuz-5.15.77-amd64-desktop
找到 initrd 镜像/boot/initrd.img-5.15.77-amd64-desktop
Adding boot menu entry for EFI firmware configuration
完成
rootdeepin:/#
重启系统
rootdeepin:/# exit
deepindeepin:/mnt$ sudo reboot
使用 bsdtar 进行系统迁移的基本步骤演示完毕。实际中的系统迁移可能还会涉及修改网络配置安装新硬件驱动等其他问题。这些都需要根据实际情况处理。
参考链接 1、Linux tar 保留文件特殊属性使用小结https://www.learndiary.com/2024/03/gnu-tar/ 2、bsdtar 归档程序在保留文件特殊属性上比 GNU tar 更全面和简便https://www.learndiary.com/2024/03/bsdtar/ 3、Backup Your System with TARhttps://help.ubuntu.com/community/BackupYourSystem/TAR 4、使用 bsdtar 完整备份/还原 Linux 系统https://www.mivm.cn/linux-full-backup-with-bsdtar 5、Grub EFI Reinstallhttps://wiki.debian.org/GrubEFIReinstall