대부분의 리눅스용 프로그램들은 공유 라이브러리를 사용하기 때문에 공유 라이브러리를 설치하기 전에는 모든 설치 작업이 끝난 것이 아닙니다. 라이브러리들을 일일이 수작업으로 설치할 수도 있지만, linux_lib 포트를 사용하여 매우 간단히 설치할 수 있습니다.
% cd /usr/ports/emulators/linux_lib
% make all install
지금까지의 사례(그리고 메일 아카이브도 :-)로 볼 때 ZMAGIC 라이브러리와 링크된 리눅스 바이너리들이 리눅스 에뮬레이션 상에서 제일 잘 동작하는 듯 합니다. (슬랙웨어 2.0에서 사용하고 있는)QMAGIC 라이브러리는 리눅스 에뮬레이터의 동작 마비를 유발시키는 경향이 있습니다. 또한, 어떤 프로그램들은 시스템 라이브러리의 마이너 버전이 다를 경우 경고 메시지를 보내지만, 보통 그다지 문제가 되지 않는 듯 합니다.
만약 ``ports''가 없을 경우 라이브러리를 수동으로 설치해야 합니다. 이를 위해서 프로그램이 필요로 하는 공유 라이브러리와 런타임 링커가 필요합니다. 또한 /compat/linux와 같이 FreeBSD 시스템 상의 리눅스 라이브러리를 위한 "shadow root" 디렉토리를 만들어주어야 합니다. FreeBSD 상에서 실행되는 리눅스 프로그램들에 의해 열리는 공유 라이브러리들은 먼저 이 트리에서 찾으려 할 것입니다. 예를 들어 어떤 리눅스 프로그램이 /lib/libc.so를 로딩할 때, FreeBSD는 먼저 /compat/linux/lib/libc.so를 열려고 할 것이고, 만약 이 라이브러리가 존재하지 않으면 그 다음으로 /lib/libc.so를 열려고 할 것입니다. 공유 라이브러리는 반드시 리눅스 ld.so가 알려주는 경로가 아닌 /compat/linux/lib shadow tree에 설치되어야 합니다.
FreeBSD 2.2-RELEASE 및 그 이후 버전은 /compat/linux에서 조금씩 다릅니다. 라이브러리 뿐만 아니라 다른 모든 파일들도 ``shadow root''인 /compat/linux에서부터 검색이 됩니다.
보통 FreeBSD에서 리눅스 프로그램을 처음 설치할 때에만 필요한 공유 라이브러리들이 있는지 확인할 것입니다. 그 후에는 시스템에 추가 작업 없이 새로 설치한 리눅스 바이너리들을 실행시키기에 충분한 리눅스 공유 라이브러리들을 갖추게 될 것입니다.
linux_lib 포트를 설치하고도 프로그램이 여전히 공유 라이브러리들을 찾을 수 없다는 메시지들을 출력할 때에는 어떻게 해야 할까요? 리눅스 바이너리들이 필요로 하는 공유 라이브러리들을 어떻게 알 것이며, 그것들을 어디서 구해야 할까요? 기본적으로, 두가지 가능한 방법이 있습니다(설치를 위해 여러분의 FreeBSD 시스템에 root 권한을 가지고 있어야 합니다).
만약 리눅스 시스템에 억세스 권한을 가지고 있을 경우, 프로그램이 필요로 하는 공유 라이브러리가 무엇인지 보고 자신의 FreeBSD 시스템으로 복사를 합니다. 예로 둠(Doom)의 리눅스 바이너리를 ftp를 통해 얻어왔을 때를 봅시다. 이것을 리눅스 시스템에 넣고, `ldd linuxxdoom'을 실행하여 어떤 공유 라이브러리가 필요한 지 체크합니다.
% ldd linuxxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29
각 줄의 마지막 열에 출력된 모든 파일들을 얻고, 첫번째 열의 이름들로 심볼릭 링크를 생성하여 /compat/linux에 넣습니다. 이는 결국 FreeBSD 시스템 상에 이러한 파일들을 보유하게 됨을 의미합니다.
/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
만약 'ldd' 출력의 첫번째 컬럼의 주 revision 번호가 일치하는 리눅스 공유 라이브러리를 가지고 있다면 이미 이전에 한번 복사했기 때문에 끝 열의 파일을 FreeBSD 시스템으로 복사하지 않아도 됩니다. 그러나 보다 새로운 버전이면 복사하는 편이 좋습니다. 오래된 버전의 라이브러리는 심볼릭 링크가 새로운 버전을 가리키고 있으면 지울 수 있읍니다. 따라서 여러분의 시스템에 다음의 라이브러리가 있을 경우,
/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27
새로운 바이너리가 다음의 ldd의 출력을 통해 보다 최신 버전의 라이브러리를 요구할 것입니다.
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
만약 맨 끝의 버전 값이 하나나 둘 정도의 차이가 날 때에는 굳이 /lib/libc.so.4.6.29 파일을 복사하지 않아도 됩니다. 이전 버전과 사소한 차이만 날뿐 제대로 동작할 것이기 때문입니다. 그러나 원한다면 libc.so 라이브러리를 바꾸기로 결정한 경우 다음과 같이 심볼릭 링크를 교체해야 합니다.
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
심볼릭 링크를 이용한 방법은 *단지* 리눅스 바이너리에서만 필요하다는 점에 유의하시기 바랍니다. FreeBSD 런타임 링커는 라이브러리의 주 버전 번호를 알아내는데 주의를 기울이며 따라서 버전에 대해 고민할 필요가 없습니다.
이 절은 FreeBSD 2.2-RELEASE 및 그 이후 버전에 대해서만 적용이 됩니다. 2.1-STABLE 버전을 사용하는 분들은 이 절을 넘어가시기 바랍니다.
만약 여러분이 FreeBSD 2.2-RELEASE 버전을 사용하고 있을 경우 리눅스용 런타임 링커 및 설정 파일이 시스템 내에 있어야 합니다. 설정 파일들은 리눅스 시스템으로부터 복사해와서 FreeBSD 시스템 내의 적절한 위치(/compat/linux)에 넣습니다.
/compat/linux/lib/ld.so
/compat/linux/etc/ld.so.config
만약 리눅스 시스템을 억세스할 수 없을 때에는, 다양한 ftp 사이트로부터 필요한 추가 파일들을 받아야 합니다. 파일들을 어디서 찾아 하는가에 관한 정보는 아래에 있습니다. 지금은 이 파일들이 있다고 가정하겠습니다.
다음 파일들을 받아서(버전들이 일치하지 않을 수 있으므로 모든 파일들을 하나의 ftp 사이트에서 받기 바랍니다) /compat/linux에 설치합니다(/foo/bar 는 /compat/linux/foo/bar 가 됩니다).
/sbin/ldconfig
/usr/bin/ldd
/lib/libc.so.x.y.z
/lib/ld.so
ldconfig 및 ldd는 /compat/linux 밑에 있어야 할 필요는 없습니다. 시스템의 아무 곳에나 설치가 가능하며, FreeBSD의 것과 충돌이 일어나지 않도록 하면 됩니다. /usr/local/bin 밑에 ldconfig-linux 및 ldd-linux로 설치하는 것이 좋은 방법입니다.
리눅스 런타임 링커가 검색해야 하는 공유 라이브러리의 디렉토리들을 포함시켜 /compat/linux/etc/ld.so.conf 파일을 생성합니다. 이 설정 파일은 일반 텍스트 파일이며, 각 줄에 각 디렉토리를 포함시켜 줍니다. /lib 및 /usr/lib는 표준이며, 다음을 포함시켜야 합니다.
/usr/X11/lib
/usr/local/lib
리눅스 바이너리가 /lib/libc.so와 같은 라이브러리를 열 때 에뮬레이터는 내부적으로 /compat/linux/lib/libc.so로 대응시킵니다. 모든 리눅스 라이브러리들은 에뮬레이터가 찾을 수 있도록 반드시 /compat/linux 밑에 설치해야 합니다. (즉, /compat/linux/lib/libc.so, /compat/linux/usr/X11/lib/libX11.so 등)
FreeBSD 2.2-RELEASE를 사용할 때에는 리눅스 ldconfig를 실행시켜야 합니다.
% cd /compat/linux/lib
% /compat/linux/sbin/ldconfig
ldconfig는 정적으로 링크되며, 따라서 실행할 때 필요한 공유 라이브러리는 없습니다. ldconfig는 모든 공유 라이브러리들의 이름을 포함하는 /compat/linux/etc/ld.so.cache 파일을 생성하며, 공유 라이브러리들을 추가할 때마다 이 파일들을 다시 생성하기 위해 ldconfig를 다시 실행해야 합니다.
2.1-STABLE 버전에서는 /compat/linux/etc/ld.so.cache를 설치하거나 ldconfig를 실행하지 말기 바랍니다. 2.1-STABLE에서는 시스템 콜들의 구현이 다르기 때문에 ldconfig가 필요하거나 사용되지 않습니다.
이제 libc 공유 라이브러리만 필요로 하는 리눅스 바이너리들을 위해 설정을 해야 합니다. 리눅스 ldd에 대해 실행시켜봄으로써 테스트해볼 수 있습니다. 이를 ldd-linux란 이름으로 설치했다고 가정하면, 다음과 같이 실행해야 합니다.
% ldd-linux `which ldd-linux`
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29
이 작업이 끝나면, 새로운 리눅스 바이너리들을 설치할 준비가 된 것입니다. 새로운 리눅스 프로그램을 설치할 때마다 반드시 공유 라이브러리를 필요로 하는지, 그리고 /compat/linux 트리에 설치해야 하는지 여부를 체크해야 합니다. 이 작업을 하기 위해 새로운 프로그램에 리눅스 버전의 ldd를 실행시켜서 그 출력을 봐야 합니다. ldd(ldd(1) 매뉴얼 페이지를 참고하십시오)는 프로그램이 요구하는 공유 라이브러리들의 리스트들을 `주버전 (점프버전) => 전체 이름'의 형태로 출력할 것입니다.
전체 이름 대신 "not found" 메시지를 출력할 때에는 다른 라이브러리가 필요함을 의미합니다. 필요한 라이브러리는 주 이름에서 볼 수 있으며 libXXXX.so.N의 형태를 갖추고 있을 것입니다. 그러면 리눅스 ftp 사이트에서 libXXXX.so.N.mm을 찾아서 시스템에 설치해야 합니다. XXXX(이름)과 N(주 버젼 번호)는 반드시 일치해야 합니다. 부 버전 번호 mm은 덜 중요하지만 보다 최신의 버전을 얻어오는 것이 좋습니다.