Sim, você pode se recuperar de dentro do seu sistema em execução. Minha abordagem original está abaixo; no entanto, graças ao comentário de Zan Lynx, encontrei uma maneira mais fácil.
Minha abordagem aprimorada
Este é o comentário mencionado:
Or if you're thinking ahead you can tell btrfs to use less than maximum of the device with
btrfs filesystem resize
(Comparando com a minha abordagem original, o ponto é deliberadamente ter algum espaço livre neste dispositivo em particular e expandir o sistema de arquivos lá, em vez de adicionar um dispositivo separado que pode não ser tão fácil.)
Boas notícias: meus testes indicam que não preciso pensar no futuro! Mesmo que btrfs balance start /
não "tenha espaço sobrando ...", ainda posso reduzir o sistema de arquivos, se houver espaço para isso (ou seja, todos os arquivos e metadados se encaixam no novo tamanho). Isso leva à seguinte solução:
# btrfs filesystem resize -100M / # shrink a little...
Resize '/' of '-100M'
# btrfs filesystem resize +100M / # ... and expand back
Resize '/' of '+100M'
# btrfs balance start / # should work now
Done, had to relocate 88 out of 88 chunks
# fstrim -v /
/: 67,8 GiB (72753831936 bytes) trimmed
Minha abordagem original
Isso é o que você precisa fazer (descrição detalhada abaixo):
- Adicione um dispositivo extra ao sistema de arquivos do Btrfs.
-
btrfs balance start …
-
fstrim …
- Exclua o dispositivo extra do sistema de arquivos Btrfs.
-
btrfs balance start …
-
fstrim …
O truque é adicionar um dispositivo extra ao sistema de arquivos Btrfs, então btrfs balance …
tem algum espaço adicional. O dispositivo pode ser como /dev/sdb
ou /dev/sdb3
. Neste exemplo estou usando um arquivo regular de 1 GiB no meu disco rígido ( muito importante: eu verifiquei o arquivo não pertence ao sistema de arquivos Btrfs que eu quero expandir! Isso pode ser fatal). Eu acho que um arquivo na RAM (por exemplo, em /dev/shm/
) deve fazer o mesmo.
# tmpf=/mnt/hdd/tempfile # if this file exists, it will be overwritten!
# truncate -s 1G "$tmpf"
# extra=$(losetup -f --show "$tmpf")
Agora, $extra
é como /dev/loop0
ou algo assim.
# btrfs device add "$extra" /
Neste momento, não devo reiniciar o sistema operacional. Se eu fizesse isso, faltaria uma parte de seu sistema de arquivos raiz porque nenhum /dev/loop*
estaria associado a /mnt/hdd/tempfile
. Isto não será um problema se você usar um dispositivo regular (ou uma partição) como o dispositivo extra porque btrfs device scan
durante a inicialização irá detectá-lo.
# btrfs balance start /
No meu caso, o tempfile
é um arquivo esparso. Em outro console eu corro watch ls -hls /mnt/hdd/tempfile
e noto quando ele cresce para o tamanho (quase) completo. Desta forma eu sei quando alguns pedaços de Btrfs são movidos do SSD. Em caso de dúvida, deixe btrfs ballance …
terminar; mas eu invoco btrfs balance cancel /
para economizar algum tempo. Agora vamos voltar para o console principal.
Nota: a primeira linha abaixo é do comando btrfs balance start /
acima que foi interrompido.
balance canceled by user
# fstrim -v /
/: 26,7 GiB (28696862720 bytes) trimmed
fstrim
aparou muito mais do que antes. Eu não preciso mais do meu dispositivo extra.
# btrfs device delete "$extra" / # may take a while
# btrfs balance start / # should work now
Done, had to relocate 88 out of 88 chunks
# fstrim -v /
/: 67,8 GiB (72753831936 bytes) trimmed
E é isso. Agora é hora de limpar:
# losetup -d "$extra"
# rm "$tmpf"