lxc-opensuse.in revision add1d11833394aaa3a3497c2fdf548e5b14c80d4
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# template script for generating suse container for LXC
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# lxc: linux Container library
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# Daniel Lezcano <daniel.lezcano@free.fr>
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# Frederic Crozat <fcrozat@suse.com>
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# This library is free software; you can redistribute it and/or
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# modify it under the terms of the GNU Lesser General Public
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# License as published by the Free Software Foundation; either
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# version 2.1 of the License, or (at your option) any later version.
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# This library is distributed in the hope that it will be useful,
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# but WITHOUT ANY WARRANTY; without even the implied warranty of
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# Lesser General Public License for more details.
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# You should have received a copy of the GNU Lesser General Public
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# License along with this library; if not, write to the Free Software
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat # set network as static, but everything is done by LXC outside the container
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat cat <<EOF > $rootfs/etc/sysconfig/network/ifcfg-eth0
c840b37de865195a8742e219b4374d961a21d4d9Frederic CrozatSTARTMODE='auto'
c840b37de865195a8742e219b4374d961a21d4d9Frederic CrozatBOOTPROTO='static'
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat IP=$(/sbin/ip route | awk '/default/ { print $3 }')
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "default $IP - -" > $rootfs/etc/sysconfig/network/routes
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat mknod -m 600 $rootfs/dev/mapper/control c 10 60
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat mknod -m 666 $rootfs/dev/net/tun c 10 200
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat # do not use hostname from HOSTNAME variable
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatunset HOSTNAME
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat127.0.0.1 localhost $hostname
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat cat <<EOF > $rootfs/etc/sysconfig/bootloader
c840b37de865195a8742e219b4374d961a21d4d9Frederic CrozatLOADER_TYPE=none
c840b37de865195a8742e219b4374d961a21d4d9Frederic CrozatLOADER_LOCATION=none
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatid:3:initdefault:
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatsi::bootwait:/etc/init.d/boot
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatl0:0:wait:/etc/init.d/rc 0
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatl1:1:wait:/etc/init.d/rc 1
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatl2:2:wait:/etc/init.d/rc 2
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatl3:3:wait:/etc/init.d/rc 3
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatl6:6:wait:/etc/init.d/rc 6
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatls:S:wait:/etc/init.d/rc S
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat~~:S:respawn:/sbin/sulogin
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatp6::ctrlaltdel:/sbin/init 6
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatp0::powerfail:/sbin/init 0
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatcons:2345:respawn:/sbin/mingetty --noclear console screen
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatc1:2345:respawn:/sbin/mingetty --noclear tty1 screen
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# disable root fsck
c840b37de865195a8742e219b4374d961a21d4d9Frederic CrozatROOTFS_FSCK="0"
c840b37de865195a8742e219b4374d961a21d4d9Frederic CrozatROOTFS_BLKDEV="/dev/null"
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat chroot $rootfs /sbin/insserv -r -f boot.udev boot.loadmodules boot.device-mapper boot.clock boot.swap boot.klog kbd
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat if [ ! -x /usr/bin/build ]; then
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat echo "you need to install \"build\" package"
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat # check the mini opensuse was not already downloaded
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat if [ $? -ne 0 ]; then
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "Failed to create '$cache/partial-$arch' directory"
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat zypper --quiet --root $cache/partial-$arch-packages --non-interactive ar http://download.opensuse.org/distribution/$DISTRO/repo/oss/ repo-oss
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat zypper --quiet --root $cache/partial-$arch-packages --non-interactive ar http://download.opensuse.org/update/$DISTRO/ update
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat zypper --quiet --root $cache/partial-$arch-packages --non-interactive --gpg-auto-import-keys update
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat zypper --root $cache/partial-$arch-packages --non-interactive in --auto-agree-with-licenses --download-only zypper lxc patterns-openSUSE-base sysvinit-init
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat cat > $cache/partial-$arch-packages/opensuse.conf << EOF
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatPreinstall: aaa_base bash coreutils diffutils
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatPreinstall: filesystem fillup glibc grep insserv libacl1 libattr1
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatPreinstall: libbz2-1 libgcc46 libxcrypt libncurses5 pam
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatPreinstall: permissions libreadline6 rpm sed tar zlib libselinux1
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatPreinstall: liblzma5 libcap2 libpcre0
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatPreinstall: libpopt0 libelf1 liblua5_1
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatRunScripts: aaa_base
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatSupport: zypper
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatSupport: patterns-openSUSE-base
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatPrefer: sysvinit-init
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic CrozatIgnore: patterns-openSUSE-base:patterns-openSUSE-yast2_install_wf
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat CLEAN_BUILD=1 BUILD_ROOT="$cache/partial-$arch" BUILD_DIST="$cache/partial-$arch-packages/opensuse.conf" /usr/lib/build/init_buildsystem --clean --cachedir $cache/partial-$arch-cache --repository $cache/partial-$arch-packages/var/cache/zypp/packages/repo-oss/suse/$arch --repository $cache/partial-$arch-packages/var/cache/zypp/packages/repo-oss/suse/noarch
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat chroot $cache/partial-$arch /usr/bin/zypper --quiet --non-interactive ar http://download.opensuse.org/distribution/$DISTRO/repo/oss repo-oss
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat chroot $cache/partial-$arch /usr/bin/zypper --quiet --non-interactive ar http://download.opensuse.org/update/$DISTRO/ update
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat chroot $cache/partial-$arch rpm -e patterns-openSUSE-base
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat# really clean the image
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat rm -fr $cache/partial-$arch/{.build,.guessed_dist,.srcfiles*,installed-pkg}
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat# make sure we have a minimal /dev
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat mknod -m 666 $cache/partial-$arch/dev/null c 1 3
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat mknod -m 666 $cache/partial-$arch/dev/zero c 1 5
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat# create mtab symlink
44ee8a102e3d8052631fbb119f58a55ce678d039Frederic Crozat ln -sf /proc/self/mounts $cache/partial-$arch/etc/mtab
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat if [ $? -ne 0 ]; then
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "Failed to download the rootfs, aborting."
6d8ac56b658a7aa35a46580c2df060c58ef02821Serge Hallyn rsync -a $cache/rootfs-$arch/ $rootfs/ || return 1
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat if [ $? -ne 0 ]; then
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "Checking cache download in $cache/rootfs-$arch ... "
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat if [ $? -ne 0 ]; then
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "Copy $cache/rootfs-$arch to $rootfs ... "
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat if [ $? -ne 0 ]; then
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.utsname = $name
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.pts = 1024
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.rootfs = $rootfs
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.mount = $path/fstab
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.deny = a
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# /dev/null and zero
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 1:3 rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 1:5 rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 5:1 rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 5:0 rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 4:0 rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 4:1 rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat# /dev/{,u}random
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 1:9 rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 1:8 rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 136:* rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 5:2 rwm
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatlxc.cgroup.devices.allow = c 254:0 rwm
80a881b232b8955b85b360d4def99e6e680ff61bSerge Hallynproc proc proc nodev,noexec,nosuid 0 0
80a881b232b8955b85b360d4def99e6e680ff61bSerge Hallynsysfs sys sysfs defaults 0 0
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat if [ $? -ne 0 ]; then
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat if [ ! -e $cache ]; then
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat # lock, so we won't purge while someone is creating a repository
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat if [ $? != 0 ]; then
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat rm --preserve-root --one-file-system -rf $cache && echo "Done." || exit 1
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat$1 -h|--help -p|--path=<path> --clean
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatoptions=$(getopt -o hp:n:c -l help,path:,name:,clean -- "$@")
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat --) shift 1; break ;;
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "'zypper' command is missing"
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatif [ -z "$path" ]; then
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "'path' parameter is required"
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "This script should be run as 'root'"
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "failed to install opensuse"
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "failed to configure opensuse for a container"
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozat echo "failed write configuration file"
c840b37de865195a8742e219b4374d961a21d4d9Frederic Crozatif [ ! -z $clean ]; then