Jak przepisać linki initrd.img{,.old} i vmlinuz{,.old} z / do /boot/

Spis treści

Mając możliwość skonfigurowania EFI/UEFI na moim laptopie, postanowiłem jak najbardziej się za to przedsięwzięcie zabrać. Okazało się jednak, że w przypadku takiej dystrybucji linux'a jak Debian, to zadanie może być nieco problematyczne, zwłaszcza gdy chce się korzystać jedynie z menadżera rozruchu jakim jest rEFInd, czyli bez dodatkowego bootloader'a (grub/grub2/syslinux/extlinux) instalowanego bezpośrednio na dysku twardym i jednocześnie posiadając w pełni zaszyfrowany system (LUKSv2 + LVM). Rzecz w tym, że w takiej sytuacji w konfiguracji rEFInd trzeba podawać ścieżki bezpośrednio do plików initrd.img oraz vmlinuz (obecnych na partycji /boot/ ). W Debianie nazwy tych plików mają format initrd.img-x.x.x-x-amd64 i vmlinuz-x.x.x-x-amd64 . Za każdym razem, gdy wypuszczany jest nowy kernel, to ten numerek ( x.x.x-x ) ulega zmianie, co pociąga za sobą potrzebę ręcznego dostosowania konfiguracji rEFInd. Może i aktualizacje kernela w Debianie nie są jakoś stosunkowo częste ale może istnieje sposób, by ten problem z dostosowaniem konfiguracji rozwiązać?

Symboliczne linki do initrd.img i vmlinuz w /

Z reguły oprogramowanie mające na celu uruchomienie naszego linux'a jest w stanie bez większego problemu automatycznie dostosować konfigurację bootloader'a, tak by w przypadku aktualizacji kernela użytkownik nie musiał przeprowadzać żadnych dodatkowych czynności. Są jednak pewne specyficzne instalacje, np. wspomniany we wstępie w pełni zaszyfrowany system w konfiguracji EFI + rEFInd, gdzie dodatkowe kroki trzeba poczynić, by system działał nam jak należy. Czasami można jednak pewne rzeczy zautomatyzować. Przeglądając strukturę drzewa katalogów, można w katalogu root ( / ) natrafić na takie poniższe wpisy:

# ls -al /
...
lrwxrwxrwx   1 root   root           29 2020-02-14 17:22:18 initrd.img -> boot/initrd.img-5.4.0-4-amd64
lrwxrwxrwx   1 root   root           27 2020-02-24 00:37:53 initrd.img.old -> boot/initrd.img-5.4.0-3-amd64
...
lrwxrwxrwx   1 root   root           26 2020-02-14 17:22:18 vmlinuz -> boot/vmlinuz-5.4.0-4-amd64
lrwxrwxrwx   1 root   root           24 2020-02-24 00:37:53 vmlinuz.old -> boot/vmlinuz-5.4.0-3-amd64

Mamy tutaj linki symboliczne do plików kernela i obrazu initrd, które znajdują się w katalogu /boot/ . Podając ścieżki do tych dowiązań w konfiguracji bootloader'a, tj. do /vmlinuz zamiast bezpośrednio do /boot/vmlinuz-5.4.0-4-amd64 (i podobnie w przypadku obrazu initrd) można zaoszczędzić sobie trochę pracy w sytuacji, gdy kernel będzie aktualizowany -- ten link zostanie automatycznie przepisany i będzie wskazywał na odpowiedni plik w katalogu /boot/ .

Tworzeniem tych powyższych dowiązań do plików initrd.img oraz vmlinuz zajmuje się narzędzie linux-update-symlinks . Jest ono standardowo zainstalowane w każdym Debianie, zatem nie trzeba go dodatkowo wgrywać. Ten cały linux-update-symlinks jest wołany w skryptach maintainer'a ( postinst i postrm ) obecnych w paczkach kernela ( linux-image-*.deb ). Za każdym razem, gdy tylko instalowany/usuwany jest kernel, to wołane jest jedno z tych poniższych poleceń:

# linux-update-symlinks install $version $image_path
# linux-update-symlinks upgrade $version $image_path
# linux-update-symlinks remove  $version $image_path

W zasadzie to linux-update-symlinks przyjmuje trzy argumenty. Pierwszy z nich określa czy zamierzamy te linki stworzyć ( install ), zaktualizować ( upgrade ) lub usunąć ( remove ). Drugi argument określa wersję kernela (w formacie, który można uzyskać via uname -r ), natomiast trzeci parametr definiuje ścieżkę do pliku vmlinuz .

W standardowej konfiguracji, linux-update-symlinks stworzy nam dowiązania w katalogu / . Warto zaznaczyć tutaj, że nie podaje się nigdzie ścieżki do obrazu initrd ale mimo to link do niego zostanie stworzony poprawnie. Jeśli jednak tego typu zachowanie niezbyt nam się podoba i potrzebujemy tych dowiązań w innym katalogu, np. w /boot/ , to musimy to narzędzie sobie inaczej skonfigurować.

Jak tworzyć linki do initrd.img i vmlinuz w /boot/

W przypadku, gdy mamy do czynienia z w pełni zaszyfrowanym system, to te linki w / są dla nas praktycznie bezużyteczne. By się do nich dostać trzeba odszyfrować główny system plików, a by go odszyfrować, trzeba załadować pierw kernel. Z kolei zaś jeśli mamy załadowany kernel w pamięci RAM, to nie potrzebne nam są już linki. Możemy więc albo podawać pełne ścieżki do plików initrd.img-5.4.0-4-amd64 i vmlinuz-5.4.0-4-amd64 i edytować za każdym razem konfigurację rEFInd, albo też możemy dopisać poniższy parametr do pliku /etc/kernel-img.conf (jeśli plik nie istnieje, to trzeba go stworzyć):

link_in_boot = Yes

Zgodnie z man kernel-img.conf, parametr link_in_boot (jeśli ustawiony) ma za zadanie tworzyć linki w katalogu /boot/ . Warto jest sobie rzucić okiem na ten manual, bo w pliku /etc/kernel-img.conf opcji, których możemy określić, jest nieco więcej. Tak czy inaczej na nasze potrzeby wystarczy ta powyższa.

Od tego momentu, za każdym razem jak tylko nowy kernel będzie instalowany w systemie, to te linki będą już tworzone w katalogu /boot/ i o takie zachowanie nam cały czas chodziło.

Ręcznie tworzenie linków

Jeśli z jakiegoś powodu zajdzie potrzeba, by linki do plików initrd.img i vmlinuz stworzyć samodzielnie, to poniżej jest przykładowe polecenie, którym możemy się posłużyć (pamiętajmy by odpowiednio dobrać numerki):

# linux-update-symlinks install 5.4.0-4-amd64 /boot/vmlinuz-5.4.0-4-amd64
I: /boot/vmlinuz.old is now a symlink to vmlinuz-5.4.0-3-amd64
I: /boot/initrd.img.old is now a symlink to initrd.img-5.4.0-3-amd64
I: /boot/vmlinuz is now a symlink to vmlinuz-5.4.0-4-amd64
I: /boot/initrd.img is now a symlink to initrd.img-5.4.0-4-amd64

Dla pewności możemy jeszcze sprawdzić, czy aby na pewno te linki zostały utworzone w pożądanej przez nas lokalizacji:

$ ls -al /boot/ | egrep  "vmlinuz|initrd"
lrwxrwxrwx  1 root root       22 2020-03-01 15:18:21 initrd.img -> initrd.img-5.4.0-4-amd64
-rw-r--r--  1 root root 39127233 2020-02-14 17:23:07 initrd.img-5.4.0-3-amd64
-rw-r--r--  1 root root 16005450 2020-03-01 14:41:38 initrd.img-5.4.0-4-amd64
lrwxrwxrwx  1 root root       24 2020-03-01 15:18:21 initrd.img.old -> initrd.img-5.4.0-3-amd64
lrwxrwxrwx  1 root root       19 2020-03-01 15:18:21 vmlinuz -> vmlinuz-5.4.0-4-amd64
-rw-r--r--  1 root root  5627632 2020-02-13 06:14:49 vmlinuz-5.4.0-3-amd64
-rw-r--r--  1 root root  9331760 2020-02-26 09:38:52 vmlinuz-5.4.0-4-amd64
lrwxrwxrwx  1 root root       21 2020-03-01 15:18:21 vmlinuz.old -> vmlinuz-5.4.0-3-amd64

A co ze starymi linkami w /

No jak widać wyżej, linki są już obecne na partycji /boot/ i wskazują na odpowiednie pliki. Niemniej jednak, stare linki w / są nadal dostępne, mimo, że system już raczej nie powinien sobie nimi głowy zawracać. Nieaktualne linki w / mogą być przyczyną późniejszych problemów, dlatego też przydałoby się te linki zwyczajnie usunąć. Możemy to zrobić poniższym poleceniem:

# rm /vmlinuz /initrd.img /initrd.img.old /vmlinuz.old
Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.