Linux系统迁移教程(很详细)
前言
由于项目需要,需要将某个配置好的Linux环境完全迁移到别的PC上,在迁移过程中踏了很多坑,参考网上的其他教程有些部分未详细说明,给本人带来了很大的困扰,因此在此做整理,给需要的人一点帮助。
为了便于后文描述方便,在这里做个约定:
- 本机系统: 指环境配置完成,将要迁移的系统
- 目标系统(pc): 指目标PC平台,将要被迁移的系统
背景知识
Linux磁盘管理
- 进入本机系统,使用
lsblk
,可以查看当前系统磁盘分区拓扑:
图中SDA是本机系统磁盘名字,这个SDA磁盘被分成了三个分区,SDA1、SDA2、SDA3。SDA1分区未被挂载,SDA2被挂载到efi分区(系统启动时的引导程序),SDA3挂载到根目录和firefox的某个目录。(如果安装Ubuntu系统时,没有修改过安装指导中的磁盘分区,那么磁盘状态应该和笔者展示的差不多) - 可以使用Ubuntu自带的
Disk
工具查看系统分区详细信息:
显示的磁盘状态如下:
和我们使用lsblk
命令查看到的分区拓扑一致。(这个工具很强大哦,可以用来做磁盘分区的,后面我们配置目标PC磁盘空间的时候会使用) - 也可以使用
sudo fdisk -l
命令查看磁盘分区详细信息:
里面会打印一堆信息,我们只需要关注这部分即可:
可以看到type列中描述了磁盘下各个分区的作用,SDA1用作BIOS,SDA2用作EFI ,SDA3就是普通的Linux文件系统(我们的根文件系统就是挂载在这个分区)。 - 使用
du -sh
可以查看当前目录占用磁盘空间,可以根据这个信息选择U盘大小
Ubuntu系统相关
Ubuntu启动流程大致如下:
在Linux系统迁移中我们只需关注前三步即可。
U盘文件系统
U盘格式化时,请选择使用exFAT格式,而不是使用FAT32,因为FAT32不支持拷贝大于4GB的文件。如果我们的根目录文件大于4GB,在进行文件拷贝的时候会失败。
系统迁移
本地主机:
备份本地主机文件到U盘:
-
使用
lsblk
命令查看当前U盘挂载分区
通过判断容量可以判断当前的U盘为sdb,而且已经挂载到/media/david/Ubuntuback
路径下了。
如果你使用的是一个全新的格式化U盘,需要手动挂载U盘:(如果已挂载可跳过下述步骤)
-
创建临时挂载目录
sudo mkdir /mnt/sdb1
-
挂载U盘
sudo mount /dev/sda1 /mnt/sdb1
-
查看挂载状态
lsblk
-
注意此时你挂载的目录(/mnt/sdb1)就是接下来tar中的目标目录
-
-
拷贝文件
tar -cvpf /media/david/Ubuntuback/backup.tar --exclude=mnt --exclude=media --exclude=tmp --exclude=proc --exclude=sys /
(由于我U盘已经自动挂载了,就使用了默认挂载目录,如果是手动挂载的,需要使用你手动创建的目录)- -tar: 压缩命令名
- -c create.新建一个压缩文件
- -v verbose 输出详细信息
- -p preserve-permissions 连同文件的权限属性一起打包进去
- -f file 指定tar文件的名称
- –exclude 以模式匹配排除文件
注意: tar不能自我递归打包
- /proc: 进程虚拟文件系统,随内存纯在
- /sys: 硬件设备的驱动程序信息
- /tmp: 公用的临时文件存储点
- /media: media是『媒体』的英文,顾名思义,这个/media底下放置的就是可移除的装置。 包括软盘、光盘、DVD等等装置都暂时挂载于此
- /mnt: 如果你想要暂时挂载某些额外的装置,一般建议你可以放置到这个目录中
- / 根目录,系统所有的文件都在其中
(请务必将U盘格式化为exFAT格式,不然拷贝根目录文件时会报错)
- -tar: 压缩命令名
目标主机:
制作Ubuntu最小系统
-
使用U盘制作Ubuntu最小系统
- 下载Ubuntu系统镜像
- 建议使用的镜像和迁移主机的镜像版本相同
- 这里我的本地主机是22.04.03,我选用了22.04.04作为最小系统
- 下载镜像烧录工具
- 我使用的是
rufus
,大家可以随意选择喜欢的
- 我使用的是
- 格式化U盘
- 烧录镜像到U盘中
网上教程很多大家随意找个参考即可
- 下载Ubuntu系统镜像
-
进入目标主机BIOS,配置其启动方式为U盘启动
-
此时你应该有两块U盘:
- 一块U盘为Ubuntu最小启动系统(live cd)
- 一块为本地主机根目录的备份
-
重启目标主机,进入Ubuntu安装界面后选择Try Ubuntu
不要选择"Install Ubuntu"!!! 不要选择"Install Ubuntu"!!! 不要选择"Install Ubuntu"!!!
- 使用
lsblk
查看目标系统当前挂载状态
sda1
为Ubuntu最小系统,sb1
为本地主机根目录备份,nvme0n1p1~3
为目标主机的磁盘划分
- 使用
格式化目标主机磁盘空间
-
格式化目标主机磁盘空间
sudo apt install gparted
sudo gparted
启动图型配置界面格式化目标主机磁盘
请务必确认格式化磁盘为目标主机磁盘!!!!(点击左上角的那个禁止符号,可以看到原本的磁盘空间已经被我们格式化了)
按此操作格式化全部磁盘空间。
-
重新分配目标主机磁盘空间,按照如下空间分配,重新划分磁盘空间
分区 容量 类型 说明 nvme0n1p1 2G EFI boot分区 nvme0n1p2 256G EXT4 root分区 nvme0n1p3 64G SWAP swap分区 用于进行虚拟内存的映射,一般推荐大小为内存的两倍
root分区和boot分区一定是要有的,空间大小和其他的分区大家根据自己需求划分,可以看到我只使用到了一部分磁盘空间。
图中n1p1
的文件类型不是EFI,我们可以进入disk
工具修改它的文件系统类型:
最后,我们使用sudo fdisk -l
命令查看目标系统划分的磁盘空间文件系统是否正确:
使用lsblk
查看当前文件大小如下:
解压备份文件到目标主机
-
开始解压本地主机的根文件备份到目标主机的根文件分区,如上图:
sudo mkdir /mnt/target
sudo mount /dev/nvme0n1p2 /mnt/target
- 查看挂载状态如下:
- 使用
sudo tar -xvpf /media/ubuntu/Ubuntuback -C /mnt/target/ --numeric-owner
指令,解压本地主机文件备份(需要等一段时间)
-
因为我们将备份文件解压到目标主机的
/mnt/target
目录下,因此我们需要在目标主机上添加在压缩文件时删除的文件夹:cd /mnt/target
sudo mkdir proc sys media mnt tmp
- ps:在目标主机哪里解压的,就去哪里创建!对于我来说,我解压到目标主机/mnt/target下,因此我就去这个路径下创建,大家自行替换解压目录
修正文件系统表
- 在成功解压本地主机根文件备份到目标主机根目录后,我们修改文件系统表(/etc/fstab file systeam table),因为我们拷贝过来的文件系统表中的磁盘UUID为本地主机的,需要修正为目标主机的磁盘UUID:
左边的为fstable
文件内容展示,可以看到其中的/
挂载的UUID不符合目标主机上的任一磁盘UUID(blkid
可以查看).- 切换目标系统根分区为根目录,并根据
blkid
指令的显示信息修正/etc/fstab
文件 sudo blkid
查看当前UUIDsudo chroot /mnt/target/
,vim /etc/fstab
修改后的文件内容应该如下,nvme0n1p2 -> /
,nvme0n1p1 -> /boot/etf
,nvme0n1p3 -> swp
- 注意一定要切根目录(
chroot
)后再进行修改!!
- 切换目标系统根分区为根目录,并根据
重建EFI引导分区
-
做到这里已经成功了一大半了,接下来,卸载所有磁盘挂载:
*sudo umount /mnt/target
*删除创建的临时挂载目录sudo rm -r /mnt/target
,因为我mkdir的时候创建的目录为/mnt/target,因此我在此删除它 -
将目标系统的根分区挂载到**/mnt**,将目标主机的boot分区挂载到**/mnt/boot/efi**,再执行
for i in /dev /dev/pts /proc /sys /run;do sudo mount -B $i /mnt$i;done
对应我的系统指令如下:sudo mount /dev/nvme0n1p2 /mnt sudo mount /dev/nvme0n1p1 /mnt/boot/efi/ for i in /dev /dev/pts /proc /sys /run;do sudo mount -B $i /mnt$i; done
截图如下:
-
切换根目录为
/mnt
目录,执行如下命令:sudo chroot /mnt/
grub-install /dev/nvme0n1
- 注意此处的nvme0n1为目标主机的磁盘名称
update-grub
-
键入
reboot
按提示重启设备,大功告成~
迁移总结:
结合本人踩过的坑,对系统迁移理解总结如下:
- 系统是运行在磁盘上。
- 安装系统即是对磁盘进行分区配置
所以无论是迁移系统到新硬盘上,还是迁移到远端PC上,本质上都是对磁盘内容的处理。唯一的差异在于磁盘所处的位置(本地主机迁移系统到新磁盘,可以使用DD命令,而远端迁移,需要使用第三方介质转移宿主机器的文件内容)。
在本教程中,我只备份了主机的根文件分区,查阅其他Linux本地机磁盘迁移时,发现还可以把boot分区一起备份走,在U盘系统中使用boot-repair
修复ELF分区。由于时间关系(懒),没有进行尝试,这里给大家介绍一下,如果按照此方法不能成功迁移,可以尝试一下其他方法。
最后,在系统迁移中,难免会遇到各种坑,大家要善与分析问题,定义问题,再运用搜索引擎解决问题,对于系统迁移来说,步骤还是较为简单的(参考背景知识中,Ubunt系统相关)。
参考链接
- https://firmum.top/2023/05/04/%E7%B3%BB%E7%BB%9F%E8%BF%81%E7%A7%BB/#%E9%80%82%E7%94%A8%E8%8C%83%E5%9B%B4
- https://blog.csdn.net/weixin_54026671/article/details/118106335