前言
之前一直在用老旧的联想笔记本来安装 ArchLinux
和 Windows
,但是最近要研究源码了,需要一个 IDE 来跟踪代码。因为开源代码存在着大量的 bash 脚本,不方便用 Windows
调试,所以需要 Linux
中安装 IDEA
来调试。目前台式电脑装虚拟机麻烦还会废性能。WSL2 性能又差。Win 笔记本不合适拿来开虚拟机和 WSL。最终只能是老旧的电脑,开着 ArchLinux
安装 IDEA
来调试代码。但目前 Liunx 是装在 USB 的外置移动硬盘。读写性能非常差,根本跑不起来 IDEA
。所以想格式化掉硬盘中的 Windows
,把 ArchLinux
迁移到电脑硬盘。(因为不想重新装环境和系统)
计划
大概搜了下方案,有两种:
- 借助工具,打包系统,然后还原(大多数是给 win 用的,看起来就不靠谱)
- tar 命令打包系统文件,再解压到系统盘。(压缩过程慢,还可能打包不好)
- 进入
Live CD
环境,挂载磁盘,然后dd
直接拷贝分区信息。(自己想的,但有挂载 UUID问题,后面会提到)
根据原理,想了下,还是方法3靠谱。就算是搞崩了,不会影响移动硬盘的 ArchLinux
。搞不好大不了再格式化一次硬盘重来。接下来就开始。
步骤1:备份和分区
- 启动
Windows
把资料备份一下。然后关机。 - 插入 U 盘,插入移动硬盘,
F12
进入ArchLinux Live CD
环境。此时,sda
是电脑硬盘,sdb
是移动硬盘(ArchLinux
),sdc
是 U 盘(ArchLinux Live CD
) - 直接格式化
sda
。在其中分区。
1 | fdisk -l |
分区完成后,就可以开始复制数据了。
步骤2:复制系统
最简单就是无脑 dd
。我自用没用到其他分区,所以只需要复制 /
和 /boot
。swap 分区就直接分区就好。
分区 /boot
和 SWAP
1 | dd if=/dev/sdb1 of=/dev/sda1 |
/boot
因为只有 512MB 所以很快。
分区 /
这里可以无脑 dd
和上面 /boot
分区一样。但问题是它是拷贝整个移动硬盘。(512 GB),而我的整个系统文件目录就加起来才 68 GB。整个拷贝下来不划算。我能不能只复制这 68 个 GB 呢?
于是这里我想了个办法,既然目前是在 Live CD
环境,我先格式化了它,然后同时挂载了两个盘,然后用 cp
把整个系统文件拷贝过去。
注意:两个分区的文件系统格式要一样。否则,迁移完成后,boot引导最终找到硬盘,尝试挂载会报错(unknown filesystem type ‘xfs’)、
1 | # dd (copy 6+ hours) |
修复 grub
引导和 fstab 挂载
复制好的系统文件,还不能直接重启打开。电脑启动后,先运行 bios
,选择加载盘后,先进入 /boot
分区。由于是直接 dd
过来的,所以会根据 UUID
引导加载移动硬盘的系统。所以需要修改 UUID
让他找到硬盘中的 /
分区。
1 | # 查看 uuid |
重启
这里要在关机完成后,拔出 U 盘和移动硬盘。理论上能开机和正常使用了。使用测速软件,发现 U 盘连接的移动硬盘会比电脑硬盘慢 3倍
。
但是桌面环境流畅了,虽然打开 IDEA
还是卡,但是至少能 index 完成。能够看代码了。至于能不能跑代码,那另说了。说不定要买固态 SATA
硬盘来才行。
后面
检查挂载情况,可以开启 swap
了,格式化掉移动硬盘的系统了,删掉备份配置
1 | # check |