10

如何从 grub2 启动 Fedora32 Live CD iso

 2 years ago
source link: https://ttys3.dev/post/how-to-boot-fedora32-live-cd-iso-from-grub2/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

June 27, 2020

添加 Live CD 启动项,主要用于系统挂了之后,我们还可以通过它来rescue

下载live cd

从清华源下载比较快

curl -LZO https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/32/Workstation/x86_64/iso/Fedora-Workstation-Live-x86_64-32-1.6.iso
curl -LO https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/32/Workstation/x86_64/iso/Fedora-Workstation-32-1.6-x86_64-CHECKSUM

下载成功后, 参考 官方教程校验iso

# 导入 Fedora's GPG key
curl https://getfedora.org/static/fedora.gpg | gpg --import
# 校验CHECKSUM文件是否合法
gpg --verify-files *-CHECKSUM
# 最后校验下载的iso的checksum是否一致
sha256sum -c *-CHECKSUM

然后将文件copy到/boot下。为方便管理,我们在/boot下新建一iso目录, 然后将下载的live cd iso放于此:

sudo mkdir /boot/iso
sudo rsync -avP ./Fedora-Workstation-Live-x86_64-32-1.6.iso /boot/iso/

注意,Fedora 这个 live iso 文件大小大概在 1.8GB, 确保你的 /boot 分区有足够大的空间。

老灯在创建 /boot 分区时就已经考虑到了这一点,给 /boot 分配了至少 4GB 的空间。

增加grub2启动项

grub2-mkconfig 在生成配置文件的时候,默认会读取 /etc/grub.d/40_custom ,这里就是我们添加iso启动项的地方了。

这个文件默认内容如下:

#!/usr/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

千万注意不要删除exec tail -n +3 $0这一行及以上的内容。

tail -n +3 $0 的意思是取本文件第3行(包括)及之后的内容, 第3行其实就是exec这一行之后的那一行了。

老灯的/etc/grub.d/40_custom文件内容如下:

#!/usr/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry "Fedora Workstation 32 Live" {
	# remove tpm mod to avoid out of memory err
	rmmod tpm
	set isofile="/iso/Fedora-Workstation-Live-x86_64-32-1.6.iso"

	echo "Setting up loopback"
	loopback loop "${isofile}"

	isolabel="Fedora-WS-Live-32-1-6"
	# fedora grub2 no probe command
	#probe -l loop --set=isolabel
	echo "ISO Label is ${isolabel}"

	echo "Booting...."
	linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" root=live:CDLABEL=$isolabel rootfstype=auto ro rd.live.image noquiet rd.luks=0 rd.md=0 rd.dm=0
	# disable KMS if getting a blank screen or a "no signal" error from the display, see https://wiki.archlinux.org/index.php/Kernel_mode_setting
	#linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" root=live:CDLABEL=$isolabel rootfstype=auto ro rd.live.image noquiet rd.luks=0 rd.md=0 rd.dm=0 nomodeset i915.modeset=0 nouveau.modeset=0
	#linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" root=live:CDLABEL=$isolabel rootfstype=auto ro rd.live.image noquiet rd.luks=0 rd.md=0 rd.dm=0 nouveau.config=NvBios=PRAMIN video=HDMI-A-4:1920x1080@60
	#linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" root=live:CDLABEL=$isolabel rootfstype=auto ro rd.live.image noquiet rd.luks=0 rd.md=0 rd.dm=0 modprobe.blacklist=nouveau
	initrd (loop)/isolinux/initrd.img
}

注意,这里一定要在加载loop设备之前,把tpm模块移除: rmmod tpm, 不然会遇到out of memory错误,无法加载iso

由于Fedora下的grub2没有probe命令,我们只能手动指定isolabel了。

iso 文件的 label 可以用 iso-info (由libcdio包提供)来读取:

❯ iso-info ~/Downloads/Fedora-Workstation-Live-x86_64-32-1.6.iso
iso-info version 2.0.0 x86_64-redhat-linux-gnu
Copyright (c) 2003-2005, 2007-2008, 2011-2015, 2017 R. Bernstein
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
__________________________________
ISO 9660 image: /home/ttys3/Downloads/Fedora-Workstation-Live-x86_64-32-1.6.iso
Preparer    : XORRISO-1.5.2 2019.10.26.180001, LIBISOBURN-1.5.2, LIBISOFS-1.5.2, LIBBURN-1.5.2
Volume      : Fedora-WS-Live-32-1-6
Joliet Level: 3

然后我们就得到了label: Fedora-WS-Live-32-1-6

一般情况下,内核命令行,我们使用下面这个就可以(上面默认的):

linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" root=live:CDLABEL=$isolabel rootfstype=auto ro rd.live.image noquiet rd.luks=0 rd.md=0 rd.dm=0

但是,实际上老灯正在使用的cmdline是:

linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" root=live:CDLABEL=$isolabel rootfstype=auto ro rd.live.image noquiet rd.luks=0 rd.md=0 rd.dm=0 nomodeset i915.modeset=0 nouveau.modeset=0

老灯为什么多加了三个参数 nomodeset i915.modeset=0 nouveau.modeset=0 ?主要是因为老灯的GeForce GTX 1060显卡 在Fedora加载了默认的nouveau开源驱动后,显示器会直接黑屏然后显示没有信号。

❯ lspci -k | grep -i vga
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Desktop)
03:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 3GB] (rev a1)

为了能使nouveau开源驱动能工作(能点亮显示器,能不崩就行了),老灯不得不关闭KMS (Kernel Mode Setting), 增加 nouveau.modeset=0

由于nouveau开源驱动实际上是要依赖KMS才能正常工作的, 关闭KMS的后果是,整个图像和字体都显示得非常大,并且显示分辨率不可调整了。虽然如此,但是至少我们能进图形界面了。

这应该只是nouveau在GTX 1060下的问题吧。因为在其它NVIDIA硬件上,老灯发现nouveau驱动其实是工作良好的。

这里主要是查看了 ArchLinux 关于 KMS 的文档,问题才得到解决。

如果驱动能在KMS开启(默认开启的)的情况下正常工作,但是分辨率不太对,可以自行手动指定, 比如 video=HDMI-A-4:1920x1080@60。这里的HDMI-A-4是指的接口。 要查看当前哪些接口是处于连接状态的, 可以使用如下脚本:

for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done

老灯这里只接了一个显示器, 运行结果如下:

❯ for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done
DP-1: disconnected
HDMI-A-1: disconnected
HDMI-A-2: disconnected
HDMI-A-3: disconnected
DP-2: disconnected
DVI-D-1: disconnected
HDMI-A-4: connected

如果nouveau驱动怎么折腾都不工作,可以禁用它 modprobe.blacklist=nouveau, 这样至少可以通过按 Ctrl + alt + Fx 进入纯控制台。

另外,Intel的i915驱动兼容性一般很好,很少会有黑屏问题。

参考文档

https://wiki.archlinux.org/index.php/Nouveau

https://wiki.archlinux.org/index.php/Kernel_mode_setting#Disabling_modesetting

https://wiki.archlinux.org/index.php/Kernel_mode_setting#Forcing_modes

https://help.ubuntu.com/community/Grub2/ISOBoot

https://forums.freeside.co.uk/t/how-to-boot-a-fedora-30-iso-from-grub/197

https://fedoramagazine.org/start-a-fedora-29-installation-from-the-grub-menu/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK