[lxc-devel] [PATCH] Additional logic for dealing with container shutdown / reboot

Serge Hallyn serge.hallyn at ubuntu.com
Thu Jan 2 16:08:02 UTC 2014


Quoting Michael H. Warfield (mhw at WittsEnd.com):
> Additional logic for dealing with container shutdown / reboot
> 
> Fix a problem with CentOS containers and legacy Fedora (<16) containers
> not shutting down or rebooting properly.  Copy /etc/init.d/halt to
> /etc/init.d/lxc-halt, deleting everything from the "hwclock save" and
> all after and append a force halt or reboot at the end of the new
> script, to prevent reexecing init.  Link that script in as
> S00lxc-halt in rc0.d and S00lxc-reboot in rc6.d to intercept the
> shutdown process before it gets to S01halt / S01reboot causing the hang.
> 
> Fixed some typos in the CentOS template that were introduced in the
> previous patch for hwaddr settings and missed in regression testing.
> 
> Cleaned up some instruction typos and tabs from previous patch.
> 
> Signed-off-by: Michael H. Warfield <mhw at WittsEnd.com>

It's unfortunate (especially 'the whole bottom half'), but if
it's needed it's needed...  thanks.

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

> ---
>  templates/lxc-centos.in | 40 ++++++++++++++++++++++++++++++++++------
>  templates/lxc-fedora.in | 35 +++++++++++++++++++++++++++++++++--
>  2 files changed, 67 insertions(+), 8 deletions(-)
> 
> diff --git a/templates/lxc-centos.in b/templates/lxc-centos.in
> index 5bb5349..3fbb5a9 100644
> --- a/templates/lxc-centos.in
> +++ b/templates/lxc-centos.in
> @@ -178,7 +178,35 @@ configure_centos()
>          )
>      fi
>  
> -   # configure the network using the dhcp
> +    # Deal with some dain bramage in the /etc/init.d/halt script.
> +    # Trim it and make it our own and link it in before the default
> +    # halt script so we can intercept it.  This also preventions package
> +    # updates from interferring with our interferring with it.
> +    #
> +    # There's generally not much in the halt script that useful but what's
> +    # in there from resetting the hardware clock down is generally very bad.
> +    # So we just eliminate the whole bottom half of that script in making
> +    # ourselves a copy.  That way a major update to the init scripts won't
> +    # trash what we've set up.
> +    if [ -f ${rootfs_path}/etc/init.d/halt ]
> +    then
> +        sed -e '/hwclock/,$d' \
> +            < ${rootfs_path}/etc/init.d/halt \
> +            > ${rootfs_path}/etc/init.d/lxc-halt
> +
> +        echo '$command -f' >> ${rootfs_path}/etc/init.d/lxc-halt
> +        chmod 755 ${rootfs_path}/etc/init.d/lxc-halt
> +
> +        # Link them into the rc directories...
> +        (
> +             cd ${rootfs_path}/etc/rc.d/rc0.d
> +             ln -s ../init.d/lxc-halt S00lxc-halt
> +             cd ${rootfs_path}/etc/rc.d/rc6.d
> +             ln -s ../init.d/lxc-halt S00lxc-reboot
> +        )
> +    fi
> +
> +    # configure the network using the dhcp
>      cat <<EOF > ${rootfs_path}/etc/sysconfig/network-scripts/ifcfg-eth0
>  DEVICE=eth0
>  BOOTPROTO=dhcp
> @@ -434,8 +462,8 @@ install_centos()
>  
>  create_hwaddr()
>  {
> -    echo $(dd if=/dev/urandom bs=8 count=1 2>/dev/null | md5sum
> -        | sed -e 's/\(..\)\(..\)\(..\)\(..\)\(..\).*/fe:\1:\2:\3:\4:\5/')
> +    echo $(dd if=/dev/urandom bs=8 count=1 2>/dev/null | md5sum |
> +        sed -e 's/\(..\)\(..\)\(..\)\(..\)\(..\).*/fe:\1:\2:\3:\4:\5/')
>  }
>  
>  copy_configuration()
> @@ -455,12 +483,12 @@ lxc.rootfs = $rootfs_path
>          # This should catch variable expansions from the default config...
>          if expr "${LINE}" : '.*\$' > /dev/null 2>&1
>          then
> -		LINE=$(eval "echo \"${LINE}\"")
> +                LINE=$(eval "echo \"${LINE}\"")
>          fi
>  
>          # There is a tab and a space in the regex bracket below!
>          # Seems that \s doesn't work in brackets.
> -        KEY=$(expr $LINE : '\s*\([^	 ]*\)\s*=')
> +        KEY=$(expr "${LINE}" : '\s*\([^	 ]*\)\s*=')
>  
>          if [[ "${KEY}" != "lxc.network.hwaddr" ]]
>          then
> @@ -724,7 +752,7 @@ echo "The temporary password for root is: '$root_password'
>  
>  You may want to note that password down before starting the container.
>  
> -The password set up as "expired" and will require it to be changed it at
> +The password is set up as "expired" and will require it to be changed it at
>  first login, which you should do as soon as possible.  If you lose the
>  root password or wish to change it without starting the container, you
>  can change it from the host by running the following command (which will
> diff --git a/templates/lxc-fedora.in b/templates/lxc-fedora.in
> index b0c214a..0ae394e 100644
> --- a/templates/lxc-fedora.in
> +++ b/templates/lxc-fedora.in
> @@ -147,6 +147,37 @@ configure_fedora()
>          )
>      fi
>  
> +    # Deal with some dain bramage in the /etc/init.d/halt script.
> +    # Trim it and make it our own and link it in before the default
> +    # halt script so we can intercept it.  This also preventions package
> +    # updates from interferring with our interferring with it.
> +    #
> +    # There's generally not much in the halt script that useful but what's
> +    # in there from resetting the hardware clock down is generally very bad.
> +    # So we just eliminate the whole bottom half of that script in making
> +    # ourselves a copy.  That way a major update to the init scripts won't
> +    # trash what we've set up.
> +    #
> +    # This is mostly for legacy distros since any modern systemd Fedora
> +    # release will not have this script so we won't try to intercept it.
> +    if [ -f ${rootfs_path}/etc/init.d/halt ]
> +    then
> +        sed -e '/hwclock/,$d' \
> +            < ${rootfs_path}/etc/init.d/halt \
> +            > ${rootfs_path}/etc/init.d/lxc-halt
> +
> +        echo '$command -f' >> ${rootfs_path}/etc/init.d/lxc-halt
> +        chmod 755 ${rootfs_path}/etc/init.d/lxc-halt
> +
> +        # Link them into the rc directories...
> +        (
> +             cd ${rootfs_path}/etc/rc.d/rc0.d
> +             ln -s ../init.d/lxc-halt S00lxc-halt
> +             cd ${rootfs_path}/etc/rc.d/rc6.d
> +             ln -s ../init.d/lxc-halt S00lxc-reboot
> +        )
> +    fi
> +
>      # configure the network using the dhcp
>      cat <<EOF > ${rootfs_path}/etc/sysconfig/network-scripts/ifcfg-eth0
>  DEVICE=eth0
> @@ -925,7 +956,7 @@ lxc.rootfs = $rootfs_path
>          # This should catch variable expansions from the default config...
>          if expr "${LINE}" : '.*\$' > /dev/null 2>&1
>          then
> -		LINE=$(eval "echo \"${LINE}\"")
> +                LINE=$(eval "echo \"${LINE}\"")
>          fi
>  
>          # There is a tab and a space in the regex bracket below!
> @@ -1222,7 +1253,7 @@ echo "The temporary password for root is: '$root_password'
>  
>  You may want to note that password down before starting the container.
>  
> -The password set up as "expired" and will require it to be changed it at
> +The password is set up as "expired" and will require it to be changed it at
>  first login, which you should do as soon as possible.  If you lose the
>  root password or wish to change it without starting the container, you
>  can change it from the host by running the following command (which will
> -- 
> 1.8.3.1
> 
> 
> 
> -- 
> Michael H. Warfield (AI4NB) | (770) 978-7061 |  mhw at WittsEnd.com
>    /\/\|=mhw=|\/\/          | (678) 463-0932 |  http://www.wittsend.com/mhw/
>    NIC whois: MHW9          | An optimist believes we live in the best of all
>  PGP Key: 0x674627FF        | possible worlds.  A pessimist is sure of it!
> 



> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel



More information about the lxc-devel mailing list