vmlinuz to skompresowany, bootowalny obraz jądra Linux — plik, który GRUB ładuje do pamięci przy starcie. Mały stub wewnątrz niego dekompresuje resztę jądra do RAM-u i przekazuje kontrolę, uruchamiając system.

Ciekawostka #1: Co oznacza nazwa vmlinuz?

Nazwa vmlinuz nie jest przypadkowa. To skrót, który można rozbić na części, a każda z nich ma historyczne znaczenie:

  • vm: Oznacza “Virtual Memory” (pamięć wirtualna). We wczesnych dniach Linuksa, jądra, które wspierały pamięć wirtualną (co dziś jest standardem), miały ten prefiks, aby odróżnić je od starszych wersji, które tego nie potrafiły.
  • linu: To po prostu skrót od “Linux”.
  • z: Oznacza, że obraz jądra jest skompresowany, najczęściej przy użyciu algorytmu gzip. To właśnie ta kompresja sprawia, że plik jest znacznie mniejszy niż jego surowy odpowiednik, vmlinux. Współczesne jądra mogą również używać innych algorytmów, takich jak lzma, xz, lzo, lz4 czy zstd.

Ciekawostka #2: vmlinux vs vmlinuz

Często można spotkać się również z plikiem vmlinux (bez “z” na końcu). Jaka jest różnica?

  • vmlinux: To surowy, nieskompresowany, niebootowalny obraz jądra. Zawiera on wszystkie symbole debugowania i jest w formacie ELF. Jest ogromny w porównaniu do vmlinuz i używa się go głównie do debugowania i analizy jądra za pomocą narzędzi takich jak gdb czy crash.
  • vmlinuz: To skompresowana i “oczyszczona” wersja vmlinux, przygotowana specjalnie do uruchamiania systemu.

Proces tworzenia vmlinuz z vmlinux polega na usunięciu zbędnych informacji, kompresji i dodaniu małego kodu startowego odpowiedzialnego za dekompresję.

Ciekawostka #3: A co z bzImage?

Podczas kompilacji jądra, często używa się polecenia make bzImage. Wiele osób myśli, że bz oznacza kompresję bzip2. Nic bardziej mylnego!

Historycznie, pierwszy skompresowany obraz jądra nazywał się zImage (od “compressed Image” – “z” jak kompresja gzip). Miał on jednak ograniczenie – całe skompresowane jądro musiało zmieścić się w pierwszym 640 KB pamięci. Gdy jądro zaczęło rosnąć, stało się to problemem.

Wprowadzono więc format bzImage, gdzie bz oznacza “big zImage” (duży zImage), a nie bzip2. bzImage również używa kompresji gzip (lub nowszych, jak lzo, xz, lz4, zstd), ale dzięki innej organizacji pamięci, pozwala na ładowanie znacznie większych obrazów jądra.

Ciekawostka #4: vmlinuz vs bzImage — to samo?

Krótka odpowiedź: tak, praktycznie to to samo. Różnica jest tylko w nazewnictwie:

  • bzImage — to format i cel kompilacji (make bzImage). Wynikowy plik znajduje się w arch/x86/boot/bzImage.
  • vmlinuz — to nazwa pliku w katalogu /boot, pod którą instalator kopiuje skompilowany bzImage.

Gdy uruchamiasz make install po kompilacji jądra, skrypt instalacyjny kopiuje arch/x86/boot/bzImage do /boot/vmlinuz-<wersja>. To dosłownie ten sam plik, tylko pod inną nazwą.

Dlaczego dwie nazwy?

  • bzImage opisuje jak plik został zbudowany (format “big zImage” dla x86).
  • vmlinuz opisuje co to jest (skompresowane jądro z obsługą pamięci wirtualnej).

Nazwa vmlinuz jest bardziej uniwersalna — używana niezależnie od architektury. Na ARM czy RISC-V nie ma “bzImage”, ale /boot/vmlinuz nadal istnieje.

Można to zweryfikować

# Po kompilacji jądra, porównaj pliki:
cmp arch/x86/boot/bzImage /boot/vmlinuz-$(uname -r)
# Jeśli nic nie wypisze — pliki są identyczne

# Sprawdź typ kompresji vmlinuz:
file /boot/vmlinuz-$(uname -r)
# Przykładowy wynik: Linux kernel x86 boot executable bzImage, version 6.5.0...

Krótkie podsumowanie:

  • vmlinux — surowy, nieskompresowany obraz jądra (do debugowania)
  • zImage — stary format skompresowany, limit ~512 KB
  • bzImage — nowoczesny format “big zImage” (cel make bzImage)
  • vmlinuz — nazwa pliku w /boot — zazwyczaj kopia bzImage