X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=vbuild-init-lxc.sh;h=9e1dd8b8eb7c1f35c4ff05346ae4c179133be963;hb=b99d6a144b433d351e9ed1c06424634a0c70fff1;hp=bab5818787d97a2afca0b8d14311f2684fbf9323;hpb=42b079922720a4bf0c2d45de12c50fddee723b4d;p=build.git diff --git a/vbuild-init-lxc.sh b/vbuild-init-lxc.sh index bab58187..9e1dd8b8 100755 --- a/vbuild-init-lxc.sh +++ b/vbuild-init-lxc.sh @@ -5,19 +5,23 @@ COMMAND=$(basename $0) DIRNAME=$(dirname $0) +BUILD_DIR=$(pwd) # pkgs parsing utilities PATH=$(dirname $0):$PATH export PATH . build.common -DEFAULT_FCDISTRO=f8 +DEFAULT_FCDISTRO=f16 DEFAULT_PLDISTRO=planetlab -DEFAULT_PERSONALITY=linux32 +DEFAULT_PERSONALITY=linux64 DEFAULT_IFNAME=eth0 COMMAND_VBUILD="vbuild-init-lxc.sh" COMMAND_MYPLC="vtest-init-lxc.sh" +lxc_version="lxc-0.8.0" +lxc_git_repo="git://lxc.git.sourceforge.net/gitroot/lxc/lxc" + function bridge_init () { # turn on verbosity @@ -48,9 +52,6 @@ function bridge_init () { # take extra arg for ifname, if provided [ -n "$1" ] && { INTERFACE_LAN=$1; shift ; } - ### Checking - type -p brctl &> /dev/null || { echo "brctl not found, please install bridge-utils" ; exit 1 ; } - #if we have already configured the same host_box no need to do it again /sbin/ifconfig $INTERFACE_BRIDGE &> /dev/null && { echo "Bridge interface $INTERFACE_BRIDGE already set up - $COMMAND start exiting" @@ -82,7 +83,8 @@ broadcast=$(/sbin/ip addr show $INTERFACE_LAN | grep -v inet6 | grep inet | head sleep 2 echo "Setting bridge address=$address broadcast=$broadcast" # static - /sbin/ifconfig $INTERFACE_BRIDGE $address broadcast $broadcast up + #/sbin/ifconfig $INTERFACE_BRIDGE $address broadcast $broadcast up + dhclient $INTERFACE_BRIDGE sleep 1 #Reconfigure the routing table @@ -127,53 +129,59 @@ echo $cidr } -function prepare_host() { - - #Bridge init - isInstalled=$(netstat -rn | grep '^0.0.0.0' | awk '{print $8;}') - if [ "$isInstalled" != "br0" ] ; then - bridge_init - sleep5 - fi - - #install development tools - isInstalled=$(yum grouplist "Development Tools" | grep Installed) - if [ -z "$isInstalled" ] ; then - echo "Installing Development Tools ..." - yum -y groupinstall "Development Tools" - fi - - #install libcap-devel, libvirt - isInstalled=$(rpm -qa | grep libcap-devel) - if [ -z "$isInstalled" ] ; then - echo "Installing libcap-devel ..." - yum -y install libcap-devel - fi +function check_yum_installed () { + package=$1; shift + rpm -q $package >& /dev/null || yum -y install $package +} - isInstalled=$(rpm -qa | grep libvirt) - if [ -z "$isInstalled" ] ; then - echo "Installing libvirt ..." - yum -y install libvirt - fi +function check_yumgroup_installed () { + group="$1"; shift + yum grouplist "$group" | grep -q Installed || { yum -y groupinstall "$group" ; } +} - #retreive and install lxc from sources - isInstalled=$(lxc-version | cut -d: -f2 | grep "0.8.0-rc1") - if [ -z "$isInstalled" ] ; then - echo "Installing lxc ..." - cd /root - git clone git://lxc.git.sourceforge.net/gitroot/lxc/lxc - cd lxc - ./autogen.sh - ./configure - make - make install - fi +function prepare_host() { - #create a symlink (just a hack to make lxc works) - [ ! -d "/usr/local/var/lib" ] && mkdir -p /usr/local/var/lib - #[ ! -f "/usr/local/var/lib/lxc" ] && ln -s /var/lib/lxc /usr/local/var/lib/lxc + #################### lxc-tools : rebuild as current fedora release has flaws + #install development tools + check_yumgroup_installed "Development Tools" + #install libcap-devel, libvirt + check_yum_installed libcap-devel + check_yum_installed libvirt + + #retrieve and install lxc from sources + raw_version=$(lxc-version ||: ) + lxc_installed_version=$(echo $raw_version | sed -e 's,.*: ,,') + if [ "$lxc_installed_version" != "$(echo $lxc_version | cut -d'-' -f2)" ] ; then + echo "Expecting version" '['$lxc_version']' + echo "Found version" '['$lxc_installed_version']' + echo "Installing lxc ..." + cd /root + [ -d lxc ] || git clone "$lxc_git_repo" + cd lxc + git pull + git checkout $lxc_version + ./autogen.sh + ./configure --prefix=/usr --exec-prefix=/usr --disable-apparmor + make + make install + mkdir -p /usr/var/lib/ + [ -d /usr/var/lib/lxc ] || ln -s /var/lib/lxc /usr/var/lib/lxc + cd $BUILD_DIR + fi + +# #create a placeholder (just a hack to make lxc works) +# [ -d "/usr/local/var/lib" ] || mkdir -p /usr/local/var/lib + + #################### bride initialization + check_yum_installed bridge-utils + #Bridge init + isInstalled=$(netstat -rn | grep '^0.0.0.0' | awk '{print $8;}') + if [ "$isInstalled" != "br0" ] ; then + bridge_init + sleep 5 + fi - return 0 + return 0 } @@ -200,10 +208,16 @@ MTU=1500 EOF # set the hostname +if [[ "$fcdistro" == "f18" ]] ; then + cat < ${rootfs_path}/etc/hostname +$HOSTNAME +EOF +else cat < ${rootfs_path}/etc/sysconfig/network NETWORKING=yes HOSTNAME=$HOSTNAME EOF +fi # set minimal hosts # cat < $rootfs_path/etc/hosts @@ -247,13 +261,20 @@ function configure_fedora_init() { function configure_fedora_systemd() { - unlink ${rootfs_path}/etc/systemd/system/default.target + ln -s /lib/systemd/system/multi-user.target ${rootfs_path}/etc/systemd/system/default.target touch ${rootfs_path}/etc/fstab - chroot ${rootfs_path} ln -s /dev/null //etc/systemd/system/udev.service - chroot ${rootfs_path} ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target - #dependency on a device unit fails it specially that we disabled udev - sed -i 's/After=dev-%i.device/After=/' ${rootfs_path}/lib/systemd/system/getty\@.service + ln -s /dev/null ${rootfs_path}/etc/systemd/system/udev.service +# Thierry - Feb 2013 +# this was intended for f16 initially, in order to enable getty that otherwise would not start +# having a getty running is helpful only if ssh won't start though, and we see a correlation between +# VM's that refuse to lxc-stop and VM's that run crazy getty's +# so, turning getty off for now instead +# #dependency on a device unit fails it specially that we disabled udev +# sed -i 's/After=dev-%i.device/After=/' ${rootfs_path}/lib/systemd/system/getty\@.service + ln -s /dev/null ${rootfs_path}/etc/systemd/system/"getty@.service" + rm -f ${rootfs_path}/etc/systemd/system/getty.target.wants/*service || : +# can't seem to handle this one with systemctl chroot ${rootfs_path} chkconfig network on } @@ -275,9 +296,21 @@ set -x MIRROR_URL=http://mirror.onelab.eu/fedora/releases/$release/Everything/$arch/os - RELEASE_URL="$MIRROR_URL/Packages/fedora-release-$release-1.noarch.rpm" - echo "Fetching from $RELEASE_URL" - curl -f "$RELEASE_URL" > $INSTALL_ROOT/fedora-release-$release.noarch.rpm + RELEASE_URL1="$MIRROR_URL/Packages/fedora-release-$release-1.noarch.rpm" + # with fedora18 the rpms are scattered by first name + RELEASE_URL2="$MIRROR_URL/Packages/f/fedora-release-$release-1.noarch.rpm" + RELEASE_TARGET=$INSTALL_ROOT/fedora-release-$release.noarch.rpm + found="" + for attempt in $RELEASE_URL1 $RELEASE_URL2; do + if curl -f $attempt -o $RELEASE_TARGET ; then + echo "Retrieved $attempt" + found=true + break + else + echo "Failed attempt $attempt" + fi + done + [ -n "$found" ] || { echo "Could not retrieve fedora-release rpm - exiting" ; exit 1; } mkdir -p $INSTALL_ROOT/var/lib/rpm rpm --root $INSTALL_ROOT --initdb @@ -315,7 +348,7 @@ set -x function install_fedora() { -set -x + set -x mkdir -p /var/lock/subsys/ ( @@ -374,6 +407,7 @@ lxc.network.link = $lxc_network_link lxc.network.name = $IFNAME lxc.network.mtu = 1500 lxc.network.ipv4 = $IP/$CIDR +lxc.network.veth.pair = $veth_pair #cgroups #lxc.cgroup.devices.deny = a # /dev/null and zero @@ -510,8 +544,6 @@ function setup_lxc() { pldistro=$1; shift personality=$1; shift - - # create lxc container copy_configuration if [ $? -ne 0 ]; then @@ -538,7 +570,6 @@ function setup_lxc() { configure_fedora_systemd fi - # Enable cgroup mkdir $rootfs_path/cgroup @@ -551,10 +582,25 @@ function setup_lxc() { mkdir $rootfs_path/root/.ssh cat /root/.ssh/id_rsa.pub >> $rootfs_path/root/.ssh/authorized_keys + # start container lxc-start -d -n $lxc - sleep 20 + echo $IP is up, waiting for ssh... + + # wait max 5 min for sshd to start + ssh_up="" + stop_time=$(($(date +%s) + 300)) + current_time=$(date +%s) + while [ "$current_time" -lt "$stop_time" ] ; do + echo "ssh attempt ..." + ssh -o "StrictHostKeyChecking no" $IP 'uname -i' && { ssh_up=true; echo "SSHD in container $lxc is UP"; break ; } || : + sleep 10 + current_time=$(($current_time + 10)) + done + + [ -z $ssh_up ] && echo "SSHD in container $lxc is not running" + # rpm --rebuilddb chroot $rootfs_path rpm --rebuilddb #ssh -o "StrictHostKeyChecking no" $IP "rpm --rebuilddb" @@ -825,7 +871,10 @@ function main () { echo "Unknown personality: $personality" fi - + # need lxc installed before we can run lxc-ls + # need bridge installed + prepare_host + if [ -n "$VBUILD_MODE" ] ; then # Bridge IP affectation @@ -839,15 +888,18 @@ function main () { lxc_network_type=veth lxc_network_link=virbr0 + veth_pair="veth$z" echo "the IP address of container $lxc is $IP " else [[ -z "$REPO_URL" ]] && usage [[ -z "$IP" ]] && usage - NETMASK=$(ifconfig br0 | grep 'inet addr' | awk '{print $4}' | sed -e 's/.*://') + + NETMASK=$(ifconfig br0 | grep 'inet ' | awk '{print $4}' | sed -e 's/.*://') GATEWAY=$(route -n | grep 'UG' | awk '{print $2}') [[ -z "$HOSTNAME" ]] && usage lxc_network_type=veth lxc_network_link=br0 + veth_pair="i$(echo $HOSTNAME | cut -d. -f1)" fi CIDR=$(cidr_notation $NETMASK) @@ -858,28 +910,22 @@ function main () { exit 1 fi - if [ ! -z "$(lxc-ls | grep $lxc)" ];then - echo "container $lxc exists" - exit 1 - fi - - path=/var/lib/lxc rootfs_path=$path/$lxc/rootfs config_path=$path/$lxc cache_base=/var/cache/lxc/fedora/$arch cache=$cache_base/$release root_password=root - - - prepare_host + + # check whether the rootfs directory is created to know if the container exists + # bacause /var/lib/lxc/$lxc is already created while putting $lxc.timestamp + [ -d $rootfs_path ] && { echo "container $lxc already exists - exiting" ; exit 1 ; } setup_lxc $lxc $fcdistro $pldistro $personality devel_or_vtest_tools $lxc $fcdistro $pldistro $personality post_install $lxc $personality - echo $COMMAND Done