Finalmente resolvi bater um pouco a cabeça e tentar habilitar a função de journaling em FreeBSD (um pouco movido pela inveja de ver isso funcionado em Linux, um pouco porque essa foi uma das "top" features do FreeBSD-7.0). O grande desafio foi fazer isso em um sistema já ativo. Já havia deixada uma partição livre, /dev/ad4s1h, com 360 MB livres, mas descobri que precisava de uma relação de partição/partição para ter o journaling ativado.
Meu disco usava a seguinte separação de slices:
- ad4s1a em / (UFS2)
- ad4s1b como swap
- ad4s1c reservado para o disco todo (default)
- ad4s1d em /tmp (UFS2 e soft-updates)
- ad4s1e em /var (UFS2 e soft-updates)
- ad4s1f em /home (UFS2 e soft-updates)
- ad4s1g em /usr (UFS2 e soft-updates)
- ad4s1h disponível com 360MB
Descobri que o sistema de label de slices do BSD ainda mantém a limitação de 8 slices por partição, o que restringe somente ao uso das letras a-h. Com isso esgotado, as alternativas de criar ad4s1i, ad4s1j e assim por diante, impossível.
Buscando na rede, descobri que a forma de fazer isso seria atribuindo o tamanho total de disco a ser alterado para ad4s1h e depois aplicando o disklabel sobre o mesmo, na forma "disklabel -e ad4s1h", onde novamente a letras de a-h estão disponíveis. Com isso, criei os labels ad4s1ha, ad4s1hb, ad4s1hc, ad4s1hd, ad4s1he, ad4s1hf e ad4s1hg, para cada um corresponder ao seu journal, com 50MB.
O passo seguinte foi criar e ativar o journal. Seguindo a man page, gjournal (8), segui os passos como abaixo (após o boot em single mode):
gjournal load gjournal label -f ad4s1d ad4s1hd
gjournal label -f ad4s1e ad4s1he
gjournal label -f ad4s1f ad4s1hf
gjournal label -f ad4s1g ad4s1hg
tunefs -J enable -n disable ad4s1d.journal
tunefs -J enable -n disable ad4s1e.journal
tunefs -J enable -n disable ad4s1f.journal
tunefs -J enable -n disable ad4s1g.journal
Fiz as alterações correspondentes no /etc/fstab:
/dev/ad4s1b none swap sw 0 0
/dev/ad4s1a / ufs rw 1 1
/dev/ad4s1f.journal /home ufs async,rw 2 2
/dev/ad4s1d.journal /tmp ufs async,rw 2 2
/dev/ad4s1g.journal /usr ufs async,rw 2 2
/dev/ad4s1e.journal /var ufs async,rw 2 2
linprocfs /compat/linux/proc linprocfs rw 0 0
proc /proc procfs rw 0 0
O primeiros boot falharam devido ao fato de que "gjournal load" não existe em nenhum ponto do rc.conf. Fiz uma alteração em "/etc/rc.d/fsck" para que isso funcionasse (linhas 30-32):
28 fsck_start()
29 {
30 # patch to force gjournal load
31 echo -n 'Load gjournal (as patch): '
32 /sbin/gjournal load
33
34 if [ "$autoboot" = no ]; then
35 echo "Fast boot: skipping disk checks."
Ainda não descobri como ativar a partição raiz, "/", com journaling também, mas só o fato de ter feito isso com a demais já fez muita diferença: o sistema ficou muito mais rápido.