]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
template: Add Plamo Linux template
authorKATOH Yasufumi <karma@jazz.email.ne.jp>
Wed, 9 Oct 2013 10:00:32 +0000 (19:00 +0900)
committerStéphane Graber <stgraber@ubuntu.com>
Thu, 10 Oct 2013 02:51:49 +0000 (22:51 -0400)
This template allows to create Plamo Linux container on Plamo
Linux. Plamo Linux is Japanese distribution, which is originally based
on Slackware Linux.

Signed-off-by: KATOH Yasufumi <karma@jazz.email.ne.jp>
Signed-off-by: TAMUKI Shoichi <tamuki@linet.gr.jp>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
.gitignore
configure.ac
templates/Makefile.am
templates/lxc-plamo.in [new file with mode: 0644]

index 4e86614cfbfd7664e8f94b90dccbf616c928007e..c758554441069921e561e8a5d40b5ea246ad84c8 100644 (file)
@@ -34,6 +34,7 @@ templates/lxc-debian
 templates/lxc-fedora
 templates/lxc-opensuse
 templates/lxc-oracle
+templates/lxc-plamo
 templates/lxc-sshd
 templates/lxc-ubuntu
 templates/lxc-ubuntu-cloud
index ce4e302955248ed5735418152fec7d70488764cd..9f5e833b4968122060158910fea10708de14bf61 100644 (file)
@@ -510,6 +510,7 @@ AC_CONFIG_FILES([
        templates/lxc-sshd
        templates/lxc-archlinux
        templates/lxc-alpine
+       templates/lxc-plamo
 
        src/Makefile
        src/lxc/Makefile
index 98d6d72c3cbf408ee3025de690898638d2701a4c..e300a471d11f630595b05bc0c620c7dea00b1210 100644 (file)
@@ -12,4 +12,5 @@ templates_SCRIPTS = \
        lxc-sshd \
        lxc-archlinux \
        lxc-alpine \
-       lxc-cirros
+       lxc-cirros \
+       lxc-plamo
diff --git a/templates/lxc-plamo.in b/templates/lxc-plamo.in
new file mode 100644 (file)
index 0000000..8186657
--- /dev/null
@@ -0,0 +1,388 @@
+#!/bin/bash
+
+#
+# template script for generating Plamo Linux container for LXC
+#
+
+#
+# lxc: linux Container library
+
+# Authors:
+# KATOH Yasufumi <karma@jazz.email.ne.jp>
+# TAMUKI Shoichi <tamuki@linet.gr.jp>
+
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+# ref. https://github.com/Ponce/lxc-slackware/blob/master/lxc-slackware
+#      lxc-ubuntu script
+
+[ -r /etc/default/lxc ] && . /etc/default/lxc
+
+MIRRORSRV=${MIRRORSRV:-"ftp.ne.jp"}
+MIRRORPATH=${MIRRORPATH:-"/Linux/distributions/plamolinux"}
+CATEGORY[0]=${CATEGORY:-"00_base"}
+PACKAGES[0]=${PACKAGES:-"aaa_base acl at attr bash btrfs_progs bzip2
+    coreutils cracklib dcron devs dhcp dialog dosfstools dump e2fsprogs
+    ed eject etc extipl file findutils gawk glibc grep groff grub gzip
+    hdsetup hibernate_script iproute2 iputils kbd kmod less libcap
+    libgcc libtirpc lilo linux_pam logrotate lvm2 man
+    mdadm microcode_ctl mlocate ncurses net_tools netkit_combo
+    network_configs nvi openbsd_inetd openssh openssl os_prober pciutils
+    pm_utils procinfo_ng procps_ng readline reiserfsprogs rsyslog sed
+    shadow sudo sysfsutils syslinux sysvinit tar tcp_wrappers tcsh
+    timezone traceroute udev unicon_tools util_linux xz zlib"}
+CATEGORY[1]="01_minimum"
+PACKAGES[1]="FDclone autofs bc berkeley_db bsd_games cpio cpufreqd
+    cpufrequtils fortune_mod gc gdbm gpm hddtemp hdparm keyutils libelf
+    libieee1284 libusb libusb_compat libxml2 libzip linux_howto lm_sensors
+    lshw lsof lv man_pages man_pages_ja nilfs_utils nkf pcre perl popt
+    psmisc python recode rpm2targz ruby screen sg3_utils sharutils sqlite
+    squashfs_lzma sysstat texinfo time tree unzip usbutils utempter which
+    yaml zip zsh"
+CATEGORY[2]="01_minimum/alsa.txz"
+PACKAGES[2]="alsa_lib alsa_plugins alsa_utils"
+CATEGORY[3]="01_minimum/aspell.txz"
+PACKAGES[3]="aspell aspell6_en"
+CATEGORY[4]="01_minimum/devel.txz"
+PACKAGES[4]="autoconf automake binutils bison cloog cvs diffutils flex
+    g++ gcc gdb gettext gmp indent intltool kernel_headers libc libtool
+    m4 make mpc mpfr onig patch pkg_config ppl pth slang strace yasm"
+CATEGORY[5]="01_minimum/gnupg_tls.txz"
+PACKAGES[5]="gnupg gnutls gpgme libassuan libgcrypt libgpg_error libksba
+    libtasn1"
+CATEGORY[6]="01_minimum/network.txz"
+PACKAGES[6]="bind bridge_utils curl cyrus_sasl dnsmasq ethtool fetchmail
+    heimdal hostapd iptables iw libidn libiec61883 libnl3 libpcap
+    libraw1394 libssh2 mailx metamail ncftp ntrack parprouted postfix
+    ppp procmail rsync setserial uml_utilities w3m wget wireless_tools
+    wpa_supplicant"
+CATEGORY[7]="01_minimum/nfs.txz"
+PACKAGES[7]="libevent libnfsidmap nfs_utils rpcbind"
+CATEGORY[8]="01_minimum/tcl.txz"
+PACKAGES[8]="expect itcl tcl tclx"
+
+download_plamo() {
+  # check the mini plamo was not already downloaded
+  if ! mkdir -p $ptcache ; then
+    echo "Failed to create '$ptcache' directory."
+    return 1
+  fi
+  # download a mini plamo into a cache
+  echo "Downloading Plamo-$release minimal..."
+  echo "open $MIRRORSRV" > /tmp/getpkg
+  for i in `seq 0 $((${#CATEGORY[@]} - 1))` ; do
+    for p in ${PACKAGES[$i]} ; do
+      cat <<- EOF >> /tmp/getpkg
+       mget $MIRRORPATH/Plamo-$release/$arch/plamo/${CATEGORY[$i]}/$p-*.t?z
+       EOF
+    done
+  done
+  echo "close" >> /tmp/getpkg
+  cd $ptcache
+  if ! lftp -f /tmp/getpkg ; then
+    echo "Failed to download the rootfs, aborting."
+    return 1
+  fi
+  rm -f /tmp/getpkg
+  mv $ptcache $dlcache
+  echo "Download complete."
+  return 0
+}
+
+copy_plamo() {
+  # make a local copy of the mini plamo
+  echo "Copying $rtcache to $rootfs..."
+  mkdir -p $rootfs
+  find $rtcache -mindepth 1 -maxdepth 1 -exec cp -a {} $rootfs \; || return 1
+  return 0
+}
+
+install_plamo() {
+  mkdir -p @LOCALSTATEDIR@/lock/subsys
+  (
+    if ! flock -n 200 ; then
+      echo "Cache repository is busy."
+      return 1
+    fi
+    echo "Checking cache download in $dlcache..."
+    if [ ! -d $dlcache ] ; then
+      if ! download_plamo ; then
+        echo "Failed to download plamo $release base packages."
+        return 1
+      fi
+    fi
+    echo "Installing packages to $rtcache..."
+    if [ ! -d $rtcache ] ; then
+      mkdir -p $rtcache
+      for i in `seq 0 $((${#CATEGORY[@]} - 1))` ; do
+        for p in ${PACKAGES[$i]} ; do
+          installpkg -root $rtcache -priority ADD $dlcache/$p-*.t?z
+        done
+      done
+    fi
+    echo "Copy $rtcache to $rootfs..."
+    if ! copy_plamo ; then
+      echo "Failed to copy rootfs."
+      return 1
+    fi
+    return 0
+  ) 200> @LOCALSTATEDIR@/lock/subsys/lxc
+}
+
+configure_plamo() {
+  # create /dev
+  mknod -m 666 $rootfs/dev/zero c 1 5
+  chmod    666 $rootfs/dev/random
+  mknod -m 666 $rootfs/dev/urandom c 1 9
+  mkdir -m 755 $rootfs/dev/pts
+  chmod    666 $rootfs/dev/tty
+  chmod    600 $rootfs/dev/console
+  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 666 $rootfs/dev/full c 1 7
+  mknod -m 600 $rootfs/dev/initctl p
+  mknod -m 666 $rootfs/dev/ptmx c 5 2
+  # suppress log level output for udev
+  sed -i 's/="err"/=0/' $rootfs/etc/udev/udev.conf
+  # /etc/fstab
+  cat <<- "EOF" > $rootfs/etc/fstab
+       none             /proc    proc        defaults   0   0
+       none             /sys     sysfs       defaults   0   0
+       none             /dev     tmpfs       defaults   0   0
+       none                /tmp     tmpfs       defaults   0   0
+       none            /dev/pts        devpts  gid=5,mode=620    0 0
+       none            /proc/bus/usb             usbfs        noauto   0   0
+       none             /var/lib/nfs/rpc_pipefs rpc_pipefs  defaults   0   0
+       EOF
+  # /etc/inittab
+  cat <<- "EOF" | patch $rootfs/etc/inittab
+       47a48
+       > 1:1235:respawn:/sbin/agetty 38400 console
+       52,53d52
+       < c5:1235:respawn:/sbin/agetty 38400 tty5 linux
+       < c6:12345:respawn:/sbin/agetty 38400 tty6 linux
+       EOF
+  # set the hostname
+  echo "$name" > $rootfs/etc/HOSTNAME
+  # set minimal hosts
+  echo "127.0.0.1 localhost $name" > $rootfs/etc/hosts
+  # configure the network using the dhcp
+  echo "DHCP" > $rootfs/var/run/inet1-scheme
+  # localtime (JST)
+  ln -s ../usr/share/zoneinfo/Asia/Tokyo $rootfs/etc/localtime
+  # disable pam_loginuid.so in /etc/pam.d/login (for libvirt's lxc driver)
+  sed -i '/pam_loginuid/s/^/#/' $rootfs/etc/pam.d/login
+  # root password
+  echo "Setting root password to 'root'..."
+  echo "root:root" | chroot $rootfs chpasswd
+  echo "Please change root password!"
+  # /etc/rc.d/rc.S
+  ed - $rootfs/etc/rc.d/rc.S <<- "EOF"
+       230,261d
+       156,163d
+       26,147d
+       16,22d
+       w
+       EOF
+  # /etc/rc.d/rc.M
+  ed - $rootfs/etc/rc.d/rc.M <<- "EOF"
+       247,248d
+       56,79d
+       31,38d
+       w
+       EOF
+  # /etc/rc.d/rc.inet1.tradnet
+  head -n-93 $rootfs/sbin/netconfig.tradnet > /tmp/netconfig.rconly
+  cat <<- EOF >> /tmp/netconfig.rconly
+       PCMCIA=n
+       RC=$rootfs/etc/rc.d/rc.inet1.tradnet
+       IFCONFIG=sbin/ifconfig
+       ROUTE=sbin/route
+       INET1SCHEME=var/run/inet1-scheme
+       IPADDR=127.0.0.1
+       NETWORK=127.0.0.0
+       DHCPCD=usr/sbin/dhclient
+       LOOPBACK=y
+       make_config_file
+       EOF
+  rm -f $rootfs/etc/rc.d/rc.inet1.tradnet
+  sh /tmp/netconfig.rconly
+  rm -f /tmp/netconfig.rconly
+  return 0
+}
+
+copy_configuration() {
+  if ! cat <<- EOF >> $path/config ; then
+       lxc.utsname = $name
+       
+       lxc.tty = 4
+       lxc.pts = 1024
+       lxc.mount.auto = proc sys cgroup
+       lxc.arch = $arch
+       lxc.cap.drop = sys_module mac_admin mac_override sys_time
+       
+       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:0 rwm
+       lxc.cgroup.devices.allow = c 5:1 rwm
+       # /dev/{,u}random
+       lxc.cgroup.devices.allow = c 1:8 rwm
+       lxc.cgroup.devices.allow = c 1:9 rwm
+       lxc.cgroup.devices.allow = c 5:2 rwm
+       lxc.cgroup.devices.allow = c 136:* rwm
+       # rtc
+       lxc.cgroup.devices.allow = c 254:0 rm
+       # fuse
+       lxc.cgroup.devices.allow = c 10:229 rwm
+       EOF
+    echo "Failed to add configuration."
+    return 1
+  fi
+  return 0
+}
+
+post_process() {
+  # nothing do in Plamo Linux
+  true
+}
+
+do_bindhome() {
+  # bind-mount the user's path into the container's /home
+  h=`getent passwd $bindhome | cut -d: -f6`
+  mkdir -p $rootfs/$h
+  echo "$h $rootfs/$h none bind 0 0" >> $path/fstab
+  # copy /etc/passwd, /etc/shadow, and /etc/group entries into container
+  if ! pwd=`getent passwd $bindhome` ; then
+    echo "Warning: failed to copy password entry for $bindhome."
+  else
+    echo $pwd >> $rootfs/etc/passwd
+  fi
+  echo `getent shadow $bindhome` >> $rootfs/etc/shadow
+}
+
+cleanup() {
+  [ -d $dlcache -a -d $rtcache ] || return 0
+  # lock, so we won't purge while someone is creating a repository
+  (
+    if ! flock -n 200 ; then
+      echo "Cache repository is busy."
+      return 1
+    fi
+    echo "Purging the download cache..."
+    rm -rf --one-file-system $dlcache $rtcache || return 1
+    echo "Done."
+    return 0
+  ) 200> @LOCALSTATEDIR@/lock/subsys/lxc
+}
+
+usage() {
+  cat <<- EOF
+       $prog [-h|--help] -p|--path=<path> -n|--name=<name> --rootfs=<rootfs>
+                 [--clean] [-r|--release=<release>] [-b|--bindhome=<user>]
+                 [-a|--arch=<arch>]
+       release: $release
+       bindhome: bind <user>'s home into the container
+       arch: x86 or x86_64: defaults to host arch
+       EOF
+}
+
+prog=`basename $0`
+path="" ; name="" ; rootfs=""
+clean=0
+release=${release:-5.x}
+bindhome=""
+arch=`uname -m | sed 's/i.86/x86/'` ; hostarch=$arch
+sopts=hp:n:cr:b:a:
+lopts=help,path:,name:,rootfs:,clean,release:,bindhome:,arch:
+if ! options=`getopt -o $sopts -l $lopts -- "$@"` ; then
+  usage
+  exit 1
+fi
+eval set -- "$options"
+while true ; do
+  case "$1" in
+  -h|--help) usage && exit 0 ;;
+  -p|--path) path=$2 ; shift 2 ;;
+  -n|--name) name=$2 ; shift 2 ;;
+  --rootfs) rootfs=$2 ; shift 2 ;;
+  -c|--clean) clean=1 ; shift 1 ;;
+  -r|--release) release=$2 ; shift 2 ;;
+  -b|--bindhome) bindhome=$2 ; shift 2 ;;
+  -a|--arch) arch=$2 ; shift 2 ;;
+  --) shift 1 ; break ;;
+  *) break ;;
+  esac
+done
+if [ $clean -eq 1 -a -z "$path" ] ; then
+  cleanup || exit 1
+  exit 0
+fi
+if [ $hostarch == "x86" -a $arch == "x86_64" ] ; then
+  echo "Can't create x86_64 container on x86."
+  exit 1
+fi
+if ! type installpkg ; then
+  echo "'installpkg' command is missing."
+  exit 1
+fi
+if [ -z "$path" ] ; then
+  echo "'path' parameter is required."
+  exit 1
+fi
+if [ -z "$name" ] ; then
+  echo "'name' parameter is required."
+  exit 1
+fi
+if [ `id -u` -ne 0 ] ; then
+  echo "This script should be run as 'root'."
+  exit 1
+fi
+cache=@LOCALSTATEDIR@/cache/lxc
+ptcache=$cache/partial-${prog##*-}-$release-$arch
+dlcache=$cache/cache-${prog##*-}-$release-$arch
+rtcache=$cache/rootfs-${prog##*-}-$release-$arch
+if [ -z "$rootfs" ] ; then
+  if grep -q "^lxc.rootfs" $path/config ; then
+    rootfs=`grep "^lxc.rootfs" $path/config | awk -F= '{print $2}'`
+  else
+    rootfs=$path/rootfs
+  fi
+fi
+if ! install_plamo ; then
+  echo "Failed to install plamo $release."
+  exit 1
+fi
+if ! configure_plamo ; then
+  echo "Failed to configure plamo $release for a container."
+  exit 1
+fi
+if ! copy_configuration ; then
+  echo "Failed to write configuration file."
+  exit 1
+fi
+post_process
+if [ -n "$bindhome" ] ; then
+  do_bindhome
+fi
+if [ $clean -eq 1 ] ; then
+  cleanup || exit 1
+  exit 0
+fi