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_shell
2를 지정 하면 디버그 셸 서비스 "debug-shell.service
"가 부팅 트랜잭션에 포함되고 초기 부팅 중에 디버그 셸이 생성됩니다. 기본적으로/dev/tty9
이것이 사용되지만 접두어 유무에 관계없이 특정 tty를 설정할 수도 있습니다/dev/
. [...]rd.systemd.debug_shell
초기 RAM 디스크(initrd)와systemd.debug_shell
메인 시스템에서만 존중됩니다.
따라서 가장 먼저 할 수 있는 일은 커널 명령줄에 다음 매개변수를 추가하는 것입니다 single systemd.debug_shell
. 이는 (기본값)에서 시작되며 bash
키 tty9
를 눌러 해당 위치로 이동할 수 있습니다 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=...
특정 시스템 구현에 따라 실제 쉘을 얻으려면 루트 비밀번호가 필요할 가능성이 높습니다.
두 번째 해결 방법에 대한 참고 사항
다시 한 번 initrd
init 프로세스와주인초기화 과정. 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.