X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lbuild-initvm.sh;h=b8615d753c495ad2c6792afaff0da382374d51c3;hb=52d8f231b0ba7fae1902d0176ec3533d01be5c3e;hp=636fdc4f305c36d481bd510ba6460e3fe87e5098;hpb=77cf7bccd1980c4fb1208a730e4ad53382c16274;p=build.git diff --git a/lbuild-initvm.sh b/lbuild-initvm.sh index 636fdc4f..b8615d75 100755 --- a/lbuild-initvm.sh +++ b/lbuild-initvm.sh @@ -30,7 +30,7 @@ function lxcroot () { # XXX fixme : when creating a 32bits VM we need to call linux32 as appropriate...s -DEFAULT_FCDISTRO=f29 +DEFAULT_FCDISTRO=f33 DEFAULT_PLDISTRO=lxc DEFAULT_PERSONALITY=linux64 DEFAULT_MEMORY=3072 @@ -82,10 +82,28 @@ function package_method () { case $fcdistro in f[0-9]*|centos[0-9]*|sl[0-9]*) echo dnf ;; - wheezy|jessie|precise|trusty|utopic|vivid|wily|xenial) + wheezy|jessie|trusty|xenial|bionic|focal) echo debootstrap ;; *) - echo Unknown distro $fcdistro ;; + echo "Unknown package_method for distro $fcdistro" ;; + esac +} + +### return +# ifcfg for redhat's +# interfaces for older debian/uuntu +# systemd for more recent debian/ubuntu +function network_method () { + local fcdistro=$1; shift + case $fcdistro in + f[0-9]*|centos[0-9]*|sl[0-9]*) + echo ifcfg ;; + wheezy|jessie|trusty|xenial|bionic) + echo interfaces ;; + focal) + echo systemd ;; + *) + echo "Unknown network_method for distro $fcdistro" ;; esac } @@ -181,9 +199,11 @@ function fedora_download() { cp /etc/yum.repos.d/fedora{,-updates}.repo $INSTALL_ROOT/etc/yum.repos.d/ # append fedora repo files with hardwired releasever and basearch - for f in $INSTALL_ROOT/etc/yum.repos.d/* ; do - sed -i "s/\$basearch/$arch/g; s/\$releasever/${fedora_release}/g;" $f - done + if [ -z "$USE_UPSTREAM_REPOS" ]; then + for f in $INSTALL_ROOT/etc/yum.repos.d/* ; do + sed -i "s/\$basearch/$arch/g; s/\$releasever/${fedora_release}/g;" $f + done + fi # looks like all this business about fetching fedora-release is not needed # it does @@ -224,7 +244,7 @@ function fedora_download() { # So ideally if we want to be able to build f12 images from f18 we need an rpm that has # this patch undone, like we have in place on our f14 boxes (our f14 boxes need a f18-like rpm) - DNF="dnf --installroot=$INSTALL_ROOT --nogpgcheck -y" + DNF="dnf --installroot=$INSTALL_ROOT --nogpgcheck -y --releasever=${fedora_release}" echo "$DNF install $FEDORA_PREINSTALLED" $DNF install $FEDORA_PREINSTALLED || { echo "Failed to download rootfs, aborting." ; return 1; } @@ -312,7 +332,8 @@ function fedora_configure_systemd() { ln -sf /dev/null ${lxc_root}/etc/systemd/system/"getty@.service" rm -f ${lxc_root}/etc/systemd/system/getty.target.wants/*service || : # can't seem to handle this one with systemctl - chroot ${lxc_root} $personality chkconfig network on +# second part should trigger starting with fedora31, where the network target is not manually manageable + chroot ${lxc_root} $personality chkconfig network on || chroot ${lxc_root} $personality systemctl enable NetworkManager } # overwrite container yum config @@ -329,23 +350,23 @@ function fedora_configure_yum () { # rpm --rebuilddb chroot ${lxc_root} $personality rpm --rebuilddb - echo "Initializing yum.repos.d in $lxc" - rm -f $lxc_root/etc/yum.repos.d/* - - # use mirroring/ stuff instead of a hard-wired config - local repofile=$lxc_root/etc/yum.repos.d/building.repo - yumconf_mirrors $repofile ${DIRNAME} $fcdistro \ - "" $FEDORA_MIRROR - # the keys stuff requires adjustment though - sed -i $repofile -e s,'gpgkey=.*',"gpgkey=${FEDORA_MIRROR_KEYS}/RPM-GPG-KEY-fedora-${fedora_release}-primary," + if [ -z "$USE_UPSTREAM_REPOS" ]; then + echo "Initializing yum.repos.d in $lxc" + rm -f $lxc_root/etc/yum.repos.d/* + # use mirroring/ stuff instead of a hard-wired config + local repofile=$lxc_root/etc/yum.repos.d/building.repo + yumconf_mirrors $repofile ${DIRNAME} $fcdistro "" $FEDORA_MIRROR + # the keys stuff requires adjustment though + sed -i $repofile -e s,'gpgkey=.*',"gpgkey=${FEDORA_MIRROR_KEYS}/RPM-GPG-KEY-fedora-${fedora_release}-primary," + fi # import fedora key so that gpgckeck does not whine or require stdin # required since fedora24 rpm --root $lxc_root --import $FEDORA_MIRROR_KEYS/RPM-GPG-KEY-fedora-${fedora_release}-primary # for using this script as a general-purpose lxc creation wrapper # just mention 'none' as the repo url - if [ -n "$REPO_URL" ] ; then + if [ -n "$MYPLC_REPO_URL" ] ; then if [ ! -d $lxc_root/etc/yum.repos.d ] ; then echo "WARNING : cannot create myplc repo" else @@ -358,7 +379,7 @@ function fedora_configure_yum () { cat > $lxc_root/etc/yum.repos.d/myplc.repo < $guest_interfaces + local lxc=$1; shift + local fcdistro=$1; shift + case $(network_method $fcdistro) in + interfaces) + local guest_interfaces=${lxc_root}/etc/network/interfaces + ( [ -n "$NAT_MODE" ] \ + && write_guest_interfaces_natip \ + || write_guest_interfaces_publicip ) > $guest_interfaces + ;; + systemd) + local systemd_config="${lxc_root}/etc/systemd/network/wired.network" + ( [ -n "$NAT_MODE" ] \ + && write_guest_systemd_natip \ + || write_guest_systemd_publicip ) > $systemd_config + chroot "${lxc_root}" systemctl enable systemd-networkd + ;; + esac } function write_guest_interfaces_natip () { @@ -424,6 +460,31 @@ netmask $NETMASK gateway $GATEWAY EOF } + +# systemd-networkd +# https://wiki.archlinux.org/title/systemd-networkd +# https://www.linuxtricks.fr/wiki/systemd-le-reseau-avec-systemd-networkd +function write_guest_systemd_natip () { + cat << EOF +[Match] +Name=eth0 + +[Network] +DHCP=ipv4 +EOF +} + +function write_guest_systemd_publicip () { + cat << EOF +[Match] +Name=eth0 + +[Network] +Address=${GUEST_IP}/${MASKLEN} +Gateway=$GATEWAY +EOF +} + ############################## function setup_lxc() { @@ -457,7 +518,7 @@ function setup_lxc() { if [ -z "$IMAGE" ]; then debian_install $lxc || { echo "failed to install debian/ubuntu root image"; exit 1 ; } fi - debian_configure || { echo "failed to configure debian/ubuntu for a container"; exit 1 ; } + debian_configure $lxc $fcdistro || { echo "failed to configure debian/ubuntu for a container"; exit 1 ; } ;; *) echo "$COMMAND:: unknown package_method - exiting" @@ -787,11 +848,10 @@ function wait_for_ssh () { [ -z "$guest_ip" ] && guest_ip=$(guest_ipv4 $lxc) [ -n "$guest_ip" ] && ssh -o "StrictHostKeyChecking no" $guest_ip 'uname -i' && { success=true; echo "SSHD in container $lxc is UP on IP $guest_ip"; break ; } || : - # when migrating, sometimes we don't have the same uid/gid mapping - # for the ssh_keys group on both host boxes... - # also this is not wuite right, as *_key gets expanded in the host context - # but using "" or \ makes it litteral... - virsh -c lxc:/// lxc-enter-namespace $lxc /usr/bin/env chown root:ssh_keys /etc/ssh/*_key + # some of our boxes have gone through a long upgrade historically, and + # so they don't end up with the same gid mapping for the ssh_keys + # group as the ones in the guest that result from a fresh install + virsh -c lxc:/// lxc-enter-namespace $lxc /bin/bash -c "chown root:ssh_keys /etc/ssh/*_key" || : counter=$(($counter+1)) sleep 10 current_time=$(date +%s) @@ -844,13 +904,14 @@ function main () { fi START_VM=true - while getopts "n:f:d:p:r:P:i:m:sv" opt ; do + while getopts "n:f:d:p:r:uP:i:m:sv" opt ; do case $opt in n) GUEST_HOSTNAME=$OPTARG;; f) fcdistro=$OPTARG;; d) pldistro=$OPTARG;; p) personality=$OPTARG;; - r) REPO_URL=$OPTARG;; + r) MYPLC_REPO_URL=$OPTARG;; + u) USE_UPSTREAM_REPOS=true;; P) PREINSTALLED=$OPTARG;; i) IMAGE=$OPTARG;; m) MEMORY=$OPTARG;; @@ -918,9 +979,9 @@ function main () { # as this command can be used in other contexts, not specifying # a repo is considered a warning # use -r none to get rid of this warning - if [ "$REPO_URL" == "none" ] ; then - REPO_URL="" - elif [ -z "$REPO_URL" ] ; then + if [ "$MYPLC_REPO_URL" == "none" ] ; then + MYPLC_REPO_URL="" + elif [ -z "$MYPLC_REPO_URL" ] ; then echo "WARNING -- setting up a yum repo is recommended" fi fi @@ -947,8 +1008,8 @@ function main () { GUEST_IP=$(gethostbyname $GUEST_HOSTNAME) # use same NETMASK as bridge interface br0 - masklen=$(ip addr show $PUBLIC_BRIDGE | grep -v inet6 | grep inet | awk '{print $2;}' | cut -d/ -f2) - NETMASK=$(masklen_to_netmask $masklen) + MASKLEN=$(ip addr show $PUBLIC_BRIDGE | grep -v inet6 | grep inet | awk '{print $2;}' | cut -d/ -f2) + NETMASK=$(masklen_to_netmask $MASKLEN) GATEWAY=$(ip route show | grep default | awk '{print $3}' | head -1) VIF_HOST="vif$(echo $GUEST_HOSTNAME | cut -d. -f1)" fi