私はLinuxを学んでいます。カーネルが起動プロセスを介してinitを呼び出すかどうかをテストするために、
sudo rm /sbin/init
そして再起動してください。予想通り、Ubuntu
/sbin/init が存在せず、起動に失敗しました。その後、問題を解決するために起動可能なUSBを使用してインストールし、chroot ...最後に再びシンボリックリンクを指定しました。
ln -s /lib/systemd/systemd /sbin/init
再起動しました。Ubuntu
起動が再び成功しました。
しかし、Arch
上記のように動作しません。これをどのように説明しますか? (ArchとUbuntuはどちらもsystemd
initとして使用するため、それぞれパーティションにインストールしました。)
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/systemd
initramfs / 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/lib
usr/lib
/tmp/sbin/inita
/tmp/usr/bin/inita
/lib/systemd/systemd
/usr/lib/systemd/systemd