Makefile可编译内核目标文件及二进制文件,但无法通过grub-mkrescue生成ISO镜像
嘿,我之前折腾自制内核的时候也碰到过grub-mkrescue掉链子的情况,太懂这种前面编译全顺,最后一步卡壳的烦躁了!结合你给出的项目结构和问题,我给你梳理几个最可能的排查方向:
先确认目录结构和文件位置是否正确
GRUB的rescue镜像需要严格的目录结构,你的alinux.bin得放在boot/目录下(或者你用来生成ISO的临时目录的boot/里),而且grub.cfg里的内核路径要对应。比如你的grub.cfg里应该写:menuentry "Alinux" { multiboot /boot/alinux.bin }要是你把
alinux.bin放在了项目根目录没移到boot/,grub-mkrescue打包的时候找不到内核,自然不会生成ISO。检查Makefile里的ISO生成步骤
很多人踩坑是因为没先把文件整理到临时ISO目录就直接跑grub-mkrescue。比如你得先创建一个临时目录(比如iso/),把boot/grub/grub.cfg和alinux.bin都复制到这个临时目录的对应位置,再让grub-mkrescue打包这个临时目录。举个靠谱的Makefile片段参考:ISO_DIR := iso ISO := alinux.iso $(ISO): alinux.bin mkdir -p $(ISO_DIR)/boot/grub cp boot/grub/grub.cfg $(ISO_DIR)/boot/grub/ cp alinux.bin $(ISO_DIR)/boot/ grub-mkrescue -o $(ISO) $(ISO_DIR) rm -rf $(ISO_DIR)要是你的Makefile里跳过了复制文件到临时目录这步,grub-mkrescue没找到它需要的GRUB配置和内核,肯定不会输出ISO。
看看是不是缺依赖或者命令有问题
先手动跑一遍grub-mkrescue -o test.iso boot(假设你的boot目录里有grub.cfg和alinux.bin),看看有没有报错:- 如果提示
grub-mkrescue: command not found,那是你没装GRUB的工具包,Debian/Ubuntu系要装grub-common和xorriso,Fedora是grub2-tools-extra加xorriso; - 如果提示xorriso相关错误,就是缺xorriso这个工具,装了就行;
- 要是没报错但还是没生成ISO,那大概率是目录结构不对,GRUB找不到能引导的文件。
- 如果提示
别忽略Make的错误输出
有时候Makefile里的命令前面加了@,会把命令执行的输出藏起来,你可以去掉@,重新跑make iso,看看grub-mkrescue到底报了什么错,这是最快定位问题的方法!
备注:内容来源于stack exchange,提问作者Alelix

