X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lbuild-initvm.sh;h=b8615d753c495ad2c6792afaff0da382374d51c3;hb=1229ab1ea302470cd6218731bcf54503ef29ee0f;hp=f43508f5e0334920386e3117a4f786ea72501702;hpb=fef31bedb34f230ff1c4fd6e8e77ba272efd6c8a;p=build.git diff --git a/lbuild-initvm.sh b/lbuild-initvm.sh index f43508f5..b8615d75 100755 --- a/lbuild-initvm.sh +++ b/lbuild-initvm.sh @@ -82,10 +82,28 @@ function package_method () { case $fcdistro in f[0-9]*|centos[0-9]*|sl[0-9]*) echo dnf ;; - wheezy|jessie|trusty|xenial|bionic) + 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; } @@ -330,22 +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" @@ -843,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;; @@ -917,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 @@ -946,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