Linux 系统盘迁移

前言

之前一直在用老旧的联想笔记本来安装 ArchLinux 和 Windows,但是最近要研究源码了,需要一个 IDE 来跟踪代码。因为开源代码存在着大量的 bash 脚本,不方便用 Windows 调试,所以需要 Linux 中安装 IDEA 来调试。目前台式电脑装虚拟机麻烦还会废性能。WSL2 性能又差。Win 笔记本不合适拿来开虚拟机和 WSL。最终只能是老旧的电脑,开着 ArchLinux 安装 IDEA 来调试代码。但目前 Liunx 是装在 USB 的外置移动硬盘。读写性能非常差,根本跑不起来 IDEA。所以想格式化掉硬盘中的 Windows,把 ArchLinux 迁移到电脑硬盘。(因为不想重新装环境和系统)

计划

大概搜了下方案,有两种:

  1. 借助工具,打包系统,然后还原(大多数是给 win 用的,看起来就不靠谱)
  2. tar 命令打包系统文件,再解压到系统盘。(压缩过程慢,还可能打包不好)
  3. 进入 Live CD 环境,挂载磁盘,然后 dd 直接拷贝分区信息。(自己想的,但有挂载 UUID问题,后面会提到)

根据原理,想了下,还是方法3靠谱。就算是搞崩了,不会影响移动硬盘的 ArchLinux 。搞不好大不了再格式化一次硬盘重来。接下来就开始。

步骤1:备份和分区

  1. 启动 Windows 把资料备份一下。然后关机。
  2. 插入 U 盘,插入移动硬盘,F12 进入 ArchLinux Live CD 环境。此时,sda 是电脑硬盘,sdb 是移动硬盘(ArchLinux),sdc 是 U 盘(ArchLinux Live CD)
  3. 直接格式化 sda 。在其中分区。
1
2
3
4
5
6
7
8
fdisk -l
fdisk /dev/sda
g
n
# 1 +512M /boot /dev/sda1
# 3 +4G SWAP /dev/sda3
# 2 other / /dev/sda2
w

分区完成后,就可以开始复制数据了。

步骤2:复制系统

最简单就是无脑 dd。我自用没用到其他分区,所以只需要复制 / 和 /boot。swap 分区就直接分区就好。

分区 /boot 和 SWAP

1
2
3
4
5
dd if=/dev/sdb1 of=/dev/sda1
# swap
mkswap /dev/sda3
# 一般迁移完系统再开也不迟
swapon /dev/sda3

/boot 因为只有 512MB 所以很快。

分区 /

这里可以无脑 dd 和上面 /boot 分区一样。但问题是它是拷贝整个移动硬盘。(512 GB),而我的整个系统文件目录就加起来才 68 GB。整个拷贝下来不划算。我能不能只复制这 68 个 GB 呢?

于是这里我想了个办法,既然目前是在 Live CD 环境,我先格式化了它,然后同时挂载了两个盘,然后用 cp 把整个系统文件拷贝过去。

注意:两个分区的文件系统格式要一样。否则,迁移完成后,boot引导最终找到硬盘,尝试挂载会报错(unknown filesystem type ‘xfs’)、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# dd (copy 6+ hours)
dd if=/dev/sdb2 of=/dev/sda2
# 如果 dd 的话,后面还可能要 resize 刷新下磁盘容量,不然还是和原本大小一样

# copy files (unknown filesystem type 'xfs')
mkfs.xfs /dev/sda2

# correct
mkfs.ext4 /dev/sda2
mkdir /mnt
mkdir /mnt1
mount /dev/sda2 /mnt
mount /dev/sdb2 /mnt1
# cp 过程 1 小时
# -a 复制文件和软链接,保持文件 uid gid 时间戳等信息
# -v 打印复制信息
cp -av /mnt1/* /mnt

修复 grub 引导和 fstab 挂载

复制好的系统文件,还不能直接重启打开。电脑启动后,先运行 bios,选择加载盘后,先进入 /boot 分区。由于是直接 dd 过来的,所以会根据 UUID 引导加载移动硬盘的系统。所以需要修改 UUID 让他找到硬盘中的 / 分区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 查看 uuid
blkid /dev/sda2
# 先挂载,再进去修改配置
mkdir /mybios
mount /dev/sda1 /mybios
cp /mybios/grub/grub.cnf /mybios/grub/grub.cnf1
sed -i "s/old_uuid/new_uuid/g" /mybios/grub/grub.cnf

# fstab
blkid /dev/sda1 >> /mnt/etc/fstab
blkid /dev/sda2 >> /mnt/etc/fstab
blkid /dev/sda3 >> /mnt/etc/fstab

# 手动编辑下,把 uuid 改进去
vim /mnt/etc/fstab

# 检查下有没有问题
lsblk
# 不要参数 -h 对比字节数能不能对上
du -s /mnt
du -s /mnt1

# 退出挂载
umount /mybios
umount /mnt
umount /mnt1

# 重启
reboot

重启

这里要在关机完成后,拔出 U 盘和移动硬盘。理论上能开机和正常使用了。使用测速软件,发现 U 盘连接的移动硬盘会比电脑硬盘慢 3倍。

但是桌面环境流畅了,虽然打开 IDEA 还是卡,但是至少能 index 完成。能够看代码了。至于能不能跑代码,那另说了。说不定要买固态 SATA 硬盘来才行。

后面

检查挂载情况,可以开启 swap 了,格式化掉移动硬盘的系统了,删掉备份配置

1
2
3
4
5
6
7
8
9
10
11
12
# check
lsblk
cat /etc/fstab
sudo blkid /dev/sda1
sudo blkid /dev/sda2
sudo blkid /dev/sda3
swapon /dev/sda3
swapon -a
free -h

rm -f /boot/grub/grub.cnf
fdisk /dev/sdb
文章作者: Shengyaqingfeng
文章链接: https://creazyboyone.github.io/linuxbackup/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Shengyaqingfeng's Blog!