2 분 소요

문제 상황

  • 학원 실습 이미지의 GRUB 설정 기본값
[... console=tty0 console=ttyS0]
  • 이 상태에서 부트로더 설정을 변경하여 rd.break를 추가하고 부팅을 진행했지만, 아무 화면 출력 없이 멈추는 현상이 발생

원인 분석

1. VirtualBox 환경 차이

항목 ARM (Mac) x86 (일반 PC)
가상 시리얼 포트 지원 ❌ 미지원 ✅ 지원
ttyS0 시리얼 출력 무시됨 (화면 출력만 가능) 사용 가능 (시리얼로 출력됨)
  • ARM 아키텍처에서는 VirtualBox가 시리얼 콘솔을 지원하지 않음
  • x86에서는 커널 출력이 ttyS0으로 보내지며 모니터(tty0)에 출력되지 않을 수 있음

해결 방법

  • GRUB 부트로더에서 커널 파라미터를 편집할 때 다음과 같이 설정
rd.break console=tty0
  • 이렇게 하면 커널 메시지와 initramfs 셸이 모니터로 출력되고 키보드 입력도 가능해짐

배경 개념 정리

시리얼 포트란?

  • 데이터를 1비트씩 순차적으로 전송하는 오래된 통신 방식
  • 예전 컴퓨터에서는 물리적인 COM 포트를 통해 터미널이나 모뎀을 연결

console=tty0 vs console=ttyS0

설정 설명
console=tty0 표준 콘솔 (모니터 출력, 키보드 입력)
console=ttyS0 시리얼 포트 콘솔 (원격 디버깅용)
  • 여러 콘솔을 지정하면 출력은 모두에게 전송되지만, 입력은 마지막 콘솔에서만 받음
  • 따라서 마지막 설정이 ttyS0이면 화면 출력이 안 보이고, 키보드 입력도 먹지 않을 수 있음

현재 상황에서 출력이 정상적이지 않은 이유 (추측)

  1. GRUB 설정이 [… console=tty0 console=ttyS0]로 되어 있어 입력 대상이 ttyS0으로 설정됨
  2. 커널이 tty0을 제대로 초기화하지 못했거나
  3. 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 불가 상태에서도 접속 가능 서버 관리용 물리 콘솔 대체 수단

댓글남기기