最新版を組み込むには、 rpm コマンド の動作するLinuxマシンから、ディストリビューションのあるディレクトリへの 書き込み権が必要です。 次の3つのステップを踏んでいきます -
updates ディレクトリのミラーを維持しているなら、このステップを
踏むことで いつでも最新版を含んだ CDを作成することが可能です。
不幸にも、FTPプログラムは ファイルやディレクトリのパーミッションを
そのままにしてくれない場合があります。インストール作業中、いくつかの
プログラムは CD 上で直接実行されるため、CD を焼くまえに
プログラム、シェルスクリプト、そして 共有ライブラリにきちんと実行許可が
与えられていることを 確認する必要があります。この作業には 次のような
updatePerm スクリプト を使います。-
#!/bin/bash
RHVERSION=5.2
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
次の updateCD というスクリプトは updates ディレクトリの全ての
ファイルを RPMS ディレクトリにコピーします。このスクリプトは rpm の
いくつかのカラクリを使って、updates ディレクトリの中のより新しい
ファイルを推定します。古くなったファイルは ${OLD} ディレクトリに
移されます。
#! /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 architechture is $ARCH.
RHVERSION=5.2
ARCH=i386
CDDIR=/jaz/redhat-${RHVERSION}
RPMDIR=${CDDIR}/${ARCH}/RedHat/RPMS
UPDDIR=${CDDIR}/updates/${ARCH}
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 ${UPDDIR}/images/* ; do
file=${CDDIR}$/${ARCH}/images/$(basename ${newfile})
if [ $newfile -nt $file ] ; then
cp -pv $newfile $file
fi
done
exit 0
CD からインストールする際、CD 上の インストールプログラムは
CD 上にある RedHat/base/hdlist という RPM
パッケージの情報を記述したファイルを参照します。この hdlist は
misc/src/install/genhdlist というプログラムに
よって 新たに生成する事ができます。次にあげるのが genhdlistを呼び出す
updateHdlist スクリプトです。*このスクリプトは、root で
実行しなければいけません。-
#!/bin/bash
RHVERSION=5.2
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
注意:メインディレクトリ(RedHat/RPMS)に更新された
ファイルを組み込んでしまえば、あなたのディストリビューションはもはや
Red Hat FTP サイトのミラーではありません。(より新しいものになっています)
したがって、ここで間違えて、再び(mirrorコマンドで)ディストリビューションの
ミラーを 実行してしまうと、もともとの古いバージョンのRPM が
ダウンロードし直され、せっかく置き換えた新しいRPMは消されてしまいます。
RedHat バージョン 5.2 以前のものに付属する genhdlist は、
RedHat/RPMS ディレクトリに RPMファイル 以外
のファイルが含まれていると クラッシュします。 RedHat 5.2の
RedHat/RPMS には、2つのRPMではないファイル (ls-lR
と ls-lR.gz ) が含まれているため、問題が起こります。対策として、
このディレクトリからRPM以外のファイルを全て削除するか、
misc/src/install/genhdlist.c に次のパッチを
当てて make する必要があります。 このパッチを当てることで genhdlist
は RPM 以外のファイルを無視するようになります。
*** 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;