CentOSの複数のインストールISOファイルを統合


CentOS 6にはISOファイルが2つ含まれており、使い勝手が悪い.以下のスクリプトを使用してISOファイルを統合することができる.
 
使用方法はUsage:`basename$0`source/destination/DVD.iso"
2つのパラメータが必要です:$1統合するISOファイルがあるディレクトリを指定します$2出力ISOファイルの絶対パスとファイル名を指定します
 
2つの変数に注意してください.
$LOOPはソースISOのマウントポイントを指定し、デフォルト/tmp/loop;
$DVD中間ファイル一時ディレクトリを指定します(余剰スペースの保証に注意)
 
 
http://wiki.centos.org/TipsAndTricks/CDtoDVDMedia
 
 
#!/bin/bash
 
# by Chris Kloiber <[email protected]>
# Mods under CentOS by Phil Schaffner<[email protected]>
 
# A quick hack that will create a bootable DVD iso of a RedHat Linux
# Distribution. Feed it either a directory containing thedownloaded
# iso files of a distribution, or point it at a directorycontaining
# the "RedHat", "isolinux", and"images" directories.
 
# This version only works with "isolinux" basedRed Hat Linux versions.
 
# Lots of disk space required to work, 3X the distributionsize at least.
 
# GPL version 2 applies. No warranties, yadda, yadda. Havefun.
 
# Modified to add sanity checks and fix CentOS4 syntaxerrors
 
# TODO:
#   Add checks foravailable disk space on devices holding output and
#       temp files.
#   Add optional 3rdparameter to specify location of temp directory.
#   Create .discinfoif not present.
#   OS   
OS_VER=\
$((test -e /etc/fedora-release && rpm -qf/etc/fedora-release --qf "FC%{VERSION}") \
|| (test -e /etc/redhat-release && rpm -qf/etc/redhat-release --qf "EL%{VERSION}") \
|| echo OS_unknown)
 
#
case "$OS_VER" in
  EL[45]*|FC?)
       IMPLANT=/usr/lib/anaconda-runtime/implantisomd5
        if [ ! -f$IMPLANT ]; then
            echo"Error: $IMPLANT Not Found!"
            echo"Please install anaconda-runtime and try again."
            exit 1
        fi
        ;;
  EL6*|FC1?)
        IMPLANT=/usr/bin/implantisomd5
        if [ ! -f $IMPLANT ]; then
            echo"Error: $IMPLANT Not Found!"
            echo"Please install isomd5sum and try again."
            exit 1
        fi
        ;;
  OS_unknown)
        echo"Unknown OS."
        exit 1
        ;;
  *)
        echo "Fixthis script for $OS_VER"
        exit 1
esac
 
if [ $# -lt 2 ]; then
        echo"Usage: `basename $0` source /destination/DVD.iso"
        echo""
        echo"        The 'source' can be eithera directory containing a single"
        echo"        set of isos, or an explodedtree like an ftp site."
        exit 1
fi
 
DVD_DIR=`dirname $2`
DVD_FILE=`basename $2`
 
echo "DVD directory is $DVD_DIR"
echo "ISO file is $DVD_FILE"
 
if [ "$DVD_DIR" = "." ]; then
    echo"Destinaton Directory $DVD_DIR does not exist"
    exit 1
else
    if [ ! -d"/$DVD_DIR" ]; then
        echo "Destinaton Directory $DVD_DIRmust be an absolute path"
        exit 1
    else
        if ["$DVD_FILE" = "" ] || [ -d "$DVD_DIR/$DVD_FILE"]; then
            echo"Null ISO file name."
            exit 1
        fi
    fi
fi
 
which mkisofs >&/dev/null
if [ "$?" != 0 ]; then
    echo "mkisofsNot Found"
    echo "yuminstall mkisofs"
fi
 
which createrepo >&/dev/null
if [ "$?" != 0 ]; then
    echo"createrepo Not Found"
    echo "yuminstall createrepo"
fi
 
if [ -f $2 ]; then
    echo "DVD ISOdestination $2 already exists. Remove first to recreate."
    exit 1
fi
 
# Make sure there is enough free space to hold the DVD imageon the filesystem
# where the home directory resides, otherwise change~/mkrhdvd to point to
# a filesystem with sufficient free space.
 
cleanup() {
    [${LOOP:=/tmp/loop} = "/" ] && echo "LOOP mount point =\/, dying..." && exit
    [ -d $LOOP ]&& rm -rf $LOOP
    [${DVD:=/mnt/mkrhdvd} = "/" ] && echo "DVD data locationis \/, dying..." && exit
    [ -d $DVD ]&& rm -rf $DVD
}
 
cleanup
mkdir -p $LOOP
mkdir -p $DVD
 
ls $1/*.iso &>/dev/null
if [ "$?" = 0 ]; then
 
    echo "FoundISO CD images..."
 
    CDS=`expr 0`
   DISKS="1"
 
    [ -w / ] || {   # Very portable, but perhaps not perfect,test for superuser.
        echo "Only'root' may use this script for loopback mounts" 1>&2
        exit 1
    }
 
    for f in `ls$1/*.iso`; do
        mount -o loop$f $LOOP
        cp -av $LOOP/*$DVD
        if [ -f$LOOP/.discinfo ]; then
            cp -av$LOOP/.discinfo $DVD
            CDS=`expr $CDS + 1`
            if [ $CDS!= 1 ] ; then
               DISKS=`echo ${DISKS},${CDS}`
            fi
        fi
        umount $LOOP
    done
else
    if [ -f$1/isolinux/isolinux.bin ]; then
 
        echo"Found FTP-like tree..."
 
        if [ -e $1/.discinfo ]; then
            cp -av$1/.discinfo $DVD
        else
# How does one construct a legal .discinfo file if none isfound?
            echo"Error: No .discinfo file found in $1"
            cleanup
            exit 1
        fi
        cp -av $1/*$DVD
    else
        echo"Error: No CD images nor FTP-like tree found in $1"
        cleanup
        exit 1
    fi
fi
 
if [ -e $DVD/.discinfo ]; then
    awk '{ if ( NR ==4 ) { print disks } else { print ; } }' disks="ALL" $DVD/.discinfo> $DVD/.discinfo.new
    mv $DVD/.discinfo.new $DVD/.discinfo
else
    echo  "Error: No .discinfo file found in$DVD"
    cleanup
    exit 1
fi
 
rm -rf $DVD/isolinux/boot.cat
find $DVD -name TRANS.TBL | xargs rm -f
 
cd $DVD
createrepo -g repodata/comps.xml ./                                     #  group    
#mkisofs : ISO9660       , -T       TRANS.TBL         ;-R/J  Rock Ridge Joliet  
# -b boot_image  -cboot_catalog
mkisofs -J -R -v -T -o $2 -b isolinux/isolinux.bin -cisolinux/boot.cat -no-emul-boot -boot-load-size 8 -boot-info-table $DVD
if [ "$?" = 0 ]; then
 
    echo ""
    echo "Imagecomplete, create md5sum..."
 
#  $IMPLANT --force $2
# Don't like forced mediacheck? Try this instead.
    $IMPLANT--supported-iso --force $2
 
    echo "Startcleanup..."
 
    cleanup
 
    echo ""
    echo "ProcessComplete!"
    echo "WroteDVD ISO image to $DVD_DIR/$DVD_FILE"
    echo ""
else
    echo "ERROR:Image creation failed, start cleanup..."
 
    cleanup
 
    echo ""
    echo "Failedto create ISO image $DVD_DIR/$DVD_FILE"
    echo ""
fi