FreeBSD zfs disk image

Use VirtualBox to install FreeBSD using UFS.

After having FreeBSD installed, update your sources and build a custom world and kernel based on your needs for the new image to be created:

# cd /usr/src
# make -j4 buildworld buildkernel

adjust -j4 to the number or cpu cores

Use this script to create the image: https://github.com/nbari/freebsd/blob/master/zfs/zfs.sh

$ mkdir /raw && cd /raw
$ fetch --no-verify-peer https://raw.githubusercontent.com/nbari/freebsd/master/zfs/zfs.sh
$ ./zfs.sh

If everything runs fine, on new files of 1GB size called disk.raw will be created.

To test your image in virtualbox, download the disk.raw and convert it to VDI format:

$ VBoxManage convertfromraw disk.raw ec2.vdi --format VDI

Since the disk is only 1GB, you may want to increase the size, this can be done like this:

$ VBoxManage modifyhd disk.vdi --resize 8192

After booting the pool need to be increased:

$ gpart show da0

Example of output:

[email protected]/:~ # gpart show
=>       40  503316400  da0  GPT  (240G)
         40       1024    1  freebsd-boot  (512K)
       1064    2097152    2  freebsd-swap  (1.0G)
    2098216        984       - free -  (492K)
    2099200    2093056    3  freebsd-zfs  (1.0G)
    4192256  499124184       - free -  (1.0M)

Then type gpart recover da0:

$ gpart recover da0
da0 recovered

And next resize gpart resize -i 3 da0:

$ gpart resize -i 3 da0
da0 resized

-i 3, 3 is the freebsd-zfs

After resizing:

[email protected]/:~ # gpart show
=>       40  503316400  da0  GPT  (240G)
         40       1024    1  freebsd-boot  (512K)
       1064    2097152    2  freebsd-swap  (1.0G)
    2098216        984       - free -  (492K)
    2099200  501217240    3  freebsd-zfs  (239G)

Get zpool information by typing:

$ zdb

Find the children guid from the output:

zroot -> vdev_tree -> children[0] -> guid
[email protected]:/raw # zdb
zroot:
    version: 5000
    name: 'zroot'
    state: 0
    txg: 422
    pool_guid: 5388488397555579451
    hostid: 4037738314
    hostname: ''
    com.delphix:has_per_vdev_zaps
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: 5388488397555579451
        create_txg: 4
        children[0]:
            type: 'disk'
            id: 0
            guid: 2304114010935459478
            path: '/dev/gpt/disk0'
            whole_disk: 1
            metaslab_array: 37
            metaslab_shift: 24
            ashift: 12
            asize: 8584429568
            is_log: 0
            create_txg: 4
            com.delphix:vdev_zap_leaf: 35
            com.delphix:vdev_zap_top: 36
    features_for_read:
        com.delphix:hole_birth
        com.delphix:embedded_data

Resize the pool:

$ zpool online -e zroot 2304114010935459478

Check the pool:

[email protected]:/raw # zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot  7.98G   258M  7.73G         -     2%     3%  1.00x  ONLINE  -

readonly=off

Set the / to readonly off:

$ zfs set readonly=off zroot/ROOT/default