Computer/Linux / 리눅스

Gentoo on Solaris 10

jswlinux 2010. 6. 10. 06:51
솔라리스를 리눅스처럼 쓰기위한 나의 노력은 참 눈물겹다고나 할까...
솔라리스라는 환상적인 OS와 오픈솔라리스의 불투명한 미래 때문에 시작된 나의 작은 관심은 블로그 포스팅을 거의 안하는 내가 불과 며칠 만에 여러 개의 글을 포스팅할 정도의 열정을 가질 정도였으니...

정식명칭은 Gentoo Prefix Bootstrap for Solaris.
솔라리스에서 작동되는 젠투다. 제목만 봐도 환상적이지 않은가.
뛰어난 솔라리스의 기능에 젠투의 emerge까지. 게다가 젠투가 가진 수만개의 패키지들... 컴파일을 통한 최적화된 설치. 솔라리스의 부족한 패키지를 보충하고도 남을 최고의 선택인 것이다.
하지만 안타깝게도 제대로 설치되지 않는다. 후에 설명한다.

먼저, 본인의 솔라리스 시스템은 OpenSolaris 2009.06 Intel 버전에 AMD 듀얼코어 CPU와 램3기가가 장착된 평범한 32비트 데스크탑 컴퓨터다.
젠투의 설치는 대략 3개의 파트로 나뉜다.
1. 신발끈 묶기 (Bootstrap)
2. 필수유틸 설치
3. emerge sync

먼저,  젠투를 설치하기 위해서는 gcc가 반드시 설치되어있어야한다. 설치되어있지 않다면 아래의 명령어로 gcc를 설치해주자.
$ pfexec pkg install SUNWgcc (3.4.3 버전이어야한다. pkg search SUNWgcc로 확인해보자)

젠투를 빌드할 폴더를 만들어준다. 개인 홈디렉토리에 만들어주면 된다.
$ mkdir gentoo

젠투를 빌드할 경로를 지정해준다.
$ export EPREFIX="$HOME/gentoo"

패스를 설정해줘야하는데, 이 부분에서는 젠투 홈페이지에 있는 것과 내용이 조금 달라서 아래의 경로를 사용하시길 바란다.
export PATH="$EPREFIX/usr/bin:$EPREFIX/bin:$EPREFIX/tmp/usr/bin:$EPREFIX/tmp/bin:/usr/sfw/bin:/usr/sfw/i386-pc-solaris2.11/bin:/usr/gnu/bin:/usr/bin:/bin:/sbin:/usr/sbin"

이제 아래의 경로를 클릭해서 젠투 Prefix 파일을 다운로드 한다.

다운로드를 다 했으면 방금만든 gentoo 폴더에 옮기고 755 퍼미션을 준다.
$ chmod 755 bootstrap-prefix.sh
$ mv bootstrap-prefix.sh gentoo/
$ cd gentoo

이제부터 1단계인 신발끈을 묶을 차례다. 아래의 명령어를 차례대로 입력하면 된다.
듀얼코어(코어2듀오보다 낮은)급 이상이면 별로 오래 걸리진 않는다.
$ ./bootstrap-prefix.sh $EPREFIX tree 
$ ./bootstrap-prefix.sh $EPREFIX/tmp make 
$ ./bootstrap-prefix.sh $EPREFIX/tmp wget 
./bootstrap-prefix.sh $EPREFIX/tmp sed 
$ ./bootstrap-prefix.sh $EPREFIX/tmp python 
$ ./bootstrap-prefix.sh $EPREFIX/tmp coreutils 
./bootstrap-prefix.sh $EPREFIX/tmp findutils3 
$ ./bootstrap-prefix.sh $EPREFIX/tmp tar 
$ ./bootstrap-prefix.sh $EPREFIX/tmp patch 
./bootstrap-prefix.sh $EPREFIX/tmp grep 
$ ./bootstrap-prefix.sh $EPREFIX/tmp gawk 
$ ./bootstrap-prefix.sh $EPREFIX/tmp bash 
./bootstrap-prefix.sh $EPREFIX portage

여기까지는 사실상 거의 문제가 없다. 이 중에서 단 하나라도 실패하면 뭔가 문제가 있는 거다.
이제 2단계로 넘어간다.
bash를 rehash 해준다.
$ hash -r

bash와 컴파일러, 그리고 bin유틸 등 필수유틸들을 빌드한다.
$ emerge --oneshot sed
(어떤 시스템에서는 여기서 에러가 났다. 하지만 emerge의 temp 파일에 가서 직접 make해주면 이상없이 잘 됐다)
$ emerge --oneshot --nodeps bash
$ emerge --oneshot wget
$ emerge --oneshot --nodeps baselayout-prefix
$ emerge --oneshot --nodeps xz-utils
$ emerge --oneshot --nodeps m4
$ emerge --oneshot --nodeps flex
$ emerge --oneshot --nodeps bison
$ emerge --oneshot --nodeps binutils-config
$ emerge --oneshot --nodeps binutils
$ emerge --oneshot --nodeps gcc-config
$ emerge --oneshot --nodeps "=gcc-4.2*"
(시간이 꽤 걸린다. 또한, 요즘 나오는 gcc는 대부분 4.4대라서 =gcc-4.4*로 놓고 컴파일을 해봤는데 에러가 났다. 4.3도 역시 에러가 났다. 일단 매뉴얼에서는 4.2로 설치를 한다)

이제는 새롭게 빌드한 gcc 4.2버전으로 필수유틸들을 빌드한다. 원래 솔라리스에 설치되는 gcc 버전은 3.4.x이다.
$ emerge --oneshot coreutils
$ emerge --oneshot findutils
$ emerge --oneshot tar
$ emerge --oneshot grep
$ emerge --oneshot patch
$ emerge --oneshot gawk
$ emerge --oneshot make
$ emerge --oneshot --nodeps file
$ emerge --oneshot --nodeps eselect
오픈인디아나의 경우는 여기서 에러가 아는데, 왜냐하면 저장소에 파일이 없다! 아래의 위치에서 eselect-로 시작하는 받아서 $EPREFIX/usr/portage/distfiles/에 넣어주자.
http://trumpetti.atm.tut.fi/gentoo/distfiles/
 
이쯤에서 스냅샷을 한 번 찍자.

$ emerge --oneshot pax-utils
문제는 바로 이 pax-utils이다. 여기서 젠투 Prefix를 때려치게됐다.
pax-utils에는 14개의 패키지의 의존성을 갖는다.
gnuconfig, autoconfig, zlib, bzip2, automake-wrapper, libperl, perl, perl-cleaner, help2man, texinfo, autoconf, automake, libtool, gnulib, pax-utils 등의 아주 중요한 툴들이 포함되어있어서 이것들이 빌드가 안되면 아무 것도 못한다는 얘기다.
오픈인디아나 148 버전에서는 정상적인 설치가 가능했다.
 

일단 앞에서 2번째까지인 gnuconfig, autoconfig는 빌드가 잘 된다. 하지만, 다음 패키지인 zlib에서 에러가 나는데, 에러메시지를 보면 scanelf라는 명령어가 없어서 빌드할 수 없다는 메시지가 나온다.
(/export/home/jswlinux/gentoo/var/tmp/portage/sys-libs/zlib-1.2.5-r2/temp/environment: line 4263: scanelf: command not found)
문제는 scanelf라는 명령어는 pax-utils에 포함된 명령어이다. 뭘 어쩌라는 말인지...
그래서 pax-utils 소스를 받아다 빌드를 해서 scanelf라는 명령어를 구했는데 일단 해당 메시지가 나오는 패키지는 컴파일이 됐다 (뭔지는 까먹었다). 이게 잘 되서 다음 패키지로 넘어갔고 두어개 정도가 이상없이 잘 빌드가 됐는데, perl에서 더 이상 진행이 안된다. 에러메시지는 
ld.so.1: as: fatal: libz.so.1: open failed: No such file or directory
라고 나오는 것이다. 분명히 저런 파일들은 라이브러리 디렉토리에 다 있었다. 그래서 혹시나 싶어 
export CC="/usr/sfw/bin/gcc" 라고 해주고 다시 빌드를 해봤지만 좀 되는가 싶더니 여전히 똑같은 에러메시지를 냈다. 이것 때문에 해외의 수많은 웹사이트를 뒤지고 다녔지만 자료가 별로 없었다. 국내는 전무한 상태이고, 솔라리스에 젠투 Prefix가 있는지 아는 사람조차 있을까 싶다.
더 이상 진행이 안되는 데에 시간을 계속 쓰고싶진 않았다. 일단 내 지식으로는 해결이 불가능한 부분이기도 하고...
혹시나 오픈솔라리스가 아닌 그냥 솔라리스10이면 되지 않을까 하는 생각도 들지만 나중에 시간이 나면 해볼 생각이다.
만약 pax-utils가 정상적으로 빌드되신 분들은 아래의 사항을 계속 진행하시면 된다.
다시 한 번 강조하지만,  오픈인디아나에서는 잘 된다. 

Portage를 emerge한다.
$ env FEATURES="-collision-protect" emerge --oneshot portage
오픈인디아나 148 버전의 경우는 여기서 에러가 나는 경우 아래처럼 한다.
mv $EPREFIX/usr/lib/libpython2.7.a 
$EPREFIX/usr/lib/_libpython2.7.a 
처음 부트스트랩 당시 빌드됐었던 파이썬의 바이너리 때문에 컴파일이 안된다는 얘기다. 


이제 임시폴더를 지우고 bash를 rehash한다.
$ rm -Rf $EPREFIX/tmp/*
$ hash -r

tree를 업데이트하자.
$ emerge --sync

system을 emerge한다.
$ emerge -u system
오픈인디아나 148의 경우 여기서 에러가 난다. gcc 4.5.2와 mpc 라이브러리간의 circular dependencies 충돌인데 
아직 해결 못했다.  해결했다. 파일을 하나 열고
$ vi $EPREFIX/etc/portage/package.mask
아래의 내용을 입력한다.
>=sys-devel/gcc-4.2.4-r01.3
그런다음 
$ env FEATURES="-collision-protect" emerge --oneshot findutils
끝나면 다시 USE=-git emerge -uav system 해보자. 리스트 뜬다. 뭐 사실은 해결이라기보단 그냥 gcc 4.5.2를 안쓰겠다고 막아놓은 거다.

또한 grep-2.9에서 에러가 날 경우, 위의 예처럼 grep 2.9 버전도 그냥 막아버리자.
큰 이상은 없을거다. 

참고로 USE 플래그나 CFLAGS 옵션을 따로 주는 방법인데 매뉴얼에 나와있길래 적어본다.
$ echo 'USE="unicode nls"' >> $EPREFIX/etc/make.conf 
$ echo 'CFLAGS="-O2 -pipe"' >> $EPREFIX/etc/make.conf 
$ echo 'CXXFLAGS="${CFLAGS}"' >> $EPREFIX/etc/make.conf

이제 대망의 마지막 작업이다.
$ emerge -e system

이것으로서 솔라리스에 원하는 젠투 패키지를 마음대로 가져다 설치할 수 있다. 남부럽지않은 패키지 시스템을 솔라리스에 갖추게 된 것이다.

Bootstrap된 Prefix 환경을 사용하기 위해서는 아래의 스크립트를 사용할 것을 권장한다.
$ cd $EPREFIX/usr/portage/scripts 
$ ./bootstrap-prefix.sh $EPREFIX startscript