用 bsdtar 做 Linux 全系统迁移 - 最省空间、最灵活的Linux系统迁移方式,但需要那么一点点技巧
(首发地址:学习日记 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 用户设置密码用于远程传输备份文件。
命令如下:
deepin@deepin:~$ sudo apt update; sudo apt install bsdtar openssh-server -y
deepin@deepin:~$ sudo passwd deepin
deepin@deepin:~$
查看一下源系统的分区情况:
deepin@deepin:~$ 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
deepin@deepin:~$
为了简单起见,我们不迁移 Deepin 默认安装时自身用于数据备份恢复的辅助分区和交换分区 sda4、sda6、sda7。先把需要数据迁移的 sda3、sda2、sda1 和 sda5 挂载到 live 环境的 /mnt 目录下。注意,必须按源系统目录层次结构按顺序进行分区挂载,比如:/、/boot、/boot/efi。
deepin@deepin:~$ sudo mount /dev/sda3 /mnt -v
mount: /dev/sda3 mounted on /mnt.
deepin@deepin:~$ sudo mount /dev/sda2 /mnt/boot -v
mount: /dev/sda2 mounted on /mnt/boot.
deepin@deepin:~$ sudo mount /dev/sda1 /mnt/boot/efi -v
mount: /dev/sda1 mounted on /mnt/boot/efi.
deepin@deepin:~$ sudo mount /dev/sda5 /mnt/data -v
mount: /dev/sda5 mounted on /mnt/data.
deepin@deepin:~$ cd /mnt
deepin@deepin:/mnt$ ls
bin dev lib libx32 mnt recovery sbin tmp
boot etc lib32 lost+found opt root srv usr
data home lib64 media proc run sys var
deepin@deepin:/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
deepin@deepin:/mnt$
下面对系统进行备份:
deepin@deepin:/mnt$ time sudo bsdtar --exclude=sysbak.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
deepin@deepin:/mnt$ ls -lh sysbak.btar.gz
-rw-r--r-- 1 root root 3.3G 2月 28 16:21 sysbak.btar.gz
deepin@deepin:/mnt$
建一个16G磁盘的目的虚拟机,用 deepin livecd 启动系统。
安装 ssh、bsdtar:
deepin@deepin:/mnt$ sudo apt install ssh libarchive-tools -y
deepin@deepin:/mnt$
用 gparted 软件创建用于 /boot/efi 的 FAT32 EFI 分区、用于 / 的 EXT4 系统分区、用于 /data 的 EXT4 数据分区。
分区信息如下:
deepin@deepin:~$ 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
deepin@deepin:~$
创建目录并挂载分区:
deepin@deepin:~$ sudo mount /dev/sda2 /mnt -v
mount: /dev/sda2 mounted on /mnt.
deepin@deepin:~$ sudo mkdir /mnt/{boot/efi,data} -pv
mkdir: 已创建目录 '/mnt/boot'
mkdir: 已创建目录 '/mnt/boot/efi'
mkdir: 已创建目录 '/mnt/data'
deepin@deepin:~$ sudo mount /dev/sda1 /mnt/boot/efi -v
mount: /dev/sda1 mounted on /mnt/boot/efi.
deepin@deepin:~$ sudo mount /dev/sda3 /mnt/data -v
mount: /dev/sda3 mounted on /mnt/data.
deepin@deepin:~$ cd /mnt
deepin@deepin:/mnt$ ls
boot data lost+found
deepin@deepin:/mnt$
用 scp 把源系统创建的备份文件通过网络传输到目的系统挂载的 / 分区中。
deepin@deepin:/mnt$ sudo scp deepin@192.168.1.19:/mnt/sysbak.btar.gz ./
The authenticity of host '192.168.1.19 (192.168.1.19)' can't 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.
deepin@192.168.1.19's password:
sysbak.btar.gz 100% 3320MB 87.6MB/s 00:37
deepin@deepin:/mnt$
在目的系统中恢复备份系统:
deepin@deepin:/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
deepin@deepin:/mnt$
挂载各种虚拟文件系统:
deepin@deepin:/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.
deepin@deepin:/mnt$
进入 chroot 环境修改 /etc/fstab 分区挂载参数,重装引导(参考链接5),更新 grub 菜单:
deepin@deepin:/mnt$ sudo chroot .
root@deepin:/# 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
root@deepin:/# sudo cp /etc/fstab /etc/fstab.orig -v
'/etc/fstab' -> '/etc/fstab.orig'
root@deepin:/# vim /etc/fstab # 或者在 livecd 环境中执行 sudo gedit /mnt/etc/fstab 修改
root@deepin:/# cat /etc/fstab
# /dev/sda2
UUID=66f14f2f-405b-4abb-b33f-76a48406e4f6 / ext4 rw,relatime 0 1# /dev/sda1
UUID=017D-4B18 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2# /dev/sda3
UUID=c0ffaf7c-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
root@deepin:/# grub-install /dev/sda
get rootb uuid error: failed to get "rootb" uuid
正在为 x86_64-efi 平台进行安装。
安装完成。没有报告错误。
root@deepin:/# 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
完成
root@deepin:/#
重启系统:
root@deepin:/# exit
deepin@deepin:/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 TAR:https://help.ubuntu.com/community/BackupYourSystem/TAR
4、使用 bsdtar 完整备份/还原 Linux 系统:https://www.mivm.cn/linux-full-backup-with-bsdtar
5、Grub EFI Reinstall:https://wiki.debian.org/GrubEFIReinstall
相关文章:
用 bsdtar 做 Linux 全系统迁移 - 最省空间、最灵活的Linux系统迁移方式,但需要那么一点点技巧
(首发地址:学习日记 https://www.learndiary.com/2024/03/migrate-linux-with-bsdtar/ ) 我们在做 Linux 全系统迁移的时候,可以直接备份磁盘或分区(如 dd ),也可以备份全部文件(如…...
【模拟string函数的实现】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 模拟string函数的实现 浅拷贝 深拷贝 vs和g下string结构的说明 总结 前言 模拟string函数的实现 浅拷贝 深拷贝 总结 前言 世上有两种耀眼的光芒&#…...
智能合约开发基础知识:最小信任机制、智能合约、EVM
苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 专栏的前面几篇详细了介绍了区块链的核心基础知识 有兴趣学习的小伙伴可以看看http://t.csdnimg.cn/fCD5E关于区块…...
程序人生——Java泛型和反射的使用建议
目录 引出泛型和反射建议93:Java的泛型是类型擦除的建议94:不能初始化泛型参数和数组建议95:强制声明泛型的实际类型 建议96:不同的场景使用不同的泛型通配符建议97:警惕泛型是不能协变和逆变的 建议98:建议…...
JavaSE-----认识异常【详解】
目录 一.异常的概念与体系结构: 1.1异常的概念: 1.2一些常见的异常: 1.3异常的体系结构: 1.4异常的分类: 二.异常的处理机制: 2.1 抛出异常: 2.2异常的捕获: 2.3try-catch-&…...
【机器学习300问】34、决策树对于数值型特征如果确定阈值?
还是用之前的猫狗二分类任务举例(这个例子出现在【机器学习300问】第33问中),我们新增一个数值型特征(体重),下表是数据集的详情。如果想了解更多决策树的知识可以看看我之前的两篇文章: 【机器…...
计算机二级(Python)真题讲解每日一题:《绘制雪花》
在横线处填写代码,完成如下功能…...
Rust 的 Arc<Mutex<T>> 的用法示例源代码
在 Rust 中,Arc<Mutex<T>> 是一种组合类型,它结合了 Arc(原子引用计数)和 Mutex(互斥锁)。Arc 用于在多个所有者之间共享数据,而 Mutex 用于确保在任意时刻只有一个线程可以访问被保…...
【NR 定位】3GPP NR Positioning 5G定位标准解读(十六)-UL-AoA 定位
前言 3GPP NR Positioning 5G定位标准:3GPP TS 38.305 V18 3GPP 标准网址:Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读(一)-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读(…...
如何理解闭包
闭包是编程语言中一个重要的概念,特别是在函数式编程中常常会遇到。以下是对闭包的理解: 1. 定义: 闭包是一种函数,它引用了在其定义范围之外的自由变量(非全局变量),并且这些引用的变量在函数被调用时仍然保持活跃状态。2. 构成: 闭包通常由两部分组成:内部函数(函…...
python知识点总结(一)
这里写目录标题 一、什么是WSGI,uwsgi,uWSGI1、WSGI2、uWSGI3、uwsgi 二、python中为什么没有函数重载?三、Python中如何跨模块共享全局变量?四、内存泄露是什么?如何避免?五、谈谈lambda函数作用?六、写一个函数实现字符串反转,尽可能写出你知道的所…...
【Poi-tl Documentation】区块对标签显示隐藏改造
前置说明: <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板: 删除行表格测试.docx 改造前测试效果 package run.siyuan…...
第十四届蓝桥杯 三国游戏
一开始的思路就是想着暴力,但是呢,如果真的用暴力一个一个列的话,连30%的数据都搞定不了,所以这里需要考虑别的办法。 这道题的思路就是贪心。 我们这样想:既然要满足至少一个国X>YZ,那么我们何不变成…...
数据结构——通讯录项目
1.通讯录的介绍 顺序表是通讯录的底层结构。 通讯录是将顺序表的类型替换成结构体类型来储存用户数据,通过运用顺序表结构来实现的。 用户数据结构: typedef struct PersonInfo {char name[12];char sex[10];int age;char tel[11];char addr[100]; }…...
学点Java打小工_Day4_数组_冒泡排序
1 数组基本概念 程序算法数据结构 算法:解决程序的流程步骤 数据结构:将数据按照某种特定的结构来存储 设计良好的数据结构会导致良好的算法。 ArrayList、LinkedList 数组是最简单的数据结构。 数组:存放同一种类型数据的集合,在…...
内存分配方式?
内存分配方式主要有三种: 静态存储区分配:这种方式在程序编译的时候就已经分配好内存,并且这块内存在程序的整个运行期间都存在。全局变量和静态变量通常就是在静态存储区分配的。这种分配方式效率高,因为内存在程序开始执行前就已…...
2024/3/17周报
文章目录 摘要Abstract文献阅读题目引言模型架构编码器和解码器堆栈AttentionPosition-wise Feed-Forward NetworksEmbeddings and SoftmaxPositional Encoding 实验数据实验结果 深度学习TransformerEncoderDecoder 总结 摘要 本周阅读了Transformer的开山之作《Attention Is…...
函数连续性和Lipschitz连续性
摘要: 直观上,Lipschitz连续性的含义是函数图像的变化速度有一个全局的上限,即函数的增长速率不会无限增加。这种性质确保了函数在任何地方都不会过于陡峭,有助于分析函数的行为,并且在优化、动力系统理论、机器学习等…...
Qt 鼠标滚轮示例
1.声明 void wheelEvent(QWheelEvent *event) override;2.实现(方便复制、测试起见用静态变量) #include <mutex> void MainWindow::wheelEvent(QWheelEvent *event) {static QLabel *label new QLabel("Zoom Level: 100%", this);st…...
【Unity】进度条和血条的三种做法
前言 在使用Unity开发的时候,进度条和血条是必不可少的,本篇文章将简单介绍一下几种血条的制作方法。 1.使用Slider Slider组件由两部分组成:滑动区域和滑块。滑动区域用于显示滑动条的背景,而滑块则表示当前的数值位置。用户可…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
