lxc-alpine.in revision 2b49de9a3ff182c208148d780f6b26cf8cdd09d8
1516N/A#!/bin/sh
565N/A
565N/Ainstall_alpine() {
565N/A rootfs="$1"
565N/A mkdir -p "$rootfs"/etc/apk || return 1
565N/A cp -r ${keys_dir:-/etc/apk/keys} "$rootfs"/etc/apk/
565N/A if [ -n "$repository" ]; then
565N/A echo "$repository" > "$rootfs"/etc/apk/repositories
565N/A else
565N/A cp /etc/apk/repositories "$rootfs"/etc/apk/repositories || return 1
565N/A fi
565N/A opt_arch=
565N/A if [ -n "$apk_arch" ]; then
565N/A opt_arch="--arch $apk_arch"
565N/A fi
565N/A ${APK:-apk} add -U --initdb --root $rootfs $opt_arch alpine-base
565N/A}
565N/A
565N/Aconfigure_alpine() {
565N/A rootfs="$1"
565N/A echo "Setting up /etc/inittab"
926N/A cat >"$rootfs"/etc/inittab<<EOF
926N/A::sysinit:/sbin/rc sysinit
2197N/A::wait:/sbin/rc default
926N/Atty1:12345:respawn:/sbin/getty 38400 tty1
565N/A::ctrlaltdel:/sbin/reboot
2026N/A::shutdown:/sbin/rc shutdown
1050N/AEOF
926N/A # set up nameserver
926N/A grep nameserver /etc/resolv.conf > "$rootfs/etc/resolv.conf"
926N/A
926N/A # configure the network using the dhcp
926N/A # note that lxc will set up lo interface
838N/A cat <<EOF > $rootfs/etc/network/interfaces
565N/A#auto lo
2034N/Aiface lo inet loopback
2034N/A
2034N/Aauto eth0
1540N/Aiface eth0 inet dhcp
1540N/AEOF
1540N/A
1540N/A # set the hostname
1540N/A echo $hostname > $rootfs/etc/hostname
1968N/A
1540N/A # missing device nodes
2034N/A echo "Setting up device nodes"
2034N/A mkdir -p -m 755 "$rootfs/dev/pts"
2200N/A mkdir -p -m 1777 "$rootfs/dev/shm"
2034N/A mknod -m 666 "$rootfs/dev/full" c 1 7
2034N/A mknod -m 666 "$rootfs/dev/random" c 1 8
2034N/A mknod -m 666 "$rootfs/dev/urandom" c 1 9
565N/A mknod -m 666 "$rootfs/dev/tty0" c 4 0
1710N/A mknod -m 666 "$rootfs/dev/tty1" c 4 1
1710N/A mknod -m 666 "$rootfs/dev/tty2" c 4 2
1710N/A mknod -m 666 "$rootfs/dev/tty3" c 4 3
1710N/A mknod -m 666 "$rootfs/dev/tty4" c 4 4
1710N/A# mknod -m 600 "$rootfs/dev/initctl" p
1710N/A mknod -m 666 "$rootfs/dev/tty" c 5 0
1710N/A mknod -m 666 "$rootfs/dev/console" c 5 1
1710N/A mknod -m 666 "$rootfs/dev/ptmx" c 5 2
1710N/A
1710N/A # start services
1710N/A ln -s /etc/init.d/syslog "$rootfs"/etc/runlevels/default/syslog
1710N/A
1710N/A return 0
1710N/A}
1710N/A
1710N/Acopy_configuration() {
1710N/A path=$1
1710N/A rootfs=$2
1710N/A hostname=$3
1710N/A
1710N/A grep -q "^lxc.rootfs" $path/config 2>/dev/null \
1710N/A || echo "lxc.rootfs = $rootfs" >> $path/config
1710N/A if [ -n "$lxc_arch" ]; then
1710N/A echo "lxc.arch = $lxc_arch" >> $path/config
1710N/A fi
1710N/A cat <<EOF >> $path/config
1710N/Alxc.tty = 4
1710N/Alxc.pts = 1024
1710N/Alxc.utsname = $hostname
1710N/A
1710N/A# When using LXC with apparmor, uncomment the next line to run unconfined:
565N/A#lxc.aa_profile = unconfined
565N/A
565N/A# network interface
565N/Alxc.network.name = eth0
565N/Alxc.network.type = veth
565N/Alxc.network.flags = up
565N/A# enable for bridging
565N/A#lxc.network.link = br0
2144N/A#lxc.network.ipv4 = n.n.n.n
2158N/A#lxc.network.ipv4.gateway = auto
2158N/A
2158N/A# devices
2158N/Alxc.cgroup.devices.deny = a
2158N/A# /dev/null and zero
2158N/Alxc.cgroup.devices.allow = c 1:3 rwm
2158N/Alxc.cgroup.devices.allow = c 1:5 rwm
2158N/A# consoles
2158N/Alxc.cgroup.devices.allow = c 5:1 rwm
2158N/Alxc.cgroup.devices.allow = c 5:0 rwm
2158N/Alxc.cgroup.devices.allow = c 4:0 rwm
2158N/Alxc.cgroup.devices.allow = c 4:1 rwm
2158N/A# /dev/{,u}random
2158N/Alxc.cgroup.devices.allow = c 1:9 rwm
2158N/Alxc.cgroup.devices.allow = c 1:8 rwm
2158N/Alxc.cgroup.devices.allow = c 136:* rwm
2158N/Alxc.cgroup.devices.allow = c 5:2 rwm
2158N/A# rtc
2144N/Alxc.cgroup.devices.allow = c 254:0 rwm
2144N/A
2144N/A# mounts point
2144N/Alxc.mount.entry=proc proc proc nodev,noexec,nosuid 0 0
2144N/Alxc.mount.entry=run run tmpfs nodev,noexec,nosuid,relatime,size=1m,mode=0755 0 0
2144N/Alxc.mount.entry=none dev/pts devpts gid=5,mode=620 0 0
2144N/A
2144N/AEOF
2144N/A
2144N/A return 0
2144N/A}
2144N/A
2144N/Adie() {
2144N/A echo "$@" >&2
565N/A exit 1
565N/A}
565N/A
565N/Ausage() {
565N/A cat >&2 <<EOF
565N/AUsage: $(basename $0) [-h|--help] [-r|--repository <url>] [-a|--arch <arch>]
2144N/A -p|--path <path> -n|--name <name>
565N/AEOF
565N/A}
565N/A
565N/Ausage_err() {
565N/A usage
1618N/A exit 1
1618N/A}
1618N/A
1618N/Aoptarg_check() {
1618N/A if [ -z "$2" ]; then
1618N/A usage_err "option '$1' requires an argument"
1755N/A fi
1755N/A}
1755N/A
1755N/Adefault_path=@LXCPATH@
1755N/A
1755N/Awhile [ $# -gt 0 ]; do
1755N/A opt="$1"
1755N/A shift
1755N/A case "$opt" in
1755N/A -h|--help)
1755N/A usage
1755N/A exit 0
1755N/A ;;
1755N/A -n|--name)
1755N/A optarg_check $opt "$1"
1755N/A name=$1
1755N/A shift
1618N/A ;;
1618N/A -p|--path)
1618N/A optarg_check $opt "$1"
1618N/A path=$1
1618N/A shift
1618N/A ;;
1618N/A -r|--repository)
1618N/A optarg_check $opt "$1"
1618N/A repository=$1
1618N/A shift
1618N/A ;;
1618N/A -a|--arch)
1618N/A optarg_check $opt "$1"
1618N/A arch=$1
1618N/A shift
1618N/A ;;
1618N/A --)
1618N/A break;;
1618N/A --*=*)
1618N/A # split --myopt=foo=bar into --myopt foo=bar
1618N/A set -- ${opt%=*} ${opt#*=} "$@"
1618N/A ;;
1618N/A -?)
1618N/A usage_err "unknown option '$opt'"
1618N/A ;;
1618N/A -*)
1618N/A # split opts -abc into -a -b -c
1618N/A set -- $(echo "${opt#-}" | sed 's/\(.\)/ -\1/g') "$@"
1618N/A ;;
1618N/A *)
1618N/A usage
1618N/A exit 1
1618N/A ;;
1618N/A esac
1618N/Adone
1618N/A
1618N/A
1618N/A[ -z "$name" ] && usage_err
1618N/A
1618N/Aif [ -z "${path}" ]; then
1618N/A path="${default_path}/${name}"
1618N/Afi
1618N/A
1618N/Arootfs=`awk -F= '$1 ~ /^lxc.rootfs/ { print $2 }' "$path/config" 2>/dev/null`
1618N/Aif [ -z "$rootfs" ]; then
1618N/A rootfs="${path}/rootfs"
1618N/Afi
1618N/A
1618N/Alxc_arch=$arch
1618N/Aapk_arch=$arch
1618N/A
1618N/Acase "$arch" in
1618N/A i[3-6]86)
1618N/A apk_arch=x86;;
1618N/A x86)
1618N/A lxc_arch=i686;;
1618N/A x86_64|"") ;;
1618N/A *) die "unsupported architecture: $arch";;
1618N/Aesac
1618N/A
1618N/Ainstall_alpine "$rootfs" || die "Failed to install rootfs for $name"
1618N/Aconfigure_alpine "$rootfs" "$name" || die "Failed to configure $name"
1618N/Acopy_configuration "$path" "$rootfs" "$name"
1618N/A