mirror of
https://github.com/elasticdog/packer-arch.git
synced 2026-08-04 08:43:04 +00:00
The '==>' prefix is used by pacstrap, pacman, and mkinitcpio. A new prefix is needed to better differentiate the output of the script from the output of the programs mentioned above. Also adding more output to the different steps helps during troubleshooting.
120 lines
5.3 KiB
Bash
120 lines
5.3 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# stop on errors
|
|
set -eu
|
|
|
|
if [[ $PACKER_BUILDER_TYPE == "qemu" ]]; then
|
|
DISK='/dev/vda'
|
|
else
|
|
DISK='/dev/sda'
|
|
fi
|
|
|
|
FQDN='vagrant-arch.vagrantup.com'
|
|
KEYMAP='us'
|
|
LANGUAGE='en_US.UTF-8'
|
|
PASSWORD=$(/usr/bin/openssl passwd -crypt 'vagrant')
|
|
TIMEZONE='UTC'
|
|
|
|
CONFIG_SCRIPT='/usr/local/bin/arch-config.sh'
|
|
ROOT_PARTITION="${DISK}1"
|
|
TARGET_DIR='/mnt'
|
|
COUNTRY=${COUNTRY:-US}
|
|
MIRRORLIST="https://www.archlinux.org/mirrorlist/?country=${COUNTRY}&protocol=http&protocol=https&ip_version=4&use_mirror_status=on"
|
|
|
|
echo ">>>> install-base.sh: Setting pacman ${COUNTRY} mirrors.."
|
|
curl -s "$MIRRORLIST" | sed 's/^#Server/Server/' > /etc/pacman.d/mirrorlist
|
|
|
|
echo ">>>> install-base.sh: Clearing partition table on ${DISK}.."
|
|
/usr/bin/sgdisk --zap ${DISK}
|
|
|
|
echo ">>>> install-base.sh: Destroying magic strings and signatures on ${DISK}.."
|
|
/usr/bin/dd if=/dev/zero of=${DISK} bs=512 count=2048
|
|
/usr/bin/wipefs --all ${DISK}
|
|
|
|
echo ">>>> install-base.sh: Creating /root partition on ${DISK}.."
|
|
/usr/bin/sgdisk --new=1:0:0 ${DISK}
|
|
|
|
echo ">>>> install-base.sh: Setting ${DISK} bootable.."
|
|
/usr/bin/sgdisk ${DISK} --attributes=1:set:2
|
|
|
|
echo ">>>> install-base.sh: Creating /root filesystem (ext4).."
|
|
/usr/bin/mkfs.ext4 -O ^64bit -F -m 0 -q -L root ${ROOT_PARTITION}
|
|
|
|
echo ">>>> install-base.sh: Mounting ${ROOT_PARTITION} to ${TARGET_DIR}.."
|
|
/usr/bin/mount -o noatime,errors=remount-ro ${ROOT_PARTITION} ${TARGET_DIR}
|
|
|
|
echo ">>>> install-base.sh: Bootstrapping the base installation.."
|
|
/usr/bin/pacstrap ${TARGET_DIR} base base-devel linux
|
|
|
|
# Need to install netctl as well: https://github.com/archlinux/arch-boxes/issues/70
|
|
# Can be removed when Vagrant's Arch plugin will use systemd-networkd: https://github.com/hashicorp/vagrant/pull/11400
|
|
echo ">>>> install-base.sh: Installing basic packages.."
|
|
/usr/bin/arch-chroot ${TARGET_DIR} pacman -S --noconfirm gptfdisk openssh syslinux dhcpcd netctl
|
|
|
|
echo ">>>> install-base.sh: Configuring syslinux.."
|
|
/usr/bin/arch-chroot ${TARGET_DIR} syslinux-install_update -i -a -m
|
|
/usr/bin/sed -i "s|sda3|${ROOT_PARTITION##/dev/}|" "${TARGET_DIR}/boot/syslinux/syslinux.cfg"
|
|
/usr/bin/sed -i 's/TIMEOUT 50/TIMEOUT 10/' "${TARGET_DIR}/boot/syslinux/syslinux.cfg"
|
|
|
|
echo ">>>> install-base.sh: Generating the filesystem table.."
|
|
/usr/bin/genfstab -p ${TARGET_DIR} >> "${TARGET_DIR}/etc/fstab"
|
|
|
|
echo ">>>> install-base.sh: Generating the system configuration script.."
|
|
/usr/bin/install --mode=0755 /dev/null "${TARGET_DIR}${CONFIG_SCRIPT}"
|
|
|
|
CONFIG_SCRIPT_SHORT=`basename "$CONFIG_SCRIPT"`
|
|
cat <<-EOF > "${TARGET_DIR}${CONFIG_SCRIPT}"
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Configuring hostname, timezone, and keymap.."
|
|
echo '${FQDN}' > /etc/hostname
|
|
/usr/bin/ln -s /usr/share/zoneinfo/${TIMEZONE} /etc/localtime
|
|
echo 'KEYMAP=${KEYMAP}' > /etc/vconsole.conf
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Configuring locale.."
|
|
/usr/bin/sed -i 's/#${LANGUAGE}/${LANGUAGE}/' /etc/locale.gen
|
|
/usr/bin/locale-gen
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Creating initramfs.."
|
|
/usr/bin/mkinitcpio -p linux
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Setting root pasword.."
|
|
/usr/bin/usermod --password ${PASSWORD} root
|
|
# https://wiki.archlinux.org/index.php/Network_Configuration#Device_names
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Configuring network.."
|
|
/usr/bin/ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
|
|
/usr/bin/ln -s '/usr/lib/systemd/system/dhcpcd@.service' '/etc/systemd/system/multi-user.target.wants/dhcpcd@eth0.service'
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Configuring sshd.."
|
|
/usr/bin/sed -i 's/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
|
|
/usr/bin/systemctl enable sshd.service
|
|
|
|
# Workaround for https://bugs.archlinux.org/task/58355 which prevents sshd to accept connections after reboot
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Adding workaround for sshd connection issue after reboot.."
|
|
/usr/bin/pacman -S --noconfirm rng-tools
|
|
/usr/bin/systemctl enable rngd
|
|
|
|
# Vagrant-specific configuration
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Creating vagrant user.."
|
|
/usr/bin/useradd --password ${PASSWORD} --comment 'Vagrant User' --create-home --user-group vagrant
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Configuring sudo.."
|
|
echo 'Defaults env_keep += "SSH_AUTH_SOCK"' > /etc/sudoers.d/10_vagrant
|
|
echo 'vagrant ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/10_vagrant
|
|
/usr/bin/chmod 0440 /etc/sudoers.d/10_vagrant
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Configuring ssh access for vagrant.."
|
|
/usr/bin/install --directory --owner=vagrant --group=vagrant --mode=0700 /home/vagrant/.ssh
|
|
/usr/bin/curl --output /home/vagrant/.ssh/authorized_keys --location https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
|
|
/usr/bin/chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys
|
|
/usr/bin/chmod 0600 /home/vagrant/.ssh/authorized_keys
|
|
|
|
echo ">>>> ${CONFIG_SCRIPT_SHORT}: Cleaning up.."
|
|
/usr/bin/pacman -Rcns --noconfirm gptfdisk
|
|
EOF
|
|
|
|
echo ">>>> install-base.sh: Entering chroot and configuring system.."
|
|
/usr/bin/arch-chroot ${TARGET_DIR} ${CONFIG_SCRIPT}
|
|
rm "${TARGET_DIR}${CONFIG_SCRIPT}"
|
|
|
|
# http://comments.gmane.org/gmane.linux.arch.general/48739
|
|
echo ">>>> install-base.sh: Adding workaround for shutdown race condition.."
|
|
/usr/bin/install --mode=0644 /root/poweroff.timer "${TARGET_DIR}/etc/systemd/system/poweroff.timer"
|
|
|
|
echo ">>>> install-base.sh: Completing installation.."
|
|
/usr/bin/sleep 3
|
|
/usr/bin/umount ${TARGET_DIR}
|
|
/usr/bin/systemctl reboot
|
|
echo ">>>> install-base.sh: Installation complete!"
|