not-os
Digital Ocean
$ ./make-qcow2.sh
...
The make-qcow2.sh script creates an image that boots
with Digital Ocean custom image feature.
This script is a work around the limitation of Digital Ocean not
supporting the FAT16 boot partition of the raw derivation. It is also
not just a Nix attribute in default.nix because I didn’t
find a way to built the same result without using sudo,
losetup or mount.
The resulting image.qcow2 file can further be compressed
with gzip and uploaded to Digital Ocean.
Notes
Digital Ocean supports only EXT3 and EXT4 file systems in their custom image feature.
Normally
cloud-initshould be used. Currently the generated image only supports requesting an IP address usingdhcpcd.The console logs show some possible problem related to
rngd. I think I should runhaveged.When running
blkidduring the boot process on Digital Ocean, one can see
/dev/vdb: LABEL="config-2" TYPE="iso9660"
/dev/vda1: LABEL="rootfs" UUID="..." TYPE="ext4"
The
config-2drive is the configuration disk intended for cloud-init.When I tried to run
dhcpcdin therunit1script, I saw an error likedhcp_openpbf: Address family not supported by protocolThe solution was to load the
af_packetkernel module.The
doctltool doesn’t currently seem to support the upload of custom images.Currently Digital Ocean has a big shortcoming: it is not possible to assign a floating IP to a VM created from a custom image. The only documented way to keep an IP, is to rebuild an existing VM. But it is actually not possible because custom images are not proposed on the rebuild screen. This means that nixos-rebuild is a must have.
Once the isofs kernel module is loaded, it is possible to mount the config-2 drive:
-bash-4.4# blkid /dev/vda1: LABEL="rootfs" UUID=".." TYPE="ext4" PARTUUID="20000000-01" /dev/vdb: UUID="2019-04-13-09-08-27-00" LABEL="config-2" TYPE="iso9660-bash-4.4# mkdir /mnt -bash-4.4# mount /dev/vdb /mnt mount: /mnt: WARNING: device write-protected, mounted read-only. -bash-4.4# ls /mnt/ digitalocean_meta_data.json openstackThe three openstack directories have identical content:
-bash-4.4# sha1sum /mnt/openstack/latest/* 96f6d38846239ade3f965e1a35386919eae6d5ce /mnt/openstack/latest/meta_data.json 472c2b3220721e376aa870c6d68ae5110ef78b1a /mnt/openstack/latest/network_data.json da39a3ee5e6b4b0d3255bfef95601890afd80709 /mnt/openstack/latest/user_data c82748155cc4abc84e30e158a24e11fe577cc63f /mnt/openstack/latest/vendor_data.json -bash-4.4# sha1sum /mnt/openstack/2012-08-10/* 96f6d38846239ade3f965e1a35386919eae6d5ce /mnt/openstack/2012-08-10/meta_data.json 472c2b3220721e376aa870c6d68ae5110ef78b1a /mnt/openstack/2012-08-10/network_data.json da39a3ee5e6b4b0d3255bfef95601890afd80709 /mnt/openstack/2012-08-10/user_data c82748155cc4abc84e30e158a24e11fe577cc63f /mnt/openstack/2012-08-10/vendor_data.json -bash-4.4# sha1sum /mnt/openstack/2015-10-16/* 96f6d38846239ade3f965e1a35386919eae6d5ce /mnt/openstack/2015-10-16/meta_data.json 472c2b3220721e376aa870c6d68ae5110ef78b1a /mnt/openstack/2015-10-16/network_data.json da39a3ee5e6b4b0d3255bfef95601890afd80709 /mnt/openstack/2015-10-16/user_data c82748155cc4abc84e30e158a24e11fe577cc63f /mnt/openstack/2015-10-16/vendor_data.jsonThe
digitalocean_meta_data.jsonseems to combine the the openstack files (although with different names or structures).The part we’re mostly interested in is the one with the SSH key to provision:
-bash-4.4# cat /mnt/openstack/latest/meta_data.json { "admin_pass": "d624c3a16791b2997de776861b47de45", "availability_zone": "ams3", "instance_id": "129714139", "hostname": "not-os-config-2.qcow2.s-1vcpu-1gb-ams3-01", "public_keys": { "0": "ssh-rsa AAAA..." }, "uuid": "129714139" }The public key, as set by the NixOS script, is at
/etc/ssh/authorized_keys.d/root. We can just overwrite it.