Written by: Helio Loureiro
Category: FreeBSD
Hits: 9230

 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:

 

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.