FreeBSD Cloud Init
Table of Contents
<2017-10-27 Fri>
How to setup cloudinit for freebsd and how to do disk resize under freebsd.
1. Setup CloudInit for FreeBSD Image
In this guide we will talk about CloudInit Setup on FreeBSD, not
bsd-cloudinit. It's because bsd-cloudinit is based on
cloudbaseinit, which has no support on ConfigDrive, while our
OpenStack cloud supports only ConfigDrive. So for freebsd image we
need to enable CloudInit.
2. Download Image And Convert
We need packages qemu-utils, wget:
pkg install qemu-utils wget
And download freebsd base image:
base=FreeBSD-11.1-RELEASE-amd64
release=releases/VM-IMAGES/11.1-RELEASE/amd64/Latest
wget https://download.freebsd.org/ftp/$release/${base}.qcow2.xz
Unzip and convert to raw:
unxz ${base}.qcow2.xz
qemu-img convert -p -f qcow2 -O raw ${base}.qcow2 ${base}.raw
3. Mount Image And Chroot
Attach to device:
mdconfig -a -t vnode -u 0 -f ${base}.raw
Mount last partition:
mount /dev/md0p3 /mnt mount -t devfs devfs /mnt/dev cp /etc/resolv.conf /mnt/etc chroot /mnt
4. Install Cloud-init
Install cloud-init:
pkg install py27-cloud-init
Enable services:
cat >> /etc/rc.conf << EOF cloudinit_enable="YES" sshd_enable="YES" EOF
Cloudinit call blkid to select config drive. But blkid doesn't work
for FreeBSD filesytem. Now work around blkid as below:
cat > /usr/bin/blkid << EOF #!/bin/sh [ -e /dev/iso9660/config-2 ] || exit 1 echo /dev/iso9660/config-2 EOF chmod a+x /usr/bin/blkid
Mount for cd9660 on FreeBSD does not support -o sync. Patch cloudinit
mount:
cd /usr/local/lib/python2.7/site-packages/cloudinit
patch -p1 << EOF
--- a/util.py 2017-10-27 07:14:55.968737000 +0000
+++ b/util.py 2017-10-27 07:15:03.481245000 +0000
@@ -1364,6 +1364,7 @@
if mtypes is None:
mtypes = ["auto"]
elif platsys.endswith("bsd"):
+ sync = False
if mtypes is None:
mtypes = ['ufs', 'cd9660', 'vfat']
for index, mtype in enumerate(mtypes):
EOF
Cleanup and exit:
set history = 0 exit
5. Umount Image And Convert Back
umount /mnt/dev
rm /mnt/etc/resolv.conf
umount /mnt
mdconfig -d -u 0
qemu-img convert -p -f raw -O qcow2 ${base}.raw ${base}.qcow2
6. Boot Instance
Once you boot an instance, you can access it via ssh, please notice the
default user is beastie.
7. Disk Resize Under FreeBSD
First to list the geoms:
gpart list => Geom name: vtbd0 modified: false state: CORRUPT
Show the Geom:
gpart show vtbd0
=> 3 44040315 vtbd0 GPT (40G) [CORRUPT]
3 118 1 freebsd-boot (59K)
121 2097152 2 freebsd-swap (1.0G)
2097273 41943040 3 freebsd-ufs (20G)
44040313 5 - free - (2.5K)
If the state shows CORRUPT, we need to recover it:
gpart recover vtbd0 vtbd0 recovered
Show again and the CORRUPT mark disappeared:
gpart show vtbd0
=> 3 83886069 vtbd0 GPT (40G)
3 118 1 freebsd-boot (59K)
121 2097152 2 freebsd-swap (1.0G)
2097273 41943040 3 freebsd-ufs (20G)
44040313 39845759 - free - (19G)
Apparently the partition 3 should be resized.
Run resize on partition 3:
gpart resize -i 3 -a 4k vtbd0
vtbd0p3 resized
gpart show vtbd0
=> 3 83886069 vtbd0 GPT (40G)
3 118 1 freebsd-boot (59K)
121 2097152 2 freebsd-swap (1.0G)
2097273 81788799 3 freebsd-ufs (39G)
According
FreeBSD
Doc, growfs should be run as below:
growfs /dev/vtbd0p3
But it doesn't work with below error reported:
growfs: /dev/vtbd0p3: Operation not permitted
A workaround is to run service growfs onestart:
service growfs onestart Growing root partition to fill device vtbd0 recovering is not needed vtbd0p3 resized super-block backups (for fsck_ffs -b #) at: 42314112, 43596352, 44878592, 46160832, 47443072, ... 56418752, 57700992, 58983232, 60265472, 61547712, ... 70523392, 71805632, 73087872, 74370112, 75652352, ...
After that I run shutdown -r now, the VM hang at:
run_interrupt_driven_hooks: still waiting after 60 seconds for xpt_config run_interrupt_driven_hooks: still waiting after 120 seconds for xpt_config
After force restarted it's bootable again.
Looks FreeBSD image is not polished well for cloud using.