如何确定从多重启动 USB 驱动程序启动 iso 文件所需的启动参数?

如何确定从多重启动 USB 驱动程序启动 iso 文件所需的启动参数?

这是我在这里发表的第一篇文章,我想问一个一般性问题,即“是否有一个通用程序可以根据 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 文件经过验证并具有正确的校验和。

相关内容