posted by Yuki-H. 2009/09/18 12:51

Gentoo Linux, Debian에서는 x86_64 용 리눅스에서 손쉽게 32bit 환경으로의 chroot를 할 수 있는 방법이 여러 소개되고 있다.

하지만 CentOS에서는 이러한 방법이 거의 없어 나름대로 정리하여 올린다.

 

 

1. 소개

2. Cent32 만들기

3. Cent32 을 편리하게 사용하기 위한 환경 설정

4. non-root 사용자에게 chroot 부여를 위한 schroot 설치

5. 환경 설정 정보 패치

6. 정리

 

 

소개

 

x86_64 환경에서는 32비트 프로그램과 64비트 프로그램을 모두 이용 가능하다.

하지만 프로그램 개발에 있어서는 x86_64 환경에서 컴파일 등이 64비트용으로 만들어지기 때문에 난감한 점이 있다.

또한, 32비트 환경에서 제대로 테스트해보기 위해서는 다시 VMWare 등을 이용하여 32비트 운영체제를 설치하여 테스트를 해봐야 한다.

하지만 32비트 chroot 를 하게되면 x86_64 환경에서 32비트 운영체제를 이용하는 것과 같은 거의 동일한 환경을 지원할 수 있다.

이 환경 내에서는 컴파일 등도 역시 32비트로 이뤄지기 때문에 프로그램 개발도 훨씬 수월하다고 할 수 있다.

 

Cent32 만들기

 

이 과정에서는 32비트 chroot 환경에 필수적이라고 할 수 있는 32비트용 리눅스 파일과 그 데이터를 설치한다.

 

먼저, 현 시스템의 rpm 환경 설정을 백업하고 32비트 시스템의 rpm 환경으로 만든다.

mv /etc/rpm/platform /etc/rpm/platform.orig
echo i686-redhat-linux > /etc/rpm/platform


32비트 리눅스 코어 파일을 저장할 대상 디렉토리를 만들고, /dev 와 /proc 를 바인드 마운팅을 한다.

mkdir -p /cent32
cd /cent32
mkdir -p dev proc sys root etc tmp home var/{log/yum,lib/rpm}

mount -o bind /dev /cent32/dev
mount -o bind /dev/pts /cent32/dev/pts
mount -o bind /dev/shm /cent32/dev/shm
mount -o bind /proc /cent32/proc >/dev/null
mount -o bind /proc/bus/usb /cent32/proc/bus/usb
mount -o bind /sys /cent32/sys
mount -o bind /tmp /cent32/tmp
mount -o bind /home /cent32/home
mount -o bind /root /cent32/root


resolv.conf 를 복사를 하고 가짜 fstab 을 만든다.

cp /etc/resolv.conf /cent32/etc/
cat << EOF > /cent32/etc/fstab
proc  /proc  proc defaults 0 0
/dev  /dev  none rw,bind  0 0
/dev/pts /dev/pts none rw,bind  0 0
tmpfs  /dev/shm tmpfs defaults 0 0
/proc/bus/usb /proc/bus/usb none rw,bind  0 0
/root  /root  none rw,bind  0 0
/home  /home  none rw,bind  0 0
/sys  /sys  none rw,bind  0 0
/tmp  /tmp  none rw,bind  0 0
EOF

 

CentOS 5용 코어 파일을 /cent32에 설치한다.

rpm --root /cent32/ \
--import http://mirrors.kernel.org/centos/5/os/i386/RPM-GPG-KEY-CentOS-5

cd /cent32/

wget http://mirrors.kernel.org/centos/5/os/i386/CentOS/centos-release-5-3.el5.centos.1.i386.rpm

rpm --root /cent32/ --nodeps -ivh /cent32/centos-release-5-3.el5.centos.1.i386.rpm


필수적으로 필요한 것을 yum 을 이용해 설치한다.

yum --installroot=/cent32/ -y install kernel rootfiles passwd vim-enhanced \
wget strace grub openssh-server openssh-clients gcc patchutils diffutils \
gcc make rpm-build rpmdevtools sudo yum


rpm db 를 지운다.

이는 차후 32bit chroot 후에 경로 정보가 변하기 때문에 반드시 새로 만들도록 하기 위해서 지워주는 것이다.

rm -f /cent32/var/lib/rpm/__db.00*


[2009/09/19 수정]

32비트 chroot 에서도 yum 사용을 원할하게 하기 위해 platform 의 설정 파일을 /cent32/etc/rpm 으로 복사한다.

그리고 초기에 rpm 을 임의로 32비트용 설정을 바꾼 것을 원래대로 되돌린다.

cp /etc/rpm/platform /cent32/etc/rpm/
rm /etc/rpm/platform
mv /etc/rpm/platform.orig /etc/rpm/platform


바인드 마운팅을 모두 해제한다.

umount -f /cent32/dev/pts
umount -f /cent32/dev/shm
umount -f /cent32/dev
umount -f /cent32/proc/bus/usb
umount -f /cent32/proc
umount -f /cent32/sys
umount -f /cent32/tmp
umount -f /cent32/home
umount -f /cent32/root


 

Cent32 을 편리하게 사용하기 위한 환경 설정

 

시스템 처음 시작하였다면 32bit chroot 를 하기 위해서는 기존에 잡아 주었던 바인드 마운팅을 모두 잡아줘야 한다.

하지만, 이 일은 매우 번거로우므로 이 바인드 마운팅 작업과 언마운팅 작업을 서비스로 등록하여 서버가 재시작할 때마다 자동으로 하도록 한다.

이를 위해 아래의 파일을 다운로드 받는다.


 

다운로드 받은 파일의 이름을 변경하고 실행 권한을 부여한다.

mv /root/cent32.initd /etc/init.d/cent32
chmod 755 /etc/init.d/cent32
chown root:root /etc/init.d/cent32


 chkconfig 를 이용하여 서비스를 등록, 활성화를 하고 ntsysv 를 이용하여 시작시 실행하도록 설정한다.

chkconfig --add cent32
chkconfig --level 4 cent32 on
ntsysv # cent32 앞에 [*] 가 나타나도록 설정하고 [확인] 버튼을 누른 후 빠져나옴


시스템을 재시작 하거나 서비스를 실행한다.

/etc/init.d/cent32 start


이제 시스템 시작시 cent32 관련 디렉토리들이 자동으로 바인딩된다.

32비트 chroot 를 하기 위해서는 다음 명령으로 이용 가능하다.

setarch i686 chroot /cent32


 

non-root 사용자에게 chroot 부여를 위한 schroot 설치

 

[2009/09/21 수정]

위는 32비트 chroot 를 하기 위해서는 반드시 root 권한을 가진 사용자이어야 한다.

이는 chroot 가 원래 root 권한을 가진 사용자 밖에 실행할 수 있기 때문이다.

사실 개발 작업을 할 때, 왠만해서는 여러 가지 이유로 root 계정 보다 사용자 계정을 이용해서 개발을 한다.

그래서 non-root 사용자에게 chroot 를 할 수 있도록 하기 위해 schroot 를 설치한다.

사실, schroot 와 dchroot 는 CentOS 5 용으로는 제공하지 않는다.

이러한 문제 때문에 여기서는 내가 직접 패치를 한 CentOS 용으로 패치한 것을 이용하겠다.

우선, 코드 컴파일에 앞서 필요한 유틸리티를 설치한다.

 

yum install gcc gcc-c++ libboost-devel libgcc libstdc++ pam-devel lockdev-devel boost-devel


그리고 아래에 파일을 다운로드 받는다.


위의 파일은 분할 압축 된 것이기 때문에 하나의 파일로 합쳐 압축을 해제한다.

cd /usr/src
cat /root/schroot-1.2.3.CentOS.tar.bz2.* | tar xvfj -


프로그램을 설치한다.

설치 시 반드시 prefix 는 /usr libdir은 /usr/lib64 로 지정해야 한다.
그렇지 않으면 기존의 lib 디렉토리에 있는 32비트용 라이브러리 파일과 64비트 라이브러리 파일이 뒤엉키게 되기 때문이다.

cd /usr/src/schroot-1.2.3.CentOS
./configure --prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc
make
make install


추가로 dchroot 도 같이 설치하고자 한다면 다음과 같이 하라.

cd /usr/src/schroot-1.2.3.CentOS/bin/dchroot
make dchroot
./install

cd /usr/src/schroot-1.2.3.CentOS/bin/dchroot-dsa
make dchroot-dsa
./install


그리고나서 schroot 와 dchroot 의 인증 정보를 제대로 잡아준다.

이를 위해 다음 파일을 다운로드 받는다.


 위의 받은 파일을 다음 명령으로 /etc/pam.d 에 넣는다.

rm /etc/pam.d/schroot
mv /root/schroot-pam.d /etc/pam.d/schroot


만약 dchroot 와 dchroot-dsa 도 설치했다면 그에 대해서도 적용해준다.

mv /root/schroot-pam.d /etc/pam.d/dchroot
mv /root/schroot-pam.d /etc/pam.d/dchroot-dsa


그리고 schroot.conf 에 32비트 chroot 에 대한 정보를 추가한다.

dchroot 에 대해서도 해도 되지만 여기서는 schroot 에 대해서만 언급하겠다.

참고로 컴파일한 schroot의 설정 파일의 경로는 /etc/schroot/schroot.conf 이고 dchroot 는 /etc/dchroot.conf 이다.

다음 설정 파일을 다운로드 받는다.

 

이 압축을 풀고 /etc/schroot 디렉토리에 엎어쓴다.

tar xvfj schroot-conf.tar.bz2
rm -rf /etc/schroot
mv etc/schroot/ /etc/schroot


마지막으로 32비트 chroot 할 사용자를 users 그룹에 등록하면 모든 작업이 끝난다.

사용자가 32비트 chroot 하려면 다음과 같이 입력하자

setarch i686 schroot -q -c cent32


만약 위의 과정이 번거롭다면 이를 배치 파일로 만들어두면 된다.

 

[2009/09/21 수정]
다음 명령을 이용하여 cent32 를 만들자.

cat << EOF > /usr/local/bin/cent32
#!/bin/sh
setarch i686 schroot -q -c cent32
EOF


생성한 파일에 실행 권한을 설정해 준다.

chmod a+x /usr/local/bin/cent32


이로써 작업을 모두 마쳤다. 이제 다음 명령으로 32비트 chroot 이 가능하다.

cent32


 

환경 설정 정보 패치

 

32비트 chroot 를 사용하다 보면 가장 불편한 점이 지금 자신이 32bit chroot를 사용하는지 그렇지 않는지 분간을 하기가 힘들다.

그래서 나는 32비트 chroot 일 경우는 CENT32CHROOT 라는 환경 변수를 등록하는 방법을 이용했다.

수정한 bashrc 파일은 다음과 같다.

 


 

이 파일을 /cent32/etc/bashrc 로 엎어쓴다.

rm /cent32/etc/bashrc
mv /root/cent32_bashrc /cent32/etc/bashrc


[2009/09/21 수정]

만약, 이미 bashrc 를 수정하여 위의 cent32_bashrc 로 엎어쓸 수 없는 상황이면 위의 방법 말고 다음 명령을 이용하면 된다.

echo $"CENT32CHROOT=\"yes\"" >> /cent32/etc/bashrc
echo $"PS1=\"[32bits] \${PS1}\"" >> /cent32/etc/bashrc

 

[2009/09/21 수정]
32비트 chroot 환경에서 set 명령을 이용해 CENT32CHROOT 변수가 제대로 등록되었는지 확인해본다.

set


32비트 chroot 환경에서 프롬프트 앞에 "[32bits] " 라는 출력이 나오는지도 확인한다.

 

 

정리

 

모든 작업이 완료되었다.
이제 32비트 chroot 를 하여 yum 을 이용해 자신에게 필요한 32비트 프로그램을 설치하도록 하자.
이 chroot 환경은 기존 x86_64와 완전 별개의 환경이라는 점을 주의하기 바란다.

 

 

참고 사이트

 

Installing a 32bit build chroot by cormander

32Bit Chroot Guide for Gentoo/AMD64 by gentoo.org

Source Package: schroot by debian.org

크리에이티브 커먼즈 라이선스
Creative Commons License

'강좌 > HOWTO' 카테고리의 다른 글

CentOS 5에서 x86_64 환경에서 32비트 chroot 하기  (0) 2009/09/18
posted by Yuki-H. 2005/04/30 20:02
1. 서론

한번 이런글을 써보고도 싶었지만, 쓸 기회가 없었군요.

우리나라가 실제로는 인터넷 보급률이 높고, 홈페이지 수도 많지만, 실질적으로 대기업 홈페이지이나 개인 홈페이지이나 수준이 똑같다고 일단 저는 보고 있습니다.

당연히 대기업 홈페이지나 개인 홈페이지는 인터페이스에 있어서 커다란 차이점을 보이고 있습니다. 실제 홈페이지의 인터페이스가 용이하도록 대기업 홈페이지는 초첨을 맞추고 있습니다.

하지만, 대기업 홈페이지는 플래시는 반드시 하나 이상은 넣어야 한다는 논리가 팽배해져 있는 것이 안타깝습니다. 제가 여태껏 돌아다닌 대기업 홈페이지인 LG, 삼성등은 실제로 이 논리에 가장 부합하고 있었습니다. 다른 곳도 실제로 마찬가지입니다. 플래시를 넣는 것 자체는 나쁘지는 않다고 일단 생각합니다. 하지만 플래시가 필요한 곳에 쓰이면 이는 문제가 되지 않습니다만 실제 이를 필요로 하지 않는 그냥 단순 이미지 출력에 대한 구현이라면 과연 바람직한 것인가에 대해 재고를 해 볼 필요가 있습니다.
이는 실제로 ActiveX 와 스크립트를 쓰므로 인해 초래하는 쓰레기성 컴퓨터 자원 사용을 가중시킨다는 점이 있습니다. 이 점에 대해서는 나중에 설명을 드리겠습니다.

일단, 화제를 돌려 가장 중요한 부분에 대해 짚고 넘어가겠습니다. 이는 바로 호환성의 문제입니다. 많은 사이트가 ActiveX의 무분별적인 사용으로 인해 쓰레기성 컴퓨터 자원 사용을 가중시킬 뿐만 아니라 호환성까지 떨어뜨리게 되었습니다. 특히 벤더별 전용 속성 명령어와 태그 명령어는 이를 더욱 악화시켰으며, 같은 사이트가 전혀 다르게 출력된다라는 단점을 가져왔습니다.

개인용 페이지라도 이점에 있어서는 다르지 않을 것입니다. 이러한 문제점으로 인해 Windows XP 서비스팩2에서는 심지어 팝업차단 및 액티브X 차단이라는 기능이 등장했습니다.
더욱 웃긴것은 이들 사용을 장려한 MS인데 말이죠!

그래서 앞으로 이러한 점에 대해서 다루어 볼까합니다. 어떻게 하면 홈페이지의 호환성을 높일 수 있으며, 깔끔한 홈페이지를 만들 수 있을까에 대해서 입니다.

물론, 이러한 내용이 디자이너의 자유도를 떨어뜨리는 점이 될 수도 있습니다. 하지만 다른 방법으로 지원이 가능하다는 것을 안다면, 깜짝 놀랄 것입니다!

그리고 이 내용이 지금 현재 홈페이지 디자이너이신 분들과 여러 홈페이지 제작자에게 도움이 되길 바라며, 우리나라의 다른 홈페이지들이 언제 어디에서나 한결같은 모습으로 나오길 바랍니다.

참고 : 현재 추진중인 XHTML 이라는 새로운 형식의 표준안에서는 이러한 점에 대해 좀 더 강력한 규정을 하고 있습니다.


[서론 끝]




여기까지 쓰도록 하겠습니다.
처음으로 적어보는 강좌가 될지도 모르겠군요. 아무래도 언젠가 제가 다룰까 생각했던 내용입니다.
일단, 너무 기대하지는 마세요..^^;;;; 올리는 것도 천천히 올릴까 생각합니다.
생각해 둔 것은 많은데 머릿속에서 정리를 할려면 시간이 필요해서..^^

하여튼, 기대해주세요..^^;;;;;
크리에이티브 커먼즈 라이선스
Creative Commons License