저는 리눅스를 배우고 있어요. 커널이 부팅 프로세스를 통해 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
.
우분투의 초기 초기화가 어떤 용도로 사용되는지 모르겠습니다. 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
추신: 제가 을 가리키고 있지 않더라도 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