From 4f344714f999e63e416a22d57a8468451a4e6513 Mon Sep 17 00:00:00 2001 From: Ryan Harper Date: Thu, 24 Sep 2015 15:12:41 -0500 Subject: [PATCH 1/2] Use probert package from subiquity-dev ppa Use the packaged version of probert. Signed-off-by: Ryan Harper --- installer/geninstaller | 63 ++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/installer/geninstaller b/installer/geninstaller index 99d3a221..b15ddd7b 100755 --- a/installer/geninstaller +++ b/installer/geninstaller @@ -32,10 +32,15 @@ grub2-common shim shim-signed grub-efi-amd64-signed +probert " +# "URL" "GPGKEY" +# ppa:foo/bar "" +PPAS=( + "https://raharper:Q9F9bRlSxg70BGv8m6dc@private-ppa.launchpad.net/subiquity/subiquity-dev/ubuntu" "3D2F6C3B" +) SRC_DEPS=( "bzr" "lp:curtin" "curtin" - "git" "git@github.com:CanonicalLtd/probert.git" "probert" ) INSTALLER_DEPS=( "petname" @@ -44,6 +49,7 @@ INSTALLER_DEPS=( "python3-netifaces" "python-urwid" "python3-tornado" + "probert" ) CACHEDIR="" GRUB_MODS="configfile fat part_gpt part_msdos cat echo test search search_label search_fs_uuid boot chain linux reboot halt normal efi_gop efi_uga font gfxterm gfxterm_menu gfxterm_background gfxmenu serial" @@ -133,6 +139,31 @@ Example usage: EOF } +install_ppas() { + while [ $# -gt 0 ]; do + local url=${1}; shift + local gpgkey=${1}; shift; + if [ -n ${gpgkey} ]; then + echo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv ${gpgkey} + fi + echo sudo apt-add-repository -y ${url} + done + return 0 +} + +remove_ppas() { + while [ $# -gt 0 ]; do + local url=${1}; shift + local gpgkey=${1}; shift; + + if [ -n ${gpgkey} ]; then + echo sudo apt-key del ${gpgkey} + fi + echo sudo apt-add-repository --remove ${url} + done + return 0 +} + install_deps() { local packages="$1" local to_install="" @@ -365,19 +396,6 @@ generate_seed() { log "Failed to subiquity into $seed"; return 1; } - log "Writing seed user-data (probert)" - local probert_tar=$dldir/probert.tar - (cd ${dldir}/probert && - tar -cpf $probert_tar bin probert) || { - log "ERROR: Failed to package probert installer"; - return 1; - } - userdata_write_file "/tmp/probert.tar" \ - "root:root" "0644" "b64" \ - "$probert_tar" >> $seed/user-data || { - log "Failed to subiquity into $seed"; - return 1; - } return 0 } @@ -526,12 +544,29 @@ generate_img() { done sudo mv ${resolvconf} ${resolvconf}.old && sudo cp /etc/resolv.conf ${resolvconf} && + + log "Installing ppas in rootfs" + # export existing install_ppa and run it in the chroot + install_ppas_cmds="$(install_ppas ${PPAS[@]})" + sudo chroot ${mnt} /bin/bash -c "${install_ppas_cmds}" || { + log "Failed to add installer ppas to chroot"; + return 1; + } + log "Installing on rootfs: $packages" sudo chroot ${mnt} apt-get update && sudo chroot ${mnt} apt-get -y install $packages || { log "Failed to install packages on rootfs"; return 1; } + + log "Removing ppas in rootfs" + remove_ppas_cmds="$(remove_ppas ${PPAS[@]})" + sudo chroot ${mnt} /bin/bash -c "${remove_ppas_cmds}" || { + log "Failed to remove installer ppas from chroot"; + return 1; + } + sudo rm ${resolvconf} sudo mv ${resolvconf}.old ${resolvconf} set +x From 23d644037a2f723ae3e533c6490111fff7bd7d58 Mon Sep 17 00:00:00 2001 From: Ryan Harper Date: Mon, 28 Sep 2015 09:00:33 -0500 Subject: [PATCH 2/2] Switch to single overlay dir Instead of tracking many directories, we'll use only one overlay directory to hold any scripts or change we want to see applied over the base image. Signed-off-by: Ryan Harper --- installer/geninstaller | 10 ++-- .../etc}/apparmor.d/sbin.dhclient | 0 .../resources/overlay/subiquity/installer.sh | 39 ++++++++++++++ .../resources/overlay/subiquity/network_up.sh | 6 +++ .../resources/user-data/installer-user-data | 52 +------------------ 5 files changed, 52 insertions(+), 55 deletions(-) rename installer/resources/{apparmor => overlay/etc}/apparmor.d/sbin.dhclient (100%) create mode 100755 installer/resources/overlay/subiquity/installer.sh create mode 100755 installer/resources/overlay/subiquity/network_up.sh diff --git a/installer/geninstaller b/installer/geninstaller index b15ddd7b..4b19cd0f 100755 --- a/installer/geninstaller +++ b/installer/geninstaller @@ -411,7 +411,7 @@ generate_img() { local bootloader=${3}; local offline=${4}; local extlinux_conf=${TOPDIR}/resources/menu/extlinux-menu.conf - local apparmor_path=${TOPDIR}/resources/apparmor + local overlay_path=${TOPDIR}/resources/overlay local grub_efi_core=${TOPDIR}/resources/grub/bootx64.efi # FIXME, ARCH local grub_conf=${TOPDIR}/resources/grub/grub.cfg local embed_conf=${TOPDIR}/resources/grub/embed_efi.cfg @@ -583,10 +583,10 @@ generate_img() { cat ${grub_conf} | sudo tee ${efimnt}/boot/grub/grub.cfg && true fi - # update apparmor policy for dhclient - log "Updating apparmor policies" - sudo rsync -avP ${apparmor_path}/apparmor.d/ ${mnt}/etc/apparmor.d/ || { - log "Failed to sync local apparmor updates"; + # syncing overlay + log "Injecting installer configuration/scripts" + sudo rsync -avP ${overlay_path}/ ${mnt}/ || { + log "Failed to sync local installer configuration/scripts"; return 1; } diff --git a/installer/resources/apparmor/apparmor.d/sbin.dhclient b/installer/resources/overlay/etc/apparmor.d/sbin.dhclient similarity index 100% rename from installer/resources/apparmor/apparmor.d/sbin.dhclient rename to installer/resources/overlay/etc/apparmor.d/sbin.dhclient diff --git a/installer/resources/overlay/subiquity/installer.sh b/installer/resources/overlay/subiquity/installer.sh new file mode 100755 index 00000000..906d959b --- /dev/null +++ b/installer/resources/overlay/subiquity/installer.sh @@ -0,0 +1,39 @@ +#!/bin/bash +LASTCON=$(cat /proc/cmdline | fmt -w 1 | grep ^console= | tail -n 1) +case $LASTCON in + console=ttyS[0-9]) + SERIAL="-o --serial" + systemctl stop serial-getty@ttyS0.service + ;; + console=tty[0-9]) + SERIAL="" + chvt 1 + systemctl stop getty@tty1.service; + ;; +esac +# generate service file +cat </lib/systemd/system/subiquity.service +[Unit] +Description=Ubuntu Servier Installer Service +After=getty@tty1.service + +[Service] +Environment=PYTHONPATH=/usr/local +ExecStart=-/sbin/agetty -n --noclear -l /usr/local/bin/subiquity ${SERIAL} console vt100 +TTYReset=yes +TTYVHangup=yes +TTYVTDisallocate=yes +KillMode=process +Type=idle +Restart=always +StandardInput=tty-force +StandardOutput=tty +StandardError=tty +TTYPath=/dev/console + +[Install] +WantedBy=default.target +EOF + +systemctl enable subiquity.service +systemctl start subiquity diff --git a/installer/resources/overlay/subiquity/network_up.sh b/installer/resources/overlay/subiquity/network_up.sh new file mode 100755 index 00000000..ffc6a6b2 --- /dev/null +++ b/installer/resources/overlay/subiquity/network_up.sh @@ -0,0 +1,6 @@ +#!/bin/bash -x + +rm -f /etc/network/interfaces +echo -e "auto lo\niface lo inet loopback\n" > /etc/network/interfaces +/bin/ls -1 /sys/class/net | grep -v ^lo$ | xargs -i bash -c 'D={}; echo -e "auto $D\niface $D inet dhcp"' | tee /etc/network/interfaces +/bin/ls -1 /sys/class/net | grep -v ^lo$ | xargs -i ifup {} diff --git a/installer/resources/user-data/installer-user-data b/installer/resources/user-data/installer-user-data index 08278d80..82c1e356 100644 --- a/installer/resources/user-data/installer-user-data +++ b/installer/resources/user-data/installer-user-data @@ -1,61 +1,13 @@ #cloud-config #http_proxy: http://my-proxy:3129/ bootcmd: - - rm -f /etc/network/interfaces - - echo -e "auto lo\niface lo inet loopback\n" > /etc/network/interfaces - - /bin/ls -1 /sys/class/net | grep -v ^lo$ | xargs -i bash -c 'D={}; echo -e "auto $D\niface $D inet dhcp"' | tee /etc/network/interfaces - - /bin/ls -1 /sys/class/net | grep -v ^lo$ | xargs -i ifup {} - - tee -a /etc/modprobe.d/blacklist.conf <<<"blacklist floppy" + - /subiquity/network_up.sh password: passw0rd chpasswd: { expire: False } output: {all: '| tee -a /var/log/cloud-init-output.log'} #packages runcmd: - tar -C /usr/local -xf /tmp/subiquity.tar - - tar -C /usr/local -xf /tmp/probert.tar - (cd /usr/local && bin/curtin-archive extract --no-execute) - - /tmp/installer.sh + - /subiquity/installer.sh write_files: -- content: | - #!/bin/bash - LASTCON=$(cat /proc/cmdline | fmt -w 1 | grep ^console= | tail -n 1) - case $LASTCON in - console=ttyS[0-9]) - SERIAL="-o --serial" - systemctl stop serial-getty@ttyS0.service - ;; - console=tty[0-9]) - SERIAL="" - chvt 1 - systemctl stop getty@tty1.service; - ;; - esac - # generate service file - cat </lib/systemd/system/subiquity.service - [Unit] - Description=Ubuntu Servier Installer Service - After=getty@tty1.service - - [Service] - Environment=PYTHONPATH=/usr/local - ExecStart=-/sbin/agetty -n --noclear -l /usr/local/bin/subiquity ${SERIAL} console vt100 - TTYReset=yes - TTYVHangup=yes - TTYVTDisallocate=yes - KillMode=process - Type=idle - Restart=always - StandardInput=tty-force - StandardOutput=tty - StandardError=tty - TTYPath=/dev/console - - [Install] - WantedBy=default.target - EOF - - systemctl enable subiquity.service - systemctl start subiquity - path: /tmp/installer.sh - owner: root:root - permissions: '0755'