Manual
do
Maker
.
com
Você vai lá no site, baixa um sistema com menos de 2GB, instala o Raspbian no SD e pronto. Se for um SD de 32GB, o sistema do Raspberry vai ficar com 32GB. Daí você quererá replicá-lo para outros Raspberry após ter configurado tudo e lá se vão 32GB do seu HD para o espaço. Por essa razão resolvi escrever sobre como reduzir o sistema do Raspberry já instalado.
O Raspberry é o mesmo, de um só fabricante, mas diversas pessoas vendem. Minha recomendação é comprar com nosso parceiro CurtoCircuito, que proporcionou esse e outros artigos relacionados ao Raspberry. Assim você ajuda a fortalecer a parceria, retribuindo pela informação disponibilizada aqui, ok?
Normalmente utilizo o Raspbian, baseado no Debian, que é um ótimo sistema operacional para quem vai usar o Raspberry para fins profissionais. O problema é que após instalarmos o sistema no SD, o sistema de arquivos é redimensionado no boot para ocupar todo o cartão. Claro que é útil. De outro modo, o redimensionamento seria uma tarefa manual, que muita gente não gostaria de fazer.
Quando temos um sistema de arquivo que queremos manipulá-lo, podemos utilizar ferramentas nativas do sistema de arquivos em questão. Permita-me deixar claro que estou referenciando o Linux.
Quando copiamos o sistema do SD para o HD, ainda que não houvesse o redimensionamento do sistema de arquivos, teriamos um arquivo resultante do tamanho do cartão SD. Já pensou instalar um sistema de 1.6GB e fazer um dump de 32GB para instalar depois em outro cartão? E tem outra questão; a imagem gerada com um cartão maior não pode ser comportada por um cartão menor. Logo, se você tiver apenas um cartão de 32GB, quando for replicar precisará de um cartão igual ou maior que 32G.
Mas tem como resolver esse problema, como veremos agora.
Será necessário ter um Linux instalado, ainda que em dual boot com seu Windows. Não tem como escapar disso e não caia no mito de que Linux é difícil, porque não é. Aliás, é mais fácil que Windows, tanto para configurar dispositivos (onde a maioria deles tem suporte nativo) como para instalar programas (através dos repositórios, sem a necessidade de fazer downloads manuais).
Utilizaremos também o programa de manipulação de partições, o GParted. Mas não pule a leitura, os passos descritos a seguir são todos necessários.
Coloque o cartão micro SD em um adaptador, seja USB ou slot de cartão e conecte-o ao seu computador com o sistema Linux. O Linux tem um recurso de auto-montagem de sistemas de arquivos. Isso significa que as duas partições existentes no micro SD serão disponibilizadas em /media/seu_usuario/boot e /media/seu_usuario/rootfs. Será necessário "desmontar" ambos os sistemas de arquivos:
sudo umount /media/djames/rootfs
sudo umount /media/djames/boot
Para identificar o dispositivo do cartão micro SD, existem vários métodos. Use o comando dmesg para ver no log do sistema o evento do cartão:
dmesg | grep sd
Utilizando-o em conjunção ao comando grep, filtramos o conteúdo do log àquilo que nos interessa; o dispositivo e armazenamento:
Agora já identificado como sdb, podemos fazer o dump do cartão micro SD:
cd /tmp
mkdir SHRINK
cd SHRINK
sudo su
dd if=/dev/sdb of=original.img
Deve levar um longo tempo para copiar, não haverá mensagem nenhuma até o final do processo e não se preocupe; por mais que pareça, o processo não está travado. Vai demorar muito. Muito.
Quando essa parte do processo finalizar, o retorno será algo como:
Se obteve resultado similar ao tamanho do seu cartão micro SD, siga para o próximo passo.
No Linux, os dispositivos são arquivos descritores. Isto é, se temos um SATA, encontraremos um arquivo no diretório /dev com o nome de sda. Se tivermos 2 SATAs, estarão lá em /dev/ os arquivos sda e sdb. Já as partições são identificadas por números. Se temos apenas 1 partição em /dev/sda, então existirá o arquivo descritor /dev/sda1. O problema é que quando utilizamos uma imagem, teremos um único arquivo que no sistema operacional não será nada além disso; um arquivo. Para manipular um arquivo de imagem de sistema do Raspbian, precisaremos criar um dispositivo de loopback.
Pode até ser que já esteja carregado, mas chamá-lo novamente não causará problemas e reduzirá o número de comandos necessários para verificar se ele está carregado, portanto, o primeiro passo é ganhar acesso de root e em seguida carregar o driver.
sudo su
modprobe loop
Ao digitar sudo su, será solicitada a senha de usuário. Entre com a mesma senha que usou como usuário comum.
Algumas pessoas estranham o comportamento de alguns comandos do Linux. Por exemplo, ao carregar o módulo loop nenhuma mensagem será retornada, exceto ocorra algum erro.
Supondo que tudo aconteceu como deveria até aqui, hora de requisitar um novo dispositivo de loopback:
losetup -f
Esse comando retornará o dispositivo de loopback disponibilizado. Algo como:
Aí estão todos os comandos utilizados até agora. A antepenúltima linha contém o comando supracitado, a penúltima é o retorno do comando, indicando o dispositivo de loop criado e a última linha não é nada apenas o shell, onde estou dentro do diretório menuConfig, que é parte de um projeto que estou trabalhando.
Agora vamos criar a representação do dispositivo, de modo que a imagem de dump se pareça com um HD/SSD:
losetup /dev/loop31 original.img
Atente-se aos detalhes; /dev/loop31 é o dispositivo que foi criado para mim, lembre-se de trocar pelo dispositivo de loop criado para você. Do mesmo modo, o arquivo de dump eu chamei de original.img e estou executando o comando acima no mesmo nível de diretório em que se encontra o arquivo. Basta que você execute o comando no mesmo lugar em que executou o comando de dump.
Como criamos manualmente o acesso ao dispositivo, precisamos informar ao kernel que existem novos dispositivos a serem gerenciados. Para isso:
partprobe /dev/loop31
Mais uma vez, troque o dispositivo de loop criado para o número que corresponda ao seu dispositivo. Não se espante se seu dispositivo de loop criado for loop0.
Hora de começar. O primeiro passo é redimensionar a partição utilizando o gparted, mas isso ainda não vai reduzir o sistema, chegaremos lá. Provavelmente o GParted não está instalado no sistema, então execute os seguintes comandos:
apt-get update
apt-get install gparted
Após a instalação, execute-o sobre o dispositivo de loop criado por você. Ex.:
gparted /dev/loop31
A imagem desse meu cartão já é uma cópia de um sistema que estava em um cartão de 8GB. Após fazer uma cópia do sistema para o novo cartão, não fiz o redimensionamento. Assim sendo, tenho a partição de boot, a partição raiz e o espaço não alocado de 8GB, que é o espaço restante do cartão de 16GB:
Saia do programa e agora aponte diretamente para a partição raiz.
gparted /dev/loop31p2
Clique com o botão direito sobre o sistema de arquivos raiz (a maior partição usada) e clique em Resize/Move. redimensione o máximo possível, depois deixe alguns MB sobrando.
Após confirmar a mudança, teremos a seguinte tela:
Agora clique no "Check" verde para aplicar as modificações. Uma mensagem será mostrada, clique em Apply e aguarde o processo. Se der um erro, expanda a caixa de mensagens e veja se é algo relacionado ao tamanho mínimo. Vá aumentando a partição até que comporte o mínimo necessário.
Já podemos sair do programa.
Vamos primeiramente reduzir a imagem para o tamanho original. No meu caso, era 8GB. Para isso, pegamos a informação de tamanho com o programa fdisk:
Dispense o dispositivo de loop, primeiramente:
losetup -d /dev/loop31
E agora, a partir das informações fornecidas pelo programa fdisk, pegamos o fim da partição e o tamanho do setor, então utilizando o programa truncate:
truncate --size=$[(15523839+1)*512] original.img
Note que a tabela de partições está marcando 7.4GB, é o que faremos agora; reduzir a imagem para o tamanho original:
Mas a intenção é deixar apenas a área alocada. Não faz sentido deixar um monte de espaço vazio após o sistema de arquivos, certo? Vamos reduzir o sistema mais ainda. Então, remonte o dispositivo de loop seguindo os passos citados anteriormente e dessa vez, abra o dispositivo principal, /dev/loop31 no meu caso:
Clique com o botão direito sobre a partição raiz (a maior) e redimensione-a para o mínimo possível. Clique novamente em Apply, ajuste até que o tamanho mínimo seja o suficiente e a operação seja concluída com sucesso. Agora saia do programa e repita o processo do fdisk e truncate. Não esqueça de dispensar o dispositivo de loop também.
E o truncate:
Humm, depois de tudo instalado no sistema, a imagem ficou com apenas 2.6GB. Incrível ou não?
Agora que você já tem a imagem pronta, pode seguir o procedimento padrão para instalar sua imagem em um novo cartão micro SD.
Pelo Linux, basta utilizar o dd:
dd if=imagem_nova.img of=/dev/sdb #supondo que sdb seja o cartão
Fui fazendo enquanto escrevia o artigo, aproveitando que havia a real necessidade de fazer esse redimensionamento.
Depois fiz o boot para testar a imagem.
Após reduzir o sistema, será necessário expandí-lo. Depois de colocá-lo em um novo cartão, devemos redimensionar o sistema de arquivos. Conectado ao Raspbian, utilize:
sudo raspi-config --expand-rootfs
sudo reboot
Não se preocupe com a mensagem que aparecerá na tela relacionado ao resize, vai funcionar.
No blog tem outro artigo importante de dúvidas corriqueiras, muito importante que sejam supridas. Esse artigo também tem dúvidas e erros comuns, recomendo fortemente a leitura.
Manual do Maker é mais do que um blog. Somos uma empresa de serviços, cuja principal atividade é desenvolvimento e implementação de projetos embarcados e IoT. Trabalhamos dentro da legalidade, emitindo nota fiscal de serviço, elaboração de requisitos de sistema e documentação do código. Não importa onde você esteja, montamos a prova de conceito e gravamos vídeo do projeto antes de entregar o código e/ou hardware configurado.
Em parceria com a AFEletrônica, projetamos e produzimos hardware industrial (também com nota), para lhe entregar a melhor experiência para seu projeto. Entre em contato: vendas@afeletronica.com.br Ou direto comigo: djames.suhanko@gmail.com
Será um prazer tê-lo como nosso cliente!
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.