![如何确定从多重启动 USB 驱动程序启动 iso 文件所需的启动参数?](https://linux22.com/image/215977/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E4%BB%8E%E5%A4%9A%E9%87%8D%E5%90%AF%E5%8A%A8%20USB%20%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%20iso%20%E6%96%87%E4%BB%B6%E6%89%80%E9%9C%80%E7%9A%84%E5%90%AF%E5%8A%A8%E5%8F%82%E6%95%B0%EF%BC%9F.png)
这是我在这里发表的第一篇文章,我想问一个一般性问题,即“是否有一个通用程序可以根据 iso 文件的内容和目标 iso 文件已被‘dd-ed’到的另一个 USB 驱动器?”因为我不确定应该如何解释介绍性游览中的信息以及所欣赏的问题类型,因此我提出了我正在努力解决的 3 个具体实际问题之一。
如果过于冗长,那是因为我知道您更喜欢很多细节。如果我做得太过分了,请告诉我,这样的事情不会再发生了。
我正在尝试将 Void Linux iso 添加到我随身携带的多重引导混合 USB 中。
测试正在 Bios 机器(Fujitsu Lifebook)上进行,我收到 dracut 警告,例如
could not boot
/dev/root does not exist
mount: /sysroot: special device /dev/mapper/live-rw does not exist
USB的结构如下:
sdc 8:32 1 57.8G 0 disk
├─sdc1 8:33 1 33M 0 part # bios boot
├─sdc2 8:34 1 512M 0 part # ESP
├─sdc3 8:35 1 8G 0 part /run/media/anon/artix
└─sdc4 8:36 1 49.2G 0 part /run/media/anon/ISOs
其中 sdc3 包含 artix Linux 的最小基本安装,其中包含 Grub。
sdc4中Void的iso文件的路径是:/MocaccinoOS-MATE-0.20220903.iso
我还将其内容扩展到 sdc4 中的一个文件夹:/loop_mounting/Void
我一直在尝试不同的菜单项,方法是改变哪个版本(iso 与扩展)以及我在 linux 命令行中分配给“root”的值 - (“VOID_LIVE”与“ISOs”)和(“root:live = CDLABEL =”)与“root_LABEL=”)。
选择“VOID_LINUX”是由于以下输出:
[esprimo-II wan]# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0 iso966 Jolie VOID_LIVE 2022-10-01-18-20-01-00 0 100% /mnt/iso
我的 grub.cfg grub.cfg 的初始部分(即条目之前的部分):
# Config for GNU GRand Unified Bootloader (GRUB)# /boot/grub/grub.cfg
# januari 12, 2023
# Timeout for menu
set timeout=-1
# Default boot entry
set default=0
# Menu Colours
set menu_color_normal=white/black
set menu_color_highlight=white/green
# persistent block device naming
# define globally (i.e outside any menuentry)
insmod search_fs_uuid
insmod gzio
insmod part_gpg
insmod part_msdos
insmod fat
insmod loopback
insmod iso9660
insmod ext2
insmod all_video
set gfxpayload=keep
set root=(hd0,gpt4)
我在这篇文章的初始测试中使用的条目:
menuentry "void iso" {
set isofile='/void-live-x86_64-20221001-xfce.iso'
loopback loop $isofile
probe --label --set=cd_label (loop)
bootoptions="iso-scan/filename=$isofile findiso=$isofile root=live:CDLABEL=$cd_label init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8"
# bootoptions="iso-scan/filename=$isofile findiso=$isofile root=live:CDLABEL=VOID_LIVE init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8"
# bootoptions="iso-scan/filename=$isofile findiso=$isofile root=live:CDLABEL=ISOs init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8"
# bootoptions="iso-scan/filename=$isofile findiso=$isofile root=LABEL=ISOs init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8"
# bootoptions="iso-scan/filename=$isofile findiso=$isofile root=LABEL=VOID_LINUX init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8"
linux (loop)/boot/vmlinuz $bootoptions
initrd (loop)/boot/initrd
}
menuentry "void expanded" {
bootoptions="root=live:CDLABEL=ISOs init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8
# bootoptions="root=LABEL=ISOs init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8"
# bootoptions="root=live:CDLABEL=VOID_LINUX init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8"
# bootoptions="root=LABEL=VOID_LINUX init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8"
linux /loop_mounting/Void/boot/vmlinuz $bootoptions
initrd /loop_mounting/Void//boot/initrd
}
a) 'root=live:CDLABEL=$cd_label' 以 dracut 警告结束:
- “无法启动”
- “/dev/disk/by-label/VOID_LIVE 不存在”
- “/dev/root 不存在”更多信息请参见 rdsosreport_1_0117(附件)
b) 'root=live:CDLABEL=VOID_LIVE' - 我没有运行这个,因为在上面的试验中,据报告 'cdlabel\ 的值为“VOID_LIVE”
c) 'root=live:CDLABEL=ISOs' - dracut 警告:在“mount: /sysroot: 特殊设备 /dev/mapper/live-rw 不存在”之后“无法安装根文件系统”,更多信息见 rdsosreport_3_0117(附加.)
d) 'root=LABEL=VOID_LIVE' - dracut 警告:
- “无法启动”
- “/dev/disk/by-label/VOID_LIVE 不存在”更多信息见 rdsosreport_4_0117(附件)
e) 'root=LABEL=ISOs' - - 与上面 rdsosreport_5_0117 中的 Ic 相同的结果(附件)
II) 从“void Expanded”启动时:
a) 'root=live:CDLABEL=VOID_LIVE' - 与 rdsosreport_6_0117 中的 Ia 更多结果相同(附件)
b) 'root=live:CDLABEL=ISOs' 与 rdsosreport_7_0117 中的 Ic more 结果相同(附件)
c) 'root=LABEL=VOID_LIVE' - -dracut 警告:
- “无法启动”
- “/dev/disk/by-label/VOID_LIVE 不存在”更多信息见 rdsosreport_8_0117(附件)
d) 'root=LABEL=ISOs' - dracut 警告:'无法挂载根文件系统' 更多信息请参见 rdsosreport_9_0117(附件)`
另一个 USB 驱动器,带有 dd-ed 的 iso 文件,可以很好地启动,并且目标多 USB 驱动器上的 iso 具有正确的校验和。
循环挂载时 iso 文件的结构为:
├── boot
│ ├── grub
│ │ ├── efiboot.img
│ │ ├── fonts
│ │ │ └── unicode.pf2
│ │ ├── grub.cfg
│ │ └── grub_void.cfg
│ ├── initrd
│ ├── isolinux
│ │ ├── boot.cat
│ │ ├── chain.c32
│ │ ├── isolinux.bin
│ │ ├── isolinux.cfg
│ │ ├── ldlinux.c32
│ │ ├── libcom32.c32
│ │ ├── libutil.c32
│ │ ├── splash.png
│ │ └── vesamenu.c32
│ └── vmlinuz
└── LiveOS
└── squashfs.img
下面是 lsblk 列出循环挂载的 iso 文件的方式:
NAME LABEL MOUNTPOINT
loop0 VOID_LIVE /mnt/iso
这些是循环安装的 iso 中的三个引导条目(我将其复制到目标 USB 中):
1 - /boot/isolinux/isolinux.cfg:
LABEL linux
MENU LABEL Void Linux 5.19.10_1 x86_64
KERNEL /boot/vmlinuz
APPEND initrd=/boot/initrd
root=live:CDLABEL=VOID_LIVE init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8 rd.live.overlay.overlayfs=1
LABEL linuxram
2 - /boot/grub/grub_void.cfg
set pager="1"
set locale_dir="(${voidlive})/boot/grub/locale"
if [ -e "${prefix}/${grub_cpu}-${grub_platform}/all_video.mod" ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
fi
insmod font
if loadfont "(${voidlive})/boot/grub/fonts/unicode.pf2" ; then
insmod gfxterm
set gfxmode="auto"
terminal_input console
terminal_output gfxterm
insmod png
background_image "(${voidlive})/boot/isolinux/splash.png"
fi
if [ cpuid -l ]; then
menuentry "Void Linux 5.19.10_1 (x86_64)" {
set gfxpayload="keep"
linux (${voidlive})/boot/vmlinuz \
root=live:CDLABEL=VOID_LIVE ro init=/sbin/init \
rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 gpt add_efi_memmap \
vconsole.unicode=1 vconsole.keymap=us \
locale.LANG=en_US.UTF-8 rd.live.overlay.overlayfs=1
initrd (${voidlive})/boot/initrd
}
menuentry "Void Linux 5.19.10_1 (x86_64) (RAM)" {
set gfxpayload="keep"
linux (${voidlive})/boot/vmlinuz \
root=live:CDLABEL=VOID_LIVE ro init=/sbin/init \
rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 gpt add_efi_memmap \
vconsole.unicode=1 vconsole.keymap=us \
locale.LANG=en_US.UTF-8 rd.live.overlay.overlayfs=1 rd.live.ram
initrd (${voidlive})/boot/initrd
}
fi
3-/boot/grub/grub.cfg
insmod usbms
insmod usb_keyboard
insmod part_gpt
insmod part_msdos
insmod fat
insmod iso9660
insmod udf
insmod ext2
insmod reiserfs
insmod ntfs
insmod hfsplus
insmod linux
insmod chain
search --file --no-floppy --set=voidlive "/boot/grub/grub_void.cfg"
source "(${voidlive})/boot/grub/grub_void.cfg"
这是 lsblk 列出 dd-ed ('VOID-LIVE') USB 的方式:
NAME LABEL MOUNTPOINT
sdc VOID_LIVE
├─sdc1 VOID_LIVE /run/media/arthur/VOID_LIVE
└─sdc2 grub_uefi
我能够识别出原始 iso 文件的循环安装版本和 LIVE(即 dd-ed 版本)版本的树结构之间的唯一区别是在树结构中存在 grub-uefi 分区。 LIVE USB 及其各自的路径如文件管理器框中所示。
我的直觉是路径的差异一定与标签有关,这是我用来指向我的 isos 的标签。
这是当我按“e”时 LIVE USB 的 GRUB 菜单显示的菜单项的内容:
set gfxpayload="keep"
linux (${voidlive})/boot/vmlinuz root=live:CDLABEL=VOID_LABEL ro init=/sbin/init rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 gpt add_efi_memmap vconsole.unicode=1 locale.LANG=en_us.UTF-8 rd.live.overlay.overlayfs=1
initrd (${voidlive})/boot/initrd
我想知道变量“voidlive”(我怀疑它包含解决方案)如何获取其值。除了怀疑它可能在文件“/boot/grub/grub.cfg”和“/boot/grub/grub_void.cfg”之间协商之外,我什么都不知道。
自从我开始写这篇文章以来,我做了更多的尝试,如果需要的话我可以在这里报告。
今天使用的条目是:
menuentry "Void ISO-Live"{
set root='hd0,gpt4'
set gfxpayload="keep"
linux /loop_mounting/Void/boot/vmlinuz root=live:CDLABEL=ISOs ro init=/sbin/init \
rd.luks=0 rd.md=0 rd.dm=0 rd.debug=1 loglevel=4 gpt add_efi_memmap vconsole.unicode=1 \
locale.LANG=en_us.UTF-8 rd.live.overlay.overlayfs=1
sleep 3
initrd /loop_mounting/Void/boot/initrd
}
它生成了“rdsosreport_12_230120.txt”,就像上面提到的那样,它太大了,我不敢将它们包含在帖子中。我想我必须找个地方把它们放在网上,因为我没有看到任何附件链接。
在这里我将简要引用一些我认为最有趣的部分:
1)
//lib/dracut/hooks/mount/99-mount-root.sh@130(mount_root): '[' -f /sysroot/forcefsck ']'
//lib/dracut/hooks/mount/99-mount-root.sh@131(mount_root): '[' -f /sysroot/.autofsck ']'
/init@249(): ismounted /sysroot
/lib/dracut-lib.sh@568(ismounted): findmnt /sysroot
/init@250(): usable_root /sysroot
/lib/dracut-lib.sh@742(usable_root): local _i
/lib/dracut-lib.sh@744(usable_root): '[' -d
/sysroot ']'
/lib/dracut-lib.sh@746(usable_root): for _i in "$1"/usr/lib*/ld-*.so "$1"/lib*/ld-*.so
/lib/dracut-lib.sh@747(usable_root): '[' -e '/sysroot/usr/lib*/ld-*.so' ']'
/lib/dracut-lib.sh@746(usable_root): for _i in "$1"/usr/lib*/ld-*.so "$1"/lib*/ld-*.so
/lib/dracut-lib.sh@747(usable_root): '[' -e '/sysroot/lib*/ld-*.so' ']'
/lib/dracut-lib.sh@750(usable_root): for _i in proc sys dev
/lib/dracut-lib.sh@751(usable_root): '[' -e /sysroot/proc ']'
/lib/dracut-lib.sh@751(usable_root): return 1
/init@251(): warn '/sysroot has no proper rootfs layout, ignoring and removing offending mount hook'
/lib/dracut-lib.sh@66(warn): check_quiet
/lib/dracut-lib.sh@488(check_quiet): '[' -z yes ']'
/lib/dracut-lib.sh@67(warn): echo '<28>dracut Warning: /sysroot has no proper rootfs layout, ignoring and removing offending mount hook'
/lib/dracut-lib.sh@68(warn): echo 'dracut Warning: /sysroot has no proper rootfs layout, ignoring and removing offending mount hook'
dracut Warning /sysroot has no proper rootfs layout, ignoring and removing offending mount hook
/init@252(): umount /sysroot
/init@253(): rm -f -- /lib/dracut/hooks/mount/99-mount-root.sh
/init@257(): _i_mount=20
/init@258(): '[' 20 -gt 20 ']'
/init@242(): :
/init@243(): ismounted /sysroot
/lib/dracut-lib.sh@568(ismounted): findmnt /sysroot
/init@247(): for f in $hookdir/mount/*.sh
/init@248(): '[' -f '/lib/dracut/hooks/mount/*.sh' ']'
/init@249(): ismounted /sysroot
/lib/dracut-lib.sh@568(ismounted): findmnt /sysroot
/init@257(): _i_mount=21
/init@258(): '[' 21 -gt 20 ']'
/init@259(): flock -s 9
/init@259(): emergency_shell 'Can'''t mount root filesystem'
/lib/dracut-lib.sh@1094(emergency_shell): local _ctty
/lib/dracut-lib.sh@1095(emergency_shell): set +e
/lib/dracut-lib.sh@1096(emergency_shell): local _rdshell_name=dracut action=Boot hook=emergency
/lib/dracut-lib.sh@1097(emergency_shell): local _emergency_action
/lib/dracut-lib.sh@1099(emergency_shell): '[' 'Can'''t mount root filesystem' = -n ']'
/lib/dracut-lib.sh@1102(emergency_shell): '[' 'Can'''t mount root filesystem' = --shutdown ']'
/lib/dracut-lib.sh@1112(emergency_shell): echo
/lib/dracut-lib.sh@1112(emergency_shell): echo
/lib/dracut-lib.sh@1113(emergency_shell): warn 'Can'''t mount root filesystem'
/lib/dracut-lib.sh@66(warn): check_quiet
/lib/dracut-lib.sh@488(check_quiet): '[' -z yes ']'
/lib/dracut-lib.sh@67(warn): echo '<28>dracut Warning: Can'''t mount root filesystem'
/lib/dracut-lib.sh@68(warn): echo 'dracut Warning: Can'''t mount root filesystem'
dracut Warning: Can't mount root filesystem
/lib/dracut-lib.sh@1114(emergency_shell): echo
如上所述,当 dd-ed 到另一个 USB 驱动器时,相同的 iso 文件可以正常启动,并且目标 USB 驱动器中的 iso 文件经过验证并具有正确的校验和。