데비안, GRUB 2, intelfb

리눅스 커널 소스 트리를 뒤지다 보면 두 종류의 비디오 드라이버를 찾을 수 있다. 하나는 우리가 흔히 말하는 그래픽 드라이버인 DRI 드라이버이고, 또 다른 하나는 프레임버퍼 드라이버이다. 전자는 X.org 하에서의 2D/3D 가속 등을 담당하며, 후자는 X.org가 뜨기 전까지, 흔히 콘솔이라고 말하는 영역에서 그래픽 처리를 담당한다. 프레임버퍼를 전혀 사용하지 않으면 과거 도스 시절에나 볼 수 있었던 콘솔이 뜨지만, 프레임버퍼를 사용하면 해상도도 높아지고, mplayer를 사용하여 동영상도 볼 수 있다. 부팅 스플래시도 이렇게 처리한다.

GRUB 1에서 리눅스 프레임버퍼를 사용하려면 커널 옵션으로 vga=xxx 또는 video=xxx를 추가해 줘야 했다. vga=xxx 옵션을 추가하면 하드웨어 가속을 전혀 사용하지 않는 vesafb를 불러온다. vesafb는 이름처럼 표준적인 기능만 제공해서 VESA 표준이 아닌 해상도(와이드 포함)를 사용하려면 하드웨어 정보를 들여다봐서 모드 값을 알아내야 했다. 이외의 다른 프레임버퍼 드라이버를 사용하려면 video=(프레임버퍼 드라이버) 식으로 지정해 주면 된다.

GRUB 2로 진화하면서 GRUB 구조가 완전히 바뀌면서 프레임버퍼 설정 방법도 바뀌었다. 더 이상 menu.lst 파일의 주석에 정보를 숨기지 않고, 모듈화된 설정 파일로 바뀌었다. 프레임버퍼 설정 역시  GRUB 1에서 썼던 것처럼 vga=xxx라는 커널 옵션을 줘도 커널은 이 옵션을 적절히 무시한다. 그리고 해상도를 지정하기 위해서 암호같은 모드 값을 외울 필요도 없어졌다. 데비안 기준, /etc/default/grub 파일을 수정해 주면 게임이 끝난다. 처음 파일을 열어 보면 다음과 비슷할 것이다.

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
GRUB_GFXMODE=1280x800
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"

보이는 것처럼 menu.lst 파일의 주석 대신 환경 변수를 사용한다. 그래픽 모드를 사용하려면 GRUB_GFXMODE의 주석을 풀고 원하는 해상도 및 색 농도로 설정해 주면 된다. 1024×768의 32비트를 사용하려면 1024x768x32로 입력해 주면 된다. 설정을 업데이트했으면 update-grub 명령을 내려서 실제 grub.cfg 파일에 반영시키면 된다. 다음 부팅 때부터 GRUB은 그래픽 모드에서 실행되며, GRUB에서 설정된 해상도가 리눅스 프레임버퍼까지 간다. 이 과정에서 vesafb 모듈이 자동으로 올라가며, video=xxxxx 옵션을 주면 선택한 드라이버를 사용한다.

내 서브노트북 Q10을 업어오면서, 원래 계획은 intelfb 드라이버를 올려서 X11 없는 GUI 사용이었다. 인텔 830M 그래픽은 분명히 intelfb 드라이버의 지원 목록에 있었다. 하지만 intelfb 드라이버는 유명한 에러 메시지를 내놓으면서, 정작 뚜렷한 해결책도 없었기 때문에 X11을 그냥 올렸고 KDE를 설치했다. intelfb 드라이버의 문제는 다음 문단에 설명한다.

대개의 프레임버퍼 드라이버는 video 옵션만 지정해 주면 되는데, intelfb 드라이버, 특히 노트북에서 사용하려면 상당히 머리가 아프다. GRUB에서 그래픽 환경 설정을 하지 않고 보통의 프레임버퍼 드라이버처럼 video=intel:mode=1024×768 식으로 해상도를 지정해 주면 노트북 사용자들을 좌절하게 만드는 “intelfb: Video mode must be programmed at boot time” 오류가 뜬다. vga=xxx 옵션을 같이 줘 놓으면 비디오 모드는 제대로 찾는데, 이제는 vesafb와 순위 쟁탈전을 벌이면서 “intelfb: cannot acquire agp”나 “intelfb: Cannot reserve FB region” 같은 오류가 뜨면서 기대하던 인텔 프레임버퍼가 뜨지 않는다.

원인을 계속 찾다 보니, 데비안 커널에 내장된 vesafb가 원인이었다. 커널 컴파일을 새로 하면서 vesafb를 빼 버리고, initramfs를 만들면서 intel_agp, agpgart, intelfb 모듈을 추가시켜 줬다. 어차피 프레임버퍼에 관심을 가질 정도로 리눅스를 잘 아는 사람이라면 커널 컴파일이 무엇인지는 알 테니, 여기에서 방법은 생략하겠다. 어떻게 컴파일을 하든, vesafb를 빼고 intelfb를 포함해서 컴파일해야 한다. 내 경우, 서브의 사양이 심각하게 안 좋아서 대부분의 안 쓰는 모듈을 과감하게 빼고 컴파일했다.

커널 컴파일과 initramfs 생성이 끝난 다음, GRUB 설정을 수정해서 video=intelfb 옵션을 추가해 주었다. 반신반의했지만 성공했다. 비디오 모드를 바꿀 수 없다는 경고 메시지가 지나갔지만, 프레임버퍼 정보를 보니 인텔 프레임버퍼를 정확하게 잡아 주었다. 여기까지 왔다면 프레임버퍼를 사용하는 리눅스 프로그램은 무엇이든지 쓸 수 있다. mplayer를 사용해서 영화를 볼 수도 있고, fim으로 그림을 보거나 w3m-img를 설치해서 그림까지 보면서 웹을 즐길 수 있다. fbgrab을 설치하면 프레임버퍼의 스크린샷을 찍을 수 있고, gpm을 설치하면 마우스를 사용할 수 있다.

아래는 부팅 동영상과 실제 인텔 프레임버퍼를 사용한다는 걸 보여 주는 명령들이다.


데비안 intelfb

데비안 intelfb

요약하면, 데비안을 사용하는 노트북에서 intelfb를 제대로 쓰려면 커널을 다시 컴파일해야 한다. 이 때 기본 내장된 vesafb 옵션을 끄지 않으면 서로간의 충돌 때문에 intelfb가 올라오지 않는다. 커널을 새로 설치한 다음, GRUB 설정 파일을 편집해서 원하는 해상도를 설정하고, 리눅스 커널 인자에 video=intelfb를 추가해서 인텔 프레임버퍼를 사용하게 하면 된다.