A imagem SD não cabe no cartão SD

13

Eu tive um pi configurado e funcionando bem por um tempo (RPi - 1). Eu queria criar uma imagem do RPi-1 para carregar uma cópia exata no meu segundo pi (RPi-2). O cartão SD no RPi - 1 é de 4 GB (apenas cerca de metade é realmente usada) e o cartão SD no RPi - 2 também é de 4 GB. Eu uso o Win32 Disk Imager para criar uma cópia do RPi-1, com êxito. Formatei o cartão SD para o RPi - 2 com o SD Formatter 4.0 (no Windows 7). No entanto, quando uso o Win32 Disk Imager para gravar a imagem RPi - 1 no cartão SD do RPi - 2, recebo: "Não há espaço suficiente no disco: Tamanho 7744512 Disponível: 7626752 setores Tamanho do setor: 512"

Sei que não é uma imagem ruim porque posso formatar o cartão SD para RPi - 1 e gravar a imagem novamente sem problemas.

O que estou perdendo aqui? Nem todos os cartões SD de 4 GB são do mesmo tamanho ou variam um pouco? Há algo que você precisa fazer em um cartão SD totalmente novo que eu perdi?

(RPi - 1 Cartão SD = Sandisk 4 GB // RPi - 2 Cartão SD = Kingston 4 GB)

Rob_IGS
fonte
2
NÃO há dois cartões SD com o mesmo tamanho, a menos que sejam do mesmo fabricante, mesma marca e do mesmo lote de produção. você NÃO deve usar a imagem do cartão SD para fins de backup, mas copiar os arquivos .
21714
Quanto espaço o seu computador diz estar no cartão vazio?
Beta Decay

Respostas:

6

Na verdade, nem todos os cartões SD têm o mesmo tamanho exato. Você precisaria encolher a partição para ajustá-la ao SD menor. Eu também tive um problema semelhante. O que eu fiz foi ter um SD separado com (no meu caso) Raspbian. E liguei o SD que queria redimensionar, usando um leitor de cartão USB.

Antes de reduzir a partição com segurança, você precisa garantir que não haja dados no final da remoção. Você pode fazer isso com resize2fs -M -p /dev/sda2(você deve substituir / dev / sda2 pelo caminho correto para o leitor de cartão USB e a partição linux que deseja redimensionar). Isso redimensionará o sistema de arquivos para o menor tamanho possível. Na verdade, você pode especificar o tamanho exato que deseja, mas isso envolve alguns cálculos matemáticos e de conversão em tamanhos e setores de blocos e outros. Mais seguro e fácil de não fazer isso.

Depois disso, você pode reduzir a partição. Eu acho que usei fdiskpara isso. Obtenha a posição inicial exata da partição, exclua-a e recrie-a usando a mesma posição inicial, mas com um tamanho menor.

Por fim, você precisa ampliar o sistema de arquivos novamente para ocupar toda a partição usando resize2fs -p /dev/sda2

Gerben
fonte
Eu só quero esclarecer um pouco essa resposta, pois achei um pouco difícil de seguir. Primeiro desmontei as partições no cartão SD. Então eu tive que executar e2fsck -f /dev/mmcblk0p2(estou diminuindo a segunda partição do mmcblk0) para verificar a consistência. Então me foi permitido correr resize2fs -M -p /dev/mmcblk0p2como sugerido.
AudiFanatic
1

Seria melhor criar um tarball do sistema de arquivos, porque quando você cria uma imagem de disco completa, também copia os dados excluídos. Quando você exclui um arquivo, o inode é desvinculado, mas os dados reais ainda estão no disco. Uma imagem de disco completa usando ddcopiaria esses dados antigos (exceto se você os substituir primeiro /dev/zero, o que leva algum tempo), mas um backup usando tarcopiaria apenas os dados atuais.

Ou ... você pode fazer como muitas distribuições: reduza o tamanho do sistema de arquivos para algo seguro como 1,9 GiB antes de criar sua imagem e redimensione para preencher o disco depois de restaurar o backup.

Advertência: Não conheço as ferramentas de imagem do Windows, sou usuário de Linux.

Amedee Van Gasse
fonte
1

se você usa linux, aqui está um pequeno script:

#!/bin/bash
# Automatic Image file resizer
# Written by SirLagz
strImgFile=$1

export PATH=$PATH:/sbin

if [[ ! $(whoami) =~ "root" ]]; then
echo ""
echo "**********************************"
echo "*** This should be run as root ***"
echo "**********************************"
echo ""
exit
fi

if [[ -z $1 ]]; then
echo "Usage: ./autosizer.sh <Image File>"
exit
fi

if [[ ! -e $1 || ! $(file $1) =~ "x86" ]]; then
echo "Error : Not an image file, or file doesn't exist"
exit
fi

partinfo=`parted -ms $1 unit B p | awk '{if (NR!=2) {print}}'`  
fileSystemType=`echo "$partinfo" | grep -o 'ext4\|ext3'`
numberOfMatchPart=`echo "$fileSystemType" | wc -l`

if [[ $fileSystemType == "" || $numberOfMatchPart -eq 0 || $numberOfMatchPart -gt 1 ]] ; then
echo "Error : Your partition layout is not currently supported by this tool."
exit
fi

partnumber=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print $1 } '`
partstart=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2)) } '`
loopback=`losetup -f --show -o $partstart $1`

e2fsck -f $loopback

minsize=`resize2fs -P $loopback | awk -F': ' ' { print $2 } '`
minsize=`echo $minsize+200000 | bc`

resize2fs -p $loopback $minsize
sleep 1
losetup -d $loopback

partnewsize=`echo "$minsize * 4096" | bc`
newpartend=`echo "$partstart + $partnewsize" | bc`

parted $1 rm $partnumber
parted $1 unit B mkpart primary $partstart $newpartend
endresult=`parted -m $1 unit B print free | tail -1 | awk -F: ' { print substr($2,0,length($2)) } '`
truncate -s $endresult $1

crédito: Sirlagz (muuuuito desculpa!)

Gilles Grandguillaume
fonte
4
você gostaria de explicar o que esse script deve fazer? como posso especificar o tamanho de imagem necessário por telepatia?
21814
o script reduzir um img, ter o tamanho usado, adicionar 200 mil ao fim (para o log etc), depois de um arranque com este img você precisa para ampliar o tamanho fit o novo cartão SD ...
Gilles Grandguillaume
Olá, eu escrevi este script, portanto, sinta-se à vontade para me responder qualquer pergunta no meu blog: sirlagz.net - Esse script precisa ser executado no Linux. O script reduzirá o tamanho da imagem para o tamanho mínimo possível, além de um pouco de espaço livre. Isso permite que você coloque uma imagem de 8 gb (da qual apenas 1 gb é usado) em um cartão de 1 gb.
Lawrence
deve usar "partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '" para se livrar de B no partstart.
Netawater 25/10/2015
@netawater tenho um resultado diferente para este comando com o kubuntu / debian: sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/… ... eu uso esse script sem "-1" com sucesso ! eu não entendo
Gilles Grandguillaume