From 8e6007b1716682280f33a16fb59a4b4b666f8238 Mon Sep 17 00:00:00 2001 From: LaMont Jones Date: Wed, 2 Mar 2005 20:39:01 +0000 Subject: [PATCH] add support for kubuntu livecds --- livecd.sh | 368 +++++++++++++++++++++++++++++------------------------- 1 file changed, 197 insertions(+), 171 deletions(-) diff --git a/livecd.sh b/livecd.sh index 21d72a8c..bd10797e 100755 --- a/livecd.sh +++ b/livecd.sh @@ -1,8 +1,8 @@ -#!/bin/sh -eu +#!/bin/bash -eu -################################################################# -#### (c) Copyright 2004 Canonical Ltd. All rights reserved. #### -################################################################# +###################################################################### +#### (c) Copyright 2004,2005 Canonical Ltd. All rights reserved. #### +###################################################################### # Depends: debootstrap, rsync, cloop-utils, python @@ -24,176 +24,202 @@ umask 022 export TTY=unknown export TERM=vt100 case $(hostname --fqdn) in - *.mmjgroup.com) MIRROR=http://ia/ubuntu;; - *.warthogs.hbd.com) MIRROR=http://jackass.warthogs.hbd.com;; - *.ubuntu.com) MIRROR=http://jackass.warthogs.hbd.com;; - *) MIRROR=http://archive.ubuntu.com/ubuntu;; + *.mmjgroup.com) MIRROR=http://ia/ubuntu;; + *.warthogs.hbd.com) MIRROR=http://jackass.warthogs.hbd.com;; + *.ubuntu.com) MIRROR=http://jackass.warthogs.hbd.com;; + *) MIRROR=http://archive.ubuntu.com/ubuntu;; esac -# How much space do we leave on the filesystem for the user? -USZ="400*1024" # 400MB for the user -# And how many inodes? Default currently gives them > 100000 -UINUM="" # blank (default), or number of inodes desired. -STE=hoary - -ROOT=$(pwd)/chroot-livecd/ # trailing / is CRITICAL -IMG=livecd.fsimg -MOUNTS="${ROOT}dev/pts ${ROOT}dev/shm ${ROOT}.dev ${ROOT}dev ${ROOT}proc" -DEV="" - -rm -rf ${ROOT} - -mkdir -p ${ROOT}var/cache/debconf -cat << @@EOF > ${ROOT}var/cache/debconf/config.dat -Name: debconf/frontend -Template: debconf/frontend -Value: Noninteractive -Owners: debconf -Flags: seen -@@EOF - -# need to defer udev until the apt-get, since debootstrap doesn't believe -# in diversions -debootstrap --exclude=udev,ubuntu-base $STE $ROOT $MIRROR - -# Just make a few things go away, which lets us skip a few other things. -# sadly, udev's postinst does some actual work, so we can't just make it -# go away completely. -DIVERTS="usr/sbin/mkinitrd usr/sbin/invoke-rc.d sbin/udevd" -for file in $DIVERTS; do - mkdir -p ${ROOT}${file%/*} - sudo chroot $ROOT dpkg-divert --add --local --divert /${file}.livecd --rename /${file} - cp /bin/true ${ROOT}$file -done +while getopts :m: name; do case $name in + m) MIRROR="$OPTARG";; + \?) echo bad usage >&2; exit 2;; + \:) echo missing argument >&2; exit 2;; +esac; done; +shift $((OPTIND-1)) + +(( $# == 0 )) && set -- ubuntu || true +[ "X$1" = "Xall" ] && set -- ubuntu kubuntu || true + +for arg in "$@"; do case "$arg" in + ubuntu|kubuntu) ;; + *) echo bad name >&2; exit 2;; +esac; done + +for FS in "$@"; do + # How much space do we leave on the filesystem for the user? + USZ="400*1024" # 400MB for the user + # And how many inodes? Default currently gives them > 100000 + UINUM="" # blank (default), or number of inodes desired. + STE=hoary + + ROOT=$(pwd)/chroot-livecd/ # trailing / is CRITICAL + IMG=livecd.fsimg + MOUNTS="${ROOT}dev/pts ${ROOT}dev/shm ${ROOT}.dev ${ROOT}dev ${ROOT}proc" + DEV="" + + rm -rf ${ROOT} + + mkdir -p ${ROOT}var/cache/debconf + cat << @@EOF > ${ROOT}var/cache/debconf/config.dat + Name: debconf/frontend + Template: debconf/frontend + Value: Noninteractive + Owners: debconf + Flags: seen + @@EOF + + case "$FS" in + ubuntu) + LIST="ubuntu-base ubuntu-desktop ubuntu-live" + ;; + kubuntu) + LIST="ubuntu-base kubuntu-desktop ubuntu-live" + ;; + esac + LIST="$LIST xresprobe laptop-detect" + + # need to defer udev until the apt-get, since debootstrap doesn't believe + # in diversions + debootstrap --exclude=udev,ubuntu-base $STE $ROOT $MIRROR + + # Just make a few things go away, which lets us skip a few other things. + # sadly, udev's postinst does some actual work, so we can't just make it + # go away completely. + DIVERTS="usr/sbin/mkinitrd usr/sbin/invoke-rc.d sbin/udevd" + for file in $DIVERTS; do + mkdir -p ${ROOT}${file%/*} + sudo chroot $ROOT dpkg-divert --add --local --divert /${file}.livecd --rename /${file} + cp /bin/true ${ROOT}$file + done -# /bin/true won't cut it for mkinitrd, need to have -o support. -cat << @@EOF > ${ROOT}/usr/sbin/mkinitrd -#!/usr/bin/python -import sys -for i in range(len(sys.argv)): - if sys.argv[i]=='-o': - open(sys.argv[i+1],"w") -@@EOF -chmod 755 ${ROOT}usr/sbin/mkinitrd - -trap "cleanup" 0 1 2 3 15 - -# Make a good /etc/kernel-img.conf for the kernel packages -cat << @@EOF >> ${ROOT}etc/kernel-img.conf -do_symlinks = yes -relative_links = yes -do_bootloader = no -do_bootfloppy = no -do_initrd = yes -link_in_boot = no -@@EOF - -cat << @@EOF > ${ROOT}etc/locale.gen -en_US.UTF-8 UTF-8 -en_GB.UTF-8 UTF-8 -en_ZA.UTF-8 UTF-8 -@@EOF - -mkdir -p ${ROOT}proc -mount -tproc none ${ROOT}proc - -# In addition to the ones we got from apt, trust whatever the local system -# believes in, but put things back afterwards. -cp ${ROOT}etc/apt/trusted.gpg ${ROOT}etc/apt/trusted.gpg.$$ -cat /etc/apt/trusted.gpg >> ${ROOT}etc/apt/trusted.gpg - -LIST="ubuntu-base ubuntu-desktop ubuntu-live xresprobe laptop-detect" -case $(dpkg --print-architecture) in - amd64) LIST="$LIST linux-amd64-generic";; - i386) LIST="$LIST linux-386";; - ia64) LIST="$LIST linux-itanium-smp linux-mckinley-smp";; - powerpc) LIST="$LIST linux-powerpc linux-power3 linux-power4";; - - # and the bastard stepchildren - hppa) LIST="$LIST linux-hppa32-smp linux-hppa64-smp";; - sparc*) LIST="$LIST linux-sparc64";; - *) echo "Unknown architecture: no kernel."; exit 1;; -esac + # /bin/true won't cut it for mkinitrd, need to have -o support. + cat << @@EOF > ${ROOT}/usr/sbin/mkinitrd + #!/usr/bin/python + import sys + for i in range(len(sys.argv)): + if sys.argv[i]=='-o': + open(sys.argv[i+1],"w") + @@EOF + chmod 755 ${ROOT}usr/sbin/mkinitrd + + trap "cleanup" 0 1 2 3 15 + + # Make a good /etc/kernel-img.conf for the kernel packages + cat << @@EOF >> ${ROOT}etc/kernel-img.conf + do_symlinks = yes + relative_links = yes + do_bootloader = no + do_bootfloppy = no + do_initrd = yes + link_in_boot = no + @@EOF + + cat << @@EOF > ${ROOT}etc/locale.gen + en_US.UTF-8 UTF-8 + en_GB.UTF-8 UTF-8 + en_ZA.UTF-8 UTF-8 + @@EOF + + mkdir -p ${ROOT}proc + mount -tproc none ${ROOT}proc + + # In addition to the ones we got from apt, trust whatever the local system + # believes in, but put things back afterwards. + cp ${ROOT}etc/apt/trusted.gpg ${ROOT}etc/apt/trusted.gpg.$$ + cat /etc/apt/trusted.gpg >> ${ROOT}etc/apt/trusted.gpg + + case $(dpkg --print-architecture) in + amd64) LIST="$LIST linux-amd64-generic";; + i386) LIST="$LIST linux-386";; + ia64) LIST="$LIST linux-itanium-smp linux-mckinley-smp";; + powerpc) LIST="$LIST linux-powerpc linux-power3 linux-power4";; + + # and the bastard stepchildren + hppa) LIST="$LIST linux-hppa32-smp linux-hppa64-smp";; + sparc*) LIST="$LIST linux-sparc64";; + *) echo "Unknown architecture: no kernel."; exit 1;; + esac + + # Create a good sources.list, and finish the install + echo deb $MIRROR $STE main restricted > ${ROOT}etc/apt/sources.list + chroot $ROOT apt-get update + chroot $ROOT apt-get -y install $LIST ${ROOT}etc/apt/sources.list -chroot $ROOT apt-get update -chroot $ROOT apt-get -y install $LIST ${ROOT}etc/apt/sources.list + deb http://archive.ubuntu.com/ubuntu $STE main restricted + deb-src http://archive.ubuntu.com/ubuntu $STE main restricted + + ## Uncomment the following two lines to add software from the 'universe' + ## repository. + ## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu + ## team, and may not be under a free licence. Please satisfy yourself as to + ## your rights to use the software. Also, please note that software in + ## universe WILL NOT receive any review or updates from the Ubuntu security + ## team. + # deb http://archive.ubuntu.com/ubuntu $STE universe + # deb-src http://archive.ubuntu.com/ubuntu $STE universe + + deb http://security.ubuntu.com/ubuntu ${STE}-security main restricted + deb-src http://security.ubuntu.com/ubuntu ${STE}-security main restricted + @@EOF + mv ${ROOT}etc/apt/trusted.gpg.$$ ${ROOT}etc/apt/trusted.gpg + + # get rid of the .debs - we don't need them. + chroot ${ROOT} apt-get clean + rm -f ${ROOT}var/lib/apt/lists/*_* + rm -f ${ROOT}var/spool/postfix/maildrop/* + chroot $ROOT apt-get update || true # give them fresh lists, but don't fail + rm ${ROOT}etc/resolv.conf + chroot ${ROOT} dpkg-query -W --showformat='${Package} ${Version}\n' > livecd.manifest + + mkdir -p livecd.mnt + MOUNTS="$MOUNTS $(pwd)/livecd.mnt" + DEV=$(losetup -f); + + # Make the filesystem, with some room for meta data and such + SZ=$(python -c "print int(($(du -sk $ROOT|sed 's/[^0-9].*$//')*1.1+$USZ)/1024)") + (( SZ > 2047 )) && SZ=2047 + SZ=2047 # XXX fix size for now + + for fsbs in 1024:65536; do + FSBLOCK=${fsbs%:*} + COMP=${fsbs#*:} + IMGNAME=${IMG}-${FS}-${FSBLOCK} + if [ ! -f ${IMGNAME} ]; then + if [ -f old-${IMGNAME} ]; then + cp old-${IMGNAME} new-${IMGNAME} + else + dd if=/dev/zero of=new-${IMGNAME} count=$SZ bs=1M + INUM="" + [ -n "$UINUM" ] && INUM="-N "$(python -c "print $(find ${ROOT}|wc -l)+$UINUM") || INUM="" + mke2fs -b $FSBLOCK $INUM -Osparse_super -F new-${IMGNAME} + fi + losetup $DEV new-${IMGNAME} + mount $DEV livecd.mnt + rsync -a --delete --inplace --no-whole-file ${ROOT} livecd.mnt + umount $DEV + rm -rf partimg-${IMGNAME}.* + if [ -x /usr/sbin/partimage ]; then + partimage -b -z0 --nodesc -f3 -c -o -y save $DEV partimg-${IMGNAME} + cat partimg-${IMGNAME}.*|partimage -b -z0 --nodesc -e -f3 -c -o -y restore $DEV stdin + fi + losetup -d $DEV + mv new-${IMGNAME} ${IMGNAME} + cp ${IMGNAME} old-${IMGNAME} + fi + create_compressed_fs $IMGNAME $COMP > livecd.cloop-${FS}-${fsbs} + done -# And make this look more pristene -cleanup -cat << @@EOF > ${ROOT}etc/apt/sources.list -deb http://archive.ubuntu.com/ubuntu $STE main restricted -deb-src http://archive.ubuntu.com/ubuntu $STE main restricted - -## Uncomment the following two lines to add software from the 'universe' -## repository. -## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu -## team, and may not be under a free licence. Please satisfy yourself as to -## your rights to use the software. Also, please note that software in -## universe WILL NOT receive any review or updates from the Ubuntu security -## team. -# deb http://archive.ubuntu.com/ubuntu $STE universe -# deb-src http://archive.ubuntu.com/ubuntu $STE universe - -deb http://security.ubuntu.com/ubuntu ${STE}-security main restricted -deb-src http://security.ubuntu.com/ubuntu ${STE}-security main restricted -@@EOF -mv ${ROOT}etc/apt/trusted.gpg.$$ ${ROOT}etc/apt/trusted.gpg - -# get rid of the .debs - we don't need them. -chroot ${ROOT} apt-get clean -rm -f ${ROOT}var/lib/apt/lists/*_* -rm -f ${ROOT}var/spool/postfix/maildrop/* -chroot $ROOT apt-get update || true # give them fresh lists, but don't fail -rm ${ROOT}etc/resolv.conf - -mkdir -p livecd.mnt -MOUNTS="$MOUNTS $(pwd)/livecd.mnt" -DEV=$(losetup -f); - -# Make the filesystem, with some room for meta data and such -SZ=$(python -c "print int(($(du -sk $ROOT|sed 's/[^0-9].*$//')*1.1+$USZ)/1024)") -(( SZ > 2047 )) && SZ=2047 -SZ=2047 # XXX fix size for now - -for fsbs in 1024:65536; do - FSBLOCK=${fsbs%:*} - COMP=${fsbs#*:} - IMGNAME=${IMG}-${FSBLOCK} - if [ ! -f ${IMGNAME} ]; then - if [ -f old-${IMGNAME} ]; then - cp old-${IMGNAME} new-${IMGNAME} - else - dd if=/dev/zero of=new-${IMGNAME} count=$SZ bs=1M - INUM="" - [ -n "$UINUM" ] && INUM="-N "$(python -c "print $(find ${ROOT}|wc -l)+$UINUM") || INUM="" - mke2fs -b $FSBLOCK $INUM -Osparse_super -F new-${IMGNAME} - fi - losetup $DEV new-${IMGNAME} - mount $DEV livecd.mnt - rsync -a --delete --inplace --no-whole-file ${ROOT} livecd.mnt - umount $DEV - rm -rf partimg-${IMGNAME}.* - if [ -x /usr/sbin/partimage ]; then - partimage -b -z0 --nodesc -f3 -c -o -y save $DEV partimg-${IMGNAME} - cat partimg-${IMGNAME}.*|partimage -b -z0 --nodesc -e -f3 -c -o -y restore $DEV stdin - fi - losetup -d $DEV - mv new-${IMGNAME} ${IMGNAME} - cp ${IMGNAME} old-${IMGNAME} - fi - create_compressed_fs $IMGNAME $COMP > livecd.cloop-${fsbs} done - -chroot ${ROOT} dpkg-query -W --showformat='${Package} ${Version}\n' > livecd.manifest