by 빌 스윙글(Bill Swingle)
FreeBSD 사용자들은 FreeBSD OS의 속도와 안정성에는 찬사를 보내왔지만, 리눅스가 가진 새로운 애플리케이션을 따라 잡기 위해 노력해 온 것도 사실이다. 리눅스가 사람들의 주목을 끌면서 소프트웨어 벤더들은 자사의 애플리케이션을 FreeBSD보다는 리눅스에 포팅해 왔던 것이다.
FreeBSD에서는 이러한 상황을 타계할 만한 노력을 하며, 리눅스 바이너리 호환성(Linux Binary Compatibility)이라는 것을 만들어 냈다. 이로써 정렬이나 에뮬레이션이 없어도 FreeBSD가 수정 없이 모든 리눅스 애플리케이션의 90% 가량을 구동할 수 있다. 이러한 애플리케이션으로는 스타오피스, 넷스케이프, 어도비 애크로뱃, 리얼플레이어, 그리고 VMWare와 오라클 데이터베이스 서버와 같은 복잡한 애플리케이션이 있다. 리눅스 바이너리가 리눅스보다 FreeBSD에서 더 잘 수행하는 경우도 있다.
어떻게 작동하는가?
모르는 사람이 많지만, ELF 바이너리 형식은 소위 "브랜딩(branding)", 즉 바이너리를 특정 OS를 위한 것으로 마크하는 것을 가능하게 한다. 하나의 형태에서만 구동되도록 바이너리를 만들기 때문에 대부분의 OS는 자사의 바이너리를 굳이 브랜딩하지 않는다.
FreeBSD는 ELF 바이너리를 브랜딩함으로써 이러한 특성을 잘 이용하는데, ELF 바이너리를 FreeBSD 바이너리와 조금 다르게 다룬다. 설치한 호환 시스템에서 필요한 부분을 가지고 있으면, 리눅스 바이너리가 필요로 하는 라이브러리와 유틸리티 역시 모두 가지고 있는 게 된다. 파일 시스템의 다른 부분에 있을 뿐이다. FreeBSD는 FreeBSD 바이너리와 리눅스 바이너리를 구분하기 때문에 리눅스 바이너리가 표준 FreeBSD 라이브러리 대신 다른 라이브러리 셋을 이용하도록 만든다.
설치와 설정
FreeBSD을 out-of-the-box로 설치하는 것에는 기본적으로 리눅스 바이너리 호환이 없다. 리눅스 바이너리 호환을 추가하려면 두 가지를 해야 한다. 커널을 설정해서 커널이 리눅스 바이너리를 인식해야 하고, 리눅스 바이너리가 의존하는 런타임 라이브러리를 설치하여야 한다.
커널 설정
커널 부분은 비교적 쉽다. 두 가지 방법이 있다. 첫째로
linux 명령을 실행해서 FreeBSD 기초 시스템(base system)과 함께 나타나는 커널 모듈을 로드하는 것인데, 이 때는 라인에
/etc/rc.conf를 덧붙여서 모듈이 부트시 자동으로 로드되게 한다.
이 방법으로 할 때엔
kldstat 명령으로 리눅스 모듈이 로드되는지 확인해 봐야 한다 .
$ kldstat
Id Refs Address Size Name
1 2 0xc0100000 20e8e4 kernel
2 1 0xc0f47000 10000 linux.ko
|
커널 모듈을 로드하는 게 싫거나, 이유가 있어 다른 방법으로 해야 한다면, 설정 파일에서 다음을 입력하여 새로운 커널을 만들면 된다. 이것이 두 번째 방법이다.
어떤 방법을 택하건 간에, 커널을 설정하는 데는 10k 정도의 공간만 차지하게 되므로 성능 저하와 같은 문제는 걱정할 필요가 없다.
런타임 라이브러리 설치
리눅스 바이너리를 인식하는 커널을 설정했으면, 리눅스 라이브러리가 의존하는 런타임 라이브러리를 설치해야 한다. 이것 역시 간단하다. 가장 쉬운 방법은
linux_base 포트를 설치하는 것이다.
# cd /usr/ports/emulators/linux_base
# make all install
|
/compat/linux에 필요한 라이브러리가 전부 설치될 것이다.
리눅스 ELF 바이너리 구동
해당 리눅스 바이너리가 바로 컴파일되었으면, "리눅스" 브랜드가 있어야 한다. 하지만 몇몇 바이너리는 추가적인 설정을 해 줘야 한다. 리눅스 바이너리를 돌리고 있고 다음과 같은 오류가 뜨면,
$ ./some-linux-program
ELF binary type not known
Abort
|
리눅스 바이너리로 "브랜드"해야 한다. FreeBSD 기초 시스템에 있는
brandelf 프로그램을 사용하면 된다.
# brandelf -t Linux some-linux-program
|
리눅스 바이너리를 전부 구동할 수 있어야 위의 단계를 완벽하게 한 것이다.
FreeBSD에서는 지원되지 않고 리눅스에서만 지원되는 OS가 있다. 이러한 OS가 리눅스
/proc 파일 시스템(이는 선택적인 FreeBSD /proc 파일 시스템과는 다르다)이나 i386에만 한정된 요청(가상 8086 모드를 가능하게 하는 것과 같은)을 많이 사용하고 있다면, FreeBSD에서 리눅스 바이너리가 작동하지 않을 수도 있다는 것을 주의하자.
빌 스윙글(Bill Swingle)은 FreeBSD 프로젝트의 수석 시스템 관리자이다.