lxc-centos.in revision d510d5224b0ddfc831c85ec3bca944f949ebd84f
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#!/bin/bash
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# template script for generating centos container for LXC
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# lxc: linux Container library
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Authors:
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Daniel Lezcano <daniel.lezcano@free.fr>
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Ramez Hanna <rhanna@informatiq.org>
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Fajar A. Nugraha <github@fajar.net>
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Michael H. Warfield <mhw@WittsEnd.com>
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# This library is free software; you can redistribute it and/or
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# modify it under the terms of the GNU Lesser General Public
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# License as published by the Free Software Foundation; either
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# version 2.1 of the License, or (at your option) any later version.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# This library is distributed in the hope that it will be useful,
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# but WITHOUT ANY WARRANTY; without even the implied warranty of
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Lesser General Public License for more details.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# You should have received a copy of the GNU Lesser General Public
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# License along with this library; if not, write to the Free Software
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#Configurations
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfielddefault_path=@LXCPATH@
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Some combinations of the tuning knobs below do not exactly make sense.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# but that's ok.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# If the "root_password" is non-blank, use it, else set a default.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# This can be passed to the script as an environment variable and is
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# set by a shell conditional assignment. Looks weird but it is what it is.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# If the root password contains a ding ($) then try to expand it.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# That will pick up things like ${name} and ${RANDOM}.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# If the root password contains more than 3 consecutive X's, pass it as
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# a template to mktemp and take the result.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# If root_display_password = yes, display the temporary root password at exit.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# If root_store_password = yes, store it in the configuration directory
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# If root_prompt_password = yes, invoke "passwd" to force the user to change
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# the root password after the container is created.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# If root_expire_password = yes, you will be prompted to change the root
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# password at the first login.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# These are conditional assignments... The can be overridden from the
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# preexisting environment variables...
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Make sure this is in single quotes to defer expansion to later!
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# :{root_password='Root-${name}-${RANDOM}'}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield: ${root_password='Root-${name}-XXXXXX'}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Now, it doesn't make much sense to display, store, and force change
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# together. But, we gotta test, right???
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield: ${root_display_password='no'}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield: ${root_store_password='yes'}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Prompting for something interactive has potential for mayhem
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# with users running under the API... Don't default to "yes"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield: ${root_prompt_password='no'}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Expire root password? Default to yes, but can be overridden from
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# the environment variable
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield: ${root_expire_password='yes'}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# These are only going into comments in the resulting config...
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldlxc_network_type=veth
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldlxc_network_link=lxcbr0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# is this centos?
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Alow for weird remixes like the Raspberry Pi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Use the Mitre standard CPE identifier for the release ID if possible...
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# This may be in /etc/os-release or /etc/system-release-cpe. We
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# should be able to use EITHER. Give preference to /etc/os-release for now.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Detect use under userns (unsupported)
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldfor arg in "$@"; do
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield [ "$arg" = "--" ] && break
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ "$arg" = "--mapped-uid" -o "$arg" = "--mapped-gid" ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "This template can't be used for unprivileged containers." 1>&2
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "You may want to try the \"download\" template instead." 1>&2
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield exit 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfielddone
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# Make sure the usual locations are in PATH
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldexport PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldif [ -e /etc/os-release ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldthen
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# This is a shell friendly configuration file. We can just source it.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# What we're looking for in here is the ID, VERSION_ID and the CPE_NAME
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield . /etc/os-release
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Host CPE ID from /etc/os-release: ${CPE_NAME}"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldfi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldif [ "${CPE_NAME}" = "" -a -e /etc/system-release-cpe ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldthen
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield CPE_NAME=$(head -n1 /etc/system-release-cpe)
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield CPE_URI=$(expr ${CPE_NAME} : '\([^:]*:[^:]*\)')
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ "${CPE_URI}" != "cpe:/o" ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield CPE_NAME=
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield else
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Probably a better way to do this but sill remain posix
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # compatible but this works, shrug...
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Must be nice and not introduce convenient bashisms here.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield #
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # According to the official registration at Mitre and NIST,
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # this should have been something like this for CentOS:
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # cpe:/o:centos:centos:6
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # or this:
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # cpe:/o:centos:centos:6.5
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield #
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ID=$(expr ${CPE_NAME} : '[^:]*:[^:]*:[^:]*:\([^:]*\)')
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # The "enterprise_linux" is a bone toss back to RHEL.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Since CentOS and RHEL are so tightly coupled, we'll
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # take the RHEL version if we're running on it and do the
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # equivalent version for CentOS.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ ${ID} = "linux" -o ${ID} = "enterprise_linux" ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Instead we got this: cpe:/o:centos:linux:6
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ID=$(expr ${CPE_NAME} : '[^:]*:[^:]*:\([^:]*\)')
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield VERSION_ID=$(expr ${CPE_NAME} : '[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\)')
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Host CPE ID from /etc/system-release-cpe: ${CPE_NAME}"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldfi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldif [ "${CPE_NAME}" != "" -a "${ID}" = "centos" -a "${VERSION_ID}" != "" ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldthen
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield centos_host_ver=${VERSION_ID}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield is_centos=true
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldelif [ "${CPE_NAME}" != "" -a "${ID}" = "redhat" -a "${VERSION_ID}" != "" ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldthen
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield redhat_host_ver=${VERSION_ID}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield is_redhat=true
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldelif [ -e /etc/centos-release ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldthen
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Only if all other methods fail, try to parse the redhat-release file.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield centos_host_ver=$( sed -e '/^CentOS /!d' -e 's/CentOS.*\srelease\s*\([0-9][0-9.]*\)\s.*/\1/' < /etc/centos-release )
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ "$centos_host_ver" != "" ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield is_centos=true
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldfi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldforce_mknod()
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield{
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # delete a device node if exists, and create a new one
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rm -f $2 && mknod -m $1 $2 $3 $4 $5
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldconfigure_centos()
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield{
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # disable selinux in centos
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $rootfs_path/selinux
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo 0 > $rootfs_path/selinux/enforce
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Also kill it in the /etc/selinux/config file if it's there...
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -f $rootfs_path/etc/selinux/config ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i '/^SELINUX=/s/.*/SELINUX=disabled/' $rootfs_path/etc/selinux/config
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Nice catch from Dwight Engen in the Oracle template.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Wantonly plagerized here with much appreciation.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -f $rootfs_path/usr/sbin/selinuxenabled ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv $rootfs_path/usr/sbin/selinuxenabled $rootfs_path/usr/sbin/selinuxenabled.lxcorig
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ln -s /bin/false $rootfs_path/usr/sbin/selinuxenabled
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # This is a known problem and documented in RedHat bugzilla as relating
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # to a problem with auditing enabled. This prevents an error in
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # the container "Cannot make/remove an entry for the specified session"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i '/^session.*pam_loginuid.so/s/^session/# session/' ${rootfs_path}/etc/pam.d/login
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i '/^session.*pam_loginuid.so/s/^session/# session/' ${rootfs_path}/etc/pam.d/sshd
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -f ${rootfs_path}/etc/pam.d/crond ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i '/^session.*pam_loginuid.so/s/^session/# session/' ${rootfs_path}/etc/pam.d/crond
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # In addition to disabling pam_loginuid in the above config files
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # we'll also disable it by linking it to pam_permit to catch any
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # we missed or any that get installed after the container is built.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield #
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Catch either or both 32 and 64 bit archs.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -f ${rootfs_path}/lib/security/pam_loginuid.so ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ( cd ${rootfs_path}/lib/security/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv pam_loginuid.so pam_loginuid.so.disabled
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ln -s pam_permit.so pam_loginuid.so
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield )
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -f ${rootfs_path}/lib64/security/pam_loginuid.so ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ( cd ${rootfs_path}/lib64/security/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv pam_loginuid.so pam_loginuid.so.disabled
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ln -s pam_permit.so pam_loginuid.so
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield )
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Set default localtime to the host localtime if not set...
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -e /etc/localtime -a ! -e ${rootfs_path}/etc/localtime ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # if /etc/localtime is a symlink, this should preserve it.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cp -a /etc/localtime ${rootfs_path}/etc/localtime
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Deal with some dain bramage in the /etc/init.d/halt script.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Trim it and make it our own and link it in before the default
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # halt script so we can intercept it. This also preventions package
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # updates from interferring with our interferring with it.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield #
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # There's generally not much in the halt script that useful but what's
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # in there from resetting the hardware clock down is generally very bad.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # So we just eliminate the whole bottom half of that script in making
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # ourselves a copy. That way a major update to the init scripts won't
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # trash what we've set up.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -f ${rootfs_path}/etc/init.d/halt ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -e '/hwclock/,$d' \
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield < ${rootfs_path}/etc/init.d/halt \
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield > ${rootfs_path}/etc/init.d/lxc-halt
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo '$command -f' >> ${rootfs_path}/etc/init.d/lxc-halt
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield chmod 755 ${rootfs_path}/etc/init.d/lxc-halt
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Link them into the rc directories...
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield (
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cd ${rootfs_path}/etc/rc.d/rc0.d
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ln -s ../init.d/lxc-halt S00lxc-halt
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cd ${rootfs_path}/etc/rc.d/rc6.d
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ln -s ../init.d/lxc-halt S00lxc-reboot
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield )
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # configure the network using the dhcp
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cat <<EOF > ${rootfs_path}/etc/sysconfig/network-scripts/ifcfg-eth0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldDEVICE=eth0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldBOOTPROTO=dhcp
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldONBOOT=yes
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldHOSTNAME=${UTSNAME}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldNM_CONTROLLED=no
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldTYPE=Ethernet
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldMTU=${MTU}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldDHCP_HOSTNAME=\`hostname\`
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldEOF
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # set the hostname
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cat <<EOF > ${rootfs_path}/etc/sysconfig/network
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldNETWORKING=yes
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldHOSTNAME=${UTSNAME}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldEOF
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # set minimal hosts
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cat <<EOF > $rootfs_path/etc/hosts
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield127.0.0.1 localhost $name
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldEOF
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # set minimal fstab
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cat <<EOF > $rootfs_path/etc/fstab
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield/dev/root / rootfs defaults 0 0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldEOF
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # create lxc compatibility init script
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ "$release" = "6" ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cat <<EOF > $rootfs_path/etc/init/lxc-sysinit.conf
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldstart on startup
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldenv container
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldpre-start script
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ "x\$container" != "xlxc" -a "x\$container" != "xlibvirt" ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield stop;
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rm -f /var/lock/subsys/*
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rm -f /var/run/*.pid
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield [ -e /etc/mtab ] || ln -s /proc/mounts /etc/mtab
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p /dev/shm
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mount -t tmpfs -o nosuid,nodev tmpfs /dev/shm
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield initctl start tty TTY=console
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield telinit 3
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield exit 0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldend script
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldEOF
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield elif [ "$release" = "5" ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cat <<EOF > $rootfs_path/etc/rc.d/lxc.sysinit
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#! /bin/bash
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldrm -f /etc/mtab /var/run/*.{pid,lock} /var/lock/subsys/*
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldrm -rf {/,/var}/tmp/*
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldecho "/dev/root / rootfs defaults 0 0" > /etc/mtab
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldexit 0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldEOF
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield chmod 755 $rootfs_path/etc/rc.d/lxc.sysinit
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i 's|si::sysinit:/etc/rc.d/rc.sysinit|si::bootwait:/etc/rc.d/lxc.sysinit|' $rootfs_path/etc/inittab
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # prevent mingetty from calling vhangup(2) since it fails with userns.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Same issue as oracle template: prevent mingetty from calling vhangup(2)
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # commit 2e83f7201c5d402478b9849f0a85c62d5b9f1589.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i 's|^1:|co:2345:respawn:/sbin/mingetty --nohangup console\n1:|' $rootfs_path/etc/inittab
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i 's|^\([56]:\)|#\1|' $rootfs_path/etc/inittab
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield dev_path="${rootfs_path}/dev"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rm -rf $dev_path
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $dev_path
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/null c 1 3
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/zero c 1 5
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/random c 1 8
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/urandom c 1 9
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -m 755 ${dev_path}/pts
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -m 1777 ${dev_path}/shm
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/tty c 5 0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/tty0 c 4 0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/tty1 c 4 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/tty2 c 4 2
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/tty3 c 4 3
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/tty4 c 4 4
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 600 ${dev_path}/console c 5 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/full c 1 7
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 600 ${dev_path}/initctl p
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 ${dev_path}/ptmx c 5 2
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # setup console and tty[1-4] for login. note that /dev/console and
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # /dev/tty[1-4] will be symlinks to the ptys /dev/lxc/console and
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # /dev/lxc/tty[1-4] so that package updates can overwrite the symlinks.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # lxc will maintain these links and bind mount ptys over /dev/lxc/*
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # since lxc.devttydir is specified in the config.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # allow root login on console, tty[1-4], and pts/0 for libvirt
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "# LXC (Linux Containers)" >>${rootfs_path}/etc/securetty
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "lxc/console" >>${rootfs_path}/etc/securetty
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "lxc/tty1" >>${rootfs_path}/etc/securetty
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "lxc/tty2" >>${rootfs_path}/etc/securetty
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "lxc/tty3" >>${rootfs_path}/etc/securetty
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "lxc/tty4" >>${rootfs_path}/etc/securetty
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "# For libvirt/Virtual Machine Monitor" >>${rootfs_path}/etc/securetty
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "pts/0" >>${rootfs_path}/etc/securetty
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # prevent mingetty from calling vhangup(2) since it fails with userns.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Same issue as oracle template: prevent mingetty from calling vhangup(2)
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # commit 2e83f7201c5d402478b9849f0a85c62d5b9f1589.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i 's|mingetty|mingetty --nohangup|' $rootfs_path/etc/init/tty.conf
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ ${root_display_password} = "yes" ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Setting root password to '$root_password'"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ ${root_store_password} = "yes" ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield touch ${config_path}/tmp_root_pass
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield chmod 600 ${config_path}/tmp_root_pass
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo ${root_password} > ${config_path}/tmp_root_pass
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Storing root password in '${config_path}/tmp_root_pass'"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "root:$root_password" | chroot $rootfs_path chpasswd
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ ${root_expire_password} = "yes" ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Also set this password as expired to force the user to change it!
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield chroot $rootfs_path passwd -e root
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # This will need to be enhanced for CentOS 7 when systemd
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # comes into play... /\/\|=mhw=|\/\/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldconfigure_centos_init()
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield{
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.sysinit
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.d/rc.sysinit
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ "$release" = "6" ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield chroot ${rootfs_path} chkconfig udev-post off
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield chroot ${rootfs_path} chkconfig network on
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -d ${rootfs_path}/etc/init ]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # This is to make upstart honor SIGPWR
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cat <<EOF >${rootfs_path}/etc/init/power-status-changed.conf
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield# power-status-changed - shutdown on SIGPWR
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield#
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldstart on power-status-changed
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldexec /sbin/shutdown -h now "SIGPWR received"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldEOF
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfielddownload_centos()
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield{
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # check the mini centos was not already downloaded
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield INSTALL_ROOT=$cache/partial
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $INSTALL_ROOT
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ $? -ne 0 ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Failed to create '$INSTALL_ROOT' directory"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # download a mini centos into a cache
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Downloading centos minimal ..."
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield YUM0="yum --installroot $INSTALL_ROOT -y --nogpgcheck"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if yum -h | grep -q 'releasever=RELEASEVER'; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield YUM="$YUM0 --releasever=$release"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield else
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield YUM="$YUM0"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield PKG_LIST="yum initscripts passwd rsyslog vim-minimal openssh-server openssh-clients dhclient chkconfig rootfiles policycoreutils"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # use temporary repository definition
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield REPO_FILE=$INSTALL_ROOT/etc/yum.repos.d/lxc-centos-temp.repo
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $(dirname $REPO_FILE)
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -n "$repo" ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cat <<EOF > $REPO_FILE
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield[base]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldname=local repository
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldbaseurl="$repo"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldEOF
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldelse
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cat <<EOF > $REPO_FILE
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield[base]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldname=CentOS-$release - Base
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldmirrorlist=http://mirrorlist.centos.org/?release=$release&arch=$basearch&repo=os
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield[updates]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldname=CentOS-$release - Updates
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldmirrorlist=http://mirrorlist.centos.org/?release=$release&arch=$basearch&repo=updates
164105f6563d98b832f603e28e506dbabed22cf3Michael H. WarfieldEOF
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # create minimal device nodes, needed for "yum install" and "yum update" process
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $INSTALL_ROOT/dev
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield force_mknod 666 $INSTALL_ROOT/dev/null c 1 3
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield force_mknod 666 $INSTALL_ROOT/dev/urandom c 1 9
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield $YUM install $PKG_LIST
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ $? -ne 0 ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Failed to download the rootfs, aborting."
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # use same nameservers as hosts, needed for "yum update later"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cp /etc/resolv.conf $INSTALL_ROOT/etc/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # check whether rpmdb is under $HOME
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ ! -e $INSTALL_ROOT/var/lib/rpm/Packages -a -e $INSTALL_ROOT/$HOME/.rpmdb/Packages ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Fixing rpmdb location ..."
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv $INSTALL_ROOT/$HOME/.rpmdb/[A-Z]* $INSTALL_ROOT/var/lib/rpm/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rm -rf $INSTALL_ROOT/$HOME/.rpmdb
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield chroot $INSTALL_ROOT rpm --rebuilddb 2>/dev/null
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # check whether rpmdb version is correct
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield chroot $INSTALL_ROOT rpm --quiet -q yum 2>/dev/null
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ret=$?
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # if "rpm -q" doesn't work due to rpmdb version difference,
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # then we need to redo the process using the newly-installed yum
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ $ret -gt 0 ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Reinstalling packages ..."
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv $REPO_FILE $REPO_FILE.tmp
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir $INSTALL_ROOT/etc/yum.repos.disabled
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv $INSTALL_ROOT/etc/yum.repos.d/*.repo $INSTALL_ROOT/etc/yum.repos.disabled/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv $REPO_FILE.tmp $REPO_FILE
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $INSTALL_ROOT/$INSTALL_ROOT/etc
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cp /etc/resolv.conf $INSTALL_ROOT/$INSTALL_ROOT/etc/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $INSTALL_ROOT/$INSTALL_ROOT/dev
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 $INSTALL_ROOT/$INSTALL_ROOT/dev/null c 1 3
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mknod -m 666 $INSTALL_ROOT/$INSTALL_ROOT/dev/urandom c 1 9
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $INSTALL_ROOT/$INSTALL_ROOT/var/cache/yum
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield cp -al $INSTALL_ROOT/var/cache/yum/* $INSTALL_ROOT/$INSTALL_ROOT/var/cache/yum/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield chroot $INSTALL_ROOT $YUM0 install $PKG_LIST
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ $? -ne 0 ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Failed to download the rootfs, aborting."
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv $INSTALL_ROOT/$INSTALL_ROOT $INSTALL_ROOT.tmp
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rm -rf $INSTALL_ROOT
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv $INSTALL_ROOT.tmp $INSTALL_ROOT
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rm -f $REPO_FILE
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rm -rf $INSTALL_ROOT/var/cache/yum/*
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv "$INSTALL_ROOT" "$cache/rootfs"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Download complete."
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldcopy_centos()
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield{
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # make a local copy of the mini centos
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo -n "Copying rootfs to $rootfs_path ..."
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield #cp -a $cache/rootfs-$arch $rootfs_path || return 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # i prefer rsync (no reason really)
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $rootfs_path
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rsync -a $cache/rootfs/ $rootfs_path/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldupdate_centos()
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield{
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield YUM="chroot $cache/rootfs yum -y --nogpgcheck"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield $YUM update
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ $? -ne 0 ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield $YUM clean packages
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldinstall_centos()
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield{
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p /var/lock/subsys/
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield (
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield flock -x 9
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ $? -ne 0 ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Cache repository is busy."
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Checking cache download in $cache/rootfs ... "
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ ! -e "$cache/rootfs" ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield download_centos
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ $? -ne 0 ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Failed to download 'centos base'"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield else
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Cache found. Updating..."
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield update_centos
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ $? -ne 0 ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Failed to update 'centos base', continuing with last known good cache"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield else
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Update finished"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Copy $cache/rootfs to $rootfs_path ... "
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield copy_centos
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ $? -ne 0 ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "Failed to copy rootfs"
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return 0
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield ) 9>/var/lock/subsys/lxc-centos
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield return $?
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldcreate_hwaddr()
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield{
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield openssl rand -hex 5 | sed -e 's/\(..\)/:\1/g; s/^/fe/'
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield}
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldcopy_configuration()
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield{
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mkdir -p $config_path
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield grep -q "^lxc.rootfs" $config_path/config 2>/dev/null || echo "
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfieldlxc.rootfs = $rootfs_path
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield" >> $config_path/config
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # The following code is to create static MAC addresses for each
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # interface in the container. This code will work for multiple
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # interfaces in the default config.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield mv $config_path/config $config_path/config.def
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield while read LINE
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield do
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # This should catch variable expansions from the default config...
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if expr "${LINE}" : '.*\$' > /dev/null 2>&1
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield LINE=$(eval "echo \"${LINE}\"")
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # There is a tab and a space in the regex bracket below!
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield # Seems that \s doesn't work in brackets.
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield KEY=$(expr "${LINE}" : '\s*\([^ ]*\)\s*=')
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [[ "${KEY}" != "lxc.network.hwaddr" ]]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo ${LINE} >> $config_path/config
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [[ "${KEY}" == "lxc.network.link" ]]
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "lxc.network.hwaddr = $(create_hwaddr)" >> $config_path/config
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield fi
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield done < $config_path/config.def
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield rm -f $config_path/config.def
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield if [ -e "@LXCTEMPLATECONFIG@/centos.common.conf" ]; then
164105f6563d98b832f603e28e506dbabed22cf3Michael H. Warfield echo "
# Include common configuration
lxc.include = @LXCTEMPLATECONFIG@/centos.common.conf
" >> $config_path/config
fi
# Append things which require expansion here...
cat <<EOF >> $config_path/config
lxc.arch = $arch
lxc.utsname = $utsname
# When using LXC with apparmor, uncomment the next line to run unconfined:
#lxc.aa_profile = unconfined
# example simple networking setup, uncomment to enable
#lxc.network.type = $lxc_network_type
#lxc.network.flags = up
#lxc.network.link = $lxc_network_link
#lxc.network.name = eth0
# Additional example for veth network type
# static MAC address,
#lxc.network.hwaddr = 00:16:3e:77:52:20
# persistent veth device name on host side
# Note: This may potentially collide with other containers of same name!
#lxc.network.veth.pair = v-$name-e0
EOF
if [ $? -ne 0 ]; then
echo "Failed to add configuration"
return 1
fi
return 0
}
clean()
{
if [ ! -e $cache ]; then
exit 0
fi
# lock, so we won't purge while someone is creating a repository
(
flock -x 9
if [ $? != 0 ]; then
echo "Cache repository is busy."
exit 1
fi
echo -n "Purging the download cache for centos-$release..."
rm --preserve-root --one-file-system -rf $cache && echo "Done." || exit 1
exit 0
) 9>@LOCALSTATEDIR@/lock/subsys/lxc-centos
}
usage()
{
cat <<EOF
usage:
$1 -n|--name=<container_name>
[-p|--path=<path>] [-c|--clean] [-R|--release=<CentOS_release>] [-a|--arch=<arch of the container>]
[-h|--help]
Mandatory args:
-n,--name container name, used to as an identifier for that container from now on
Optional args:
-p,--path path to where the container rootfs will be created, defaults to /var/lib/lxc/name.
-c,--clean clean the cache
-R,--release Centos release for the new container. if the host is Centos, then it will defaultto the host's release.
--fqdn fully qualified domain name (FQDN) for DNS and system naming
--repo repository to use (url)
-a,--arch Define what arch the container will be [i686,x86_64]
-h,--help print this help
EOF
return 0
}
options=$(getopt -o a:hp:n:cR: -l help,path:,rootfs:,name:,clean,release:,repo:,arch:,fqdn: -- "$@")
if [ $? -ne 0 ]; then
usage $(basename $0)
exit 1
fi
arch=$(uname -m)
eval set -- "$options"
while true
do
case "$1" in
-h|--help) usage $0 && exit 0;;
-p|--path) path=$2; shift 2;;
--rootfs) rootfs_path=$2; shift 2;;
-n|--name) name=$2; shift 2;;
-c|--clean) clean=1; shift 1;;
-R|--release) release=$2; shift 2;;
--repo) repo="$2"; shift 2;;
-a|--arch) newarch=$2; shift 2;;
--fqdn) utsname=$2; shift 2;;
--) shift 1; break ;;
*) break ;;
esac
done
if [ ! -z "$clean" -a -z "$path" ]; then
clean || exit 1
exit 0
fi
basearch=${arch}
# Map a few architectures to their generic CentOS repository archs.
# The two ARM archs are a bit of a guesstimate for the v5 and v6
# archs. V6 should have hardware floating point (Rasberry Pi).
# The "arm" arch is safer (no hardware floating point). So
# there may be cases where we "get it wrong" for some v6 other
# than RPi.
case "$arch" in
i686) basearch=i386 ;;
armv3l|armv4l|armv5l) basearch=arm ;;
armv6l|armv7l|armv8l) basearch=armhfp ;;
*) ;;
esac
# Somebody wants to specify an arch. This is very limited case.
# i386/i586/i686 on i386/x86_64
# - or -
# x86_64 on x86_64
if [ "${newarch}" != "" -a "${newarch}" != "${arch}" ]
then
case "${newarch}" in
i386|i586|i686)
if [ "${basearch}" = "i386" -o "${basearch}" = "x86_64" ]
then
# Make the arch a generic x86 32 bit...
arch=${newarch}
basearch=i386
else
basearch=bad
fi
;;
*)
basearch=bad
;;
esac
if [ "${basearch}" = "bad" ]
then
echo "You cannot build a ${newarch} CentOS container on a ${arch} host. Sorry!"
exit 1
fi
fi
# Allow the cache base to be set by environment variable
cache_base=${LXC_CACHE_PATH:-"@LOCALSTATEDIR@/cache/lxc"}/centos/$basearch
# Let's do something better for the initial root password.
# It's not perfect but it will defeat common scanning brute force
# attacks in the case where ssh is exposed. It will also be set to
# expired, forcing the user to change it at first login.
if [ "${root_password}" = "" ]
then
root_password=Root-${name}-${RANDOM}
else
# If it's got a ding in it, try and expand it!
if [ $(expr "${root_password}" : '.*$.') != 0 ]
then
root_password=$(eval echo "${root_password}")
fi
# If it has more than 3 consecutive X's in it, feed it
# through mktemp as a template.
if [ $(expr "${root_password}" : '.*XXXX') != 0 ]
then
root_password=$(mktemp -u ${root_password})
fi
fi
if [ -z "${utsname}" ]; then
utsname=${name}
fi
# This follows a standard "resolver" convention that an FQDN must have
# at least two dots or it is considered a local relative host name.
# If it doesn't, append the dns domain name of the host system.
#
# This changes one significant behavior when running
# "lxc_create -n Container_Name" without using the
# --fqdn option.
#
# Old behavior:
# utsname and hostname = Container_Name
# New behavior:
# utsname and hostname = Container_Name.Domain_Name
if [ $(expr "$utsname" : '.*\..*\.') = 0 ]; then
if [[ "$(dnsdomainname)" != "" && "$(dnsdomainname)" != "localdomain" ]]; then
utsname=${utsname}.$(dnsdomainname)
fi
fi
type yum >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "'yum' command is missing"
exit 1
fi
if [ -z "$path" ]; then
path=$default_path/$name
fi
if [ -z "$release" ]; then
if [ "$is_centos" -a "$centos_host_ver" ]; then
release=$centos_host_ver
elif [ "$is_redhat" -a "$redhat_host_ver" ]; then
# This is needed to clean out bullshit like 6workstation and 6server.
release=$(expr $redhat_host_ver : '\([0-9.]*\)')
else
echo "This is not a CentOS or Redhat host and release is missing, defaulting to 6 use -R|--release to specify release"
release=6
fi
fi
if [ "$(id -u)" != "0" ]; then
echo "This script should be run as 'root'"
exit 1
fi
if [ -z "$rootfs_path" ]; then
rootfs_path=$path/rootfs
# check for 'lxc.rootfs' passed in through default config by lxc-create
if grep -q '^lxc.rootfs' $path/config 2>/dev/null ; then
rootfs_path=$(sed -e '/^lxc.rootfs\s*=/!d' -e 's/\s*#.*//' \
-e 's/^lxc.rootfs\s*=\s*//' -e q $path/config)
fi
fi
config_path=$path
cache=$cache_base/$release
revert()
{
echo "Interrupted, so cleaning up"
lxc-destroy -n $name
# maybe was interrupted before copy config
rm -rf $path
echo "exiting..."
exit 1
}
trap revert SIGHUP SIGINT SIGTERM
copy_configuration
if [ $? -ne 0 ]; then
echo "failed write configuration file"
exit 1
fi
install_centos
if [ $? -ne 0 ]; then
echo "failed to install centos"
exit 1
fi
configure_centos
if [ $? -ne 0 ]; then
echo "failed to configure centos for a container"
exit 1
fi
configure_centos_init
if [ ! -z "$clean" ]; then
clean || exit 1
exit 0
fi
echo "
Container rootfs and config have been created.
Edit the config file to check/enable networking setup.
"
if [ ${root_display_password} = "yes" ]
then
echo "The temporary password for root is: '$root_password'
You may want to note that password down before starting the container.
"
fi
if [ ${root_store_password} = "yes" ]
then
echo "The temporary root password is stored in:
'${config_path}/tmp_root_pass'
"
fi
if [ ${root_prompt_password} = "yes" ]
then
echo "Invoking the passwd command in the container to set the root password.
chroot ${rootfs_path} passwd
"
chroot ${rootfs_path} passwd
else
if [ ${root_expire_password} = "yes" ]
then
if ( mountpoint -q -- "${rootfs_path}" )
then
echo "To reset the root password, you can do:
lxc-start -n ${name}
lxc-attach -n ${name} -- passwd
lxc-stop -n ${name}
"
else
echo "
The root password is set up as "expired" and will require it to be changed
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
also reset the expired flag):
chroot ${rootfs_path} passwd
"
fi
fi
fi