Imagem de uma placa de 16 Gb contendo espaço não particionado no final: Truncando possível?

18

Eu queria preparar uma distro para alguns amigos.
Como eu não tinha mais nada por aí, usei um cartão SD de 16Gb.

Comecei com a imagem padrão do Debian Weezy 2Gb e não fiz nenhum redimensionamento.
Agora, ao concluir, queria criar uma imagem do que fiz, mas recebo um arquivo de 16 GB, contendo 14 GB de espaço não particionado (não particionado e livre) no final.

[Eu usei o Windows // Win32DiskImager porque não tenho nada livre para colar no rPI agora]

Posso apenas truncar o arquivo de imagem logo atrás do espaço particionado e transferir a parte principal para um cartão menor?

Nippey
fonte
2
Se você tiver acesso a um computador Linux, execute dd if=/dev/path/to/SD/card of=~/SpecialImage.img, instale o GParted e execute gparted ~/SpecialImage.img. Depois que o GParted abrir seu .imgarquivo, basta redimensionar as partições ao seu gosto! (Ambos os comandos devem ser executados como root, sudo suvocê deve obter o que você precisa. Quando você $alterna para a #, você é Root. Cuidado, esse é o equivalente a Deus em Linux.) GParted é basicamente uma interface gráfica para o gerenciamento de partições arcano ferramentas necessárias. O uso do GParted torna tudo muito mais simples e fácil de obter.
JamesTheAwesomeDude
Plese leu minha pergunta com atenção.
Nippey 26/04
Sim, li sua pergunta e posso lhe dizer que apenas truncar uma imagem de disco é perigoso. Claro, você pode simplesmente cortar os últimos bytes de uma imagem, mas não há garantia de que você não cortará nenhum arquivo acidentalmente, especialmente porque o Linux intencionalmente coloca seus arquivos fora . Além disso, pode haver alguns metadados importantes no final do sistema de arquivos ou algo assim. No geral, é uma aposta mais segura usar os utilitários de redimensionamento adequados do sistema de arquivos do que tentar cortar sozinho o final de um arquivo.
JamesTheAwesomeDude
11
Bem, mas estou falando de espaço não particionado. Mesmo o Linux não coloca nenhum dado no espaço em disco marcado como não particionado, mas permanece dentro do bloco conforme escrito na Tabela de partição. Minha preocupação foi causada pelo formato do arquivo de imagem: pode ser que o arquivo de imagem tenha metadados no final do arquivo, então eu estava preocupado em cortar as informações do arquivo. (Hope meu comentário anterior não parecia muito difícil, sry;)
Nippey
Ohh, entendi o que você está dizendo agora. Se você estiver preocupado com algum espaço livre à direita corrompido, execute o GParted na imagem após a truncamento. Provavelmente, listará a última área como "não alocada" ou "corrompida" - crie uma nova partição "não formatada" nesse espaço. Então, você não terá nenhum problema. :)
JamesTheAwesomeDude

Respostas:

33

Finalmente encontrei um recurso que está explicando minha pergunta.

http://softwarebakery.com/shrinking-images-on-linux

Curto:

Sim, é possível truncar!

Resumo do processo:

Extraindo as informações da partição da imagem usando fdisk:

$ fdisk -lu image.img
Disk image.img: 4096 MB, 4096000000 bytes, 8000000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a1bc7

      Device Boot      Start         End      Blocks   Id  System
image.img1              2048     5872026     5869978    b  W95 FAT32

Vemos que a partição tem um tamanho de cerca de 2,8Gb (5872026 * 512), o resto não é particionado .

Portanto, tudo após o final da partição pode ser removido.
Isso será feito com a ferramenta truncate. Não se esqueça de adicionar 1 ao número de setores, pois os números de bloco começam em 0.

$ truncate --size=$[(5872026+1)*512] image.img


Editar:

Para quem está com preguiça de mudar para o Linux:
Também funciona no Windows com Cygwin 's fdisk.exee truncate.exe!

O que é Cygwin?

Posso citar: "Cygwin: obtenha essa sensação do Linux - no Windows" ( https://www.cygwin.com/ ).
É um conjunto de executáveis ​​que podem ser executados no Windows, mas fornecem todos os programas de linha de comando que você normalmente conhece no Linux. O Cygwin pode demorar muito para instalar, se você selecionar todos os pacotes durante a instalação, mas, para seguir este exemplo, basta garantir que, além da configuração padrão, também estejam selecionados os pacotes util-linux(fdisk) e coreutils(truncate).
Dependendo do seu ambiente, você precisa adicionar /usr/bine adicionar /usr/sbinao seu $PATH.

Nippey
fonte
11
Qual pacote eu preciso instalar para obter fdisk.exee truncate.exe?
PythonNut
11
Oi @PythonNut, eu atualizei a minha resposta acima e acrescentou os pacotes necessários: o)
Nippey
E se a partição tiver o tamanho do disco, mesmo que menos seja usado?
piegames
5

Sei que essa é uma pergunta antiga, mas gostaria de mostrar como fazer esse processo no Mac, porque não é tão fácil: fdisknão possui a -lopção e truncatenão está instalado por padrão:

1. Etapa 1: Instale o truncado no Mac OS X:

Você precisa do MacPorts ou Homebrew para isso. Eu uso MacPorts. Se você não tiver um desses, vá em frente e instale-os primeiro. Link para MacPorts

Agora, podemos instalar o truncado . Abra seu terminal e digite:

sudo port install truncate

Para instalação do Brew:

brew install truncate

Isso deve servir.

2. Use Utilitários de Disco para montar nosso IMG para que fique visível ao comando terminal do diskutil .

Você verá daqui a pouco por que precisamos dessa etapa. Abra o aplicativo Utilitário de Disco. Clique em Arquivo (na barra superior) -> Abrir imagem de disco e selecione seu arquivo IMG.

3. Verifique o tamanho da partição do IMG e onde ele está montado.

Em um terminal, digite:

diskutil list

E deve mostrar algo assim, em algum lugar no final:

/dev/disk3 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        +16.0 GB    disk3
   1:             Windows_FAT_32 boot                    62.9 MB    disk3s1
   2:                      Linux                         3.9 GB     disk3s2

Portanto, vemos que cerca de 12 GB não são particionados. Precisamos truncá-los.

A razão pela qual precisamos desse comando é verificar onde a imagem do disco está montada. No meu caso, está em: / dev / disk3

4. Descubra o tamanho real da partição.

3,9 GB e 62,9 MB são valores que não funcionarão com truncado. Precisamos encontrar os tamanhos das partições em bytes.

5. Execute o fdisk .

No seu terminal, execute este comando:

   fdisk /dev/diskX

Onde X é o número que você descobriu na etapa anterior. Isso deve resultar em algo como isto:

         Starting       Ending
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
 1: 0C    0 130   3 -    8  40  32 [      8192 -     122880] Win95 FAT32L
 2: 83    8  40  33 -  478  79  49 [    131072 -    7553024] Linux files*
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused      

6. Hora de truncar !

No seu terminal, cdno diretório em que está sua imagem. Então escreva:

truncate FILE SIZE

FILE é o seu arquivo, é claro.

TAMANHO é o tamanho em bytes. O que fiz foi adicionar à coluna de tamanho do fdiskcomando a coluna inicial e multiplicar por 512. Portanto, no meu caso, SIZE será: 512 * (7553024 + 131072) = 3934257152 , que é aproximadamente 3,9 GB.

Você precisará do início e do tamanho da última partição mostrada por fdisk. (Não necessariamente o maior, mas o final do arquivo IMG)

Eu experimentei um pouco e sempre que inseria 7553024 * 512 ou (7553024 + 1) * 512 bytes, o arquivo IMG estava corrompido. Então, só para ter certeza, faça como eu indiquei acima. Pode adicionar mais do que o necessário, mas é uma opção segura.

7. (Opcional) Teste facilmente se o IMG não está corrompido.

Vá novamente no Utilitário de Disco e tente abrir o novo arquivo IMG como antes. Se for montado, você também poderá ver o novo tamanho (menor) . Se não montar, algo deu errado. (Talvez tente aumentar o tamanho no truncatecomando)

Este não é o melhor teste, mas é uma maneira de verificar se o novo IMG está corrompido ou não. Então, não conte com isso, mas vale a pena tentar ...

Espero que alguém ache isso útil!

ant0nisk
fonte
11
Agradável! Obrigado por expandir o conhecimento :) É bom que você apontou que 512*(Size+1)não funciona. Como você pode ver, eu usei Ende não Size, pois você deve manter as duas partições se houver mais de uma. Então, usar 7553024 + 131072( +1) é 100% correto!
Nippey
1

O Win32DiskImager recente realmente tem uma opção para incluir apenas partições alocadas na imagem do disco. Isso fará o corte com um clique.

insira a descrição da imagem aqui

Dmitry Grigoryev
fonte
Excelente, facilita muito no Windows!
Nippey
0

Apenas algo que notei recentemente ao realizar muitas dessas operações do Win32diskimg para fazer backup de minhas imagens RPI para implantação. Recentemente, comecei a testar o SD "aparar" fstrim para limpar partes do cartão SD que não estão sendo usadas para o nivelamento teórico do desgaste. Não tenho certeza sobre o efeito que terá, mas um efeito colateral foi quando criei uma imagem da partição SD de 16GB e usei o 7zip para compactá-la. Eu fui dos 16GB habituais para 9,5GB para agora um arquivo de 2,5GB. Estou testando agora para garantir que nada esteja errado, mas parece que o uso do TRIM para marcar o espaço não utilizado como zero torna a compactação da imagem muito mais eficiente (o que faz sentido). Só queria relatar que isso era super fácil de realizar e não havia várias etapas.

jctghost
fonte
Embora não esteja errado, ele realmente não aborda a questão.
RalfFriedl 27/04