个人工具

“UbuntuHelp:InstallCDCustomization/Scripts”的版本间的差异

来自Ubuntu中文

跳转至: 导航, 搜索
 
(未显示同一用户的6个中间版本)
第1行: 第1行:
 
{{From|https://help.ubuntu.com/community/InstallCDCustomization/Scripts}}
 
{{From|https://help.ubuntu.com/community/InstallCDCustomization/Scripts}}
 
{{Languages|UbuntuHelp:InstallCDCustomization/Scripts}}
 
{{Languages|UbuntuHelp:InstallCDCustomization/Scripts}}
https://help.ubuntu.com/community/IconsPage?action=AttachFile&do=get&target=info.png These are scripts to help you customize an Ubuntu installation CD.  For more information, see [[UbuntuHelp:InstallCDCustomization]].
+
https://help.ubuntu.com/community/IconsPage?action=AttachFile&do=get&target=info.png These are scripts to help you customize an Ubuntu installation CD.  For more information, see [[UbuntuHelp:InstallCDCustomization|InstallCDCustomization]].
 
=== Simple example installation script for Breezy ===
 
=== Simple example installation script for Breezy ===
 
<pre><nowiki>
 
<pre><nowiki>
第7行: 第7行:
 
# usage  
 
# usage  
 
# update-learningexchange.sh kubuntu|ubuntu|xubuntu
 
# update-learningexchange.sh kubuntu|ubuntu|xubuntu
 +
 
# a very primitive script with no structure of controls etc
 
# a very primitive script with no structure of controls etc
 
# no default behaviour, etc etc
 
# no default behaviour, etc etc
第14行: 第15行:
 
# & add a simple gtk front end too
 
# & add a simple gtk front end too
 
# but I'm rushed at the moment
 
# but I'm rushed at the moment
 +
 
# Notes;Bugs:
 
# Notes;Bugs:
 
# REMEMBER: this absolutely will not work if you haven't built a new version of ubuntu-keyring  
 
# REMEMBER: this absolutely will not work if you haven't built a new version of ubuntu-keyring  
第23行: 第25行:
 
# dpkg-buildpackage -rfakeroot -m"My Name <[email protected]>"
 
# dpkg-buildpackage -rfakeroot -m"My Name <[email protected]>"
 
# cp ../ubuntu-keyring*deb $BUILD/pool/extras/
 
# cp ../ubuntu-keyring*deb $BUILD/pool/extras/
 +
 +
 
# VARIABLES
 
# VARIABLES
 
# this script relies on the existence of several files and directories:
 
# this script relies on the existence of several files and directories:
 +
 
# Original = $ORIG: location of the "clean", unmodified CD .iso
 
# Original = $ORIG: location of the "clean", unmodified CD .iso
 
# CD mount point = $MOUNT: mount point of clean CD
 
# CD mount point = $MOUNT: mount point of clean CD
第37行: 第42行:
 
# Image location = $IMAGE: name of the new .iso file you want to build
 
# Image location = $IMAGE: name of the new .iso file you want to build
 
# apt.conf file = $APTCONF: location of the file used to feed instructions to apt-ftparchive
 
# apt.conf file = $APTCONF: location of the file used to feed instructions to apt-ftparchive
 +
 
ORIG="/var/www/jigdo/$1-breezy-install-i386.iso"
 
ORIG="/var/www/jigdo/$1-breezy-install-i386.iso"
 
STAGE="/home/matt/LearningExchangeCD/$1/"
 
STAGE="/home/matt/LearningExchangeCD/$1/"
第43行: 第49行:
 
IMAGE="/yeowe/usr/cdbuilder/$1-learningexchange.iso"
 
IMAGE="/yeowe/usr/cdbuilder/$1-learningexchange.iso"
 
APTCONF=/home/matt/LearningExchangeCD/apt.conf  
 
APTCONF=/home/matt/LearningExchangeCD/apt.conf  
 +
 +
 
# sync with latest image
 
# sync with latest image
 
sudo umount $MOUNT
 
sudo umount $MOUNT
第52行: 第60行:
 
# note I've excluded a few files, shouldn't matter much for you I reckon
 
# note I've excluded a few files, shouldn't matter much for you I reckon
 
sudo rsync -avzb --exclude='*~' --exclude='INSTRUCTIONS.txt' --backup-dir=/yeowe/usr/cdbuilder/old/ --exclude='example-preseed.txt' $STAGE $BUILD
 
sudo rsync -avzb --exclude='*~' --exclude='INSTRUCTIONS.txt' --backup-dir=/yeowe/usr/cdbuilder/old/ --exclude='example-preseed.txt' $STAGE $BUILD
 +
 
# generate Packages, Release, Release.gpg
 
# generate Packages, Release, Release.gpg
 
# first thing to realize is, that we only need to generate the Packages files,
 
# first thing to realize is, that we only need to generate the Packages files,
第57行: 第66行:
 
# everything else should be in your $STAGE file structure or usable unchanged  
 
# everything else should be in your $STAGE file structure or usable unchanged  
 
# in the original form
 
# in the original form
 +
 
# remove Release file otherwise you'll have trouble writing to it.   
 
# remove Release file otherwise you'll have trouble writing to it.   
 
sudo rm $BUILD/dists/breezy/Release*
 
sudo rm $BUILD/dists/breezy/Release*
 
# ubuntu-keyring must be included in main/, so main NEEDS to be rebuilt!
 
# ubuntu-keyring must be included in main/, so main NEEDS to be rebuilt!
 
for component in main extras; do
 
for component in main extras; do
sudo apt-ftparchive packages "$BUILD/pool/$component/" > "$BUILD/dists/breezy/$component/binary-i386/Packages"
+
    sudo apt-ftparchive packages "$BUILD/pool/$component/" > "$BUILD/dists/breezy/$component/binary-i386/Packages"
gzip -c "$BUILD/dists/breezy/$component/binary-i386/Packages" | \
+
    gzip -c "$BUILD/dists/breezy/$component/binary-i386/Packages" | \
sudo tee "$BUILD/dists/breezy/$component/binary-i386/Packages.gz" > /dev/null
+
        sudo tee "$BUILD/dists/breezy/$component/binary-i386/Packages.gz" > /dev/null
 
done
 
done
 
sudo apt-ftparchive -c $APTCONF release $BUILD/dists/breezy > $BUILD/dists/breezy/Release
 
sudo apt-ftparchive -c $APTCONF release $BUILD/dists/breezy > $BUILD/dists/breezy/Release
 
# gpg options: -ba = armored, detached-sig
 
# gpg options: -ba = armored, detached-sig
 
sudo gpg --output $BUILD/dists/breezy/Release.gpg -ba $BUILD/dists/breezy/Release
 
sudo gpg --output $BUILD/dists/breezy/Release.gpg -ba $BUILD/dists/breezy/Release
 +
 
# build the actual image.  Note the options to mkisofs, which make the image bootable
 
# build the actual image.  Note the options to mkisofs, which make the image bootable
 
sudo chown -R root:root $BUILD/isolinux  $BUILD/preseed  
 
sudo chown -R root:root $BUILD/isolinux  $BUILD/preseed  
 
sudo mkisofs -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -hide-rr-moved -o $IMAGE -R $BUILD/
 
sudo mkisofs -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -hide-rr-moved -o $IMAGE -R $BUILD/
 +
 
# burn the image to 2nd cd drive on most setups
 
# burn the image to 2nd cd drive on most setups
 
sudo nice -18 cdrecord dev=ATA:1,1,0 speed=12 --blank=fast -v -gracetime=2 -tao $IMAGE
 
sudo nice -18 cdrecord dev=ATA:1,1,0 speed=12 --blank=fast -v -gracetime=2 -tao $IMAGE
第78行: 第90行:
 
* Cut down the number of packages on a CD
 
* Cut down the number of packages on a CD
 
* Install extra packages
 
* Install extra packages
* Change the USplash image (eg: "University of Antarctica, Ubuntu COE build")
+
* Change the [[UbuntuHelp:USplash|USplash]] image (eg: "University of Antarctica, Ubuntu COE build")
 
* Include arbitrary other data on the CD
 
* Include arbitrary other data on the CD
 
* Script the installation via a preseed file.
 
* Script the installation via a preseed file.
第99行: 第111行:
 
# 2) dpkg -l > PackageList
 
# 2) dpkg -l > PackageList
 
#    Copy this file to $BASEDIR/source on your build server.
 
#    Copy this file to $BASEDIR/source on your build server.
 +
 
# The Base Directory
 
# The Base Directory
 
BASEDIR="/data/MyBuildInstall"
 
BASEDIR="/data/MyBuildInstall"
 +
 
# This directory will contain files that need to be copied over
 
# This directory will contain files that need to be copied over
 
# to the new CD.
 
# to the new CD.
第106行: 第120行:
 
# Seed file
 
# Seed file
 
SEEDFILE="mybuild.seed"
 
SEEDFILE="mybuild.seed"
 +
 
# Ubuntu ISO image
 
# Ubuntu ISO image
 
CDIMAGE="$BASEDIR/ubuntu-5.10-install-i386.iso"
 
CDIMAGE="$BASEDIR/ubuntu-5.10-install-i386.iso"
 +
 
# Where the ubuntu iso image will be mounted
 
# Where the ubuntu iso image will be mounted
 
CDSOURCEDIR="$BASEDIR/cdsource"
 
CDSOURCEDIR="$BASEDIR/cdsource"
 +
 
# Directory for building packages
 
# Directory for building packages
 
SOURCEDIR="$BASEDIR/source"
 
SOURCEDIR="$BASEDIR/source"
 +
 
# GPG
 
# GPG
 
GPGKEYNAME="My Organisation Installation Key"
 
GPGKEYNAME="My Organisation Installation Key"
第118行: 第136行:
 
GPGKEYPHRASE="MyOrg"
 
GPGKEYPHRASE="MyOrg"
 
MYGPGKEY="$GPGKEYNAME ($GPGKEYCOMMENT) <$GPGKEYEMAIL>"
 
MYGPGKEY="$GPGKEYNAME ($GPGKEYCOMMENT) <$GPGKEYEMAIL>"
 +
 
# Package list (dpkg -l) from an installed system.
 
# Package list (dpkg -l) from an installed system.
 
PACKAGELIST="$SOURCEDIR/PackageList"
 
PACKAGELIST="$SOURCEDIR/PackageList"
 +
 
# Output CD name
 
# Output CD name
 
CDNAME="MyBuild.iso"
 
CDNAME="MyBuild.iso"
 +
 
# 640x480 PNG with colours as specified in
 
# 640x480 PNG with colours as specified in
 
# https://wiki.ubuntu.com/USplashCustomizationHowto
 
# https://wiki.ubuntu.com/USplashCustomizationHowto
 
USPLASH="$SOURCEDIR/MyBuildSplash1.png"
 
USPLASH="$SOURCEDIR/MyBuildSplash1.png"
 +
 
# ------------ End of modifications.
 
# ------------ End of modifications.
 +
 +
 
id | grep -c uid=0 >/dev/null
 
id | grep -c uid=0 >/dev/null
 
if [ $? -gt 0 ]; then
 
if [ $? -gt 0 ]; then
echo "You need to be root in order to run this script.."
+
        echo "You need to be root in order to run this script.."
echo " - sudo /bin/sh prior to executing."
+
        echo " - sudo /bin/sh prior to executing."
exit
+
        exit
 
fi
 
fi
 +
 
which gpg > /dev/null
 
which gpg > /dev/null
 
if [ $? -eq 1 ]; then
 
if [ $? -eq 1 ]; then
echo "Please install gpg to generate signing keys"
+
        echo "Please install gpg to generate signing keys"
exit
+
        exit
 
fi
 
fi
 +
 
# Create a few directories.
 
# Create a few directories.
 
if [ ! -d $BASEDIR ]; then mkdir -p $BASEDIR; fi
 
if [ ! -d $BASEDIR ]; then mkdir -p $BASEDIR; fi
 
if [ ! -d $BASEDIR/FinalCD ]; then mkdir -p $BASEDIR/FinalCD; fi
 
if [ ! -d $BASEDIR/FinalCD ]; then mkdir -p $BASEDIR/FinalCD; fi
 
if [ ! -z $EXTRASDIR ]; then
 
if [ ! -z $EXTRASDIR ]; then
if [ ! -d $EXTRASDIR ]; then mkdir -p $EXTRASDIR; fi
+
        if [ ! -d $EXTRASDIR ]; then mkdir -p $EXTRASDIR; fi
if [ ! -d $EXTRASDIR/preseed ]; then mkdir -p $EXTRASDIR/preseed; fi
+
        if [ ! -d $EXTRASDIR/preseed ]; then mkdir -p $EXTRASDIR/preseed; fi
if [ ! -d $EXTRASDIR/pool/extras ]; then mkdir -p $EXTRASDIR/pool/extras; fi
+
        if [ ! -d $EXTRASDIR/pool/extras ]; then mkdir -p $EXTRASDIR/pool/extras; fi
 
fi
 
fi
 
if [ ! -d $CDSOURCEDIR ]; then mkdir -p $CDSOURCEDIR; fi
 
if [ ! -d $CDSOURCEDIR ]; then mkdir -p $CDSOURCEDIR; fi
第150行: 第176行:
 
if [ ! -d $SOURCEDIR/indices ]; then mkdir -p $SOURCEDIR/indices; fi
 
if [ ! -d $SOURCEDIR/indices ]; then mkdir -p $SOURCEDIR/indices; fi
 
if [ ! -d $SOURCEDIR/ubuntu-meta ]; then mkdir -p $SOURCEDIR/ubuntu-meta; fi
 
if [ ! -d $SOURCEDIR/ubuntu-meta ]; then mkdir -p $SOURCEDIR/ubuntu-meta; fi
 +
 +
 
if [ ! -f $CDIMAGE ]; then
 
if [ ! -f $CDIMAGE ]; then
echo "Cannot find your ubuntu image. Change CDIMAGE path."
+
        echo "Cannot find your ubuntu image. Change CDIMAGE path."
exit
+
        exit
 
fi
 
fi
 +
 +
 
gpg --list-keys | grep "$GPGKEYNAME" >/dev/null
 
gpg --list-keys | grep "$GPGKEYNAME" >/dev/null
 
if [ $? -ne 0 ]; then
 
if [ $? -ne 0 ]; then
echo "No GPG Key found in your keyring."
+
        echo "No GPG Key found in your keyring."
echo "Generating a new gpg key ($GPGKEYNAME $GPGKEYCOMMENT) with a passphrase of $GPGKEYPHRASE .."
+
        echo "Generating a new gpg key ($GPGKEYNAME $GPGKEYCOMMENT) with a passphrase of $GPGKEYPHRASE .."
echo ""
+
        echo ""
echo "Key-Type: DSA
+
        echo "Key-Type: DSA
 
Key-Length: 1024
 
Key-Length: 1024
 
Subkey-Type: ELG-E
 
Subkey-Type: ELG-E
第168行: 第198行:
 
Expire-Date: 0
 
Expire-Date: 0
 
Passphrase: $GPGKEYPHRASE" > $BASEDIR/key.inc
 
Passphrase: $GPGKEYPHRASE" > $BASEDIR/key.inc
gpg --gen-key --batch --gen-key $BASEDIR/key.inc
+
 
# Note: If you wish to remove the passphrase from the key:
+
        gpg --gen-key --batch --gen-key $BASEDIR/key.inc
# (Don't do this if you want to use this key for ANYTHING other
+
        # Note: If you wish to remove the passphrase from the key:
# than a temporary ubuntu CD installation signing key)
+
        # (Don't do this if you want to use this key for ANYTHING other
# gpg --edit-key
+
        # than a temporary ubuntu CD installation signing key)
# passwd
+
        # gpg --edit-key
# (enter old phrase)
+
        # passwd
# (blank)
+
        # (enter old phrase)
# (blank)
+
        # (blank)
# y
+
        # (blank)
# quit
+
        # y
# y
+
        # quit
 +
        # y
 
fi
 
fi
 +
 
if [ ! -f $CDSOURCEDIR/md5sum.txt ]; then
 
if [ ! -f $CDSOURCEDIR/md5sum.txt ]; then
echo -n "Mounting Ubuntu iso.. "
+
        echo -n "Mounting Ubuntu iso.. "
mount | grep $CDSOURCEDIR
+
        mount | grep $CDSOURCEDIR
if [ $? -eq 0 ]; then
+
        if [ $? -eq 0 ]; then
umount $CDSOURCEDIR
+
                umount $CDSOURCEDIR
fi
+
        fi
mount -o loop $BASEDIR/ubuntu-5.10-install-i386.iso $CDSOURCEDIR/
+
 
if [ ! -f $CDSOURCEDIR/md5sum.txt ]; then
+
        mount -o loop $BASEDIR/ubuntu-5.10-install-i386.iso $CDSOURCEDIR/
echo "Mount did not succeed. Exiting."
+
        if [ ! -f $CDSOURCEDIR/md5sum.txt ]; then
exit
+
                echo "Mount did not succeed. Exiting."
fi
+
                exit
echo "OK"
+
        fi
 +
        echo "OK"
 
fi
 
fi
 +
 
if [ ! -f $SOURCEDIR/apt.conf ]; then
 
if [ ! -f $SOURCEDIR/apt.conf ]; then
echo -n "No APT.CONF file found... generating one."
+
        echo -n "No APT.CONF file found... generating one."
# Try and generate one?
+
        # Try and generate one?
cat $CDSOURCEDIR/dists/breezy/Release | egrep -v "<sup> " | egrep -v "^(Date|MD5Sum|SHA1)" | sed 's/: / "/' | sed 's/</sup>/APT::FTPArchive::Release::/' | sed 's/$/";/' > $SOURCEDIR/apt.conf
+
        cat $CDSOURCEDIR/dists/breezy/Release | egrep -v "^ " | egrep -v "^(Date|MD5Sum|SHA1)" | sed 's/: / "/' | sed 's/^/APT::FTPArchive::Release::/' | sed 's/$/";/' > $SOURCEDIR/apt.conf
echo "Ok."
+
        echo "Ok."
 
fi
 
fi
 +
 
if [ ! -f $SOURCEDIR/apt-ftparchive-deb.conf ]; then
 
if [ ! -f $SOURCEDIR/apt-ftparchive-deb.conf ]; then
echo "Dir {
+
        echo "Dir {
ArchiveDir \"$BASEDIR/FinalCD\";
+
  ArchiveDir \"$BASEDIR/FinalCD\";
 
};
 
};
 +
 
TreeDefault {
 
TreeDefault {
Directory \"pool/\";
+
  Directory \"pool/\";
 
};
 
};
 +
 
BinDirectory \"pool/main\" {
 
BinDirectory \"pool/main\" {
Packages \"dists/breezy/main/binary-i386/Packages\";
+
  Packages \"dists/breezy/main/binary-i386/Packages\";
BinOverride \"$SOURCEDIR/indices/override.breezy.main\";
+
  BinOverride \"$SOURCEDIR/indices/override.breezy.main\";
ExtraOverride \"$SOURCEDIR/indices/override.breezy.extra2.main\";
+
  ExtraOverride \"$SOURCEDIR/indices/override.breezy.extra2.main\";
 
};
 
};
 +
 
Default {
 
Default {
Packages {
+
  Packages {
Extensions \".deb\";
+
    Extensions \".deb\";
Compress \". gzip\";
+
    Compress \". gzip\";
};
+
  };
 
};
 
};
 +
 
Contents {
 
Contents {
Compress \"gzip\";
+
  Compress \"gzip\";
 
};" > $SOURCEDIR/apt-ftparchive-deb.conf
 
};" > $SOURCEDIR/apt-ftparchive-deb.conf
 
fi
 
fi
 +
 
if [ ! -f $SOURCEDIR/apt-ftparchive-udeb.conf ]; then
 
if [ ! -f $SOURCEDIR/apt-ftparchive-udeb.conf ]; then
echo "Dir {
+
        echo "Dir {
ArchiveDir \"$BASEDIR/FinalCD\";
+
  ArchiveDir \"$BASEDIR/FinalCD\";
 
};
 
};
 +
 
TreeDefault {
 
TreeDefault {
Directory \"pool/\";
+
  Directory \"pool/\";
 
};
 
};
 +
 
BinDirectory \"pool/main\" {
 
BinDirectory \"pool/main\" {
Packages \"dists/breezy/main/debian-installer/binary-i386/Packages\";
+
  Packages \"dists/breezy/main/debian-installer/binary-i386/Packages\";
BinOverride \"$SOURCEDIR/indices/override.breezy.main.debian-installer\";
+
  BinOverride \"$SOURCEDIR/indices/override.breezy.main.debian-installer\";
 
};
 
};
 +
 
Default {
 
Default {
Packages {
+
  Packages {
Extensions \".udeb\";
+
    Extensions \".udeb\";
Compress \". gzip\";
+
    Compress \". gzip\";
};
+
  };
 
};
 
};
 +
 
Contents {
 
Contents {
Compress \"gzip\";
+
  Compress \"gzip\";
 
};" > $SOURCEDIR/apt-ftparchive-udeb.conf
 
};" > $SOURCEDIR/apt-ftparchive-udeb.conf
 
fi
 
fi
 +
 
if [ ! -f $SOURCEDIR/apt-ftparchive-extras.conf ]; then
 
if [ ! -f $SOURCEDIR/apt-ftparchive-extras.conf ]; then
echo "Dir {
+
        echo "Dir {
ArchiveDir \"$BASEDIR/FinalCD\";
+
  ArchiveDir \"$BASEDIR/FinalCD\";
 
};
 
};
 +
 
TreeDefault {
 
TreeDefault {
Directory \"pool/\";
+
  Directory \"pool/\";
 
};
 
};
 +
 
BinDirectory \"pool/extras\" {
 
BinDirectory \"pool/extras\" {
Packages \"dists/breezy/extras/binary-i386/Packages\";
+
  Packages \"dists/breezy/extras/binary-i386/Packages\";
 
};
 
};
 +
 
Default {
 
Default {
Packages {
+
  Packages {
Extensions \".deb\";
+
    Extensions \".deb\";
Compress \". gzip\";
+
    Compress \". gzip\";
};
+
  };
 
};
 
};
 +
 
Contents {
 
Contents {
Compress \"gzip\";
+
  Compress \"gzip\";
 
};" > $SOURCEDIR/apt-ftparchive-extras.conf
 
};" > $SOURCEDIR/apt-ftparchive-extras.conf
 
fi
 
fi
 +
 
if [ ! -f $SOURCEDIR/indices/override.breezy.extra.main ]; then
 
if [ ! -f $SOURCEDIR/indices/override.breezy.extra.main ]; then
for i in override.breezy.extra.main override.breezy.main override.breezy.main.debian-installer; do
+
        for i in override.breezy.extra.main override.breezy.main override.breezy.main.debian-installer; do
cd $SOURCEDIR/indices
+
                cd $SOURCEDIR/indices
wget http://archive.ubuntu.com/ubuntu/indices/$i
+
                wget http://archive.ubuntu.com/ubuntu/indices/$i
done
+
        done
 
fi
 
fi
 +
 
# Create a 'fixed' version of the extras.main override package.
 
# Create a 'fixed' version of the extras.main override package.
 
# Idea/Perl by Ferry Hendrikx, 2006
 
# Idea/Perl by Ferry Hendrikx, 2006
 
cat $SOURCEDIR/indices/override.breezy.extra.main | egrep -v ' Task ' > $SOURCEDIR/indices/override.breezy.extra2.main
 
cat $SOURCEDIR/indices/override.breezy.extra.main | egrep -v ' Task ' > $SOURCEDIR/indices/override.breezy.extra2.main
cat $CDSOURCEDIR/dists/breezy/main/binary-i386/Packages | perl -e 'while (<>) { chomp; if(/<sup>Package\:\s*(.+)$/) { $pkg=$1; } elsif(/</sup>Task\:\s(.+)$/) { print "$pkg\tTask\t$1\n"; } }' >> $SOURCEDIR/indices/override.breezy.extra2.main
+
cat $CDSOURCEDIR/dists/breezy/main/binary-i386/Packages | perl -e 'while (<>) { chomp; if(/^Package\:\s*(.+)$/) { $pkg=$1; } elsif(/^Task\:\s(.+)$/) { print "$pkg\tTask\t$1\n"; } }' >> $SOURCEDIR/indices/override.breezy.extra2.main
 +
 
 +
 
 +
 
 
echo -n "Resyncing old data...  "
 
echo -n "Resyncing old data...  "
 +
 
cd $BASEDIR/FinalCD
 
cd $BASEDIR/FinalCD
 
rsync -atz --delete $CDSOURCEDIR/ $BASEDIR/FinalCD/
 
rsync -atz --delete $CDSOURCEDIR/ $BASEDIR/FinalCD/
 
echo "OK"
 
echo "OK"
 +
 +
 +
 
# PackageList is a dpkg -l from our 'build' server.
 
# PackageList is a dpkg -l from our 'build' server.
 
if [ ! -f $PACKAGELIST ]; then
 
if [ ! -f $PACKAGELIST ]; then
echo "No PackageList found. Assuming that you do not require any packages to be removed"
+
        echo "No PackageList found. Assuming that you do not require any packages to be removed"
 
else
 
else
cat $PACKAGELIST | grep "^ii" | awk '{print $2 "_" $3}' > $SOURCEDIR/temppackages
+
        cat $PACKAGELIST | grep "^ii" | awk '{print $2 "_" $3}' > $SOURCEDIR/temppackages
echo "Removing files that are no longer required.."
+
 
cd $BASEDIR/FinalCD
+
        echo "Removing files that are no longer required.."
# Only use main for the moment. Keep all 'restricted' debs
+
        cd $BASEDIR/FinalCD
rm -f $SOURCEDIR/RemovePackages
+
        # Only use main for the moment. Keep all 'restricted' debs
# Note: Leave the udeb's alone.
+
        rm -f $SOURCEDIR/RemovePackages
for i in `find pool/main -type f -name "*.deb" -print`; do
+
        # Note: Leave the udeb's alone.
FILE=`basename $i | sed 's/_[a-zA-Z0-9\.]*$//'`
+
        for i in `find pool/main -type f -name "*.deb" -print`; do
GFILE=`echo $FILE | sed 's/\+/\\\+/g' | sed 's/\./\\\./g'`
+
                FILE=`basename $i | sed 's/_[a-zA-Z0-9\.]*$//'`
# pool/main/a/alien/alien_8.53_all.deb becomes alien_8.53
+
                GFILE=`echo $FILE | sed 's/\+/\\\+/g' | sed 's/\./\\\./g'`
egrep "^"$GFILE $SOURCEDIR/temppackages >/dev/null
+
                # pool/main/a/alien/alien_8.53_all.deb becomes alien_8.53
if [ $? -ne 0 ]; then
+
                egrep "^"$GFILE $SOURCEDIR/temppackages >/dev/null
# NOT Found
+
                if [ $? -ne 0 ]; then
# Note: Keep a couple of anciliary files
+
                        # NOT Found
grep "Filename: $i" $CDSOURCEDIR/dists/breezy/main/debian-installer/binary-i386/Packages >/dev/null
+
                        # Note: Keep a couple of anciliary files
if [ $? -eq 0 ]; then
+
 
# Keep the debian-installer files - we need them.
+
                        grep "Filename: $i" $CDSOURCEDIR/dists/breezy/main/debian-installer/binary-i386/Packages >/dev/null
echo "* Keeping special file $FILE"
+
                        if [ $? -eq 0 ]; then
else
+
                                # Keep the debian-installer files - we need them.
echo "- Removing unneeded file $FILE"
+
                                echo "* Keeping special file $FILE"
rm -f $BASEDIR/FinalCD/$i
+
                        else
fi
+
                                echo "- Removing unneeded file $FILE"
else
+
                                rm -f $BASEDIR/FinalCD/$i
echo "+ Retaining $FILE"
+
 
fi
+
                        fi
done
+
                else
 +
                        echo "+ Retaining $FILE"
 +
                fi
 +
        done
 
fi
 
fi
 +
 +
 
echo -n "Generating keyfile..  "
 
echo -n "Generating keyfile..  "
 +
 
cd $SOURCEDIR/keyring
 
cd $SOURCEDIR/keyring
 
KEYRING=`find * -maxdepth 1 -name "ubuntu-keyring*" -type d -print`
 
KEYRING=`find * -maxdepth 1 -name "ubuntu-keyring*" -type d -print`
 
if [ -z "$KEYRING" ]; then
 
if [ -z "$KEYRING" ]; then
apt-get source ubuntu-keyring
+
        apt-get source ubuntu-keyring
KEYRING=`find * -maxdepth 1 -name "ubuntu-keyring*" -type d -print`
+
        KEYRING=`find * -maxdepth 1 -name "ubuntu-keyring*" -type d -print`
if [ -z "$KEYRING" ]; then
+
        if [ -z "$KEYRING" ]; then
echo "Cannot grab keyring source! Exiting."
+
                echo "Cannot grab keyring source! Exiting."
exit
+
                exit
fi
+
        fi
 
fi
 
fi
 +
 
cd $SOURCEDIR/keyring/$KEYRING/keyrings
 
cd $SOURCEDIR/keyring/$KEYRING/keyrings
 
gpg --import < ubuntu-archive-keyring.gpg >/dev/null
 
gpg --import < ubuntu-archive-keyring.gpg >/dev/null
第328行: 第393行:
 
cp ../ubuntu-keyring*deb $BASEDIR/FinalCD/pool/main/u/ubuntu-keyring/
 
cp ../ubuntu-keyring*deb $BASEDIR/FinalCD/pool/main/u/ubuntu-keyring/
 
if [ $? -gt 0 ]; then
 
if [ $? -gt 0 ]; then
echo "Cannot copy the modified ubuntu-keyring over to the pool/main folder. Exiting."
+
        echo "Cannot copy the modified ubuntu-keyring over to the pool/main folder. Exiting."
exit
+
        exit
 
fi
 
fi
 +
 
echo "OK"
 
echo "OK"
 +
 +
 
if [ ! -z $EXTRASDIR ]; then
 
if [ ! -z $EXTRASDIR ]; then
echo -n "Copying Extra files...  "
+
        echo -n "Copying Extra files...  "
rsync -az $EXTRASDIR/ $BASEDIR/FinalCD/
+
        rsync -az $EXTRASDIR/ $BASEDIR/FinalCD/
echo "OK"
+
        echo "OK"
if [ ! -f "$EXTRASDIR/preseed/$SEEDFILE" ]; then
+
 
echo "No seed file found. Creating one in $EXTRASDIR/preseed/$SEEDFILE."
+
        if [ ! -f "$EXTRASDIR/preseed/$SEEDFILE" ]; then
echo "- You will probably want to modify this file."
+
                echo "No seed file found. Creating one in $EXTRASDIR/preseed/$SEEDFILE."
echo "base-config  base-config/package-selection      string ~tubuntu-minimal|~tubuntu-desktop" > $EXTRASDIR/preseed/$SEEDFILE
+
                echo "- You will probably want to modify this file."
fi
+
                echo "base-config  base-config/package-selection      string ~tubuntu-minimal|~tubuntu-desktop" > $EXTRASDIR/preseed/$SEEDFILE
if [ -f $PACKAGELIST ]; then
+
        fi
echo "Replacing ubuntu-desktop with a pruned package list.. "
+
 
cd $SOURCEDIR/ubuntu-meta
+
        if [ -f $PACKAGELIST ]; then
rm -rf ubuntu-*
+
                echo "Replacing ubuntu-desktop with a pruned package list.. "
apt-get source ubuntu-meta
+
                cd $SOURCEDIR/ubuntu-meta
META=`find * -maxdepth 1 -name "ubuntu-meta*" -type d -print`
+
                rm -rf ubuntu-*
if [ -z "$META" ]; then
+
                apt-get source ubuntu-meta
echo "Cannot grab source to ubuntu-meta. Exiting."
+
                META=`find * -maxdepth 1 -name "ubuntu-meta*" -type d -print`
exit
+
                if [ -z "$META" ]; then
fi
+
                      echo "Cannot grab source to ubuntu-meta. Exiting."
cd $META
+
                      exit
for i in `ls desktop*`; do
+
                fi
grep "^ii" $PACKAGELIST | awk '{print $2}' > $i.tmp
+
 
mv $i.tmp $i
+
                cd $META
done
+
                for i in `ls desktop*`; do
dpkg-buildpackage -rfakeroot -m"$MYGPGKEY" -k"$MYGPGKEY" >/dev/null
+
                        grep "^ii" $PACKAGELIST | awk '{print $2}' > $i.tmp
cd ..
+
                        mv $i.tmp $i
rm -f $BASEDIR/FinalCD/pool/main/u/ubuntu-meta/ubuntu-desktop*deb
+
                done
mv ubuntu-desktop*.deb  $BASEDIR/FinalCD/pool/main/u/ubuntu-meta/
+
 
cp $EXTRASDIR/preseed/$SEEDFILE $BASEDIR/FinalCD/preseed/$SEEDFILE
+
                dpkg-buildpackage -rfakeroot -m"$MYGPGKEY" -k"$MYGPGKEY" >/dev/null
fi
+
                cd ..
if [ ! -f "$EXTRASDIR/isolinux/isolinux.cfg" ]; then
+
                rm -f $BASEDIR/FinalCD/pool/main/u/ubuntu-meta/ubuntu-desktop*deb
cat $CDSOURCEDIR/isolinux/isolinux.cfg | sed "s/^APPEND.*/APPEND  preseed\/file=\/cdrom\/preseed\/$SEEDFILE vga=normal initrd=\/install\/initrd.gz ramdisk_size=16384 root=\/dev\/rd\/0 DEBCONF_PRIORITY=critical debconf\/priority=critical rw --/" > $BASEDIR/FinalCD/isolinux/isolinux.cfg
+
                mv ubuntu-desktop*.deb  $BASEDIR/FinalCD/pool/main/u/ubuntu-meta/
fi
+
 
echo "OK"
+
                cp $EXTRASDIR/preseed/$SEEDFILE $BASEDIR/FinalCD/preseed/$SEEDFILE
 +
 
 +
        fi
 +
 
 +
        if [ ! -f "$EXTRASDIR/isolinux/isolinux.cfg" ]; then
 +
                cat $CDSOURCEDIR/isolinux/isolinux.cfg | sed "s/^APPEND.*/APPEND  preseed\/file=\/cdrom\/preseed\/$SEEDFILE vga=normal initrd=\/install\/initrd.gz ramdisk_size=16384 root=\/dev\/rd\/0 DEBCONF_PRIORITY=critical debconf\/priority=critical rw --/" > $BASEDIR/FinalCD/isolinux/isolinux.cfg
 +
        fi
 +
 
 +
        echo "OK"
 
fi
 
fi
 +
 
if [ ! -z "$USPLASH" ]; then
 
if [ ! -z "$USPLASH" ]; then
echo "Modifying Usplash (NOTE: libgd2-dev required)"
+
        echo "Modifying Usplash (NOTE: libgd2-dev required)"
cd $SOURCEDIR
+
 
if [ ! -d usplash ]; then
+
        cd $SOURCEDIR
mkdir usplash
+
        if [ ! -d usplash ]; then
fi
+
                mkdir usplash
cd usplash
+
        fi
SPLASH=`find * -maxdepth 1 -type d -name "usplash*" -type d -print`
+
        cd usplash
if [ -z "$SPLASH" ]; then
+
        SPLASH=`find * -maxdepth 1 -type d -name "usplash*" -type d -print`
apt-get source usplash
+
        if [ -z "$SPLASH" ]; then
SPLASH=`find * -maxdepth 1 -type d -name "usplash*" -type d -print`
+
                apt-get source usplash
fi
+
                SPLASH=`find * -maxdepth 1 -type d -name "usplash*" -type d -print`
if [ -z "$SPLASH" ]; then
+
        fi
echo "Cannot download USPLASH source. Exiting."
+
        if [ -z "$SPLASH" ]; then
exit
+
                echo "Cannot download USPLASH source. Exiting."
fi
+
                exit
cp $USPLASH $SOURCEDIR/usplash/$SPLASH/usplash-artwork.png
+
        fi
cd $SOURCEDIR/usplash/$SPLASH
+
 
dpkg-buildpackage -rfakeroot -m"$MYGPGKEY" -k"$MYGPGKEY" >/dev/null
+
        cp $USPLASH $SOURCEDIR/usplash/$SPLASH/usplash-artwork.png
cd ..
+
        cd $SOURCEDIR/usplash/$SPLASH
rm -f $BASEDIR/FinalCD/pool/main/u/usplash/usplash*deb
+
        dpkg-buildpackage -rfakeroot -m"$MYGPGKEY" -k"$MYGPGKEY" >/dev/null
mv usplash*.deb $BASEDIR/FinalCD/pool/main/u/usplash/
+
        cd ..
 +
        rm -f $BASEDIR/FinalCD/pool/main/u/usplash/usplash*deb
 +
        mv usplash*.deb $BASEDIR/FinalCD/pool/main/u/usplash/
 
fi
 
fi
 +
 
echo "Creating apt package list.."
 
echo "Creating apt package list.."
 
cd $BASEDIR/FinalCD
 
cd $BASEDIR/FinalCD
 +
 
apt-ftparchive -c $SOURCEDIR/apt.conf generate $SOURCEDIR/apt-ftparchive-deb.conf
 
apt-ftparchive -c $SOURCEDIR/apt.conf generate $SOURCEDIR/apt-ftparchive-deb.conf
 
apt-ftparchive -c $SOURCEDIR/apt.conf generate $SOURCEDIR/apt-ftparchive-udeb.conf
 
apt-ftparchive -c $SOURCEDIR/apt.conf generate $SOURCEDIR/apt-ftparchive-udeb.conf
 
if [ ! -z $EXTRASDIR ]; then
 
if [ ! -z $EXTRASDIR ]; then
if [ ! -f $BASEDIR/FinalCD/dists/breezy/main/binary-i386/Release ]; then                cat $BASEDIR/FinalCD/dists/breezy/main/binary-i386/Release | sed 's/Component: main/Component: extras/' > $BASEDIR/FinalCD/dists/breezy/extras/binary-i386/Release
+
        if [ ! -f $BASEDIR/FinalCD/dists/breezy/main/binary-i386/Release ]; then                cat $BASEDIR/FinalCD/dists/breezy/main/binary-i386/Release | sed 's/Component: main/Component: extras/' > $BASEDIR/FinalCD/dists/breezy/extras/binary-i386/Release
fi
+
        fi
## Henrique Haas - check if exsits extras dists directory     
+
        ## Henrique Haas - check if exsits extras dists directory     
if [ ! -d $BASEDIR/finalcd/dists/breezy/extras/binary-i386 ]; then
+
        if [ ! -d $BASEDIR/finalcd/dists/breezy/extras/binary-i386 ]; then
mkdir -p $BASEDIR/finalcd/dists/breezy/extras/binary-i386
+
                mkdir -p $BASEDIR/finalcd/dists/breezy/extras/binary-i386
fi
+
        fi
apt-ftparchive -c $SOURCEDIR/apt.conf generate $SOURCEDIR/apt-ftparchive-extras.conf
+
        apt-ftparchive -c $SOURCEDIR/apt.conf generate $SOURCEDIR/apt-ftparchive-extras.conf
 
fi
 
fi
 +
 +
 +
 +
 
# Kill the existing release file
 
# Kill the existing release file
 
rm -f $BASEDIR/FinalCD/dists/breezy/Release*
 
rm -f $BASEDIR/FinalCD/dists/breezy/Release*
 +
 
apt-ftparchive -c $SOURCEDIR/apt.conf release dists/breezy/ > $BASEDIR/FinalCD/dists/breezy/Release
 
apt-ftparchive -c $SOURCEDIR/apt.conf release dists/breezy/ > $BASEDIR/FinalCD/dists/breezy/Release
 +
 
echo "$GPGKEYPHRASE" | gpg --default-key "$MYGPGKEY" --passphrase-fd 0 --output $BASEDIR/FinalCD/dists/breezy/Release.gpg -ba $BASEDIR/FinalCD/dists/breezy/Release
 
echo "$GPGKEYPHRASE" | gpg --default-key "$MYGPGKEY" --passphrase-fd 0 --output $BASEDIR/FinalCD/dists/breezy/Release.gpg -ba $BASEDIR/FinalCD/dists/breezy/Release
 
echo "OK"
 
echo "OK"
 +
 
cd $BASEDIR/FinalCD
 
cd $BASEDIR/FinalCD
 
echo -n "Updating md5 checksums.. "
 
echo -n "Updating md5 checksums.. "
第414行: 第502行:
 
find . -type f -print0 | xargs -0 md5sum > md5sum.txt
 
find . -type f -print0 | xargs -0 md5sum > md5sum.txt
 
echo "OK"
 
echo "OK"
 +
 
cd $BASEDIR/FinalCD
 
cd $BASEDIR/FinalCD
 
echo "Creating and ISO image..."
 
echo "Creating and ISO image..."
 
mkisofs -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -hide-rr-moved -o $BASEDIR/$CDNAME -R $BASEDIR/FinalCD/
 
mkisofs -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -hide-rr-moved -o $BASEDIR/$CDNAME -R $BASEDIR/FinalCD/
 +
 
echo "CD Available in $BASEDIR/$CDNAME"
 
echo "CD Available in $BASEDIR/$CDNAME"
 
echo "You can now remove all files in:"
 
echo "You can now remove all files in:"
 
echo " - $BASEDIR/FinalCD"
 
echo " - $BASEDIR/FinalCD"
 +
 
# Unmount the old CD
 
# Unmount the old CD
 
umount $CDSOURCEDIR
 
umount $CDSOURCEDIR
第428行: 第519行:
 
#!/bin/bash
 
#!/bin/bash
 
for j in *
 
for j in *
do
+
  do
cd $j
+
    cd $j
for k in *
+
    for k in *
do
+
      do
cd $k
+
        cd $k
for l in *.deb
+
        for l in *.deb
do
+
          do
if [ $l != "*.deb" ]
+
            if [ $l != "*.deb" ]
then
+
              then
n=$(dpkg -l $(echo $l | cut -f1 -d"_") 2> /dev/null| grep "^ii")
+
                n=$(dpkg -l $(echo $l | cut -f1 -d"_") 2> /dev/null| grep "^ii")
if [ -z "$n" ]
+
                if [ -z "$n" ]
then
+
                  then
rm $l
+
                    rm $l
fi
+
                fi
fi
+
            fi
done
+
          done
cd ..
+
        cd ..
done
+
      done
cd ..
+
    cd ..
done
+
  done
 
find -depth -type d -empty -exec rmdir {} \;
 
find -depth -type d -empty -exec rmdir {} \;
 
</nowiki></pre>
 
</nowiki></pre>
 
----
 
----
* Return to [[UbuntuHelp:InstallCDCustomization]].
+
* Return to [[UbuntuHelp:InstallCDCustomization|InstallCDCustomization]].
  
 
[[category:UbuntuHelp]]
 
[[category:UbuntuHelp]]

2008年10月19日 (日) 23:25的最新版本

IconsPage?action=AttachFile&do=get&target=info.png These are scripts to help you customize an Ubuntu installation CD. For more information, see InstallCDCustomization.

Simple example installation script for Breezy

#!/bin/bash
# usage 
# update-learningexchange.sh kubuntu|ubuntu|xubuntu

# a very primitive script with no structure of controls etc
# no default behaviour, etc etc
# all ofthis should be trivial to implement but my 
# bash syntax sucks
# obvious thing to do would be to convert to python
# & add a simple gtk front end too
# but I'm rushed at the moment

# Notes;Bugs:
# REMEMBER: this absolutely will not work if you haven't built a new version of ubuntu-keyring 
# package & included that in $STAGE/pool/extras/!  You do that thusly:
# apt-get source ubuntu-keyring
# cd ubuntu-keyring-version-info/keyring
# gpg --import < ubuntu-server-keyring.gpg
# gpg --output=ubuntu-server-keyring.gpg --export "ubuntu" "Your Name"
# dpkg-buildpackage -rfakeroot -m"My Name <[email protected]>"
# cp ../ubuntu-keyring*deb $BUILD/pool/extras/


# VARIABLES
# this script relies on the existence of several files and directories:

# Original = $ORIG: location of the "clean", unmodified CD .iso
# CD mount point = $MOUNT: mount point of clean CD
# Staging area = $STAGE: where you keep all your files
#   this area should include main dirs isolinux/, pool/, and dists/ at a minimum
#   as written the script assumes you have a directory pool/extras with your 
#   extra debs, and that dists/breezy/extras/binary-i386/Release exists (copy it over 
#   from dists/breezy/main/binary-i386, and replace "main" with "extras")
#   There is no doubt a better way to do this but it involves work...
# Building Area = $BUILD: location where your changes are merged into the "clean" directory \
#   structure.
# Image location = $IMAGE: name of the new .iso file you want to build
# apt.conf file = $APTCONF: location of the file used to feed instructions to apt-ftparchive

ORIG="/var/www/jigdo/$1-breezy-install-i386.iso"
STAGE="/home/matt/LearningExchangeCD/$1/"
MOUNT=/mnt/iso/
BUILD="/yeowe/usr/cdbuilder/$1"
IMAGE="/yeowe/usr/cdbuilder/$1-learningexchange.iso"
APTCONF=/home/matt/LearningExchangeCD/apt.conf 


# sync with latest image
sudo umount $MOUNT
sudo mount $ORIG $MOUNT -o loop
# sudo rsync -azvb --delete --exclude="language-pack*" --backup-dir=/yeowe/usr/cdbuilder/old/ $MOUNT $BUILD
sudo rsync -azvb --delete  $MOUNT $BUILD
# now get rid of the old ubuntu-keyring package
sudo rm -r $BUILD/pool/u/ubuntu-keyring/
# note I've excluded a few files, shouldn't matter much for you I reckon
sudo rsync -avzb --exclude='*~' --exclude='INSTRUCTIONS.txt' --backup-dir=/yeowe/usr/cdbuilder/old/ --exclude='example-preseed.txt' $STAGE $BUILD

# generate Packages, Release, Release.gpg
# first thing to realize is, that we only need to generate the Packages files,
# the top-level Release file, and top-level Release.gpg.  
# everything else should be in your $STAGE file structure or usable unchanged 
# in the original form

# remove Release file otherwise you'll have trouble writing to it.  
sudo rm $BUILD/dists/breezy/Release*
# ubuntu-keyring must be included in main/, so main NEEDS to be rebuilt!
for component in main extras; do
    sudo apt-ftparchive packages "$BUILD/pool/$component/" > "$BUILD/dists/breezy/$component/binary-i386/Packages"
    gzip -c "$BUILD/dists/breezy/$component/binary-i386/Packages" | \
        sudo tee "$BUILD/dists/breezy/$component/binary-i386/Packages.gz" > /dev/null
done
sudo apt-ftparchive -c $APTCONF release $BUILD/dists/breezy > $BUILD/dists/breezy/Release
# gpg options: -ba = armored, detached-sig
sudo gpg --output $BUILD/dists/breezy/Release.gpg -ba $BUILD/dists/breezy/Release

# build the actual image.  Note the options to mkisofs, which make the image bootable
sudo chown -R root:root $BUILD/isolinux  $BUILD/preseed 
sudo mkisofs -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -hide-rr-moved -o $IMAGE -R $BUILD/

# burn the image to 2nd cd drive on most setups
sudo nice -18 cdrecord dev=ATA:1,1,0 speed=12 --blank=fast -v -gracetime=2 -tao $IMAGE

Complex example installation script for Breezy

An alternative script, which provides the capability to:

  • Cut down the number of packages on a CD
  • Install extra packages
  • Change the USplash image (eg: "University of Antarctica, Ubuntu COE build")
  • Include arbitrary other data on the CD
  • Script the installation via a preseed file.

Requirements:

  • Ubuntu breezy ISO image
  • The packages: libgd2-dev, fakeroot, dpkg-dev
  • The script will create any other files it requires.

Note that the script does its 'package installation magic' by altering the 'ubuntu-desktop' package to depend on all of your installed packages. This may include a subset or superset of the original ubuntu-desktop packages. I tried creating a VERY large base-config/package-selection section instead, but this didn't work for me. If you are not going to install ubuntu-desktop as part of your preseed file, you will need to modify the script to modify ubuntu-minimal (for example).

#!/bin/sh
#
# Script by Leigh Purdie
#
# 1) Install a Ubuntu system, and remove packages according to your
#    requirements using synaptic.
#    Don't install any new packages that are NOT available from the CD,
#    at this stage, unless you include the packages in an 'extras' directory.
#
# 2) dpkg -l > PackageList
#    Copy this file to $BASEDIR/source on your build server.

# The Base Directory
BASEDIR="/data/MyBuildInstall"

# This directory will contain files that need to be copied over
# to the new CD.
EXTRASDIR="$BASEDIR/MyBuild"
# Seed file
SEEDFILE="mybuild.seed"

# Ubuntu ISO image
CDIMAGE="$BASEDIR/ubuntu-5.10-install-i386.iso"

# Where the ubuntu iso image will be mounted
CDSOURCEDIR="$BASEDIR/cdsource"

# Directory for building packages
SOURCEDIR="$BASEDIR/source"

# GPG
GPGKEYNAME="My Organisation Installation Key"
GPGKEYCOMMENT="Package Signing"
GPGKEYEMAIL="[email protected]"
GPGKEYPHRASE="MyOrg"
MYGPGKEY="$GPGKEYNAME ($GPGKEYCOMMENT) <$GPGKEYEMAIL>"

# Package list (dpkg -l) from an installed system.
PACKAGELIST="$SOURCEDIR/PackageList"

# Output CD name
CDNAME="MyBuild.iso"

# 640x480 PNG with colours as specified in
# https://wiki.ubuntu.com/USplashCustomizationHowto
USPLASH="$SOURCEDIR/MyBuildSplash1.png"

# ------------ End of modifications.


id | grep -c uid=0 >/dev/null
if [ $? -gt 0 ]; then
        echo "You need to be root in order to run this script.."
        echo " - sudo /bin/sh prior to executing."
        exit
fi

which gpg > /dev/null
if [ $? -eq 1 ]; then
        echo "Please install gpg to generate signing keys"
        exit
fi

# Create a few directories.
if [ ! -d $BASEDIR ]; then mkdir -p $BASEDIR; fi
if [ ! -d $BASEDIR/FinalCD ]; then mkdir -p $BASEDIR/FinalCD; fi
if [ ! -z $EXTRASDIR ]; then
        if [ ! -d $EXTRASDIR ]; then mkdir -p $EXTRASDIR; fi
        if [ ! -d $EXTRASDIR/preseed ]; then mkdir -p $EXTRASDIR/preseed; fi
        if [ ! -d $EXTRASDIR/pool/extras ]; then mkdir -p $EXTRASDIR/pool/extras; fi
fi
if [ ! -d $CDSOURCEDIR ]; then mkdir -p $CDSOURCEDIR; fi
if [ ! -d $SOURCEDIR ]; then mkdir -p $SOURCEDIR; fi
if [ ! -d $SOURCEDIR/keyring ]; then mkdir -p $SOURCEDIR/keyring; fi
if [ ! -d $SOURCEDIR/indices ]; then mkdir -p $SOURCEDIR/indices; fi
if [ ! -d $SOURCEDIR/ubuntu-meta ]; then mkdir -p $SOURCEDIR/ubuntu-meta; fi


if [ ! -f $CDIMAGE ]; then
        echo "Cannot find your ubuntu image. Change CDIMAGE path."
        exit
fi


gpg --list-keys | grep "$GPGKEYNAME" >/dev/null
if [ $? -ne 0 ]; then
        echo "No GPG Key found in your keyring."
        echo "Generating a new gpg key ($GPGKEYNAME $GPGKEYCOMMENT) with a passphrase of $GPGKEYPHRASE .."
        echo ""
        echo "Key-Type: DSA
Key-Length: 1024
Subkey-Type: ELG-E
Subkey-Length: 2048
Name-Real: $GPGKEYNAME
Name-Comment: $GPGKEYCOMMENT
Name-Email: $GPGKEYEMAIL
Expire-Date: 0
Passphrase: $GPGKEYPHRASE" > $BASEDIR/key.inc

        gpg --gen-key --batch --gen-key $BASEDIR/key.inc
        # Note: If you wish to remove the passphrase from the key:
        # (Don't do this if you want to use this key for ANYTHING other
        # than a temporary ubuntu CD installation signing key)
        # gpg --edit-key
        # passwd
        # (enter old phrase)
        # (blank)
        # (blank)
        # y
        # quit
        # y
fi

if [ ! -f $CDSOURCEDIR/md5sum.txt ]; then
        echo -n "Mounting Ubuntu iso.. "
        mount | grep $CDSOURCEDIR
        if [ $? -eq 0 ]; then
                umount $CDSOURCEDIR
        fi

        mount -o loop $BASEDIR/ubuntu-5.10-install-i386.iso $CDSOURCEDIR/
        if [ ! -f $CDSOURCEDIR/md5sum.txt ]; then
                echo "Mount did not succeed. Exiting."
                exit
        fi
        echo "OK"
fi

if [ ! -f $SOURCEDIR/apt.conf ]; then
        echo -n "No APT.CONF file found... generating one."
        # Try and generate one?
        cat $CDSOURCEDIR/dists/breezy/Release | egrep -v "^ " | egrep -v "^(Date|MD5Sum|SHA1)" | sed 's/: / "/' | sed 's/^/APT::FTPArchive::Release::/' | sed 's/$/";/' > $SOURCEDIR/apt.conf
        echo "Ok."
fi

if [ ! -f $SOURCEDIR/apt-ftparchive-deb.conf ]; then
        echo "Dir {
  ArchiveDir \"$BASEDIR/FinalCD\";
};

TreeDefault {
  Directory \"pool/\";
};

BinDirectory \"pool/main\" {
  Packages \"dists/breezy/main/binary-i386/Packages\";
  BinOverride \"$SOURCEDIR/indices/override.breezy.main\";
  ExtraOverride \"$SOURCEDIR/indices/override.breezy.extra2.main\";
};

Default {
  Packages {
    Extensions \".deb\";
    Compress \". gzip\";
  };
};

Contents {
  Compress \"gzip\";
};" > $SOURCEDIR/apt-ftparchive-deb.conf
fi

if [ ! -f $SOURCEDIR/apt-ftparchive-udeb.conf ]; then
        echo "Dir {
  ArchiveDir \"$BASEDIR/FinalCD\";
};

TreeDefault {
  Directory \"pool/\";
};

BinDirectory \"pool/main\" {
  Packages \"dists/breezy/main/debian-installer/binary-i386/Packages\";
  BinOverride \"$SOURCEDIR/indices/override.breezy.main.debian-installer\";
};

Default {
  Packages {
    Extensions \".udeb\";
    Compress \". gzip\";
  };
};

Contents {
  Compress \"gzip\";
};" > $SOURCEDIR/apt-ftparchive-udeb.conf
fi

if [ ! -f $SOURCEDIR/apt-ftparchive-extras.conf ]; then
        echo "Dir {
  ArchiveDir \"$BASEDIR/FinalCD\";
};

TreeDefault {
  Directory \"pool/\";
};

BinDirectory \"pool/extras\" {
  Packages \"dists/breezy/extras/binary-i386/Packages\";
};

Default {
  Packages {
    Extensions \".deb\";
    Compress \". gzip\";
  };
};

Contents {
  Compress \"gzip\";
};" > $SOURCEDIR/apt-ftparchive-extras.conf
fi

if [ ! -f $SOURCEDIR/indices/override.breezy.extra.main ]; then
        for i in override.breezy.extra.main override.breezy.main override.breezy.main.debian-installer; do
                cd $SOURCEDIR/indices
                wget http://archive.ubuntu.com/ubuntu/indices/$i
        done
fi

# Create a 'fixed' version of the extras.main override package.
# Idea/Perl by Ferry Hendrikx, 2006
cat $SOURCEDIR/indices/override.breezy.extra.main | egrep -v ' Task ' > $SOURCEDIR/indices/override.breezy.extra2.main
cat $CDSOURCEDIR/dists/breezy/main/binary-i386/Packages | perl -e 'while (<>) { chomp; if(/^Package\:\s*(.+)$/) { $pkg=$1; } elsif(/^Task\:\s(.+)$/) { print "$pkg\tTask\t$1\n"; } }' >> $SOURCEDIR/indices/override.breezy.extra2.main



echo -n "Resyncing old data...  "

cd $BASEDIR/FinalCD
rsync -atz --delete $CDSOURCEDIR/ $BASEDIR/FinalCD/
echo "OK"



# PackageList is a dpkg -l from our 'build' server.
if [ ! -f $PACKAGELIST ]; then
        echo "No PackageList found. Assuming that you do not require any packages to be removed"
else
        cat $PACKAGELIST | grep "^ii" | awk '{print $2 "_" $3}' > $SOURCEDIR/temppackages

        echo "Removing files that are no longer required.."
        cd $BASEDIR/FinalCD
        # Only use main for the moment. Keep all 'restricted' debs
        rm -f $SOURCEDIR/RemovePackages
        # Note: Leave the udeb's alone.
        for i in `find pool/main -type f -name "*.deb" -print`; do
                FILE=`basename $i | sed 's/_[a-zA-Z0-9\.]*$//'`
                GFILE=`echo $FILE | sed 's/\+/\\\+/g' | sed 's/\./\\\./g'`
                # pool/main/a/alien/alien_8.53_all.deb becomes alien_8.53
                egrep "^"$GFILE $SOURCEDIR/temppackages >/dev/null
                if [ $? -ne 0 ]; then
                        # NOT Found
                        # Note: Keep a couple of anciliary files

                        grep "Filename: $i" $CDSOURCEDIR/dists/breezy/main/debian-installer/binary-i386/Packages >/dev/null
                        if [ $? -eq 0 ]; then
                                # Keep the debian-installer files - we need them.
                                echo "* Keeping special file $FILE"
                        else
                                echo "- Removing unneeded file $FILE"
                                rm -f $BASEDIR/FinalCD/$i

                        fi
                else
                        echo "+ Retaining $FILE"
                fi
        done
fi


echo -n "Generating keyfile..   "

cd $SOURCEDIR/keyring
KEYRING=`find * -maxdepth 1 -name "ubuntu-keyring*" -type d -print`
if [ -z "$KEYRING" ]; then
        apt-get source ubuntu-keyring
        KEYRING=`find * -maxdepth 1 -name "ubuntu-keyring*" -type d -print`
        if [ -z "$KEYRING" ]; then
                echo "Cannot grab keyring source! Exiting."
                exit
        fi
fi

cd $SOURCEDIR/keyring/$KEYRING/keyrings
gpg --import < ubuntu-archive-keyring.gpg >/dev/null
rm -f ubuntu-archive-keyring.gpg
gpg --output=ubuntu-archive-keyring.gpg --export FBB75451 437D05B5 "$GPGKEYNAME" >/dev/null
cd ..
dpkg-buildpackage -rfakeroot -m"$MYGPGKEY" -k"$MYGPGKEY" >/dev/null
rm -f $BASEDIR/FinalCD/pool/main/u/ubuntu-keyring/*
cp ../ubuntu-keyring*deb $BASEDIR/FinalCD/pool/main/u/ubuntu-keyring/
if [ $? -gt 0 ]; then
        echo "Cannot copy the modified ubuntu-keyring over to the pool/main folder. Exiting."
        exit
fi

echo "OK"


if [ ! -z $EXTRASDIR ]; then
        echo -n "Copying Extra files...  "
        rsync -az $EXTRASDIR/ $BASEDIR/FinalCD/
        echo "OK"

        if [ ! -f "$EXTRASDIR/preseed/$SEEDFILE" ]; then
                echo "No seed file found. Creating one in $EXTRASDIR/preseed/$SEEDFILE."
                echo "- You will probably want to modify this file."
                echo "base-config  base-config/package-selection      string ~tubuntu-minimal|~tubuntu-desktop" > $EXTRASDIR/preseed/$SEEDFILE
        fi

        if [ -f $PACKAGELIST ]; then
                echo "Replacing ubuntu-desktop with a pruned package list.. "
                cd $SOURCEDIR/ubuntu-meta
                rm -rf ubuntu-*
                apt-get source ubuntu-meta
                META=`find * -maxdepth 1 -name "ubuntu-meta*" -type d -print`
                if [ -z "$META" ]; then
                      echo "Cannot grab source to ubuntu-meta. Exiting."
                      exit
                fi

                cd $META
                for i in `ls desktop*`; do
                        grep "^ii" $PACKAGELIST | awk '{print $2}' > $i.tmp
                        mv $i.tmp $i
                done

                dpkg-buildpackage -rfakeroot -m"$MYGPGKEY" -k"$MYGPGKEY" >/dev/null
                cd ..
                rm -f $BASEDIR/FinalCD/pool/main/u/ubuntu-meta/ubuntu-desktop*deb
                mv ubuntu-desktop*.deb  $BASEDIR/FinalCD/pool/main/u/ubuntu-meta/

                cp $EXTRASDIR/preseed/$SEEDFILE $BASEDIR/FinalCD/preseed/$SEEDFILE

        fi

        if [ ! -f "$EXTRASDIR/isolinux/isolinux.cfg" ]; then
                cat $CDSOURCEDIR/isolinux/isolinux.cfg | sed "s/^APPEND.*/APPEND   preseed\/file=\/cdrom\/preseed\/$SEEDFILE vga=normal initrd=\/install\/initrd.gz ramdisk_size=16384 root=\/dev\/rd\/0 DEBCONF_PRIORITY=critical debconf\/priority=critical rw --/" > $BASEDIR/FinalCD/isolinux/isolinux.cfg
        fi

        echo "OK"
fi

if [ ! -z "$USPLASH" ]; then
        echo "Modifying Usplash (NOTE: libgd2-dev required)"

        cd $SOURCEDIR
        if [ ! -d usplash ]; then
                mkdir usplash
        fi
        cd usplash
        SPLASH=`find * -maxdepth 1 -type d -name "usplash*" -type d -print`
        if [ -z "$SPLASH" ]; then
                apt-get source usplash
                SPLASH=`find * -maxdepth 1 -type d -name "usplash*" -type d -print`
        fi
        if [ -z "$SPLASH" ]; then
                echo "Cannot download USPLASH source. Exiting."
                exit
        fi

        cp $USPLASH $SOURCEDIR/usplash/$SPLASH/usplash-artwork.png
        cd $SOURCEDIR/usplash/$SPLASH
        dpkg-buildpackage -rfakeroot -m"$MYGPGKEY" -k"$MYGPGKEY" >/dev/null
        cd ..
        rm -f $BASEDIR/FinalCD/pool/main/u/usplash/usplash*deb
        mv usplash*.deb $BASEDIR/FinalCD/pool/main/u/usplash/
fi

echo "Creating apt package list.."
cd $BASEDIR/FinalCD

apt-ftparchive -c $SOURCEDIR/apt.conf generate $SOURCEDIR/apt-ftparchive-deb.conf
apt-ftparchive -c $SOURCEDIR/apt.conf generate $SOURCEDIR/apt-ftparchive-udeb.conf
if [ ! -z $EXTRASDIR ]; then
        if [ ! -f $BASEDIR/FinalCD/dists/breezy/main/binary-i386/Release ]; then                cat $BASEDIR/FinalCD/dists/breezy/main/binary-i386/Release | sed 's/Component: main/Component: extras/' > $BASEDIR/FinalCD/dists/breezy/extras/binary-i386/Release
        fi
        ## Henrique Haas - check if exsits extras dists directory     
        if [ ! -d $BASEDIR/finalcd/dists/breezy/extras/binary-i386 ]; then
                mkdir -p $BASEDIR/finalcd/dists/breezy/extras/binary-i386
        fi
        apt-ftparchive -c $SOURCEDIR/apt.conf generate $SOURCEDIR/apt-ftparchive-extras.conf
fi




# Kill the existing release file
rm -f $BASEDIR/FinalCD/dists/breezy/Release*

apt-ftparchive -c $SOURCEDIR/apt.conf release dists/breezy/ > $BASEDIR/FinalCD/dists/breezy/Release

echo "$GPGKEYPHRASE" | gpg --default-key "$MYGPGKEY" --passphrase-fd 0 --output $BASEDIR/FinalCD/dists/breezy/Release.gpg -ba $BASEDIR/FinalCD/dists/breezy/Release
echo "OK"

cd $BASEDIR/FinalCD
echo -n "Updating md5 checksums.. "
chmod 666 md5sum.txt
rm -f md5sum.txt
find . -type f -print0 | xargs -0 md5sum > md5sum.txt
echo "OK"

cd $BASEDIR/FinalCD
echo "Creating and ISO image..."
mkisofs -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -hide-rr-moved -o $BASEDIR/$CDNAME -R $BASEDIR/FinalCD/

echo "CD Available in $BASEDIR/$CDNAME"
echo "You can now remove all files in:"
echo " - $BASEDIR/FinalCD"

# Unmount the old CD
umount $CDSOURCEDIR

Clean your "main" pool to only include installed packages

If your new CD folder is likely to be too large, you can use the following script from inside pool/main to strip out all packages which are unwanted (that is, packages which aren't currently installed):

#!/bin/bash
for j in *
  do
    cd $j
    for k in *
      do
        cd $k
        for l in *.deb
          do
            if [ $l != "*.deb" ]
              then
                n=$(dpkg -l $(echo $l | cut -f1 -d"_") 2> /dev/null| grep "^ii")
                if [ -z "$n" ]
                  then
                    rm $l
                fi
            fi
          done
        cd ..
      done
    cd ..
  done
find -depth -type d -empty -exec rmdir {} \;