Poniższy wpis został wygenerowany za pomocą AI, niemniej przeszedłem przez niego własnoręcznie. Jeśli kiedykolwiek będę chciał zrobić to jeszcze raz, dokumentuję to poniżej.
Cel: zainstalowane najnowsze Ubuntu na pendrive z systemem plików do zapisu. Po uruchomieniu działa jak normalny zainstalowany system operacyjny.
Po przejściu Ubuntu na dracut (od wydania 25.10) tradycyjna metoda przygotowania obrazu VHD pod Ventoya — czyli skrypt vtoyboot.sh — przestała być niezawodna. Główną przyczyną jest binarny moduł jądra dm_patch.ko, który dostarcza vtoyboot i który rozjeżdża się z każdą nową wersją jądra. Stąd narzucony obowiązek uruchamiania vtoyboot.sh po każdej aktualizacji oraz zgłoszone, nienaprawione błędy uniemożliwiające rozruch w nowszych wydaniach Ubuntu.
Poniżej minimalne podejście oparte na pomyśle z poradnika korkmana, ale ograniczone do najprostszego scenariusza: jeden plik VHD, jedna partycja Ventoy, bez szyfrowania, bez osobnego /boot. Pominięte zostały: drugi plik VHD na rozruch, automatyczne montowanie /boot, niezmienne punkty montowania, skrypty przenoszące montowania oraz własna konfiguracja GRUB-a wewnątrz maszyny wirtualnej.
Przenośność między pendrive’ami. Przygotowany w ten sposób initrd działa niezależnie od tego, czy partycja Ventoy została sformatowana jako exFAT, NTFS lub FAT32. Dzięki temu plik VHD można później przełożyć na inny pendrive Ventoy bez konieczności ponownego budowania obrazu.
Zgodność z BIOS i UEFI. Ten sam plik VHD uruchamia się pod GRUB-em Ventoya zarówno w trybie Legacy BIOS, jak i UEFI — niezależnie od tego, w którym trybie zainstalowano Ubuntu. Kluczowy fakt: bootloader znajdujący się wewnątrz pliku VHD (grub-pc lub grub-efi) nigdy nie jest wykorzystywany przez Ventoya. GRUB Ventoya samodzielnie podpina plik VHD jako urządzenie loop, odczytuje /boot/vmlinuz oraz /boot/initrd.img z partycji głównej, a następnie ładuje jądro bezpośrednio. Spotykana czasem obserwacja, że „Linux zainstalowany w trybie BIOS nie chce się uruchomić pod UEFI”, odnosi się do prób uruchomienia takiego systemu bezpośrednio z firmware UEFI, gdzie wymagany jest moduł ładujący EFI na partycji ESP. W omawianym scenariuszu nie ma tego problemu, ponieważ to GRUB Ventoya pełni funkcję modułu ładującego. Z tego samego powodu Linux zainstalowany w trybie UEFI uruchomi się również pod Ventoyem działającym w trybie BIOS — droga rozruchu jądra nie wymaga środowiska EFI, a wpis /boot/efi w /etc/fstab jest tolerowany (FAT32 montuje się normalnie i bez interfejsów EFI).
Dlaczego to działa bez vtoyboot
Vtoyboot polega na binarnym module jądra dm_patch.ko, który rozjeżdża się z każdą nową wersją jądra — stąd wymóg uruchamiania vtoyboot.sh po każdej aktualizacji. W zaproponowanym tu rozwiązaniu zamiast modułu jądra używany jest zwykły skrypt powłoki jako hook w dracut. Działa wyłącznie w przestrzeni użytkownika i jest odtwarzany w initrd przy każdym uruchomieniu update-initramfs, które wykonuje się i tak przy aktualizacji jądra.
Mechanika rozruchu wygląda następująco:
- GRUB Ventoya podpina plik VHD jako urządzenie loop i ładuje vmlinuz oraz initrd z partycji głównej zawartej w VHD.
- Jądro startuje, dracut szuka systemu plików root po
LABEL=VentUbuntu. - Etykieta nie istnieje (plik VHD jest w tym momencie tylko zwykłym plikiem na partycji exFAT/NTFS) — uruchamia się nasz skrypt hook.
- Skrypt montuje partycję Ventoy, wykonuje
losetup -Pna pliku VHD, dzięki czemu partycje wewnątrz VHD pojawiają się jako urządzenia blokowe, a/dev/disk/by-label/VentUbuntumaterializuje się. - Dracut kontynuuje normalny rozruch i montuje system plików root.
Ten sam initrd działa również w maszynie wirtualnej, ponieważ tam etykieta istnieje od razu i skrypt hook nie wykonuje żadnej akcji.
Założenia struktury
Aby GRUB Ventoya mógł odczytać /boot/vmlinuz z pliku VHD, partycja główna musi być w formacie, który GRUB rozumie (ext4 jest w porządku), bez LVM i bez szyfrowania. Najprostszy układ przy instalacji w trybie UEFI:
(loop1,1)— ESP (FAT32, około 500 MB) — wykorzystywana wyłącznie w maszynie wirtualnej, nie modyfikujemy jej.(loop1,2)— ext4 z/bootw środku — z tej partycji GRUB pobiera vmlinuz oraz initrd.
Krok 1: Przygotowanie maszyny wirtualnej i instalacja Ubuntu
W programie VirtualBox:
- Utwórz nową maszynę wirtualną w trybie UEFI (System → Enable EFI).
- Dysk: format VHD, stały rozmiar (nie dynamiczny), na przykład 30 GB.
- Uruchom z obrazu ISO Ubuntu Server 26.04.
- Przy partycjonowaniu wybierz Custom storage layout (manualne):
- 500 MB FAT32 → punkt montowania
/boot/efi, flaga ESP. - reszta dysku → ext4 → punkt montowania
/. - Nie używaj LVM, nie szyfruj, swap pomiń (lub utwórz później jako plik wymiany).
- 500 MB FAT32 → punkt montowania
- Dokończ instalację i zaloguj się.
Krok 2: Konfiguracja systemu
Wszystkie poniższe operacje wykonujemy w maszynie wirtualnej, przed skopiowaniem pliku VHD na pendrive.
Etykieta partycji głównej
Sprawdź, na której partycji znajduje się system plików root:
lsblk -fZałóżmy, że jest to /dev/sda2. Nadaj jej etykietę:
sudo e2label /dev/sda2 VentUbuntuJeśli identyfikator partycji jest inny, podstaw odpowiedni.
Moduł dracut
Utwórz katalog modułu:
sudo mkdir -p /usr/lib/dracut/modules.d/99ventubuntuPlik module-setup.sh:
sudo tee /usr/lib/dracut/modules.d/99ventubuntu/module-setup.sh > /dev/null << 'EOF'
#!/bin/bash
check() { return 0; }
depends() { echo "rootfs-block"; return 0; }
installkernel() {
# Wszystkie systemy plików spotykane na pendrive'ach Ventoy + loop dla losetup
# exfat (domyślny w Ventoyu dla nośników większych niż 32 GB),
# ntfs3 (sterownik NTFS wbudowany w jądro, z obsługą zapisu),
# vfat (FAT16/32)
hostonly='' instmods -c exfat ntfs3 vfat loop
}
install() {
inst_hook initqueue/settled 10 "$moddir/ventubuntu-vhd.sh"
}
EOF
sudo chmod +x /usr/lib/dracut/modules.d/99ventubuntu/module-setup.shGłówny skrypt — uruchamia się po udev settle, więc wszystkie urządzenia, które miały się pojawić, są już dostępne:
sudo tee /usr/lib/dracut/modules.d/99ventubuntu/ventubuntu-vhd.sh > /dev/null << 'EOF'
#!/bin/sh
# Jeśli system plików root jest już widoczny (np. rozruch w VirtualBox),
# nie podejmujemy żadnej akcji
[ -e /dev/disk/by-label/VentUbuntu ] && exit 0
# Skanujemy wszystkie urządzenia blokowe w poszukiwaniu pliku Ubuntu.vhd.
# Logika nie zależy od etykiety partycji, więc działa zarówno na czystym
# pendrivie Ventoy, jak i wtedy, gdy Ventoy został doinstalowany jako wtyczka
# do Easy2Boota (gdzie partycja ma swoją własną etykietę).
mkdir -p /mnt/Ventoy
for dev in $(blkid -o device); do
fstype=$(blkid -s TYPE -o value "$dev" 2>/dev/null)
case "$fstype" in
exfat|vfat) ;;
# blkid zwraca "ntfs" zarówno dla starego, jak i nowego sterownika;
# wybieramy ntfs3 (wbudowany w jądro, z obsługą zapisu)
ntfs) fstype=ntfs3 ;;
*) continue ;;
esac
if mount -t "$fstype" "$dev" /mnt/Ventoy 2>/dev/null; then
if [ -e /mnt/Ventoy/Ubuntu.vhd ]; then
losetup -Pf /mnt/Ventoy/Ubuntu.vhd
# need_shutdown wymusza pełne wyłączenie zamiast szybkiego restartu,
# dzięki czemu zapisy do pliku VHD trafiają na pendrive
need_shutdown
exit 0
fi
umount /mnt/Ventoy
fi
done
EOF
sudo chmod +x /usr/lib/dracut/modules.d/99ventubuntu/ventubuntu-vhd.shWarto zwrócić uwagę, że partycję Ventoy montujemy bez opcji -o ro — musi być w trybie zapisu, ponieważ jądro odmawia utworzenia urządzenia pętlowego w trybie zapisu z pliku znajdującego się na nośniku zamontowanym tylko do odczytu. Konsekwentnie utworzony tak loop device byłby read-only, a wraz z nim cały system plików root. Czystego zamknięcia broni mechanizm need_shutdown razem z hakiem sysrq opisanym poniżej.
Wymuszenie czystego zamknięcia (opcjonalne, ale zalecane)
Bez tego elementu istnieje ryzyko uszkodzenia pliku VHD przy wyłączaniu — initramfs-tools nie udostępnia standardowego sposobu na zamknięcie urządzeń loop, więc wymuszamy przejście systemów plików w tryb tylko do odczytu poprzez sysrq:
sudo tee /lib/systemd/system-shutdown/VentUbuntuVHD.shutdown > /dev/null << 'EOF'
#!/bin/sh
echo s > /proc/sysrq-trigger
echo u > /proc/sysrq-trigger
EOF
sudo chmod +x /lib/systemd/system-shutdown/VentUbuntuVHD.shutdownOdtworzenie initrd
sudo dracut -f --regenerate-allJeżeli z jakiegoś powodu instalacja Ubuntu 26.04 nadal używa initramfs-tools (sprawdzenie: which dracut), zamiast powyższego polecenia użyj sudo update-initramfs -u -k all. Domyślnie jednak Ubuntu Server 26.04 korzysta z dracut.
Zamknięcie maszyny wirtualnej
sudo poweroffMaszynę wirtualną należy zamknąć poprawnie — nie wystarczy zamknąć okna VirtualBox.
Krok 3: Wyłączenie nowych flag ext4 (obejście dla GRUB 2.04)
Ventoy w bieżącej wersji nadal dostarcza GRUB 2.04, który nie obsługuje dwóch flag systemu plików ext4 włączanych domyślnie przez nowsze wydania e2fsprogs: metadata_csum_seed (od Ubuntu 22.04) oraz orphan_file (od Ubuntu 24.04). W rezultacie GRUB Ventoya zgłasza „unknown filesystem” i nie potrafi odczytać /boot/vmlinuz z partycji root pliku VHD. Wsparcie tych flag pojawiło się dopiero w GRUB 2.12. System plików nadal jest poprawny — Linux go montuje bez zastrzeżeń — problem dotyczy wyłącznie bootloadera.
Obie flagi można usunąć poleceniem tune2fs, ale wymaga ono odmontowanego systemu plików, więc operację trzeba wykonać po uruchomieniu z innego nośnika. Najprościej:
- W ustawieniach maszyny wirtualnej dodaj obraz ISO z Ubuntu Desktop (lub innej dystrybucji w trybie live) i ustaw rozruch z napędu optycznego przed dyskiem.
- Uruchom maszynę i wybierz tryb „Try Ubuntu” (bez instalacji).
- Otwórz terminal i wykonaj:
sudo tune2fs -O ^metadata_csum_seed,^orphan_file /dev/sda2
sudo e2fsck -fy /dev/sda2Identyfikator partycji (/dev/sda2) podstaw zgodnie z układem dysku — w trybie live można sprawdzić lsblk -f. Po zakończeniu zamknij środowisko live, odepnij obraz ISO z maszyny wirtualnej i przejdź do kolejnego kroku.
Krok 4: Skopiowanie pliku VHD i konfiguracja Ventoya
Skopiuj plik VHD z katalogu VirtualBox na partycję Ventoy. Plik nazwij Ubuntu.vhd — celowo bez sufiksu .vtoy, ponieważ nie chcemy, aby Ventoy próbował obsłużyć go samodzielnie poprzez vtoyboot.
Utwórz katalog ventoy/ na partycji Ventoy (jeśli jeszcze nie istnieje), a w nim plik ventoy/ventoy_grub.cfg:
menuentry "Ubuntu Server 26.04 (VHD)" {
loopback loop9 ${vtoy_iso_part}/Ubuntu.vhd
search --no-floppy --label VentUbuntu --set vent_root
linux ($vent_root)/boot/vmlinuz root=LABEL=VentUbuntu ro net.ifnames=0
initrd ($vent_root)/boot/initrd.img
}Uwagi:
${vtoy_iso_part}to zmienna ustawiana przez Ventoya, wskazująca na partycję, na której znajdują się obrazy. Działa zarówno na czystym pendrivie Ventoy, jak i wtedy, gdy Ventoy uruchamiany jest jako wtyczka do Easy2Boota — dzięki temu nie trzeba odwoływać się do etykiety partycji nośnika.search --label VentUbuntuznajduje partycję po etykiecie nadanej w kroku 2, niezależnie od numeru partycji w pliku VHD. Jest to odporniejsze niż wpisanie(loop9,2)na sztywno — Ubuntu Server bywa kapryśny i potrafi przy manualnym partycjonowaniu dodaćbios_bootlub osobny/boot, przez co rootfs trafia na partycję inną niż druga.- Wartość
LABEL=VentUbuntumusi się zgadzać z etykietą nadaną polecenieme2labelw kroku 2. /boot/vmlinuzoraz/boot/initrd.imgto dowiązania symboliczne, które Ubuntu utrzymuje na bieżącą wersję jądra — przy aktualizacji jądra są aktualizowane automatycznie, więc plikventoy_grub.cfgnie wymaga późniejszej edycji.- Ten sam plik
ventoy_grub.cfgobsłuży rozruch zarówno przy uruchomieniu Ventoya pod Legacy BIOS (przez Easy2Boot), jak i pod UEFI (przez AGFM) — GRUB Ventoya w obu trybach wykona te same instrukcje i wyświetli to menu.
Jeżeli mimo wszystko search --label nie znajdzie partycji, najprawdopodobniej oznacza to, że system plików root znajduje się na woluminie LVM (GRUB nie umie wówczas odczytać etykiety bez wczytanego modułu LVM). W takim przypadku należy wrócić do instalacji i powtórzyć ją bez LVM.
Krok 5: Rozruch
Włóż pendrive Ventoy do docelowego komputera i uruchom z niego system. W menu Ventoya wciśnij F6, aby wejść w „Custom GRUB Menu” — tam pojawi się pozycja „Ubuntu Server 26.04 (VHD)”.
Aktualizacje i konserwacja
- Aktualizacja jądra. Nie wymaga żadnych dodatkowych czynności. Polecenie
apt upgradeodtwarza initrd, a hook jest częścią modułu dracut, więc trafia do każdego nowego initrd automatycznie. - Zmiana etykiety partycji lub układu. Należy zsynchronizować trzy miejsca: wynik
e2label, parametrroot=w plikuventoy_grub.cfgoraz wartośćLABEL=w skrypcie hook. - Test po aktualizacji jądra. Warto raz po aktualizacji uruchomić system z VHD w VirtualBoxie przed podłączeniem pendrive’a do fizycznej maszyny — jeżeli rozruch w maszynie wirtualnej działa, na fizycznym sprzęcie zwykle również zadziała.
Co celowo pominięto względem poradnika korkmana
| Element u korkmana | Po co tam jest | Dlaczego tutaj niepotrzebne |
|---|---|---|
Drugi plik VHD VentUbuntuBoot.vhd z osobnym /boot | Dla BIOS-ów widzących tylko pierwszą partycję pendrive’a | Nowoczesny UEFI nie ma tego ograniczenia; wystarczy jeden plik VHD |
boot.automount w /etc/fstab | Ponieważ /boot znajduje się na osobnym pliku VHD, który trzeba podmontować | /boot leży w obrębie systemu plików root i montuje się normalnie |
chattr +i /boot, chattr +i /mnt/Ventoy | Żeby aktualizacje przypadkiem niczego tam nie zapisały | Przy jednoplikowej instalacji takie ryzyko nie występuje |
Przeniesienie montowania /mnt/Ventoy do systemu plików root | Aby pendrive był widoczny w działającym systemie | Niepotrzebne — system korzysta z własnego systemu plików root w VHD |
Własny 07-VentUbuntu oraz update-grub w maszynie wirtualnej | Aby maszyna wirtualna uruchamiała się tym samym mechanizmem | Maszyna wirtualna uruchamia się natywnie z ESP — nie korzysta z naszej konfiguracji GRUB-a |
Partycja VentMore jako rezerwowa | Z czasów, gdy Ventoy ograniczał pierwszą partycję do 32 GB | Ograniczenie nieaktualne w nowych wersjach Ventoya |
Potencjalne problemy
- Secure Boot. Jeżeli komputer ma włączoną tę funkcję, mogą pojawić się problemy z uruchomieniem niepodpisanego jądra ładowanego „z boku” przez Ventoya. Należy wyłączyć Secure Boot w ustawieniach firmware albo użyć wersji Ventoya zgodnej z Secure Boot wraz z odpowiednio podpisanym shimem.
- Dynamiczny VHD. Nie należy go używać. Ventoy obsługuje wyłącznie pliki VHD o stałym rozmiarze.
- Plik VHD większy niż 4 GB na partycji FAT32. Jest to niemożliwe ze względu na ograniczenia samego FAT32. Jeśli pendrive Ventoy korzysta z FAT32, trzeba ograniczyć się do mniejszego pliku VHD lub przy okazji ponownej instalacji Ventoya sformatować nośnik na exFAT lub NTFS.
- Stary sterownik
ntfs(tylko do odczytu). Skrypt celowo wymusza wybórntfs3. Można pozostawić zmiennąfstypebez tej podmiany, ale wówczas zapis do pliku VHD nie będzie działał — w praktyce nie ma to sensu.