'2009/09/18'에 해당되는 글 1건

  1. 2009.09.18 CentOS 5에서 x86_64 환경에서 32비트 chroot 하기
posted by Yuki-H. 2009. 9. 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