Linux의 텍스트 터미널

14.1 게티 (/ etc / inittab에서 사용됨)

게티 소개

컴퓨터가 시작될 때 (또는 실행 레벨을 전환 할 때) 직렬 포트 (그리고 터미널이 연결된 터미널)에서 로그인 프로세스를 실행하려면 getty 명령을 / etc / inittab 파일에 넣어야합니다. 명령 행에서 getty를 실행하면 문제가 발생할 수 있습니다 (명령 행에서 getty를 실행하는 경우 : 프로그램이 중지되어 이유를 확인하십시오). Getty는 TTY (터미널)를 사용합니다. 각 터미널에는 자체 getty 명령이 필요합니다. 모든 / etc / inittab 파일에 콘솔에 대한 getty 명령이 하나 이상 있습니다. 이것을 찾아서 옆에있는 실제 터미널에 대한 getty 명령을 넣으십시오. 이 파일에는 주석 처리 된 텍스트 터미널 용 샘플 getty 행이 포함될 수 있으므로 주석 처리를 제거하고 (맨 앞의 #을 제거하고) 몇 가지 인수를 변경하면됩니다.

허용되는 인수는 사용하는 getty에 따라 다릅니다.
직접 연결된 터미널에 가장 적합한 두 개의 gettys는 다음과 같습니다.

다이얼 인 모뎀에 가장 적합한 두 개의 gettys는 다음과 같습니다.

실제 텍스트 터미널을 사용하지 않으면 간단한 gettys를 사용할 수 있습니다. 대부분의 Linux 사용자는 모니터에서 다음 중 하나를 사용합니다.

Linux 배포판에는 텍스트 터미널에 ps_getty 또는 agetty가 제공 될 수 있습니다. 일부 배포본은 어느 것도 제공하지 않습니다. 안타깝게도 종종 "getty"라고 부르기 때문에 / etc / inittab에 넣은 인수가 다른 이후로 가지고있는 인수를 결정해야 할 수도 있습니다. 데비안은 agetty를 사용합니다 (util-linux 패키지에서). RedHat과 Fedora는 ps_getty를 사용했습니다 : ps_getty

가지고있는 getty를 결정하는 마지막 수단으로, 실행 코드 (보통 / sbin)를 체크 아웃 할 수 있습니다. ps_getty는이 코드에 / etc / gettydefs를 포함합니다. 검색하려면 / sbin으로 이동하여 다음을 입력하십시오.
문자열 getty | grep getty
getty가 실제로 agetty이면 위의 결과는 아무 것도 발생하지 않습니다. 그러나 당신이 agetty 타이핑을 가지고 있다면 :
게티 -h
[-hiLmw] 옵션이 표시되어야합니다.

getty가 없으면 다른 배포판을 확인하고 외계인 프로그램은 RPM과 데비안 패키지 사이를 전환합니다. 소스 코드는 Getty Software에서 다운로드 할 수 있습니다.

모뎀 제어 라인을 사용하지 않는 경우 (예를 들어 전송, 수신 및 공통 신호 접지의 최소 수만 사용하는 경우) getty가 "로컬"플래그를 사용하여이를 알게해야합니다. 이 형식은 사용하는 getty에 따라 다릅니다.

게티 (게티)는 로그인 후에 종료됩니다 (다시 부활 할 수 있음).

로그인하면 "top", "ps -ax"또는 "ptree"를 사용하여 getty 프로세스가 더 이상 실행되지 않음을 알 수 있습니다. 그게 무슨 일 이니? 쉘이 죽으면 getty가 다시 시작되는 이유는 무엇입니까? 이유가 여기 있습니다.

사용자 이름을 입력하면 getty가 그것을 가져 와서 사용자 이름을 알려주는 로그인 프로그램을 호출합니다. getty 프로세스는 로그인 프로세스로 대체됩니다. 로그인 프로세스는 암호를 묻고이를 확인하고 암호 파일에 지정된 모든 프로세스를 시작합니다. 이 프로세스는 종종 bash 쉘입니다. 그렇다면 bash가 시작되어 로그인 프로세스를 대체합니다. 하나의 프로세스가 다른 프로세스를 대체하고 bash 쉘 프로세스가 원래 getty 프로세스로 시작되었다는 것에 유의하십시오. 이것의 의미는 아래에 설명되어 있습니다.

이제 / etc / inittab 파일에서 getty는 죽은 경우 respawn (재시작)됩니다. 그것은 getty를 호출하는 라인에서 그렇게 말합니다. 그러나 bash 쉘 (또는 로그인 프로세스)이 종료되면 getty가 다시 시작됩니다 (다시 시작). 왜? 글쎄, 로그인 프로세스와 bash는 모두 getty와 inherit의 대체물이다.

* 텍스트 터미널 사용법 색인

신호 연결은 전임자가 설정합니다. 실제로 세부 사항을 관찰하면 대체 프로세스가 원래 프로세스와 동일한 프로세스 ID를 갖게됨을 알 수 있습니다. 따라서 bash는 동일한 프로세스 ID 번호로 위장한 getty와 비슷합니다. bash가 죽으면 getty가 죽은 것처럼 보입니다 (getty가 더 이상 실행되지 않더라도). 결과적으로 getty가 다시 생성됩니다.

한 사용자가 로그 아웃하면 bash 쉘을 포함하여 직렬 포트의 모든 프로세스가 종료됩니다. 모뎀에서 DCD 전압 강하에 의해 직렬 포트에 전화 끊기 신호가 전송되는 경우에도이 문제가 발생할 수 있습니다 (활성화 된 경우). DCD에서 로그 아웃 또는 드롭하면 getty가 다시 생성됩니다. "top"이나 "kill"명령을 사용하여 k 키를 누르거나 수동으로 bash (또는 login)를 죽임으로써 getty가 강제로 respawn 될 수 있습니다. 신호 9 (무시할 수 없음)로 그것을 죽일 필요가있을 것입니다.

명령 행에서 getty를 실행하는 경우 : 프로그램이 중지됨

일반적으로 / etc / inittab 에서 명령 줄이 아닌 getty를 실행해야합니다. 그렇지 않으면 터미널에서 실행중인 일부 프로그램이 예기치 않게 일시 중단 (중지) 될 수 있습니다. 이유는 다음과 같습니다 (왜 중요하지 않은지 다음 섹션으로 건너 뜁니다). 다른 터미널의 명령 줄에서 ttyS1이라고 말하면 getty를 시작하면 tty1이라고 말하면 실제로 실행되는 터미널이 ttyS1인데도 tty1이 "제어 터미널"로 사용됩니다. 따라서 잘못된 제어 터미널이 있습니다. 하지만 inittab 파일 내부에서 시작되면 ttyS1이 제어 터미널로 사용됩니다 (올바른).

제어 터미널이 잘못 되었음에도 불구하고 ttyS1의 로그인은 잘 작동합니다 (getty에 대한 인수로 ttyS1을 제공했기 때문에). 제어 터미널이 tty11로 남아 있더라도 표준 입력 및 출력은 ttyS1로 설정됩니다. ttyS1에서 실행되는 다른 프로그램은이 표준 입력 / 출력 (ttyS1에 연결됨)을 상속 할 수 있으며 모든 것이 정상입니다. 그러나 일부 프로그램은 제어 터미널 (tty1)에서 잘못 읽으려고하는 실수를 범할 수 있습니다. 이제 tty1은 이러한 프로그램이 tty1에 의해 백그라운드에서 실행되고 있다고 생각할 수 있으므로 tty1 (ttyS1이어야 함)에서 읽으려는 시도는 읽으려는 프로세스를 중지시킵니다. (백그라운드 프로세스는 제어 터미널에서 읽을 수 없습니다.) 화면에 " [1] + Stopped "와 같은 메시지가 표시 될 수 있습니다. 이 시점에서 당신은 잘못된 터미널을 통해 의사 소통을 시도하는 프로세스와 상호 작용할 수 없기 때문에 멈추게됩니다. 물론 이것을 피하기 위해 다른 터미널에 가서 프로세스를 죽일 수 있습니다.

agetty (getty라고 할 수 있음)

/ etc / inittab의 예제 라인 :

S1 : 23 : respawn : / sbin / getty -L 19200 ttyS1 vt102

S1은 ttyS1에서 온 것입니다. 23은 실행 레벨 2 또는 3을 입력 할 때 getty가 실행됨을 의미합니다. respawn은 getty (또는 bash와 같은 프로세스를 대체 한 프로세스)가 종료되면 getty가 자동으로 다시 시작 (다시 시작)된다는 것을 의미합니다. / sbin / getty는 getty 명령입니다. -L은 로컬 (모뎀 제어 신호 무시)을 의미합니다. -h (예제에 표시되지 않음)는 하드웨어 흐름 제어를 가능하게합니다 (stty crtscts와 동일). 19200은 전송 속도입니다. ttyS1은 / dev / ttyS1 (MS-DOS의 COM2)을 의미합니다. vt102는 터미널 유형이며이 getty는 환경 변수 TERM을이 값으로 설정합니다. 구성 파일이 없습니다. getty를 편집 한 후 명령 행에 "init q"를 입력하면 로그인 프롬프트가 나타납니다.

패리티 문제의 Agetty 자동 검색

agetty 프로그램은 터미널 내부의 패리티 세트를 자동 감지하려고 시도합니다 (패리티 없음 포함). 8 비트 데이터 바이트와 1 비트 패리티를 지원하지 않습니다. 8 비트 데이터 바이트 (더하기 패리티)를 참조하십시오. stty 를 사용하여 패리티를 설정하면 agetty 는 패리티 비트가 데이터 비트 인 것처럼 초기에 필요하기 때문에이를 자동으로 해제합니다. 이는 패리티를 자동 감지 할 수 있도록 login-name을 입력 할 때 마지막 비트 (가능하면 패리티 비트)를 가져와야하기 때문입니다. 따라서 패리티를 사용하는 경우 텍스트 터미널 내부에서만 활성화하고이를 자동 감지하여 컴퓨터에서 설정하십시오. 터미널이 수신 된 패리티를 지원하면 getty가 다음을 감지 할 수 있도록 무언가를 입력 할 때까지 로그인 프롬프트가 왜곡되어 보입니다.

둥가. 왜곡 된 프롬프트는 방문객 등이 로그인을 시도하는 것을 방지합니다. 그것은 당신이 원하는 것일 수 있습니다.

패리티 자동 감지에는 때로는 문제가 있습니다. 이것은 로그인 이름을 먼저 입력 한 후 로그인을 시작하기 위해 로그인 프로그램을 시작하기 때문에 발생합니다. 불행히도 로그인 프로그램은 패리티를 감지 할 수 없으므로 getty 프로그램이 패리티를 판별하지 못하면 로그인 이 판별 할 수 없습니다 그것도. 첫 번째 로그인 시도가 실패하면 로그인 하면 다시 시도 할 수 있습니다 (모두 패리티가 잘못 설정된 경우). 결국 로그인 시도가 실패한 후 (또는 시간 초과 후) agetty 가 다시 시작되고 로그인 순서가 다시 시작됩니다. getty가 다시 실행되면 두 번째 시도에서 패리티를 감지 할 수 있으므로 모든 것이 제대로 작동 할 수 있습니다.

잘못된 패리티를 사용하면 로그인 프로그램이 사용자가 입력 한 내용을 올바르게 읽을 수 없으며 로그인 할 수 없습니다. 단말기가 수신 된 패리티를 지원하면 계속해서 깨진 화면이 표시됩니다. getty가 패리티를 감지하지 못하면 / etc / issue 파일은 대개 프롬프트가 나타나기 직전에 화면에 덤프되므로 화면에 왜곡 된 단어가 나타날 수 있습니다.

왜 첫 번째 문자로 패리티를 감지 할 수 없습니까? 예를 들면 다음과 같습니다. 패리티 비트 0 (상위 비트) 및 홀수 1 비트가있는 8 비트 바이트를 감지한다고 가정합니다. 어떤 패리티입니까? 음, 1 비트의 홀수는 홀수 패리티라는 것을 의미합니다. 그러나 패리티가없는 8 비트 문자 일 수도 있습니다. 지금까지는 어떤 것을 결정할 방법이 없습니다. 그러나 지금까지 우리는 동등성의 가능성을 제거했습니다. 따라서 패리티 탐지는 제거 프로세스에 의해 진행됩니다.

입력 된 다음 바이트가 첫 번째 바이트와 유사하고 짝수 패리티의 가능성 만 제거하면 패리티를 판별하는 것은 여전히 ​​불가능합니다. 이 상황은 무한정 계속 될 수 있으며 드물 긴하지만 로그인 이름을 변경할 때까지 로그인이 실패합니다. 만약 agetty가 1의 패리티 비트를 찾으면 이것은 패리티 비트이고 8 비트 문자의 상위 비트가 아니라고 가정합니다. 따라서 사용자 이름에 메타 문자 (상위 비트 세트)를 사용하지 않는다고 가정합니다 (즉, 이름이 ASCII로되어 있음).

하나는 "로그인 루프"에 다양한 방법으로 들어갈 수 있습니다. 로그인 이름에 단 하나의 글자 또는 두 글자 만 입력하고 리턴을 친다 고 가정하십시오. 이러한 문자로 패리티를 탐지하기에 충분하지 않으면 패리티가 감지되기 ​​전에 로그인이 실행됩니다. 가끔이 문제는 agetty가 처음 시작할 때 터미널이 연결되어 있지 않거나 연결되어 있지 않은 경우에 발생합니다.

이 "로그인 루프"에 빠지면 getty 로그인 프롬프트가 나타날 때까지 리턴 키를 여러 번 누르십시오. 또 다른 방법은 시간 초과를 위해 1 분 정도 기다리는 것입니다. 그러면 getty 프로그램에 의해 getty 로그인 프롬프트가 화면에 표시되고 다시 로그인 할 수 있습니다.

8 비트 데이터 바이트 (더하기 패리티)

불행히도, agetty는이 동등 함을 감지 할 수 없습니다. 1999 년 말 현재 패리티의 자동 감지를 비활성화 할 수 없으므로 잘못된 패리티를 감지합니다. 결과적으로 로그인 프로세스가 왜곡되고 패리티가 잘못 설정됩니다. 따라서 패리티가있는 8 비트 데이터 바이트를 사용하려고 시도하는 것은 실현 가능하지 않습니다.

getty (getty_ps의 일부)

(대부분이 Greg Hankins의 오래된 Serial-HOWTO에서 온 것입니다)
이 getty 사용자는 설정 파일에 항목을 넣고 / etc / inittab에 항목을 추가해야합니다. 다음은 / etc / gettydefs 설정 파일에 넣은 터미널에 사용할 몇 가지 예제 항목입니다.

# 38400 bps 멍청한 터미널 항목 DT38400 # B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL # @ S @L 로그인 : # DT2004 # 19200 bps 멍청한 터미널 항목 DT19200 # B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL # @ S @L login : # DT19200 # 9600 bps 멍청한 터미널 항목 DT9600 # B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL # @ S @L 로그인 : # DT9600

DT38400, DT19200 등은 단지 레이블 일 뿐이며 / etc / inittab 에서 사용하는 레이블과 같아야합니다.

원하는 경우 getty 가 로그인 배너에서 흥미로운 것을 인쇄하도록 할 수 있습니다. 필자의 예에서는 시스템 이름과 직렬 회선이 인쇄되어 있습니다. 다른 것들을 추가 할 수 있습니다 : [blockquote

그늘 = 예] @B 현재 (@B가 표시 될 때 평가 됨) bps 비율입니다. @D 현재 날짜 (MM / DD / YY). @L getty가 연결된 직렬 회선. @S 시스템 이름. @T 현재 시간, HH : MM : SS (24 시간). @U 현재 로그온 한 사용자 수입니다. 이것은 / etc / utmp 파일에서 널 (null)이 아닌 ut_name 필드가있는 항목의 수입니다. @V 디폴트 파일에 주어진 VERSION의 값. 단일 '@'문자를 표시하려면 '\ @'또는 '@@'을 사용하십시오.

/ etc / gettydefs를 편집했으면 다음을 수행하여 구문이 올바른지 확인할 수 있습니다.

linux # getty -c / etc / gettydefs

터미널이 연결된 직렬 포트에 대한 다른 getty 또는 uugetty 구성 파일이 없는지 확인하십시오 (예 : /etc/default/{uu}getty.ttyS N 또는 /etc/conf.{uu}getty.ttyS N ) 이것은 아마 터미널에서 getty 를 실행하는 것을 방해 할 것이기 때문이다. 충돌하는 파일이 종료되면 제거하십시오.

/ etc / inittab 파일을 편집하여 직렬 포트에서 getty 를 실행하십시오 (포트, 속도 및 기본 터미널 유형과 같은 환경에 맞는 올바른 정보로 대체하십시오).

S1 : 23 : respawn : / sbin / getty ttyS1 DT9600 vt100 초기화 linux # init q

이 시점에서 터미널에 로그인 프롬프트가 표시됩니다. 터미널의주의를 끌기 위해 반품해야 할 수도 있습니다.

mgetty

"m"은 모뎀을 의미합니다. 이 프로그램은 주로 모뎀 용이며 2000 년 중반부터는 텍스트 흐름 용으로 다시 컴파일해야합니다 (하드웨어 흐름 제어를 사용하지 않는 한 - 보통 손으로 만든 케이블이 필요합니다). 직접 연결된 터미널에 대한 설명서는 설명서의 "직접"절 ( mgetty.texi)을 참조하십시오 .

/etc/mgetty/mgetty.config 의 마지막 행에서 터미널에 대해 구성하는 예제를보십시오. "toggle-dtr no"라고 말하지 않는 한, 존재하지 않는 모뎀을 재설정하려는 시도로 PC에서 DTR 핀을 모뎀으로 떨어 뜨린 (무효화) 것으로 생각할 것입니다. 다른 gettys와는 달리 mgetty는 누군가가 그 터미널의 키를 치기 전까지 터미널에 붙어 있지 않으므로? 이것이 일어날 때까지 상단 또는 ps 에있는 터미널에 대해. / var / log / mgetty /의 로그 에는 무시할 수있는 모뎀에만 적용 할 수있는 몇 가지 경고 메시지가 표시 될 수 있습니다.

다음은 / etc / inittab에 넣은 간단한 예입니다 .

s1 : 23 : respawn : / sbin / mgetty -r ttyS1