From: dlezcano Date: Thu, 27 Nov 2008 22:09:56 +0000 (+0000) Subject: Added lxc-debian command X-Git-Tag: lxc_0_5_0~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6454831676f1618d2a93b67bbb07a9335808f4e5;p=thirdparty%2Flxc.git Added lxc-debian command From: Daniel Lezcano Added the script lxc-debian to the package. This command allows to debootstrap a debian minimal and configure a container to run it. Several debian can be installed by invoking the command with a different container name. Signed-off-by: Daniel Lezcano --- diff --git a/configure.in b/configure.in index be8abac7b..311f992de 100644 --- a/configure.in +++ b/configure.in @@ -68,6 +68,7 @@ AC_CONFIG_FILES([ src/lxc/lxc-ps src/lxc/lxc-ls src/lxc/lxc-netstat + src/lxc/lxc-debian src/lxc/lxc-checkconfig etc/Makefile etc/lxc-macvlan.conf diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am index a392939bb..f6e6c344a 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -46,6 +46,7 @@ bin_SCRIPTS = \ lxc-ps \ lxc-netstat \ lxc-ls \ + lxc-debian \ lxc-checkconfig bin_PROGRAMS = \ diff --git a/src/lxc/lxc-debian.in b/src/lxc/lxc-debian.in new file mode 100755 index 000000000..a55e702dd --- /dev/null +++ b/src/lxc/lxc-debian.in @@ -0,0 +1,283 @@ +#!/bin/bash +# set -ex + +NAME="debian" +CONFFILE="lxc.conf" +MNTFILE="mount.conf" +UTSNAME= +IPV4="172.20.0.21" +GATEWAY="172.20.0.1" +INTERFACES="/etc/network/interfaces" +INITTAB="/etc/inittab" +HOSTNAME="/etc/hostname" +FSTAB="/etc/fstab" +CACHE="/var/cache/lxc/debian" + +create() { + + # choose a container name, default is 'debian' + echo -n "What is the name for the container ? [$NAME] " + read _NAME_ + + if [ ! -z "$_NAME_" ]; then + NAME=$_NAME_ + fi + + # choose a hostname, default is the container name + echo -n "What hostname do you wish for this container ? [$NAME] " + read _UTSNAME_ + + if [ ! -z "$_UTSNAME_" ]; then + UTSNAME=$_UTSNAME_ + else + UTSNAME=$NAME + fi + + # choose an ipv4 address, better to choose the same network than + # your host + echo -n "What IP address do you wish for this container ? [$IPV4] " + read _IPV4_ + + if [ ! -z "$_IPV4_" ]; then + IPV4=$_IPV4_ + fi + + # choose the gateway ip address + echo -n "What is the gateway IP address ? [$GATEWAY] " + read _GATEWAY_ + + if [ ! -z "$_GATEWAY_" ]; then + GATEWAY=$_GATEWAY_ + fi + + # the rootfs name will be build with the container name + ROOTFS="./rootfs.$NAME" + + # check if the rootfs does already exist + if [ ! -e "$ROOTFS" ]; then + ( + flock -n -x 200 + + RES=$? + if [ "$RES" != "0" ]; then + echo "Cache repository is busy." + break + fi + + echo "Choose your architecture" + select ARCH in amd64 i386; do + echo "Architecture $ARCH selected" + break; + done + + # check the mini debian was not already downloaded + echo -n "Checking cache download ..." + if [ ! -e "$CACHE/rootfs-$ARCH" ]; then + + echo "not cached" + + mkdir -p "$CACHE/rootfs-$ARCH" + + # download a mini debian into a cache + echo "Downloading debian minimal ..." + debootstrap --verbose --variant=minbase --arch=$ARCH \ + --include apache,netbase,net-tools,iproute,openssh-server \ + etch $CACHE/rootfs-$ARCH http://ftp.debian.org/debian + + RESULT=$? + if [ "$RESULT" != "0" ]; then + echo "Failed to download the rootfs, aborting." + exit 1 + fi + echo "Download complete." + else + echo "Found." + fi + + # make a local copy of the minidebian + echo -n "Copying rootfs ..." + cp -a $CACHE/rootfs-$ARCH $ROOTFS && echo "Done." || exit + ) 200>/var/lock/subsys/lxc + fi + + +######################################## +# lxc configuration files +######################################## + +# lxc mount point + +cat < $MNTFILE +/dev $(pwd)/$ROOTFS/dev none bind 0 0 +/dev/pts $(pwd)/$ROOTFS/dev/pts none bind 0 0 +/etc/resolv.conf $(pwd)/$ROOTFS/etc/resolv.conf none ro,bind 0 0 +EOF + +# lxc configuration + +cat < $CONFFILE +lxc.utsname = $UTSNAME +lxc.network.type = veth +lxc.network.flags = up +lxc.network.link = br0 +lxc.network.name = eth0 +lxc.mount = $MNTFILE +lxc.rootfs = $ROOTFS +EOF + + +######################################## +# rootfs configuration files tweak +######################################## + +# inittab + +cat < $ROOTFS/$INITTAB +id:3:initdefault: +si::sysinit:/etc/init.d/rcS +l0:0:wait:/etc/init.d/rc 0 +l1:1:wait:/etc/init.d/rc 1 +l2:2:wait:/etc/init.d/rc 2 +l3:3:wait:/etc/init.d/rc 3 +l4:4:wait:/etc/init.d/rc 4 +l5:5:wait:/etc/init.d/rc 5 +l6:6:wait:/etc/init.d/rc 6 +# Normally not reached, but fallthrough in case of emergency. +z6:6:respawn:/sbin/sulogin +1:2345:respawn:/sbin/getty 38400 console +EOF + +# hostname +cat < $ROOTFS/$HOSTNAME +$UTSNAME +EOF + +# fstab + +cat < $ROOTFS/$FSTAB +tmpfs /dev/shm tmpfs defaults 0 0 +EOF + +# network + +cat < $ROOTFS/$INTERFACES +auto eth0 lo +iface eth0 inet static +address $IPV4 +netmask 255.255.255.0 +broadcast 0.0.0.0 +up route add default gw $GATEWAY +iface lo inet loopback +EOF + +# create the container object + +lxc-create -n $NAME -f $CONFFILE + +# remove the configuration files + +rm -f $CONFFILE +rm -f $MNTFILE + +echo "Done." +echo -e "\nYou can run your container with the 'lxc-start -n $NAME'\n" +} + +destroy() { + + echo -n "What is the name for the container ? [$NAME] " + read _NAME_ + + if [ ! -z "$_NAME_" ]; then + NAME=$_NAME_ + fi + + lxc-destroy -n $NAME + RETVAL=$? + if [ ! $RETVAL -eq 0 ]; then + echo "Failed to destroyed '$NAME'" + return $RETVAL; + fi + + ROOTFS="./rootfs.$NAME" + + echo -n "Shall I remove the rootfs [y/n] ? " + read + if [ "$REPLY" = "y" ]; then + rm -rf $ROOTFS + fi + + return 0 +} + +help() { + cat </var/lock/subsys/lxc +} + +if [ "$(id -u)" != "0" ]; then + echo "This script should be run as 'root'" + exit 1 +fi + +case "$1" in + create) + create;; + destroy) + destroy;; + help) + help;; + purge) + purge;; + *) + echo "Usage: $0 {create|destroy|purge|help}" + exit 1;; +esac