Arch Linux에서 /bin/init -> /lib/systemd/systemd 대신 /bin/init -> ../lib/systemd/systemd를 사용하는 이유는 무엇입니까?

Arch Linux에서 /bin/init -> /lib/systemd/systemd 대신 /bin/init -> ../lib/systemd/systemd를 사용하는 이유는 무엇입니까?

저는 리눅스를 배우고 있어요. 커널이 부팅 프로세스를 통해 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.

우분투의 초기 초기화가 어떤 용도로 사용되는지 모르겠습니다. 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

추신: 제가 을 가리키고 있지 않더라도 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

관련 정보