Arch Linuxで/bin/init -> /lib/systemd/systemdの代わりに/bin/init -> ../lib/systemd/systemdを使用するのはなぜですか?

Arch Linuxで/bin/init -> /lib/systemd/systemdの代わりに/bin/init -> ../lib/systemd/systemdを使用するのはなぜですか?

私はLinuxを学んでいます。カーネルが起動プロセスを介してinitを呼び出すかどうかをテストするために、

sudo rm /sbin/init

そして再起動してください。予想通り、Ubuntu/sbin/init が存在せず、起動に失敗しました。その後、問題を解決するために起動可能なUSBを使用してインストールし、chroot ...最後に再びシンボリックリンクを指定しました。

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

再起動しました。Ubuntu起動が再び成功しました。

しかし、Arch上記のように動作しません。これをどのように説明しますか? (ArchとUbuntuはどちらもsystemdinitとして使用するため、それぞれパーティションにインストールしました。)

Root device mounted successfully, but /sbin/init does not exist.(Archから/ sbin / initを削除した後、ERROR:I did it as rootとして表示されます)

解決する: 存在するArch

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

(terdonに感謝)

答え1

私は次のことを考えました:

$ 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がデフォルトで使用する「初期」init(スクリプト)で次の行を見てください。

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

/(ルート)とは、ルート切り替えの前と後がまったく異なることを指します。

単純な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単にorを使用します。/usr/bin/init/lib/systemd/systemd/usr/lib/systemd/systemd

PS systemdフックを使用すると、コピー(実際のルートにある)がusr/lib/systemd/systemdinitramfs / initcpio.confに追加されるためです。 (確認するにはあまりにも怠惰な)lib -> usr/libシンボリックリンクも含まれていると、(sbin/init)が指していても(前述のramfs / tmpfsで)終了usr/bin/initします。理由を理解できることを確認してください。)usr/lib/systemd/systemd/lib/systemd/systemd//lib/systemd/systemd

PS:私が指していないとしても、私のrealpath /tmp/sbin/initaテストで理由が気になるかもしれません。理由は、whichがwhichで解決される点で解決されることです。/usr/lib/systemd/systemd/tmp/libusr/lib/tmp/sbin/inita/tmp/usr/bin/inita/lib/systemd/systemd/usr/lib/systemd/systemd

関連情報