前言
元旦过完回公司发现archlinux 系统无法启动了, 提示没有找到内核之类的错误。 虽然也没有找到根本原因,只知道是内核镜像丢失了, 这里记一下解决办法
现象
启动之后, 提示缺少内核, 需要先指定内核。 回车后进入grub 界面。 在grub 界面可以执行ls (hd,gpt)/ 来查看分区的文件
hd0、 hd1 代表的硬盘编号, gpt1、 gpt2、 gpt3 代表分区, ls (hd0, gpt1)/ 表示查看第一个硬盘第一个分区的文件
1 | ls (hd1, gpt2) |
我的boot分区是第二个硬盘的第二个分区, 可见确实没有 vmlinuz-linux 文件,也很奇怪
解决办法
没有 ‘vmlinuz-linux’ 文件的话需要通过archlinux的U盘启动盘启动, 挂载分区后,arch-chroot 进入到坏系统
执行重装linux
1 | pacman -S linux |
执行grub 相关命令, 重建引导配置。 我的EFI单独分区了
1 | grub-install --target=x86_64-efi --efi-directory=/boot/EFI --bootloader-id=Arch |
exit
退出坏系统,umount 再重启。 一定要umount 分区否则grub不会生效
没有umount 导致的grub不生效
因为没有umount,exit
后直接重启, 发现依旧无法进入系统,还是进入了grub界面,好在linux内核镜像已经存在了,可以通过grub来配置启动
所以这种情况也适用于系统ok,但引导损坏的情况。
解决办法
我的boot分区是(hd1,gpt2)
执行一下
1 | set prefix=(hd1,gpt2)/grub/ # 指定实际的grub目录 |
此时grub会刷新, 继续执行
1 | insmod linux |
由于不知道nvme的命名方式,导致也挺麻烦, grub下可以看到uuid,但不能看到分区名称, 后来发现可以通过uuid方式指定root
1 | insmod linux |
扩充
同样可以通过磁盘+分区的方式指定内核和initrd