使用 Live CD 安装其他发行版

之前安装 Linux 都是将 ISO 镜像烧写至 U 盘里,然后通过 U 盘进行安装。这样安装更换系统或者升级版本之后都要重新制作启动 U 盘,现在 U 盘容量都很大,每次只能供一个系统安装镜像使用空间都浪费了。而且每次换镜像都要清除掉 U 盘上所有内容,也很不方便。最近一直在用 Kali everything 版本的 Live Boot ,工具很全,还能持久化。这次又需要给新硬盘安装系统,想到之前机器本身就是 Ubuntu 的时候,可以直接在 Grub 中添加安装菜单项,就能安装硬盘上的 ISO 文件,完全不需要 U 盘,那通过 Live CD 启动到 Grub 菜单,直接去安装硬盘或者 U 盘上的镜像不就可以一个 U 盘安装多个系统了。经过尝试,发现这种方式完全可行,而且非常灵活。

制作 Live Boot

首先要制作一个 Live Boot,这里用的是 Kali 系统的 Live Boot,Everything 版本包含了各种常用工具,临时使用非常方便。参考官方文档 制作,非常简单,这里使用的 dd 命令,直接将 ISO 镜像写入到 U 盘中。

进入 Grub

制作好启动盘后重启电脑,通过快捷键进入到启动项选择菜单,选择刚刚制作的 U 盘进行启动,会看到 Kali 背景的启动菜单。

在此处可以先按方向键,阻止自动进入默认选项。然后按 c 进入 GRUB Command line。

引导 ISO

不同的发行版命令的区别主要是 linux 命令后跟的启动参数,这些参数要参考不通发行版的安装文档进行修改。前面的命令则都是 Grub 的命令,可以参考 GRUB Manual

如果 ISO 在 NTFS 格式磁盘上,而你的 Grub 本身没有自动加载 NTFS 模块的话,可以提前先执行 insmod ntfs 加载 NTFS 模块。

确认 ISO 位置

首先要找到 ISO 存放的位置,可以先使用 ls 命令来查看所有硬盘和分区。

1
2
3
grub> ls
(memdisk) (hd0) (hd0,msdos2) (hd0,msdos1) (hd1) (hd1,msdos3) (hd1,msdos2) (hd1,msdos1) (hd2) (hd2,gpt3) (hd2,gpt2)
(hd2,gpt1) (hd3) (hd3,gpt4) (hd3,gpt3) (hd3,gpt2) (hd3,gpt1)

如果电脑上的硬盘分区表是 GUID 格式的,则分区会显示 gpt 前缀,U 盘一般是 msdos 前缀,这里我的 ISO 在 U 盘中,所以只需要去寻找 hd0 和 hd1。

1
2
3
grub> ls (hd0,msdos1)/
possible files are:
System Volume Information AUTORUN.INF OperatingSystem/ Software/

通过 ls 命令找到了系统镜像所存放的文件夹 OperatingSystem,所在的硬盘是 hd0,第一个分区。

挂载 ISO

首先设置一个环境变量 isofile,方便后面执行操作,在知道了文件所在分区后可以以 ls 命令开头,然后多用 Tab 键来补全路径,直到 ISO 文件名也被补全之后使用 Ctrl + a 回到开头,将 ls (hd0,msdos1) 改为 set isofile=

1
2
grub> set isofile=/OperatingSystem/manjaro-kde-22.0.4-230222.linux61.iso
grub> loopback loop (hd0,msdos1)$isofile

使用 loopback 命令后,会将 ISO 文件挂载到 (loop),名称 loop 可以自行设定。

从 ISO 启动

Manjaro

参考 Manjaro 社区文章 Boot Manjaro ISO directly with GRUB 中的启动参数,还需要获取 ISO 文件所在磁盘的 ID,并将带磁盘 ID 的路径设置为 img_dev

1
2
3
4
5
6
7
8
9
10
# 查找 ISO 文件所在的分区并设置为 root,--no-floppy 不从磁盘查找,提升速度
grub> search --no-floppy -f --set=root $isofile
# 获取 root 的设备信息,这里将 UUID 赋值给了 abc,可以视具体情况添加 --part-uuid
grub> probe -u $root --set=abc
# 从刚刚挂载的 loop 加载 Linux 内核,copytoram 在 Manjaro 上是复制到内存中,启动后可以移除 ISO 文件所在设备,Ubuntu 内核是 toram
grub> linux (loop)/boot/vmlinuz-x86_64 img_dev=$prq img_loop=$isofile copytoram
# 需要先执行 linux 命令后才能执行,加载内核初始 ramdisk。AMD CPU 使用 amd_ucode.img
grub> initrd (loop)/boot/intel_ucode.img (loop)/boot initramfs-x86_64.img
# 启动加载的系统
grub> boot

执行完 boot 命令后等待系统一系列输出后,最终看到 Manjaro Hello 窗口就成功了,双击左上角的 Install 图标即可执行图形化界面的安装程序。

Ubuntu

Ubuntu 参考官方 Wiki 中的 Grub2/ISOBoot Menuentry Example,不同的 Ubuntu 版本有不同的内核启动参数,根据所下载的系统版本修改即可,这里以 22.04.2 举例。

1
2
3
4
5
6
7
# 同一个 U 盘,ISO 文件不同
grub> set isofile=/OperatingSystem/ubuntu-22.04.2-desktop-amd64.iso
grub> loopback loop (hd0,msdos1)$isofile
# 加载内核,如果内存不够大可以去掉 toram 参数
grub> linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject toram
grub> initrd (loop)/casper/initrd
grub> boot

成功启动后应该能看到 Try Ubuntu 系统界面,双击右下角 Install Ubuntu 启动 GUI 安装界面。

iso-scan/filename 参数应该是 Ubuntu 独有的,如果在启动过程中在 initramfs 中出现报错 Could not find the ISO。需要检查 isofile 设置是否正确,isofile 是否在可以识别的磁盘格式上,磁盘不光需要 Grub 能够识别,引导启动后的 Linux 内核也要能够识别才能正常启动。

Pop! OS

Pop! OS 是基于 Ubuntu 的发行版,通过 Grub 安装的资料网上几乎没有,参考 ISO 镜像下的 /boot/grub/grub.cfg 文件和上面 Ubuntu 的安装命令稍加修改后就可以进入安装界面了。

1
2
3
4
5
6
grub> set isofile=/OperatingSystem/pop-os_22.04_amd64_intel_28.iso
grub> loopback loop (hd0,msdos1)$isofile
# 这里添加了 iso-scan 和 toram
grub> linux (loop)/casper_pop-os_22.04_amd64_intel_debug_454/vmlinuz.efi boot=casper iso-scan/filename=$isofile live-media-path=/casper_pop-os_22.04_amd64_intel_debug_454 hostname=pop-os username=pop-os noprompt toram
grub> initrd /casper_pop-os_22.04_amd64_intel_debug_454/initrd.gz
grub> boot

成功启动后的试用与安装界面。

有了 Grub,所有的发行版除了 Arm 架构的应该都能通过 Live CD 引导,不局限于 Kali Live Boot。通过 Kali Live 的持久化功能,安装对应应用后,应该也可以直接在系统里安装 Windows 镜像中的 install.wim。

分享