diff --git a/release/Makefile.azure b/release/Makefile.azure --- a/release/Makefile.azure +++ b/release/Makefile.azure @@ -11,8 +11,8 @@ CLEANFILES+= ${AZURE_UPLOAD_TGTS} .if defined(AZURE_UPLOAD_CONF) && !empty(AZURE_UPLOAD_CONF) -. for VAR in _STORAGE _ACCOUNT _KEY -AZURE${VAR}!= grep -E ^AZURE${VAR} ${AZURE_UPLOAD_CONF} | awk -F' ' '{print $$2}' +. for VAR in _STORAGE _ACCOUNT _RESOURCEGROUP _KEY _LOCATION +AZURE${VAR}!= grep -E ^AZURE${VAR}= ${AZURE_UPLOAD_CONF} | awk '{print $$2}' . endfor .endif @@ -20,34 +20,53 @@ SNAPSHOT_DATE!= date +-${BUILDDATE} .endif -AZURE_TARGET:= ${OSRELEASE}${SNAPSHOT_DATE}.vhd +AZURE_TARGET:= ${OSRELEASE}${SNAPSHOT_DATE} + +START_DATE!= date -v-1d -I -u +EXPIRY_DATE!= date -v+1m -I -u azure-upload: ${AZURE_UPLOAD_TGTS} azure-check-depends: -.for VAR in _STORAGE _ACCOUNT _KEY +.for VAR in _STORAGE _ACCOUNT _RESOURCEGROUP _KEY . if !defined(AZURE${VAR}) || empty(AZURE${VAR}) @echo "Variable AZURE${VAR} cannot be empty." @false . endif .endfor -.if !exists(/usr/local/bin/azure) -. if !exists(/usr/local/bin/npm) -. if !exists(${PORTSDIR}/www/npm/Makefile) -. if !exists(/usr/local/sbin/pkg-static) +.if !exists(/usr/local/bin/az) +. if !exists(${PORTSDIR}/sysutils/py-azure-cli/Makefile) +. if !exists(/usr/local/sbin/pkg-static) env ASSUME_ALWAYS_YES=yes pkg bootstrap -yf -. endif - env ASSUME_ALWAYS_YES=yes pkg install -y www/npm -. else - env UNAME_r=${UNAME_r} make -C ${PORTSDIR}/www/npm BATCH=1 all install clean . endif + env ASSUME_ALWAYS_YES=yes pkg install -y py38-azure-cli +. else + env UNAME_r=${UNAME_r} make -C ${PORTSDIR}/sysutils/py-azure-cli BATCH=1 all install clean . endif - npm install -g azure-cli .endif azure-do-upload: - /usr/local/bin/azure storage blob upload \ - ${AZURE_IMG} ${AZURE_STORAGE} ${AZURE_TARGET} \ - -t page -a ${AZURE_ACCOUNT} -k "${AZURE_KEY}" - touch ${.OBJDIR}/${.TARGET} - + /usr/local/bin/az storage blob upload \ + --account-name ${AZURE_ACCOUNT} --account-key ${AZURE_KEY} \ + --container-name ${AZURE_STORAGE} --type page \ + --file ${AZURE_IMG} --name ${AZURE_TARGET}.vhd + @echo "The disk access URL with shared access signature is:" + @echo + @echo -n https://${AZURE_ACCOUNT}.blob.core.windows.net/${AZURE_STORAGE}/${AZURE_TARGET}.vhd? + @/usr/local/bin/az storage container generate-sas \ + --account-name ${AZURE_ACCOUNT} --account-key ${AZURE_KEY} \ + --name ${AZURE_STORAGE} \ + --permissions lr \ + --start ${START_DATE} \ + --expiry ${EXPIRY_DATE} | cut -d '"' -f 2 + @echo + @echo "Please go to Microsoft Partner Center to create a new offer and publish it:" + @echo + @echo "https://partner.microsoft.com/dashboard/commercial-marketplace/overview" + @echo + @echo "After the new offer status is live, you can delete the disk file with:" + @echo + @echo /usr/local/bin/az storage blob delete \ + --account-name ${AZURE_ACCOUNT} --account-key ${AZURE_KEY} \ + --container-name ${AZURE_STORAGE} --name ${AZURE_TARGET}.vhd + @echo diff --git a/release/Makefile.vm b/release/Makefile.vm --- a/release/Makefile.vm +++ b/release/Makefile.vm @@ -174,8 +174,8 @@ ${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${CLOUDTARGETS} .endif -.include "${.CURDIR}/Makefile.ec2" .include "${.CURDIR}/Makefile.azure" +.include "${.CURDIR}/Makefile.ec2" .include "${.CURDIR}/Makefile.gce" .include "${.CURDIR}/Makefile.vagrant" .include "${.CURDIR}/Makefile.inc1" diff --git a/release/tools/azure.conf b/release/tools/azure.conf --- a/release/tools/azure.conf +++ b/release/tools/azure.conf @@ -3,25 +3,54 @@ # $FreeBSD$ # +# Convention of Linux type VM on Azure is 30G +export VMSIZE=30g + # Set to a list of packages to install. -# Example: -#export VM_EXTRA_PACKAGES="www/apache24" -export VM_EXTRA_PACKAGES="${VM_EXTRA_PACKAGES} sysutils/azure-agent" +export VM_EXTRA_PACKAGES="azure-agent python python3 firstboot-freebsd-update firstboot-pkgs" # Set to a list of third-party software to enable in rc.conf(5). -# Example: -#export VM_RC_LIST="apache24" -export VM_RC_LIST= +export VM_RC_LIST="ntpd sshd waagent firstboot_freebsd_update firstboot_pkgs" + +# No swap space; waagent will allocate swap space on the resource disk. +# See ResourceDisk.EnableSwap and ResourceDisk.SwapSizeMB in waagent.conf +export NOSWAP=YES + +# https://docs.microsoft.com/en-us/azure/marketplace/azure-vm-create-certification-faq#vm-images-must-have-1mb-free-space +export VM_BOOTPARTSOFFSET=1M vm_extra_pre_umount() { - chroot ${DESTDIR} ln -s /usr/local/sbin/waagent /usr/sbin/waagent - chroot ${DESTDIR} /usr/local/sbin/waagent -verbose -install - yes | chroot ${DESTDIR} /usr/local/sbin/waagent -deprovision - echo 'sshd_enable="YES"' >> ${DESTDIR}/etc/rc.conf - echo 'ifconfig_hn0="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf - echo 'waagent_enable="YES"' >> ${DESTDIR}/etc/rc.conf - echo 'console="comconsole vidconsole"' >> ${DESTDIR}/boot/loader.conf - echo 'comconsole_speed="115200"' >> ${DESTDIR}/boot/loader.conf + # The firstboot_pkgs rc.d script will download the repository + # catalogue and install or update pkg when the instance first + # launches, so these files would just be replaced anyway; removing + # them from the image allows it to boot faster. + mount -t devfs devfs ${DESTDIR}/dev + chroot ${DESTDIR} ${EMULATOR} env ASSUME_ALWAYS_YES=yes \ + /usr/sbin/pkg delete -f -y pkg + umount ${DESTDIR}/dev + rm ${DESTDIR}/var/db/pkg/repo-*.sqlite + + yes | chroot ${DESTDIR} ${EMULATOR} /usr/local/sbin/waagent -deprovision + + cat << EOF >> ${DESTDIR}/etc/rc.conf +ifconfig_hn0="SYNCDHCP" +ntpd_sync_on_start="YES" +EOF + + cat << EOF >> ${DESTDIR}/boot/loader.conf +autoboot_delay="-1" +beastie_disable="YES" +loader_logo="none" +hw.memtest.tests="0" +console="comconsole efi vidconsole" +comconsole_speed="115200" +boot_multicons="YES" +boot_serial="YES" +mlx4en_load="YES" +mlx5en_load="YES" +EOF + + touch ${DESTDIR}/firstboot rm -f ${DESTDIR}/etc/resolv.conf diff --git a/release/tools/vmimage.subr b/release/tools/vmimage.subr --- a/release/tools/vmimage.subr +++ b/release/tools/vmimage.subr @@ -195,6 +195,11 @@ SWAPOPT="-p freebsd-swap/swapfs::${SWAPSIZE}" fi + if [ -n "${VM_BOOTPARTSOFFSET}" ]; then + BOOTPARTSOFFSET=":${VM_BOOTPARTSOFFSET}" + fi + + BOOTFILES="$(env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \ WITH_UNIFIED_OBJDIR=yes \ make -C ${WORLDDIR}/stand -V .OBJDIR)" @@ -204,7 +209,7 @@ amd64:amd64 | i386:i386) ESP=yes BOOTPARTS="-b ${BOOTFILES}/i386/pmbr/pmbr \ - -p freebsd-boot/bootfs:=${BOOTFILES}/i386/gptboot/gptboot" + -p freebsd-boot/bootfs:=${BOOTFILES}/i386/gptboot/gptboot${BOOTPARTSOFFSET}" ROOTFSPART="-p freebsd-ufs/rootfs:=${VMBASE}" MAKEFSARGS="-B little" ;;