From 492e559870b91f3c7c6c1da1c9c05ea13015175d Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Wed, 22 Jan 2014 10:32:49 +0100 Subject: [PATCH] for testing --- lbuild-initvm.sh | 357 +++++++++++++++++++++++----------------------- lbuild-nightly.sh | 2 +- 2 files changed, 177 insertions(+), 182 deletions(-) diff --git a/lbuild-initvm.sh b/lbuild-initvm.sh index 502c8a0a..e5fef49d 100755 --- a/lbuild-initvm.sh +++ b/lbuild-initvm.sh @@ -190,6 +190,39 @@ function create_bridge_if_needed() { } +############################## +# return yum or debootstrap +function package_method () { + fcdistro=$1; shift + case $fcdistro in + f[0-9]*|centos[0-9]*|sl[0-9]*) echo yum ;; + squeeze|wheezy|oneiric|precise|quantal|raring|saucy) echo debootstrap ;; + *) echo Unknown distro $fcdistro ;; + esac +} + +# return arch from debian distro and personality +function canonical_arch () { + personality=$1; shift + fcdistro=$1; shift + case $(package_method $fcdistro) in + yum) + case $personality in *32) echo i386 ;; *64) echo x86_64 ;; *) echo Unknown-arch-1 ;; esac ;; + debootstrap) + case $personality in *32) echo i386 ;; *64) echo amd64 ;; *) echo Unknown-arch-2 ;; esac ;; + *) + echo Unknown-arch-3 ;; + 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 check_yum_installed () { @@ -203,92 +236,39 @@ function check_yumgroup_installed () { } ############################## +function fedora_install() { + set -x + set -e -function configure_fedora() { - - # disable selinux in fedora - mkdir -p $rootfs_path/selinux - echo 0 > $rootfs_path/selinux/enforce - - # set the hostname - case "$fcdistro" in - f18|f2?) - cat < ${rootfs_path}/etc/hostname -$GUEST_HOSTNAME -EOF - echo ;; - *) - cat < ${rootfs_path}/etc/sysconfig/network -NETWORKING=yes -HOSTNAME=$GUEST_HOSTNAME -EOF - # set minimal hosts - cat < $rootfs_path/etc/hosts -127.0.0.1 localhost $GUEST_HOSTNAME -EOF - echo ;; - esac - - dev_path="${rootfs_path}/dev" - rm -rf $dev_path - mkdir -p $dev_path - mknod -m 666 ${dev_path}/null c 1 3 - mknod -m 666 ${dev_path}/zero c 1 5 - mknod -m 666 ${dev_path}/random c 1 8 - mknod -m 666 ${dev_path}/urandom c 1 9 - mkdir -m 755 ${dev_path}/pts - mkdir -m 1777 ${dev_path}/shm - mknod -m 666 ${dev_path}/tty c 5 0 - mknod -m 666 ${dev_path}/tty0 c 4 0 - mknod -m 666 ${dev_path}/tty1 c 4 1 - mknod -m 666 ${dev_path}/tty2 c 4 2 - mknod -m 666 ${dev_path}/tty3 c 4 3 - mknod -m 666 ${dev_path}/tty4 c 4 4 - mknod -m 600 ${dev_path}/console c 5 1 - mknod -m 666 ${dev_path}/full c 1 7 - mknod -m 600 ${dev_path}/initctl p - mknod -m 666 ${dev_path}/ptmx c 5 2 - - #echo "setting root passwd to $root_password" - #echo "root:$root_password" | chroot $rootfs_path chpasswd + mkdir -p /var/lock/subsys/ + ( + flock -n -x 200 || { echo "Cache repository is busy." ; return 1 ; } - return 0 -} + if [ ! -e "$cache/rootfs" ]; then + echo "Getting cache download in $cache/rootfs ... " + fedora_download || { echo "Failed to download 'fedora base'"; return 1; } + else + echo "Updating cache $cache/rootfs ..." + if ! yum --installroot $cache/rootfs -y --nogpgcheck update + echo "Failed to update 'fedora base', continuing with last known good cache" + else + echo "Update finished" + fi + fi -function configure_fedora_init() { + echo "Copy $cache/rootfs to $rootfs_path ... " + mkdir -p $rootfs_path + rsync -a $cache/rootfs/ $rootfs_path/ + + return 0 - sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.sysinit - sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.d/rc.sysinit - # don't mount devpts, for pete's sake - sed -i 's/^.*dev.pts.*$/#\0/' ${rootfs_path}/etc/rc.sysinit - sed -i 's/^.*dev.pts.*$/#\0/' ${rootfs_path}/etc/rc.d/rc.sysinit - chroot ${rootfs_path} /sbin/chkconfig udev-post off - chroot ${rootfs_path} /sbin/chkconfig network on -} + ) 200>/var/lock/subsys/lxc -# this code of course is for guests that do run on systemd -function configure_fedora_systemd() { - # so ignore if we can't find /etc/systemd at all - [ -d ${rootfs_path}/etc/systemd ] || return 0 - # otherwise let's proceed - ln -sf /lib/systemd/system/multi-user.target ${rootfs_path}/etc/systemd/system/default.target - touch ${rootfs_path}/etc/fstab - ln -sf /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 -sf /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} /sbin/chkconfig network on + return $? } -function download_fedora() { -set -x +function fedora_download() { + set -x # check the mini fedora was not already downloaded INSTALL_ROOT=$cache/partial echo $INSTALL_ROOT @@ -296,11 +276,7 @@ set -x # download a mini fedora into a cache echo "Downloading fedora minimal ..." - mkdir -p $INSTALL_ROOT - if [ $? -ne 0 ]; then - echo "Failed to create '$INSTALL_ROOT' directory" - return 1 - fi + mkdir -p $INSTALL_ROOT || { echo "Failed to create '$INSTALL_ROOT' directory" ; return 1; } mkdir -p $INSTALL_ROOT/etc/yum.repos.d mkdir -p $INSTALL_ROOT/dev @@ -312,8 +288,7 @@ set -x cp /etc/yum.repos.d/fedora* $INSTALL_ROOT/etc/yum.repos.d/ # append fedora repo files with desired $release and $basearch - for f in $INSTALL_ROOT/etc/yum.repos.d/* - do + for f in $INSTALL_ROOT/etc/yum.repos.d/* ; do sed -i "s/\$basearch/$arch/g; s/\$releasever/$release/g;" $f done @@ -351,12 +326,7 @@ set -x YUM="yum --installroot=$INSTALL_ROOT --nogpgcheck -y" PKG_LIST="yum initscripts passwd rsyslog vim-minimal dhclient chkconfig rootfiles policycoreutils openssh-server openssh-clients" echo "$YUM install $PKG_LIST" - $YUM install $PKG_LIST - - if [ $? -ne 0 ]; then - echo "Failed to download the rootfs, aborting." - return 1 - fi + $YUM install $PKG_LIST || { echo "Failed to download rootfs, aborting." ; return 1; } mv "$INSTALL_ROOT" "$cache/rootfs" echo "Download complete." @@ -364,69 +334,106 @@ set -x return 0 } +############################## +function fedora_configure() { -function copy_fedora() { -set -x - # make a local copy of the minifedora - echo -n "Copying rootfs to $rootfs_path ..." - mkdir -p $rootfs_path - rsync -a $cache/rootfs/ $rootfs_path/ - return 0 -} - - -function update_fedora() { -set -x - YUM="yum --installroot $cache/rootfs -y --nogpgcheck" - $YUM update -} + set -x + set -e + # disable selinux in fedora + mkdir -p $rootfs_path/selinux + echo 0 > $rootfs_path/selinux/enforce -function install_fedora() { - set -x + # set the hostname + case "$fcdistro" in + f18|f2?) + cat < ${rootfs_path}/etc/hostname +$GUEST_HOSTNAME +EOF + echo ;; + *) + cat < ${rootfs_path}/etc/sysconfig/network +NETWORKING=yes +HOSTNAME=$GUEST_HOSTNAME +EOF + # set minimal hosts + cat < $rootfs_path/etc/hosts +127.0.0.1 localhost $GUEST_HOSTNAME +EOF + echo ;; + esac - mkdir -p /var/lock/subsys/ - ( - flock -n -x 200 - if [ $? -ne 0 ]; then - echo "Cache repository is busy." - return 1 - fi + dev_path="${rootfs_path}/dev" + rm -rf $dev_path + mkdir -p $dev_path + mknod -m 666 ${dev_path}/null c 1 3 + mknod -m 666 ${dev_path}/zero c 1 5 + mknod -m 666 ${dev_path}/random c 1 8 + mknod -m 666 ${dev_path}/urandom c 1 9 + mkdir -m 755 ${dev_path}/pts + mkdir -m 1777 ${dev_path}/shm + mknod -m 666 ${dev_path}/tty c 5 0 + mknod -m 666 ${dev_path}/tty0 c 4 0 + mknod -m 666 ${dev_path}/tty1 c 4 1 + mknod -m 666 ${dev_path}/tty2 c 4 2 + mknod -m 666 ${dev_path}/tty3 c 4 3 + mknod -m 666 ${dev_path}/tty4 c 4 4 + mknod -m 600 ${dev_path}/console c 5 1 + mknod -m 666 ${dev_path}/full c 1 7 + mknod -m 600 ${dev_path}/initctl p + mknod -m 666 ${dev_path}/ptmx c 5 2 - echo "Checking cache download in $cache/rootfs ... " - if [ ! -e "$cache/rootfs" ]; then - download_fedora - if [ $? -ne 0 ]; then - echo "Failed to download 'fedora base'" - return 1 - fi - else - echo "Cache found. Updating..." - update_fedora - if [ $? -ne 0 ]; then - echo "Failed to update 'fedora base', continuing with last known good cache" - else - echo "Update finished" - fi - fi + #echo "setting root passwd to $root_password" + #echo "root:$root_password" | chroot $rootfs_path chpasswd - echo "Copy $cache/rootfs to $rootfs_path ... " - copy_fedora - if [ $? -ne 0 ]; then - echo "Failed to copy rootfs" - return 1 - fi + if [ "$(echo $fcdistro | cut -d"f" -f2)" -le "14" ]; then + fedora_configure_init + else + fedora_configure_systemd + fi - return 0 + fedora_configure_yum $lxc $fcdistro $pldistro - ) 200>/var/lock/subsys/lxc + return 0 +} - return $? +function fedora_configure_init() { + set -e + set -x + sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.sysinit + sed -i 's|.sbin.start_udev||' ${rootfs_path}/etc/rc.d/rc.sysinit + # don't mount devpts, for pete's sake + sed -i 's/^.*dev.pts.*$/#\0/' ${rootfs_path}/etc/rc.sysinit + sed -i 's/^.*dev.pts.*$/#\0/' ${rootfs_path}/etc/rc.d/rc.sysinit + chroot ${rootfs_path} /sbin/chkconfig udev-post off + chroot ${rootfs_path} /sbin/chkconfig network on } +# this code of course is for guests that do run on systemd +function fedora_configure_systemd() { + set -e + set -x + # so ignore if we can't find /etc/systemd at all + [ -d ${rootfs_path}/etc/systemd ] || return 0 + # otherwise let's proceed + ln -sf /lib/systemd/system/multi-user.target ${rootfs_path}/etc/systemd/system/default.target + touch ${rootfs_path}/etc/fstab + ln -sf /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 -sf /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} /sbin/chkconfig network on +} -# overwrite lxc's internal yum config -function configure_yum_in_lxc () { +# overwrite container yum config +function fedora_configure_yum () { set -x set -e trap failure ERR INT @@ -435,6 +442,9 @@ function configure_yum_in_lxc () { fcdistro=$1; shift pldistro=$1; shift + # rpm --rebuilddb + chroot $rootfs_path /bin/rpm --rebuilddb + echo "Initializing yum.repos.d in $lxc" rm -f $rootfs_path/etc/yum.repos.d/* @@ -479,39 +489,32 @@ EOF fi } -# return yum or debootstrap -function package_method () { +############################## +# need to specify the right mirror for debian variants like ubuntu and the like +function debian_mirror () { fcdistro=$1; shift case $fcdistro in - f[0-9]*|centos[0-9]*|sl[0-9]*) echo yum ;; - squeeze|wheezy|oneiric|precise|quantal|raring|saucy) echo debootstrap ;; - *) echo Unknown distro $fcdistro ;; - esac -} - -# return arch from debian distro and personality -function canonical_arch () { - personality=$1; shift - fcdistro=$1; shift - case $(package_method $fcdistro) in - yum) - case $personality in *32) echo i386 ;; *64) echo x86_64 ;; *) echo Unknown-arch-1 ;; esac ;; - debootstrap) - case $personality in *32) echo i386 ;; *64) echo amd64 ;; *) echo Unknown-arch-2 ;; esac ;; - *) - echo Unknown-arch-3 ;; + squeeze|wheezy) + echo http://ftp2.fr.debian.org/debian/ ;; + oneiric|precise|quantal|raring|saucy) + echo http://mir1.ovh.net/ubuntu/ubuntu/ ;; + *) echo unknown distro $fcdistro; exit 1;; 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 debian_install () { + set -e + set -x + mkdir -p $rootfs_path + arch=$(canonical_arch $personality) + mirror=$(debian_mirror $fcdistro) + debootstrap --arch $arch $fcdistro $rootfs_path $mirror } +function debian_configure () { + echo "WARNING No debian config available yet" +} +############################## function setup_lxc() { set -x @@ -528,15 +531,12 @@ function setup_lxc() { pkg_method=$(package_method $fcdistro) case $pkg_method in yum) - install_fedora || { echo "failed to install fedora"; exit 1 ; } - configure_fedora || { echo "failed to configure fedora for a container"; exit 1 ; } - if [ "$(echo $fcdistro | cut -d"f" -f2)" -le "14" ]; then - configure_fedora_init - else - configure_fedora_systemd - fi + fedora_install || { echo "failed to install fedora root image"; exit 1 ; } + fedora_configure || { echo "failed to configure fedora for a container"; exit 1 ; } ;; debootstrap) + debian_install || { echo "failed to install debian/ubuntu root image"; exit 1 ; } + debian_configure || { echo "failed to configure debian/ubuntu for a container"; exit 1 ; } echo "$COMMAND: no support for debootstrap-based systems - yet" exit 1 ;; @@ -546,11 +546,6 @@ function setup_lxc() { ;; esac - # rpm --rebuilddb - chroot $rootfs_path /bin/rpm --rebuilddb - - configure_yum_in_lxc $lxc $fcdistro $pldistro - # Enable cgroup -- xxx -- is this really useful ? mkdir $rootfs_path/cgroup diff --git a/lbuild-nightly.sh b/lbuild-nightly.sh index b0f8fe92..1228e6ac 100755 --- a/lbuild-nightly.sh +++ b/lbuild-nightly.sh @@ -759,7 +759,7 @@ function main () { echo "==================== MAIN END $(date)" fi -} +} ########## main "$@" -- 2.43.0