Last active
September 3, 2017 09:03
-
-
Save wopfel/fa237925c5495b4b7376e8d8a8b9c94e to your computer and use it in GitHub Desktop.
Basic setup for an Arch Linux VM
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Basic setup for an Arch Linux VM | |
# Usage in a fresh VM (example): | |
# # script -c 'bash basic-setup-archlinux-vm' --timing=/tmp/capture-timing /tmp/capture | |
# # cp /tmp/capture /mnt/root/script-installation-recording | |
# # cp /tmp/capture-timing /mnt/root/script-installation-recording-timing | |
# Exit script on any error | |
set -e | |
# Configure VM here... | |
VMNAME=system01 | |
PRIMARY_NETWORK_DEVICE=$( ip link | grep -E '[[:digit:]]: ens[[:digit:]]+: ' | head -n 1 | sed -e 's/^[[:digit:]]: //' | sed -e 's/:.*$//' ) | |
IP_ADDRESS=192.168.2.250/24 | |
ROUTER=192.168.2.1 | |
DNS_SERVER=192.168.2.1 | |
DOMAIN=local | |
DEFAULT_PASSWORD=Pass$( date +%m%d ) | |
SALT_SERVER= | |
# Exit immediately if there are some partitions (prevents damage to an existing system) | |
if [[ `grep -c 'sda[0-9]' /proc/partitions` -gt 0 ]] ; then | |
>&2 echo "Error: Partitions on sda disk found." | |
exit 1 | |
fi | |
# Exit immediately if there is a partition layout (prevents damage to an existing system) | |
if [[ `fdisk -l /dev/sda | grep -ci 'disklabel'` -gt 0 ]] ; then | |
>&2 echo "Error: No blank sda disk found." | |
exit 1 | |
fi | |
# Create partitions on /dev/sda (credits: https://superuser.com/a/984637) | |
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk /dev/sda | |
o # clear the in memory partition table | |
n # new partition | |
p # primary partition | |
1 # partition number 1 | |
# default - start at beginning of disk | |
+1G # 1 GB boot parttion | |
n # new partition | |
p # primary partition | |
2 # partion number 2 | |
# default, start immediately after preceding partition | |
# default, extend partition to end of disk | |
t # change partition type | |
# default, 2nd partition (the last one) | |
8e # Linux VM | |
a # make a partition bootable | |
1 # bootable partition is partition 1 -- /dev/sda1 | |
p # print the in-memory partition table | |
w # write the partition table | |
q # and we're done | |
EOF | |
# Format partitions, create LVM layout | |
mkfs.ext4 -L boot -O '^64bit' /dev/sda1 | |
pvcreate /dev/sda2 | |
vgcreate main /dev/sda2 | |
lvcreate -L 1GB -n swap main | |
lvcreate -L 8GB -n root main | |
mkswap -L swap /dev/mapper/main-swap | |
mkfs.ext4 -L root /dev/mapper/main-root | |
lsblk | |
# Mount partitions | |
mount /dev/mapper/main-root /mnt | |
mkdir /mnt/boot | |
mount /dev/sda1 /mnt/boot | |
# Install base system | |
pacstrap /mnt base base-devel syslinux zsh vim rsync grml-zsh-config openssh cronie tmux | |
syslinux-install_update -i -a -m -c /mnt | |
sed -i 's,APPEND root.*,APPEND root=/dev/mapper/main-root rw lang=de locale=de_DE.UTF-8,' /mnt/boot/syslinux/syslinux.cfg | |
swapon -L swap | |
genfstab -U -p /mnt >> /mnt/etc/fstab | |
cat /mnt/etc/fstab | |
# Configure system | |
echo LANG=de_DE.UTF-8 >> /mnt/etc/locale.conf | |
echo LC_COLLATE=C >> /mnt/etc/locale.conf | |
echo LC_TIME=de_DE.UTF-8 >> /mnt/etc/locale.conf | |
sed -i 's,^#de_DE,de_DE,' /mnt/etc/locale.gen | |
echo $VMNAME >> /mnt/etc/hostname | |
echo KEYMAP=de-latin1 >> /mnt/etc/vconsole.conf | |
echo FONT=lat9w-16 >> /mnt/etc/vconsole.conf | |
echo FONT_MAP=8859-1_to_uni >> /mnt/etc/vconsole.conf | |
sed -i 's,^HOOKS=.*,HOOKS="base udev autodetect modconf block lvm2 filesystems keyboard fsck shutdown",' /mnt/etc/mkinitcpio.conf | |
cat << EOF > /mnt/etc/systemd/network/25-wired.network | |
[Match] | |
Name=$PRIMARY_NETWORK_DEVICE | |
[Network] | |
Address=$IP_ADDRESS | |
Gateway=$ROUTER | |
EOF | |
cat << EOF > /mnt/etc/resolv.conf | |
domain $DOMAIN | |
nameserver $DNS_SERVER | |
EOF | |
arch-chroot /mnt locale-gen | |
arch-chroot /mnt ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime | |
arch-chroot /mnt mkinitcpio -p linux | |
arch-chroot /mnt systemctl enable sshd systemd-networkd | |
echo "root:$DEFAULT_PASSWORD" | arch-chroot /mnt chpasswd | |
arch-chroot /mnt chsh -s /bin/zsh root | |
# Install and configure salt? | |
if [[ ! -z "$SALT_SERVER" ]] ; then | |
echo Installing salt... | |
arch-chroot /mnt pacman -S salt --noconfirm | |
sed -i "s,^#master: salt,master: $SALT_SERVER," /mnt/etc/salt/minion | |
arch-chroot /mnt systemctl enable salt-minion.service | |
fi | |
# Additional steps... | |
# useradd -m -G wheel -s /bin/zsh USERNAME | |
# passwd USERNAME | |
# sed -i 's,^# %wheel ALL=(ALL) ALL$,%wheel ALL=(ALL) ALL,' /etc/sudoers | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment