리눅스 로그인 프롬프트의 비밀: agetty 완벽 실습 가이드 (가상 콘솔부터 자동 로그인까지)

개요

리눅스 부팅 직후 콘솔에 나타나는 ’login:’ 프롬프트의 핵심 데몬인 agetty를 실습으로 파헤칩니다. 난해한 man 페이지 대신 systemd 연동, 커스텀 로그인 배너(/etc/issue), 자동 로그인 설정까지 실무에서 즉시 활용 가능한 핵심 기술을 배웁니다.

agetty 기본 개념 및 systemd 서비스 상태 확인

시스템 내 agetty 실행 파일의 설치 경로를 확인하기 위해 which agetty 명령어를 실행합니다.

which agetty

agetty는 가상 콘솔이나 시리얼 포트를 열어 터미널 환경을 초기화하고 사용자에게 로그인 프롬프트를 제공하는 핵심 프로그램으로, 현재 설치된 버전 및 지원 기능 목록을 확인합니다.
⚙️ [주요 옵션]

-a, --autologin : 지정한 계정으로 로그인 프롬프트 없이 자동 로그인을 수행합니다.
-J, --noclear : 로그인 프롬프트 표시 전 터미널 화면을 지우지 않고 기존 로그를 유지합니다.
-f, --issue-file : 로그인 프롬프트 상단에 출력할 시스템 안내 메시지(issue) 파일 경로를 지정합니다.
-o, --login-options : 하위 login 프로그램으로 전달할 실행 인자를 지정합니다.
-n, --skip-login : 로그인 계정 입력을 생략하고 즉시 다음 인증 단계를 호출합니다.
-8, --8bits : 8비트 문자 처리를 허용하도록 터미널을 설정합니다.

agetty –version

첫 번째 가상 콘솔(tty1)을 관리하는 systemd 인스턴스 서비스의 현재 활성화 상태와 프로세스 구동 정보를 조회하기 위해 systemctl status [email protected] --no-pager 명령어를 실행합니다.
실행 결과 agetty 프로세스가 정상적으로 백그라운드에서 실행되며 로그인 대기 상태를 유지하고 있음을 확인할 수 있습니다.

systemctl status getty@tty1.service –no-pager

/etc/issue 커스텀을 활용한 나만의 콘솔 환영 배너 제작

현재 시스템의 기본 콘솔 로그인 안내 배너 설정을 확인하기 위해 cat /etc/issue 명령어를 실행합니다.
출력 결과의 \n은 시스템 호스트 이름으로 변환되며, \l은 현재 사용자가 접속 중인 터미널 라인(tty) 번호로 치환되는 agetty 전용 이스케이프 시퀀스입니다.

cat /etc/issue

파일을 수정하기 전 기본 구성을 안전하게 보존하기 위해 sudo cp /etc/issue /etc/issue.bak 명령어를 실행하여 원본 배너 파일의 백업본을 생성합니다.

sudo cp /etc/issue /etc/issue.bak

터미널 번호 및 시스템 운영체제 정보를 동적으로 출력하는 맞춤형 환영 문구를 구성하기 위해 echo -e '\n=== Welcome to Ubuntu Server (tty: \l) ===\nOS: \s \r (\m) | Time: \t\n' | sudo tee /tmp/custom_issue 명령어를 실행합니다.
해당 템플릿에는 콘솔 번호(\l), 운영체제 이름(\s), 커널 릴리스(\r), 하드웨어 아키텍처(\m), 현재 시간(\t)을 표시하는 치환 시퀀스가 포함되어 있습니다.

echo -e ‘\n=== Welcome to Ubuntu Server (tty: \l) ===\nOS: \s \r (\m) | Time: \t\n’ | sudo tee /tmp/custom_issue

생성한 임시 배너 파일의 내용과 이스케이프 문자열이 의도한 대로 올바르게 작성되었는지 확인하기 위해 cat /tmp/custom_issue 명령어를 실행합니다.

cat /tmp/custom_issue

agetty 핵심 옵션과 systemd 서비스 오버라이드 실습

기존 tty1 콘솔의 기본 systemd 서비스 유닛 설정 내용을 확인하기 위해 systemctl cat [email protected] 명령어를 실행합니다.
출력 결과를 통해 템플릿 파일(/usr/lib/systemd/system/[email protected])에 정의된 기본 실행 환경과 ExecStart 설정을 파악할 수 있습니다.

systemctl cat getty@tty1.service

기본 패키지 제공 설정 파일을 직접 수정하지 않고 안전하게 설정을 덮어쓰기 위해 sudo mkdir -p /etc/systemd/system/[email protected] 명령어를 실행하여 drop-in 디렉터리를 생성합니다.

sudo mkdir -p /etc/systemd/system/getty@tty1.service.d

부팅 로그를 보존하는 --noclear 옵션과 전송 속도 및 터미널 타입을 재정의하기 위해 echo -e '[Service]\nExecStart=\nExecStart=-/sbin/agetty -o "-p -- \\u" --noclear -s %I 115200,38400,9600 vt220' | sudo tee /etc/systemd/system/[email protected]/noclear.conf 명령어를 실행합니다.
기존 ExecStart 지시어를 빈 값으로 초기화한 뒤 원하는 agetty 인자를 포함한 새 실행 구문을 안전하게 오버라이드합니다.

echo -e ‘[Service]\nExecStart=\nExecStart=-/sbin/agetty -o “-p – \u” –noclear -s %I 115200,38400,9600 vt220’ | sudo tee /etc/systemd/system/getty@tty1.service.d/noclear.conf

새로 생성한 drop-in 구성 파일을 systemd에 즉시 반영하기 위해 systemctl daemon-reload 명령어를 실행합니다.

systemctl daemon-reload

오버라이드한 drop-in 설정이 기존 유닛에 올바르게 병합되어 적용되었는지 검증하기 위해 systemctl cat [email protected] 명령어를 실행합니다.
출력 결과 하단에 새로 추가된 noclear.conf 파일의 내용이 포함되어 설정이 정상 반영되었음을 확인할 수 있습니다.

systemctl cat getty@tty1.service

시리얼 콘솔 및 가상 터미널(tty) 관리 현황 조회

현재 시스템에서 실제로 활성화되어 동작 중인 가상 콘솔 서비스 인스턴스를 확인하기 위해 systemctl list-units --type=service 'getty@*' --no-pager 명령어를 실행합니다.
출력 결과를 통해 현재 tty1 가상 콘솔을 전담하는 [email protected] 유닛이 정상적으로 백그라운드에서 구동 중임을 확인할 수 있습니다.

systemctl list-units –type=service ‘getty@*’ –no-pager

클라우드 가상 머신(VM)이나 임베디드 장비의 직렬 포트 콘솔 관리에 사용되는 서비스 유닛 파일의 등록 상태를 확인하기 위해 systemctl list-unit-files 'serial-getty*' --no-pager 명령어를 실행합니다.
조회 결과 [email protected] 템플릿 유닛 파일이 설치되어 있으며, 현재 비활성화(disabled) 상태로 대기 중임을 파악할 수 있습니다.

systemctl list-unit-files ‘serial-getty*’ –no-pager

현재 시스템에 로그인되어 있는 사용자 목록과 각 세션이 점유 중인 터미널(TTY) 정보를 조회하기 위해 w 명령어를 실행합니다.
실행 결과를 통해 현재 활성화된 사용자 세션 현황과 시스템 가동 시간, 평균 부하(load average) 상태를 한눈에 점검할 수 있습니다.

w

지금까지 리눅스 가상 콘솔의 핵심인 agetty의 동작 원리부터 자동 로그인 설정까지 실습을 통해 간단하게 살펴보았습니다.
직접 콘솔 설정을 다뤄보며 리눅스 시스템의 부팅 및 로그인 프로세스를 더 깊이 이해하는 데 도움이 되었기를 바랍니다.