收了一块新硬盘,本来想的是终于不用两个系统挤到一块硬盘里了,于是便准备迁移LInux到新硬盘里。

1.踩了的坑

本来想的还是挺简单的,直接把EFI和根目录dd过去,修复grub,生成配置,扩容分区,恰电开机!

然后,不出意外是翻车了。一个是有四个系统的引导项,这个一会删掉多余的就好。还有,新引导的是原来的系统。

1.fstab

fstab 文件是 Linux 系统中的一个配置文件,位于 /etc/fstab 路径下,作用是定义文件系统在启动时如何挂载以及管理挂载点。fstab 的全称是“文件系统表”(File System Table),它在系统启动过程中被内核和相关工具读取,用于自动挂载磁盘分区和文件系统。一般情况下,他形似这样:

  GNU nano 8.2                                    /etc/fstab                                             
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>

# /dev/sdax
UUID=xxxx-xxxx       /              ext4            rw,relatime     0 1

# /dev/sdax
UUID=xxxx-xxxx      /boot           vfat            rw,relatime,fmask=0022,dmask=0022,codepage=437,i=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro   0 2

# /dev/sdax
UUID=xxxx-xxxx      none            swap            defaults        0 0

fstab通过UUID识别并挂载硬盘,在移动后需要修改UUID系统才能知道将哪个分区挂载到对应位置。听起来很麻烦?arch提供了genfstab工具来自动生成fstab。重启,开机,正确引导系统,清理掉多余的引导准备收工。

2.UUID

不出意外是又出意外了,GRUB直接找不到系统了。

找不到Linux内核

使用blkid工具查看,发现两个EFI分区的UUID是一样的。Linux通过UUID来识别分区,这个应该已经在fstab中体会到了。两个分区的UUID相同,也就代表着这两个分区系统认为是一样的。dd会复制分区的UUID,而对分区进行操作会破坏UUID。因为我对根分区进行了扩容,所以才只有EFI分区的UUID一样。你也可以使用工具重新生成UUID,但因为刚好我要调整分区大小,所以干脆放弃了dd而手动分区使用cp拷贝整块硬盘。

3.cp

cp是Linux中常用的命令,用于复制文件。而Linux中一切内容都是文件组成的,我们可以直接复制所有文件到新分区来实现迁移。

然后,就又出意外了,sddm提示没有权限读取配置。查看文件所有者,发现都变成了root。

cp直接拷贝时是不会保存文件权限信息的,可以使用-a参数来保存目录和权限信息,或者使用tar归档后迁移,tar也是会保存权限信息的。

2.可以抄作业的步骤

这里以我使用的arch系为例,其他发行版步骤类似,但是可能需要手动写入fstab文件。首先通过arch安装镜像进行引导。

1.对磁盘进行分区

使用cfdisk可以以图形界面进行分区,根据你的需求进行分配就好。

cfdisk分区

2.对新分区和旧分区进行挂载

mount /mnt /dev/sdxx                  #你的新根目录分区
mount --mkdir /mnt/boot /dev/sdxx     #你的EFI分区
swapon /dev/sdxx                      #你的swap分区(如果有)
mount --mkdir /old /dev/sdxx          #你的旧根目录分区

3.将旧文件复制到新目录

cp -a /old/* /mnt

不要手贱尝试使用-v输出详细信息,会拖慢n倍的速度。

4.生成fstab文件

先删除旧的fstab信息,然后取消挂载旧分区,执行genfstab。

nano /mnt/etc/fstab
umount /old
genfstab -U /mnt >> /mnt/etc/fstab

5.安装GRUB

先使用chroot进入旧的系统,然后重新安装Linux,Linux frimware,生成GRUB配置。

arch-chroot /mnt 
pacman -S linux linux-firmware
mkinitcpio -P
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg
exit
reboot

重启,进入系统,收工!