Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Grub u multiboot PC - jak na to?  (Přečteno 1973 krát)

ramael

  • Aktivní člen
  • *
  • Příspěvků: 366
Re:Grub u multiboot PC - jak na to?
« Odpověď #25 kdy: 02 Prosince 2022, 12:31:09 »
Jen je to s cat jednodušší ;-)
Já si nemůžu pomoc, ale mě ten grub2 přijde docela ok. Je fakt, že předešlý grub jsem používal jen chvíli před hódně lety. S dovolením sem hodím krátký návod s příkladem na úpravu menu. Nejdříve si přečtu co je vygenerováno v /boot/grub/grub.cfg A tam je mimo jiné:
Kód: [Vybrat]
menuentry 'Arch Linux on /dev/nvme0n1p3' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinu
x-simple-ef406b82-d644-4133-8569-82642c864955' {
        savedefault
        insmod part_gpt
        insmod ext2
        search --no-floppy --fs-uuid --set=root ef406b82-d644-4133-8569-82642c864955
        linux /boot/vmlinuz-linux root=/dev/nvme0n1p3
        initrd /boot/initramfs-linux.img
}
Nakopíruju to a přidám to na konec souboru /etc/grub.d/40_custom
Ještě to malinko poupravím a výsledek:
Kód: [Vybrat]
#!/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 'Můj Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinu
x-simple-ef406b82-d644-4133-8569-82642c864955' {
        savedefault
        insmod part_gpt
        insmod ext2
        search --no-floppy --fs-uuid --set=root ef406b82-d644-4133-8569-82642c864955
        linux /boot/vmlinuz-linux root=/dev/nvme0n1p3
        initrd /boot/initramfs-linux.img
}
Což mne vytvoří novou položku v menu grubu. Pak bych mohl spustit Arch jak výběrem Arch Linux on /dev/nvme0n1p3
tak i výběrem Můj Arch Linux což se může hodit pokud bych testoval spouštění daného systému s různými parametry jádra. Můj cíl to není a tak os-proberu nařídím aby tuto položku ignoroval editací souboru /etc/default/grub
Kód: [Vybrat]
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`grep PRETTY_NAME /etc/lsb-release | cut -d= -f2 | cut -d\" -f2 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""
GRUB_FONT=/boot/grub/fonts/DejaVuSansMono24.pf2


# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

GRUB_DISABLE_OS_PROBER=false
GRUB_BACKGROUND=/usr/share/wallpaper/grub/back.png
GRUB_OS_PROBER_SKIP_LIST="ef406b82-d644-4133-8569-82642c864955@/dev/nvme0n1p3"
Všimnite si posledního řádku a parametru ve tvaru <UUID>@<EFI FILE>
Pak už jen stačí
Kód: [Vybrat]
sudo update-grub
reboot
a je hotovo. Nové grub menu s vlastním výběrem. Ok, je to taková blbůstka. Ale pokud si třeba do nějakého systému nainstaluju nějaké extra jádro a chci ho spustit nebo testovat s přidanýma parametrama. Jen přidám sekci do /etc/grub.d/40_custom a je to. Příkaz update-grub načte a automaticky vloží defaultní nastavení do /boot/grub/grub.cfg a ještě tam vloží obsah menu co jsem vložil do 40_custom. Pak se může daný OS spustit jak v základu, tak s extra parametry.
Přiznám se , že mne teď na rychlo nenapadá jaký parametr bych měl přidat. Ale tvar je v tomto formátu při mém 40_custom souboru
Kód: [Vybrat]
linux /boot/vmlinuz-linux root=/dev/nvme0n1p3 sem se přidávají parametry oddělené mezerou
Pokud bych neměl globálně v /etc/default/grub nastaveno
Kód: [Vybrat]
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
Přidal bych to do mého menu takto:
Kód: [Vybrat]
linux /boot/vmlinuz-linux root=/dev/nvme0n1p3 quiet
Jednoduše můžu spouštět sytém s různými parametry aniž bych se bál že mě něco nenaskočí a budu v ...
Alespoň tak to vnímám já.
Lenovo: Ideapad 5, AMD Ryzen 4000 
MeWe  Joutůůůůb

ramael

  • Aktivní člen
  • *
  • Příspěvků: 366
Re:Grub u multiboot PC - jak na to?
« Odpověď #26 kdy: 10 Prosince 2022, 00:14:12 »
Jsem se tomu tročku koukl na zoubek. Myšlenky běželi tímto směrem -> Po každé instalaci jádra se automaticky volá update-grub. Který obsahuje jen volání grub-mkconfig. Takže se automaticky volaný skript nahradí mým skriptem. Který načte pořadí bootu při staré konfiguraci. Pak následuje náma známá část s chrootem kde je třeba spustit už jen originál volání grub-mkconfig.
A nakonec nastavit boot pořadí jak bylo před instalací. Je třeba si v novém skriptu update-grub přepsat dvě adresy aby to sedělo na váš systém.
Je to hodně jednoduché ba přímo primitivně udělané bez kontroly chyb atd. Avšak jak je v testu vidět, tak to funguje dobře (minimálně u mne).

Vše následující jsem dělal jako root:
Kód: [Vybrat]
sudo -i
Smazal jsem symlink update-grub2 a přejmenoval update-grub na update-grub2. Takže pokud budu chtít někdy použít originál, napíšu jen update-grub2:
Kód: [Vybrat]
unlink /usr/sbin/update-grub2
mv /usr/sbin/update-grub /usr/sbin/update-grub2
Pak jsem vytvořil nový soubor update-grub:
Kód: [Vybrat]
>/usr/sbin/update-grub
chmod +x /usr/sbin/update-grub
A do něho vložil toto:
Kód: [Vybrat]
#! /usr/bin/env bash

# uloží se pořadí bootu do proměnné $poradi
echo čtu pořadí
read -r ffff poradi < <(efibootmgr | grep ^BootOrder)
# připojí se partition s hlavním grub OS na /mnt
# u mne je to na /dev/nvme0n1p5
echo připojuji oddíl s OS
mount /dev/nvme0n1p5 /mnt
# Připojí se EFI partition do souborového systému hlavního OS
# u mne je to /dev/nvme0n1p1
echo Připojuji EFI
mount /dev/nvme0n1p1 /mnt/boot/efi
echo Připojuji důležité body systému
for i in /dev /dev/pts /proc /sys /sys/firmware/efi/efivars /run; do mount -B $i /mnt$i; done
# chroot do /mnt a spuštění update grubu
echo chrootuji se a spouštím update-grub
chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg
# vyskočí se z chroot
echo ***********************vyskočil jsem*************
# odpojí se /mnt
umount -R /mnt
# vrátí se původní pořadí
echo Odpojeno, jdu vrátit boot
efibootmgr -o $poradi
Mám to komentované.
Test.
Opět instalace nového jádra a stejně to přinutí grub aby to bylo po našem:
Kód: [Vybrat]
root@radek-ubuntu:~# wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.0/amd64/linux-headers-6.0.0-060000_6.0.0-060000.202210022231_all.deb
--2022-12-09 23:18:37--  https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.0/amd64/linux-headers-6.0.0-060000_6.0.0-060000.202210022231_all.deb
Překládám kernel.ubuntu.com (kernel.ubuntu.com)… 91.189.94.216
Navazuje se spojení s kernel.ubuntu.com (kernel.ubuntu.com)|91.189.94.216|:443… spojeno.
HTTP požadavek odeslán, program čeká na odpověď… 200 OK
Délka: 12688478 (12M) [application/x-debian-package]
Ukládám do: ‘linux-headers-6.0.0-060000_6.0.0-060000.202210022231_all.deb’

   linux-headers-6.0.0-060000_6.0.0-  13%[========>                                                            ]   1,68M   510KB/s    zbývá 22s  ^x-headers-6.0.0-060000_6.0.0-060000.  25%[================>                                                    ]   3,10M   711KB/s    zbývá 16s  ^linux-headers-6.0.0-060000_6.0.0-060 100%[====================================================================>]  12,10M   984KB/s    za 15s     

2022-12-09 23:18:53 (840 KB/s) – ‘linux-headers-6.0.0-060000_6.0.0-060000.202210022231_all.deb’ uloženo [12688478/12688478]

root@radek-ubuntu:~# wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.0/amd64/linux-headers-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb
--2022-12-09 23:20:37--  https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.0/amd64/linux-headers-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb
Překládám kernel.ubuntu.com (kernel.ubuntu.com)… 91.189.94.216
Navazuje se spojení s kernel.ubuntu.com (kernel.ubuntu.com)|91.189.94.216|:443… spojeno.
HTTP požadavek odeslán, program čeká na odpověď… 200 OK
Délka: 3097056 (3,0M) [application/x-debian-package]
Ukládám do: ‘linux-headers-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb’

linux-headers-6.0.0-060000-generic_6 100%[====================================================================>]   2,95M   845KB/s    za 3,7s   

2022-12-09 23:20:41 (817 KB/s) – ‘linux-headers-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb’ uloženo [3097056/3097056]

root@radek-ubuntu:~# wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.0/amd64/linux-image-unsigned-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb
--2022-12-09 23:21:49--  https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.0/amd64/linux-image-unsigned-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb
Překládám kernel.ubuntu.com (kernel.ubuntu.com)… 91.189.94.216
Navazuje se spojení s kernel.ubuntu.com (kernel.ubuntu.com)|91.189.94.216|:443… spojeno.
HTTP požadavek odeslán, program čeká na odpověď… 200 OK
Délka: 12093632 (12M) [application/x-debian-package]
Ukládám do: ‘linux-image-unsigned-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb’

linux-image-unsigned-6.0.0-060000-ge 100%[====================================================================>]  11,53M  1,06MB/s    za 12s     

2022-12-09 23:22:02 (966 KB/s) – ‘linux-image-unsigned-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb’ uloženo [12093632/12093632]

root@radek-ubuntu:~# wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.0/amd64/linux-modules-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb
--2022-12-09 23:22:41--  https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.0/amd64/linux-modules-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb
Překládám kernel.ubuntu.com (kernel.ubuntu.com)… 91.189.94.216
Navazuje se spojení s kernel.ubuntu.com (kernel.ubuntu.com)|91.189.94.216|:443… spojeno.
HTTP požadavek odeslán, program čeká na odpověď… 200 OK
Délka: 92365796 (88M) [application/x-debian-package]
Ukládám do: ‘linux-modules-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb’

linux-modules-6.0.0-060000-generic_6 100%[====================================================================>]  88,09M   802KB/s    za 97s     s

2022-12-09 23:24:19 (930 KB/s) – ‘linux-modules-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb’ uloženo [92365796/92365796]

root@radek-ubuntu:~# dpkg -i *.deb
(Načítá se databáze … nyní je nainstalováno 236562 souborů a adresářů.)
Připravuje se nahrazení linux-headers-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb …
Rozbaluje se linux-headers-6.0.0-060000-generic (6.0.0-060000.202210022231) přes (6.0.0-060000.202210022231) …
Připravuje se nahrazení linux-headers-6.0.0-060000_6.0.0-060000.202210022231_all.deb …
Rozbaluje se linux-headers-6.0.0-060000 (6.0.0-060000.202210022231) přes (6.0.0-060000.202210022231) …
Připravuje se nahrazení linux-image-unsigned-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb …
Rozbaluje se linux-image-unsigned-6.0.0-060000-generic (6.0.0-060000.202210022231) přes (6.0.0-060000.202210022231) …
Připravuje se nahrazení linux-modules-6.0.0-060000-generic_6.0.0-060000.202210022231_amd64.deb …
Rozbaluje se linux-modules-6.0.0-060000-generic (6.0.0-060000.202210022231) přes (6.0.0-060000.202210022231) …
Nastavuje se balík linux-headers-6.0.0-060000 (6.0.0-060000.202210022231) …
Nastavuje se balík linux-modules-6.0.0-060000-generic (6.0.0-060000.202210022231) …
Nastavuje se balík linux-headers-6.0.0-060000-generic (6.0.0-060000.202210022231) …
Nastavuje se balík linux-image-unsigned-6.0.0-060000-generic (6.0.0-060000.202210022231) …
Zpracovávají se spouštěče pro balík linux-image-unsigned-6.0.0-060000-generic (6.0.0-060000.202210022231) …
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-6.0.0-060000-generic
I: The initramfs will attempt to resume from /dev/nvme0n1p8
I: (UUID=7897ed19-78a5-4478-b129-9f3ddb6c3cf8)
I: Set the RESUME variable to override this.
/etc/kernel/postinst.d/zz-update-grub:
čtu pořadí
připojuji oddíl s OS
Připojuji EFI
Připojuji důležité body systému
chrootuji se a spouštím update-grub
Generating grub configuration file ...
Found background: /usr/share/wallpaper/grub/back.png
Found background image: /usr/share/wallpaper/grub/back.png
Found linux image: /boot/vmlinuz-5.10.142-antix.2-amd64-smp
Found initrd image: /boot/initrd.img-5.10.142-antix.2-amd64-smp
Found linux image: /boot/vmlinuz-4.9.0-326-antix.1-amd64-smp
Found initrd image: /boot/initrd.img-4.9.0-326-antix.1-amd64-smp
Found mtest-64.efi image: /boot/uefi-mt/mtest-64.efi
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Found Linux Mint 21 Vanessa (21) on /dev/nvme0n1p2
Skipped Arch Linux on /dev/nvme0n1p3 by user request.
Found Ubuntu 22.04.1 LTS (22.04) on /dev/nvme0n1p4
Found Ubuntu 18.04.6 LTS (18.04) on /dev/nvme0n1p6
Adding boot menu entry for UEFI Firmware Settings ...
done
***********************vyskočil jsem*************
Odpojeno, jdu vrátit boot
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0001,0018,0014,0015,0016,0017,0019,001A
Boot0000* ubuntu
Boot0001* antix-22
Boot0010  Setup
Boot0011  Boot Menu
Boot0012  Diagnostic Splash
Boot0013  UEFI Diagnostics
Boot0014* NVMe: SKHynix_HFM512GDHTNI-87A0B             
Boot0015* ATA HDD:
Boot0016* ATA HDD1:
Boot0017* ATAPI CD:
Boot0018* USB HDD:
Boot0019* USB FDD:
Boot001A* USB CD:
reboot
A start mnou preferovaného grubu s položkou nového jádra bez následného hraní si v terminálu.
Vypichuji, že jsem vlastně jen stáhnul a nainstaloval šestkové jádro. Vše ostatní proběhlo samo.
Lenovo: Ideapad 5, AMD Ryzen 4000 
MeWe  Joutůůůůb

ramael

  • Aktivní člen
  • *
  • Příspěvků: 366
Re:Grub u multiboot PC - jak na to?
« Odpověď #27 kdy: 31 Prosince 2022, 13:09:38 »
Dnes jsem narazil na malý problém kdy os_prober vynechal jedno jádro. A ani za boha ho "nechtěl" vidět. A tak jsem jedním řádkem upravil skript a už to funguje.
/usr/sbin/update-grub
Kód: [Vybrat]
#! /usr/bin/env bash

# uloží se pořadí bootu do proměnné $poradi
echo čtu pořadí
read -r ffff poradi < <(efibootmgr | grep ^BootOrder)
# spuštění "lokálního" update grubu
update-grub2
# připojí se partition s hlavním OS grub na /mnt
echo připojuji oddíl s OS
mount /dev/nvme0n1p5 /mnt
# Připojí se EFI partition do souborového systému hlavního OS
echo Připojuji EFI
mount /dev/nvme0n1p1 /mnt/boot/efi
echo Připojuji důležité body systému
for i in /dev /dev/pts /proc /sys /sys/firmware/efi/efivars /run; do mount -B $i /mnt$i; done
# chroot do /mnt
echo chrootuji se
chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg
# vyskočí se z chroot
echo ***********************vyskočil jsem*************
# odpojí se /mnt
umount -R /mnt
# vrátí se původní pořadí
echo Odpojeno, jdu vrátit boot
efibootmgr -o $poradi
Skript nejprve načte pořadí bootu. Pak nechá provést update grubu aktuálním systémem a pak provede update grubu preferovaného systému. A poté zapíše zpět pořadí bootu.
Pro jistotu ještě připojím /usr/sbin/update-grub2
Kód: [Vybrat]
#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"
Aby případný čtenář nemusel číst historii tohoto vlákna.
Lenovo: Ideapad 5, AMD Ryzen 4000 
MeWe  Joutůůůůb

ramael

  • Aktivní člen
  • *
  • Příspěvků: 366
Re:Grub u multiboot PC - jak na to?
« Odpověď #28 kdy: 25 Ledna 2023, 17:50:12 »
Ještě se vrátím k tématu. Narazil jsem na jednodušší řešení. Stačí nainstalovat arch-install-scripts, mountnout systém v kterém je preferovaný grub. Dejme tomu do /mnt Pak se do něho chrootnout pomocí arch-chroot a tam spustit update-grub:
Kód: [Vybrat]
sudo -i
mount /dev/system_s _preferovaným_grubem /mnt
arch-chroot /mnt
update-grub
exit
Skript sám připojí všechny důležité body systému a spustí bash chrootnutého systému. Tz. že se spouští programy chrootnutého systému a né "hostitele". Takže pokud systém z kterého voláte arch-chroot nemá nainstalováno třeba vim a v chrootnutém systému je, tak ho tam spustíte. Jinak řečeno update-grub v arch-chrootu se spustí v rámci daného systému.
Ještě jinak řečeno Arch, Artix a Void mám bez grubu a přesto spustím update-grub na chrootnutém systému co ho má.
Sorry za můj češtin.
Lenovo: Ideapad 5, AMD Ryzen 4000 
MeWe  Joutůůůůb

 

Provoz zaštiťuje spolek OpenAlt.