~xubuntu-dev/livecd-rootfs/xubuntu-base

« back to all changes in this revision

Viewing changes to livecd.sh

  • Committer: Colin Watson
  • Date: 2013-07-23 14:45:15 UTC
  • Revision ID: cjwatson@canonical.com-20130723144515-ayv5rwac8t9qzi66
Remove all vestiges of livecd.sh and ubuntu-touch-android.sh.
Requiescant in pace.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/bin/bash
2
 
set -eu
3
 
 
4
 
##########################################################################
5
 
####           (c) Copyright 2004-2007 Canonical Ltd.                #####
6
 
#                                                                        #
7
 
# This program is free software; you can redistribute it and/or modify   #
8
 
# it under the terms of the GNU General Public License as published by   #
9
 
# the Free Software Foundation; either version 2, or (at your option)    #
10
 
# any later version.                                                     #
11
 
#                                                                        #
12
 
# This program is distributed in the hope that it will be useful, but    #
13
 
# WITHOUT ANY WARRANTY; without even the implied warranty of             #
14
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      #
15
 
# General Public License for more details.                               #
16
 
#                                                                        #
17
 
# You should have received a copy of the GNU General Public License with #
18
 
# your Ubuntu system, in /usr/share/common-licenses/GPL, or with the     #
19
 
# livecd-rootfs source package as the file COPYING.  If not, write to    #
20
 
# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,   #
21
 
# Boston, MA 02110-1301 USA.                                             #
22
 
##########################################################################
23
 
 
24
 
# Depends: debootstrap, rsync, python-minimal|python, procps, squashfs-tools, ltsp-server [i386], e2fsprogs
25
 
 
26
 
cleanup() {
27
 
    for mnt in ${ROOT}dev/pts ${ROOT}dev/shm ${ROOT}.dev ${ROOT}dev \
28
 
               ${ROOT}proc/sys/fs/binfmt_misc ${ROOT}proc ${ROOT}sys \
29
 
               ${ROOT}lib/modules/*/volatile ${ROOT}var/{lock,run}; do
30
 
        umount $mnt || true
31
 
    done
32
 
 
33
 
    [ -n "$DEV" ] && umount $DEV && losetup -d $DEV || true
34
 
    grep ${ROOT} /proc/mounts && return 1 || return 0
35
 
}
36
 
 
37
 
kill_users() {
38
 
    set +e
39
 
    PIDLIST="$(ls -l /proc/*/root 2>/dev/null | grep -- " -> ${ROOT%/}" | sed -n 's/^.*proc.\([0-9]*\).*$/\1/p')"
40
 
    while [ -n "${PIDLIST}" ]; do
41
 
        echo killing $PIDLIST
42
 
        ps -l $(for p in $PIDLIST; do echo ' '-p $p; done)
43
 
        kill -9 $PIDLIST
44
 
        sleep 2
45
 
        PIDLIST="$(ls -l /proc/*/root 2>/dev/null | grep -- " -> ${ROOT%/}" | sed -n 's/^.*proc.\([0-9]*\).*$/\1/p')"
46
 
    done
47
 
    set -e
48
 
}
49
 
 
50
 
without_package() {
51
 
    echo "$2" | tr ' ' '\n' | grep -v "^$1$" | tr '\n' ' '
52
 
}
53
 
 
54
 
subst_package() {
55
 
    echo "$3" | tr ' ' '\n' | sed "s/^$1$/$2/" | tr '\n' ' '
56
 
}
57
 
 
58
 
 
59
 
livefs_squash()
60
 
{
61
 
  squashsort="http://people.ubuntu.com/~tfheen/livesort/${FSS}.list.${TARGETARCH}"
62
 
  #if wget -O livecd.${FSS}.sort ${squashsort} > /dev/null 2>&1; then
63
 
  if false; then
64
 
    echo "Using the squashfs sort list from ${squashsort}."
65
 
  else
66
 
    echo "Unable to fetch squashfs sort list; using a blank list."
67
 
    : > livecd.${FSS}.sort
68
 
  fi
69
 
 
70
 
  # make sure there is no old squashfs idling around
71
 
  rm -f livecd.${FSS}.squashfs
72
 
 
73
 
  mksquashfs ${ROOT} livecd.${FSS}.squashfs -sort livecd.${FSS}.sort
74
 
  chmod 644 livecd.${FSS}.squashfs
75
 
}
76
 
 
77
 
livefs_ext2()
78
 
{
79
 
  # Add 1024MiB extra free space for first boot + ext3 journal + swapfile
80
 
  size=$(($(du -ks ${ROOT} | cut -f1) + (1024000)))
81
 
  MOUNTPOINT=$(mktemp -d)
82
 
  DEV=$(losetup -f)
83
 
  echo "Building ext2 filesystem."
84
 
 
85
 
  # remove any stale filesystem images
86
 
  rm -f livecd.${FSS}.ext?
87
 
 
88
 
  # create an empty ext2 image and loop mount it
89
 
  dd if=/dev/zero of=livecd.${FSS}.ext2 bs=1024 count=0 seek=$size
90
 
  mke2fs -i 8192 -F livecd.${FSS}.ext2
91
 
  mount -o loop=${DEV} livecd.${FSS}.ext2 ${MOUNTPOINT}
92
 
 
93
 
  # copy chroot content to image
94
 
  cp -a ${ROOT}/* ${MOUNTPOINT}
95
 
 
96
 
  # Create a swapfile in rootfs we can use or delete later on during first boot.
97
 
  # doing it *during* first boot adds 3min to the bootprocess so the decision
98
 
  # was to do it here. Luckily the file will compress to nearly zero so it does
99
 
  # not add to the image size once we gzipped the image.
100
 
  dd if=/dev/zero of=${MOUNTPOINT}/SWAP.swap bs=1048576 count=512
101
 
  mkswap ${MOUNTPOINT}/SWAP.swap
102
 
 
103
 
  # make sure we dont have the buildd name set as hostname (LP: #605972)
104
 
  echo "localhost" >${MOUNTPOINT}/etc/hostname
105
 
 
106
 
  # clean up
107
 
  umount ${MOUNTPOINT}
108
 
  rm -rf ${MOUNTPOINT}
109
 
  losetup -d $DEV || true
110
 
  chmod 644 livecd.${FSS}.ext2
111
 
}
112
 
 
113
 
checkpoint()
114
 
{
115
 
  echo "===== $1 ====="
116
 
  date
117
 
}
118
 
 
119
 
if [ $(id -u) != 0 ];then
120
 
  echo "must be run as root"
121
 
  exit 2
122
 
fi
123
 
 
124
 
checkpoint "Starting build"
125
 
 
126
 
umask 022
127
 
export TTY=unknown
128
 
export TERM=vt100
129
 
export DEBIAN_FRONTEND=noninteractive
130
 
export LANG=C
131
 
export CASPER_GENERATE_UUID=1
132
 
SRCMIRROR=http://archive.ubuntu.com/ubuntu
133
 
PPAMIRROR=ppa.launchpad.net
134
 
ARCH=$(dpkg --print-architecture)
135
 
OPTMIRROR=
136
 
INITRD_COMPRESSOR=lzma
137
 
TMPFS=no
138
 
 
139
 
select_mirror () {
140
 
    case $ARCH in
141
 
        i386|amd64)
142
 
            case $FS in
143
 
                ubuntu-lpia|ubuntu-mid)
144
 
                    USERMIRROR=http://ports.ubuntu.com/ubuntu-ports
145
 
                    SECMIRROR=${USERMIRROR}
146
 
                    SECSRCMIRROR=${SRCMIRROR}
147
 
                    TARGETARCH=lpia
148
 
                    ;;
149
 
                *)
150
 
                    USERMIRROR=http://archive.ubuntu.com/ubuntu
151
 
                    SECMIRROR=http://security.ubuntu.com/ubuntu
152
 
                    SECSRCMIRROR=${SECMIRROR}
153
 
                    TARGETARCH=${ARCH}
154
 
                    ;;
155
 
            esac
156
 
            ;;
157
 
        *)
158
 
            USERMIRROR=http://ports.ubuntu.com/ubuntu-ports
159
 
            SECMIRROR=${USERMIRROR}
160
 
            SECSRCMIRROR=${SRCMIRROR}
161
 
            TARGETARCH=${ARCH}
162
 
            ;;
163
 
    esac
164
 
    case $(hostname --fqdn) in
165
 
        bld-*.mmjgroup.com)     MIRROR=${USERMIRROR};;
166
 
        *.mmjgroup.com)         MIRROR=http://archive.mmjgroup.com/${USERMIRROR##*/};;
167
 
        *.0c3.net)
168
 
                case $ARCH in
169
 
                        i386|amd64)     MIRROR=http://mirrors.0c3.net/ubuntu/ ;;
170
 
                        *)              MIRROR=http://mirrors.0c3.net/ubuntu-ports/ ;;
171
 
                esac
172
 
                ;;
173
 
        *.ubuntu.com)           MIRROR=http://ftpmaster.internal/ubuntu;;
174
 
        *.warthogs.hbd.com)     MIRROR=http://ftpmaster.internal/ubuntu;;
175
 
        *.buildd)               MIRROR=http://ftpmaster.internal/ubuntu;;
176
 
        *)                      MIRROR=${USERMIRROR};;
177
 
    esac
178
 
 
179
 
    if [ "$OPTMIRROR" ]; then
180
 
        MIRROR="$OPTMIRROR"
181
 
    fi
182
 
}
183
 
 
184
 
STE=$(lsb_release -cs)
185
 
EXCLUDE=""
186
 
LIST=""
187
 
SUBARCH=""
188
 
PROPOSED=""
189
 
IMAGEFORMAT="squashfs"
190
 
# must be in the "team / PPA name" form; e.g. "moblin/ppa"; the default PPA
191
 
# name is "ppa", don't omit it
192
 
PPA=""
193
 
APT_SOURCE=""
194
 
FORCE_YES=""
195
 
 
196
 
while getopts :d:e:i:I:m:S:s:a:A:f:p name; do case $name in
197
 
    d)  STE=$OPTARG;;
198
 
    e)  EXCLUDE="$EXCLUDE $OPTARG";;
199
 
    i)  LIST="$LIST $OPTARG";;
200
 
    I)  UINUM="$OPTARG";;
201
 
    m)  OPTMIRROR="$OPTARG";;
202
 
    S)  USZ="$OPTARG";;
203
 
    s)  SUBARCH="$OPTARG";;
204
 
    a)  ARCH="$OPTARG";;
205
 
    A)  APT_SOURCE="$OPTARG";;
206
 
    f)  IMAGEFORMAT="$OPTARG";;
207
 
    p)  PROPOSED="yes";;
208
 
    \?) echo bad usage >&2; exit 2;;
209
 
    \:) echo missing argument >&2; exit 2;;
210
 
esac; done;
211
 
shift $((OPTIND-1))
212
 
 
213
 
if (( $# == 0 )) || [ "X$1" = "Xall" ]; then
214
 
    set -- ubuntu kubuntu kubuntu-active edubuntu xubuntu mythbuntu gobuntu base ubuntu-headless cloud-live
215
 
    if [ "$ARCH" = "i386" ]; then
216
 
        set -- ubuntu ubuntu-dvd kubuntu kubuntu-dvd kubuntu-active edubuntu edubuntu-dvd mythbuntu xubuntu gobuntu base ubuntu-headless
217
 
    fi
218
 
fi
219
 
 
220
 
if [ "$IMAGEFORMAT" = "ext2" ] || [ "$IMAGEFORMAT" = "ext3" ]; then
221
 
    LIVE_BOOT_SCRIPTS="jasper"
222
 
else
223
 
    LIVE_BOOT_SCRIPTS="casper lupin-casper"
224
 
fi
225
 
 
226
 
for arg in "$@"; do
227
 
    case "$arg" in
228
 
       ubuntu|ubuntu-dvd|ubuntu-lpia|edubuntu|edubuntu-dvd|kubuntu|kubuntu-dvd|kubuntu-active|xubuntu|mythbuntu|gobuntu|ubuntu-mid|ubuntu-netbook|ubuntu-moblin-remix|base|ubuntu-headless|tocd|cloud-live)
229
 
            ;;
230
 
        *)
231
 
            echo bad name >&2;
232
 
            exit 2
233
 
            ;;
234
 
    esac
235
 
done
236
 
 
237
 
ROOT=$(pwd)/chroot-livecd/      # trailing / is CRITICAL
238
 
for FS in "$@"; do
239
 
    FSS="$FS${SUBARCH:+-$SUBARCH}"
240
 
    IMG=livecd.${FSS}.fsimg
241
 
    DEV=""
242
 
    COMP="main restricted"
243
 
 
244
 
    select_mirror
245
 
 
246
 
    # Just in case there's some leftover junk here:
247
 
    cleanup 2>/dev/null || true
248
 
 
249
 
    umount ${ROOT} || true
250
 
    rm -rf ${ROOT}
251
 
    mkdir ${ROOT}
252
 
    # maybe use a tmpfs
253
 
    if  test yes = "$TMPFS"; then
254
 
        mount -t tmpfs -o size=8192M tmpfs ${ROOT} && echo using tmpfs
255
 
    fi
256
 
 
257
 
    mkdir -p ${ROOT}etc/dpkg/dpkg.cfg.d
258
 
    cat << @@EOF > ${ROOT}etc/dpkg/dpkg.cfg.d/livecd-rootfs
259
 
force-unsafe-io
260
 
@@EOF
261
 
 
262
 
    mkdir -p ${ROOT}var/cache/debconf
263
 
    cat << @@EOF > ${ROOT}var/cache/debconf/config.dat
264
 
Name: debconf/frontend
265
 
Template: debconf/frontend
266
 
Value: Noninteractive
267
 
Owners: debconf
268
 
Flags: seen
269
 
 
270
 
@@EOF
271
 
 
272
 
    case "$FS" in
273
 
        ubuntu|ubuntu-lpia|ubuntu-dvd)
274
 
            LIST="$LIST minimal^ standard^ ubuntu-desktop^"
275
 
            LIVELIST="ubuntu-live^ laptop-detect $LIVE_BOOT_SCRIPTS"
276
 
            ;;
277
 
        kubuntu|kubuntu-dvd)
278
 
            LIST="$LIST minimal^ standard^ kubuntu-desktop^"
279
 
            LIVELIST="kubuntu-live^ laptop-detect $LIVE_BOOT_SCRIPTS"
280
 
            ;;
281
 
        kubuntu-active)
282
 
            LIST="$LIST minimal^ standard^ kubuntu-active^"
283
 
            LIVELIST="kubuntu-active-live^ laptop-detect $LIVE_BOOT_SCRIPTS"
284
 
            COMP="main restricted universe"
285
 
            ;;
286
 
        edubuntu|edubuntu-dvd)
287
 
            LIST="$LIST minimal^ standard^ edubuntu-desktop-gnome^"
288
 
            LIVELIST="edubuntu-live^ laptop-detect $LIVE_BOOT_SCRIPTS"
289
 
            COMP="main restricted universe"
290
 
            ;;
291
 
        xubuntu)
292
 
            LIST="$LIST minimal^ standard^ xterm xubuntu-desktop^"
293
 
            LIVELIST="xubuntu-live^ laptop-detect $LIVE_BOOT_SCRIPTS"
294
 
            COMP="main restricted universe multiverse"
295
 
            ;;
296
 
        gobuntu)
297
 
            LIST="$LIST minimal^ standard^ gobuntu-desktop^"
298
 
            LIVELIST="gobuntu-live^ laptop-detect $LIVE_BOOT_SCRIPTS"
299
 
            COMP="main"
300
 
            ;;
301
 
        ubuntu-mid)
302
 
            LIST="$LIST minimal^ mobile-mid^"
303
 
            LIVELIST="mobile-live^ casper ubiquity"
304
 
            COMP="main restricted universe multiverse"
305
 
            ;;
306
 
        ubuntu-netbook)
307
 
            LIST="$LIST minimal^ standard^ ubuntu-netbook^"
308
 
            LIVELIST="netbook-live^ laptop-detect $LIVE_BOOT_SCRIPTS"
309
 
            ;;
310
 
        mythbuntu)
311
 
            LIST="$LIST minimal^ standard^ mythbuntu-desktop^"
312
 
            LIVELIST="mythbuntu-live^ laptop-detect $LIVE_BOOT_SCRIPTS"
313
 
            COMP="main restricted universe multiverse"
314
 
            ;;
315
 
        ubuntu-moblin-remix)
316
 
            LIST="$LIST minimal^ ubuntu-moblin-remix"
317
 
            LIVELIST="ubuntu-moblin-live"
318
 
            COMP="main restricted universe"
319
 
            PPA="moblin/ppa"
320
 
            ;;
321
 
        base)
322
 
            LIST="$LIST minimal^ standard^"
323
 
            LIVELIST="$LIVE_BOOT_SCRIPTS"
324
 
            ;;
325
 
        ubuntu-headless)
326
 
            LIST="$LIST minimal^ standard^"
327
 
            LIVELIST="$LIVE_BOOT_SCRIPTS"
328
 
            ;;
329
 
        cloud-live)
330
 
            LIST="$LIST minimal^ standard^"
331
 
            LIVELIST="minimal^ standard^ cloud-live-config $LIVE_BOOT_SCRIPTS"
332
 
            COMP="main restricted universe"
333
 
            PPA="cloud-live/config"
334
 
            ;;
335
 
        tocd)
336
 
            LIST="$LIST minimal^ standard^"
337
 
            tocdtmp=`mktemp -d` || exit 1
338
 
            tocdgerminate='http://people.ubuntu.com/~cjwatson/germinate-output/tocd3.1-dapper/'
339
 
            if wget -O "$tocdtmp"/desktop "$tocdgerminate"/desktop; then
340
 
                tocddesktop=`awk '{print $1}' "$tocdtmp"/desktop | egrep -v '^-|^Package|^\|' | tr '\n' ' '`
341
 
                echo "TheOpenCD desktop package list is: $tocddesktop"
342
 
            else
343
 
                echo "Unable to fetch tocd-desktop germinate output."
344
 
                [ -d "$tocdtmp" ] && rm -rf "$tocdtmp"
345
 
                exit 1
346
 
            fi
347
 
            if wget -O "$tocdtmp"/live "$tocdgerminate"/live; then
348
 
                tocdlive=`awk '{print $1}' "$tocdtmp"/live | egrep -v '^-|^Package|^\|' | tr '\n' ' '`
349
 
                echo "TheOpenCD live package list is: $tocdlive"
350
 
            else
351
 
                echo "Unable to fetch tocd-live germinate output."
352
 
                [ -d "$tocdtmp" ] && rm -rf "$tocdtmp"
353
 
                exit 1
354
 
            fi
355
 
            [ -d "$tocdtmp" ] && rm -rf "$tocdtmp"
356
 
            LIST="$LIST $tocddesktop"
357
 
            LIVELIST="$tocdlive casper"
358
 
    esac
359
 
    case "$FS" in
360
 
        *-dvd)
361
 
            LIVELIST="$LIVELIST ${FS}-live^"
362
 
            UNIVERSE=1
363
 
            MULTIVERSE=1
364
 
            ;;
365
 
        *)
366
 
            UNIVERSE=
367
 
            MULTIVERSE=
368
 
            ;;
369
 
    esac
370
 
 
371
 
    dpkg -l livecd-rootfs || true       # get our version # in the log.
372
 
    checkpoint "Bootstrapping base system"
373
 
    debootstrap --components=$(echo $COMP | sed 's/ /,/g') --arch $TARGETARCH $STE $ROOT $MIRROR
374
 
 
375
 
    # Recent dpkg has started complaining pretty loudly if dev/pts isn't 
376
 
    # mounted, so let's get it mounted immediately after debootstrap:
377
 
    mount -t devpts devpts-${STE}-${FSS}-livefs ${ROOT}dev/pts
378
 
 
379
 
    # Just make a few things go away, which lets us skip a few other things.
380
 
    DIVERTS="usr/sbin/mkinitrd usr/sbin/invoke-rc.d"
381
 
    for file in $DIVERTS; do
382
 
        mkdir -p ${ROOT}${file%/*}
383
 
        chroot $ROOT dpkg-divert --add --local --divert /${file}.livecd --rename /${file}
384
 
        cp ${ROOT}/bin/true ${ROOT}$file
385
 
    done
386
 
 
387
 
    # /bin/true won't cut it for mkinitrd, need to have -o support.
388
 
    cat << @@EOF > ${ROOT}/usr/sbin/mkinitrd
389
 
#!/usr/bin/python
390
 
import sys
391
 
for i in range(len(sys.argv)):
392
 
    if sys.argv[i]=='-o':
393
 
        open(sys.argv[i+1],"w")
394
 
@@EOF
395
 
    chmod 755 ${ROOT}usr/sbin/mkinitrd
396
 
 
397
 
    trap "cleanup" 0 1 2 3 15
398
 
 
399
 
    case $TARGETARCH in
400
 
        alpha|amd64|i386|ia64|lpia|m68k|mips|mipsel)
401
 
            link_in_boot=no
402
 
            ;;
403
 
        *)
404
 
            link_in_boot=yes
405
 
            ;;
406
 
    esac
407
 
 
408
 
    # Make a good /etc/kernel-img.conf for the kernel packages
409
 
    cat << @@EOF >> ${ROOT}etc/kernel-img.conf
410
 
do_symlinks = yes
411
 
relative_links = yes
412
 
do_bootloader = no
413
 
do_bootfloppy = no
414
 
do_initrd = yes
415
 
link_in_boot = $link_in_boot
416
 
@@EOF
417
 
 
418
 
    mkdir -p ${ROOT}proc
419
 
    mount -tproc none ${ROOT}proc
420
 
 
421
 
    # this indicates whether or not to keep /boot/vmlinuz; the default is to
422
 
    # strip it from the livefs as ubiquity >= 1.9.4 copies the kernel from the
423
 
    # CD root (/casper/vmlinuz) to the target if it doesn't find one on the
424
 
    # livefs, allowing us to save space; however some subarches use the uImage
425
 
    # format in casper/ so we would end up with no vmlinuz file in /boot at the
426
 
    # end. Not stripping it in the first place from /boot saves us from that.
427
 
    STRIP_VMLINUZ=yes
428
 
 
429
 
    case $TARGETARCH+$SUBARCH in
430
 
        powerpc+ps3)
431
 
            mkdir -p ${ROOT}spu;;
432
 
    esac
433
 
 
434
 
    case $TARGETARCH in
435
 
        amd64)          LIST="$LIST linux-generic";;
436
 
        i386)           LIST="$LIST linux-generic";;
437
 
 
438
 
        # and the bastard stepchildren
439
 
        lpia)           LIST="$LIST linux-lpia";;
440
 
        ia64)           LIST="$LIST linux-ia64";;
441
 
        hppa)           LIST="$LIST linux-hppa32 linux-hppa64";;
442
 
        powerpc)        LIST="$LIST linux-powerpc linux-powerpc64-smp";;
443
 
        sparc*)         LIST="$LIST linux-sparc64";;
444
 
        armel)
445
 
                        #inhibit running of flash-kernel for armel
446
 
                        export FLASH_KERNEL_SKIP=1
447
 
                        case "$SUBARCH" in
448
 
                                imx51)
449
 
                                        LIST="$LIST linux-imx51"
450
 
                                        ;;
451
 
                                dove)
452
 
                                        LIST="$LIST linux-dove"
453
 
                                        STRIP_VMLINUZ=no
454
 
                                        ;;
455
 
                                omap)
456
 
                                        LIST="$LIST linux-omap x-loader-omap3-beagle u-boot-linaro-omap3-beagle"
457
 
                                        STRIP_VMLINUZ=no
458
 
                                        ;;
459
 
                                omap4)
460
 
                                        LIST="$LIST linux-omap4 x-loader-omap4-panda u-boot-linaro-omap4-panda"
461
 
                                        STRIP_VMLINUZ=no
462
 
                                        ;;
463
 
                        esac;;
464
 
        *)              echo "Unknown architecture: no kernel."; exit 1;;
465
 
    esac
466
 
 
467
 
    for x in $EXCLUDE; do
468
 
        LIST="$(without_package "$x" "$LIST")"
469
 
    done
470
 
 
471
 
    if [ "$STE" = "hardy" ]; then
472
 
        # <hack, hack, hack> use the version of ssl-cert from the release
473
 
        # pocket, because the version in -updates pulls in the large
474
 
        # openssl-blacklist package which we should never need on the
475
 
        # live CD
476
 
        cat << @@EOF > ${ROOT}etc/apt/preferences
477
 
Package: ssl-cert
478
 
Pin: version 1.0.14-0ubuntu2
479
 
Pin-Priority: 991
480
 
@@EOF
481
 
    fi
482
 
 
483
 
    # Create a good sources.list, and finish the install
484
 
    checkpoint "Configuring APT"
485
 
    echo deb $MIRROR $STE ${COMP} > ${ROOT}etc/apt/sources.list
486
 
    echo deb $MIRROR ${STE}-security ${COMP} >> ${ROOT}etc/apt/sources.list
487
 
    echo deb $MIRROR ${STE}-updates ${COMP} >> ${ROOT}etc/apt/sources.list
488
 
    if [ "$PROPOSED" = "yes" ]; then
489
 
        echo deb $MIRROR ${STE}-proposed ${COMP} >> ${ROOT}etc/apt/sources.list
490
 
    fi
491
 
    if [ -n "$PPA" ]; then
492
 
        echo deb http://$PPAMIRROR/$PPA/ubuntu ${STE} main >> ${ROOT}etc/apt/sources.list
493
 
 
494
 
        # handle PPAs named "ppa" specially; their Origin field in the Release
495
 
        # file does not end with "-ppa" for backwards compatibility
496
 
        origin="${PPA%/ppa}"
497
 
        origin="${origin/\//-}"
498
 
        touch ${ROOT}etc/apt/preferences
499
 
        cat << @@EOF >> ${ROOT}etc/apt/preferences
500
 
Package: *
501
 
Pin: release o=LP-PPA-$origin
502
 
Pin-Priority: 550
503
 
@@EOF
504
 
    fi
505
 
    if [ -n "$APT_SOURCE" ]; then
506
 
        echo deb $APT_SOURCE $STE $COMP >> ${ROOT}etc/apt/sources.list
507
 
        # allow unsigned sources, unfortunately
508
 
        mkdir -p ${ROOT}etc/apt/apt.conf.d
509
 
        echo 'APT::Get::AllowUnauthenticated "yes";' > ${ROOT}etc/apt/apt.conf.d/extra-source-allows-unauthenticated-sources
510
 
        # and add the preferences rules :(
511
 
        APT_PIN=$(echo $APT_SOURCE | sed -e's,http://,,; s,/.*,,')
512
 
        cat >> ${ROOT}etc/apt/preferences << @@EOF
513
 
Package: *
514
 
Pin: release a=$STE
515
 
Pin-Priority: 500
516
 
 
517
 
Package: *
518
 
Pin: origin $APT_PIN
519
 
Pin-Priority: 900
520
 
@@EOF
521
 
        FORCE_YES=--force-yes
522
 
    fi
523
 
 
524
 
    if [ "$FS" = "ubuntu-moblin-remix" ]; then
525
 
        chroot $ROOT apt-get update
526
 
        chroot $ROOT apt-get -y --force-yes install ubuntu-moblin-ppa-keyring
527
 
        # promote Release.gpg from APT's lists/partial/ to lists/
528
 
        chroot $ROOT apt-get update
529
 
        # workaround LP #442082
530
 
        rm -f ${ROOT}var/cache/apt/{,src}pkgcache.bin
531
 
    fi
532
 
 
533
 
    if [ "$FS" = "cloud-live" ]; then
534
 
        chroot $ROOT apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F3531FCE
535
 
        chroot $ROOT apt-get update
536
 
    fi
537
 
 
538
 
    # In addition to the ones we got from apt, trust whatever the local system
539
 
    # believes in, but put things back afterwards.
540
 
    cp ${ROOT}etc/apt/trusted.gpg ${ROOT}etc/apt/trusted.gpg.$$
541
 
    cat /etc/apt/trusted.gpg >> ${ROOT}etc/apt/trusted.gpg
542
 
 
543
 
    # update and immediately restore the trusted keyring
544
 
    chroot $ROOT apt-get update
545
 
    # we restore the keyring here because on dist-upgrade the
546
 
    # ubuntu-extras-keyring package installs additional keys
547
 
    mv ${ROOT}etc/apt/trusted.gpg.$$ ${ROOT}etc/apt/trusted.gpg
548
 
 
549
 
    checkpoint "Upgrading"
550
 
    chroot $ROOT apt-get -y $FORCE_YES --purge dist-upgrade </dev/null
551
 
    checkpoint "Installing main packages"
552
 
    chroot $ROOT apt-get -y --purge install $LIST </dev/null
553
 
 
554
 
    # launchpad likes to put dependencies of seeded packages in tasks along with the
555
 
    # actual seeded packages.  In general, this isn't an issue.  With updated kernels
556
 
    # and point-releases, though, we end up with extra header packages:
557
 
    checkpoint "Cleaning up kernel headers"
558
 
    chroot ${ROOT} dpkg -l linux-headers-2\* | grep ^i | awk '{print $2}' \
559
 
        > livecd.${FSS}.manifest-headers
560
 
    chroot ${ROOT} dpkg -l linux-headers-\* | grep ^i | awk '{print $2}' \
561
 
        > livecd.${FSS}.manifest-headers-full
562
 
    HEADERPACKAGES=`cat livecd.${FSS}.manifest-headers-full`
563
 
    HEADERMETA=""
564
 
    for i in `comm -3 livecd.${FSS}.manifest-headers livecd.${FSS}.manifest-headers-full`; do
565
 
        HEADERMETA="$HEADERMETA $i"
566
 
    done
567
 
    case $TARGETARCH in
568
 
        armel)
569
 
            HEADERMETA=linux-headers-${SUBARCH}
570
 
            ;;
571
 
    esac
572
 
    rm -f livecd.${FSS}.manifest-headers livecd.${FSS}.manifest-headers-full
573
 
    chroot ${ROOT} apt-get -y --purge remove $HEADERPACKAGES </dev/null || true
574
 
    chroot ${ROOT} apt-get -y --purge install $HEADERMETA </dev/null || true
575
 
    # End horrible linux-header launchpad workaround.  Hopefully this is temporary.
576
 
 
577
 
    chroot ${ROOT} dpkg-query -W --showformat='${Package} ${Version}\n' \
578
 
        > livecd.${FSS}.manifest-desktop
579
 
    checkpoint "Installing live packages"
580
 
    chroot $ROOT apt-get -y --purge install $LIVELIST </dev/null
581
 
    case $FS in
582
 
        edubuntu)
583
 
            chroot $ROOT apt-cache dumpavail | \
584
 
                grep-dctrl -nsPackage -FTask edubuntu-ship-addon -a \
585
 
                                      -FTask edubuntu-live | \
586
 
                sort -u | \
587
 
                xargs chroot $ROOT \
588
 
                    dpkg-query -W --showformat='${Package} ${Version}\n' \
589
 
                >> livecd.${FSS}.manifest-desktop
590
 
            ;;
591
 
    esac
592
 
    chroot ${ROOT} dpkg-query -W --showformat='${Package} ${Version}\n' \
593
 
        > livecd.${FSS}.manifest
594
 
 
595
 
    checkpoint "Cleaning up"
596
 
 
597
 
    kill_users
598
 
 
599
 
    chroot $ROOT /etc/cron.daily/mlocate || true
600
 
    chroot $ROOT /etc/cron.daily/man-db || true
601
 
 
602
 
    # remove our diversions
603
 
    for file in $DIVERTS; do
604
 
        ls -ld ${ROOT}${file} ${ROOT}${file}.livecd || true
605
 
        rm -f ${ROOT}${file}
606
 
        chroot $ROOT dpkg-divert --remove --rename /${file}
607
 
    done
608
 
 
609
 
    # remove the apt preferences hack if it was added
610
 
    rm -f ${ROOT}etc/apt/preferences
611
 
 
612
 
    # And make this look more pristine
613
 
    cat << @@EOF > ${ROOT}etc/apt/sources.list
614
 
deb ${USERMIRROR} $STE ${COMP}
615
 
deb-src ${SRCMIRROR} $STE ${COMP}
616
 
 
617
 
deb ${SECMIRROR} ${STE}-security ${COMP}
618
 
deb-src ${SECSRCMIRROR} ${STE}-security ${COMP}
619
 
 
620
 
## Major bug fix updates produced after the final release of the
621
 
## distribution.
622
 
deb ${USERMIRROR} ${STE}-updates ${COMP}
623
 
deb-src ${SRCMIRROR} ${STE}-updates ${COMP}
624
 
 
625
 
@@EOF
626
 
    if [ "$UNIVERSE" ]; then
627
 
        COMMENT=
628
 
    else
629
 
        cat << @@EOF >> ${ROOT}etc/apt/sources.list
630
 
## Uncomment the following two lines to add software from the 'universe'
631
 
## repository.
632
 
@@EOF
633
 
        COMMENT='# '
634
 
    fi
635
 
    cat << @@EOF >> ${ROOT}etc/apt/sources.list
636
 
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
637
 
## team. Also, please note that software in universe WILL NOT receive any
638
 
## review or updates from the Ubuntu security team.
639
 
${COMMENT}deb ${USERMIRROR} $STE universe
640
 
${COMMENT}deb-src ${SRCMIRROR} $STE universe
641
 
${COMMENT}deb ${USERMIRROR} ${STE}-updates universe
642
 
${COMMENT}deb-src ${SRCMIRROR} ${STE}-updates universe
643
 
${COMMENT}deb ${SECMIRROR} ${STE}-security universe
644
 
${COMMENT}deb-src ${SECSRCMIRROR} ${STE}-security universe
645
 
 
646
 
@@EOF
647
 
    if [ "$MULTIVERSE" ]; then
648
 
        COMMENT=
649
 
    else
650
 
        COMMENT='# '
651
 
    fi
652
 
    cat << @@EOF >> ${ROOT}etc/apt/sources.list
653
 
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
654
 
## team, and may not be under a free licence. Please satisfy yourself as to
655
 
## your rights to use the software. Also, please note that software in
656
 
## multiverse WILL NOT receive any review or updates from the Ubuntu
657
 
## security team.
658
 
${COMMENT}deb ${USERMIRROR} $STE multiverse
659
 
${COMMENT}deb-src ${SRCMIRROR} $STE multiverse
660
 
${COMMENT}deb ${USERMIRROR} ${STE}-updates multiverse
661
 
${COMMENT}deb-src ${SRCMIRROR} ${STE}-updates multiverse
662
 
${COMMENT}deb ${SECMIRROR} ${STE}-security multiverse
663
 
${COMMENT}deb-src ${SECSRCMIRROR} ${STE}-security multiverse
664
 
@@EOF
665
 
    if [ -n "$PPA" ]; then
666
 
    cat << @@EOF >> ${ROOT}etc/apt/sources.list
667
 
 
668
 
## The following unsupported and untrusted Personal Archives (PPAs) were used
669
 
## to create the base image of this system
670
 
deb http://$PPAMIRROR/$PPA/ubuntu ${STE} main
671
 
deb-src http://$PPAMIRROR/$PPA/ubuntu ${STE} main
672
 
@@EOF
673
 
 
674
 
        # handle PPAs named "ppa" specially; their Origin field in the Release
675
 
        # file does not end with "-ppa" for backwards compatibility
676
 
        origin="${PPA%/ppa}"
677
 
        origin="${origin/\//-}"
678
 
        touch ${ROOT}etc/apt/preferences
679
 
        cat << @@EOF >> ${ROOT}etc/apt/preferences
680
 
Explanation: This prefers the Personal Archive $PPA over the other sources
681
 
Package: *
682
 
Pin: release o=LP-PPA-$origin
683
 
Pin-Priority: 550
684
 
@@EOF
685
 
    fi
686
 
 
687
 
    # get rid of the .debs - we don't need them.
688
 
    chroot ${ROOT} apt-get clean
689
 
    rm -f ${ROOT}var/lib/apt/lists/*_*
690
 
    rm -f ${ROOT}var/spool/postfix/maildrop/*
691
 
    # Removing update-notifier notes is now considered harmful:
692
 
    #rm -f ${ROOT}var/lib/update-notifier/user.d/*
693
 
    # The D-Bus machine identifier needs to be unique, and is generated at
694
 
    # boot time if it's missing.
695
 
    rm -f ${ROOT}var/lib/dbus/machine-id
696
 
    chroot $ROOT apt-get update || true # give them fresh lists, but don't fail
697
 
    rm -f ${ROOT}etc/resolv.conf ${ROOT}etc/mailname
698
 
    if [ -f ${ROOT}/etc/postfix/main.cf ]; then
699
 
        sed -i '/^myhostname/d; /^mydestination/d; /^myorigin/d' ${ROOT}etc/postfix/main.cf
700
 
        echo set postfix/destinations | chroot ${ROOT} /usr/bin/debconf-communicate postfix
701
 
        echo set postfix/mailname | chroot ${ROOT} /usr/bin/debconf-communicate postfix
702
 
    fi
703
 
    KVERS=`chroot ${ROOT} dpkg -l linux-image-2\*|grep ^i|awk '{print $2}'|sed 's/linux-image-//'`
704
 
    for KVER in ${KVERS}; do
705
 
        SUBARCH="${KVER#*-*-}"
706
 
        chroot ${ROOT} update-initramfs -k "${KVER}" -u
707
 
        # we mv the initramfs, so it's not wasting space on the livefs
708
 
        mv ${ROOT}/boot/initrd.img-"${KVER}" livecd.${FSS}.initrd-"${SUBARCH}"
709
 
        rm -f ${ROOT}/boot/initrd.img-"${KVER}".bak
710
 
        # whether to strip vmlinuz or not to save space thanks to ubiquity
711
 
        action="cp"
712
 
        if [ "$STRIP_VMLINUZ" = "yes" ]; then
713
 
            action="mv"
714
 
        fi
715
 
        $action ${ROOT}/boot/vmlinu?-"${KVER}" livecd.${FSS}.kernel-"${SUBARCH}"
716
 
        chmod 644 livecd.${FSS}.kernel-"${SUBARCH}"
717
 
        if [ "$INITRD_COMPRESSOR" != gz ]; then
718
 
            zcat "livecd.${FSS}.initrd-${SUBARCH}" | "$INITRD_COMPRESSOR" -9c \
719
 
                > "livecd.${FSS}.initrd-${SUBARCH}.new"
720
 
            mv "livecd.${FSS}.initrd-${SUBARCH}.new" \
721
 
                "livecd.${FSS}.initrd-${SUBARCH}"
722
 
        fi
723
 
    done
724
 
    NUMKVERS="$(set -- $KVERS; echo $#)"
725
 
    if [ "$NUMKVERS" = 1 ]; then
726
 
        # only one kernel
727
 
        SUBARCH="${KVERS#*-*-}"
728
 
        ln -sf livecd.${FSS}.initrd-"${SUBARCH}" livecd.${FSS}.initrd
729
 
        ln -sf livecd.${FSS}.kernel-"${SUBARCH}" livecd.${FSS}.kernel
730
 
    fi
731
 
    case $TARGETARCH+$SUBARCH in
732
 
        powerpc+ps3)
733
 
            chroot ${ROOT} addgroup --system spu;;
734
 
    esac
735
 
 
736
 
    # No point keeping Gnome icon cache around for Kubuntu
737
 
    if [ "$FS" = "kubuntu" ] || \
738
 
       [ "$FS" = "kubuntu-active" ]; then
739
 
        rm -f ${ROOT}/usr/share/icons/*/icon-theme.cache
740
 
    fi
741
 
 
742
 
    if [ "$FS" = ubuntu-netbook ] && \
743
 
       [ "$TARGETARCH" = armel ] && \
744
 
       [ -e "$ROOT/usr/share/xsessions/unity-2d.desktop" ]; then
745
 
        chroot $ROOT /usr/lib/gdm/gdm-set-default-session unity-2d
746
 
    fi
747
 
 
748
 
    # all done with the chroot; reset the debconf frontend, so Colin doesn't cry
749
 
    echo RESET debconf/frontend | chroot $ROOT debconf-communicate
750
 
    echo FSET debconf/frontend seen true | chroot $ROOT debconf-communicate
751
 
 
752
 
    # And now that we're done messing with debconf, destroy the backup files:
753
 
    rm -f ${ROOT}/var/cache/debconf/*-old
754
 
 
755
 
    rm -f ${ROOT}/etc/dpkg/dpkg.cfg.d/livecd-rootfs
756
 
 
757
 
    # show the size of directories in /usr/share/doc
758
 
    checkpoint "Checking size of /usr/share/doc"
759
 
    echo BEGIN docdirs
760
 
    (cd $ROOT && find usr/share/doc -maxdepth 1 -type d | xargs du -s | sort -nr)
761
 
    echo END docdirs
762
 
 
763
 
    # search for duplicate files, write the summary to stdout, 
764
 
    if which fdupes >/dev/null 2>&1; then
765
 
        checkpoint "Checking for duplicate files"
766
 
        echo "first line: <total size for dupes> <different dupes> <all dupes>"
767
 
        echo "data lines: <size for dupes> <number of dupes> <file size> <filename> [<filename> ...]"
768
 
        echo BEGIN fdupes
769
 
        (cd $ROOT \
770
 
           && fdupes --recurse --noempty --sameline --size --quiet usr \
771
 
           | awk '/bytes each/ {s=$1} /^usr/ { n+=1; n2+=NF-1; sum+=s*(NF-1); print s*(NF-1), NF-1, s, $0 } END {print sum, n, n2}' \
772
 
           | sort -nr
773
 
        )
774
 
        echo END fdupes
775
 
    fi
776
 
 
777
 
    # Dirty hack to mark langpack stuff as manually installed
778
 
    perl -i -nle 'print unless /^Package: language-(pack|support)/ .. /^$/;' \
779
 
        ${ROOT}/var/lib/apt/extended_states
780
 
 
781
 
    # And run the cleanup function dead last, to umount /proc after nothing
782
 
    # else needs to be run in the chroot (umounting it earlier breaks rm):
783
 
    cleanup
784
 
 
785
 
    # Squashfs does not report unpacked disk space usage, which is explained at
786
 
    # <http://lkml.org/lkml/2006/6/16/163>.  However, we would like to cache this
787
 
    # number for partman's sufficient free space check and ubiquity's
788
 
    # installation progress calculation.
789
 
    checkpoint "Calculating total size"
790
 
    printf $(du -sx --block-size=1 ${ROOT} | cut -f1) > livecd.${FSS}.size || true
791
 
 
792
 
 
793
 
    # Build our images
794
 
    checkpoint "Building image"
795
 
    if [ "$IMAGEFORMAT" = "ext2" ] || [ "$IMAGEFORMAT" = "ext3" ]; then
796
 
        livefs_ext2
797
 
    else
798
 
        livefs_squash
799
 
    fi
800
 
 
801
 
    # Upgrade ext2->ext3 if that's what is requested
802
 
    if [ "$IMAGEFORMAT" = "ext3" ]; then
803
 
        tune2fs -j livecd.${FSS}.ext2
804
 
        mv livecd.${FSS}.ext2 livecd.${FSS}.ext3
805
 
        # temporary workaround for LP: #583317 with ext3 images
806
 
        e2fsck -fy livecd.${FSS}.ext3 || true
807
 
    fi
808
 
 
809
 
    # LTSP chroot building (only in 32bit and for Edubuntu (DVD))
810
 
    case $FS in
811
 
        edubuntu-dvd)
812
 
            if [ "$TARGETARCH" = "i386" ]; then
813
 
                checkpoint "Building LTSP chroot"
814
 
                ltsp-build-client --base $(pwd) --mirror $MIRROR --arch $TARGETARCH --dist $STE --chroot ltsp-live --late-packages ldm-edubuntu-theme,plymouth-theme-edubuntu --purge-chroot --skipimage
815
 
                mkdir -p $(pwd)/images
816
 
                mksquashfs $(pwd)/ltsp-live $(pwd)/images/ltsp-live.img -e cdrom
817
 
                rm -Rf $(pwd)/ltsp-live
818
 
                if [ -f $(pwd)/images/ltsp-live.img ]; then
819
 
                    mv $(pwd)/images/ltsp-live.img livecd.$FS-ltsp.squashfs
820
 
                    chmod 0644 livecd.$FS-ltsp.squashfs
821
 
                    rmdir --ignore-fail-on-non-empty $(pwd)/images/
822
 
                else
823
 
                    echo "LTSP: Unable to build the chroot, see above for details."
824
 
                fi
825
 
            fi
826
 
        ;;
827
 
    esac
828
 
done
829
 
 
830
 
checkpoint "Done"