엊그제 블로그에서 언급되었듯이, 예전부터 논의되어 왔던 Dynamic Root가 이제 커밋되었습니다. 흐흐 근데 디폴트는 아니기 때문에 WITH_DYNAMICROOT=yes 를 /etc/make.conf를 넣고 make world를 해주면 Dynamic World로 갑니다. 흐흐 그런데 주의할 점이.. 그냥 마구 했다가는 인스톨하는 도중에 cp나 install같은 바이너리가 동적으로 바뀌어버려서 인스톨이 뻑나면서 시스템 쫑나는 -_- 문제가 생기니까, 최근에 /rescue 생기기 전에 make world하신 분들은 반드시 /usr/src/rescue가서 make install을 먼저 해 주고나서 make installworld를 해야합니당. 에.. 혹시나 벌써 rescue 인스톨하기 전에 installworld해서 이미 쫑난 상태다 싶으신 분들은, 다음 명령으로 우선 응급 처치해 놓으면 그 rescue를 make install할 수 있을 정도로는 됩니다.
|
mkdir /libexec /lib /usr/obj/usr/src/rescue/rescue/rescue cp /usr/lib/*.so /lib/ /usr/obj/usr/src/rescue/rescue/rescue cp /usr/libexec/*.so /libexec/ |
예. 이렇게 해서 Dynamic Root를 만들고 나면 이제 다음과 같이 /bin에 있는 것들이 동적으로 나옵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
alice(perky):~% ldd /bin/sh /bin/sh: libedit.so.4 => /lib/libedit.so.4 (0x2808a000) libncurses.so.5 => /lib/libncurses.so.5 (0x2809f000) libc.so.5 => /lib/libc.so.5 (0x280df000) alice(perky):~% ldd /bin/ls /bin/ls: libm.so.2 => /lib/libm.so.2 (0x28076000) libncurses.so.5 => /lib/libncurses.so.5 (0x2808f000) libc.so.5 => /lib/libc.so.5 (0x280cf000) alice(perky):~% ls /lib /lib: libalias.so.4 libcrypt.so.2 libipsec.so.1 libncurses.so.5 libz.so.2 libatm.so.2 libcrypto.so.3 libipx.so.2 libreadline.so.4 libbsdxml.so.1 libdevstat.so.4 libkvm.so.2 libsbuf.so.2 libc.so.5 libedit.so.4 libm.so.2 libufs.so.2 libcam.so.2 libgeom.so.2 libmd.so.2 libutil.so.3 |
Dynamic Root가 도입되었을 때의 장/단점은..
-
장점
-
디스크 용량을 조금 먹는다: 원래 /bin /sbin은 크런치 바이너리가 아니므로 따로따로 static 바이너리라서 엄청나게 먹었습니다. 그런데, 이제 동적 라이브러리로 링크됐기 때문에, libc부분이 공유돼서 줄어들었고, /rescue의 바이너리들도 전부 크런치된 바이너리 라서, 디스크 용량을 전체적으로 훨씬 적게 먹습니다. NO_RESCUE=yes 하면 더 줄일 수 있지만 요것만은 하지 맙시다 =3 =33
-
플러그인 형태의 공유 라이브러리를 쉽게 쓸 수 있다: nss(dns 캐쉬), pam(Pluggable Authentication Module) 같은 플러그인 형태의 모듈들을 쉽게 쓸 수 있게 됩니다. 그동안 pam같은 경우에는 /bin/login 같은 곳에서 쓸라면 아주 힘들었는데, 이제 pam을 붙일 수 있는 형태로 만들 수 있으니 만세입니당.
-
휴지통이나 libfsxlat같은 라이브러리를 쓸 수 있다: LD_PRELOAD 흑마법을 기반으로 한 시스템콜 가로채기 라이브러리인 trashcan이나 libfsxlat같은 것들을 이제 /bin /sbin에 있는 녀석들 한테도 쓸 수 있겠죠.
-
단점
-
업글 잘못하면 클난다: 리눅스 사용해 보신 분들은 몇 번 겪으셨겠지만, Dynamic Root는 업글 잘못하면 난리가 나서.. 아주 고생을… 그래서 FreeBSD에서는 /rescue에 원래 /bin과 /sbin에 있던 바이너리 전체를 크런치해서 넣어두었습니다.
-
실행 속도가 느려진다: 공유 라이브러리들을 쓰면 프로그램이 뜰 때마다 리로케이션하느라 힘들어져서, 뜨는 속도가 제법 느려지고, PIC(Position-Independent Code) 생성때문에 최적화에서 불리해져서, 또한 별로 좋은 효과가 들어가지는 않습니다.
흐물~ 뭐.. 5.2에서 너무 많이 바뀌고 있는 것 같아서 좀 불안하긴 하지만, NetBSD도 그랬듯, 뭐 좀 지나면 괜찮아 지겠죠 -ㅁ-;