수시로 업데이트함. 절대 불펌 금지

일반
일반 어플리케이션에서의 Home/End키 바인딩 (재부팅 불필요)
vi ~/Library/KeyBindings/DefaultKeyBinding.dict
{
/* home */
"\UF729" = "moveToBeginningOfLine:";
"$\UF729" = "moveToBeginningOfLineAndModifySelection:";

/* end */
"\UF72B" = "moveToEndOfLine:";
"$\UF72B" = "moveToEndOfLineAndModifySelection:";

/* page up/down */
"\UF72C" = "pageUp:";
"\UF72D" = "pageDown:";
}

VMware Fusion의 Disk IO로 인한 시스템 부하 해결
자주 안쓴다면 VMware 데몬을 꺼준다.
sudo vi  /Library/LaunchDaemons/com.vmware.launchd.vmware.plist 
11번째 라인 <string>--start</string>을 <string>--stop</string>으로 수정
이렇게 하고나면, VMware 구동시 미리 sudo /Library/Application Support/VMware Fusion/boot.sh --start 를 실행해서 데몬을 올려야한다.
이게 귀찮을시, 데몬이 떠있는지 안떠있는지를 검사해서 안떠있으면 띄우고 VMware를 실행하는 애플스크립트를 만들어서 응용프로그램으로 컴파일한다.
set isRunning to do shell script "ps -ef | grep vmnet | grep -v grep | wc -l |sed 's/ //g'"
if isRunning is "0" then
	do shell script "/Library/Application\\ Support/VMware\\ Fusion/boot.sh --start" with administrator privileges
end if 
tell application "VMware Fusion" to activate
 

 

터미널
터미널 로그인 메시지 (Message Of The Day): /etc/motd
iTerm 과 터미널을 그간 쭉 비교해봤지만 본인은 하드코어유저가 아니라서 iTerm이 뭐가 더 나은지 도저히 모르겠다. Visor와 결합된 Terminal.app은 최고!

/etc/bashrc  참고사항
alias ls='ls -vGF'
v는 한글표시, G는 컬러표시, F는 디렉토리 / 표시
젠투 스타일 PS1: PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\$\[\033[00m\]
여기서 w를 대문자로 적으면 "현재 디렉토리"를 표시.
터미널에서의 한글입력을 바로하기 위해 $HOME/.inputrc
set convert-meta off
set meta-flag on
set output-meta on
터미널에 나오는 호스트명 변경
sudo scutil --set HostName 이름 (PS1을 수정하는 게 더 나을 수도 있음)

Terminal.app에서의 Home/End키 바인딩
vi ~/.inputrc
# Be 8 bit clean.
set input-meta on

set output-meta on

set convert-meta off


# Auto completion options

set show-all-if-ambiguous on

set completion-ignore-case on


# Keybindings

"\e[1~": beginning-of-line       # Home key

"\e[4~": end-of-line             # End key

"\e[5~": history-search-backward # Page Up

"\e[6~": history-search-forward  # Page Down

"\e[3~": delete-char             # Delete key

"\e[5C": forward-word            # Ctrl+right

"\e[5D": backward-word           # Ctrl+left


그리고 Terminal.app를 열고 환경설정 cmd+, 열고 Setting -> Keyboard에서 아래의 항목을 찾아 변경
(더블클릭하면 변경할 수 있으며, \033 문자는 ESC키를 누르면 입력된다)
Home - send string to shell: \033[1~
End - send string to shell: \033[4~
Page up - send string to shell: \033[5~
Page down - send string to shell: \033[6~
Shift page down - scroll to next page in buffer
Shift page up - scroll to previous page in buffer

참고로 Home/End키가 없는 맥북 등에서는 Fn+화살표 키로 Home/End/PageUp/PageDown 작동됨.


서버공통
대부분의 서비스 데몬은 SSL을 사용하지 않더라도 켜줘야만 모바일 기기나 클라이언트들이 제대로 인식함
위키, 블로그, 서버: http://localhost
그외 서버들
웹메일 서버: http://localhost/webmail
아이캘 서버: http://localhost/ical
스노우 레퍼드 서버 설치가 끝난 뒤 첫부팅에서 설정시, 유저데이터와 서버 데이터를 다른 하드로 지정가능.
하지만, 나중에 재설치를 하게 되면, 다른 하드를 재지정할 수 없다. 한 마디로 무용지물.
(단, Netboot는 그대로 쓸 수 있다)

아이캘/위키/블로그 서버 등의 모든 css 및 이미지 파일은 /usr/share/collaboration/ 에 있으며,
메인 페이지 index.html에서 보여지는 css및 이미지 파일은 /usr/share/collaboration/css/serverhome_static 에 있음.

초기에 /etc/service에서 ssh 22번 포트를 변경하면 Server Preferences 작동 안되는 현상이 있었으나, 원상복귀 후 정상작동 확인. 그 이후에 다시 포트를 변경했으나 여전히 정상작동.

iLife09 설치하면 디렉토리 서비스 통째로 날려먹는다. 해결책은 타임머신을 통한 복구 혹은 재설치 이외엔 없다.
절대로 설치하지 말자.

SSL 인증서 때문인지 모르겠지만, 서버의 이름을 바꾸게 되면 아주 심각한 문제에 부딪치게 된다. 오픈디렉토리에 접근할 수 없는 현상이 생기는데, 웹서버의 경우 버츄얼 호스트 기능으로 다수의 도메인 네임을 가질 수 있지만 웹서버가 아닌 서버 자체의 이름 (처음 설치할 때 입력하는 서버이름)을 다른 이름으로 바꾸거나, 혹은 SSL 인증서를 다른 도메인 이름으로 만든 뒤 그것에 우선권을 주게 되는 경우 오픈디렉토리에 접근할 수 없게 되고 결국 로그인을 해야하는 모든 서비스를 이용할 수 없게 된다.

에어포트 익스트림 베이스 스테이션(이하 AEBS) 사용시, 맥미니서버가 AEBS을 Firewall로 간주/세팅.
다 좋은데, Server Preferences에서 On/Off 할 때마다 AEBS을 재부팅하기 때문에 불편.
맥(미니)서버에서 에어포트 유틸리티 실행시, AEBS의 포트포워딩 항목의 필요한 부분을 전부 등록해줘서 편하지만 만약 다른 맥/PC에서 에어포트 유틸리티를 실행하게 되면 맥(미니)서버에서 등록해준 포트포워딩 항목을 모조리 삭제.
서버에서 몇가지 일부 항목은 변경시 AEBS을 재부팅해야함.
AEBS가 재부팅되면서 포트포워딩이 모조리 off.

맥서버를 운영 중인 상황에서 다른 맥을 재설치하거나 새로운 맥이 로컬 네트웍에 접속시 맥서버로부터 메일/캘린더/주소록 등의 초대를 받게 되는데, 이걸 수락하게 될 경우
시스템 설정 - 계정 - 로그인옵션 - 네트워크 계정 서버 에 자동으로 조인된다. 네트워크 계정서버에 조인하게 되면 /Users/ 디렉토리의 퍼미션이 655로 바뀌면서 root로도 퍼미션 수정 및 접근 자체가 안되는 현상이 생긴다. 또한, /Users 안에 계정 폴더가 있음에도 불구하고 인식을 못하는 현상이 생긴다. 자세한 건 공부를 더 해봐야겠지만, 말 그대로 "네트워크 계정 서버"라서 계정을 원격으로 읽어오는 그런 것 같은데, 암튼 작동 불가능. 초대는 무조건 거절하고, 네트워크 계정서버에는 절대 조인하지 말 것.

서버 이름 지정시, 로컬 네트워크 이름은 그대로 두되 Primary DNS의 이름은 실제 도메인으로 서비스 중인 서버가 아니라면 절대 도메인을 지정하지 말고 내부 도메인을 줘야한다. 예:) server.private
다시 말해서, abc.com이라는 도메인으로 실제 서버를 운영 중이라고 하더라도 abc.com의 네임서버가 맥서버로 바로 지정되어있지 않은 경우는 주면 안된다. 주게되면 Xgrid, iCal Server Utility 및 Kerberos 인증 등 몇가지 서비스가 작동되지 않는다.


웹서버
확장자가 html로 끝나는 파일에 아무리 php코드를 넣어도 작동이 안될 경우 /etc/apache2/httpd.conf 파일을 열어 AddType이 명시된 줄 맨 아래에다 다음을 입력한다.
AddHandler php5-script php html

Wiki/Blog에서 YouTube embed tag를 넣으면 자동으로 삭제하는 현상이 있다. 해결방법은 다음과 같다.
$ cd /Library/Application\ Support/Apple/WikiServer/
$ sudo vi whitelist.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>protocols</key>
        <array>
                <string>irc</string>
                <string>scp</string>
        </array>
        <key>styles</key>
        <array>
                <string>font-size</string>
        </array>
        <key>tags</key>
        <dict>
                <key>object</key>
                <array>
                        <string>width</string>
                        <string>height</string>
                </array>
                <key>param</key>
                <array>
                        <string>name</string>
                        <string>value</string>
                </array>
                <key>embed</key>
                <array>
                        <string>src</string>
                        <string>type</string>
                        <string>width</string>
                        <string>height</string>
                </array>
        </dict>
</dict>
</plist>

내용을 확인한다.
$ file whitelist.plist 
whitelist.plist: XML  document text

$ sudo chown _teamsserver:_teamsserver whitelist.plist
$ sudo chmod 644 whitelist.plist
$ sudo apachectl -k restart


아이캘 서버
아이폰에서 아이캘 서버와 동기시, 아이폰에서 계정을 추가해야함.
아이캘 서버 유틸리티에서 Preferences의 Authentication을 Kerberos하면 에러남.
아이캘 서버의 초대기능은 아이폰에서 사용할 수 없음.


주소록 서버
주소록 서버의 경우, 서버의 주소록에서 On My Mac이 아닌, Preferences의 Accounts에서 계정을 별도로 생성한 뒤, 클라이언트의 주소록에서 해당 계정을 동기화해야함.
또한, 주소록 서버의 Push 기능은 아이폰 펌웨어 3.x 버전에서는 작동하지 않음. iOS4에서는 된다고 한다.


유저 관리
Workgroup Manager 실행시 ID는 diradmin, Password는 관리자로 등록된 유저의 비밀번호


하드디스크 공유
맥미니 서버버전의 경우, 하드디스크가 2개 장착되어있는데, 클라이언트에서 서버에 접속하면 두번째 하드는 접근할 방법이 없다. 따라서 임의의 마운트 포인트를 지정해줘야하는데, 세 가지 방법이 있다.
1. 심볼릭 링크를 걸어준다. 다만 이 경우 ssh 등에서는 문제가 없지만 smb, afp 등으로 접속하면 접근이 불가능하다.
2. disk utility를 열고 원하는 파티션을 클릭해 UUID 값을 복사한다. 그런 다음 원하는 디렉토리를 만들고 /etc/fstab을 열고, 다음과 같이 입력한다.
UUID=복사한 UUID값 /원하는 디렉토리 hfs rw 1 2
예제: UUID=9A1D30FE-964D-3483-89D2-F33DCD36FEFE /Users/Data hfs rw 1 2
이것의 문제점은 심볼릭 링크와 똑같다. 분명히 원하는 디렉토리에 볼륨이 마운트 되어있는데 클라이언트에서 보면 아예 보이질 않는다.
3. 가장 확실한 방법이다. Server admin을 실행시키고 AFP로 이동한다.
원하는 볼륨을 클릭하면 우측상단에 Share라는 작은 버튼이 있다. 그걸 클릭하면 하단에 세 가지 탭이 나오는데, Share Point를 누르고 Enable Automount에 체크, 그리고 Edit을 누른다. Custom mount path에 원하는 경로를 입력한다.
사실 터미널 열고 확인하면 그냥 똑같은 심볼릭 링크인데 이 경우는 afp, smb에서도 아주 잘 나온다.


RADIUS 
애플의 에어포트 베이스 스테이션 사용시, RADIUS 서비스 데몬을 키고 설정을 마치면 스노우 레퍼드 서버가 임의로 베이스 스테이션의 세팅과 비번을 바꿔버려서 공유기 사용이 불가능해진다. 이게 뭔지 확실히 아는 경우만 쓰자.


퀵타임 스트리밍 서버
퀵타임 서버 포트: 554, 퀵타임 관리자 메뉴 포트: 1220 (모두 웹으로 접속)
http://localhost:554/


메일서버
애플답지 않게 의외로 서버 어드민 패널에서 일부 설정이 불가능한 사항이 있다. 이는 터미널에서 수작업으로 해줘야하는데, 다행히 Squirrel Mail의 설정프로그램이 있다. 아래의 명령어를 터미널에서 실행한다.
sudo /usr/share/squirrelmail/configure
사용법은 Squirrel Mail 사이트의 매뉴얼을 참고한다.


Netboot
먼저 NFS를 활성화시켜야한다. 그런 뒤, Netboot 설정의 Settings - General 으로 가서, 이미지와  Userdata의 대상하드드라이브를 선택해준 뒤 저장을 한다. 그리하면 대상 하드드라이브의 루트폴더에  /Library/Netboot/NetBootSP0 이라는 폴더가 생성된다.
다음, dmg로 작성된 이미지나 혹은 DVD를 연결한 후(타겟모드 등) 서버유틸의 System Image Utility 실행, Netboot 이미지 만드는데에서 그대로 따라하면 되는데, 결정적으로 중요한 점은(이것 때문에 1시간 소비) 이미지가 생성되는 폴더의 이름은 NetBootSP0이 맞지만 위치를 잘 보면 엉뚱한 곳에 있다. 이것을 위의 세팅에서 잡아준 곳으로 변경한다.

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,
Mac OS X Snow Leopard 10.6에서 빌드 완료했습니다.
Mac OS X Lion 10.7에서 빌드 완료했습니다.

맥에서 실행되는 젠투설치 매뉴얼이다.
사실 맥에서는 젠투 Prefix를 설치할 필요가 그다지 절실하진 않은데 그 이유는,

1. 맥은 솔라리스와는 다르게 어플리케이션이 엄청나게 많다. 게다가 무료 어플리케이션이 리눅스만큼 있다. 못믿으시겠다고? 그래서 맥은 써봐야 안다는 거다.
2. 수많은 어플리케이션 말고도 FreeBSD의 Ports 시스템까지 있어서, 맥 쓰면 어플부족으로 곤란한 경우는 없다.
사실 어플의 숫자를 따지자면 리눅스랑 막상막하라고 볼 수 있는데다, 프로그램의 질이나 수준을 따지면 맥의 어플이 질적인 면에서 더 뛰어나다고 할 수 있겠다 (본인 생각이다). 게다가 양적으로도 밀리지 않고.

그럼에도 불구하고 맥에서 젠투 prefix를 설치한 건 어디까지나 개인적인 관심에 의해서다.
또 다른 이유가 하나 더 있다면, MacPorts는 Mac OS X에 이미 설치되어있는 툴들을 아주 당연히 무시해버린다. 무슨 말인고하니, 맥이 유닉스 기반이라는 건 다들 아시는 사실이니까 하는 말이지만 맥은 기본적으로 Perl, Python 등의 기본적인 툴들이 포함되어있고, Xcode를 설치하면 gcc등 각종 프로그래밍 언어의 컴파일러들까지 딸려온다. 그런데, MacPorts는 이렇게 설치되어있는 툴들을 무시해버리고 처음부터 끝까지 전부 다 설치해버린다. 즉 다시 말해서 BitTorrent라는 어플리케이션을 설치하기 위해서 Python, ncurses부터 빌드하기 시작해서 수많은 라이브러리/툴들을 모두 설치하고나서야 비로소 어플리케이션이 설치된다는 말이다. 그런데 이것들이 좀 가벼운 것들이 아닐테니 이미 시스템에 있는데도 불구하고 시간을 낭비해가면서 다시 설치해야한다는 거다.
뭐 사실, 다시 다 설치한다는 점을 비롯해서 이 글에서 설명하려는 Gentoo on Mac OS X이랑 별반 다를 건 없지만, 앞서 말했듯 개인적인 관심에 의한 것이고, MacPort가 애플의 지원을 받고있다고는 하지만, 개인적으로 젠투의 프로젝트가 더 끌리기 때문이다. 
하지만 MacPorts가 가진 어플리케이션의 양이 어마어마한 수준이기 때문에 젠투 Prefix에 없는 패키지들은 Ports를 통해야하고 결국 둘 다 공존해야한다는 결론이 내려진다. 

어쨌든... 젠투 Prefix가 뭔지 모르시는 분들을 위해 설명을 하자면, 젠투의 포티지 시스템을 로컬 시스템의 OS에 설치해서 쓰는 방식의, 젠투 프로젝트의 하나이다. 설명이 좀 어려운데, 다시 말씀드리자면, 맥 OS X을 건드리지 않고 젠투의 emerge 명령어를 통해 어플리케이션을 빌드할 수 있는 젠투의 포티지 시스템을 설치하는 것이다. 이것이 MacPorts와의 다른 점이 하나 있는데, MacPorts 자체는 이미 컴파일되어있는 바이너리를 가져와서 그냥 설치하기만 하면 되지만 (물론 어플들은 컴파일을 통해서 설치한다), 젠투는 처음부터 끝까지 모두 컴파일이라는 점, 그리고 Ports는 root 권한이 필요하지만(/opt 밑에 설치된다) 젠투는 개인폴더에 설치되서 운용이 가능하다는 점이다.

설치는 단 한 번의 에러도 없이 완벽히 됐고 그 방법을 매뉴얼화 한다.
먼저 젠투 Prefix 폴더를 만들고 패스를 지정해준다.
$ mkdir gentoo
$ export EPREFIX="$HOME/gentoo"
$ export PATH="$EPREFIX/usr/bin:$EPREFIX/bin:$EPREFIX/tmp/usr/bin:$EPREFIX/tmp/bin:$PATH"

이제 아래의 링크를 클릭해서 Prefix 스크립트를 받고 gentoo 폴더로 옮겨서 755 권한을 준다.
$ chmod 755 ~/Downloads/bootstrap-prefix.sh
$ mv ~/Downloads/bootstrap-prefix.sh ~/gentoo
$ cd ~/gentoo

이제 신발끈을 묶자.
$ ./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 coreutils6
   (컴파일 실패하면 coreutils로 해본다)
$ ./bootstrap-prefix.sh $EPREFIX/tmp findutils
$ ./bootstrap-prefix.sh $EPREFIX/tmp tar15
$ ./bootstrap-prefix.sh $EPREFIX/tmp patch9
$ ./bootstrap-prefix.sh $EPREFIX/tmp grep
$ ./bootstrap-prefix.sh $EPREFIX/tmp gawk
$ ./bootstrap-prefix.sh $EPREFIX/tmp bash
$ ./bootstrap-prefix.sh $EPREFIX portage

rehash 해준다.
$ hash -r

이제부터 필수툴들을 빌드한다.
$ emerge --oneshot -q sed (개인적으로 emerge에서는 -q 옵션을 권장한다. -q는 컴파일 메시지를 보여주지 않는다.)
$ emerge --oneshot -q --nodeps bash
$ emerge --oneshot -q pax-utils
$ emerge --oneshot -q --nodeps xz-utils
$ emerge --oneshot -q --nodeps "<wget-1.13.4-r1" 
(에러날 시  
emerge --oneshot -q --nodeps wget)
$ emerge --oneshot -q --nodeps baselayout-prefix m4 flex bison binutils-config

gcc -v를 해서 gcc의 버전을 확인한다. 만약 4.0.1이면, 
$ emerge --oneshot -q --nodeps "=binutils-apple-3.2"

를 실행하고, 그 4.2.1 버전이면
$ emerge --oneshot -q --nodeps "=binutils-apple"

를 실행한다. Lion이면 후자일 확률이 매우 높다. 
 
$ emerge --oneshot -q --nodeps gcc-config gcc-apple (gcc 컴파일이라 시간이 좀 걸린다)

여기서부터는 방금 전 새롭게 컴파일한 gcc로 기본 툴들을 다시 컴파일하는 과정이다.
$ emerge --oneshot -q coreutils findutils tar grep patch gawk make
$ emerge --oneshot -q --nodeps file eselect

이제 부트스트랩된 포티지가 덮어씌여질 수 있도록 임시로 세팅을 바꿔서 포티지를 emerge한다.
$ env FEATURES="-collision-protect" emerge --oneshot -q portage

이제 임시파일을 지우고 rehash한다.
$ rm -Rf $EPREFIX/tmp/*
$ hash -r

포티지 트리를 업데이트 하자.
$ emerge -q --sync

Prefix 설치를 마무리할 수 있게끔 시스템을 빌드하자.
$ env USE=-git emerge -uq system

이제 대망의 마지막 작업이다. 여기서는 USE, CFLAGS를 지정해서 컴파일을 할 수 있다.
인텔 아이맥 코어2듀오 유저나 15인치 i5 맥북프로 유저라면 필자의 CFLAGS를 추천한다. 맥 좋은 게 뭔가. 동일한 플랫폼 아닌가. 아마 똑같이 작동할 거라고 믿는다. 필자의 CFLAGS는 젠투를 10번을 넘게 컴파일해가면서 얻어낸,  적어도 맥에서만큼은 안정적으로 작동하는 것들이다.
참고로, 아이맥 20", 24", 맥미니서버, 맥북프로 15" i5, i7에서 모두 빌드완료했다.

$ vi $EPREFIX/etc/make.conf

빈 파일이다. 내용을 입력해넣자.
CFLAGS="-mtune=core2 -march=core2 -mssse3 -msse3 -O3 -pipe -fomit-frame-pointer -funroll-loops"
CXXFLAGS="${CFLAGS}"
ACCEPT_KEYWORDS="amd64"
MAKE_OPTS="-j3"
LINGUAS="en ko"
USE="unicode nls"

위의 MAKE_OPTS에서는 자신이 쓰는 PC의 CPU 코어에 1을 더하면 된다.
Core i7이라면 코어가 4개일테니 5를 적어주면 되겠다.

혹시나 싶어 링크를 드린다. 안전한 CPU별 CFLAGS이다. http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel
이제 마지막 작업이다. 새로운 CFLAGS와 이것들을 빌드하기 위해서 그동안 만들어온 툴로서 다시 시스템 전체를 컴파일할 차례이다. 역시 -q 옵션 권장한다.
$ emerge -eq system

아무런 에러없이 빌드가 완료될 것이고, 코어2듀오 2.4GHz 기준으로 약 2시간이면 모두 끝난다.
(i5 이상의 경우 1시간 30분이내에 끝난다. 그나마도  gcc 컴파일에서 40분 잡아먹는다.)
아래의 내용을 실행해주자.
$ cd $EPREFIX/usr/portage/scripts
$ ./bootstrap-prefix.sh $EPREFIX startscript

이제 $HOME/gentoo 폴더에 보면 startprefix라는 실행파일이 하나 보일 거다. gentoo 폴더를 어디에 옮기든 이 startprefix만 실행해주면 언제든 emerge를 사용할 수 있다. 참고로 startprefix를 하고나면 /sbin, /usr/sbin의 패스가 걸려있지 않은데, startprefix 파일을 열어서 보면 root 유저인지 아닌지에 따라 패스를 거느냐 안거느냐 판단을 하는 부분이 있기 때문이다. 그런데 사실 root가 아니더라도 sbin 쓸 일은 수도없이 많기 때문에(ifconfig, ping, traceroute 등등) 이 부분에 대한 패스를 걸어준다.

$ vi $HOME/gentoo/etc/profile
if [ "$EUID" = "0" ] || [ "$USER" = "root" ] ; then 부분을 찾는다. 대략 24라인에 있다.
보시면 PATH= 라고 해서 잘 살펴보시면 /usr/sbin, /sbin 모두 패스가 걸려있다. 이 부분이 root에 대한 부분이고 그 아래 else 라고 적혀있고 PATH 라인이 있는데 여기 보시면 /sbin, /usr/sbin이 없다. 그래서 이 부분에 패스를 걸어주면 이제 일반 유저들도 startprefix 이후에 /sbin, /usr/sbin 바이너리를 이용할 수 있다.
패스추가는  이렇게 한다.

/sbin:/usr/sbin

디렉터리와 디렉터리 사이에는 콜론 : 으로 구분을 지어줘야한다. 필자의 설정을 예제로 들어본다.
/Users/jswlinux/Gentoo/usr/bin:/Users/jswlinux/Gentoo/bin:${PATH}:/usr/bin:/bin:/usr/sbin:/sbin"

이상이다. Enjoy your Prefix!
블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,
솔라리스를 리눅스처럼 쓰기위한 나의 노력은 참 눈물겹다고나 할까...
솔라리스라는 환상적인 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


블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,