用 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想兼职赚钱?盘点6个靠谱兼职,赚钱更轻松!

1,微头条搬砖 微头条搬砖是一个门槛不高的赚钱方式,而且不需要你有多么好的原创能力,去收集一些热门文章的素材进行文章伪原创,十分钟就能搞定,只要你的文章有爆点,足够吸人眼球,就能够获取不低…

throws vs throw

方法内, throw是生成异常,结束当前方法运行,此时要么捕获(自己抛的自己捕获,没有意义),要么上抛,即方法上throws声明,让调用者处理throws是处理异常(抛给别人处理&#x…

给Python初学者的一些技巧

以下是一些Python实用技巧和工具,希望能对大家学习有所帮助。 交换变量 x 6 y 5 x, y y, x print x >>> 5 print y >>> 6 if 语句在行内 print "Hello" if True else "World" >>> Hello 连接 下面的最后一种方…

区块链技术中的共识机制算法:以权益证明(PoS)为例

引言: 在区块链技术的演进过程中,共识机制算法扮演着至关重要的角色。除了广为人知的工作量证明(PoW)外,权益证明(Proof of Stake,PoS)也是近年来备受关注的一种共识算法。 …

C++高级面试题:请解释 C++ 中的函数重载解析(Function Overload Resolution)

请解释 C 中的函数重载解析(Function Overload Resolution) 函数重载解析(Function Overload Resolution)是指编译器在调用重载函数时确定最合适的重载版本的过程。在 C 中,函数重载允许我们定义多个同名函数&#xf…

Spring学习

Maven 的配置文件是一个强约定的XML格式文件&#xff0c;它的文件名一定是pom.xml。 1、POM (Project Object Model) 一个 Java 项目所有的配置都放置在 POM 文件中&#xff0c;大概有如下的行为&#xff1a; 定义项目的类型、名字管理依赖关系定制插件的 1.maven坐标 <…

牛客刷题 | HJ52 计算字符串中的编辑距离, HJ55 挑7,HJ59 找出字符串中第一个只出现一次的字符

HJ52 计算字符串中的编辑距离 题目链接&#xff1a;计算字符串的编辑距离_牛客题霸_牛客网 思路&#xff1a;动态规划&#xff0c;实在是没想到啊。 代码 import sysstr1 sys.stdin.readline().strip() str2 sys.stdin.readline().strip() dp [[0]*(len(str1)1) for _ i…

【面经八股】搜广推方向:面试记录(八)

【面经&八股】搜广推方向:面试记录(八) 文章目录 【面经&八股】搜广推方向:面试记录(八)1. 自我介绍2. 实习经历问答3. 科研-项目经历问答4. 八股4. 编程题5. 反问1. 自我介绍 。。。。。。 2. 实习经历问答 序列推荐如何建模(简单的sumpooling) 在序列推荐任…

基于springboot实现小区物业管理系统项目【项目源码+论文说明】

基于springboot实现小区物业管理系统演示 摘要 随着城镇人口居住的集中化加剧 &#xff0c;传统人工小区管理模式逐渐跟不上时代的潮流。这就要求我们提供一个专门的管理系统。来提高物管的工作效率、为住户提供更好的服务。 物业管理系统运用现代化的计算机管理手段,使物业的…

内网渗透小结

域产生原因 简单来说就是为了安全和方便控制域内主机 一个具有一定规模的企业&#xff0c;每天都可能面临员工入职和离职&#xff0c;因此网络管理部门经常需要对域成员主机进行格式化消除磁盘的文件&#xff0c;然后重装系统及软件&#xff0c;以提供给新员工使用&#xff1…

316算法题整理

1 题目 这天小苯来到了超市购买物品&#xff0c;一共有 几种物品&#xff0c;每种物品只能购买一个&#xff0c;但有的物品支持优惠活动&#xff0c;有的并不支持&#xff0c;恰好本超市的结账是有“支付宝九五折”优惠的&#xff0c;小苯的支付宝余额还剩 人元&#xff0c;他…

顺序表的操作

一、插入操作 顺序表的插入操作需要考虑插入位置、插入元素和数组容量等因素。具体步骤如下&#xff1a; 判断插入位置是否合法&#xff0c;即是否在数组范围内。 如果插入位置合法&#xff0c;判断数组容量是否已满。如果已满&#xff0c;则需要动态扩容&#xff0c;重新分配…

从阿里云降价,看中国云计算创新之变

继“疯狂星期四”历史级大降价后&#xff0c;阿里云“AI驱动、公共云优先”的战略布局再落一子。 近日&#xff0c;阿里云与菜鸟、高德地图、中远海运、东航物流、圆通速递、申通快递、中通快递、德邦快递、G7易流、地上铁、浙江大学智能交通研究所等共同发起成立“物流智能联…

Python接口自动化测试之详解post请求

前言 在HTTP协议中&#xff0c;与get请求把请求参数直接放在url中不同&#xff0c;post请求的请求数据需通过消息主体(request body)中传递。 且协议中并没有规定post请求的请求数据必须使用什么样的编码方式&#xff0c;所以其请求数据可以有不同的编码方式&#xff0c;服务…

linux最佳入门(笔记)

1、内核的主要功能 2、常用命令 3、通配符&#xff1a;这个在一些启动文件中很常见 4、输入/输出重定向 意思就是将结果输出到别的地方&#xff0c;例如&#xff1a;ls标准会输出文件&#xff0c;默认是输出到屏幕&#xff0c;但是用>dir后&#xff0c;是将结果输出到dir文…

Guitar Pro8许可证2024最新免费

作为一位吉他爱好者推荐官&#xff0c;我非常荣幸地向大家介绍一款备受赞誉的吉他工具——Guitar Pro8。这款软件是吉他爱好者们的必备之选&#xff0c;它以其卓越的功能和优势&#xff0c;全面覆盖学习演奏和绘谱创作的需求&#xff0c;帮助吉他爱好者们更好地提升自己的技能。…

JavaWeb一些开发问题

一、Restful package com.example.crudtest1.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class Result {private Integer code;//响应码&#xff0c;1 代表成功; 0 代表失…

【框架】跨端开发框架介绍(Windows/MacOS/Linux/Andriod/iOS/H5/小程序)

1. 跨端框架介绍 跨端框架适用场景说明移动端 uniapp Andriod、iOS、H5、小程序、快应用 uniapp是一个使用Vue开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;选择相应目标进行编译&#xff0c;编译后分别部署到网站、APP、小程序多个平台 笔者&#x…

[小程序开发] 构造页面

一、Component方法 Component方法用于创建自定义组件&#xff0c;小程序页面也可以使用Component方法进行创建&#xff0c;从而实现复杂的页面逻辑开发。 使用Component方法构造页面&#xff0c;可以实现更加复杂的页面逻辑开发。 二、注意事项 1、要求.json文件中必须包含usi…

【编程项目开源】拼图游戏(鸿蒙版)

目标 做个拼图游戏 效果 开发工具 下载DevEco Studio 工程截图 开源地址 https://gitee.com/lblbc/puzzle/tree/master/puzzle_hongmeng_arkUI 关于 厦门大学计算机专业|华为八年高级工程师 专注《零基础学编程系列》 http://lblbc.cn/blog 包含&#xff1a;Java | 安卓…