X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=vbuild-init-vserver.sh;h=7aed8179af4e188329654c9eb7326851632432ea;hb=refs%2Fheads%2Flxc_devel;hp=843ebe96103cb699506d1303fab25f8f510219e6;hpb=75b08c9098d82c50a3704167532bb128e58f71af;p=build.git diff --git a/vbuild-init-vserver.sh b/vbuild-init-vserver.sh index 843ebe96..7aed8179 100755 --- a/vbuild-init-vserver.sh +++ b/vbuild-init-vserver.sh @@ -82,7 +82,7 @@ EOF function package_method () { fcdistro=$1; shift case $fcdistro in - f[0-9]*|centos[0-9]*) echo yum ;; + f[0-9]*|centos[0-9]*|sl[0-9]*) echo yum ;; lenny|etch) echo debootstrap ;; *) echo Unknown distro $fcdistro ;; esac @@ -102,6 +102,15 @@ function canonical_arch () { esac } +# the new test framework creates /timestamp in /vservers/ *before* populating it +function almost_empty () { + dir="$1"; shift ; + # non existing is fine + [ ! -d $dir ] && return 0; + # need to have at most one file + count=$(cd $dir; ls | wc -l); [ $count -le 1 ]; +} + function setup_vserver () { set -x @@ -112,10 +121,11 @@ function setup_vserver () { fcdistro=$1; shift personality=$1; shift - if [ -d /vservers/$vserver ] ; then + # check that this is a new one - see above + almost_empty /vservers/$vserver || { echo "$COMMAND : vserver $vserver seems to exist - bailing out" exit 1 - fi + } pkg_method=$(package_method $fcdistro) case $pkg_method in @@ -139,8 +149,8 @@ function setup_vserver () { echo "* ${i}-th attempt to 'vserver build' failed - waiting for 3 seconds" sleep 3 done - # check success - [ -d /vservers/$vserver ] + # check success - not enough to check for the directory, let's assume /etc/ in image + [ -d /vservers/$vserver/etc ] if [ ! -z "$personality" ] ; then if [ -f "/etc/vservers/$vserver/personality" ] ; then @@ -153,32 +163,39 @@ function setup_vserver () { fi fi + BCAPFILE=/etc/vservers/$vserver/bcapabilities + touch $BCAPFILE if [ -n "$VBUILD_MODE" ] ; then ### capabilities required for a build vserver # set up appropriate vserver capabilities to mount, mknod and IPC_LOCK - BCAPFILE=/etc/vservers/$vserver/bcapabilities - touch $BCAPFILE - cap=$(grep ^CAP_SYS_ADMIN /etc/vservers/$vserver/bcapabilities | wc -l) - [ $cap -eq 0 ] && echo 'CAP_SYS_ADMIN' >> /etc/vservers/$vserver/bcapabilities - cap=$(grep ^CAP_MKNOD /etc/vservers/$vserver/bcapabilities | wc -l) - [ $cap -eq 0 ] && echo 'CAP_MKNOD' >> /etc/vservers/$vserver/bcapabilities - cap=$(grep ^CAP_IPC_LOCK /etc/vservers/$vserver/bcapabilities | wc -l) - [ $cap -eq 0 ] && echo 'CAP_IPC_LOCK' >> /etc/vservers/$vserver/bcapabilities + grep -q ^CAP_SYS_ADMIN $BCAPFILE || echo CAP_SYS_ADMIN >> $BCAPFILE + grep -q ^CAP_MKNOD $BCAPFILE || echo CAP_MKNOD >> $BCAPFILE + grep -q ^CAP_IPC_LOCK $BCAPFILE || echo CAP_IPC_LOCK >> $BCAPFILE + # useful for f16 guests that use set_cap_file + grep -q ^CAP_SETFCAP $BCAPFILE || echo CAP_SETFCAP >> $BCAPFILE else ### capabilities required for a myplc vserver # for /etc/plc.d/gpg - need to init /dev/random - cap=$(grep ^CAP_MKNOD /etc/vservers/$vserver/bcapabilities | wc -l) - [ $cap -eq 0 ] && echo 'CAP_MKNOD' >> /etc/vservers/$vserver/bcapabilities - cap=$(grep ^CAP_NET_BIND_SERVICE /etc/vservers/$vserver/bcapabilities | wc -l) - [ $cap -eq 0 ] && echo 'CAP_NET_BIND_SERVICE' >> /etc/vservers/$vserver/bcapabilities + grep -q ^CAP_MKNOD $BCAPFILE || echo CAP_MKNOD >> $BCAPFILE + grep -q ^CAP_NET_BIND_SERVICE $BCAPFILE || echo CAP_NET_BIND_SERVICE >> $BCAPFILE + # useful for f16 guests that use set_cap_file + grep -q ^CAP_SETFCAP $BCAPFILE || echo CAP_SETFCAP >> $BCAPFILE fi # Set persistent for the network context - echo persistent,lback_allow > /etc/vservers/$vserver/nflags + # Thierry: Daniel's kernels come with single_ip turned off by default, let's make this explicit + echo "persistent,lback_allow,~single_ip" > /etc/vservers/$vserver/nflags + + # Set cflags + echo -e "persistent\n~info_init" > /etc/vservers/$vserver/cflags - # Set the init style of your vserver to plain for f13 + # Enable cgroup + mkdir /etc/vservers/$vserver/cgroup + + # Set the init style of your vserver to plain for f16 and higher + # not working with f16 anyways, systemd requires 2.6.36 to work case $fcdistro in - f13|f14) echo plain > /etc/vservers/$vserver/apps/init/style ;; + f1[5-9]) echo plain > /etc/vservers/$vserver/apps/init/style ;; esac if [ "$pkg_method" = "yum" ] ; then @@ -273,17 +290,28 @@ function devel_or_vtest_tools () { packages=$(pl_getPackages -a $vserver_arch $fcdistro $pldistro $pkgsfile) groups=$(pl_getGroups -a $vserver_arch $fcdistro $pldistro $pkgsfile) - [ "$pkg_method" = yum ] && [ -n "$packages" ] && $personality vserver $vserver exec yum -y install $packages - [ "$pkg_method" = yum ] && for group_plus in $groups; do - group=$(echo $group_plus | sed -e "s,+++, ,g") - $personality vserver $vserver exec yum -y groupinstall "$group" - done + case "$pkg_method" in + yum) + [ -n "$packages" ] && $personality vserver $vserver exec yum -y install $packages + for group_plus in $groups; do + group=$(echo $group_plus | sed -e "s,+++, ,g") + $personality vserver $vserver exec yum -y groupinstall "$group" + done + # store current rpm list in /init-vserver.rpms in case we need to check the contents + $personality vserver $vserver exec rpm -aq > /vservers/$vserver/init-vserver.rpms + ;; + debootstrap) + $personality vserver $vserver exec apt-get update + for package in $packages ; do + $personality vserver $vserver exec apt-get install -y $package + done + ### xxx todo install groups with apt.. + ;; + *) + echo "unknown pkg_method $pkg_method" + ;; + esac - [ "$pkg_method" = debootstrap ] && $personality vserver $vserver exec apt-get update - [ "$pkg_method" = debootstrap ] && for package in $packages ; do - $personality vserver $vserver exec apt-get install -y $package - done - return 0 } @@ -430,6 +458,7 @@ function usage () { echo " -d pldistro - defaults to $DEFAULT_PLDISTRO" echo " -p personality - defaults to $DEFAULT_PERSONALITY" echo " -i ifname: determines ip and netmask attached to ifname, and passes it to the vserver" + echo " -r : set apps/init/mark to default so the vserver restart upon reboot" echo " -v : verbose - passes -v to calls to vserver" echo "vserver-options" echo " all args after the optional -- are passed to vserver build " @@ -455,14 +484,16 @@ function main () { esac VERBOSE= + RESISTANT="" IFNAME="" VSERVER_OPTIONS="" - while getopts "f:d:p:i:v" opt ; do + while getopts "f:d:p:i:rv" opt ; do case $opt in f) fcdistro=$OPTARG;; d) pldistro=$OPTARG;; p) personality=$OPTARG;; i) IFNAME=$OPTARG;; + r) RESISTANT="true";; v) VERBOSE="-v" ;; *) usage ;; esac @@ -505,6 +536,10 @@ function main () { devel_or_vtest_tools $vserver $fcdistro $pldistro $personality post_install $vserver $personality + # Start Vserver automatically on boot + [ -n "$RESISTANt" ] && echo "default" > /etc/vservers/$vserver/apps/init/mark + + echo $COMMAND Done } main "$@"