/etc/inittab 이해

/etc/inittab 이해

/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에 대한 답변이 두 경우를 구별할 수 있다면 감사하겠습니다.

  1. 직렬 포트를 사용하여 시스템에 연결합니다.
  2. 나는 "일반" 데스크탑 컴퓨터를 가지고 있습니다.

질문:

  1. 다른 getty 라인을 추가하면 Linux가 시작되면 두 개의 별도 터미널이 표시됩니까?

  2. 여러 줄의 getty를 여는 경우 어떤 getty가 내 si::sysinit:/etc/init.d/rcS명령을 실행할지, 어떤 getty가 다른 스크립트의 명령을 실행할지 어떻게 지정합니까? (시스템 실행 레벨에 따라 스크립트를 실행합니다)

    즉, /etc/inittab파일에서 - 다른 gettys에 다른 명령을 할당할 수 있습니까? (내 말은 getty가 열리는 터미널을 의미합니다)

  3. /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
    

    그래서 아무나 아닌걸 확인했는데 처음 두줄은 왜 쓰는 걸까요? 그리고 왜 프롬프트는 none@ 대신 sh-4.3$입니다...

  4. 직렬 연결을 사용하고 있습니다. /etc/inittab 파일과 init가 실행될 마지막 스크립트를 다음과 같이 변경할 수 있습니까?

    1. 낮은 권한의 사용자로 로그인하기 전에 프로그램을 실행하십시오(init 프로세스는 종료될 때까지 기다립니다).
    2. 프로그램이 종료된 후 내 시스템은 일반적인 로그인 프롬프트를 받습니다.
    3. 권한이 낮은 사용자를 생성하고 init 프로세스 중에 프로그램을 실행하게 하는 가장 좋은 방법은 무엇입니까(무인 사용자를 사용하고 싶지 않은 경우)

답변1

질문 1:

예, 더 많은 와이어를 추가하면 getty더 많은 병렬 터미널을 얻을 수 있습니다. 한 번에 getty하나의 최종 장치만 연결할 수 있으므로 getty직렬 포트당 하나만 연결할 수 있습니다. 일반 데스크톱 PC에서 Linux 커널은 Control+ Alt+ FX키 조합을 사용하여 액세스할 수 있고 /dev/ttyX장치(X = 숫자)에 해당하는 여러 가상 콘솔을 정의합니다 . 정확한 설정은 배포판마다 다를 수 있지만 일반적으로 주류 배포판에서는 시스템이 /dev/ttyX제대로 실행될 때 처음 6개 정도의 장치가 시스템에 대해 구성됩니다. 및 명령을 getty사용하여 가상 콘솔을 추가 또는 제거하고 해당 콘솔에서 프로세스를 시작할 수 있습니다(반드시 프로세스일 필요는 없지만 모든 프로세스일 수 있음 ).openvtdeallocvtgetty

/dev/tty0오히려 특별합니다. 현재 선택된 가상 콘솔을 나타냅니다. /dev/console기본 커널 수준 시스템 콘솔로 정의된 모든 TTY 장치를 가리키는 유사한 특수 장치입니다. 데스크톱 시스템에서는 실제로 기본적으로 별칭이지만 부팅 옵션을 /dev/tty0사용하여 console=직렬 포트로 전환할 수 있습니다. 예를 들어 일부 임베디드 아키텍처에서는 기본적으로 직렬 포트일 수 있습니다. 이와 같은 유틸리티 xconsole/dev/console.

컴퓨터가 전용 컴퓨터실에 있는 대형 다중 캐비닛 장치인 경우 메시지를 보내는 것은 /dev/console컴퓨터 근처에 근무하는 시스템 운영자에게 연락하는 방법이며, 이는 테이프나 디스크 팩 변경과 같은 요청에 유용할 수 있습니다. 최신 시스템에서 구체적으로 전송되는 메시지는 /dev/console부팅/종료 메시지이거나 네트워크나 저장소 액세스에 영향을 미치거나 심지어 커널 충돌과 관련된 오류 조건에 대해 긴급 경고를 발행하는 최후의 수단일 수 있습니다. "시스템의 물리적 하드웨어 요구 사항을 담당하는 사람 이것을 보려면 어떤 이유로 인해 일반적인 로그 파일을 사용할 수 없습니다."


질문 2:

여기서 오해가 있으신 것 같습니다. 이 sysinit생산 라인과 다른 생산 라인은 /etc/inittab프로세스와 전혀 관련이 없습니다. 달리 명시하지 않는 한, getty에서 실행되는 각 명령에는 표준 입력, 출력 및 오류 스트림이 연결되어 있습니다.inittab/dev/console

getty줄은 실제로 사용할 TTY 장치를 지정하며 프로세스에는 getty사용자가 셸을 실행하고 그렇지 않으면 해당 스트림을 리디렉션하도록 선택하지 않는 한 해당 TTY 장치를 자체 및 모든 하위 프로세스에 할당하는 코드가 내장되어 있습니다. TTY 장치 설정을 초기화하는 것은 getty그 목적의 가장 큰 부분입니다. 로그인 프롬프트 표시 , 사용자 이름 승인, TERM 환경 변수 설정 및 TTY 로그인 프로세스의 /etc/issue다음(일반적이지만 사용자 정의 가능) 단계 시작은 작은 부분에 불과합니다. /bin/login무엇이 효과적인지.

inittabTTY 장치의 경우 행의 첫 번째 열에 있는 두 문자 ID 필드가 접두사 뒤의 문제 TTY 장치 이름과 일치 /dev/tty해야 /dev/ttyS0inittab 행 ID S0등을 얻을 수 있다는 규칙이 있습니다. TTY와 전혀 연관될 필요가 없는 콘텐츠(또는 원하는 경우 긴급 콘텐츠를 /dev/console에 출력)의 경우 ID는 TTY 장치 회선 ID와 충돌하지 않는 모든 것이 될 수 있습니다.

(직렬 연결된 터미널이 표준이었던 시절에는 회선 반대편 터미널에 대한 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

respawninittab줄은 어떤 이유로든 프로세스가 종료되면 자동으로 다시 시작되도록 보장합니다. 345이 프로세스가 실행되어야 하는 SysVinit 실행 수준의 목록입니다. 모든 일반 런레벨에서 실행하려면 를 입력하십시오 12345.

sysinitinittab 줄이 이 줄 뒤에 배치된 경우에만 예상대로 작동하므로 초기화가 udev완료된 것으로 가정 할 수 있습니다. 초기화 프로세스 초기에 이 작업을 수행하려면 먼저 드라이버가 로드된 장치에 대한 실제 장치 노드를 만들어야 할 수 있습니다. 일단 udev실행되면 장치 드라이버가 초기화될 때 자동으로 장치 노드가 생성되어야 합니다.

직렬 포트를 사용하는 경우 이 openvt명령은 적용되지 않습니다.

그렇습니다. 다양한 TTY 장치에 다양한 명령을 연결할 수 있습니다. 명령에 s와 같은 기능이 내장되어 있으면 도움이 되지만 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

/dev/console특정 TTY 장치가 아닌 장치와 연결된 셸로 인해 발생할 수 있습니다 . 이는 현재 시스템 콘솔의 별칭일 뿐이 므로 /dev/console사용 가능한 전체 TTY 제어 ioctl 기능 세트가 없습니다.

PS1환경 변수에 더 유용한 값을 할당하는 로그인 스크립트가 없으면 기본 프롬프트는 /bin/sh간단할 수 있습니다 sh-<version>$.


질문 4:

그래 넌 할수있어. "마지막 스크립트"를 wait-type 행 으로 지정 inittab하고 다음 위치에 배치 해야 합니다.앞으로getty직렬 회선에 해당하는 회선입니다.

귀하의 환경에 대한 자세한 내용을 알지 못하면 어느 환경인지 말하기가 어렵습니다.최고이 목적을 위해 낮은 권한의 사용자를 생성하는 방법입니다.

답변2

  1. 예, 회선에 고유 식별자가 부여되고 구성된 터미널 회선을 사용할 수 있다고 가정합니다.

    S1:12345:respawn:/sbin/getty -L 115200 ttyS1
    

    연결된 직렬 포트에 터미널이 열립니다 ttyS1.

  2. 의 행은 inittab연속적이지 않으며 로그인과 관련이 없습니다. 각 줄은 주어진 런레벨 세트 내에서 수행할 작업을 설명합니다. 따라서 si::sysinit:/etc/init.d/rcS시스템 초기화를 처리하는 동안 사양을 실행해야 합니다 init. /etc/init.d/rcS이는 로그인이 가능하기 전에 발생합니다. (바라보다inittab(5)맨페이지더 알아보기).

    getty특정 터미널의 다른 에 다른 명령을 할당하려면 getty호출 자체를 구성할 수 있습니다. 예를 들어 호출이 login시작하는 프로그램을 변경하면 됩니다( -l대부분의 구현 getty에서는 옵션 ).

    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
    
  3. /etc/init.d/rc 5로그인하기 전에 실행되고 실행되는 프로그램이 터미널에 연결되어 있지 않습니다("정확하게", 이것이 바로 getty터미널을 열고 시작된 프로그램을 터미널에 연결하는 것입니다). 따라서 su nobody -c /bin/sh호출되면 쉘 예상한 터미널 설정을 찾을 수 없으므로 작업 제어가 비활성화됩니다. 이 sh-4.3$프롬프트는 Bash 4.3이 실행될 때 기본 프롬프트입니다 /bin/sh.

  4. getty사용자가 로그인을 시작한 후에만 프로그램이 실행되는 경우 ;를 사용하여 로그인 시퀀스 에 연결할 수 있습니다 . 그러나 그러한 프로그램은 루트로 실행됩니다. 특정 요구 사항에 따라 사용자 /etc/inittab정의 스크립트나 sudo셸의 시작 스크립트 보다는 initscript를 사용하는 것이 더 나을 수도 있습니다 .

답변3

두 번째 (긴!) 답변이 방금 게시되었습니다. 나는 첫 번째 것이 그것을 아주 잘 설명한다고 말하고 싶습니다. 지금은 세 번째 요점에 대해 언급하고 싶습니다. 이는 타이밍의 문제가 아니라 "콘솔 가상" 문제뿐만 아니라 "실제 가상" tty를 제어하는 ​​프로세스의 문제입니다.

"작업 제어를 사용하여" 쉘을 시작하려면 먼저 ttyN을 설정하고 열어야 합니다. "범용" 명령은 입니다 getty.그때부터tty - 당신은 쉘을 시작하는 것을 얻습니다.뒤쪽에저것.

이는 xinit와 함께 "시작"하는 대신 창 관리자를 먼저 시작한 다음 xorg를 시작하는 것과 같습니다. 제 생각에는. "회의 리더".


왜냐하면

xx:12:...:program

그리고 반대로:

aa:1:...:pr_1
bb:1:...:pr_2

...당신은 결국 N:M 관계로 끝나게 될 것입니다. (그리고 그것을 남용하면 엉망이 될 것입니다. 각각은 다양한 프로그램을 가진 많은 RL입니다.) 더 나아갈 수도 있지만, 이후 다양한 종류의 RC "표준"이 대중화되기 시작했습니다. "런컴". 이를 사용하면 inittab은 단순해 보이지만 모든 복잡성은 이 스크립트에 있습니다.

하지만 귀하의 inittab은 간단하고 정확해 보입니다. 마지막 주석과 "z6" 항목만 있으면 됩니다...

아마도 "su none"은 그 앞/주변에 "getty...ttyN"이 필요할 수도 있습니다. su오히려 login환생은 없습니다. 최소한 "부적절" 이외의 다른 오류 메시지를 표시해야 합니다.


결론(두 번째 답변을 읽은 후): 복잡한 시스템이 필요하지 않으며 init.d원시 inittab은 충분히 유연합니다. 개념과 세부 사항을 올바르게 이해하십시오.

세 가지 실행 수준을 설정할 수 있습니다. 하나는 ttyN을 사용하고, 하나는 ttySN을 사용하고, 하나는 두 가지 모두의 RL을 시작합니다. 부트로더를 사용하여 추가할 수 있는 부팅 매개변수입니다. 귀하의 경우 런레벨 "5"가 기본값입니다. 초기화할 커널, 루트= 및 런레벨을 선택합니다.


"respawn" 작업은 sysvinit가 실제로 필요한 작업입니다. 수행하지 않는 일이 많으며 스크립트에서 구현할 가능성은 더욱 적습니다. 그러나 "마지막" 셸을 종료(또는 충돌)하는 경우 안전망이 필요합니다.

sysvinit는 "너무 빨리 생성 중 - 5분 무시..." 오류를 통해 잘못된 구성을 감지할 수도 있습니다.

관련 정보