收了一块新硬盘,本来想的是终于不用两个系统挤到一块硬盘里了,于是便准备迁移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直接找不到系统了。
使用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
可以以图形界面进行分区,根据你的需求进行分配就好。
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
重启,进入系统,收工!