문제 상황
[... console=tty0 console=ttyS0]
- 이 상태에서 부트로더 설정을 변경하여 rd.break를 추가하고 부팅을 진행했지만, 아무 화면 출력 없이 멈추는 현상이 발생
원인 분석
1. VirtualBox 환경 차이
항목 |
ARM (Mac) |
x86 (일반 PC) |
가상 시리얼 포트 지원 |
❌ 미지원 |
✅ 지원 |
ttyS0 시리얼 출력 |
무시됨 (화면 출력만 가능) |
사용 가능 (시리얼로 출력됨) |
- ARM 아키텍처에서는 VirtualBox가 시리얼 콘솔을 지원하지 않음
- x86에서는 커널 출력이 ttyS0으로 보내지며 모니터(tty0)에 출력되지 않을 수 있음
해결 방법
- GRUB 부트로더에서 커널 파라미터를 편집할 때 다음과 같이 설정
- 이렇게 하면 커널 메시지와 initramfs 셸이 모니터로 출력되고 키보드 입력도 가능해짐
배경 개념 정리
시리얼 포트란?
- 데이터를 1비트씩 순차적으로 전송하는 오래된 통신 방식
- 예전 컴퓨터에서는 물리적인 COM 포트를 통해 터미널이나 모뎀을 연결
console=tty0 vs console=ttyS0
설정 |
설명 |
console=tty0 |
표준 콘솔 (모니터 출력, 키보드 입력) |
console=ttyS0 |
시리얼 포트 콘솔 (원격 디버깅용) |
- 여러 콘솔을 지정하면 출력은 모두에게 전송되지만, 입력은 마지막 콘솔에서만 받음
- 따라서 마지막 설정이 ttyS0이면 화면 출력이 안 보이고, 키보드 입력도 먹지 않을 수 있음
현재 상황에서 출력이 정상적이지 않은 이유 (추측)
- GRUB 설정이 [… console=tty0 console=ttyS0]로 되어 있어 입력 대상이 ttyS0으로 설정됨
- 커널이 tty0을 제대로 초기화하지 못했거나
- initramfs의 셸이 /dev/ttyS0에 attach되어 /dev/tty0에서는 아무것도 출력되지 않았을 가능성
핵심은?
- GRUB에서 console=tty0만 단독으로 설정하거나 마지막에 배치해야 실습 환경에서 제대로 동작했을 것이라고 추측할 수 있음
- 이미지 직접 조작이 불가능해 테스트는 불가함
부팅 구조 흐름 정리
┌────────────────────────────────────┐
│ BIOS/UEFI │
│ (전원 켜지면 실행) │
└────────────────────────────────────┘
│
▼
┌────────────────────────────────────┐
│ GRUB │
│ 부트로더: OS 선택, 커널 인자 전달 │
│ └─ console=ttyS0 console=tty0 │
└────────────────────────────────────┘
│
▼
┌────────────────────────────────────┐
│ Kernel │
│ 리눅스 커널이 부팅되며 │
│ 'console=XXX' 인자 확인 │
│ → 출력은 모두에게, │
│ → 입력은 마지막 console에게만 │
└────────────────────────────────────┘
│
▼
┌────────────────────────────────────┐
│ initramfs │
│ 임시 루트 파일 시스템 │
│ (rd.break 시 여기서 셸로 진입) │
│ 콘솔이 ttyS0이면 → 입력X/화면X │
│ 콘솔이 tty0이면 → 화면O/입력O │
└────────────────────────────────────┘
│
▼
┌────────────────────────────────────┐
│ 진짜 루트 파일 시스템 │
│ (/etc/passwd 등 존재) │
└────────────────────────────────────┘
│
▼
┌────────────────────────────────────┐
│ 로그인 콘솔 (getty 실행) │
│ └─ /dev/tty1, /dev/ttyS0 등 │
└────────────────────────────────────┘
initramfs
- initial RAM Filesystem
- 커널 부팅 직후 사용하는 임시 파일 시스템
- 루트 파일 시스템이 마운트 되기 전까지 필요한 드라이버, 스크립트 등을 포함
주 역할
- LVM, RAID, 암호화 디스크 처리
- 네트워크 설정
- 루트 마운트 실패 시
rd.break
로 셸 진입 가능
GRUB
- GRand Unified Bootloader
- BIOS/UEFI와 커널 사이를 연결해주는 부트로더
주 역할
- 부팅할 OS 목록 제공 (멀티 부팅)
- 커널과 initramfs를 메모리에 로드
console=tty0
, rd.break
같은 파라미터 전달
- GRUB 화면에서
e
눌러 임시 수정 가능
요약
구성 요소 |
역할 |
GRUB |
커널 부팅 설정, 파라미터 전달 |
Kernel |
콘솔 초기화 및 장치 결정 |
initramfs |
루트 마운트 전 임시 환경 제공 |
console=tty0 |
모니터 출력, 키보드 입력 |
console=ttyS0 |
시리얼 포트 출력/입력 (서버용) |
나아가
- 클라우드에서도 사용되는 개념인 것 같아 아래 링크를 첨부
- AWS EC2에서 시리얼 콘솔을 통한 부트 문제 해결이 가능한 것 같음
항목 |
AWS EC2 Serial Console |
리눅스 시리얼 콘솔 (ttyS0 ) |
목적 |
부팅 중 문제 진단, 로그인 불가 시 복구 |
마찬가지로 부팅 문제/로그인 불가 시 복구 |
방식 |
가상 시리얼 포트를 통해 텍스트 기반 접근 |
물리/가상 시리얼 포트를 통해 텍스트 접근 |
console= 설정 |
EC2 인스턴스 메타데이터나 AMI에서 설정 |
GRUB 커널 파라미터에서 설정 (console=ttyS0 ) |
진입 위치 |
커널 로깅, initramfs 셸, getty 포함 |
동일 (특히 rd.break 시 initramfs 접근) |
주요 장점 |
네트워크 장애/SSH 불가 상태에서도 접속 가능 |
서버 관리용 물리 콘솔 대체 수단 |
댓글남기기