lxc-gentoo.in revision 96283b546081e7ff709968378fca25cb44f1ab6c
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen#!/bin/bash
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen#
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# LXC template for gentoo
b87761f9bbef949f31dae297e619ac3f5e9c2b2eTimo Sirainen#
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# Author: Guillaume Zitta <lxc@zitta.fr>
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen#
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# Widely inspired from lxc-gentoo script at https://github.com/globalcitizen/lxc-gentoo
de5f478d9e7ae7b8e58082e0b30b6ce1f034236aTimo Sirainen#
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# this version is reworked with :
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# - out of the lxc-create compat
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# - vanilla gentoo config
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# - ready to use cache
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen#
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# Detect use under userns (unsupported)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenfor arg in "$@"; do
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [ "$arg" = "--" ] && break
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [ "$arg" = "--mapped-uid" -o "$arg" = "--mapped-gid" ]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen echo "This template can't be used for unprivileged containers." 1>&2
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen echo "You may want to try the \"download\" template instead." 1>&2
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen exit 1
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen fi
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainendone
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen# Make sure the usual locations are in PATH
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainenexport PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# Ensure strict root's umask doesen't render the VM unusable
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenumask 022
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo SirainenLXC_TEMPLATE_CONFIG="@LXCTEMPLATECONFIG@"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen################################################################################
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# Various helper functions
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen################################################################################
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# param: $1: the name of the lock
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# param: $2: the timeout for the lock
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen# The rest contain the command to execute and its parameters
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainenexecute_exclusively()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mkdir -p @LOCALSTATEDIR@/lock/subsys/
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen local lock_name="$1"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen local timeout="$2"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen shift 2
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen {
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "Attempting to obtain an exclusive lock (timeout: %s sec) named \"%s\"...\n" "${timeout}" "$lock_name"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen flock -x -w "${timeout}" 50
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ $? -ne 0 ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => unable to obtain lock, aborting.\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return 2
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => done.\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => Executing \"%s\"\n" "$*"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen "$@"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen retval=$?
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen } 50> "@LOCALSTATEDIR@/lock/subsys/lxc-gentoo-${lock_name}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return $retval
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen}
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen
37e8420b32a0fa3442c405616980e45beb494104Timo Sirainen# a die function is always a good idea
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainendie()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "\n[the last exit code leading to this death was: %s ]\n" "$?"
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen local retval="$1"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen shift 1
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "$@"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen exit "$retval"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# gentoo arch/variant detection
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenset_default_arch()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "### set_default_arch: default arch/variant autodetect...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen arch=$(arch)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ $arch =~ i.86 ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen arch="x86"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen variant="x86"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen elif [[ $arch == "x86_64" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen arch="amd64"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen variant="amd64"
e22ec7998afd426c53c658483ce66b6e404e27c6Timo Sirainen elif [[ $arch =~ arm.* ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen arch="arm"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen variant="armv7a"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #who knows, it may work...
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => warn: unexpected arch:${arch} let me knows if it works :)\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen variant="${arch}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => Got: arch=%s variant=%s\n" "${arch}" "${variant}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenstore_user_message()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen user_message="${user_message}=> $@\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen################################################################################
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# CACHE Preparation
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen################################################################################
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# during setup cachedir is $cacheroot/partial-$arch-$variant
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# at the end, it will be $cacheroot/rootfs-$arch-$variant
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencache_setup(){
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen partialfs="${cacheroot}/partial-${arch}-${variant}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #if cache exists and flush not needed, return
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ -d "${cachefs}" && -z "${flush_cache}" ]] && return 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "###### cache_setup(): doing cache preparation\n"
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen local retval=1
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen #clean from failed previous run
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen rm -rf "${partialfs}"
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen mkdir -p "${partialfs}"
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen #let's go
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen cache_precheck && \
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen cache_stage3 && \
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen cache_portage && \
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen cache_inittab && \
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen cache_net && \
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen cache_dev && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen cache_openrc && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen rm -rf "${cachefs}" && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mv "${partialfs}" "${cachefs}" && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "###### cache_setup: Cache should be ready\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return $?
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencache_precheck()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "### cache_precheck(): doing some pre-start checks ...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # never hurts to have a fail-safe.
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ -n "${cacheroot//\/}" ]] \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen || die 8 "\$cacheroot (%s) IS EMPTY OR MADE OF ONLY DIRECTORY SEPERATORS, THIS IS *VERY* BAD!\n" "${cacheroot}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen#get latest stage3 tarball
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainencache_stage3()
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen{
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen printf "### cache_stage3(): stage3 cache deployment...\n"
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen if [ -z "${tarball}" ]; then
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen #variables init
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen local stage3_baseurl="${mirror}/releases/${arch}/autobuilds"
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen # get latest-stage3....txt file for subpath
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen local stage3_pointer="${stage3_baseurl}/latest-stage3-${variant}.txt"
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "Determining path to latest Gentoo %s (%s) stage3 archive...\n" "${arch}" "${variant}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => downloading and processing %s\n" "${stage3_pointer}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen local stage3_latest_tarball=$(wget -q -O - "${stage3_pointer}" | tail -n1 ) \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen || die 6 "Error: unable to fetch\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => Got: %s\n" "${stage3_latest_tarball}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "Downloading/untarring the actual stage3 tarball...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen wget -O - "${stage3_baseurl}/${stage3_latest_tarball}" | tar -xjpf - -C "${partialfs}" \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen || die 6 "Error: unable to fetch or untar\n"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen printf " => extracted to: %s\n" "${partialfs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen else
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen printf "Extracting the stage3 tarball...\n"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen tar -xpf "${tarball}" -C "${partialfs}" || die 6 "unable to untar ${tarball} to ${partialfs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #check if it chroots
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "chroot test..."
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen chroot ${partialfs} /bin/true || die 1 "Error: chroot %s /bin/true, failed" "${partialfs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " OK\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => stage3 cache extracted in : %s\n" "${partialfs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return 0
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen}
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainencache_portage()
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen{
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen printf "### cache_portage: caching portage tree tarball...\n"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen [[ -z "${flush_cache}" && -f "${portage_cache}" ]] && return 0
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen rm -f ${portage_cache}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "Downloading Gentoo portage (software build database) snapshot...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen execute_exclusively portage 60 wget -O "${portage_cache}" "${mirror}/snapshots/portage-latest.tar.bz2" \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen || die 6 "Error: unable to fetch\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => done.\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# custom inittab
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencache_inittab()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "### cache_inittab: tuning inittab...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen INITTAB="${partialfs}/etc/inittab"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ -w "$INITTAB" ]] || die 1 "Error: $INITTAB is not writeable"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # create console
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen echo "# Lxc main console" >> "$INITTAB"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen echo "1:12345:respawn:/sbin/agetty -a root --noclear 115200 console linux" >> "$INITTAB"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # finally we add a pf line to enable clean shutdown on SIGPWR (issue 60)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen echo "# clean container shutdown on SIGPWR" >> "$INITTAB"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen echo "pf:12345:powerwait:/sbin/halt" >> "$INITTAB"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # we also blank out /etc/issue here in order to prevent delays spawning login
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # caused by attempts to determine domainname on disconnected containers
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen sed -i 's/[\][Oo]//g' "${partialfs}/etc/issue"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencache_net()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "### cache_net: doing some useful net tuning...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # useful for chroot
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # /etc/resolv.conf
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen grep -i 'search ' /etc/resolv.conf > "${partialfs}/etc/resolv.conf"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen grep -i 'nameserver ' /etc/resolv.conf >> "${partialfs}/etc/resolv.conf"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # fix boot-time interface config wipe under aggressive cap drop
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # (openrc 0.9.8.4 ~sep 2012 - https://bugs.gentoo.org/show_bug.cgi?id=436266)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # initial warkaround was: sed -i -e 's/^#rc_nostop=""/rc_nostop="net.eth0 net.lo"/' "${partialfs}/etc/rc.conf"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # but this one does not depends on interfaces names
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen echo 'rc_keyword="-stop"' >> "${partialfs}/etc/conf.d/net"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencache_dev()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "### cache_dev(): /dev tuning...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #Wait for https://bugs.gentoo.org/show_bug.cgi?id=496054
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mkdir "${partialfs}/dev/pts"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mkdir "${partialfs}/dev/shm"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mkdir "${partialfs}/dev/mqueue"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mkdir -m 755 "${partialfs}/dev/net"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mknod -m 666 "${partialfs}/dev/net/tun" c 10 200
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# fix openrc system
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencache_openrc()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "### cache_openrc(): doing openrc tuning\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #Wait for https://bugs.gentoo.org/show_bug.cgi?id=496054
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen chroot "${partialfs}" sed s/-lxc//g -i "/etc/init.d/devfs"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen################################################################################
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# CONTAINER Preparation
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen################################################################################
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_setup() {
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "##### container_setup(): starting container setup\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #in most cases lxc-create should have provided a copy of default lxc.conf
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #let's tag where template starts, or just create the files
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen echo '### lxc-gentoo template stuff starts here' >> "$path/config"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #Determine rootfs
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #If backingstore was specified, lxc.rootfs should be present or --rootfs did the rootfs var creation
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [ -z "${rootfs}" ]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen rootfs=`awk -F= '$1 ~ /^lxc.rootfs/ { print $2 }' "$path/config" 2>/dev/null`
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [ -z "${rootfs}" ]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #OK it's default
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen rootfs="${path}/rootfs"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "rootfs of container is : ${rootfs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "config of container is : ${path}/config"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_precheck && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_rootfs && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_consoles && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_tz && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_portage && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_net && \
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen container_hostname && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_auth && \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_conf
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [ $? -ne 0 ]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen die 1 "container_setup(): one step didn't complete, sorry\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "###### container_setup(): container should be ready to start!\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "\n\n"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen printf "You could now use you container with: lxc-start -n %s\n" "${name}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "little things you should know about your container:\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "${user_message}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_precheck()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "### container_precheck(): doing some pre-start checks ...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # never hurts to have a fail-safe.
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ -n "${name//\/}" ]] \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen || die 8 "\$name (%s) IS EMPTY OR MADE OF ONLY DIRECTORY SEPERATORS, THIS IS *VERY* BAD!\n" "${name}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ -n "${rootfs//\/}" ]] \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen || die 8 "\$rootfs (%s) IS EMPTY OR MADE OF ONLY DIRECTORY SEPERATORS, THIS IS *VERY* BAD!\n" "${rootfs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ -n "${cachefs//\/}" ]] \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen || die 8 "\$cachefs (%s) IS EMPTY OR MADE OF ONLY DIRECTORY SEPERATORS, THIS IS *VERY* BAD!\n" "${cachefs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # check if the rootfs already exists
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ -d "${rootfs}/etc" ]] && die 18 "Error: \$rootfs (%s) already exists!" "${rootfs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # check cache
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ ! -d "${cachefs}/etc" ]] && die 1 "Error: \$cachefs (%s) not found!" "${cachefs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_rootfs()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "#### container_rootfs(): copying rootfs %s from cache %s ...\n" "${rootfs}" "${cachefs}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen tar -c -f - -C "${cachefs}" . | tar -x -p -f - -C "${rootfs}" || die 1 "Error: cache copy to rootfs failed"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "chroot test..."
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen chroot "${rootfs}" /bin/true || die 1 "Error: 'chroot %s /bin/true' failed"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " OK\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => done\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_consoles() {
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "#### container_consoles(): setting container consoles ...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # disable unwanted ttys
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ ${tty} < 6 ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen local mindis=$(( ${tty} + 1 ))
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen sed -i "s/^c[${mindis}-6]/#&/" "${rootfs}/etc/inittab"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => main console + ${tty} ttys\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ -z "${autologin}" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen sed 's/agetty -a root/agetty/' -i "${rootfs}/etc/inittab"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen elif [[ "${user}" != "root" ]]; then
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen sed "s/agetty -a root/agetty -a ${user}/" -i "${rootfs}/etc/inittab"
6ea145a99eeee923602f04d3c9183bbdba6cd190Timo Sirainen printf " => Autologin on main console for %s enabled\n" "${user}"
6ea145a99eeee923602f04d3c9183bbdba6cd190Timo Sirainen [[ -z "${forced_password}" ]] && unset password
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen store_user_message "${user} has autologin on main console"
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => Autologin on main console for root enabled\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ -z "${forced_password}" ]] && unset password
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "${user} has autologin on main console"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => done\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_tz()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "#### container_tz(): setting container timezone ...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #let's try to copy it from host
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [ -L "/etc/localtime" ]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #host has a symlink
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #let see if we can reproduct symlink
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen target=$(readlink /etc/localtime)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ "$target" != "" ]]; then
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen if [ -f "${rootfs}/${target}" ]; then
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen #same target exists in container
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen chroot "${rootfs}" ln -sf "${target}" "/etc/localtime"
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen printf " => host symlink reproducted in container : %s\n" "${target}"
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen store_user_message "timezone copyed from host"
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen return 0
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen fi
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen fi
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen fi
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen if [ -e /etc/localtime ]; then
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen # duplicate host timezone
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen cat /etc/localtime > "${rootfs}/etc/localtime"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => host localtime copyed to container\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "timezone was staticly copyed from host"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # otherwise set up UTC
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen chroot "${rootfs}" ln -sf /usr/share/zoneinfo/UTC /etc/localtime
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => fallback: fixed to UTC\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "timezone was fixed to UTC"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_portage()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "#### container_portage(): setting container portage... \n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #default entry for conf
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen portage_mount="#container set with private portage tree, no mount here"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "Warnings are normal here, don't worry\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #container repos detection
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if chroot ${rootfs} portageq get_repo_path / gentoo > /dev/null ; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen portage_container="$(chroot ${rootfs} portageq get_repo_path / gentoo)"
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen die 1 "Failed to figure out container portage tree location with portageq get_repo_path / gentoo\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ -n "${private_portage}" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_private_portage
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return 0
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [ -z "${portage_dir}" ]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #gentoo host detection
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "trying to guess portage_dir from host...\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen portage_dir="$(portageq get_repo_path / gentoo 2>/dev/null)"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [ ! -d "${portage_dir}/profiles" ]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => host portage detection failed (not gentoo host), fallback to private portage tree\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_private_portage
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen return 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [ ! -d "${portage_dir}/profiles" ]; then
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen die 1 "specified portage_dir (%s) does not contains profiles, is it a portage tree ?\n" "${portage_dir}"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # if we are here, we have shared portage_dir
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #ensure dir exists
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen chroot "${rootfs}" mkdir ${portage_container}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen portage_mount="#container set with shared portage
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenlxc.mount.entry=${portage_dir} ${portage_container/\//} none ro,bind 0 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenlxc.mount.entry=${portage_dir}/distfiles ${portage_container/\//}/distfiles none rw,bind 0 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen#If you use eix, you should uncomment this
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen#lxc.mount.entry=/var/cache/eix var/cache/eix none ro,bind 0 0"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen store_user_message "container has a shared portage from host's ${portage_dir} to ${portage_container/\//}"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen #Let's propose binary packages
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen cat <<- EOF >> "${rootfs}/etc/portage/make.conf"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen# enable this to store built binary packages
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen#FEATURES="\$FEATURES buildpkg"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen# enable this to use built binary packages
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen#EMERGE_DEFAULT_OPTS="\${EMERGE_DEFAULT_OPTS} --usepkg"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen# enable and *tune* this kind of entry to slot binaries, specialy if you use multiples archs and variants
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen#PKGDIR="\${PKGDIR}/amd64
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen#or PKGDIR="\${PKGDIR}/hardened"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo SirainenEOF
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen printf " => portage stuff done, see /etc/portage/make.conf for additionnal tricks\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_private_portage()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #called from container_portage() do not call directly from container_setup
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen printf "# untaring private portage to %s from %s ... \n" "${rootfs}/${portage_container}" "${portage_cache}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mkdir -p "${rootfs}/${portage_container}"
b457d2ecf97fb52064f9dd563fd4e8065af39dfbTimo Sirainen execute_exclusively portage 60 tar -xp --strip-components 1 -C "${rootfs}/${portage_container}" -f "${portage_cache}" \
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen || die 2 "Error: unable to extract the portage tree.\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "container has its own portage tree at ${portage_container}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "=> done\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen#helper func for container_genconf_net()
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainennic_write()
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen{
37e8420b32a0fa3442c405616980e45beb494104Timo Sirainen #display with gentoo's confd.net format
37e8420b32a0fa3442c405616980e45beb494104Timo Sirainen echo "config_${nic_name}=\"${nic_conf}\""
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen #add to managed list
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen [[ "${nic_conf}" == "dhcp" ]] && nic_managed="${nic_managed} ${nic_name}"
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen [[ "${nic_conf}" == "null" ]] && nic_unmanaged="${nic_unmanaged} ${nic_name}"
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen [[ -z "${nic_hwaddr}" && ${nic_type} == "veth" ]] && nic_wo_hwaddr="${nic_wo_hwaddr} ${nic_name}"
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen nic_writed=1
f0e811f0e306bb20d3da9c26353bdd5669132f29Timo Sirainen}
f0e811f0e306bb20d3da9c26353bdd5669132f29Timo Sirainen
f0e811f0e306bb20d3da9c26353bdd5669132f29Timo Sirainen#Analyse lxc.conf and print conf.d/net content
f0e811f0e306bb20d3da9c26353bdd5669132f29Timo Sirainencontainer_conf_net()
3e8842470a4a17017529d43b39c40a7549c2ecf2Timo Sirainen{
3e8842470a4a17017529d43b39c40a7549c2ecf2Timo Sirainen local file=${1}
3e8842470a4a17017529d43b39c40a7549c2ecf2Timo Sirainen [[ -z "${nic_last}" ]] && nic_last=-1
3e8842470a4a17017529d43b39c40a7549c2ecf2Timo Sirainen [[ -z "${nic_named}" ]] && nic_named=0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen OLDIFS=$IFS
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen IFS="
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #let's do some drity bash things to parse lxc network conf
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen for line in $( sed -r "s/[ ]*=[ ]*/_real_ugly_sep_42_/" "${file}" ); do
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen key=$(echo "${line}" | sed 's/_real_ugly_sep_42_.*$//')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen value=$(echo "${line}" | sed 's/^.*_real_ugly_sep_42_//')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #new nic !
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ "${key}" == "lxc.network.type" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #we don't know what to do with it.
2ccb478c35972517721ce415d81fcbd11a73fad3Timo Sirainen [[ "${value}" == "empty" ]] && continue
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #write conf from previous loops
b650f04c3b2e7dea2295bdbe3239eb82ec03ada0Timo Sirainen [[ "${nic_writed}" == "0" ]] && nic_write
b650f04c3b2e7dea2295bdbe3239eb82ec03ada0Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #init defaults
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen let nic_last=nic_last+1
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen nic_writed=0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #if 1 named between 2 not named: last is eth1
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #=> Number is ID munis number of named NIC before
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen nic_name="eth$(( ${nic_last} - ${nic_named} ))"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen nic_conf="dhcp"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen nic_type="${value}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
1856c361aad526948d56d8aafd576bca94516b92Timo Sirainen
1856c361aad526948d56d8aafd576bca94516b92Timo Sirainen if [[ "${key}" == "lxc.network.hwaddr" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen nic_hwaddr=1
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ "${key}" =~ ^lxc.network.ipv(4|6) ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #tell openrc to not manage this NIC as LXC set there address
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen nic_conf="null"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ "${key}" =~ ^lxc.network.name ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen nic_name="${value}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen let nic_named=nic_named+1
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ "${key}" == "lxc.include" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #recursive into include
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_conf_net "${value}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen done
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #write conf from previous loops
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ "${nic_writed}" == "0" ]] && nic_write
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen IFS=$OLDIFS
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_net()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "container_net(): setting container network conf... \n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen #Analyse network configuration in config
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_conf_net "$path/config" >> "${rootfs}/etc/conf.d/net"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen # found how much nic finaly have
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen nic_count=$(( ${nic_last} + 1 ))
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen # unless openrc manage a nic, we now have to force openrc to automatic
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen # provision of the 'net' dep. If we do not, network dependent services
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen # will fail to load
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen if [[ -z "${nic_managed}" ]]; then
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen #tell openrc that lxc already did the work
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen echo 'rc_provide="net"' >> "${rootfs}/etc/rc.conf"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
de5f478d9e7ae7b8e58082e0b30b6ce1f034236aTimo Sirainen #No NIC ?
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ ${nic_count} == 0 ]]; then
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen #If no Nic, no need to continue
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen bridge=$(brctl show | awk 'NR==2 {print $1}')
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen if [[ "${bridge}" != "" ]]; then
6ea145a99eeee923602f04d3c9183bbdba6cd190Timo Sirainen store_user_message "No network interface for this container
4db61af2cfe2b206113bcc4b6153521679702bb4Timo SirainenIt's a pitty, you have bridge, ${bridge}.
4db61af2cfe2b206113bcc4b6153521679702bb4Timo SirainenIf it is for Lxc, use it next time by adding this to your default.conf :
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainenlxc.network.type = veth
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainenlxc.network.link = ${bridge}
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainenlxc.network.flags = up
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainenlxc.network.hwaddr = fe:xx:xx:xx:xx:xx"
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen return 0
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "No network interface for this container"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen return 0
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen fi
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen fi
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen #For each openrc managed nic, activate
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen sys_nic_index=1
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen for nic in ${nic_managed}
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen do
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen chroot "${rootfs}" ln -s net.lo "/etc/init.d/net.${nic}"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen chroot "${rootfs}" rc-update add net.${nic} default
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen #fake sysfs for openrc, in case settings does not provide it
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen mkdir -p "${rootfs}/sys/class/net/${nic}"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen echo ${sys_nic_index} > "${rootfs}/sys/class/net/${nic}/ifindex"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen echo up > "${rootfs}/sys/class/net/${nic}/operstate"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen let sys_nic_index=sys_nic_index+1
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen done
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #Warn about dynamic hwaddr
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ -n "${nic_wo_hwaddr}" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "Warning, these veth NIC don't have fixed hwaddr :
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen${nic_wo_hwaddr}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainensee http://lists.linuxcontainers.org/pipermail/lxc-devel/2013-December/006736.html
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenand man lxc.conf"
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen fi
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen printf " => network conf done.\n"
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen# custom hostname
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_hostname()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "#### container_hostname(): setting hostname... \n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "hostnale=%s\n" "${name}" > "${rootfs}/etc/conf.d/hostname"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen printf " => done.\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen
ce74395e2a932342e04fb682395bcce111574969Timo Sirainencontainer_auth()
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen{
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen printf "#### container_auth(): setting authentification... \n"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen if [[ "${user}" != "root" ]]; then
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen printf " non root user requested, creating... \n"
1fb5e50695bbbc0da082e5a6f19f29d2bb2f6531Timo Sirainen chroot "${rootfs}" useradd --create-home -s /bin/bash "${user}" || die 1 "failed to create user ${user}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => user %s created\n" "${user}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen store_user_message "Connection user is ${user}"
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen #Home of user
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen auth_home=$(chroot "${rootfs}" getent passwd "${user}" | cut -d : -f 6)
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen if [[ -r "${auth_key}" ]]; then
ce74395e2a932342e04fb682395bcce111574969Timo Sirainen printf " deploying auth_key %s for user %s ...\n" "${auth_key}" "${user}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mkdir -p "${rootfs}/${auth_home}/.ssh"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen cat >> "${rootfs}/${auth_home}/.ssh/authorized_keys"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen chroot "${rootfs}" chown "${user}:" "${auth_home}/.ssh/authorized_keys"
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen printf " => inserted public key in %s/.ssh/authorized_keys\n" "${auth_home}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [[ -z "${forced_password}" ]] && unset password
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "${user} has the ssh key you gived us"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ -n "${password}" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " setting password for %s ...\n" "${user}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen echo "${user}:${password}" | chroot "${rootfs}" chpasswd || die 1 "failed to change password"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => done. if you didn't specify , default is 'toor'\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ -n "${forced_password}" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "${user} has the password you give for him"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen store_user_message "${user} has the default password 'toor', please change it ASAP"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => done.\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen################################################################################
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# lxc configuration files
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen################################################################################
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencontainer_conf()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf "container_configuration(): making lxc configuration file... \n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen #at this point if there
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen conf_file="${path}/config"
e07677bb15404a3c18ad205efae86d6db31c3150Timo Sirainen
e07677bb15404a3c18ad205efae86d6db31c3150Timo Sirainen if grep -q "^lxc.rootfs" "${conf_file}" ; then
e07677bb15404a3c18ad205efae86d6db31c3150Timo Sirainen #lxc-create already provided one
e07677bb15404a3c18ad205efae86d6db31c3150Timo Sirainen conf_rootfs_line=""
e07677bb15404a3c18ad205efae86d6db31c3150Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen conf_rootfs_line="lxc.rootfs = $(readlink -f "${rootfs}")"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [[ "${arch}" == "x86" || "${arch}" == "amd64" ]]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen local conf_arch_line="lxc.arch = ${arch}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen else
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen local conf_arch_line="# lxc.arch = ${arch}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen cat <<- EOF >> "${conf_file}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# sets container architecture
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# If desired architecture != amd64 or x86, then we leave it unset as
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# LXC does not oficially support anything other than x86 or amd64.
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen${conf_arch_line}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen# set the hostname
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenlxc.utsname = ${name}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenlxc.tty = ${tty}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen${conf_rootfs_line}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen${portage_mount}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen${conf_sysfs}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen${conf_mounts}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenlxc.include = ${LXC_TEMPLATE_CONFIG}/gentoo.${settings}.conf
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo SirainenEOF
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen printf " => done.\n"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenusage()
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen{
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen cat <<EOF
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen$1 -h|--help [-a|--arch <arch>] [-v|--variant <variant>] [-P|--private-portage] [--portage-dir <protagedir>] [-t|--tarball <stage3file>]
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [-F|--flush-cache] [-c|--cache-only] [-u|--user <username>] [-w|--password <password>] [--autologin] [-S|--auth-key <keyfile>]
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen [-s|--settings <name>] [-m|--mirror <gentoomirror>] [--tty <number>]
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenarch: the container architecture (e.g. amd64): defaults to host arch (currently: '${arch}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen If you choose one that needs emulation
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen tested: amd64, x86
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen You could try any other gentoo arch, why not...
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenvariant: gentoo's Architecture variant as of dec 2013 : (currently: '${variant}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen for amd64 arch: amd64 (default), amd64-hardened+nomultilib, amd64-hardened, amd64-nomultilib, x32
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen for x86 arch: i686 (default), i486, i686-hardened
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen for arm arch: armv7a (default), armv7a_hardfp, armv6j, armv6j_hardfp, armv5tel, armv4tl
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenprivate-portage: by default, /usr/portage is mount-binded with host one if exists (currently: '${private_portage}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen this force container to have his own copy
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenportage-dir: portage dir used for shared portage
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen by default the host on if any (currently: '${portage_dir}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainentarball: force usage of local stage3 archive (currently: '${arch}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen If empty, latest will be downloaded
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainenflush-cache: do like there is no previous cache
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainencache-only: just ensure cache is present
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen if cache exists and "flush-cache" not specified, does nothing
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenuser: user used in auth oriented options (currently: '${user}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenpassword: password for user (currently: '${password}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if default, usage of auth-key will disable password setting
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenautologin: enable autologin for user (currently: '${autologin}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen This unset default password setting
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenauth-key: SSH Public key file to inject into container for user (currently: '${auth_key}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen This unset default password setting
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainensettings: choose common configuration (currently: '${settings}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen see ${LXC_TEMPLATE_CONFIG}/gentoo.*.conf
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen Available settings:
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen $(ls -1 ${LXC_TEMPLATE_CONFIG}/gentoo.*.conf | xargs basename -a -s .conf | sed 's/^gentoo.//')
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainenmirror: gentoo mirror for download (currently: '${mirror}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainentty: number of tty (6 max) (currently: '${tty}')
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo SirainenEOF
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen exit 0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen#some overridable defaults
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenset_default_arch
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainenmirror="http://distfiles.gentoo.org"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenuser="root"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenpassword="toor"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainentty=0
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainensettings="common"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenoptions=$(getopt -o hp:n:a:FcPv:t:S:u:w:s:m: -l help,rootfs:,path:,name:,arch:,flush-cache,cache-only,private-portage,variant:,portage-dir:,tarball:,auth_key:,user:,autologin,password:,settings:,mirror:,tty: -- "$@")
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Siraineneval set -- "$options"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
37e8420b32a0fa3442c405616980e45beb494104Timo Sirainenwhile true
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainendo
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen case "$1" in
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -h|--help) usage $0 && exit 0;;
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen --rootfs) rootfs=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -p|--path) path=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -n|--name) name=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -a|--arch) arch=$2; shift 2;;
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen -F|--flush-cache) flush_cache=1; shift 1;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -c|--cache-only) cache_only=1; shitf 1;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -P|--private-portage) private_portage=1; shift 1;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -v|--variant) variant=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen --portage-dir) portage_dir=$2; shift 2;;
61f39b0358a72ebc693d84ba5bac74489ee7df41Timo Sirainen -t|--tarball) tarball=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -S|--auth-key) auth_key=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -u|--user) user=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -w|--password) forced_password=1; password=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -s|--settings) settings=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen -m|--mirror) mirror=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen --tty) [[ $2 -lt 6 ]] && tty=$2; shift 2;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen --autologin) autologin=1; shift 1;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen --) shift 1; break ;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen *) break ;;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen esac
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainendone
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencacheroot="@LOCALSTATEDIR@/cache/lxc/gentoo"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenportage_cache="${cacheroot}/portage.tbz"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainencachefs="${cacheroot}/rootfs-${arch}-${variant}"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenalias wget="wget --timeout=8 --read-timeout=15 -c -t10 -nd"
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainendo_all() {
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen cache_setup
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if [ -z "${cache_only}" ]; then
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen container_setup
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fi
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen}
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenexecute_exclusively "cache-${arch}-${variant}" 60 do_all
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen