멀티부팅 USB 드라이버에서 iso 파일을 부팅하는 데 필요한 부팅 매개변수를 어떻게 결정합니까?

멀티부팅 USB 드라이버에서 iso 파일을 부팅하는 데 필요한 부팅 매개변수를 어떻게 결정합니까?

이것은 여기에 내 첫 번째 게시물이며 "iso 파일의 내용을 기반으로 이 작업을 수행할 수 있고 대상 iso 파일이 다른 USB에 'dd-ed'된 일반 프로그램이 있습니까?"라는 일반적인 질문을 하고 싶었습니다. 드라이브?" 입문 투어에 대한 정보와 감사하게 생각하는 질문 유형을 어떻게 해석해야 할지 잘 모르겠기 때문에 제가 고민하고 있는 구체적인 실무 질문 3개 중 하나를 질문했습니다.

너무 길다면, 당신이 많은 세부 사항을 선호한다는 것을 알기 때문입니다. 너무 멀리 갔으면 다시는 그런 일이 일어나지 않도록 말해주세요.

제가 가지고 있는 멀티부팅 하이브리드 USB에 Void Linux iso를 추가하려고 합니다.

테스트가 Bios 시스템(Fujitsu Lifebook)에서 실행되고 있는데 다음과 같은 긴급 경고가 표시됩니다.

  • 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에는 Grub을 포함하는 artix Linux의 최소 기본 설치가 포함되어 있습니다.

sdc4의 Void iso 파일 경로는 /MocaccinoOS-MATE-0.20220903.iso입니다.

또한 그 내용을 sdc4의 폴더로 확장했습니다: /loop_mounting/Void

나는 Linux 명령줄에서 ("VOID_LIVE" 대 "ISOs") 및 ("root:live= CDLABEL=) 버전(iso 대 확장)과 "root"에 할당한 값을 변경하여 다양한 메뉴 항목을 시도해 왔습니다. ") 및 "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

My 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 경고: "마운트: /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' - Ia와 동일하며 rdsosreport_6_0117(첨부)에 더 많은 결과가 있습니다.

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(첨부 파일)을 참조하세요.'

dd-ed iso 파일이 있는 다른 USB 드라이브는 정상적으로 부팅되고 대상 다중 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 버전) 버전의 트리 구조 사이에서 식별할 수 있는 유일한 차이점은 트리 구조에 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

위에서 언급한 것처럼 다른 USB 드라이브에 dd-ed하면 동일한 iso 파일이 제대로 부팅되고 대상 USB 드라이브의 iso 파일이 확인되어 올바른 체크섬을 갖습니다.

관련 정보