[Lxc-users] * fix cached rootfs update * fix rootfs path * add handling of systemd (aka >f15)

Ramez Hanna rhanna at informatiq.org
Tue Mar 6 10:07:52 UTC 2012


On Mon, Mar 5, 2012 at 10:28 PM,  <rhanna at informatiq.org> wrote:
> From: InformatiQ <rhanna at informatiq.org>
>
>
> Signed-off-by: InformatiQ <rhanna at informatiq.org>
> ---
>  templates/lxc-fedora.in |   35 +++++++++++++++++++++++++++--------
>  1 files changed, 27 insertions(+), 8 deletions(-)
>
> diff --git a/templates/lxc-fedora.in b/templates/lxc-fedora.in
> index e7f42a6..3f50895 100644
> --- a/templates/lxc-fedora.in
> +++ b/templates/lxc-fedora.in
> @@ -69,11 +69,6 @@ EOF
>  127.0.0.1 localhost $name
>  EOF
>
> -    sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.sysinit
> -    sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.d/rc.sysinit
> -    chroot ${rootfs_path} chkconfig udev-post off
> -    chroot ${rootfs_path} chkconfig network on
> -
>     dev_path="${rootfs_path}/dev"
>     rm -rf $dev_path
>     mkdir -p $dev_path
> @@ -99,6 +94,23 @@ EOF
>
>     return 0
>  }
> +configure_fedora_init()
> +{
> +    sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.sysinit
> +    sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.d/rc.sysinit
> +    chroot ${rootfs_path} chkconfig udev-post off
> +    chroot ${rootfs_path} chkconfig network on
> +}
> +
> +configure_fedora_systemd()
> +{
> +    unlink ${rootfs_path}/etc/systemd/system/default.target
> +    touch ${rootfs_path}/etc/fstab
> +    chroot ${rootfs_path} ln -s /dev/null //etc/systemd/system/udev.service
> +    chroot ${rootfs_path} ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
> +    #dependency on a device unit fails it specially that we disabled udev
> +    sed -i 's/After=dev-%i.device/After=/' ${rootfs_path}/lib/systemd/system/getty\@.service
> +}
>
>  download_fedora()
>  {
> @@ -170,7 +182,8 @@ copy_fedora()
>
>  update_fedora()
>  {
> -    chroot $cache/rootfs yum -y update
> +    YUM="yum --installroot $cache/rootfs -y --nogpgcheck"
> +    $YUM update
>  }
>
>  install_fedora()
> @@ -353,7 +366,7 @@ if [ "$(id -u)" != "0" ]; then
>  fi
>
>
> -rootfs_path=$path/$name/rootfs
> +rootfs_path=$path/rootfs
>  config_path=$default_path/$name
>  cache=$cache_base/$release
>
> @@ -362,7 +375,7 @@ revert()
>     echo "Interrupted, so cleaning up"
>     lxc-destroy -n $name
>     # maybe was interrupted before copy config
> -    rm -rf $path/$name
> +    rm -rf $path
>     rm -rf $default_path/$name
>     echo "exiting..."
>     exit 1
> @@ -388,6 +401,12 @@ if [ $? -ne 0 ]; then
>     exit 1
>  fi
>
> +type /bin/systemd >/dev/null 2>&1
> +if [ $? -ne 0 ]; then
> +    configure_fedora_init
> +else
> +    configure_fedora_systemd
> +fi
>
>  if [ ! -z $clean ]; then
>     clean || exit 1
> --
> 1.7.7.6
>

there is only problem about systemd not addressed by this script
is that it does mount /dev which stops getty from starting on tty1
so either make it start on any tty higher than what your host is using
and allow that in your lxc cgroup conf
or mount the $rootfs/dev to a different block dev that way systemd
won't mount /dev

the script below does it nicely in the case you don't have a free
block device. the script create a non persistant mount which you don't
need if you are using lvm

[rhanna at hovercraft bin]$ cat lxc-start-fedora
#! /bin/bash
options=$(getopt -o n: -l name: -- "$@")
eval set -- "$options"
while true
do
    case "$1" in
        -n|--name)  name=$2; shift 2;;
        --)         shift
                    break;;
        *)          break ;;
esac
done

if [ -z $name ]; then
    echo "container name must be set, use -n|--name"
    exit 1
fi
lxc-ls |grep $name >/dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "Container does not exist"
    exit 1
fi
lxc-info -s -n$name|grep RUNNING >/dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "container already started"
    exit 1
fi
mount |grep /tmp/lxc/$name > /dev/null 2>&1
if [ $? -eq 0 ]; then
    umount /tmp/lxc/$name
fi
rm -rf /tmp/lxc/$name
mkdir -p /tmp/lxc/$name
mount none /tmp/lxc/$name -t tmpfs
rsync -a /var/lib/lxc/$name/rootfs/dev/ /tmp/lxc/$name
mount /tmp/lxc/$name f16/rootfs/dev/ -obind
lxc-start $* -n $name



-- 
BR
RH
http://informatiq.org




More information about the lxc-users mailing list