Ubuntu

為什麼 /bin/init -> ../lib/systemd/systemd 而不是 /bin/init -> /lib/systemd/systemd?

  • June 3, 2022

我正在學習Linux。為了測試核心是否會通過引導過程呼叫 init,我做了:

sudo rm /sbin/init

並重新啟動。正如我所料,Ubuntu由於 /sbin/init 不存在,因此無法成功啟動。然後,為了修復它,我使用了一個可啟動的 USB 來掛載 chroot …最後重新符號連結它:

ln -s /lib/systemd/systemd /sbin/init

重新啟動…我的Ubuntu啟動再次成功。

但是,它不能Arch以上述相同的方式工作。這要怎麼解釋?(Arch 和 Ubuntu 都systemd作為 init 使用,我只將它們分別安裝在一個分區中。)

(在 Arch 中刪除 /sbin/init 後,它顯示 ERROR: Root device mounted successfully, but /sbin/init does not exist.I did it as root)

解決:Arch

ln -s ../lib/systemd/systemd /sbin/init

(謝謝​​特頓)

我想到了:

$ ls -l /tmp/sbin
lrwxrwxrwx 1 tom tom 7 Jul 29 23:32 /tmp/sbin -> usr/bin
$ ls -l /tmp/lib
ls: cannot access '/tmp/lib': No such file or directory
$ ls -l /tmp/usr/
total 0
drwxr-xr-x 2 tom tom 80 Jul 29 23:34 bin
drwxr-xr-x 3 tom tom 60 Jul 29 23:34 lib
$ ls -l /tmp/usr/bin/
total 0
lrwxrwxrwx 1 tom tom 20 Jul 29 23:33 inita -> /lib/systemd/systemd
lrwxrwxrwx 1 tom tom 22 Jul 29 23:33 initb -> ../lib/systemd/systemd
$ ls -l /tmp/usr/lib/
total 0
drwxr-xr-x 2 tom tom 60 Jul 29 23:34 systemd
$ ls -l /tmp/usr/lib/systemd/
total 0
-rwxr-xr-x 1 tom tom 0 Jul 29 23:34 systemd
$ realpath /tmp/sbin/init{a,b}
/usr/lib/systemd/systemd
/tmp/usr/lib/systemd/systemd

然後看一下 Arch 預設使用的“早期”初始化(腳本)的這些行:

https://github.com/archlinux/mkinitcpio/blob/v30/init#L5

https://github.com/archlinux/mkinitcpio/blob/v30/init#L57

考慮/tmp在上面是/new_root。然後你應該明白為什麼使用它是錯誤的init(a) -> /lib/systemd/systemd

/(root)指的是在切換root之前和之後完全不同的東西。

在它只是一個 ramfs(或者實際上是 tmpfs?)之前,initramfs / initcpio 的內容被提取到其中。在它是用於“真正根”的文件系統之後(即安裝在 上的文件系統/new_root)。

由於檢查是在切換根之前完成的:

https://github.com/archlinux/mkinitcpio/blob/v30/init#L76

它不會找到/usr/lib/systemd/systemd

我不知道 Ubuntu 中的早期初始化到底是什麼。有可能它是 systemd (mkinitcpio 也允許您在 Arch 中這樣做。您只需要包含 systemd 鉤子。)可能 systemd 不會使用/sbin/init/usr/bin/init在真實根目錄中定位其副本,而是簡單地使用/lib/systemd/systemdor /usr/lib/systemd/systemd

PS 因為當你使用 systemd 鉤子時,usr/lib/systemd/systemd(在真正的根目錄中)的副本將被添加到 initramfs / initcpio。如果它還包括(我沒有費心檢查)一個符號lib -> usr/lib連結,即使它指向. (有一個原因,我刪除了所有路徑中的所有前導,但. 看看你是否能理解為什麼。)sbin/init``usr/bin/init``usr/lib/systemd/systemd``/lib/systemd/systemd``/``/lib/systemd/systemd

PS 你可能想知道為什麼realpath /tmp/sbin/inita在我的測試中/usr/lib/systemd/systemd即使我沒有/tmp/lib指向usr/lib. 原因是/tmp/sbin/inita解析成/tmp/usr/bin/inita哪個點/lib/systemd/systemd解析到哪個點/usr/lib/systemd/systemd

引用自:https://unix.stackexchange.com/questions/660362