]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
Add init scripts and a README. NOTE: These init scripts will change
authorBalbir Singh <balbir@linux.vnet.ibm.com>
Mon, 14 Apr 2008 21:11:40 +0000 (21:11 +0000)
committerBalbir Singh <balbir@linux.vnet.ibm.com>
Mon, 14 Apr 2008 21:11:40 +0000 (21:11 +0000)
frequently and drastically.

Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/branches/balbir@14 4f4bb910-9a46-0410-90c8-c897d4f1cd53

scripts/README [new file with mode: 0644]
scripts/doc/howto.txt [new file with mode: 0644]
scripts/etc/wlm.conf [new file with mode: 0644]
scripts/etc/wlm/cpu.conf [new file with mode: 0644]
scripts/init.d/wlm [new file with mode: 0755]

diff --git a/scripts/README b/scripts/README
new file mode 100644 (file)
index 0000000..8007b60
--- /dev/null
@@ -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 (file)
index 0000000..38c95e3
--- /dev/null
@@ -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 <mountpoint>     <list of controllers>
+<controller>           <controller configuration file>
+
+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
+
+<name of the class>    <options>
+
+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<N>.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 (file)
index 0000000..01a12b3
--- /dev/null
@@ -0,0 +1,16 @@
+#
+#  Copyright IBM Corporation. 2008
+# 
+#  Authors:     Balbir Singh <balbir@linux.vnet.ibm.com>
+#  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 (file)
index 0000000..10ac391
--- /dev/null
@@ -0,0 +1,14 @@
+#
+#  Copyright IBM Corporation. 2008
+# 
+#  Authors:     Balbir Singh <balbir@linux.vnet.ibm.com>
+#  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 (executable)
index 0000000..ed463f6
--- /dev/null
@@ -0,0 +1,253 @@
+#
+# Start/Stop the workload manager
+#
+# Copyright IBM Corporation. 2008
+#  
+# Authors:     Balbir Singh <balbir@linux.vnet.ibm.com>
+# 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
+