From 852880eff7be980c5bd4c86e8451a4e120a054a7 Mon Sep 17 00:00:00 2001 From: Balbir Singh Date: Mon, 14 Apr 2008 21:11:40 +0000 Subject: Add init scripts and a README. NOTE: These init scripts will change frequently and drastically. Signed-off-by: Balbir Singh git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/branches/balbir@14 4f4bb910-9a46-0410-90c8-c897d4f1cd53 --- scripts/README | 4 + scripts/doc/howto.txt | 62 ++++++++++++ scripts/etc/wlm.conf | 16 +++ scripts/etc/wlm/cpu.conf | 14 +++ scripts/init.d/wlm | 253 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 349 insertions(+) create mode 100644 scripts/README create mode 100644 scripts/doc/howto.txt create mode 100644 scripts/etc/wlm.conf create mode 100644 scripts/etc/wlm/cpu.conf create mode 100755 scripts/init.d/wlm diff --git a/scripts/README b/scripts/README new file mode 100644 index 0000000..8007b60 --- /dev/null +++ b/scripts/README @@ -0,0 +1,4 @@ +NOTE: These are temporary intermediate scripts, till libcg is up and running +on its own. The current parser works, but has a lot of band-aid around it. +We need a good cleanroom implementation of the parser. Doing so, would +enable us to build a good daemon and a set of init scripts around it. diff --git a/scripts/doc/howto.txt b/scripts/doc/howto.txt new file mode 100644 index 0000000..38c95e3 --- /dev/null +++ b/scripts/doc/howto.txt @@ -0,0 +1,62 @@ +initscripts - Initialization scripts; they are used to initialize the workload +management system. The script consists of two major components + +Configuration files +------------------- + +The main configuraiton file /etc/wlm.conf. This file has a format + +mount + + +A sample configuration file is included below + +# +# controller file +# +mount /container cpu +cpu /etc/wlm/cpu.conf + +NOTE: Any line beginning with '#' is ignored as comments. The sample +configuration above, mounts the cpu controller at mount point /container. +It then parses /etc/wlm/cpu.conf as the configuration file for the +cpu controller. + +The controller configuration file is of the format + + + +In the case of the CPU controller a sample configuration would look +like + +class1 cpu.shares=1024 +class2 cpu.shares=512 + +The configuration below creates two classes class1 and class2 and +assigns shares of 1024 to class1 and 512 to class1. + +Intialization script +-------------------- + +The initialization script is installed in /etc/init.d, it is called +"wlm". Depending on the run-level, it is installed in the appropriate +/etc/rc.d/rc.d. The script comes with two options + +a. start + +start, starts the workload management, parses the configuration file. +If required creates the mount point directory and then mounts the +cgroup filesystem with the controllers specified. + +b. stop + +stops workload management, moves all tasks from various groups to +the root class. It then removes all other classes and then unmounts +the workload management system. + +Assumptions +----------- + +1. The kernel is compiled in with the correct options to support + cgroups and the CPU controller. +2. This version has been tested with 2.6.24-rc1 only. diff --git a/scripts/etc/wlm.conf b/scripts/etc/wlm.conf new file mode 100644 index 0000000..01a12b3 --- /dev/null +++ b/scripts/etc/wlm.conf @@ -0,0 +1,16 @@ +# +# Copyright IBM Corporation. 2008 +# +# Authors: Balbir Singh +# This program is free software; you can redistribute it and/or modify it +# under the terms of version 2.1 of the GNU Lesser General Public License +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# controller file +# +mount /tmp/container cpu +cpu /etc/wlm/cpu.conf diff --git a/scripts/etc/wlm/cpu.conf b/scripts/etc/wlm/cpu.conf new file mode 100644 index 0000000..10ac391 --- /dev/null +++ b/scripts/etc/wlm/cpu.conf @@ -0,0 +1,14 @@ +# +# Copyright IBM Corporation. 2008 +# +# Authors: Balbir Singh +# This program is free software; you can redistribute it and/or modify it +# under the terms of version 2.1 of the GNU Lesser General Public License +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +class1 cpu.shares=1024 tuid=balbir tgid=balbir cuid=root cgid=root +class2 cpu.shares=512 tuid=root tgid=root cuid=balbir cgid=balbir diff --git a/scripts/init.d/wlm b/scripts/init.d/wlm new file mode 100755 index 0000000..ed463f6 --- /dev/null +++ b/scripts/init.d/wlm @@ -0,0 +1,253 @@ +# +# Start/Stop the workload manager +# +# Copyright IBM Corporation. 2008 +# +# Authors: Balbir Singh +# This program is free software; you can redistribute it and/or modify it +# under the terms of version 2.1 of the GNU Lesser General Public License +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# +# TODO: Make this code more robust, add error checking and recovery +# for invalid configuration or interrupted execution +# +# Make the script LSB compliant +# + +CONF_FILE=/etc/wlm.conf +PROC_CGROUPS_FILE=/proc/cgroups +CGROUP_FS=cgroup +MOUNT_POINT=/dev/container +#MOUNT_OPTS=cpu +IGNORE_OPTS="ns cpuset" + +parse_controller_file() { + ctlr=$1 + file=$2 + tuid="root" + tgid="root" + cuid="root" + cgid="root" + + pushd $PWD 2>&1 > /dev/null + while read name opts + do + case $name in + 'mount') + ;; + *) + echo "Creating class $name" + class=$name + mkdir -p $MOUNTPOINT/$class + cd $MOUNTPOINT/$class + + if echo $opts | grep -q "=" + then + for single_opt in $opts + do + cf=`echo $single_opt | cut -d '=' -f1` + co=`echo $single_opt | cut -d '=' -f2` + case $cf in + "tuid") + tuid=$co + ;; + "cuid") + cuid=$co + ;; + "tgid") + tgid=$co + ;; + "cgid") + cgid=$co + ;; + *) + echo -n $co > $cf + ;; + esac + done + chown -R $cuid:$cgid $MOUNTPOINT/$class + chown -R $tuid:$tgid $MOUNTPOINT/$class/tasks + fi + esac + done < $file + popd 2>&1 > /dev/null +} + +parse_controller_opts() { + name=$1; + file=$2; + + if [ ! -r $PROC_CGROUPS_FILE ] + then + echo "$PROC_CGROUPS_FILE does not exist, please compile" + echo "cgroups into the kernel" + exit 1 + else + line=`grep -w $name $PROC_CGROUPS_FILE` + if [ $? -ne 0 ] + then + echo "$name controller not enabled" + exit 1 + fi + + active=`echo $line | awk '{print $2}'` + if [[ $active -eq 0 ]] + then + echo "$name controller not mounted" + else + parse_controller_file $name $file + fi + fi +} + +parse_conf_file() { + while read name conf + do + # skip all comments + if ! echo $name | grep -q ^# + then + case $name in + 'mount') + MOUNTPOINT=`echo $conf | cut -d ' ' -f1`; + MOUNTOPTS=`echo $conf | cut -d ' ' -f2`; + ;; + esac + fi + done < $CONF_FILE + + return 0; +} + +mount_fs() { + if [ ! -r $PROC_CGROUPS_FILE ] + then + echo "$PROC_CGROUPS_FILE does not exist, please compile" + echo "cgroups into the kernel" + exit 1 + else + while read name hierarchy num_cgroups + do + if ! echo $name | grep -q ^# + then + echo $IGNORE_OPTS | grep -wq $name + if [[ $? -ne 0 ]] + then + MOUNT_OPTS=$name","$MOUNT_OPTS + fi + fi + done < $PROC_CGROUPS_FILE + MOUNT_OPTS=${MOUNT_OPTS%%","} + #line=`grep -w $MOUNT_OPTS $PROC_CGROUPS_FILE` + #if [ $? -ne 0 ] + #then + # echo "$name controller not enabled" + # exit 1 + #fi + fi + mkdir -p $MOUNTPOINT + mount -t $CGROUP_FS $CGROUP_FS -o $MOUNT_OPTS $MOUNTPOINT + # + # Give root tasks read/write permission to all, since tasks + # tasks will be moved to root frequently + # + chmod ago+rwx $MOUNTPOINT/tasks + chmod ago+rwx $MOUNTPOINT + chmod +t $MOUNTPOINT + return $? +} + +umount_fs() { + umount $MOUNTPOINT + rmdir $MOUNTPOINT +} + +create_classes() { + while read name conf + do + # skip all comments + if ! echo $name | grep -q ^# + then + case $name in + 'mount') + ;; + *) + parse_controller_opts $name $conf + esac + fi + + done < $CONF_FILE +} + +start() { + echo "Starting wlm service: " + mount_fs + if [ $? -eq 0 ] + then + create_classes + fi + [ $? == 0 ] && touch /var/lock/subsys/wlm + return $? +} + +move_all_to_init_class() { + cd $MOUNTPOINT + cat /proc/mounts | grep -w $MOUNTPOINT + if [ $? -ne 0 ] + then + echo "resource control filesystem not mounted" + exit 1 + fi + + for i in `find . -type d` + do + case $i in + '.') + ;; + *) + class=${i#./*} + echo "Removing class $class" + sed -nu p < ./$i/tasks > tasks + rmdir $i + ;; + esac + done + cd - > /dev/null +} + + +stop() { + move_all_to_init_class + umount_fs +} + +trapped() { + # + # Do nothing + # + true +} + +# +# main script work done here +# +trap "trapped ABRT" ABRT +trap "trapped QUIT" QUIT +trap "trapped TERM" TERM +trap "trapped INT" INT + +parse_conf_file + +case $1 in + 'start') + start; + ;; + 'stop') + stop; + ;; +esac + -- cgit