Burning a RedHat CD mini-HOWTO <author> <url url="mailto:mok@imsb.au.dk" name="Morten Kjeldgaard">, <url url="mailto:pahe+rhcd@daimi.au.dk" name="Peter von der Ahé"> </author> <date>v1.29, 22 September 1999 <trans><url url="mailto:hssuh@bawi.org" name="서환수(hssuh@bawi.org)"> <tdate>v1.29(Korean translation), 3 February 2000 <abstract> 이 문서는 레드햇사에서 판매하는 것과 동일한 구조의 레드햇 리눅스 배포판 으로 CD를 만드는 방법을 기술한다. 배포판의 구조와 함께 배포판에 업데이트된 RPM을 포함하는 데 필요한 과정이 기술된다. 준비물은 좋은 네트웍 연결과 CD-writer 이다. </abstract> <toc> <!-- --> <sect>서론<p> 직접 자신의 CD를 만드는 데에는 몇 가지 이유가 있을 것이다. 어쩌면 당신이 구두쇠라서 <url url="http://www.redhat.com/" name="레드햇 배포판">의 50불을 절약하고 싶을 수도 있다. 또는 지금 나와 있는 업데이트를 모두 포함하는 배포판 CD를 만들고 싶을 수도 있다. 이는 레드햇 배포판의 major release마다 상당수가 보안에 관련된 업데이트 부담이 있었으므로 상당히 중요한 문제이다. <url url="http://www.redhat.com/corp/support/errata" name="에라타 페이지"> 파일을 보라. <sect>레드햇 FTP 사이트의 해부<p> 리눅스 공동체의 정신에 따라 레드햇 소프트웨어사는 여러 플랫폼을 위한 그들의 리눅스 배포판들을 FTP 사이트를 통해 구할 수 있도록 해 놓았다. 이들은 모두 최상위 배포판 디렉토리로부터 구할 수 있다. <sect1>최상위 디렉토리<label id=sec-top-level><p> 레드햇 리눅스 릴리즈 6.0 (<url url="ftp://ftp.redhat.com/pub/redhat/redhat-6.0/" name="pub/redhat/redhat-6.0">) 의 최상위 디렉토리에는 서로 다른 플랫폼들을 위한 배포판과 릴리즈 출시 이후에 나온 프로그램 패키지들의 업데이트와 수정판을 포함하는 디렉토리가 있다. <tscreen><verb> SRPMS/ alpha/ i386/ sparc/ </verb></tscreen> 이 문서에서 우리는 i386 배포판을 예로 들어 설명하겠다. 이 문서에서 주어진 과정들은 레드햇으로부터 지원되는 모든 플랫폼(알파, 스팍, 파워 피씨 등)에서 잘 될 것 같지만, i386에서만 테스트해 보았다. (추가 정보를 저자들에게 주었으면 좋겠습니다.) i386 디렉토리의 루트는 이렇게 생겼다. <tscreen><verb> -rw-r--r-- 1 root root 18391 Mar 19 1999 COPYING -rw-r--r-- 1 root root 3187 Apr 19 19:56 README -rw-r--r-- 1 root root 2751 Sep 19 1997 RPM-PGP-KEY drwxr-xr-x 5 root root 1024 Sep 12 08:03 RedHat/ -rwxr--r-- 1 root root 2048 Apr 20 14:33 boot.cat drwxr-xr-x 7 root root 1024 Sep 17 08:04 doc/ drwxr-xr-x 6 root root 1024 Aug 3 16:17 dosutils/ drwxr-xr-x 2 root root 1024 Aug 3 16:02 images/ -rw-r--r-- 1 root root 222789 Sep 17 08:04 ls-lR -rw-r--r-- 1 root root 32371 Sep 17 08:04 ls-lR.gz drwxr-xr-x 4 root root 1024 Sep 17 08:04 misc/ </verb></tscreen> <tt/doc/ 디렉토리에는 다양한 정보가 있다. 가장 중요한 것으로, 레드햇 설치 매뉴얼은 <url url="http://www.redhat.com/corp/support/manuals/RHL-6.0-Manual/install-guide/manual" name="doc/rhmanual/manual/"> 에 들어 있다. 다음으로, 여러 개의 FAQ와 모든 HOWTO 문서들과 mini-HOWTO 문서들이 있다. <tt/images/ 디렉토리에는 디스켓에 복사해야 할 부트 플로피 이미지가 있다. 가장 최근의 배포판 (5.1)에는 두 개의 디스크 이미지가 있다. 부트 이미지는 <tt/boot.img/ 이며, CD-ROM에서 직접 설치할 때 필요하다. 만약 로컬 하드 디스크, NFS 에서 마운트한 디스크나 FTP가 필요하다면 보조 디스크 이미지 <tt/supp.img/ 가 필요할 것이다. 자세한 사항에 관해서는 <ref id="sec-install" name="CD로 설치하기"> 와 거기에 있는 레퍼런스들을 보라. <tt/misc/ 디렉토리에는 설치에 필요한 몇몇 프로그램들의 소스와 실행파일들이 있다. <sect1>"RedHat" 디렉토리 -- 배포판의 핵심<p> 디렉토리 트리의 가장 중요한 부분은 <tt/RedHat/ 디렉토리에 있다: <tscreen><verb> drwxr-xr-x 2 root root 23552 Aug 3 16:02 RPMS/ drwxr-xr-x 2 root root 1024 Aug 3 16:02 base/ -rw-r--r-- 1 root root 0 Jan 19 1999 i386 drwxr-xr-x 5 root root 1024 Sep 11 08:03 instimage/ </verb></tscreen> <tt/RPMS/ 디렉토리에는 RPM (Redhat Package Manager) 파일의 집합으로 이루어진 레드햇 배포판의 주된 부분이 담겨있다. RPM 패키지에는 보통 바이너리 실행화일과 해당 설정파일, 문서파일들이 포함되어 있다. 자세한 것은 <ref id=sec-rpm name="RPM 패키지"> 에서 볼 수 있다. <tt/base/ 디렉토리에는 설치 과정에 필요한 북키핑 파일들이 있다. 예를 들면 <tt/comps/ 파일이 그런데, 그 파일은 "Choose packages to install" 단계에서 사용하는 <em/components/ (패키지의 그룹) 를 정의한다. <tt/base/ 디렉토리의 또 다른 중요한 파일은 <tt/hdlist/ 파일로, 이 파일은 <tt/RPMS/ 디렉토리에 있는 모든 RPM 파일들의 헤더 필드를 포함한다. 이는 FTP에서 설치할 때에 특히 편리한데, 모든 RPM 패키지들을 읽을 필요 없이 <tt/hdlist/ 만 읽으면 RPM 패키지들간의 상호의존성들을 모두 결정할 수 있음을 의미한다. <tt/hdlist/ 의 또 다른 용법은 <tt/perl/ 을 <tt/perl-5.004-6.i386.rpm/ 에 대응시키듯이 패키지 이름을 파일 이름과 대응시키는 것이다. 만약에 레드햇에서 나온 업데이트들을 반영하고자 한다거나 (<ref id="sec-updates" name="업데이트 반영하기">를 보라) <tt/RPMS/ 디렉토리에 직접 패키지를 추가하고자 한다면 <tt/hdlist/ 를 업데이트해야 한다. 이에 관해서는 뒤에 <ref id="sec-new-hdlist" name="새로운 hdlist 파일 생성하기"> 에서 설명하겠다. <tt/instimage/ 디렉토리에는 설치과정에 필요한 몇 개의 프로그램과 공유 라이브러리들이 실제 파일시스템과 함께 들어 있다. <sect1>"updates" 디렉토리<p> <tt>/pub/redhat/updates</tt> 디렉토리에는 3.0.3 이후의 모든 레드햇 배포판의 릴리즈의 업데이트가 들어있다. 어떠한 이유로 소프트웨어 패키지가 업데이트되었다면 여기서 찾아 보아야 할 것이다. 특히 보안 관련 업데이트에는 각별한 관심을 기울여야 한다. 그러한 업데이트는 언제나 수정이 가능하게 되면 레드햇의 에라타 페이지에 공지된다. <tt/updates/ 디렉토리에 있는 가장 중요한 파일들은 아래와 같다: <tscreen><verb> drwxrwxr-x 8 ftpuser ftpusers 8192 Aug 18 08:05 5.1/ drwxrwxr-x 9 ftpuser ftpusers 8192 Sep 18 08:07 5.2/ drwxrwxr-x 9 ftpuser ftpusers 8192 Sep 18 08:07 6.0/ lrwxrwxrwx 1 ftpuser ftpusers 3 Aug 25 13:14 current -> 6.0/ </verb></tscreen> 각각의 디렉토리의 구조는 <ref id="sec-top-level" name="최상위 디렉토리"> 섹션에 기술된 구조와 유사하다. <sect>RPM 패키지<label id=sec-rpm><p> 레드햇 배포판의 주된 부분은 RPM (Redhat Package Manager) 의 집합으로 이루어져 있다. RPM 패키지에는 보통 바이너리 실행파일과 해당 설정파일, 문서파일들이 포함되어 있다. <tt><url url="http://www.rpm.org" name="rpm"></tt> 프로그램은 RPM 형식으로 소프트웨어 패키지를 설치, 질의, 검증, 업데이트, 삭제, build 등을 하는 데 쓰이는 강력한 패키지 관리자이다. <tt/Rpm/ 은 그것이 설치한 모든 소프트웨어 패키지의 데이터베이스를 간편하게 관리하기 때문에 설치된 소프트웨어에 관한 정보를 언제나 얻을 수 있다. 배포판에 있는 바이너리 RPM 파일들은 그 배포판 자체에서 돌아가는 시스템 에서 만들어진 것이다. 패키지 안에 있는 대부분의 프로그램들이 공유 라이브러리에 의존하기 때문에 이는 매우 중요하다. 레드햇 버전 5.0 부터는 (64비트 결점이 없는) GNU 표준 C 라이브러리의 새로운 버전 2를 사용했다. 이러한 버전의 라이브러리는 보통 <tt/glibc/ 또는 리눅스에서는 <tt/libc 6/ 라고 부른다. 배포판의 모든 실행파일들은 이 라이브러리에 링크되어 있다. 만약에 다른 배포판으로부터 바이너리 파일들을 설치하려 한다면 하위 호환성을 위해 libc5 패키지를 설치하지 않는다면 제대로 작동하지 않을 수도 있다. PM 패키지의 이름 뒤에는 .<em>arch</em>.<tt/rpm/ 이 붙어 있는데, 여기서 <em/arch/ 는 아키텍처를 말하며, 인텔 플랫폼 바이너리의 경우에는 <tt/i386/ 이 된다. 인스톨하는 패키지들과 그 기계에서 사용하는 공유 라이브러리의 버전이 서로 맞아야 한다. <tt><url url="http://www.rpm.org" name=Rpm></tt> 프로그램은 그런 것을 비교적 잘 확인하지만 여러 경우가 있으므로 이러한 방식으로 패키지를 강제로 설치할 때에는 자신이 하고 있는 일을 확실히 알아야 한다. 그러나 레드햇 설치 부트 디스크를 사용하면 올바른 RPM 패키지들이 설치된다고 확신할 수 있다. 설치과정에서 설치하지 않은 RPM 패키지가 있다고 해도 실망할 필요가 없다. 언제든지 (루트 권한으로) RPM 패키지를 설치할 수 있다. 예를 들면 아래와 같이 하면 된다. <tscreen><verb> rpm --install WindowMaker-0.18-1b.i386.rpm </verb></tscreen> 심지어는 인터넷으로부터 바로 설치할 수도 있는데, RPM 패키지의 URL을 안다면 아래와 같이 하면 된다: <tscreen><verb> rpm --install ftp://rufus.w3.org/redhat-contrib/noarch/mirror-2.9-2.noarch.rpm </verb></tscreen> RPM 패키지의 또 다른 버전은 바이너리를 만들기 위한 소스로 되어 있다. 이러한 패키지들에는 <tt>.src.rpm</tt> 이라는 확장자가 붙어있으며 <tt/SRPMS/ 디렉토리에 있다. 이 패키지들은 설치 CD에는 필요하지 않으며, 사실 74분짜리 공 CD에는 이러한 파일들을 넣을 여유 공간도 없다. 물론 RPMS를 포함하는 별도의 CD를 만들어도 된다. <sect>배포판의 로컬 복사본 구하기<p> CD writer가 있는 컴퓨터로부터 액세스 가능한 쓰기 가능한 디스크에 배포판의 복사본이 있어야 한다. 만약에 가장 최신의 업데이트를 반영하고 싶다면 이 디렉토리는 리눅스 머신, 또는 로컬 디스크, 다른 컴퓨터에 있는 NFS로 마운트된 디스크, JAZ 디스크등으로부터 액세스 할 수 있어야 한다. 레드햇 CD로부터 배포판을 복사할 수도 있고, FTP를 통해 구할 수도 있다. 만약 FTP를 사용하려 한다면 배포판의 정확한 복사본을 얻는 데 가장 좋은 방법은 <tt/mirror/ 패키지를 사용하는 것이다. Mirror는 로컬 디렉토리와 원격 사이트에 있는 디렉토리의 내용물들을 비교하는 복잡한 펄 스크립트이다. Mirror는 원격 사이트에는 있지만 로컬 사이트에는 없는 파일들을 FTP를 이용하여 가져오고 원격 사이트에는 없는데 로컬 사이트에는 있는 파일을 지운다. Mirror 프로그램은 설정파일을 이용하여 설정될 수 있다. Mirror 패키지는 <url url="http://rufus.w3.org/linux/RPM/mirror.html" name="rufus.w3.org"> 에서 RPM으로 구할 수 있다. <!-- 또는 xxxxxxxxxxxxx에서 tarball로 구할 수도 있다.--> mirror 설정파일 <tt/mirror.redhat/ 의 로컬 복사본을 만들고 파일 맨 위의 해당하는 필드들을 수정한다. default section 다음에 다음과 같은 패키지들을 정의한다. <tscreen><verb> package=updates site=ftp.sunsite.auc.dk exclude_patt=(alpha/|sparc/|SRPMS/) remote_dir=/disk1/ftp.redhat.com/pub/redhat/updates/6.0 local_dir=/jaz/updates/6.0 package=dist site=ftp.sunsite.auc.dk exclude_patt=(alpha/|sparc/|SRPMS/) remote_dir=/disk1/ftp.redhat.com/pub/redhat/redhat-6.0 local_dir=/jaz/redhat-6.0 </verb></tscreen> 다음의 명령어를 실행시키면 RedHat 트리 전체를 로컬 디스크로 다운로드하게 될 것이다. 이 명령을 내리게 되면 대략 500Mb의 자료를 전송하게 될 것이므로 반드시 다시 한 번 신중하게 생각해 보아야 한다. <tscreen><verb> mirror -pdist mirror.redhat </verb></tscreen> 이렇게 하면 레드햇 FTP 사이트를 당신의 로컬 디스크에 미러링하게 된다. 레드햇 배포판의 구성은 같은 릴리즈에서는 바뀌지 않으므로 <em/한 번만/ 다운로드하면 된다. 배포판의 모든 변동사항들은 <tt/updates/ 디렉토리에 있다. 그러므로 만약에 레드햇 배포판의 최신판 mirror를 유지하고 싶다면 <tt/updates/ 디렉토리만 최신 것으로 유지하면 된다. 이렇게 하려면 다음과 같은 명령을 내리면 된다. <tscreen><verb> mirror -pupdates mirror.redhat </verb></tscreen> 정기적으로(예를 들면 1주일마다) cron 스크립트를 이용하여 실행시키는 것도 좋다. 레드햇 배포판은 매일 주 사이트인 <url url="ftp://ftp.redhat.com/pub"> 로부터 업데이트되는 전 세계에 있는 수많은 FTP 서버들로부터 얻을 수 있다. 당신에게 가까운 FTP 사이트를 골라야 한다. <url name="RedHat FAQ" url="http://www.redhat.com/support/docs/rhl/RedHat-FAQ/RedHat-FAQ-12.html#ss12.1"> 를 보라. <sect>업데이트 반영하기<label id=sec-updates><p> 업데이트를 반영하려면 제대로 작동하는 <url url="http://www.rpm.org" name=rpm> 이 설치되어 있어야 하고 리눅스 머신에서 배포판 디렉토리에 쓰기 권한이 있어야 한다. 아래와 같은 세 단계를 거쳐야 한다. <enum> <item>파일 보호 모드 수정하기 <item>업데이트된 RPM 파일 바꾸기 <item>hdlist 파일 생성하기 </enum> 만약 <tt/updates/ 디렉토리의 미러링을 유지하고 있다면 이러한 단계를 반복함으로써 언제든지 현재의 업데이트를 포함하는 CD를 만들 수 있다. <sect1>파일 보호 모드 수정하기<p> 설치하는 도중에 어떤 프로그램들은 CD로부터 직접 실행된다. 불행하게도 FTP 프로그램은 복사되는 파일과 디렉토리의 보호 모드를 언제나 보존하지는 않는다. 따라서 디렉토리를 CD에 굽기 전에 프로그램, 쉘 스크립트, 공유 라이브러리에 실행 퍼미션이 주어져 있는지를 확인하는 것이 필요하다. 그렇게 하려면 아래의 <tt/updatePerm/ 스크립트를 배포판의 로컬 복사본에 실행시키면 된다. <code> #!/bin/bash RHVERSION=6.0 LIST=/tmp/er3hd3w25 CDDIR=/jaz/redhat-${RHVERSION} # Find all directories, and make sure they have +x permission find $CDDIR -type d -exec chmod -c 755 {} \; # Find all files that are executables, shell or perl scripts find $CDDIR -type f | file -f - | grep -v RPM \ | egrep -i 'executable|perl|bourne|shell' | cut -f1 -d: > $LIST # Find shared libraries find $CDDIR -name \*.so >> $LIST # Make them executable while read file do if [ ! -x $file ] ; then chmod -c 755 $file fi done < $LIST /bin/rm $LIST exit 0 </code> <sect1>업데이트된 RPM 파일 바꾸기<p> <tt/updateCD/라고 불리는 아래의 스크립트는 updates 디렉토리로부터 모든 파일을 RPMS 디렉토리로 옮긴다. 이 스크립트는 updates 디렉토리에서 어떤 파일이 더 최근의 것인지를 판별하기 위해 몇 개의 재치있는 rpm 트릭을 사용한다. 오래 된 패키지들은 <tt/${OLD}/ 디렉토리로 옮겨진다. <code> #! /bin/bash # This script updates rpms in a RedHat distribution found in $RPMDIR. # The old rpms will be placed in $OLDDIR. # The new rpms should be located in $UPDDIR. # The new images are in $IMGDIR # The images to be updated are in $OMGDIR # The architechture is $ARCH. RHVERSION=6.0 ARCH=i386 CDDIR=/jaz/redhat-${RHVERSION} RPMDIR=${CDDIR}/${ARCH}/RedHat/RPMS UPDDIR=${CDDIR}/updates/${ARCH} IMGDIR=${CDDIR}/updates/images/${ARCH} OMGDIR=${CDDIR}/${ARCH}/images OLDDIR=${CDDIR}/old if [ ! -d $OLDDIR ] ; then echo making directory $OLDDIR mkdir $OLDDIR fi allow_null_glob_expansion=1 for rpm in ${UPDDIR}/*.rpm ; do NAME=`rpm --queryformat "%{NAME}" -qp $rpm` unset OLDNAME for oldrpm in ${RPMDIR}/${NAME}*.rpm ; do if [ `rpm --queryformat "%{NAME}" -qp $oldrpm` = "$NAME" ]; then OLDNAME=$oldrpm; break fi done if [ -z "$OLDNAME" ]; then echo $NAME is new cp -pv $rpm $RPMDIR else if [ `basename $rpm` != `basename $OLDNAME` ]; then mv $OLDNAME $OLDDIR cp -pv $rpm $RPMDIR fi fi done # Copy new boot image files to the right place... for newfile in ${IMGDIR}/* ; do file=${OMGDIR}/$(basename ${newfile}) if [ $newfile -nt $file ] ; then cp -pv $newfile $file fi done exit 0 </code> <sect2>RedHat 6.0을 위한 중요한 노트<p> 특히 kernel과 kernel-smp 패키지 같은 특정 RPM들은 파일 이름에는 플랫폼이 포함되어 있지만 패키지 이름에는 포함되어 있지 않다. 예를 들면 "kernel" 패키지는 아래와 같이 몇 종류로 공급된다. <tscreen><verb> kernel-2.2.5-22.i386.rpm kernel-2.2.5-22.i586.rpm kernel-2.2.5-22.i686.rpm </verb></tscreen> 하지만 세 개 모두에서 -qp 로 검사해 보면 패키지 이름으로 그냥 "kernel"이라고 나온다. 보면 알겠지만 이렇게 되면 <file>updateCD</file> 스크립트가 오동작을 하게 된다. 그 결과로 마지막 파일만 제대로 복사된다. 앞의 두 개도 복사가 되긴 하지만 바로 $OLD 디렉토리로 옮겨져 버린다. 레드햇에서 이들의 이름을 다르게 붙이면 좋겠지만, 지금 현재로써는 가장 간단한 해결책은 <file>updateCD</file> 를 실행시킨 후에 수작업으로 옮기는 것이다. (<url url="mailto:kyle@U.Arizona.EDU" name="Kyle B. Ferrio">에게 감사드립니다.) 이러한 문제를 해결할 수 있는 펄 스크립트를 <url url="mailto:mthed@shore.net" name="Joshua Sarro">가 만들었다. <url url="http://imsb.au.dk/~mok/linux/doc/updateMirror.pl">에서 구할 수 있다. <sect1>새로운 hdlist 파일 생성하기<label id=sec-new-hdlist><p> CD로부터 설치할 때 CD에 있는 설치 프로그램은 어떤 RPM 패키지들이 사용가능한지를 기술하는 <tt><file>RedHat/base/hdlist</file></tt> 파일에 의존한다. <tt>hdlist</tt> 파일은 <tt><file>misc/src/install/genhdlist</file> </tt> 로 생성할 수 있다. 이 프로그램을 실행시킬 때에는 단 하나의 인수를 주어야 하는데 그것은 배포판의 루트 디렉토리의 절대경로이다. 그 프로그램을 호출하는 <tt/updateHdlist/ 스크립트는 아래와 같다: <code> #!/bin/bash RHVERSION=6.0 ARCH=i386 echo generating hdlist... CDDIR=/jaz/redhat-${RHVERSION} GENHDDIR=${CDDIR}/${ARCH}/misc/src/install chmod u+x ${GENHDDIR}/genhdlist chmod 644 ${CDDIR}/${ARCH}/RedHat/base/hdlist ${GENHDDIR}/genhdlist ${CDDIR}/${ARCH} || echo "*** GENHDLIST FAILED ***" exit 0 </code> NOTE: <tt>RedHat/RPMS</tt> 디렉토리에 업데이트를 반영한 후에는 당신의 배포판 복사본은 더 이상 레드햇 배포판 사이트의 미러가 아니다. 사실, 그것은 더욱 최신의 것이다! 따라서 배포판을 미러하려고 시도한다면 업데이트된 RPM들의 이전 버전들이 다시 다운로드 될 것이며, 업데이트들은 지워질 것이다. <sect2>RedHat 5.2를 위한 중요한 note<p> 레드햇 5.2 이전부터 배포된 <tt>genhdlist</tt> 는 <tt>RedHat/RPMS</tt> 디렉토리에 RPM 파일이 아닌 파일이 있으면 충돌을 일으킨다. 5.2 배포판에는 <tt/ls-lR/ 과 <tt/ls-lR.gz/ 라는 RPM 이 아닌 파일이 있기 때문에 문제를 일으키게 된다. 따라서 RPM 이 아닌 파일을 모두 그 디렉토리로부터 제거해야 한다. 그 대신에 다음의 패치를 <tt><file>misc/src/install/genhdlist.c</file></tt> 에 적용하고 새로 컴파일해도 된다. 아래의 패치는 <tt/genhdlist/ 가 RPM이 아닌 파일을 무시하도록 만든다. <code> *** genhdlist.c.orig Fri Nov 27 12:08:13 1998 --- genhdlist.c Fri Nov 27 12:08:20 1998 *************** *** 12,23 **** --- 12,26 ---- #define FILENAME_TAG 1000000 + /* Not used apparently... + int tags[] = { RPMTAG_NAME, RPMTAG_VERSION, RPMTAG_RELEASE, RPMTAG_SERIAL, RPMTAG_FILENAMES, RPMTAG_FILESIZES, RPMTAG_GROUP, RPMTAG_REQUIREFLAGS, RPMTAG_REQUIRENAME, RPMTAG_REQUIREVERSION, RPMTAG_DESCRIPTION, RPMTAG_SUMMARY, RPMTAG_PROVIDES, RPMTAG_SIZE, RPMTAG_OBSOLETES }; int numTags = sizeof(tags) / sizeof(int); + */ int main(int argc, char ** argv) { char buf[300]; *************** *** 26,34 **** --- 29,39 ---- struct dirent * ent; int fd, rc, isSource; Header h; + /* not used int count, type; int i; void * ptr; + */ if (argc != 2) { fprintf(stderr, "usage: genhdlist <dir>\n"); *************** *** 74,79 **** --- 79,85 ---- rc = rpmReadPackageHeader(fd, &h, &isSource, NULL, NULL); + if (!rc) { headerRemoveEntry(h, RPMTAG_POSTIN); headerRemoveEntry(h, RPMTAG_POSTUN); headerRemoveEntry(h, RPMTAG_PREIN); *************** *** 110,115 **** --- 116,122 ---- headerWrite(outfd, h, HEADER_MAGIC_YES); headerFree(h); close(fd); + } } errno = 0; </code> <sect1><file>comps</file> 파일<label id=sec-comps><p> <file>comps</file> 파일은 설치 과정에서 패키지들이 어떻게 꾸려지는지를 정의한다. 레드햇 보파판에서 이 과정은 패키지들의 기능에 따라 분리된다. 아래의 예를 보라: <itemize> <item>Printer Support <item>X Window System <item>GNOME <item>KDE <item>Mail/WWW/News Tools <item>... <item>Kernel Development <item>Extra Documentation </itemize> 설치하는 도중에 사용자는 "Components to install"이라는 대화상자를 보게 된다. 어떠한 컴포넌트들은 미리 선택되어 있고 어떤 것들은 그렇지 않다. 컴포넌트들의 리스트에는 마지막에 "Everything"이 있다. 레드햇 문서에 따르면 모든 패키지를 설치하려면 거의 1 Gb에 달하는 디스크의 여유공간이 필요하다고 한다. 대화상자에는 사용자가 설치할 패키지를 일일이 설치할 수 있도록 해 주는 옵션도 있다. <tt><file>RedHat/base/comps</file></tt> 파일을 변경하지 않는다면 일일이 패키지를 골라서 설치하던지 아니면 모든 패키지를 설치하는 수밖에 없다. <tt><file>comps</file></tt> 파일은 현재 comps 양식의 버전을 기술하는 것으로 시작하며, 바로 아래에는 빈 줄이 와야 한다. <tscreen><verb> 0.1 <빈 줄> </verb></tscreen> 그 뒤에는 컴포넌트들이 나열되며, 빈 줄로 구분한다. <tscreen><verb> <첫번째 컴포넌트> <빈 줄> <두번째 컴포넌트> <빈 줄> . . <n번째 컴포넌트> <빈 줄> EOF </verb></tscreen> 각각의 컴포넌트는 아래와 같이 정의된다: <tscreen><verb> (0|1) (--hide)? <name> <RPM 1> <RPM 2> ... <RPM n> end </verb></tscreen> 각 컴포넌트의 이름 앞에 0이나 1이 주어진다. 여기서 1은 그 컴포넌트가 기본적으로 선택된다는 것을, 0은 그렇지 않음을 의미한다. "--hide" 옵션은 "expert" 설치과정을 선택하지 않는다면 목록을 볼 수 없음을 의미한다. 첫번째 컴포넌트는 "Base"이고, <em/반드시/ 존재해야 하며 대화상자에 나타나지 않는다는 점에서 특별하다.(당연히 기본 설치는 선택하지 않을 수 없다...) 다음에는 그 컴포넌트에 해당하는 rpm 패키지들의 목록이 나온다. 이름들이 패키지의 파일 이름의 일부분이 아니고 <em/rpm 파일 안에/ 저장되어 있는 이름이 라는 점에 유의하여야 한다. (대개 같기는 하지만...) <tt><file>comps</file></tt> 파일에 당신의 패키지를 추가함으로써 당신만의 배포판을 구성할 수 있고 확실하게 당신의 패키지가 기본으로 설치되도록 할 수 있다. 한 가지 주의해야 할 점은 당신의 패키지 안에서의 상호의존성이다. 자기 자신만의 것을 만들고 있긴 하지만... :-) 충고 한 마디: 파일 안에 여분의 공백을 추가하거나 제거하지 않도록 주의하라. 현재 있는 <tt><file>comps </file></tt> 파일(원본을 복사해 두어라)을 살펴보면 어떻게 되어 있는지를 알 수 있다. (또는 그 파일이 어떻게 parse되는지 알고 싶다면 <tt><file>i386/misc/src/install/pkgs.c</file></tt> 를 확인해 보아도 된다.) <sect>드디어: CD 굽기<p> 당신의 시스템에 제대로 작동하는 CD-writer가 있고 사용법을 안다고 가정하므로 CD를 굽는 것에 대해 자세히 다루지는 않겠다. 만약에 리눅스 시스템에서 CD를 굽는다면 <url url="http://www.fh-muenchen.de/rz/xcdroast" name="XCDroast"> 라는 뛰어난 패키지를 설치하는 것도 좋다. XCDRoast 에서 Rock Ridge extensions 와 TRANS.TBL 파일의 생성 기능을 작동하도록 해 놓는다. 반드시 CD의 <em>top</em> 디렉토리가 최소한 아래의 파일과 디렉토리들을 포함하도록 해야 한다. <tscreen><verb> COPYING RPM-PGP-KEY README RedHat/ </verb></tscreen> 아래의 디렉토리도 함께 넣는 것이 좋다: <tscreen><verb> doc/ gnome/ misc/ dosutils/ images/ </verb></tscreen> <sect1>부팅 가능한 CD 만들기<p> (이 절에 관하여 <url url="mailto:dawn@math.wayne.edu" name="Dawn Endico">에게 감사의 말씀을 드립니다.). XCDRoast 에서는 부팅 가능한 디스크의 생성을 지원하지 않으므로 예를 들면 <tt><url url="ftp://tsx-11.mit.edu/pub/linux/packages/mkisofs/" name="mkisofs"></tt> 나 <tt><url url="http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private /cdrecord.html" name="cdrecord"></tt> 와 같은 다른 툴을 사용해야 한다. <url url="ftp://contrib.redhat.com"> 에서 위의 패키지들의 최신 버전을 구하면 된다. CD에 기록할 이미지 파일을 만들어야 할 것이다. 이 파일은 500Mb 나 그 이상이므로 충분한 여유 공간이 있는 파티션을 찾은 후 아래의 명령들에서 만약에 필요하다면 <tt/redhat.img/ 의 패스를 바꿔준다. <tt/mount/ 와 <tt/cdrecord/ 명령을 사용하려면 루트 권한이 있어야 할 수도 있다. <sect2>디스크 이미지 생성하기<p> 미러링한 디렉토리에서 CD의 루트 디렉토리가 될 디렉토리로 이동한다. 예를 들면 redhat-6.0/i386 같은 디렉토리로 이동하면 된다. <tscreen><verb> mkisofs -v -R -T -J -V "Red Hat 6.0" -b images/boot.img -c boot.cat -o /tmp/redhat.img . </verb></tscreen> <!-- Joerg Schilling: mkisofs -R (capital) and *not* -r is needed for Linux install disks --> <tt/mkisofs/ 의 일부 버전에는 <tt/-J/ 옵션이 있다. 그 옵션으로 생성되는 Joliet extension은 윈도우즈에서 CD를 읽기 좋게 만들긴 하지만 인스톨러에서는 사용되지 않으므로 생략해도 상관 없다. <sect2>이미지 테스트하기<p> 상당히 꼼꼼한 사람이라면 새로 만든 디스크 이미지를 마운팅해서 그 이미지를 테스트할 수 있다. 만약에 파일 퍼미션을 수정하는 것을 잊었거나 rock ridge extension을 설정하지 않았다면 파일 이름과 디렉토리 구조가 틀리기 때문에 여기서 에러가 확실하게 나올 것이다. <tscreen><verb> mount -t iso9660 -o ro,loop=/dev/loop0 /tmp/redhat.img /mnt/cdrom </verb></tscreen> 만약에 성공했다면 언마운트하는 것을 잊지 말아야 한다. <tscreen><verb> umount /mnt/cdrom </verb></tscreen> <sect2>디스크 굽기<p> 당신의 디바이스에 맞게 속도를 맞추어야 한다. 아래의 명령은 4배속 CD-writer의 경우이다. 당신의 드라이브는 1배속이나 2배속일 수도 있다. <tscreen><verb> cdrecord -v speed=4 dev=0,0 /tmp/redhat.img </verb></tscreen> <!-- 위의 커맨드에서 CD writer가 SCSI bus 0에 ID number 0로 동작하고 있다고 가정되어 있다. ???????? --> <sect>CD로 설치하기<label id="sec-install"><p> 새로운 CD로 설치할 때 우선 부팅 가능한 설치 디스크를 만들어야 한다. 반드시 새로운, 새로 MS-DOS로 포맷한 디스크를 사용해야 한다. 오래된, 닳아버린 잘못된 디스크를 사용하면 설치과정에서 이상한 문제를 일으킬 수 있다. 리눅스 시스템에서는 <tt/dd/ 명령어를 이용하여 설치 디스크를 만들 수 있다: <tscreen><verb> dd if=/mnt/cdrom/images/boot.img of=/dev/fd0 bs=1440k </verb></tscreen> DOS나 윈도우즈 9x 를 사용하는 시스템에서는 <tt/RAWRITE.EXE/ 프로그램을 사용해야 한다. 이 프로그램은 <tt/dosutils/ 디렉토리에 있다. 설치를 하려면 기계를 셧다운 시키고 새로 구운 CD와 부팅 디스켓을 집어넣은 다음 디스켓으로 부팅되도록 한다. 설치과정에 대한 자세한 사항은 관련문서와 CD의 <tt>doc/HOWTO</tt>디렉토리에 있는 Installation-HOWTO 또는 Bootdisk-HOWTO 를 참조하기를 바란다. <sect>이 문서에 관하여<p> 이 문서의 최근 버전은 <url url="http://imsb.au.dk/~mok/linux/doc/RedHat-CD.sgml">에서 구할 수 있다. (<url url="http://imsb.au.dk/~mok/linux/doc/RedHat-CD.html" name="HTML version">). 당신의 홈페이지에 다음과 같은 링크를 만들면 RedHat-CD 미니 하우투(영문판)에 연결할 수 있다. <verb> <a href="http://imsb.au.dk/~mok/linux/doc/RedHat-CD.html"> <img src="http://imsb.au.dk/~mok/logos/RedHat-CD.png" alt="RedHat CD mini-howto" height=30 nosave border=0> </a> </verb> <sect1>관련 문서<p> <url url="mailto:zilym@asu.edu" name="Ed Schlunder">가 공식 레드햇 ftp 사이트의 "ls -lNR" 리스팅에 대해 사용자의 미러 사이트의 파일 크기, 이름, 퍼미션, 심볼릭 링크 등을 체크할 수 있는 <tt/fix-rhcd/라는 유틸리티를 만들었다. 잘못된 퍼미션은 모두 <tt/ls/ 리스팅과 같게 고쳐진다. <url url="http://www.ajusd.org/~edward/fix-rhcd/" name="fix-rhcd homepage"> 를 참조하라. <url url="mailto:smithrod@bellatlantic.net" name="Rod Smith">는 레드햇 설치 CD 제작에 관한 정보를 포함한 Do-It-Yourself 레드햇 설치 가이드를 썼다. 이것은 유닉스를 사용하지 않는 시스템에서 CD를 굽는 것에 관해 주로 다룬다. <url url="http://members.bellatlantic.net/~smithrod/rhjol.html"> 에서 볼 수 있다. <url url="mailto:skooter@hol.fr">에 의한 불어 문서 <em>`` Comment graver un CD de la RedHat 5.x a partir de fichiers telecharges sur Internet...''</em> 은 <url url="http://linuxfr.org/docs/article/gravure-CD-RH51.html"> 에서 구할 수 있다. 핀란드의 <url url="mailto:jussi.torhonen@tietosavo.fi" name="Jussi Torhonen">은 삶의 좋은 것들의 감각으로 <url url="http://www.iwn.fi/~jt/cd/" name="Howto make a homebrew"> 부팅가능한 레드햇 리눅스 5.2 CD-ROM을 이야기한다. <sect1>감사해야 할 사람들<p> 위에서 언급된 분들 외에도 다음 분들에게 감사를 표합니다. <itemize> <item>Lars Christensen <larsch@cs.auc.dk> <item>Thomas Duffy <tbd@cs.brown.edu> <item>Dawn Endico <dawn@math.wayne.edu> <item>Seva <seva@null.cc.uic.edu> <item>Michael Thomas Cope <mcope@orion.ac.hmc.edu> <item>Charles J. Fisher <charles_fisher@bigfoot.com> </itemize> <sect>DISCLAIMER<label id="sec-disclaimer"><p> <bf> 이 문서의 정보가 맞는 것이라고 믿지만, 필자들은 하드웨어나 소프트웨어상의 어떠한 피해나 이 문서에서 설명된 과정으로부터 발생하는 데이터의 손실에 대해서 책임을 지지 않는다. (역자도 하드웨어나 소프트웨어상의 어떠한 피해나 이 문서에서 설명된 과정으로부터 발생하는 데이터의 손실에 대해서 책임을 지지 않습니다. 하지만 번역상의 문제점이나 고칠 점들을 역자에게 연락을 주시면 앞으로의 번역판 업데이트에 도움이 될 것이라고 생각합니다. <url url="mailto:hssuh@bawi.org" name="번역: 서환수">) </bf> </article> <!-- Local Variables: --> <!-- mode: sgml --> <!-- mode: font-lock --> <!-- fill-column: 75 --> <!-- End: -->