~serge-hallyn/ubuntu/quantal/lxc/lxc-fixapi

« back to all changes in this revision

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