FreeNAS by default will allocate 2GiB on each pool HD and use this as swap. Unfortunately, if a disk fails, your system may crash.
If you have an SSD, or another device/partition for use as swap it can be beneficial to relocate swap to that device. Alternatively, if you would rather locate the swap on the boot device, there is an alternate procedure documented here
At the same time it is beneficial to leave the default pool swap where it is because it allows you the ability to replace a failed HD with a similar HD which may be slightly smaller.
The tricky part is that FreeNAS rebuilds the swap config every time you reboot.
There is a simple solution :)
Firstly, in order to allocate a disk for swap you need to format it for swap usage.
WARNING: The below procedure will destroy ALL the data on the disk you intend to use for swap.
In order to format an entire disk for swap, use the following commands, where daX is the device you wish to format
If the 'gpart create' command fails because the disk is busy, either wipe it in the GUI, or use
This will create a swap partition which uses all available space on the device. If you wanted to you could create a partition on any device, of any size, the only important thing is that it is of type 'freebsd-swap'
Next, you will need the gptid for the partition you created
The gptid is used to safely identify the swap partition. The bit we are interested in the string of numbers/letters/dashes that follows "gptid/"
The above commands, when executed will look something like this:
And finally, in the GUI, click on Tasks -> Init/Shutdown Scripts, Add Init/Shutdown Script:
Then add a "Command" where the command is the following
Note: change the <gptid> in the above command to use the gptid that you retrieved from glabel in the above steps, ie the bit after "gptid/". Do not include the angle brackets (<>) in the final command
And set it to "Post Init" for "When"
When finished it should look something like this, of course, your gptid will be different.
Now restart.
To verify that the new swap is being used and the old swap system has been disabled you can run
And you'll see something like this:
And you can check the /etc/fstab too
And it will look something like this:
And that's it.
I have a walk-through with screenshots here
Why do it this way, and not another?
This method of disabling/re-enabling swap does not require you to remove swap partitions from your pool drives, it makes no permanent changes to your installation, and it will not fail and accidentally use a precious data disk as a swap device, even if the device order changes.
It will also not affect the normal FreeBSD swapon/swapoff functionality, which means it will also work with my page-in-swap script.
What do I do if I want to change my swap disk?
Just change the gptid to point to your new swap partition.
What do I do if I want to go back to using the pool swap?
Just remove the Post-Init command and reboot.
But what is this doing?
first we disable all current swap devices
then we create a new fstab without any swap devices
then if that worked we add our new encrypted swap device to the new fstab. If you wanted to add multiple swap devices, you can repeat this clause multiple times.
then if that worked, we replace the original fstab with the new fstab
And finally, even if we failed to update the fstab, we re-enable swap.
How do you know this works?
When FreeNAS boots, the /conf/base/etc/ix.rc.d/ix-fstab script is run to regenerate the /etc/fstab file. The script replaces /etc/fstab with /conf/base/etc/fstab, which contains the default boot mount information, then it adds various mount options that are required according to the config and imported disks, and then finally it iterates over all imported pools and finds their swap partitions and adds an encrypted swap entry for each swap partition found.
This Post-Init command removes those swap entries safely, and then adds the partitions that you specify in the same way, except via gptid.
Caveats
If you detach or import a pool via the GUI, FreeNAS will regenerate the /etc/fstab. This will mean that
Additionally, when you import a pool, FreeNAS will re-enable that pool's swap partitions.
Both of these issues can be resolved by re-running the Post-Init command, and will be resolved at next reboot.
If you have an SSD, or another device/partition for use as swap it can be beneficial to relocate swap to that device. Alternatively, if you would rather locate the swap on the boot device, there is an alternate procedure documented here
At the same time it is beneficial to leave the default pool swap where it is because it allows you the ability to replace a failed HD with a similar HD which may be slightly smaller.
The tricky part is that FreeNAS rebuilds the swap config every time you reboot.
There is a simple solution :)
Firstly, in order to allocate a disk for swap you need to format it for swap usage.
WARNING: The below procedure will destroy ALL the data on the disk you intend to use for swap.
In order to format an entire disk for swap, use the following commands, where daX is the device you wish to format
gpart create -s gpt daX
gpart add -i 1 -t freebsd-swap daX
If the 'gpart create' command fails because the disk is busy, either wipe it in the GUI, or use
gpart destroy -F daX
This will create a swap partition which uses all available space on the device. If you wanted to you could create a partition on any device, of any size, the only important thing is that it is of type 'freebsd-swap'
Next, you will need the gptid for the partition you created
glabel status | grep daX
The gptid is used to safely identify the swap partition. The bit we are interested in the string of numbers/letters/dashes that follows "gptid/"
The above commands, when executed will look something like this:
Code:
root@freenas:~ # gpart create -s gpt da1 da1 created root@freenas:~ # gpart add -i 1 -t freebsd-swap da1 da1p1 added root@freenas:~ # glabel status | grep da1 gptid/7a273425-87da-11e7-9ec5-000c290148d6 N/A da1p1
And finally, in the GUI, click on Tasks -> Init/Shutdown Scripts, Add Init/Shutdown Script:
Then add a "Command" where the command is the following
Code:
swapoff -a ; grep -v -E 'none[[:blank:]]+swap[[:blank:]]' /etc/fstab > /etc/fstab.new && echo "/dev/gptid/<gptid>.eli none swap sw 0 0" >> /etc/fstab.new && mv /etc/fstab.new /etc/fstab ; swapon -a
Note: change the <gptid> in the above command to use the gptid that you retrieved from glabel in the above steps, ie the bit after "gptid/". Do not include the angle brackets (<>) in the final command
And set it to "Post Init" for "When"
When finished it should look something like this, of course, your gptid will be different.
Now restart.
To verify that the new swap is being used and the old swap system has been disabled you can run
swapinfo
And you'll see something like this:
Code:
root@freenas:~ # swapinfo Device 1K-blocks Used Avail Capacity /dev/gptid/7a273425-87da-11e7-9 4192256 0 4192256 0%
And you can check the /etc/fstab too
cat /etc/fstab
And it will look something like this:
Code:
root@freenas:~ # cat /etc/fstab freenas-boot/grub /boot/grub zfs rw,noatime 1 0 fdescfs /dev/fd fdescfs rw 0 0 /dev/gptid/7a273425-87da-11e7-9ec5-000c290148d6.eli none swap sw 0 0
And that's it.
I have a walk-through with screenshots here
Why do it this way, and not another?
This method of disabling/re-enabling swap does not require you to remove swap partitions from your pool drives, it makes no permanent changes to your installation, and it will not fail and accidentally use a precious data disk as a swap device, even if the device order changes.
It will also not affect the normal FreeBSD swapon/swapoff functionality, which means it will also work with my page-in-swap script.
What do I do if I want to change my swap disk?
Just change the gptid to point to your new swap partition.
What do I do if I want to go back to using the pool swap?
Just remove the Post-Init command and reboot.
But what is this doing?
Code:
swapoff -a ; grep -v -E 'none[[:blank:]]+swap[[:blank:]]' /etc/fstab > /etc/fstab.new && echo "/dev/gptid/7a273425-87da-11e7-9ec5-000c290148d6.eli none swap sw 0 0" >> /etc/fstab.new && mv /etc/fstab.new /etc/fstab ; swapon -a
first we disable all current swap devices
swapoff -a
then we create a new fstab without any swap devices
grep -v -E 'none[[:blank:]]+swap[[:blank:]]' /etc/fstab > /etc/fstab.new
then if that worked we add our new encrypted swap device to the new fstab. If you wanted to add multiple swap devices, you can repeat this clause multiple times.
echo "/dev/gptid/7a273425-87da-11e7-9ec5-000c290148d6.eli none swap sw 0 0" >> /etc/fstab.new
then if that worked, we replace the original fstab with the new fstab
mv /etc/fstab.new /etc/fstab
And finally, even if we failed to update the fstab, we re-enable swap.
swapon -a
How do you know this works?
When FreeNAS boots, the /conf/base/etc/ix.rc.d/ix-fstab script is run to regenerate the /etc/fstab file. The script replaces /etc/fstab with /conf/base/etc/fstab, which contains the default boot mount information, then it adds various mount options that are required according to the config and imported disks, and then finally it iterates over all imported pools and finds their swap partitions and adds an encrypted swap entry for each swap partition found.
This Post-Init command removes those swap entries safely, and then adds the partitions that you specify in the same way, except via gptid.
Caveats
If you detach or import a pool via the GUI, FreeNAS will regenerate the /etc/fstab. This will mean that
swapoff -a
will no longer work to temporarily disable your swap partition. This is not a big deal.Additionally, when you import a pool, FreeNAS will re-enable that pool's swap partitions.
Both of these issues can be resolved by re-running the Post-Init command, and will be resolved at next reboot.