使用GRUB2引导ISO文件,测试自定义linux发行必备技能

使用GRUB2引导ISO文件,测试自定义linux发行必备技能
...

作为使用linux系统五年多的老用户,早已成为linux系统粉丝,不是Windows系统不好用,而是Linux系统提供了更好的用户体验,让用户对系统有了更明确的掌控感,无论是大问题还是小问题,总有清晰明了的错误信息和运行日志记录,方便排查原因解决问题,从这一点上讲,linux系统要比Windows系统更友好。

linux系统给了用户充分定制的可能,用户可以利用成熟的shell脚本对系统进行个性化的裁剪和设定,特别是经过LFS实践的用户会对linux系统有更为深入的了解。定制好的linux系统通常以ISO镜像的方式测试存储,在没有光驱和U盘的情况下,通过GRUB2设置相应的启动菜单,可以完整地测试定制系统的ISO镜像。

...

早期GRUB和LILO是两个最为常见的Linux标配引导程序,称为启动管理器,随着linux系统的发展,目前GRUB2已经成为更好地选择,因为它具有以下优势:

首先,它支持众多文件系统,包括但不限于ext4 、HFS+和NTFS文件系统,这意味着可以将ISO镜像文件存放在这些文件系统中,其次,GRUB2支持从LVM和RAID中直接读取文件,并且GRUB2支持网络,因此可以将ISO镜像文件存在网络上并通过TFTP协议读取。重要的是,GRUB2对传统BIOS和现代的UEFI固件都有着良好的支持,当然,UEFI模式下需要提前关闭secure boot,否则会出现can not find command loopback的报错信息。

GRUB2引导菜单可以具体编辑/etc/grub.d/40_custom文件,典型的GRUB2引导ISO镜像文件的写法如下:

menuentry "ubuntu-20.04.2.0-desktop-amd64.iso" { insmod ext2 set isofile="/home/linuxbabe/Downloads/ubuntu-20.04.2.0-desktop-amd64.iso" loopback loop (hd0,5)$isofile linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash initrd (loop)/casper/initrd }

上面的menuentry是GRUB2的引导菜单条目,名字任意取。

上面的insmod是GRUB2引导过程中会使用到的模块,如果ISO镜像文件存储在ext4文件系统中,则需要insmod ext2;如果ISO镜像文件存储在NTFS文件系统中,则需要insmod ntfs。

上面的set isofile是指定ISO镜像文件存放路径。

上面的loopback是指将ISO镜像文件挂载为虚拟硬盘,这里是第5个分区。

上面的linux是指定linux系统内核路径,参照ISO镜像文件中的路径。

上面的initrd是指装载linux基本系统到内存中,以初始化linux系统。

这里需要注意,在linux系统的命名规则中,传统的IDE接口硬盘一般命名为/dev/hda,将SCSI和SATA接口硬盘一般命名为/dev/sda,而固态硬盘一般命名为/dev/nvme0n1或/dev/nvme1n1等形式,然而,在GRUB2中第一块硬盘始终命名为hd0,无论这块硬盘的接口类型是什么,另外在GRUB2中硬盘分区号是从1开始的,不是从0开始。注意,在MBR分区的硬盘中,第一个逻辑分区是从5开始的,之后的逻辑分区依次类推。

在添加修改完GRUB2的启动菜单条目后,执行下面的命令之一更新引导菜单,具体取决于系统中的安装的GRUB2的情况:

sudo grub-mkconfig -o /boot/grub/grub.cfg sudo grub2-mkconfig -o /boot/grub2/grub.cfg

而在debian、Ubuntu、Linux Mint等linux发行版中,则使用下面命令:

sudo update-grub

重启计算机后就可以看到新的GRUB2引导菜单条目了。

例如Kali Linux的ISO镜像文件可以如下编辑:

menuentry "kali-linux-2021.1-live-amd64.iso" { insmod ext2 set isofile="/home/linuxbabe/Downloads/kali-linux-2021.1-live-amd64.iso" loopback loop (hd0,5)$isofile linux (loop)/live/vmlinuz boot=live findiso=$isofile initrd (loop)/live/initrd.img }