Tag: FreeBSD

다시 정리하는 /etc/make.conf

CPUTYPE=        i686
CFLAGS=         -O2 -fno-strict-aliasing -pipe
KERNCONF=       YOUR_KERNEL_CONF_HERE
NO_X=           true
WITHOUT_X11=    yes

MASTER_SITE_BACKUP?=    \
        http://ftp.kr.FreeBSD.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/
        http://ftp.kaist.ac.kr/FreeBSD/ports/distfiles/${DIST_SUBDIR}/

MASTER_SITE_OVERRIDE?=  ${MASTER_SITE_BACKUP}

# sf.net 다운로드 사이트중 가장 빠른것 설정
MASTER_SITE_SOURCEFORGE=        \
        http://cdnetworks-kr-2.dl.sourceforge.net/project/%SUBDIR%/

pkg_version: Comparison failed

ports에 업데이트할 것이 있는지 확인하려고 pkg_version -vIL= 을 실행했다. 그런데 갑자기 Comparison failed라는 메시지가 나오면서 아무런 것도 안한다.

수동으로 portsnap fetch update 하면 모든 포트가 없데이트 되었다고 나온다. 뭔가 잘못된거다. 여기저기 뭔가하고 뒤저보다가... 무심결에 ls -l /usr/ports 하는 순간..

허걱 /usr/ports/INDEX 파일의 사이즈가 0이다. 뭐 이건 인덱스 다시 빌드하면 되는 것이고.. 또 뒤져보니 /var/db/portsnap 파일의 일부가 사라졌다. 이건 뭣인가? 그래 언젠가부터 ports의 nfs 서버가 이상하긴 했지, 뭐 그녀석 이제 생을 마감할 때도 되었고, 그냥 ports나 서비스 해라 하고 놔두고 있었는데, 그녀석이 하드웨어적인 이유로 재부팅 되면서 몇몇 파일을 날려버렸던 거다.

원인은 파악됐고... 해결은 간단하다 /var/db/portsnap 지워버리고 portsnap fetch extract 끄읏...

근데 그 에러난 머신은 어떻하냐구? 말했잖아! 조용히 생을 마감하도록 호스피스 병동에 격리시킬 생각이지요. 이렇게 가끔 ports nfs 서비스 하다가... 그게 잦아지면 그냥 생을 마감시키려해... 그래 그녀석 서버로서 지난 8년간의 새월은 참으로 오랜 세월이었지???

너도 젊었을 때는 스펙으론 꽤나 날리던 녀석이었는데, 물론 대형 형님들은 제외하고 말이다... 그리고 너와 참 많은 일을 했었는데, 아쉽다.... 그래 그래... 나도 그 정때문에 널 아직까지 버리지 못하고 있는걸거야...



apache on jailed environment

유지하고 있는 서비스가 있습니다. 근데 이놈이 문제가 생겼습니다. 포트의 특정한 버전을 요구합니다. 그러나 해당 그 포트는 계속 업그레이드 하고있지만, 그놈의 서비스는 업그레이드가 안되고 있습니다. 결국 현재 서비스되고 있는 현제 그상태로 계속 유지되어야 합니다.

그런데 다른 서비스들은 그렇지 않습니다. 다른 서비스는 계속 업데이트 되고... 골치아픕니다.

생각해보다가 그 문제가 되는 서비스를 [[woosum|jail|jail]]안으로 옮겨버리기로 했습니다. ^^; 녜!! 관리 안되는 놈 감옥에 가둘겁니다.

jail?

자세한 것은 Handbook을 참조하시기 바라며, 간단하게 chkroot의 향상된 버전이고 kernel 레벨에서 구현되는 process를 시스템과 완전히 분리하는 가상화 시스템 비슷한 것이다.

또한 커널 레벨이기 때문에 베이스 시스템과 커널을 공유한다.

ezjail 설치

native로 제공된는 jail을 쓰려다가 sysutils/ezjail이 더욱더 좋겠습니다. 이것을 쓰기로 합니다.

$ portmaster sysutils/ezjail

ezjail은 basejail을 만들어야 합니다. 그래서 다음 명령으로 basejail을 만듭니다.

$ ezjail-admin update -b
  • -b: buildworld를 수행합니다. buildworld가 이미 되었다면 대신 -i 옵션을 줍니다.
  • -p: 각각의 jail에 portstree를 제공합니다. 이것 또한 모든 jail에 공유합니다.

-b 옵션을 주었다면 buildworld를 하기 때문에 꽤 걸립니다. ^^;

apache용 jail 만들기

jail 환경을 만드는 건 쉽습니다. 간단히 아래 명령으로

$ ezjail-admin create apache_service 192.168.0.10
  • apache_service: 호스트 이름
  • 192.168.0.10: 만들어질 호스트에 할당할 ip address

대부분의 파일들을 basejail과 공유하기 때문에 금방 만들어 집니다. 아래 명령으로 해당 jail의 console로 들어가서 열심히  작업을 해봅니다.

$ ezjail-admin console apache_service

물론 많은 작업이 안될겁니다. 기본적으로 인터넷 연결이 안되어서 거의 아무것도 할 것이 없습니다. 음.. 아파치 컴파일 해야하는데 인터넷이 연결안되니 할게 없군요.

내부 인터페이스 설정

jail 환경하에서는 보안상 네트웍 카드 설정을 할 수 없습니다. 호스트 환경으로 나와서 아래처럼 내부 내트웍을 구성해줍니다.

[root@host /]# ifconfig lo1 create
[root@host /]# ifconfig lo1 inet 192.168.0.10 netmask 255.255.255.0 alias

이 작업을 부팅시에도 하려면 /etc/rc.con에 다음과 같이 추가해줍니다.

cloned_interfaces="lo1"
ifconfig_lo1="inet 192.168.0.10 netmask 255.255.255.0"

그리고 jail에서 internet에 접근할 수 있도록 NAT 를 pf를 통해서 설정해줍니다.

/etc/pf.conf

nat on re0 from lo1:network to any -> (re0)

이제 다시 ezjail console로 들어가서 인터넷이 되는지 확인해봅시다.

apache_service# nslookup daum.net 8.8.8.8

(8.8.8.8은 google에서 제공하는 dns 서버인데, 주소가 기억하기 쉬어서 씁니다.) 별 문제 없으면 daum.net의 아피 주소들이 주루륵 나올겁니다. 녜.. 이제 jail에서 외부로 연결이 완료되었군요.

apache 띄우기

이제 jail 환경에서 www/apache22를 설치하고 서비스를 실행합니다(뭐 여기는 다 알거니깐 자세한건 생략)

그런 다음 호스트에서 jail 환경의 apache를 접근해 보도록 합니다.

[root@host /]# lynx http://192.168.0.10/

친근하게 It works! 라고 뜨지요. 예 host에서는 jail로 잘 연결됩니다. 그럼 외부에서 이 jail 환경의 apache로 접근이 될까요? 물론 안됩니다. 녜 jail 환경은 분리된 네트웍이기 때문이지요.

이걸 해결하는 방법은 2가지가 있습니다. 첫번째는 jail에 NAT 환경을 구성했으니 port forwarding을 설정하면 됩니다. 하지만 이 경우에 같은 포트에 여러 다른 jail을 구성하려면 안되지요. 이런 경우를 위해서 두번째 apache의 mod_proxy를 이용합니다.

port forwarding to jailed apache

port forwarding은 간단합니다. /etc/pf.conf에 다음처럼 추가하면 끝

rdr on re0 proto tcp from any to ${public_ip_address} port http -> 192.168.0.10 port http

mod_proxy

mod_proxy는 www/apache22에서 PROXY, PRXY_HTTP 옵션을 켜고 다시 컴파일하고, 각 모듈을 로드합니다.

httpd.conf

LoadModule proxy_module         libexec/apache22/mod_proxy.so
LoadModule proxy_http_module    libexec/apache22/mod_proxy_http.so

그리고 jailed apache로 서비스할 것을 설정해 줍니다.

<VirtualHost *:80>
 ServerName jail.woosum.net

 ProxyPass / http://192.168.0.10/
</VirtualHost>

이제 아파치를 재시작하고 http://jail.woosum.net/phpinfo.php 로 접속해보면 HTTP_HOST가 192.168.0.10으로 나오는 것을 확인할 수 있다.

결론

  • jails를 이용하면 각각의 서비스를 분리할 수 있다.
  • sysutils/ezjail을 이용하면 jails를 편하게 관리할 수 있다.
  • 원칙적으로 각 jail 마다 하나의 public ip를 가지지만 NAT, port forwarding, mod_proxy 등을 이용하면 내부 내트웍 만으로도 구성할 수 있다.

참고:

ps. 대부분의 jail 관련 예들은 public ip address를 가진 jail을 기준으로 되어있었습니다. 그래서 한참을 해멨네요.


ss5: socks proxy server for FreeBSD

많은 회사생활하는 분들도 그렇지만 여기 내가 일하고 있는 곳에 막혀있는 사이트가 많고 막혀있는 포트도 많다. 그래서 웹을 위해서는 이 서버에다 squid를 설치해서 우회해서 사용하고 있다.

그런데 말이다 인터넷이라는 것이 항상 웹으로만 되는건 아니라서.. 다른 포트가 필요할 경우가 있지요. 그래서 찾아보다가 socks proxy server를 설치해보기로 했다. 여기의 글을 보고 그중에서 ss5가 가장 낳은것 같아서(아니면 좋은것 소개해 주세요.) 그것으로 해봤다.

설치

$ portmaster net/ss5
$ /usr/local/etc/rc.d/ss5 start

이렇게 해주면 단순히 설치가 끝나고 사용이 가능한다.

물론 /etc/rc.conf에 ss5_enable="YES" 를 추가하시구요.

우선 모두 다 열어

/usr/local/etc/ss5.conf에 다 열려면 아래 두 줄 확인할 것..

auth 0.0.0.0/0 - -
permit 0 0.0.0/0 - 0.0.0.0/0 - - - - -

기본 포트가 막혔군

socks 서버는 1080 포트를 사용한다. 근데 해보니.. 허걱 연결이 안되는군요. 포트를 바꿔야지요. 설정파일에는 그런게 없고 실행할때 파라미터로 주어집니다.

/etc/rc.d에 ss5_flags="-b 0.0.0.0:<port>" 라고 적어주면 됩니다.

ㅋㅋ 이제 막인것도 다 뚫어! 단... application에서 proxy를 지원한다면 말입니다..


crontab에서 portsnap 수행하기..

0     3     *     *     *     root    portsnap cron update && pkg_version -vIL=

자 이렇게하면 메일 새벽 3시에 ports의 snapshot을 받아서 업데이트 한다.

  • -I : INDEX만 업데이트하고 나머지 포트트리는 건드리지 않는다. ports 빌드중에 portsnap으로 업데이트하면 빌드오류가 발생할 가능성이 높으므로 그때 이 옵션이 필요하다. 하지만 새벽 3시에 포트를 빌드하는 머신은 무슨 머신일까???
  • cron: 1~3600초를 random으로 sleep한 다음 수행한다. 이는 서버의 부하를 분산해주려는 목적임
  • fetch: man page에 따르면 crontab에 적용하려면 fetch는 사용하지 마란다. cron 명령으로 내부적으로 호출된다. 직접  portsnap을 실행할 때만 사용한다.
  • pkg_version: 업데이트 한 후.. ports와 버전이 다른 것 리포팅 한다. 뭐 실험적인 서버에서는 모두 업데이트해 최신 버전을 유지하는 것도 좋지만 portaudit에서 보안 오류가 난 것만 업데이트 해주는 것이 정신 건강에 좋을 수 있다.

Jail

Build Jail

# setenv D /here/is/the/jail
# mkdir -p $D
# cd /usr/src
# make buildworld
# make installworld DESTDIR=$D
# make distribution DESTDIR=$D
# mount -t devfs devfs $D/dev
# du -sh $D
192M    /usr/jail/hello_jail
# adduser test

Run Jail

# jail $D test.jail.woosum.net 192.168.0.1 /bin/sh /etc/rc
  • 여기서 마지막의 command는 jail상의 path임..
  • make distribution으로 만든 jail 디렉토리를 단순 복사하면 jail이 실행 안됨

기타

jail 시스템과 베이스 시스템은 커널을 공유한다.

jail은 process와 그 자식 프로세스를 완전히 분리시킨다.


FreeBSD 8.1 Release?

기념 빌드 중...

덧) 블드 해봤는데...

[whitekid@10446 ~]$ uname -a
FreeBSD woosum.net 8.1-PRERELEASE FreeBSD 8.1-PRERELEASE #0: Tue Jul 20 11:56:57 KST 2010     root@10446.woosum.net:/usr/obj/usr/src/sys/GENERIC  i386
[whitekid@10446 ~]$ 

renice에서 우선순위는 항상 헷겔린다..

뭐.. 저거 쓸일이 많이 없으니깐 그렇지만 항상 헷갈리는건 0이 더 빠른거야? 20이 더 빠른거야? 우선순위이니간 높으면 더 높은건가? 쉘의 기본값은 5인데 그럼 쉘은 무지 느린거야?

정답은 20은 느린것.. 0은 빠른것.. 항상 헷갈려.. 자 확실하게 적어놉시다.

덧) WordPress의 Press This 링크는 간단한 것 적을 때 정말 편하군요.


www/wordpress-themes ports

개인적으로 사용하고 있던 wordpress-themes ports를 저는 이미 send-pr했었고 아직 approved가 안된 것으로 알고 있었습니다. 그런데 너무 오래걸린다 하고 혹시나하고 살펴보니 send-pr을 하지 않았더군요. 큭.. 이런 건망증인지..

방금 send-pr 했음


  • Copyright © 1996-2010 Your wish is my command. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress