~ubuntu-branches/ubuntu/quantal/lxc/quantal-201205292108

« back to all changes in this revision

Viewing changes to .pc/0021-add-dev-full-to-whitelist.patch/templates/lxc-ubuntu.in

  • Committer: Package Import Robot
  • Author(s): Serge Hallyn
  • Date: 2012-04-26 15:18:35 UTC
  • mfrom: (3.1.41 sid)
  • Revision ID: package-import@ubuntu.com-20120426151835-3vz6kb4m90gb26js
Tags: 0.8.0~rc1-4ubuntu1
* Merge from unstable.  Remaining changes:
  - control:
    - update maintainer
    - Build-Depends: add dh-apparmor and libapparmor-dev
    - lxc Depends: add bridge-utils, dnsmasq-base, iptables, rsync
    - lxc Recommends: add cgroup-lite | cgroup-bin, openssl
    - lxc Suggests: add btrfs-tools, lvm2, qemu-user-static
    - lxc Conflicts: remove (cgroup-bin)
  - Add lxc-start-ephemeral and lxc-wait to debian/local
  - apparmor:
    - add lxc.apparmor, lxc-containers.apparmor,
      lxc-default.apparmor, and new lxc.apparmor.in
  - add debian/lxc.conf (default container creation config file)
  - debian/lxc.install.in:
    * add lxc-start-ephemeral
    * add debian/lxc.conf
    * skip lxc-debconf*
    * skip lxc-ls (Use upstream's)
  - debian/lxc*.install.in: use '*', not @DEB_HOST_MULTIARCH@
  - Use our own completely different lxc.postinst and lxc.postrm
  - remove lxc.templates
  - debian/rules:
    * add DEB_DH_INSTALLINIT_ARGS = --upstart-only
    * don't do debconf stuff
    * add debian/*.apparmor.in to files processed under
      override_dh_auto_clean
    * don't comment out ubuntu or busybox templates
    * do apparmor stuff and install our own lxc-wait under override_dh_install
    * install our upstart scripts in override_dh_installinit
  - add lxc.default, lxc.lxc-net.upstart, lxc.upstart under
    debian/

* patches kept:
  - 0013-lxc-create-use-default-config.patch (needed manual rebase)
  - 0030-ubuntu-template-fail.patch
  - 0031-ubuntu-template-resolvconf.patch
  - 0044-lxc-destroy-rm-autos
  - debian/patches/0045-fix-other-templates
  - debian/patches/0046-lxc-clone-change-hwaddr
  - debian/patches/0047-bindhome-check-shell
  - debian/patches/0049-ubuntu-template-sudo-and-cleanup
  - debian/patches/0050-clone-lvm-sizes
  - debian/patches/0052-ubuntu-bind-user-conflict
  - debian/patches/0053-lxc-start-pin-rootfs
  - debian/patches/0054-ubuntu-debug
  - debian/patches/0055-ubuntu-handle-badgrp
  - debian/patches/0056-dont-watch-utmp
  - debian/patches/0057-update-manpages
  - debian/patches/0058-fixup-ubuntu-cloud
  - debian/patches/0059-reenable-daily-cloudimg
  - debian/patches/0060-lxc-shutdown
  - debian/patches/0061-lxc-start-apparmor
  - debian/patches/0062-templates-relative-paths
  - debian/patches/0063-check-apparmor-enabled
  - debian/patches/0064-apparmor-mount-proc
  - debian/patches/0065-fix-bindhome-relpath
  - debian/patches/0066-confile-typo
  - debian/patches/0067-templates-lxc-profile
  - debian/patches/0068-fix-lxc-config-layout 
  - debian/patches/0069-ubuntu-cloud-fix
  - debian/patches/0070-templates-rmdir-dev-shm
  - debian/patches/0071-ubuntu-cloud-fix-image-extraction
  - debian/patches/0072-lxc-shutdown-help
  - debian/patches/0073-lxc-destroy-waits-before-destroy
  - mark all patches which have been forwarded as such, refresh all
* 0074-lxc-execute-find-init: lxc-init had moved.  Introduce a function in
  lxc-execute to go find it.  Otherwise lxc-execute for any older releases
  will fail.
* 0075-lxc-ls-bash: lxc-ls needs bash, not sh
* add debian/lxc.apparmor.in so DEB_HOST_MULTIARCH can be expanded
* 0076-fix-sprintfs:  - check return values for all sprintfs and snprintfs
  which could overflow (LP: #988918)
* 0077-execute-without-rootfs: let lxc-execute succeed with no rootfs
  (LP: #981955)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/bin/bash
2
 
 
3
 
#
4
 
# template script for generating ubuntu container for LXC
5
 
#
6
 
# This script consolidates and extends the existing lxc ubuntu scripts
7
 
#
8
 
 
9
 
# XXX todo: add -lvm option
10
 
 
11
 
# Copyright � 2011 Serge Hallyn <serge.hallyn@canonical.com>
12
 
# Copyright � 2010 Wilhelm Meier
13
 
# Author: Wilhelm Meier <wilhelm.meier@fh-kl.de>
14
 
#
15
 
# This program is free software; you can redistribute it and/or modify
16
 
# it under the terms of the GNU General Public License version 2, as
17
 
# published by the Free Software Foundation.
18
 
 
19
 
# This program is distributed in the hope that it will be useful,
20
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
21
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22
 
# GNU General Public License for more details.
23
 
 
24
 
# You should have received a copy of the GNU General Public License along
25
 
# with this program; if not, write to the Free Software Foundation, Inc.,
26
 
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27
 
#
28
 
 
29
 
if [ -r /etc/default/lxc ]; then
30
 
    . /etc/default/lxc
31
 
fi
32
 
 
33
 
configure_ubuntu()
34
 
{
35
 
    rootfs=$1
36
 
    hostname=$2
37
 
 
38
 
   # configure the network using the dhcp
39
 
    cat <<EOF > $rootfs/etc/network/interfaces
40
 
auto lo
41
 
iface lo inet loopback
42
 
 
43
 
auto eth0
44
 
iface eth0 inet dhcp
45
 
EOF
46
 
 
47
 
    # so you can 'ssh $hostname.' or 'ssh $hostname.local'
48
 
    if [ -f $rootfs/etc/dhcp/dhclient.conf ]; then
49
 
        sed -i "s/<hostname>/$hostname/" $rootfs/etc/dhcp/dhclient.conf
50
 
    elif [ -f $rootfs/etc/dhcp3/dhclient.conf ]; then
51
 
        sed -i "s/<hostname>/$hostname/" $rootfs/etc/dhcp3/dhclient.conf
52
 
    fi
53
 
 
54
 
    # set the hostname
55
 
    cat <<EOF > $rootfs/etc/hostname
56
 
$hostname
57
 
EOF
58
 
    # set minimal hosts
59
 
    cat <<EOF > $rootfs/etc/hosts
60
 
127.0.0.1 localhost $hostname
61
 
EOF
62
 
 
63
 
    # suppress log level output for udev
64
 
    sed -i "s/=\"err\"/=0/" $rootfs/etc/udev/udev.conf
65
 
 
66
 
    # remove jobs for consoles 5 and 6 since we only create 4 consoles in
67
 
    # this template
68
 
    rm -f $rootfs/etc/init/tty{5,6}.conf
69
 
 
70
 
    echo "Please change root-password !"
71
 
    echo "root:root" | chroot $rootfs chpasswd
72
 
 
73
 
    return 0
74
 
}
75
 
 
76
 
download_ubuntu()
77
 
{
78
 
    cache=$1
79
 
    arch=$2
80
 
    release=$3
81
 
 
82
 
    if [ $release = "lucid" ]; then
83
 
        packages=dialog,apt,apt-utils,resolvconf,iproute,inetutils-ping,vim,dhcp3-client,ssh,lsb-release,gnupg
84
 
    elif [ $release = "maverick" ]; then
85
 
        packages=dialog,apt,apt-utils,resolvconf,iproute,inetutils-ping,vim,dhcp3-client,ssh,lsb-release,gnupg,netbase
86
 
    elif [ $release = "natty" ]; then
87
 
        packages=dialog,apt,apt-utils,resolvconf,iproute,inetutils-ping,vim,isc-dhcp-client,isc-dhcp-common,ssh,lsb-release,gnupg,netbase
88
 
    else
89
 
        packages=dialog,apt,apt-utils,iproute,inetutils-ping,vim,isc-dhcp-client,isc-dhcp-common,ssh,lsb-release,gnupg,netbase,ubuntu-keyring
90
 
    fi
91
 
    echo "installing packages: $packages"
92
 
 
93
 
    # check the mini ubuntu was not already downloaded
94
 
    mkdir -p "$cache/partial-$arch"
95
 
    if [ $? -ne 0 ]; then
96
 
        echo "Failed to create '$cache/partial-$arch' directory"
97
 
        return 1
98
 
    fi
99
 
 
100
 
    # download a mini ubuntu into a cache
101
 
    echo "Downloading ubuntu $release minimal ..."
102
 
    debootstrap --verbose --components=main,universe --arch=$arch --include=$packages $release $cache/partial-$arch $MIRROR
103
 
    if [ $? -ne 0 ]; then
104
 
        echo "Failed to download the rootfs, aborting."
105
 
            return 1
106
 
    fi
107
 
 
108
 
    # Serge isn't sure whether we should avoid doing this when
109
 
    # $release == `distro-info -d`
110
 
    echo "Installing updates"
111
 
    case $arch in
112
 
      amd64|i386)
113
 
            MIRROR=${MIRROR:-http://archive.ubuntu.com/ubuntu}
114
 
            SECURITY_MIRROR=${SECURITY_MIRROR:-http://security.ubuntu.com/ubuntu}
115
 
            ;;
116
 
      sparc)
117
 
            case $SUITE in
118
 
              gutsy)
119
 
            MIRROR=${MIRROR:-http://archive.ubuntu.com/ubuntu}
120
 
            SECURITY_MIRROR=${SECURITY_MIRRORMIRROR:-http://security.ubuntu.com/ubuntu}
121
 
            ;;
122
 
              *)
123
 
            MIRROR=${MIRROR:-http://ports.ubuntu.com/ubuntu-ports}
124
 
            SECURITY_MIRROR=${SECURITY_MIRROR:-http://ports.ubuntu.com/ubuntu-ports}
125
 
            ;;
126
 
            esac
127
 
            ;;
128
 
      *)
129
 
            MIRROR=${MIRROR:-http://ports.ubuntu.com/ubuntu-ports}
130
 
            SECURITY_MIRROR=${SECURITY_MIRROR:-http://ports.ubuntu.com/ubuntu-ports}
131
 
            ;;
132
 
    esac
133
 
    cat >> "$1/partial-${arch}/etc/apt/sources.list" << EOF
134
 
deb $MIRROR ${release}-updates main universe
135
 
deb $SECURITY_MIRROR ${release}-security main universe
136
 
EOF
137
 
    chroot "$1/partial-${arch}" apt-get update
138
 
    if [ $? -ne 0 ]; then
139
 
        echo "Failed to update the apt cache"
140
 
        return 1
141
 
    fi
142
 
    cat > "$1/partial-${arch}"/usr/sbin/policy-rc.d << EOF
143
 
#!/bin/sh
144
 
exit 101
145
 
EOF
146
 
    chmod +x "$1/partial-${arch}"/usr/sbin/policy-rc.d
147
 
 
148
 
    lxc-unshare -s MOUNT -- chroot "$1/partial-${arch}" apt-get dist-upgrade -y
149
 
    ret=$?
150
 
    rm -f "$1/partial-${arch}"/usr/sbin/policy-rc.d
151
 
 
152
 
    if [ $ret -ne 0 ]; then
153
 
        echo "Failed to upgrade the cache"
154
 
        return 1
155
 
    fi
156
 
 
157
 
    mv "$1/partial-$arch" "$1/rootfs-$arch"
158
 
    echo "Download complete"
159
 
    return 0
160
 
}
161
 
 
162
 
copy_ubuntu()
163
 
{
164
 
    cache=$1
165
 
    arch=$2
166
 
    rootfs=$3
167
 
 
168
 
    # make a local copy of the miniubuntu
169
 
    echo -n "Copying rootfs to $rootfs ..."
170
 
    cp -a $cache/rootfs-$arch $rootfs || return 1
171
 
    return 0
172
 
}
173
 
 
174
 
install_ubuntu()
175
 
{
176
 
    rootfs=$1
177
 
    release=$2
178
 
    cache="/var/cache/lxc/$release"
179
 
    mkdir -p /var/lock/subsys/
180
 
    (
181
 
        flock -n -x 200
182
 
        if [ $? -ne 0 ]; then
183
 
            echo "Cache repository is busy."
184
 
            return 1
185
 
        fi
186
 
 
187
 
 
188
 
        echo "Checking cache download in $cache/rootfs-$arch ... "
189
 
        if [ ! -e "$cache/rootfs-$arch" ]; then
190
 
            download_ubuntu $cache $arch $release
191
 
            if [ $? -ne 0 ]; then
192
 
                echo "Failed to download 'ubuntu $release base'"
193
 
                return 1
194
 
            fi
195
 
        fi
196
 
 
197
 
        echo "Copy $cache/rootfs-$arch to $rootfs ... "
198
 
        copy_ubuntu $cache $arch $rootfs
199
 
        if [ $? -ne 0 ]; then
200
 
            echo "Failed to copy rootfs"
201
 
            return 1
202
 
        fi
203
 
 
204
 
        return 0
205
 
 
206
 
        ) 200>/var/lock/subsys/lxc
207
 
 
208
 
    return $?
209
 
}
210
 
 
211
 
copy_configuration()
212
 
{
213
 
    path=$1
214
 
    rootfs=$2
215
 
    name=$3
216
 
    arch=$4
217
 
 
218
 
    if [ $arch = "i386" ]; then
219
 
        arch="i686"
220
 
    fi
221
 
 
222
 
    cat <<EOF >> $path/config
223
 
lxc.utsname = $name
224
 
 
225
 
lxc.tty = 4
226
 
lxc.pts = 1024
227
 
lxc.rootfs = $rootfs
228
 
lxc.mount  = $path/fstab
229
 
lxc.arch = $arch
230
 
lxc.cap.drop = sys_module mac_admin
231
 
 
232
 
lxc.cgroup.devices.deny = a
233
 
# Allow any mknod (but not using the node)
234
 
lxc.cgroup.devices.allow = c *:* m
235
 
lxc.cgroup.devices.allow = b *:* m
236
 
# /dev/null and zero
237
 
lxc.cgroup.devices.allow = c 1:3 rwm
238
 
lxc.cgroup.devices.allow = c 1:5 rwm
239
 
# consoles
240
 
lxc.cgroup.devices.allow = c 5:1 rwm
241
 
lxc.cgroup.devices.allow = c 5:0 rwm
242
 
#lxc.cgroup.devices.allow = c 4:0 rwm
243
 
#lxc.cgroup.devices.allow = c 4:1 rwm
244
 
# /dev/{,u}random
245
 
lxc.cgroup.devices.allow = c 1:9 rwm
246
 
lxc.cgroup.devices.allow = c 1:8 rwm
247
 
lxc.cgroup.devices.allow = c 136:* rwm
248
 
lxc.cgroup.devices.allow = c 5:2 rwm
249
 
# rtc
250
 
lxc.cgroup.devices.allow = c 254:0 rwm
251
 
#fuse
252
 
lxc.cgroup.devices.allow = c 10:229 rwm
253
 
#tun
254
 
lxc.cgroup.devices.allow = c 10:200 rwm
255
 
EOF
256
 
 
257
 
    cat <<EOF > $path/fstab
258
 
proc            $rootfs/proc         proc    nodev,noexec,nosuid 0 0
259
 
sysfs           $rootfs/sys          sysfs defaults  0 0
260
 
EOF
261
 
 
262
 
    if [ $? -ne 0 ]; then
263
 
        echo "Failed to add configuration"
264
 
        return 1
265
 
    fi
266
 
 
267
 
    return 0
268
 
}
269
 
 
270
 
trim()
271
 
{
272
 
    rootfs=$1
273
 
    release=$2
274
 
 
275
 
    # provide the lxc service
276
 
    cat <<EOF > $rootfs/etc/init/lxc.conf
277
 
# fake some events needed for correct startup other services
278
 
 
279
 
description     "Container Upstart"
280
 
 
281
 
start on startup
282
 
 
283
 
script
284
 
        rm -rf /var/run/*.pid
285
 
        rm -rf /var/run/network/*
286
 
        /sbin/initctl emit stopped JOB=udevtrigger --no-wait
287
 
        /sbin/initctl emit started JOB=udev --no-wait
288
 
end script
289
 
EOF
290
 
 
291
 
    # fix buggus runlevel with sshd
292
 
    cat <<EOF > $rootfs/etc/init/ssh.conf
293
 
# ssh - OpenBSD Secure Shell server
294
 
#
295
 
# The OpenSSH server provides secure shell access to the system.
296
 
 
297
 
description     "OpenSSH server"
298
 
 
299
 
start on filesystem
300
 
stop on runlevel [!2345]
301
 
 
302
 
expect fork
303
 
respawn
304
 
respawn limit 10 5
305
 
umask 022
306
 
# replaces SSHD_OOM_ADJUST in /etc/default/ssh
307
 
oom never
308
 
 
309
 
pre-start script
310
 
    test -x /usr/sbin/sshd || { stop; exit 0; }
311
 
    test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }
312
 
    test -c /dev/null || { stop; exit 0; }
313
 
 
314
 
    mkdir -p -m0755 /var/run/sshd
315
 
end script
316
 
 
317
 
# if you used to set SSHD_OPTS in /etc/default/ssh, you can change the
318
 
# 'exec' line here instead
319
 
exec /usr/sbin/sshd
320
 
EOF
321
 
 
322
 
    cat <<EOF > $rootfs/etc/init/console.conf
323
 
# console - getty
324
 
#
325
 
# This service maintains a console on tty1 from the point the system is
326
 
# started until it is shut down again.
327
 
 
328
 
start on stopped rc RUNLEVEL=[2345]
329
 
stop on runlevel [!2345]
330
 
 
331
 
respawn
332
 
exec /sbin/getty -8 38400 /dev/console
333
 
EOF
334
 
 
335
 
    cat <<EOF > $rootfs/lib/init/fstab
336
 
# /lib/init/fstab: cleared out for bare-bones lxc
337
 
EOF
338
 
 
339
 
    # reconfigure some services
340
 
    if [ -z "$LANG" ]; then
341
 
        chroot $rootfs locale-gen en_US.UTF-8
342
 
        chroot $rootfs update-locale LANG=en_US.UTF-8
343
 
    else
344
 
        chroot $rootfs locale-gen $LANG
345
 
        chroot $rootfs update-locale LANG=$LANG
346
 
    fi
347
 
 
348
 
    # remove pointless services in a container
349
 
    chroot $rootfs /usr/sbin/update-rc.d -f ondemand remove
350
 
 
351
 
    chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls u*.conf); do mv $f $f.orig; done'
352
 
    chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls tty[2-9].conf); do mv $f $f.orig; done'
353
 
    chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls plymouth*.conf); do mv $f $f.orig; done'
354
 
    chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls hwclock*.conf); do mv $f $f.orig; done'
355
 
    chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls module*.conf); do mv $f $f.orig; done'
356
 
 
357
 
    # if this isn't lucid, then we need to twiddle the network upstart bits :(
358
 
    if [ $release != "lucid" ]; then
359
 
        sed -i 's/^.*emission handled.*$/echo Emitting lo/' $rootfs/etc/network/if-up.d/upstart
360
 
    fi
361
 
}
362
 
 
363
 
post_process()
364
 
{
365
 
    rootfs=$1
366
 
    release=$2
367
 
    trim_container=$3
368
 
 
369
 
    if [ $trim_container -eq 1 ]; then
370
 
        trim $rootfs $release
371
 
    else
372
 
        # for lucid and maverick, if not trimming, then add the ubuntu-virt
373
 
        # ppa and install lxcguest
374
 
        if [ $release = "lucid" -o $release = "maverick" ]; then
375
 
            chroot $rootfs apt-get install --force-yes -y python-software-properties
376
 
            chroot $rootfs add-apt-repository ppa:ubuntu-virt/ppa
377
 
        fi
378
 
        cp /etc/resolv.conf "${rootfs}/etc"
379
 
        chroot $rootfs apt-get update
380
 
        chroot $rootfs apt-get install --force-yes -y lxcguest
381
 
    fi
382
 
}
383
 
 
384
 
do_bindhome()
385
 
{
386
 
    rootfs=$1
387
 
    user=$2
388
 
 
389
 
    # copy /etc/passwd, /etc/shadow, and /etc/group entries into container
390
 
    pwd=`getent passwd $user`
391
 
    if [ $? -ne 0 ]; then
392
 
        echo 'Warning: failed to copy password entry for $user'
393
 
        return
394
 
    else
395
 
        echo $pwd >> $rootfs/etc/passwd
396
 
    fi
397
 
    shad=`getent shadow $user`
398
 
    echo $shad >> $rootfs/etc/shadow
399
 
 
400
 
    # bind-mount the user's path into the container's /home
401
 
    h=`getent passwd $user | cut -d: -f 6`
402
 
    mkdir -p $rootfs/$h
403
 
    echo "$h $rootfs/$h none bind 0 0" >> $path/fstab
404
 
}
405
 
 
406
 
clean()
407
 
{
408
 
    release=$1
409
 
    cache="/var/cache/lxc/$release"
410
 
 
411
 
    if [ ! -e $cache ]; then
412
 
        exit 0
413
 
    fi
414
 
 
415
 
    # lock, so we won't purge while someone is creating a repository
416
 
    (
417
 
        flock -n -x 200
418
 
        if [ $? != 0 ]; then
419
 
            echo "Cache repository is busy."
420
 
            exit 1
421
 
        fi
422
 
 
423
 
        echo -n "Purging the download cache..."
424
 
        rm --preserve-root --one-file-system -rf $cache && echo "Done." || exit 1
425
 
        exit 0
426
 
 
427
 
    ) 200>/var/lock/subsys/lxc
428
 
}
429
 
 
430
 
usage()
431
 
{
432
 
    cat <<EOF
433
 
$1 -h|--help -p|--path=<path> --clean [-a|--arch] [-b|--bindhome <user>] [--trim] [-r|--release]
434
 
release: lucid | maverick | natty | oneiric | precise
435
 
trim: make a minimal (faster, but not upgrade-safe) container
436
 
bindhome: bind <user>'s home into the container
437
 
arch: amd64 or i386: defaults to host arch
438
 
EOF
439
 
    return 0
440
 
}
441
 
 
442
 
options=$(getopt -o a:b:hp:r:xn:c -l arch:,bindhome:,help,path:,release:,trim,name:,clean -- "$@")
443
 
if [ $? -ne 0 ]; then
444
 
    usage $(basename $0)
445
 
    exit 1
446
 
fi
447
 
eval set -- "$options"
448
 
 
449
 
release=lucid
450
 
if [ -f /etc/lsb-release ]; then
451
 
    . /etc/lsb-release
452
 
    case "$DISTRIB_CODENAME" in
453
 
        lucid|maverick|natty|oneiric|precise)
454
 
            release=$DISTRIB_CODENAME
455
 
        ;;
456
 
    esac
457
 
fi
458
 
 
459
 
bindhome=
460
 
arch=$(arch)
461
 
 
462
 
# Code taken from debootstrap
463
 
if [ -x /usr/bin/dpkg ] && /usr/bin/dpkg --print-architecture >/dev/null 2>&1; then
464
 
    arch=`/usr/bin/dpkg --print-architecture`
465
 
elif type udpkg >/dev/null 2>&1 && udpkg --print-architecture >/dev/null 2>&1; then
466
 
    arch=`/usr/bin/udpkg --print-architecture`
467
 
else
468
 
    arch=$(arch)
469
 
    if [ "$arch" = "i686" ]; then
470
 
        arch="i386"
471
 
    elif [ "$arch" = "x86_64" ]; then
472
 
        arch="amd64"
473
 
    elif [ "$arch" = "armv7l" ]; then
474
 
        arch="armel"
475
 
    fi
476
 
fi
477
 
 
478
 
trim_container=0
479
 
hostarch=$arch
480
 
while true
481
 
do
482
 
    case "$1" in
483
 
    -h|--help)      usage $0 && exit 0;;
484
 
    -p|--path)      path=$2; shift 2;;
485
 
    -n|--name)      name=$2; shift 2;;
486
 
    -c|--clean)     clean=$2; shift 2;;
487
 
    -r|--release)   release=$2; shift 2;;
488
 
    -b|--bindhome)  bindhome=$2; shift 2;;
489
 
    -a|--arch)      arch=$2; shift 2;;
490
 
    -x|--trim)      trim_container=1; shift 1;;
491
 
    --)             shift 1; break ;;
492
 
        *)              break ;;
493
 
    esac
494
 
done
495
 
 
496
 
pwd=`getent passwd $bindhome`
497
 
if [ $? -ne 0 ]; then
498
 
    echo "Error: no password entry found for $bindhome"
499
 
    exit 1
500
 
fi
501
 
 
502
 
 
503
 
if [ "$arch" == "i686" ]; then
504
 
    arch=i386
505
 
fi
506
 
 
507
 
if [ ! -z "$clean" -a -z "$path" ]; then
508
 
    clean || exit 1
509
 
    exit 0
510
 
fi
511
 
 
512
 
if [ $hostarch = "i386" -a $arch = "amd64" ]; then
513
 
    echo "can't create amd64 container on i386"
514
 
    exit 1
515
 
fi
516
 
 
517
 
type debootstrap
518
 
if [ $? -ne 0 ]; then
519
 
    echo "'debootstrap' command is missing"
520
 
    exit 1
521
 
fi
522
 
 
523
 
if [ -z "$path" ]; then
524
 
    echo "'path' parameter is required"
525
 
    exit 1
526
 
fi
527
 
 
528
 
if [ "$(id -u)" != "0" ]; then
529
 
    echo "This script should be run as 'root'"
530
 
    exit 1
531
 
fi
532
 
 
533
 
rootfs=$path/rootfs
534
 
 
535
 
install_ubuntu $rootfs $release
536
 
if [ $? -ne 0 ]; then
537
 
    echo "failed to install ubuntu $release"
538
 
    exit 1
539
 
fi
540
 
 
541
 
configure_ubuntu $rootfs $name
542
 
if [ $? -ne 0 ]; then
543
 
    echo "failed to configure ubuntu $release for a container"
544
 
    exit 1
545
 
fi
546
 
 
547
 
copy_configuration $path $rootfs $name $arch
548
 
if [ $? -ne 0 ]; then
549
 
    echo "failed write configuration file"
550
 
    exit 1
551
 
fi
552
 
 
553
 
post_process $rootfs $release $trim_container
554
 
if [ ! -z $bindhome ]; then
555
 
        do_bindhome $rootfs $bindhome
556
 
fi
557
 
 
558
 
if [ ! -z $clean ]; then
559
 
    clean $release || exit 1
560
 
    exit 0
561
 
fi