X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lbuild-initvm.sh;h=58030ccccdccfd24199d1c2e9c57b971805388f3;hb=HEAD;hp=fd4059dc53dc561b62fb4f38ec745ca103c31eb3;hpb=228e5b2b7f689837761f9ca1fb4d669e0545d5b7;p=build.git diff --git a/lbuild-initvm.sh b/lbuild-initvm.sh index fd4059dc..a6ea96f1 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=f37 +DEFAULT_FCDISTRO=f43 DEFAULT_PLDISTRO=lxc DEFAULT_PERSONALITY=linux64 DEFAULT_MEMORY=3072 @@ -44,8 +44,9 @@ VIF_GUEST=eth0 ########## FEDORA_MIRROR="http://mirror.onelab.eu/" +# dnf-yum no longer exists in recent fedora FEDORA_MIRROR_KEYS="http://mirror.onelab.eu/keys/" -FEDORA_PREINSTALLED="dnf dnf-yum passwd rsyslog vim-minimal dhclient chkconfig rootfiles policycoreutils openssh-server openssh-clients" +FEDORA_PREINSTALLED="dnf passwd rsyslog vim-minimal dhclient chkconfig rootfiles policycoreutils openssh-server openssh-clients" DEBIAN_PREINSTALLED="openssh-server openssh-client" ########## networking utilities @@ -82,7 +83,7 @@ function package_method () { case $fcdistro in f[0-9]*|centos[0-9]*|sl[0-9]*) echo dnf ;; - wheezy|jessie|trusty|xenial|bionic|focal|jammy) + wheezy|jessie|trusty|xenial|bionic|focal|jammy|noble) echo debootstrap ;; *) echo "Unknown package_method for distro $fcdistro" ;; @@ -105,7 +106,7 @@ function network_config_method () { echo networkmanager ;; wheezy|jessie|trusty|xenial|bionic) echo interfaces ;; - focal|jammy) + focal|jammy|noble) echo systemd ;; *) echo "Unknown network_config_method for distro $fcdistro" ;; @@ -202,6 +203,8 @@ function fedora_download() { # copy yum config and repo files cp /etc/yum.conf $INSTALL_ROOT/etc/ cp /etc/yum.repos.d/fedora{,-updates}.repo $INSTALL_ROOT/etc/yum.repos.d/ + # on boxes managed by Francis's upgrade script, we use other mirrors + #cp /etc/yum.repos.d/so-fedora{,-updates}.repo $INSTALL_ROOT/etc/yum.repos.d/ # append fedora repo files with hardwired releasever and basearch if [ -z "$USE_UPSTREAM_REPOS" ]; then @@ -249,7 +252,11 @@ 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 --releasever=${fedora_release}" + DNF="dnf --installroot=$INSTALL_ROOT --no-best --nogpgcheck -y --releasever=${fedora_release}" + # dnf-yum no longer exists in recent fedora + case $fedora_release in + f41|f43) FEDORA_PREINSTALLED="$FEDORA_PREINSTALLED dnf-yum" ;; + esac echo "$DNF install $FEDORA_PREINSTALLED" $DNF install $FEDORA_PREINSTALLED || { echo "Failed to download rootfs, aborting." ; return 1; } @@ -417,7 +424,7 @@ function debian_mirror () { case $fcdistro in wheezy|jessie) echo http://ftp2.fr.debian.org/debian/ ;; - trusty|xenial|bionic|focal|jammy) + trusty|xenial|bionic|focal|jammy|noble) echo http://www-ftp.lip6.fr/pub/linux/distributions/Ubuntu/archive/ ;; *) echo unknown distro $fcdistro; exit 1;; esac @@ -731,9 +738,9 @@ function devel_or_test_tools () { local pkgsfile=$(pl_locateDistroFile $DIRNAME $pldistro $PREINSTALLED) ### install individual packages, then groups - # get target arch - use uname -i here (we want either x86_64 or i386) + # get target arch - (we want either x86_64 or i386) - local lxc_arch=$(chroot ${lxc_root} $personality uname -i) + local lxc_arch=$(chroot ${lxc_root} $personality arch) # on debian systems we get arch through the 'arch' command [ "$lxc_arch" = "unknown" ] && lxc_arch=$(chroot ${lxc_root} $personality arch) @@ -872,13 +879,38 @@ EOF # 1st version was relying on virsh net-dhcp-leases # however this was too fragile, would not work for fedora14 containers # WARNING: this code is duplicated in lbuild-nightly.sh -function guest_ipv4() { - local lxc=$1; shift +function guest_ipv4_old() { + lxc=$1; shift + + mac=$(virsh -c lxc:/// domiflist $lxc | grep -E 'network|bridge' | awk '{print $5;}') + [ -z "$mac" ] && { echo 1>&2 guest_ipv4_old cannot find mac; return 1; } + ip=$(arp -en | grep "$mac" | awk '{print $1;}') + # if not known: run a ping and try again + if [ -z $ip ]; then + ping -c1 -w1 -W1 $lxc >& /dev/null + ping -c1 -w1 -W1 $lxc.pl.sophia.inria.fr >& /dev/null + ip=$(arp -en | grep "$mac" | awk '{print $1;}') + fi + [ -z "$ip" ] && { echo 1>&2 guest_ipv4_old cannot find ip; return 1; } + echo $ip +} - local mac=$(virsh -c lxc:/// domiflist $lxc | egrep 'network|bridge' | awk '{print $5;}') - # sanity check - [ -z "$mac" ] && return 0 - arp -en | grep "$mac" | awk '{print $1;}' +function guest_ipv4() { + lxc=$1; shift + + # this gives us the libvirt_lxc pid for the container + local lxc_pid=$(virsh -c lxc:/// dominfo $lxc | grep '^Id:' | awk '{print $2;}' | sed -e "s|-||g") + [[ -z "$lxc_pid" ]] && { echo 1>&2 guest_ipv4 cannot find lxc pid; return 1; } + # but we need the systemd (pid=1) instance for the container + local systemd_pid=$(pgrep -P $lxc_pid systemd) + [[ -z "$systemd_pid" ]] && { echo 1>&2 guest_ipv4 cannot systemd pid; return 1; } + # from there we can inspect the network interfaces + local domip=$(nsenter -t $systemd_pid -n ip -br addr show eth0 \ + | awk '{print $3}' \ + | cut -d/ -f1 \ + ) + [ -z "$domip" ] && { echo 1>&2 guest_ipv4 cannot find ip; return 1; } + echo $domip } function wait_for_ssh () { @@ -888,7 +920,8 @@ function wait_for_ssh () { local lxc=$1; shift # if run in public_ip mode, we know the IP of the guest and it is specified here - [ -n "$1" ] && { guest_ip=$1; shift; } + local specified_ip + [ -n "$1" ] && { specified_ip=$1; shift; } #wait max 2 min for sshd to start local success="" @@ -897,14 +930,19 @@ function wait_for_ssh () { local counter=1 while [ "$current_time" -lt "$stop_time" ] ; do - echo "$counter-th attempt to reach sshd in container $lxc ..." - [ -z "$guest_ip" ] && guest_ip=$(guest_ipv4 $lxc) - [ -n "$guest_ip" ] && ssh -o "StrictHostKeyChecking no" $guest_ip 'uname -i' && { + if [ -n "$specified_ip" ]; then + guest_ip="${specified_ip}" + else + guest_ip=$(guest_ipv4 $lxc) || : + fi + echo "$counter-th attempt to reach sshd in container $lxc on address $guest_ip ..." + [ -n "$guest_ip" ] && ssh -o "StrictHostKeyChecking no" $guest_ip arch && { success=true; echo "SSHD in container $lxc is UP on IP $guest_ip"; break ; } || : # 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" || : + # 2024 : lxc-enter-namespace is broken anyways + # 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) @@ -1065,6 +1103,7 @@ function main () { 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)" + [[ -z "$GUEST_IP" ]] && { echo "could not resolve $GUEST_HOSTNAME - exiting" ; exit 1 ; } fi setup_lxc $lxc $fcdistro $pldistro $personality