Programming/Technic

Cent OS 4를 이용한 RedHat Linux 배포판 만들기 - 1

minarae7 2008. 10. 21. 23:21
728x90
반응형

# 본문 내용은 Cent OS 4.2의 CD 이미지를 가지고 나에게 맞는 RedHat 기반의 Linux로 다시 패키징하는 작업니다.
# 본문의 내용은 바로 긁어서 붙인 후에 쉘 스크립트로 돌리실 수 있을 것입니다.
# 단, 디렉토리 구조가 맞을 경우에 말입니다.
# (이 스크립트는 CentOS 4.2이 설치된 머신에서 작동하셔야 합니다.)
# 디렉토리 구조는 가장 아래부분에 설명합니다.
#!/bin/sh

# 스크립트에서 사용할 환경변수 선언
export PYTHONPATH=/usr/lib/anaconda
export PATH="$PATH:/usr/lib/anaconda-runtime"
export CENTBASE=/work/make_cd/CentOS/ 

# 이미 작성되어 있을지도 모를 디렉토리 삭제
rm -rf $CENTBASE/CentOS/ 

# 서브 디렉토리에 필요한 디렉토리 생성
mkdir -p $CENTBASE/CentOS/i386
mkdir -p $CENTBASE/CentOS/SRPMS 

# 이미지를 마운트할 디렉토리들 생성
mkdir -p /mnt/disk1/
mkdir -p /mnt/disk2/
mkdir -p /mnt/disk3/
mkdir -p /mnt/disk4/

# Cent OS 4.2의 CD 이미지들을 미리 만들어놓은 디렉토리에 마운트
# ISO 이미지를 마운트할 경우에는 -o loop 이라는 옵션을 줘야함.
mount -o loop /work/ISO/CentOS-4.2-i386-bin1of4.iso /mnt/disk1/
mount -o loop /work/ISO/CentOS-4.2-i386-bin2of4.iso /mnt/disk2/
mount -o loop /work/ISO/CentOS-4.2-i386-bin3of4.iso /mnt/disk3/
mount -o loop /work/ISO/CentOS-4.2-i386-bin4of4.iso /mnt/disk4/

# 마운트 디렉토리들로 이동한 후에 파일을 대상이 되는 디렉토리로 이동.
# $CENTBASE가 기본이 되는 디렉토리이고 설치 CD의 기본은 $CENTBASE/i386이다.
# 따라서 CD의 모든 내용을 이리로 복사한다.
cd /mnt/disk1/
tar -cf - * | ( cd $CENTBASE/CentOS/i386/ ; tar -xpf - )

cd
/mnt/disk2/
tar -cf - * | ( cd $CENTBASE/CentOS/i386/ ; tar -xpf - )

cd
/mnt/disk3/
tar -cf - * | ( cd $CENTBASE/CentOS/i386/ ; tar -xpf - )

cd
/mnt/disk4/
tar -cf - * | ( cd $CENTBASE/CentOS/i386/ ; tar -xpf - )

# SRPM들은 다른 디렉토리로 복사한다.
cd /work/SRPMS/
tar -cf - * | ( cd $CENTBASE/CentOS/SRPMS/ ; tar -xpf - )

cd
$CENTBASE

# 복사가 끝난 후에는 이미지들의 마운트를 해지한다.
umount /work/ISO/CentOS-4.2-i386-bin1of4.iso
umount /work/ISO/CentOS-4.2-i386-bin2of4.iso
umount /work/ISO/CentOS-4.2-i386-bin3of4.iso
umount /work/ISO/CentOS-4.2-i386-bin4of4.iso

# old cd install file을 삭제한다. 이미지가 생성되면 다시 생성된다.
# find 명령의 설명은 man 페이지를 참고하기 바란다.
find $CENTBASE/CentOS -name TRANS.TBL -exec rm -f {} \;

# 이 이하에서는 나에게 맞게끔 RPM들을 수정 다시 작성하여 다시 작성된 RPM들을
# RPM들이 저장된 디렉토리 이동시켜 덮어 쓴다.

# - 모든 RPM 파일들을 다시 작성
rpmbuild -ba /usr/src/redhat/SPECS/*
# - 작성된 RPM 중에서 debuginfo는 삭제
find /usr/src/redhat/RPMS -name *debuginfo*.rpm -exec rm -f {} \;
# - 작성된 RPM 파일들을 CD가 만들어질 RPM들이 보관되는 디렉토리로 이동
find /usr/src/redhat/RPMS -name *.rpm -exec cp -f {} $CENTBASE/CentOS/i386/CentOS/RPMS/ \;

# hdlist 파일을 다시 만든다.
# 여기서 수많은 warning과 ignoring 메시지들이 나온다. 무시하면 된다.
# 이 명령은 C 파일을 컴파일한 실행파일이다. 나머지는 python파일임.
/usr/lib/anaconda-runtime/genhdlist $CENTBASE/CentOS/i386

 

# package order file을 생성한다. 그 파일 이름은 날짜로 찍는다.
# package order file은 RPM의 실제 이름과 RPM 파일의 패키징 이름을 매핑시키는 역할을 한다.
/usr/lib/anaconda-runtime/pkgorder $CENTBASE/CentOS/i386 i386 | tee $CENTBASE/CentOS/pkgfile.$(date '+%Y-%m-%d')

# installation files을 다음의 buildinstall 명령으로 업데이트 한다.
# --comp 옵션은 반드시 필요하지 않으며 안 쓸 경우 dist-7.0(CentOS 4.2일 경우)으로 작성.
# --prodpath는 RPMS와 base 디렉토리가 들어있는 디렉토리 경로. 무슨 말인지 모르면 찾아보기 바람. 추후 설명 예정.
/usr/lib/anaconda-runtime/buildinstall --comp dist-9.0 \
   --pkgorder $CENTBASE/CentOS/pkgfile.$(date '+%Y-%m-%d') \
   --version 4 --product 'CentOS' --release 'CentOS 4' \
   --prodpath CentOS $CENTBASE/CentOS/i386

# 이제 CD를 만들기 위해서 파일들을 나누는 작업을 한다.
# --total-discs는 전체 CD가 몇장인지 알려준다.
# --bin-discs는 설치 CD, --src-discs는 SRPM CD가 몇장인지 알려준다.
# --distdir은 설치 CD Base, --srcdir은 SRPM Base 디렉토리이다.
/usr/lib/anaconda-runtime/splittree.py --arch=i386 --total-discs=8 --bin-discs=4 --src-discs=1 \
   --release-string="CentOS-4" \
   --pkgorderfile=$CENTBASE/CentOS/pkgfile.$(date '+%Y-%m-%d') \
   --distdir=$CENTBASE/CentOS/i386 --srcdir=$CENTBASE/CentOS/SRPMS \
   --productpath=CentOS

# 이제 설치 CD를 용량별로 나누었으므로 각 CD마다 installation files를 새로 작성한다.
rm -r $CENTBASE/CentOS/i386-disc1/CentOS/base/hdlist*
/usr/lib/anaconda-runtime/genhdlist --productpath=CentOS \
   --withnumbers --fileorder \
   $CENTBASE/CentOS/pkgfile.$(date '+%Y-%m-%d') \
   $CENTBASE/CentOS/i386-disc[1234]

# CD 이미지 만드는 명령
# 첫번째 CD는 부팅 이미지를 가지고 있어야 되므로 boot 이미지를 같이 굽는다.
# 각 스크립트는 항상 .으로 끝나야 한다.
# mkisofs명령의 옵션은 man 페이지를 참고하기 바람.
cd $CENTBASE/CentOS/i386-disc1/ && mkisofs -R -J -T -v -V "CentOS-4.2-i386-1of4" -c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o /work/OUTPUT/TopFlashCP1of4.iso .

cd
$CENTBASE/CentOS/i386-disc2/ && mkisofs -R -J -T -v -V "CentOS-4.2-i386-2of4" -o /work/OUTPUT/TopFlashCP2of4.iso .

cd
$CENTBASE/CentOS/i386-disc3/ && mkisofs -R -J -T -v -V "CentOS-4.2-i386-3of4" -o /work/OUTPUT/TopFlashCP3of4.iso .

cd
$CENTBASE/CentOS/i386-disc4/ && mkisofs -R -J -T -v -V "CentOS-4.2-i386-4of4" -o /work/OUTPUT/TopFlashCP4of4.iso .

##########################################################################
# Referense : http://bbs.kldp.org/viewtopic.php?t=47141
# 잘못된 부분을 수정하고 필요한 부분을 삽입하였습니다.
##########################################################################
 
----------------------------------------------------------------------------------------

디렉토리 구조를 설명하겠습니다. 여기서부터는 위의 스크립트와 다른 부분이며 이해를 됩기 위해 첨부합니다.

우선 작업 디렉토리는 /work/입니다.
/work/ 밑에는 ISO/와 make_cd/, SRPM/, OUTPUT/이 있습니다.
ISO/는 원본 CD 이미지들이 들어있습니다,
SRPM/에는 원본 CD의 SRPM들이 들어있습니다.
make_cd/가 메인 작업 디렉토리입니다.
마지막으로 OUTPUT/ 디렉토리는 내가 생성한 이미지 파일들이 생성됩니다.
make_cd/ 아래에는 CentOS/라는 디렉토리가 있어야 하며, 위의 스크립트는 이 디렉토리 아래에 저장하고 실행하면 됩니다.
위의 스크립트에서 잘못된 내용이나 의문 사항이 있을 경우에는 minarae@gmail.com로 연락주시기 바랍니다.

728x90
반응형