[lxc-devel] [PATCH] templates: initial support for Alpine Linux
Natanael Copa
ncopa at alpinelinux.org
Mon Dec 24 16:18:21 UTC 2012
Requires apk-tools (http://git.alpinelinux.org/cgit/apk-tools)
Signed-off-by: Natanael Copa <ncopa at alpinelinux.org>
---
.gitignore | 1 +
configure.ac | 1 +
templates/lxc-alpine.in | 190 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 192 insertions(+)
create mode 100644 templates/lxc-alpine.in
diff --git a/.gitignore b/.gitignore
index a766716..7401b55 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,6 +24,7 @@ libtool
lxc.spec
lxc.pc
+templates/lxc-alpine
templates/lxc-altlinux
templates/lxc-archlinux
templates/lxc-busybox
diff --git a/configure.ac b/configure.ac
index c4f1b2e..2add6a3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -257,6 +257,7 @@ AC_CONFIG_FILES([
templates/lxc-altlinux
templates/lxc-sshd
templates/lxc-archlinux
+ templates/lxc-alpine
src/Makefile
src/lxc/Makefile
diff --git a/templates/lxc-alpine.in b/templates/lxc-alpine.in
new file mode 100644
index 0000000..6f7c90d
--- /dev/null
+++ b/templates/lxc-alpine.in
@@ -0,0 +1,190 @@
+#!/bin/sh
+
+install_alpine() {
+ rootfs="$1"
+ mkdir -p "$rootfs"/etc/apk || return 1
+ cp -r ${keys_dir:-/etc/apk/keys} "$rootfs"/etc/apk/
+ if [ -n "$repository" ]; then
+ echo "$repository" > "$rootfs"/etc/apk/repositories
+ else
+ cp /etc/apk/repositories "$rootfs"/etc/apk/repositories || return 1
+ fi
+ ${APK:-apk} add -U --initdb --root $rootfs alpine-base
+}
+
+configure_alpine() {
+ rootfs="$1"
+ echo "Setting up /etc/inittab"
+ cat >"$rootfs"/etc/inittab<<EOF
+::sysinit:/sbin/rc sysinit
+::wait:/sbin/rc default
+tty1:12345:respawn:/sbin/getty 38400 tty1
+::ctrlaltdel:/sbin/reboot
+::shutdown:/sbin/rc shutdown
+EOF
+ # set up nameserver
+ grep nameserver /etc/resolv.conf > "$rootfs/etc/resolv.conf"
+
+ # configure the network using the dhcp
+ # note that lxc will set up lo interface
+ cat <<EOF > $rootfs/etc/network/interfaces
+#auto lo
+iface lo inet loopback
+
+auto eth0
+iface eth0 inet dhcp
+EOF
+
+ # set the hostname
+ echo $hostname > $rootfs/etc/hostname
+
+ # missing device nodes
+ echo "Setting up device nodes"
+ mkdir -p -m 755 "$rootfs/dev/pts"
+ mkdir -p -m 1777 "$rootfs/dev/shm"
+ mknod -m 666 "$rootfs/dev/full" c 1 7
+ mknod -m 666 "$rootfs/dev/random" c 1 8
+ mknod -m 666 "$rootfs/dev/urandom" c 1 9
+ mknod -m 666 "$rootfs/dev/tty0" c 4 0
+ mknod -m 666 "$rootfs/dev/tty1" c 4 1
+ mknod -m 666 "$rootfs/dev/tty2" c 4 2
+ mknod -m 666 "$rootfs/dev/tty3" c 4 3
+ mknod -m 666 "$rootfs/dev/tty4" c 4 4
+# mknod -m 600 "$rootfs/dev/initctl" p
+ mknod -m 666 "$rootfs/dev/tty" c 5 0
+ mknod -m 666 "$rootfs/dev/console" c 5 1
+ mknod -m 666 "$rootfs/dev/ptmx" c 5 2
+
+ # start services
+ ln -s /etc/init.d/syslog "$rootfs"/etc/runlevels/default/syslog
+
+ return 0
+}
+
+copy_configuration() {
+ path=$1
+ rootfs=$2
+ hostname=$3
+
+ grep -q "^lxc.rootfs" $path/config 2>/dev/null \
+ || echo "lxc.rootfs = $rootfs" >> $path/config
+ cat <<EOF >> $path/config
+lxc.tty = 4
+lxc.pts = 1024
+lxc.utsname = $hostname
+
+# When using LXC with apparmor, uncomment the next line to run unconfined:
+#lxc.aa_profile = unconfined
+
+# network interface
+lxc.network.name = eth0
+lxc.network.type = veth
+lxc.network.flags = up
+# enable for bridging
+#lxc.network.link = br0
+#lxc.network.ipv4 = n.n.n.n
+#lxc.network.ipv4.gateway = auto
+
+# devices
+lxc.cgroup.devices.deny = a
+# /dev/null and zero
+lxc.cgroup.devices.allow = c 1:3 rwm
+lxc.cgroup.devices.allow = c 1:5 rwm
+# consoles
+lxc.cgroup.devices.allow = c 5:1 rwm
+lxc.cgroup.devices.allow = c 5:0 rwm
+lxc.cgroup.devices.allow = c 4:0 rwm
+lxc.cgroup.devices.allow = c 4:1 rwm
+# /dev/{,u}random
+lxc.cgroup.devices.allow = c 1:9 rwm
+lxc.cgroup.devices.allow = c 1:8 rwm
+lxc.cgroup.devices.allow = c 136:* rwm
+lxc.cgroup.devices.allow = c 5:2 rwm
+# rtc
+lxc.cgroup.devices.allow = c 254:0 rwm
+
+# mounts point
+lxc.mount.entry=proc proc proc nodev,noexec,nosuid 0 0
+lxc.mount.entry=run run tmpfs nodev,noexec,nosuid,relatime,size=1m,mode=0755 0 0
+lxc.mount.entry=none dev/pts devpts gid=5,mode=620 0 0
+
+EOF
+
+ return 0
+}
+
+die() {
+ echo "$@" >&2
+ exit 1
+}
+
+usage() {
+ echo "Usage: $(basename $0) [-h|--help] -p|--path <path> -n|--name <name>" >&2
+}
+
+usage_err() {
+ usage
+ exit 1
+}
+
+optarg_check() {
+ if [ -z "$2" ]; then
+ usage_err "option '$1' requires an argument"
+ fi
+}
+
+default_path=@LXCPATH@
+
+while [ $# -gt 0 ]; do
+ opt="$1"
+ shift
+ case "$opt" in
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ -n|--name)
+ optarg_check $opt "$1"
+ name=$1
+ shift
+ ;;
+ -p|--path)
+ optarg_check $opt "$1"
+ path=$1
+ shift
+ ;;
+ --)
+ break;;
+ --*=*)
+ # split --myopt=foo=bar into --myopt foo=bar
+ set -- ${opt%=*} ${opt#*=} "$@"
+ ;;
+ -?)
+ usage_err "unknown option '$opt'"
+ ;;
+ -*)
+ # split opts -abc into -a -b -c
+ set -- $(echo "${opt#-}" | sed 's/\(.\)/ -\1/g') "$@"
+ ;;
+ *)
+ usage
+ exit 1
+ ;;
+ esac
+done
+
+
+[ -z "$name" ] && usage_err
+
+if [ -z "${path}" ]; then
+ path="${default_path}/${name}"
+fi
+
+rootfs=`awk -F= '$1 ~ /^lxc.rootfs/ { print $2 }' "$path/config" 2>/dev/null`
+if [ -z "$rootfs" ]; then
+ rootfs="${path}/rootfs"
+fi
+
+install_alpine "$rootfs" || die "Failed to install rootfs for $name"
+configure_alpine "$rootfs" "$name" || die "Failed to configure $name"
+copy_configuration "$path" "$rootfs" "$name"
--
1.8.0.2
More information about the lxc-devel
mailing list