LINUX.ORG.RU
решено ФорумAdmin

Создание загрузочной флешки с grub2

 , , ,


0

1

Я мало что понимаю в загрузке, помогите понять что происходит и в какую сторону смотреть.

Пытаюсь сделать мультизагрузочную флешку, но есть проблема с дистрибутивом Guix, не может найти корень, could not open /proc/stat: https://0x0.st/KJiB.jpg (на сообщение init[1]: segfault… не обращайте внимание), если указать root=/dev/ram0 то ругается на ISOFS: unable to identify CD-ROM format: https://0x0.st/KJiu.jpg

Сам архив initrd.cpio.gz выглядит следующим образом: https://0x0.st/KJiy.txt, дерево iso: https://0x0.st/KJi4.txt

Конфиг grub:

insmod efi_gop
insmod font
insmod gfxterm
insmod png
loadfont /boot/grub/fonts/unicode.pf2
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm
if background_image /boot/grub/grub-16x9.png ; then
  set color_normal=light-gray/black
  set color_highlight=yellow/black
else
  set menu_color_normal=cyan/blue
  set menu_color_highlight=white/blue
fi
set imgdevpath="/dev/disk/by-uuid/C758-F995"


menuentry "guix" --class iso {
  set isofile='/images/3i37a8my5xp6iivqmprmhhcm4ci85zyj-image.iso'
  loopback loop $isofile
  linux (loop)/gnu/store/bsy9cj3h01g11s6mxy0h60ixafajwf02-linux-6.17.7/bzImage root=31393730-3031-3031-3139-343934363833 gnu.system=/gnu/store/8qy33rayljj1qhn51jscfdifbfs45k3i-system gnu.load=/gnu/store/8qy33rayljj1qhn51jscfdifbfs45k3i-system/boot findiso=$isofile img_dev=$imgdevpath img_loop=$isofile
  initrd (loop)/gnu/store/6wh8nsdqcgffpwcqdk39c3wayys001hc-raw-initrd/initrd.cpio.gz
}

menuentry "finnix" --class iso {
  set isofile='/images/finnix-251.iso'
  loopback loop $isofile
  linux (loop)/live/vmlinuz-6.16.12+deb14+1-amd64 boot=live toram=filesystem.squashfs vga=791 nomodeset findiso=$isofile img_dev=$imgdevpath img_loop=$isofile
  initrd  (loop)/live/initrd.img-6.16.12+deb14+1-amd64
}

menuentry "systemresque" --class iso {
  iso_path='/images/systemrescue-12.02-amd64.iso'
  export iso_path
  search --set=root --file $iso_path
  loopback loop $iso_path
  root=(loop)
  configfile /boot/grub/loopback.cfg
  loopback --delete loop
}

menuentry "void" --class iso {
  set isofile='/images/void-live-x86_64-20250202-base.iso'
  loopback loop $isofile
  linux (loop)/boot/vmlinuz selinux=0 root=live:CDLABEL=VOID_LIVE iso-scan/filename=$isofile init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 rd.live.ram loglevel=4 vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8 nomodeset vga=0 img_dev=$imgdevpath img_loop=$isofile
  initrd (loop)/boot/initrd
}

menuentry "reboot" {
  reboot
}
menuentry "shutdown" {
  halt
}

Остальные дистрибутивы загружаются без пробем.


Ответ на: комментарий от andytux

Grub изначально придуман лицемерными дуалбутчиками. Это его основное предназначение - загружать Windows. У вас на флешке еще и Windows? Тогда вам нужен Grub. Если нет - то Grub есть сущностью излишней, а даже вредной.

anonymous
()
Ответ на: комментарий от err

А это совсем не показатель. Например, в исо-образах *бунту уже года четыре нет isolinux. Но она прекрасно грузится из исо-образа. Сама система должна разобраться, что и как у неё в исо-образе.

andytux ★★★★★
()

Ссылки на документацию:

В чём проблема с чтением официальной документации?

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

В чём проблема с чтением официальной документации?

Мултизагрузочной не получится. Команда dd займёт один образ на флешку.

Попробуй ventoy-1.0.99, если загрузится, тогда ковырять дальше.
А что если findiso=$isofile заменить на iso-scan/filename=${isofile}

iso-scan/filename=
findiso=
fromiso=
from=
bootfrom=

Некоторые образы не поддерживают ntfs, если флешка в ntfs формате

AZJIO
()
Последнее исправление: AZJIO (всего исправлений: 3)
Ответ на: комментарий от err

Может твой GUIX так не умеет )

Там вообще дичайший init скрипт в inird:

#!/gnu/store/bw399a1n6hv21g3d0snzmisybsa8p096-guile-static-stripped-3.0.7/bin/guile --no-auto-compile
!#
(eval-when (expand load eval) (let ((extensions (quote ())) (prepend (lambda (items lst) (let loop ((items items) (lst lst)) (if (null? items) lst (loop (cdr items) (cons (car items) (delete (car items) lst)))))))) (set! %load-path (prepend (cons "/gnu/store/2wqc68fmx85mjxqhqagblyg11w8yzkmw-module-import" (map (lambda (extension) (string-append extension "/share/guile/site/" (effective-version))) extensions)) %load-path)) (set! %load-compiled-path (prepend (cons "/gnu/store/xc0mcqr4h305k3blqa5p77a92f7pjgpp-module-import-compiled" (map (lambda (extension) (string-append extension "/lib/guile/" (effective-version) "/site-ccache")) extensions)) %load-compiled-path))))(begin (use-modules (gnu build linux-boot) (gnu system file-systems) ((guix build utils) #:hide (delete)) (guix build bournish) (srfi srfi-1) (srfi srfi-26) ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) (rnrs bytevectors)) (with-output-to-port (%make-void-port "w") (lambda () (set-path-environment-variable "PATH" (quote ("bin" "sbin")) (quote ())))) (parameterize ((current-warning-port (%make-void-port "w"))) (boot-system #:mounts (map spec->file-system (quote (((uuid iso9660 #vu8(49 57 55 48 48 49 48 49 49 57 51 51 51 49 56 51)) "/" "iso9660" () #f #f #t #t preen)))) #:pre-mount (lambda () (and #t)) #:linux-modules (quote ("ahci" "usb-storage" "uas" "usbhid" "hid-generic" "hid-apple" "dm-crypt" "xts" "serpent_generic" "wp512" "nls_iso8859-1" "pata_acpi" "pata_atiixp" "isci" "virtio_pci" "virtio_balloon" "virtio_blk" "virtio_net" "virtio_console" "virtio-rng" "isofs" "overlay")) #:linux-module-directory (quote "/gnu/store/2yjzar4fg2lrwjgq10gr19xbkkv78aws-linux-modules") #:keymap-file #f #:qemu-guest-networking? #f #:volatile-root? (quote #t) #:on-error (quote debug))))

В самом initrd init -> /gnu/store/870rglriw0x0g1x0jhwylp1xkg54x5v1-init - это ссылка на другой скрипт, выше, который подгружает части из других скриптов по такому же дичайшему алгоритму.

Вот это:

root=31393730-3031-3031-3139-333333313833

Это UUID файловой системы в ISO образе:

blkid
/dev/sr0: BLOCK_SIZE="2048" UUID="1970-01-01-19-33-31-83" LABEL="GUIX_X86_64-LINUX_1.4.0" TYPE="iso9660" PTTYPE="dos"

В общем, это делали покусанные crux или чем-то подобным.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от err

с ventoy все работает.

Я прихожу к выводу, что надо иметь несколько загрузочных флешек. Одну из них ventoy, чтобы быстро что-то загрузить. Я бы даже сказал что собственный конфиг мне нужен только если я хочу адаптировать загрузку в системного диска, так как ventoy на hdd/ssd/nvme не поставить параллельно с виндой и линуксами.

AZJIO
()
Ответ на: комментарий от kostik87

только хотел запостить этот скрипт) да, там все на scheme

Это UUID файловой системы в ISO образе:

UUID=«1970-01-01-19-33-31-83»

я пробовал добавлять в конфиг

search --fs-uuid --set=root 1970-01-01-19-33-31-83

но grub не может ее найти

Используй ventoy

похоже что да

err
() автор топика
Ответ на: комментарий от err

Если хочешь грузить с флешки, без ventoy - нужно править init сценарий в initramfs.

А он написан на чём-то наркоманском.

Без сложных правок:

  • копируешь всё в корень флешки из ISO;
  • распаковываешь initramfs
mkdir initramfs
cd initramfs
gunzip -c -9 <точка_монтирования_iso>/gnu/store/iwp9qpy89c19v17xl9bdb60p8figy0y6-raw-initrd/initrd.cpio.gz | cpio -i -d -H newc
124415 blocks
# правишь файл 
vim gnu/store/870rglriw0x0g1x0jhwylp1xkg54x5v1-init

меняешь

(map spec->file-system (quote (((uuid iso9660 #vu8(49 57 55 48 48 49 48 49 49 57 51 51 51 49 56 51)) "/" "iso9660" () #f #f #t #t preen))))

На ext4 или тот тип файловой системы, что на флешки:

(map spec->file-system (quote (((uuid ext4 #vu8(49 57 55 48 48 49 48 49 49 57 51 51 51 49 56 51)) "/" "ext4" () #f #f #t #t preen))))

Сохраняешь и собираешь initramfs

find . -print0 | cpio --null -ov --format=newc | gzip -9 > <точка_монтирования_iso>/gnu/store/iwp9qpy89c19v17xl9bdb60p8figy0y6-raw-initrd/initrd.cpio.gz

В параметрах ядра в параметре blkid указываешь просто UUID файловой системы на флешке, без слова UUID.

root=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX gnu.system=/gnu/store/sqxsv69rcnr6bc9fzz57mzkp0gxk0q3b-system 

Т.е. можно скопировать секцию из ISO

menuentry "GNU Guix installation 1.4.0" {
  #search --fs-uuid --set 1970-01-01-19-33-31-83
  linux /gnu/store/3qdad0k7wvwl09wah246q7fvsb1hbr0x-linux-libre-6.0.10/bzImage root=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX gnu.system=/gnu/store/sqxsv69rcnr6bc9fzz57mzkp0gxk0q3b-system gnu.load=/gnu/store/sqxsv69rcnr6bc9fzz57mzkp0gxk0q3b-system/boot quiet modprobe.blacklist=radeon,amdgpu
  initrd /gnu/store/iwp9qpy89c19v17xl9bdb60p8figy0y6-raw-initrd/initrd.cpio.gz
}

#search --fs-uuid --set 1970-01-01-19-33-31-83 - можно закомментирвоать.

Проверил, всё загружается.

Если правок init сценария на guile не сделать - будет ошибка:

417:8	2 (mount-root-file-system "/dev/sda1" "iso9660" # _ # _ # )
In unknown file:
	1 (mount "/dev/sda1" "/real-root" "iso9660" 1 #f)
In ice-9/boot-9.scm

Они ещё и тип захардкодили.

Теоретически можно сделать монтирование, флешки, например в /usb, а далее mount -o bind /usb/guix /real-root и разместить файлы из ISO в /guix. Но в этом наркоманском guile разбирайся сам как сделать иначе.

С FAT32 не проверял, пробуй, если интересно.

Ужасно сделанный livecd, где всё прибито гвоздями и написано не понятно на чём.

UPDATE: Ну либо используй ventoy - это grub2 с патчами, в нём реализован функционал виртуальной CD/DVD привода. Т.е. он эмулирует виртуальное устройство, вместо загрузки ISO файла в память, как в обычном grub2 и создания loop устройства.

Обычный grub2 так не сможет.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от err

Там и двадцать лет назад был casper, когда был isolinux. Например, в Дебиане ‘casper’ называется ‘live’. Кстати, это и есть та самая подсистема, которая делает систему «живой», она и разбирается, что, откуда и как грузить.

andytux ★★★★★
()
Ответ на: комментарий от kostik87

ух, спасибо за содержательный коммент!

теперь все встало на свои места. к сожалению с FAT32 не заработает, не поддерживает символические ссылки, а ext4 мне не подходит. пытался упаковать обратно в iso, но пока не понял как сжать файлы перед упаковкой, у меня образ получается 5Гб

err
() автор топика
Ответ на: комментарий от mister_me

на сколько понял, chainloader просто передает управление другому загрузчику, я пробовал грузить grub из iso и он так же не может найти корень.

выше kostik87 показал, что фс в init скрипте захардкодили на iso9660

err
() автор топика
Ответ на: комментарий от err

с ventoy все работает.

С ventoy НЕ всё работает. Точнее так, не всякая железка взлетает с ним. Этим летом пришлось прикоснуться к «прекрасному».

anc ★★★★★
()
Ответ на: комментарий от err

пробовал грузить grub из iso и он так же не может найти корень

Ещё раз. Ни грубу, ни какому другому загрузчику корень не нужен. Корень нужен системе, она должна найти его и знать, что с ним делать. Параметры типа: ‘root=31393730-3031-3031-3139-343934363833 gnu.system=/gnu/store/8qy33rayljj1qhn51jscfdifbfs45k3i-system gnu.load=/gnu/store/8qy33rayljj1qhn51jscfdifbfs45k3i-system/boot findiso=$isofile’ передаются системе, чтобы она на их основе смогла найти себя.

andytux ★★★★★
()

помечаю тему как решенную, откатился на ventoy. оставляю скрипт установки grub на флешку, может кому пригодится:

#!/bin/sh

main () {

	disk="$1"
	root="$(dirname $(realpath $0))"
	temp="$(mktemp --directory --tmpdir tmp.XXXXXXXXXX)"

	dd bs=512 if=/dev/zero seek=0 count=2048 of="$disk"
	dd bs=512 if=/dev/zero seek=15130624 count=2048 of="$disk"
	sync
	sleep 1

	sfdisk --no-reread "$disk" <<EOF
label: gpt
unit: sectors
sector-size: 512
1 : start=2048, size=15063040, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name="multiboot"
2 : start=15065088, size=65536, type=uefi, name="multiboot_EFI"
3 : start=15130624, size=2015, type=21686148-6449-6E6F-744E-656564454649, name="multiboot_BIOS"
EOF
	sync
	sleep 1

	sfdisk --no-reread -Y dos "$disk" <<EOF
label: dos
sector-size: 512
1 : start=2048, size=15063040, type=0c, bootable
2 : start=15065088, size=65536, type=ef
3 : start=1, size=2047, type=ee
EOF
	sync
	sleep 1

	mkdosfs -n MULTIBOOT "${1}1"
	mkdosfs "${1}2"

	mkdir "$temp/boot"
	mkdir "$temp/efi"

	mount "${1}1" "$temp/boot"
	mount "${1}2" "$temp/efi"

	mkdir $temp/boot/boot

	grub-install --target=x86_64-efi --removable --no-nvram \
		--root-directory=$temp/boot \
		--boot-directory=$temp/boot/boot \
		--efi-directory=$temp/efi

	grub-install --target=i386-efi --removable --no-nvram \
		--root-directory=$temp/boot \
		--boot-directory=$temp/boot/boot \
		--efi-directory=$temp/efi

	grub-install --target=i386-pc \
		--root-directory=$temp/boot \
		--boot-directory=$temp/boot/boot \
		"$disk"

	cat > "$temp/boot/boot/grub/grub.cfg" <<EOF
insmod efi_gop
insmod font
insmod gfxterm
insmod png
loadfont /boot/grub/fonts/unicode.pf2
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm
if background_image /boot/grub/grub-16x9.png ; then
  set color_normal=white/black
  set color_highlight=black/white
else
  set menu_color_normal=cyan/blue
  set menu_color_highlight=white/blue
fi
EOF

	umount "$temp/efi"
	umount "$temp/boot"

	rm -r -f "$temp"

}

main "$@"

использование: sudo script /dev/sdY

https://www.normalesup.org/~george/comp/live_iso_usb/grub_hybrid.html https://trcmdisk01.tripod.com/linux/s_mmlf01.html

grub-16x9.png

err
() автор топика