Linux 系统盘迁移

前言

之前一直在用老旧的联想笔记本来安装 ArchLinuxWindows,但是最近要研究源码了,需要一个 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