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 환경으로 만든다.
echo i686-redhat-linux > /etc/rpm/platform
32비트 리눅스 코어 파일을 저장할 대상 디렉토리를 만들고, /dev 와 /proc 를 바인드 마운팅을 한다.
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 을 만든다.
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에 설치한다.
--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 을 이용해 설치한다.
wget strace grub openssh-server openssh-clients gcc patchutils diffutils \
gcc make rpm-build rpmdevtools sudo yum
rpm db 를 지운다.
이는 차후 32bit chroot 후에 경로 정보가 변하기 때문에 반드시 새로 만들도록 하기 위해서 지워주는 것이다.
[2009/09/19 수정]
32비트 chroot 에서도 yum 사용을 원할하게 하기 위해 platform 의 설정 파일을 /cent32/etc/rpm 으로 복사한다.
그리고 초기에 rpm 을 임의로 32비트용 설정을 바꾼 것을 원래대로 되돌린다.
rm /etc/rpm/platform
mv /etc/rpm/platform.orig /etc/rpm/platform
바인드 마운팅을 모두 해제한다.
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 를 하기 위해서는 기존에 잡아 주었던 바인드 마운팅을 모두 잡아줘야 한다.
하지만, 이 일은 매우 번거로우므로 이 바인드 마운팅 작업과 언마운팅 작업을 서비스로 등록하여 서버가 재시작할 때마다 자동으로 하도록 한다.
이를 위해 아래의 파일을 다운로드 받는다.
다운로드 받은 파일의 이름을 변경하고 실행 권한을 부여한다.
chmod 755 /etc/init.d/cent32
chown root:root /etc/init.d/cent32
chkconfig 를 이용하여 서비스를 등록, 활성화를 하고 ntsysv 를 이용하여 시작시 실행하도록 설정한다.
chkconfig --level 4 cent32 on
ntsysv # cent32 앞에 [*] 가 나타나도록 설정하고 [확인] 버튼을 누른 후 빠져나옴
시스템을 재시작 하거나 서비스를 실행한다.
이제 시스템 시작시 cent32 관련 디렉토리들이 자동으로 바인딩된다.
32비트 chroot 를 하기 위해서는 다음 명령으로 이용 가능하다.
non-root 사용자에게 chroot 부여를 위한 schroot 설치
[2009/09/21 수정]
위는 32비트 chroot 를 하기 위해서는 반드시 root 권한을 가진 사용자이어야 한다.
이는 chroot 가 원래 root 권한을 가진 사용자 밖에 실행할 수 있기 때문이다.
사실 개발 작업을 할 때, 왠만해서는 여러 가지 이유로 root 계정 보다 사용자 계정을 이용해서 개발을 한다.
그래서 non-root 사용자에게 chroot 를 할 수 있도록 하기 위해 schroot 를 설치한다.
사실, schroot 와 dchroot 는 CentOS 5 용으로는 제공하지 않는다.
이러한 문제 때문에 여기서는 내가 직접 패치를 한 CentOS 용으로 패치한 것을 이용하겠다.
우선, 코드 컴파일에 앞서 필요한 유틸리티를 설치한다.
그리고 아래에 파일을 다운로드 받는다.
위의 파일은 분할 압축 된 것이기 때문에 하나의 파일로 합쳐 압축을 해제한다.
cat /root/schroot-1.2.3.CentOS.tar.bz2.* | tar xvfj -
프로그램을 설치한다.
설치 시 반드시 prefix 는 /usr libdir은 /usr/lib64 로 지정해야 한다.
그렇지 않으면 기존의 lib 디렉토리에 있는 32비트용 라이브러리 파일과 64비트 라이브러리 파일이 뒤엉키게 되기 때문이다.
./configure --prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc
make
make install
추가로 dchroot 도 같이 설치하고자 한다면 다음과 같이 하라.
make dchroot
./install
cd /usr/src/schroot-1.2.3.CentOS/bin/dchroot-dsa
make dchroot-dsa
./install
그리고나서 schroot 와 dchroot 의 인증 정보를 제대로 잡아준다.
이를 위해 다음 파일을 다운로드 받는다.
위의 받은 파일을 다음 명령으로 /etc/pam.d 에 넣는다.
mv /root/schroot-pam.d /etc/pam.d/schroot
만약 dchroot 와 dchroot-dsa 도 설치했다면 그에 대해서도 적용해준다.
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 디렉토리에 엎어쓴다.
rm -rf /etc/schroot
mv etc/schroot/ /etc/schroot
마지막으로 32비트 chroot 할 사용자를 users 그룹에 등록하면 모든 작업이 끝난다.
사용자가 32비트 chroot 하려면 다음과 같이 입력하자
만약 위의 과정이 번거롭다면 이를 배치 파일로 만들어두면 된다.
[2009/09/21 수정]
다음 명령을 이용하여 cent32 를 만들자.
#!/bin/sh
setarch i686 schroot -q -c cent32
EOF
생성한 파일에 실행 권한을 설정해 준다.
이로써 작업을 모두 마쳤다. 이제 다음 명령으로 32비트 chroot 이 가능하다.
환경 설정 정보 패치
32비트 chroot 를 사용하다 보면 가장 불편한 점이 지금 자신이 32bit chroot를 사용하는지 그렇지 않는지 분간을 하기가 힘들다.
그래서 나는 32비트 chroot 일 경우는 CENT32CHROOT 라는 환경 변수를 등록하는 방법을 이용했다.
수정한 bashrc 파일은 다음과 같다.
이 파일을 /cent32/etc/bashrc 로 엎어쓴다.
mv /root/cent32_bashrc /cent32/etc/bashrc
[2009/09/21 수정]
만약, 이미 bashrc 를 수정하여 위의 cent32_bashrc 로 엎어쓸 수 없는 상황이면 위의 방법 말고 다음 명령을 이용하면 된다.
echo $"PS1=\"[32bits] \${PS1}\"" >> /cent32/etc/bashrc
[2009/09/21 수정]
32비트 chroot 환경에서 set 명령을 이용해 CENT32CHROOT 변수가 제대로 등록되었는지 확인해본다.
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