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)


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


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.


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!)


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.