Particionar o disco é algo que todo usuário de Linux deve ter passado, principalmente nas primeiras instalações de Linux (que não foram em uma VM, hehehe). O particionamento é algo básico que usamos até hoje para dividir o disco em várias áreas para armazenar dados diferentes em cada uma delas. No caso de servidores Linux, muitos criam diversas partições, cada uma como um diretório diferente do sistema (/, /usr, /tmp, /var, e por aí vai). Apesar de hoje em dia se utilizar bastante o LVM (Logical Volume Management) para facilitar a vida criando partições mais dinâmicas, mesmo assim tem que haver um particionamento básico no disco.
Muitos de nós aprendemos que o programa fdisk serve para fazer o particionamento do disco de forma fácil e interativa. Mas de vez em quando há uma grande necessidade de se fazer isso automaticamente, ou seja, particionar o disco via comando ou um shell script. É aí que entra o sfdisk, que é basicamente uma versão scriptável do fdisk. Com ele, dá pra fazer algumas coisas úteis que não conseguíamos de forma prática com o fdisk:
- Fazer backup e restauração da tabela de partições de um disco (para casos de corrompimento da tabela;
- Duplicar o mesmo esquema de particionamento de um disco para outro (e utilizar em um RAID1, por exemplo);
- Automatizar a criação e instalação de distribuições, ou restore de backups de máquinas inteiras via script;
Como todo bom administrador de sistemas, tenha em mente que comandos que automatizam tarefas sempre são úteis…
Mas antes, uma pequena introdução!
Um disco é um dispositivo físico que armazenam bits, ou seja, números 0 ou 1 (números binários). Em discos rígidos tradicionais, esses números binários são geralmente representados por uma polaridade magnética. Se aquele espaço minúsculo está com uma polaridade, é o número 0, se estiver com outra polaridade, é o número 1. Por isso, em teoria qualquer bit pode ser guardado em qualquer lugar. As partições são uma criação antiga (e utilizada até hoje) que divide esse disco em áreas, dimensionando para o sistema operacional onde ele pode mexer. Em outras palavras, partições criam espécies de discos dentro do disco.
As partições fazem uma divisão por setores, que são conjuntos de bytes (geralmente 512 bytes). São essas divisões que estão na tabela de partições de um disco.
E por falar em tabelas de partições, os primeiros 512 bytes do disco são reservados justamente para essas informações e é chamado de MBR (Master Boot Record). Então se é o primeiro setor, podemos dizer que a MBR tem o tamanho de 512 bytes. Dentro desses 512 bytes do MBR, temos:
- 1 – 446 bytes: O setor de boot do disco, geralmente fica o programa que carrega o kernel do sistema operacional (como o grub);
- 447 – 510 bytes (64 bytes): A tabela de partições, que informa as divisões do disco em setores;
- 510 – 512 bytes (2 bytes): Uma assinatura do tipo de boot que é registrado na MBR.
O comando dd no Linux pode ser usado para extrair e colocar dados diretamente no disco, mas sai um pouco fora do escopo desta dica, já que queremos um backup menos agressivo, utilizando o sfdisk.
Backup com o sfdisk
Vamos trabalhar como exemplo, o dispositivo /dev/sda, que é geralmente o primeiro HD da máquina. Veja só a saída do comando:
# sfdisk -l /dev/sda Disk /dev/sda: 91201 cylinders, 255 heads, 63 sectors/track Units: cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System /dev/sda1 * 0+ 63- 64- 512000 83 Linux /dev/sda2 63+ 91201- 91138- 732060672 8e Linux LVM /dev/sda3 0 - 0 0 0 Empty /dev/sda4 0 - 0 0 0 Empty
Isso é a saída visual do sfdisk. Existe um outro formato, que é o dump:
# sfdisk -d /dev/sda # partition table of /dev/sda unit: sectors /dev/sda1 : start= 2048, size= 1024000, Id=83, bootable /dev/sda2 : start= 1026048, size=1464121344, Id=8e /dev/sda3 : start= 0, size= 0, Id= 0 /dev/sda4 : start= 0, size= 0, Id= 0
É a mesma informação, só que com um formato próprio do sfdisk. Em outras palavras, se você guardar isso em um arquivo, você estará salvando esse esquema de particionamento em um arquivo, ou seja, fazendo um backup:
sfdisk -d /dev/sda > backup-particoes-sda.txt
Restaurando
O conteúdo do arquivo anterior pode ser guardado para restaurar depois. Se sua tabela for corrompida por algum motivo, a restauração pode ser feita assim:
sfdisk /dev/sda < backup-particoes-sda.txt
Simples né? Como são sempre comandos simples, eles podem ser colocados em shell scripts facilmente.
Se por acaso você quiser replicar as partições de um disco para o outro, é só usar em outro dispositivo:
# escreve a tabela de partições em um disco secundário (/dev/sdb) sfdisk /dev/sdb < backup-particoes-sda.txt
Pode também fazer uma cópia de um HD para o outro, sem precisar gravar em um arquivo texto:
# escreve a tabela de partições de um disco (/dev/sda) em outro (/dev/sdb) sfdisk -d /dev/sda | sfdisk /dev/sdb
Os comandos simplesmente usam os recursos de entrada, saída e pipe que o shell fornece. Você pode usar esses comandos para automatizar a criação de máquinas. É só salvar um esquema de particionamento que você queira e na nova máquina mandar um sfdisk restaurando :)
Bom proveito!