Skip to content

Instantly share code, notes, and snippets.

@alexsarmiento
Last active November 21, 2021 17:55
Show Gist options
  • Save alexsarmiento/c52874738c3bdb96424c57b297b2678d to your computer and use it in GitHub Desktop.
Save alexsarmiento/c52874738c3bdb96424c57b297b2678d to your computer and use it in GitHub Desktop.
vmbuilder for gyf304 / vmcli
#!/bin/bash
set -e
# this script creates a ubuntu VM which the current user's
# username and ssh public key.
# uncomment the following line to keep temp files
skip_cleanup=1
# disk size, default to 4096 mb
disk_size=4096 # 4096 MB
# write default config, change if needed
cat << EOF > vm.conf
kernel=vmlinux
initrd=initrd
cmdline=console=hvc0 irqfixup root=/dev/vda
cpu-count=1
memory-size=1024
disk=disk.img
cdrom=seed.iso
network=nat
EOF
arch="$(/usr/bin/uname -m)"
if [ "$arch" = "x86_64" ]; then
arch="amd64"
fi
if [ ! -e ~/.ssh/id_rsa.pub ]; then
echo "cannot find ~/.ssh/id_rsa.pub, stop" >&2
exit 1
fi
# download files
if [ "$arch" = "amd64" ]; then
/usr/bin/curl -C - -o vmlinux "https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-$arch-vmlinuz-generic"
else
/usr/bin/curl -C - -o vmlinux.gz "https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-$arch-vmlinuz-generic"
gunzip vmlinux.gz
fi
/usr/bin/curl -C - -o initrd "https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-$arch-initrd-generic"
/usr/bin/curl -C - -o disk.tar.gz "https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-$arch.tar.gz"
tar xzvf disk.tar.gz
mv "focal-server-cloudimg-$arch.img" disk.img
rm README
# create cloudinit config
rm -f seed.iso
mkdir iso_folder
cat << EOF > iso_folder/user-data
#cloud-config
users:
- default
- name: $USER
lock_passwd: False
gecos: $USER
groups: [adm, audio, cdrom, dialout, dip, floppy, lxd, netdev, plugdev, sudo, video]
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /bin/bash
ssh-authorized-keys:
- $(cat ~/.ssh/id_rsa.pub | head -n 1)
bootcmd:
- apt remove -y irqbalance
network:
version: 2
renderer: networkd
ethernets:
enp0s1:
dhcp4: true
EOF
touch iso_folder/meta-data
hdiutil makehybrid -iso -joliet -iso-volume-name cidata -joliet-volume-name cidata -o seed.iso iso_folder
rm -rf iso_folder
# expand disk to 4GB
/bin/dd if=/dev/null of=disk.img bs=1m count=0 seek="$disk_size"
# perform clean up
if [ "$skip_cleanup" != "" ]; then
exit 0
fi
rm disk.tar.gz
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment