[lxc-devel] [PATCH] templates: initial support for Alpine Linux

Stéphane Graber stgraber at ubuntu.com
Tue Dec 25 12:01:37 UTC 2012


On 12/24/2012 05:18 PM, Natanael Copa wrote:
> Requires apk-tools (http://git.alpinelinux.org/cgit/apk-tools)
> 
> Signed-off-by: Natanael Copa <ncopa at alpinelinux.org>

I didn't look at it too closely but the usual files have been updated
and I assume the template has been properly tested.

Acked and applied.

> ---
>  .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"
> 


-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 899 bytes
Desc: OpenPGP digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20121225/eab0f55d/attachment.pgp>


More information about the lxc-devel mailing list