/ etc / inittab (한국어)
On 2월 12, 2021 by admin 다음 /etc/inittab
파일 (systemv)을 사용하고 있습니다.
# /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin # /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin S0:12345:respawn:/sbin/getty -L 115200 ttyS0
실제로 작동하는 방식을 이해하기 위해 1-3에 대한 답변을 “감사합니다.”두 가지 상황을 구분할 수 있습니다.
- 직렬 포트를 사용하여 시스템에 연결되어 있습니다.
- “일반”데스크탑 PC가 있습니다.
질문 :
-
다른 getty 라인을 추가하면 Linux를 시작하면 두 개의 별도 터미널이 표시됩니까?
-
게티 라인을 여러 개 열면 어떻게 할당합니까? getty는 내
si::sysinit:/etc/init.d/rcS
명령을 실행하고 어떤 getty가 다른 스크립트의 명령을 실행합니까? (시스템 실행 수준에 따라 스크립트를 실행하는 명령)in 즉,
/etc/inittab
파일에서-다른 getty에 다른 명령을 할당 할 수 있습니까? (이 getty에 의해 열리는 터미널을 의미합니다) -
/etc/init.d/rc5 폴더의 마지막 스크립트 실행 다음 명령 :
su nobody -c /bin/sh
출력은 다음과 같습니다.
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
그래서 확인했습니다. 나는 아무도 아니지만 왜 처음 두 줄을 쓰나요? 또한 프롬프트가 sh-4.3 $이고 nobody @가 아닌 이유 …
-
직렬 연결을 사용하고 있습니다. / etc / inittab 파일과 마지막 스크립트를 변경할 수 있습니까? 다음을 위해 init에 의해 실행됩니다.
- 낮은 권한이있는 사용자로 로그인하기 전에 프로그램을 실행합니다 (init 프로세스는 종료를 기다립니다)
- 프로그램이 종료되면 일반 내 시스템에 대한 로그인 프롬프트
- 낮은 권한이있는 사용자를 만들고 초기화 프로세스 중에이 프로그램을 실행할 수있는 가장 좋은 방법은 무엇입니까 (아무도 사용자를 사용하지 않으려는 경우)
답변
질문 1 :
예, 더 추가하여 getty
라인을 사용하면 더 많은 터미널을 병렬로 얻을 수 있습니다. 한 번에 하나의 터미널 장치와 하나의 getty
만 연결할 수 있으므로 직렬 포트 당 하나의 getty
만 가능합니다. 일반 데스크톱 PC에서 Linux 커널은 Control + Alt + FX 키 조합을 사용하여 액세스 할 수있는 여러 가상 콘솔을 정의합니다. /dev/ttyX
기기 (X = 숫자). 정확한 설정은 배포판마다 다를 수 있지만 일반적으로 주류 배포판에서는 처음 6 개 정도의 /dev/ttyX
장치에 getty
가 구성되어 있습니다. 시스템이 정상적으로 실행되고 있습니다. openvt
및 deallocvt
명령을 사용하여 가상 콘솔을 추가 또는 제거하고 프로세스를 시작할 수 있습니다 (
s).
/dev/tty0
는 특별합니다. 현재 선택된 가상 콘솔을 가리 킵니다. /dev/console
는 유사한 특수 장치로, 기본 커널 수준 시스템 콘솔로 정의 된 TTY 장치를 가리 킵니다. 데스크톱 시스템에서는 기본적으로 /dev/tty0
의 별칭이지만 console=
부팅 옵션을 사용하면 직렬로 전환 할 수 있습니다. 포트. 예를 들어. 일부 임베디드 아키텍처에서는 기본적으로 직렬 포트 일 수 있습니다. xconsole
와 같은 유틸리티는 /dev/console
에 대한 추가 출력 역할도 할 수 있습니다.
컴퓨터가 전용 컴퓨터 실에서 큰 다중 캐비닛이었던 경우 /dev/console
에 메시지를 보내는 것은 근무중인 시스템 운영자에게 연락하는 방법이었습니다. 예를 들어 요청에 유용했을 수 있습니다. 테이프 또는 디스크 팩을 변경하십시오. 최신 시스템에서 특별히 /dev/console
로 전송되는 메시지는 일반적으로 부팅 / 종료 메시지이거나 네트워크 또는 스토리지 액세스에 영향을 줄 수있는 오류 상태에 대한 긴급 경보를위한 마지막 수단 채널이거나 커널 크래시 포함 : “물리적 하드웨어 담당자가이를 확인해야하며 일반적인 로그 파일은 어떤 이유로 든 사용할 수 없습니다.”
질문 2 :
여기에 오해가 있으신 것 같습니다. sysinit
줄 및 기타 /etc/inittab
줄은 프로세스입니다. inittab
에서 실행되는 각 명령은 별도로 지정하지 않는 한 /dev/console
.
getty
행은 실제로 사용할 TTY 장치와 getty
프로세스를 지정합니다. 자체적으로 TTY 장치를 할당하는 코드가 내장되어 있으며 사용자가 셸을 실행하고 해당 스트림을 다른 방식으로 리디렉션하도록 선택하지 않는 한 /까지 모든 자식 프로세스.TTY 장치의 설정을 초기화하는 것은 getty
“의 목적에서 가장 큰 부분입니다. /etc/issue
및 로그인 프롬프트를 표시하고 사용자 이름, TERM 환경 변수 설정 및 TTY 로그인 프로세스의 다음 단계 시작 (일반적으로 /bin/login
이지만 사용자 정의 가능)은 사실상 사소한 부분 일뿐입니다.
TTY 장치의 경우 inittab
행의 첫 번째 열에있는 2 자 ID 필드가 /dev/tty
프리픽스이므로 /dev/ttyS0
는 S0
등의 inittab 라인 ID를 가져옵니다. TTY와 반드시 관련이있는 것은 아닙니다 (또는 필요한 경우 긴급 상황을 / dev / console에 출력 함). ID는 TTY 장치 라인 ID와 충돌하지 않는 모든 것이 될 수 있습니다.
(뒤로 직렬 연결 터미널이 아니었던 날 rm, 라인의 다른 쪽 끝에서 터미널에 대한 TTY 장치 설정을 가져오고 해당 터미널을 알려진 로그인 상태로 재설정하는 것은 많은 경쟁 터미널 유형 표준이 있었기 때문에 사소한 작업이 아닙니다.)
스크립트를 실행하도록 inittab
줄을 구성하면 예를 들어 특정 /dev/ttyX
가상 콘솔이 있는지 확인할 수 있습니다. 장치가 있습니다. 그렇지 않은 경우 openvt -c X <command>
를 사용하여 가상 콘솔을 만들고 여기에서 명령을 시작할 수 있습니다. 가상 콘솔 장치가 이미 존재하는 경우 표준 입력, 출력 및 오류를 리디렉션하여 원하는 명령을 간단히 시작할 수 있습니다. 예를 들어 다음과 같은 inittab 행을 지정할 수 있습니다.
6:345:respawn:/usr/local/sbin/myscript
다음과 같은 형식으로 /usr/local/sbin/myscript
( 면책 조항 : 테스트되지 않았습니다. 현재 SysVinit이 포함 된 시스템이 없습니다. 개선 할 수 있으면 언제든지 편집하십시오.
#!/bin/sh if [ -c /dev/tty6 ]; then exec <some command> </dev/tty6 >/dev/tty6 2>&1 else exec openvt -c 6 -w <some command> fi
inittab 행의 div id = “cd7ced2b0a”>
는 어떤 이유로 든 프로세스가 종료 될 경우 프로세스가 자동으로 다시 시작되도록합니다.345
는이 프로세스를 실행해야하는 SysVinit 실행 수준 목록입니다. 모든 일반 실행 수준에서 실행해야하는 경우12345
를 입력하십시오.
참고, inittab 행이 sysinit
행 뒤에있는 경우에만 의도 한대로 작동하므로 udev
초기화가 완료된 것으로 간주 할 수 있습니다. 초기화 프로세스 초기에이 작업을 수행하려면 먼저 드라이버가 이미로드 된 장치에 대한 실제 장치 노드를 만들어야합니다. udev
가 실행되면 장치 드라이버가 초기화 될 때 장치 노드가 자동으로 생성됩니다.
직렬 포트를 사용하는 경우 openvt
명령은 적용되지 않습니다.
예, 확실히 다른 TTY 장치에 다른 명령을 연결할 수 있습니다. 명령에 getty
와 같은 기능이 내장되어 있으면 도움이되지만 스크립팅으로도 수행 할 수 있습니다.
(사용하지 않는 가상 콘솔에서 일부 로그를 영구적으로보기 위해 단순한 tail -f
보다 더 복잡한 것을 설정 한 경우 man setsid
계획중인 작업에 적용 가능한지 확인하십시오.)
질문 3 :
TTY 세션 초기화에는 더 많은 것이 있습니다. su
로 쉘을 시작하는 것보다 루트가 아닌 특정 사용자에게 적합합니다.
오류 메시지
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
는 특정 TTY 장치가 아닌 /dev/console
장치에 의해 연결된 셸로 인해 발생할 수 있습니다. /dev/console
는 현재 시스템 콘솔에 대한 별명은 “사용할 수있는 TTY 제어 ioctl 기능의 전체 세트를 갖지 않습니다.
PS1
환경 변수에 더 유용한 값을 할당 할 로그인 스크립트가없는 경우 /bin/sh
는 간단히 sh-<version>$
일 수 있습니다.
질문 4 :
예, 가능합니다. inittab
에 “마지막 스크립트”를 wait
유형 줄로 지정하고 앞 에 배치해야합니다. 직렬 회선에 해당하는 getty
회선입니다.
환경에 대한 자세한 내용을 알지 못하면 어느 것이 m 이러한 목적을 위해 권한이 낮은 사용자를 만드는 가장 좋은 방법은 입니다.
댓글
답변
-
예. 고유 식별자가 제공되고 구성된 터미널 라인을 사용할 수 있습니다.
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
ttyS1
. -
inittab
의 줄은 순차적이거나 로그인과 관련이 없습니다. 각 행은 주어진 런레벨 세트에서 취해야 할 조치를 설명합니다. 따라서si::sysinit:/etc/init.d/rcS
는 시스템 초기화를 처리 할 때init
가/etc/init.d/rcS
를 실행하도록 지정합니다. 이것은 로그인이 가능하기 전에 발생합니다. (자세한 내용은inittab(5)
맨 페이지 참조).다른 명령에 다른 명령을 할당하려면
getty
특정 터미널에서getty
호출 자체를 구성합니다 (예 :login
프로그램이 시작됩니다 (대부분의getty
구현의-l
옵션) :S0:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t0-login ttyS0 S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-login ttyS1
-
/etc/init.d/rc 5
는 로그인이 가능하기 전에 실행되며 실행되는 프로그램은 터미널에 연결되지 않습니다 ( “적절하게”,getty
가하는 일입니다 – 터미널을 열고 시작하는 프로그램을 연결합니다.) 따라서su nobody -c /bin/sh
가 호출되면 셸이 예상 한 터미널 설정을 찾지 못해 결과적으로 작업 제어를 비활성화합니다.sh-4.3$
프롬프트는/bin/sh
로 실행될 때 Bash 4.3의 기본 프롬프트입니다. -
사용자가 로그인을 시작한 후에 만 프로그램을 실행해야하는 경우
getty
에서 사용하는 로그인 시퀀스에 연결할 수 있습니다. 그러나 그러한 프로그램은 루트로 실행됩니다. 정확히 무엇을 추구하는지에 따라/etc/inittab
사용자 지정 또는sudo
및 쉘의 시작 스크립트입니다.
댓글
- 재생 해 주셔서 감사합니다. 섹션 2에 관한 이메일 설명을 요청할 수 있습니까? 각 getty에 대한 로그인 명령을 어떻게 편집 할 수 있습니까?
- 완료, 업데이트 확인
- 감사합니다! 내가 올바르게 이해했는지 확인하기 위해 : 기본적으로 getty 프로세스는 시스템 로그인을 담당하는 프로세스를 실행하는 / bin / login 명령을 실행합니다. 이제 getty는 다른 명령, 내가 ‘ 선택할 모든 명령을 실행하고 이전과 같이 시스템 로그인 프로세스를 호출하지 않습니다 … 맞습니까?
- 예, 맞습니다. 핵심은
getty
가 TTY를 여는 것입니다. 정상적인 동작은 로그인 이름을 기다린 다음 TTY에 연결된login
를 실행하는 것입니다.login
는 암호를 기다렸다가 확인하고 TTY에 연결된 셸을 시작합니다.login
부분을 교체하는 경우 교체 프로그램이login
처럼 작동하는지 확인해야합니다. - 예를 들어 로그인 단계를 건너 뛰려면 사용자 이름이나 암호를 입력하지 않고 루트 사용자로 시스템을 열 수 있습니다. 다음을 사용할 수 있습니다. S0 : 12345 : respawn : / sbin / getty -L 115200 -l-/ bin / sh ttyS0 또는 다음을 사용할 수 있습니다. S0 : 12345 : respawn : / sbin / getty -L 115200 -l [my_script_path] ttyS0 및 내부 스크립트가 ‘-/ bin / sh 명령 및 기타를 실행할 것입니까?
Answer
잠시만 요 (긴!) 답변이 게시되었습니다. 나는 첫 번째가 아주 잘 설명한다고 말해야한다. 지금은 세 번째 요점에 대해 언급하고 싶습니다. 타이밍 문제가 아니라 “콘솔 더미”가 아니라 “실제 가상”tty를 제어하는 프로세스에 대한 문제입니다.
“작업 제어”로 셸을 시작하려면 먼저 ttyN을 설정해야합니다. “generic”명령은 getty
입니다. 그로부터 tty-something 당신은 쉘을 시작할 수 있습니다. 그 이후 뿐만 아니라.
창 관리자를 먼저 시작한 다음 xorg를 xinit와 함께 “부팅”하는 대신 xorg를 시도하는 것과 같습니다. 나는 생각한다. “세션 리더”.
왜냐하면
xx:12:...:program
그리고 반대로 :
aa:1:...:pr_1 bb:1:...:pr_2
… N : M 관계를 얻습니다 (남용하는 경우에도 엉망이됩니다. 각기 다른 프로그램을 가진 많은 RL). 당신은 그것으로 멀리 갈 수 있지만, 그 이후로 다른 종류의 RC- “표준”이 인계되었습니다. “Runcoms”. 이것으로 inittab은 단순 해 보이지만 모든 복잡성은이 스크립트에 있습니다.
하지만 inittab은 간단하고 정확 해 보입니다. 마지막 주석과 “z6″항목 만 …
당신의 “su nobody”는 “getty … ttyN”이 필요합니다. login
대신 su
이며 리스폰이 없습니다. 최소한 “부적절”이외의 다른 오류 메시지를 제공해야합니다.
결론 (두 번째 답변을 읽은 후) : “복잡한 init.d
시스템이 필요하지 않습니다. 원시 inittab은 충분히 유연합니다. 개념과 세부 사항이 맞습니다.
당신은 세 가지 런레벨을 설정할 수 있습니다 : 하나는 ttyN, 하나는 ttySN이고, 하나는 둘 다 시작하는 RL입니다. 부트 로더로 추가 할 수있는 부트 파라미터입니다. 귀하의 경우 “5”는 기본값 일뿐입니다. 커널, root = 및 초기화 할 런레벨을 선택합니다.
“respawn”액션은 sysvinit이 실제로 필요했던 것입니다. . 할 수없는 것이 훨씬 많고 스크립트에서 구현할 수있는 가능성이 적습니다. 그러나 “마지막”셸 수준을 종료 (또는 충돌)하는 경우 안전망이 필요합니다.
sysvinit은 “너무 빨리 생성됩니다-5 분 동안 무시합니다 …”라는 오류 메시지로 잘못된 구성을 감지 할 수도 있습니다.
getty
는 프로세스입니다. 당신이 말하는 것은 TTY 기기 입니다. 커널은 당신과 init 스크립트를 위해 첫 번째 것을 열었습니다./dev/console
는 ” 커널에서 열고 사용하는 첫 번째 TTY 기기의 별칭입니다. “. 사용자 계정에 TTY 장치에 대한 읽기 + 쓰기 액세스 권한이있는 경우 사용을 시작할 수 있지만 (getty
필요 없음), 다음을 설정하는 것이 좋습니다. 올바른 TERM 변수 :TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
또는TERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
는 8 번째 가상 콘솔에서top
명령을 시작합니다. 또는 두 번째 직렬 포트.getty
프로세스가있는 TTY 장치에서 프로세스를 실행하려고하면 엉망이됩니다. 입력 & 출력. 두 프로세스가 입력을 위해 싸우고 출력이 서로 섞이기 때문입니다.getty
프로세스는/etc/init.d/rc 5
및이 프로세스에서 시작된 모든 스크립트가 완료 된 후에 만 시작됩니다.