Btrfs é um sistema de arquivos relativamente "recente" (o desenvolvimento começou em 2008) com um bocado de features interessantes. Neste post, falarei uma porção de coisas sobre como usar uma partição Btrfs como sistema de arquivos raiz no Debian. O Btrfs ainda é considerado experimental (embora seja bastante estável em kernels recentes), e eu não confiaria meus arquivos pessoais a ele no momento (meu /home é uma partição ext4), mas como sistema de arquivos raiz de uma máquina de uso pessoal (que se eu perder é só reinstalar), acredito que os benefícios compensam os riscos.
[Update: Aparentemente ele não é tão estável assim.]
A principal razão pela qual eu migrei meu / para Btrfs foi para usar sua feature de snapshots, que permite criar uma "duplicata" do estado do sistema de arquivos em um dado momento. A criação de um snapshot não duplica os arquivos; ao invés disso, os arquivos são compartilhados entre as duas "versões" do sistema de arquivos, e só são copiados à medida em que são modificados, o que torna a criação do snapshot praticamente instantânea e não consome espaço desnecessariamente. Com isso você pode, por exemplo, tirar um snapshot do /, atualizar/bagunçar o sistema e, se alguma coisa der errado, voltar ao estado anterior são e salvo.
Kernel 3.14 ou superior. O suporte a Btrfs do kernel atual (3.2) do Debian stable é bastante precário (eu consegui derrubar ele com um for ((i=0; ; i++)); do mkdir $i; done em um filesystem recém criado). As opções são:
Para usar o backports, basta adicionar o repositório wheezy-backports no /etc/apt/sources.list. (Leitor do futuro: substitua wheezy pelo nome da release stable do momento.) Por exemplo, se o seu sources.list contém linhas como:
deb http://ftp.br.debian.org/debian wheezy main contrib non-free
adicione a linha:
deb http://ftp.br.debian.org/debian wheezy-backports main contrib non-free
Em seguida, dê um apt-get update para baixar os índices dos repositórios. (Alternativamente, você pode abrir o aptitude e teclar u.) Feito isso, você poderá instalar o pacote de kernel apropriado à sua máquina (e.g., linux-image-3.14-0.bpo.2-686-pae) com o apt-get ou o aptitude.
Package: * Pin: release a=testing Pin-Priority: 400 Package: * Pin: release a=unstable Pin-Priority: 90
Isso dá prioridade 500 aos pacotes da testing e 90 aos da unstable. Traduzindo da manpage:
Prioridades (P) atribuídas no arquivo de preferências do APT devem ser inteiros positivos ou negativos. Eles são interpretados da seguinte maneira (a grosso modo):
P >= 1000 Faz com que uma versão seja instalada mesmo que isso constitua um downgrade do pacote 990 <= P < 1000 Faz com que uma versão seja instalada mesmo que ela não pertença à target release, a menos que a versão instalada seja mais recente 500 <= P < 990 Faz com que uma versão seja instalada a menos que haja uma versão disponível pertencente à target release ou a versão instalada seja mais recente 100 <= P < 500 Faz com que uma versão seja instalada a menos que haja uma versão disponível em outra distribuição ou que a versão instalada seja mais recente 0 < P < 100 Faz com que uma versão seja instalada apenas se não houver uma versão instalada do pacote P < 0 Impede que a versão seja instalada
Tendo adicionado o repositório da unstable (com uma linha tal como
deb http://ftp.br.debian.org/debian sid main contrib non-free
no /etc/apt/sources.list), basta dar um apt-get update ou similar e instalar o pacote apropriado (linux-image-3.16-1-686-pae na minha máquina).
btrfs-tools 3.14 ou superior. Disponível tanto no repositório da backports quanto no da unstable.
Para poder bootar a partir de um raiz Btrfs, você precisará adicionar suporte ao filesystem ao seu initramfs. Para isso, adicione as seguintes linhas ao /etc/initramfs-tools/modules:
crc32c btrfs
e execute update-initramfs -u -k all.
A linha crc32c é particularmente relevante: Geralmente, o update-initramfs é esperto o suficiente para incluir junto com um módulo todas as suas dependências no initramfs. Porém, por um bug no módulo btrfs, ele não indica explicitamente sua dependência pelo módulo crc32c. Se o módulo crc32c não for incluído manualmente na lista, a carga do módulo btrfs falhará no boot, com uma mensagem do tipo can't load module btrfs (kernel/fs/btrfs/btrfs.ko): unknown symbol in module, or unknown parameter. (Isso me tomou uma boa hora de sofrimento.)
Para transformar seu raiz em Btrfs, você precisará bootar com um outro sistema e seguir uma de duas rotas:
Antes de rebootar o sistema no filesystem recém criado, lembre-se de altarar o etc/fstab do sistema. Você poderá ter que trocar:
Se o seu /boot fica dentro na mesma partição que o raiz, você pode ter que fazer alguma mudança no seu gerenciador de boot para garantir que ele consiga ler o Btrfs. O GRUB 2 aparentemente consegue ler Btrfs sem problemas. (Eu ainda uso o bom e velho GRUB 0.97, mas meu /boot é uma partição ext2 separada.)
O Btrfs organiza o filesystem em subvolumes. Inicialmente, o filesystem contém apenas um "subvolume raiz", mas outros subvolumes podem ser criados com o comando btrfs subvolume create /caminho/novo-nome, onde /caminho é um diretório dentro do filesystem de interesse. btrfs subvolume list /caminho lista todos os subvolumes (e respectivos IDs) contidos em um filesystem.
O comando btrfs subvolume snapshot /caminho-subvol-origem /caminho-subvol-destino duplica um subvolume, i.e., cria um "snapshot". Depois da duplicação, os dois subvolumes são independentes: alterações em um não se refletem no outro.
Um filesystem Btrfs possui um subvolume padrão, i.e., o subvolume que é usado como raiz do filesystem se nenhum outro for especificado. Inicialmente, o "subvolume raiz" é o padrão, mas você pode usar o comando btrfs subvolume set-default ID /caminho (onde ID é o ID mostrado por btrfs subvolume list) para escolher outro. Com isso você pode setar o subvolume padrão para um snapshot com um estado anterior do sistema, por exemplo, reiniciar a máquina, e magicamente seu sistema volta a ser o que era no momento do snapshot.
Você pode montar um subvolume diferente do padrão passando a opção -o subvolid=ID para o comando mount. -o subvolid=0 monta o subvolume raiz original. Você pode montar a mesma partição mais de uma vez.
Como eu mencionei antes, ao invés de copiar o backup do sistema diretamente para o raiz da nova partição, pode ser mais conveniente criar um subvolume primeiro, especialmente se você pretende usar a feature de snapshots com freqüência. Por exemplo, ao criar o filesystem:
# mount /dev/xxx /mnt/sistema # cp -avx /mnt/sistema /algum/lugar/backup # umount /mnt/sistema # mkfs.btrfs -f /dev/xxx # mount /dev/xxx /mnt/sistema # btrfs subvolume create /mnt/sistema/current # btrfs subvolume list /mnt/sistema ID 264 gen 142 top level 5 path current # btrfs subvolume set-default 264 /mnt/sistema # cp -avx /algum/lugar/backup/* /mnt/sistema/current # (realize as adaptações pré-boot adequadas)
Com o subvolume padrão setado, você pode reiniciar e bootar o sistema novo normalmente. Quando você quiser fazer um snapshot, basta montar o raiz original em algum lugar (e.g., /mnt/root) e fazer as operações de interesse:
# mount -o subvolid=0 /dev/xxx /mnt/root # btrfs subvolume snapshot /mnt/root/current /mnt/root/snapshot-20120912 # umount /mnt/root
Feito isso, você pode bagunçar com seu sistema à vontade e, se quiser voltar atrás, pode executar:
btrfs subvolume set-default ID-do-snapshot
e reiniciar a partir do snapshot. Ou, se preferir não alterar o snapshot, você pode duplicá-lo primeiro e reiniciar pela cópia:
# mount -o subvolid=0 /dev/xxx /mnt/root # btrfs subvolume snapshot /mnt/root/snapshot-20120912 /mnt/root/current2 # btrfs subvolume list /mnt/root ID 264 gen 142 top level 5 path current ID 266 gen 142 top level 5 path snapshot-20120912 ID 268 gen 142 top level 5 path current2 # btrfs subvolume set-default 268 /mnt/root # reboot
Lembre-se de depois apagar o current antigo (com btrfs subvolume delete /mnt/root/current), caso não queira que ele fique ocupando espaço para sempre.
A vantagem de criar um subvolume primeiro antes de copiar o sistema é deixar o subvolume raiz original contendo apenas subvolumes, evitando misturar subvolumes e arquivos de sistema no mesmo nível. Isso permite manipular todos os subvolumes/snapshots da mesma maneira (qualquer versão do sistema pode ser apagada facilmente, por exemplo; com o sistema no raiz original isso não seria possível).
O utilitário btrfs permite abreviar comandos, desde que as abreviações não sejam ambíguas. Por exemplo, btrfs subvolume list / pode ser escrito como btrfs sub l /.
Espaço usado e livre em Btrfs são conceitos um tanto quanto curiosos, devido ao mecanismo de copy-on-write, suporte a compressão e outras peculiaridades do Btrfs. O comando btrfs filesystem df /caminho pode dar um resultado mais preciso do que o df -h.
Descobrir o espaço utilizado por cada subvolume é uma questão mais complicada (até porque subvolumes podem compartilhar dados). Se o mecanismo de quotas for habilitado no subvolume raiz original (com o comando btrfs quota enable /mnt/root), é possível usar o comando btrfs qgroup show /, que lista a quantidade de dados apontada por cada subvolume e a quantidade de dados não compartilhada com nenhum outro subvolume (e que portanto seria liberada se o subvolume fosse apagado). Para mais informações, dê uma olhada neste artigo.
É possível criar um snapshot somente-leitura passando a opção -r para o comando btrfs subvolume snapshot. A vantagem é que é mais difícil de destruir um backup do sistema assim. A desvantagem é que não é mais possível bootar pelo snapshot como se fosse um sistema comum.
Tem mais ocorrências do horror. Você podia pelo menos ter utilizado um "vossa mercê", soaria mais desnecessariamente informal e daria um ar de ter sobremaneira menos estranhamento.
Com meus melhores sentimentos para e você e todos os vossos.
- D. Nemly dos Santos Cavalo Cavalinho Jonas Malafaia de Aveiro e Bragança e Mais Um Pouco do Algarve.
Copyright © 2010-2024 Vítor De Araújo
O conteúdo deste blog, a menos que de outra forma especificado, pode ser utilizado segundo os termos da licença Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International.
Powered by Blognir.
Nemly, 2014-09-13 20:14:59 -0300 #
Parei de ler no "você pode". É tão horrível quanto escutar "muleke"