Linux 커널 initramfs에서 셸에 대한 tty 액세스를 활성화하는 데 필요한 구성은 무엇입니까?

Linux 커널 initramfs에서 셸에 대한 tty 액세스를 활성화하는 데 필요한 구성은 무엇입니까?

예를 들어 에코되면 arm64 플랫폼의 /dev/ram0에 로드된 Linux initramfs에 직렬 콘솔 터미널의 출력이 표시되지만, 예를 들어 를 사용하여 /init 스크립트에서 이 쉘을 시작하거나 echo "serial tx to ttyAMA0" > /dev/ttyAMA0쉘에 연결되지 않습니다.shbash/bin/busybox sh

커널 명령줄:
root=/dev/ram0 rw earlyprintk console=ttyAMA0,115200 console=tty0,115200 initcall_debug=1

(사용자 프로그램의 직렬 포트 프롬프트와 상호 작용하려는 유일한 성공적인 시도는 /bin/busybox getty 115200 ttyAMA0로그인 프롬프트를 표시하고 키보드 문자 입력에 반응하며 getty구성이 활성화되지 않았기 때문에 직렬 포트 ttyAMA0에 "로그인 오류"를 인쇄하는 터미널을 사용하는 것이었습니다. 왜냐하면 이는 시작 시 유지 관리/구조 쉘에 필요하지 않기 때문에 지정된 사용자 계정에 로그인할 수 있는 방법이 없기 때문입니다. "정상적인" 쉘 터미널 액세스가 있는 유일한 프롬프트는 /sbin/tty"tty가 아닌" Screen쉘 에 응답하는 명령입니다. 버전을 시도했지만 initramfs에 대한 직렬 명령줄 액세스를 활성화할 수 없습니다. 제가 아는 한 장치 트리에서 tty 리디렉션을 변경할 필요도 없고 불가능하지만 포괄적인 솔루션을 제공하는 www 검색 엔진에 대한 설명이 없습니다. 이 문제에 대한 "유사한 질문" 중 어느 것도 이에 대한 해결책을 제안하지 않았습니다.minicomshbash

조정 후최소 initramfs지금까지의 예제는 직렬 터미널에 액세스하지 않고도 테스트되었습니다.

감사해요

답변1

커널 부팅 옵션을 사용하십시오:

console=ttyAMA0,115200 console=tty0,115200

커널은 메시지를 직렬 포트 ttyAMA0( tty0일반 Linux KVM 콘솔)로 출력합니다.

그러나 첫 번째 프로세스가 시작되면 표준 입력이기 때문에 두 개의 별도 TTY 장치를 가질 수 없습니다(표준 출력 및 표준 오류도 마찬가지입니다). 모든 프로세스와 마찬가지로 최대 1개의 stdin, 1개의 stdout 및 1개의 stderr만 가질 수 있습니다. 장치는 다음과 같습니다메인 콘솔, 그리고 다음과 같이 구성된다.마지막 console=커널 명령줄의 옵션.

/initinitramfs에 스크립트가 있는 경우 스크립트가 실행하는 명령은 기본 콘솔을 상속합니다.오직이는 스크립트가 명시적으로 다른 장치를 할당하지 않는 한 표준 입력/출력/오류 역할을 합니다.

따라서 문제에 대한 가장 간단한 해결책은 console=옵션을 역순으로 지정하는 것입니다.

console=tty0 console=ttyAMA0,115200

(실제로 전송 속도는 직렬 포트 연결을 포함하지 않기 때문에 지정할 필요가 없습니다 tty0. 그러나 지정해도 아무런 해가 없습니다.)

답변2

해결됨xuancong84의 답변비슷한 질문에 대해:
setsid sh -c 'exec sh </dev/ttyAMA0 >/dev/ttyAMA0 2>&1'

관련 정보