설치 단계에서는 정상 동작하던 데비안 리눅스 서버가 랙에 장착한 뒤 부팅되지 않는 경우가 있다. 이는 모니터가 연결되지 않은 환경에서 리눅스 부트로더(GRUB)가 그래픽 초기화 과정에서 멈추기 때문이다. 이 문제는 grub.cfg 설정을 수정해 터미널 모드를 텍스트 콘솔만 사용하도록 변경함으로써 해결할 수 있다.
랙에만 장착하면 부팅이 되지 않는 리눅스 서버
테스트 환경을 구축하고자 새로운 리눅스 서버를 하나 만들었다. 언제나 처럼 Debian을 네트워크 이미지로 설치하고, 이것 저것 필요할 것들을 설치하고 IP 정보까지 모두 입력한 뒤 랙에 장착했는데, 네트워크 접속이 되지 않았다.
뭔가 셋팅을 덜 했겠지 하는 생각에 서버를 랙에서 꺼내 다시 테스트룸에 가지고 와서 전원을 켜 보았다. 하지만 아무런 문제가 없었다. 부팅도 잘 되고, 설정과 필요한 구성 요소들과 네트워크도 모두 잘 동작했다.
그런데 희안하게도 랙에만 장착하면 서버에 접속이 되지 않았다. 수 차례 재설치를 해 보아도 동일한 현상이 반복됐다. ‘랙 아래에 수맥이 흐르고 있나?‘라는 말도 안 되는 의심까지 해 보았지만, 그러기에는 같은 랙에 있는 다른 서버들은 잘만 돌아가고 있었다.
시간은 속절없이 흘러가고, 쥐어뜯던 머리가 얼얼해져 갈 무렵, 본 필자의 머릿속에 문득 하나의 차이가 떠올랐다.
랙에는 모니터가 없지!
모니터가 없으면 부팅이 되지 않는 리눅스 서버
테스트룸과 랙실의 차이는 곰곰이 생각해 보아도 하나뿐이었다. 테스트룸에서는 초기 설치 작업등을 하기 위해 모니터를 연결해 두었지만 랙에는 모니터가 없었다.
확인을 위해 바로 테스트룸에 내려와 있던 서버의 전원을 끄고, 모니터 케이블을 분리한 뒤 다시 전원을 넣어 보았다. 그 결과는, Bingo! 랙에 장착했을 때와 동일한 현상이 그대로 재현되었다.
서버는 켜진 것처럼 보였지만, 외부에서는 아무런 응답도 없었다. 네트워크 접속 역시 되지 않았다. 전원을 끄고 모니터를 다시 연결하자, 언제 그랬냐는 듯 정상적으로 부팅이 진행되었다. 이 서버는 모니터가 없어 부팅 프로세스를 끝내지 못하고 있었다.
모니터가 없다는 이유만으로 동작을 멈춘다면, 의심해 볼 부분은 많지 않다. 부팅 과정 어딘가에서 “모니터 없으니 배째라”를 시전하고 있는 존재가 있다는 거다. 그리고 결국 찾아낸 범인은 GRUB이었다.
문제의 원인 : GRUB
결론부터 말하면, 문제의 원인은 GRUB이 동작하는 과정에서 모니터가 인식되지 않자, 다음 단계로 진행하지 못하고 그대로 멈춰 버린 것이다.
최신 리눅스 배포판의 GRUB은 기본적으로 gfxterm (그래픽 터미널) 모드를 사용한다. 그래픽 카드의 KMS(Kernel Mode Setting) 기능이나 VBE(VESA BIOS Extensions)를 호출하여 고해상도 그래픽을 출력하게 되는데, 이 과정에서 GRUB은 그래픽 드라이버를 로드하고 최적의 해상도를 찾기 위해 모니터와 통신을 시도한다.
문제는 모니터가 연결되지 않으면 초기화 과정에서 EDID(모니터 정보)를 읽어올 수 없고, 이로 인해 그래픽 출력을 위한 초기화 과정이 실패하면서 커널 로딩 단계로 넘어가지 못한 채 먹통이 된다는 것이다.
해결 방법 : GRUB를 텍스트 콘솔로 강제하기
GRUB이 배째라를 시전하고 있다는 것을 알았으니, 해결 방법은 간단하다. 배를 째 주면 된다. GRUB에게 모니터 없으니까 그래픽 출력 쓰지 말고 텍스트 모드로 동작하라고 말해주며 달래주면 된다.
Step1. GRUB 기본 설정 파일 수정
터미널을 열고 다음 명령어를 입력하여 GRUB 설정 파일(grub.cfg)을 편집한다. GRUB 설정은 잘못 건드릴 경우 부팅이 아예 불가능해 진다. 변경 전에 파일을 백업해 두는 것이 안전하다.
sudo nano /etc/default/grub파일을 열면 여러 주석과 설정 항목이 보이는데, 그중 그래픽 터미널과 관련된 부분을 확인한다.
...(전략)...
# Uncomment to disable graphical terminal
#GRUB_TERMINAL=console // 이 라인의 #을 제거
...(생략)...
위 항목은 기본적으로 주석 처리되어 있다. 이 줄의 주석을 제거하거나, 아래와 같은 설정을 추가하여 GRUB가 그래픽 터미널을 사용하지 않도록 명시해 준다.
GRUB_TERMINAL_OUTPUT="console"
GRUB_GFXMODE=text
GRUB_CMDLINE_LINUX_DEFAULT="nomodeset"
이 의미는 다음과 같다.
- GRUB_TERMINAL_OUTPUT=”console” : GRUB의 출력 장치를 콘솔로 고정.
- GRUB_GFXMODE=text : 그래픽 모드 대신에 텍스트 모드를 사용
- nomodeset : 그래픽 드라이버 로딩을 하지 않음
즉, 서버면 서버 답게 그래픽 쓰지 말고 콘솔로만 출력해라 라고 설정 해 주는 것이다.
Step2. GRUB 설정 반영
설정을 저장한 뒤, 변경 사항을 실제 부트 설정에 반영한다.
debian@debian:~$ sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.1.0-37-amd64
Found initrd image: /boot/initrd.img-6.1.0-37-amd64
Found linux image: /boot/vmlinuz-6.1.0-32-amd64
Found initrd image: /boot/initrd.img-6.1.0-32-amd64
Found linux image: /boot/vmlinuz-6.1.0-30-amd64
Found initrd image: /boot/initrd.img-6.1.0-30-amd64
Found linux image: /boot/vmlinuz-6.1.0-29-amd64
Found initrd image: /boot/initrd.img-6.1.0-29-amd64
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done
이 과정에서 오류 메시지가 출력된다면, 수정 과정에 오류가 있었다는 것이다. 백업해 둔 파일로 다시 원상복구 한 수에 수정사항을 점검해 보아야 한다.
Step3. 모니터 없이 재부팅
이제 모니터와 키보드를 완전히 분리한 상태에서 서버를 재부팅한다.
정상적으로 설정이 적용되었다면, 디스플레이 포트가 전혀 연결되지 않은 상태에서도 부팅이 끝까지 진행되고 네트워크 접속이 가능해진다. GRUB이 불러도 대답 없을 모니터를 순순히 포기한 것이다. 이것으로 리눅스 시스템은 모니터 없이도 동작 가능한 상태가 되었다.
결론과 마무리
대부분의 서버용 하드웨어는 내장 그래픽을 포함하고 있고, 이런 문제를 일으키지 않는 경우가 많다. 하지만 특정 그래픽 칩셋을 사용했거나, 일반 데스크톱용 하드웨어를 서버 용도로 전환해 사용하는 경우에는 언제든지 비슷한 상황을 만날 수 있다.
KVM(Keyboard·Video·Mouse)은 PC 환경에서 가장 기본적인 입출력 장치로, 시스템은 부팅 과정에서 이 장치들의 존재를 전제로 동작하는 경우가 많다. 이번 사례처럼 위치를 이동하기만 하면 서버가 죽은 것처럼 보인다면, 네트워크나 하드웨어 불량의 가능성도 있겠지만 부팅 과정이 끝까지 정상적으로 진행되고 있는지 먼저 떠올려 보는 것이 좋다.
서버 용도라면 설정을 마치고 랙에 장착하기 전, KVM을 모두 제거하고 부팅해 보는 것 만으로도 불필요한 시간 낭비를 막을 수 있다. 수맥을 의심 하는 것은 그 이후에 해도 충분하다.