첫 번째 솔루션

첫 번째 솔루션

systemd가 활성화된 시스템에서 쉘을 시작하는 것과 동등한 방법은 무엇입니까?

sysinit/grub에서는 루트 파일 시스템을 마운트하여 커널에 rw전달하고 선택적으로 실행 레벨 1로 설정합니다.init=/bin/bash

systemd/bootd 시스템에는 루트(luks, lvm 등)를 올바르게 마운트할 수 있는 모든 옵션이 있으며 에 설치되었지만 커널로 /sysroot전달된 다음 부팅 시 "루트 전환" 단계에서 전달되는 것을 볼 수 있습니다. init=/sysroot/bin/bash single실패하다. 문서에서 init 이전에 어떤 일이 발생해야 하는지(이후에 발생하면 쉘로서의 init가 프로세스를 일시 중지하지 않습니까?)

답변1

첫 번째 솔루션

매뉴얼 페이지에서systemd-debug-generator:

systemd.debug_shell옵션 1 또는 rd.systemd.debug_shell2를 지정 하면 디버그 셸 서비스 " debug-shell.service"가 부팅 트랜잭션에 포함되고 초기 부팅 중에 디버그 셸이 생성됩니다. 기본적으로 /dev/tty9이것이 사용되지만 접두어 유무에 관계없이 특정 tty를 설정할 수도 있습니다 /dev/. [...] rd.systemd.debug_shell초기 RAM 디스크(initrd)와 systemd.debug_shell메인 시스템에서만 존중됩니다.

따라서 가장 먼저 할 수 있는 일은 커널 명령줄에 다음 매개변수를 추가하는 것입니다 single systemd.debug_shell. 이는 (기본값)에서 시작되며 bashtty9를 눌러 해당 위치로 이동할 수 있습니다 F9.

커널 매개변수에 다른 tty를 지정할 수 있습니다. 예를 들어 쉘은 첫 번째 가상 터미널(9번째가 아님 )systemd.debug_shell=tty1 에 나타나므로 전환할 필요가 없습니다.

1 이전 버전의 systemd에서는 systemd.debug_shell실제로 이름이 지정되었습니다 systemd.debug-shell(밑줄 대신 하이픈에 주목). 이 매개변수의 이름이 컴퓨터에서 어떻게 지정되는지 확인하려면 systemd-debug-generator컴퓨터의 매뉴얼 페이지를 읽어보세요.
2 또한 이 답변에서 더 자세히 언급하겠습니다 rd.systemd.debug_shell(또는 rd.systemd.debug-shell이전 의견이 여기에도 적용되므로).

두 번째 해결책

자신의 솔루션을 수정하여 작동하게 하려면 사용 init=/bin/bash하고 사용하지 않아야 합니다 init=/sysroot/bin/bash(설명이 이어집니다).

또한 다음에 나오는 모든 내용은 init=명령의 일부가 됩니다. 이는 init=/bin/bash single명령이 실제로 실행을 시도한다는 의미입니다 /bin/bash single. 따라서 init=매개변수는 명령줄 끝에 있어야 합니다.

이와 관련하여 커널 명령줄에서 초기화를 변경하는 경우 single매개변수를 전혀 추가할 필요가 없습니다. single이 매개변수는 다음으로 구성됩니다.석사실제 systemd(initrd의 systemd와 반대), 그러나 init를 /bin/bash다음으로 변경하면대신에호스트 systemd이므로 single이 매개변수는 전혀 사용되지 않습니다.

single단일 모드("복구" 모드와 동일)로 시스템을 부팅하는 대신 사용할 수 있지만 init=...특정 시스템 구현에 따라 실제 쉘을 얻으려면 루트 비밀번호가 필요할 가능성이 높습니다.

두 번째 해결 방법에 대한 참고 사항

다시 한 번 initrdinit 프로세스와주인초기화 과정. initrd자체 초기화(귀하의 경우 ) 가 있고 systemd완료되면 실행됩니다.주인실제로는 초기화입니다.

이 "초기화" 단계가 발생합니다.뒤쪽에initrd가 완료되었습니다. systemd내부적으로 실행될 때 initrd이는 정확히 /root()를 로 전환하는 단계 입니다 /sysroot.

맨 페이지에서 볼 수 있습니다.systemctl:

switch-root[뿌리[내부에]]

다른 루트 디렉터리로 전환하고 그 아래에서 새 시스템 관리자 프로세스를 실행합니다. 이는 initrd시스템 관리자 프로세스를 initrd(" init" 프로세스라고도 함, PID 1)에서 실제 호스트 루트 파일 시스템에서 로드된 기본 시스템 관리자 프로세스로 변환 하는 데 사용됩니다 . 이 호출에는 새 루트 디렉터리가 될 디렉터리와 그 아래에 PID 1로 실행될 새 시스템 관리자 바이너리에 대한 경로라는 두 가지 매개 변수가 필요합니다. 둘 다 생략되거나 전자가 빈 문자열인 경우 기본값은 입니다 /sysroot/.

그래서 실행을 시도할 것입니다./sysroot/bin/bash 기간루트 디렉터리를 전환할 때 "루트 디렉터리 전환" 단계도착하다 /sysroot(실제 파일 시스템이 포함됩니다) 그 시점에서는 /sysroot루트 파일 시스템( )이 되므로 더 이상 존재하지 않습니다 /.

직접 확인해보세요

직접 디버깅하고 관찰할 수 있습니다. 커널 명령줄에 rd.systemd.debug_shell매개변수를 추가하면 다음을 얻을 수 있습니다.초기화 프로그램로그를 볼 수 있는 가상 터미널 번호 9( )에서 F9셸을 실행하면 /run/initramfs/rdsosreport.txt무슨 뜻인지 알 수 있습니다(두 번째 줄 참고).

[    4.673024] host systemd[1]: Starting Switch Root...
[    4.679521] host systemctl[509]: Failed to switch root: Could not resolve init executable /sysroot/bin/bash: No such file or directory
[    4.679968] host systemd[1]: initrd-switch-root.service: Main process exited, code=exited, status=1/FAILURE
[    4.680097] host systemd[1]: initrd-switch-root.service: Failed with result 'exit-code'.
[    4.680546] host systemd[1]: Failed to start Switch Root.

관련 정보