이 글의 제목은 다소 포괄적으로 들릴 수 있으니, 먼저 범위를 좁혀 기대치를 맞춰보겠습니다. 전제 조건은 다음과 같습니다. 여러분은 이전에 VirtualBox를 사용해 왔고, 리눅스 가상머신에 Guest Additions(게스트 애디션)를 설치한 적이 있습니다. 그런데 어느 순간부터 게스트 운영체제에서 VirtualBox 서비스가 더 이상 실행되지 않습니다. 모듈을 다시 설치하려고 하면 커널 설정 오류, 소스 및 헤더 누락 등을 원인으로 지목하는 낯선 오류가 발생합니다. 문제는 이런 진단이 하나도 말이 되지 않는다는 점입니다.
실제로 올바른 커널 소스와 헤더가 모두 설치되어 있는데도 VirtualBox는 이를 인식하지 못하고, 메인 커널 모듈 컴파일이 실패하며, 결국 가상머신 동작에까지 영향을 미칩니다. 더욱 골치 아픈 것은 이 문제가 거의 무작위적으로 발생하고, 특히 커널 업데이트 이후 자주 나타난다는 점입니다. 이제 간단하지만 효과적인 방법으로 이 문제를 해결해 보겠습니다.
문제 상황
CentOS 가상머신을 예로 들어 보겠습니다. 필요한 빌드 도구는 모두 갖춰져 있으며, 이전에 이 운영체제에서 Nvidia 드라이버를 설정할 때와 동일한 절차를 밟으면 됩니다. 다른 배포판을 사용하더라도 컴파일에 필요한 도구와 패키지를 준비하는 과정은 대동소이하므로, 한 번 익히면 어렵지 않습니다. 그런데 모듈을 빌드하는 단계(<mount>/VBoxLinuxAdditions.run 실행)에서 명령이 실패합니다:
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If
the following module compilation fails then this could be the
reason. The missing package can be probably installed with
yum install kernel-devel-...
Building the main Guest Additions module [FAILED]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
안내대로 누락된 것으로 보이는 패키지를 설치하려고 하면 어떻게 될까요?
Package kernel-devel-... already installed and latest version
Nothing to do
이미 최신 버전이 설치되어 있다는 답만 돌아옵니다. 그렇다면 원인은 어디에 있을까요?
해결 방법
이제 로그를 확인해야 합니다. 이 과정은 훌륭한 트러블슈팅 연습이기도 하며, 리눅스 문제 해결 능력을 한층 끌어올려 줄 것입니다. 로그 파일(/var/log/vboxadd-install.log)을 열어 살펴보세요. 마지막 에러부터 위쪽으로 거슬러 올라가며 무엇이 잘못되었는지 파악하는 것이 좋습니다. 눈에 띄는 에러 중 하나는 다음과 같습니다:
Error: unable to find the sources of your current Linux kernel.
Specify KERN_DIR=<directory> and run Make again. Stop.
흥미롭습니다. VirtualBox가 정말로 커널 소스를 찾지 못하는 것 같습니다. 그럼 안내에 따라 KERN_DIR 환경 변수를 지정하고 다시 시도해 보겠습니다.
export KERN_DIR=/usr/src/kernels/`uname -r`
하지만 여전히 해결되지 않습니다. 다른 에러를 찾아야 합니다. 실제로 설치 스크립트는 '소스(sources)'가 아니라 '헤더(headers)'를 찾지 못한다고 불평했습니다. 즉, 문제는 다른 곳에 있을 가능성이 높습니다. 로그를 다시 샅샅이 살펴보면 다음과 같은 줄을 발견할 수 있습니다(커널 버전 자체는 중요하지 않습니다):
grep: /lib/modules/3.10.0-123.20.1.el7.x86_64/build/include/
linux/version.h: No such file or directory
거의 이상한 버그처럼 보입니다. yum 조회 결과로 알 수 있듯 헤더 패키지는 분명히 설치되어 있기 때문입니다. 그러나 실행 중인 커널의 /lib/modules 디렉터리로 직접 이동해 확인해 보면, 실제 원인은 깨진(broken) 심볼릭 링크임을 알 수 있습니다.
build 링크가 상대 경로(relative path)를 가리키고 있는데, 이는 결코 바람직하지 않은 구성입니다. 바로 이 때문에 VirtualBox가 기대하는 헤더 파일을 찾지 못하는 것입니다. 절대 경로(absolute path)를 사용하도록 수정하면 문제를 근본적으로 해결할 수 있습니다.
cd /lib/modules/`uname -r`/
ln -sf /usr/src/kernels/3.10.63-11.el7.x86_64 build
이제 심볼릭 링크가 올바르게 수정되었으며, 문제없이 모듈을 컴파일할 수 있습니다.
마무리
여기까지 따라오셨다면 이제 조금 더 현명하고, 여유로워지셨기를 바랍니다. 이런 종류의 문제는 사람을 미치게 만들 수 있습니다. 유사한 오류를 일으킬 수 있는 오탐(false positive) 증상이 수십 가지나 존재하기 때문입니다. 하지만 빌드 환경 자체의 문제를 제외하고, "예전에는 잘 동작했다"는 사실을 상기하면 VirtualBox와 커널 간의 호환성 문제는 배제하고 다른 원인을 찾아봐야 합니다.
이번 사례에서는 제대로 구현되지 않은 심볼릭 링크가 모든 문제의 근원이었습니다. 왜 이렇게 되었는지, 무엇이 링크를 변경했는지는 확실치 않지만, 설치된 일부 패키지가 이를 변경했거나 시스템의 어떤 요소가 오작동했을 가능성이 있습니다. 핵심은 문제 해결 흐름을 이해하고, 원인을 역추적하여 직접 고칠 수 있다는 점입니다. 이것으로 가이드를 마무리합니다. 즐겁게 활용하시기 바랍니다.