Montagem de vários arquivos img como dispositivo de loop único

18

Existe uma maneira de pegar um arquivo de img de disco dividido em partes e montá-lo como um dispositivo de loop único?

MageProspero
fonte
1
Como está quebrado? Que formato é esse? Pode haver alguma mágica de fusível para isso, se for um formato especial, mas suspeito que a resposta seja reuni-los!
Caleb
Estou restrito pelo formato do dispositivo a arquivos com menos de 4 GB. Eu tenho acesso root ao dispositivo. Existe algo que eu possa com LVM
MageProspero

Respostas:

16

Eu não acho que você pode fazê-lo no lugar, mas se você tiver espaço suficiente, isso deve funcionar:

# Create the files that will hold your data
dd if=/dev/zero of=part-00 bs=1M count=4k
dd if=/dev/zero of=part-01 bs=1M count=4k

# Create the loop devices
losetup /dev/loop0 part-00
losetup /dev/loop1 part-01

# Create a RAID array
mdadm --create /dev/md0 --level=linear --raid-devices=2 /dev/loop0 /dev/loop1

# Copy the original filesystem
dd if=original-file-00 of=/dev/md0 bs=512
# Look at the records written value
dd if=original-file-01 of=/dev/md0 bs=512 seek=<sum of records written values so far>

# Mount the new filesystem
mount /dev/md0 /mnt

Você não pode simplesmente criar uma matriz RAID a partir dos arquivos originais, porque os discos RAID têm um cabeçalho específico em que o número de discos, o nível RAID, etc, é armazenado. Se você fizer isso, parte dos arquivos originais será substituída.

Você pode usar o mdadm --buildpara criar uma matriz sem metadados, mas deve fazer um backup primeiro. Ou se a montagem somente leitura for suficiente:

losetup -r /dev/loop0 original-00
losetup -r /dev/loop1 original-11
mdadm --build /dev/md0 --level=linear --raid-devices=2 /dev/loop0 /dev/loop1
mount /dev/md0 /mnt

Por que você quer fazer isso? Se o seu sistema de arquivos não conseguir lidar com arquivos de mais de 4 GB, você deve simplesmente mudar para um sã.

stribika
fonte
Pode ser capaz de fazê-lo também com o mapeador de dispositivos, mas o acima é mais fácil.
Wodin
Desculpe por demorar tanto para aceitar, uma resposta muito boa. Eu não faria isso em circunstâncias normais, é mais uma pergunta no modo aventura.
MageProspero #
2
Você provavelmente deseja usar em truncatevez de ddser muito mais rápido (ele não realiza gravação real no FS, mas apenas aloca inodes e marca o arquivo como contendo apenas um furo).
Maciej Piechotka
Agradável. Eu não sabia disso.
stribika
Por experiência, se você usar soluções de backup ou sincronização baseadas em nuvem de grande capacidade, como o CrashPlan ou o Google Drive pago, é uma idéia muito, muito boa, usar pequenos arquivos divididos em vez de um único arquivo enorme. No caso de um download de arquivo com falha, você só precisará baixar novamente, por exemplo, 1 GB, em vez dos 100 GB.
RAKK 14/04
2

Para montar uma imagem de disco dividido (ou imagem de partição), você deve usar affuseos afftools atualmente mantidos aqui: https://github.com/sshock/AFFLIBv3

Portanto, se você tiver um arquivo, divida-o em vários subarquivos test_img.000, test_img.001, test_img.002, test_img.003, test_img.004, test_img.005, test_img.006, test_img.007, test_img.008, test_img.009

então você pode se juntar a eles virtualmente com affuse

# affuse test_img.000 /mnt/combine
# ls -lh /mnt/combine
total 0
-r--r--r-- 1 root root 2.0G 1969-12-31 16:00 test_img.000.raw

(isso combina todos os arquivos, começando com o arquivo 000 e 001, 002,…)

E depois monte a imagem

mount -o ro,loop,offset=329043456 /mnt/combine/test_img.000.raw /mnt/test

O uso é descrito aqui e alguns exemplos aqui . Uma página de manual também está disponível após a compilação e instalação, ou aqui .

PS: Para mim, affusesó funcionava se os arquivos divididos tivessem um tamanho múltiplo de 512 bytes.

erik
fonte
3
Eu apenas tentei esse método. Ele tem uma ressalva importante: permitirá apenas montar sua imagem como somente leitura.
RAKK
Funciona muito bem, desde que você tenha apenas centenas e não milhares de blocos de arquivos. Pode ser melhor usar o mdadm para criar uma partição de ataque linear: unix.stackexchange.com/a/98779/22709
Jay Taylor
1

Você pode escrever sua própria extensão de dispositivo de armazenamento em bloco (pense em extensões semelhantes a fusíveis) e realizar buscas de maneira independente do endereço.

Aqui você pode encontrar exemplos de como usar o fusível https://github.com/libfuse/python-fuse/blob/master/example/hello.py

test30
fonte
obrigado Eu realmente deveria entender minha meta circularidade daquele dia
MageProspero
0

A coisa mais próxima que eu sei até agora de uma solução é criar uma VMware VMware. Você inicia um live CD do Linux como Rescatux ou Knoppix, cria uma pasta compartilhada SMB no computador host, monta esse compartilhamento SMB na sua VM e depoisdd a imagem no HD virtual. O VMware, por padrão, salva suas imagens de disco como arquivos divididos, portanto é a coisa mais próxima de ler diretamente uma imagem de disco dividida em vários arquivos.

Posteriormente, se você quiser acessar os arquivos do seu computador host, tente adicionar um segundo HD virtual à imagem e copiar os arquivos lá. Em seguida, você configura uma pasta compartilhada SMB na VM e se conecta a ela a partir do seu host. Dessa forma, você pode, por exemplo, violar o limite de 4 GB de arquivo FAT32 no caso de estar usando um iPod Classic (que apenas graks fat32) ou o cartão SD do seu smartphone (geralmente é necessário instalar uma ROM personalizada para Para usar o Ext3 ou NTFS no armazenamento externo, é necessário um telefone de um fabricante popular como Samsung ou Motorola; portanto, se você tiver um smartphone chinês, ficará perplexo).

É certo que não é uma solução eficiente, no entanto, mas como tenho sido limitado por não poder usar nenhum outro FS além do fat32 no meu iPod Classic ou nos meus smartphones Samsung com ROM de estoque, vasculhei praticamente toda a Internet na Internet. passado e ainda não consigo encontrar uma solução eficiente para isso. Eu posso até ter que escrever sozinho.

PS: Esqueci de mencionar que, se você estiver no Windows, essa pode ser a única maneira de fazer isso.

RAKK
fonte
Já faz algum tempo desde que eu visitei esse problema. Eu ainda tenho isso. Também tenho exatamente a mesma razão que você. Gostaria de saber se você pode abrir um processo que possui seu próprio sistema de arquivos personalizado, sinceramente, eu adoraria tentar isso. Eu sei que posso fazer isso no nó. Tive sucesso ao criar o intérprete enraizado. Eu não sei se isso resolve o seu problema, se eu fiz. No meu hardware galáxias samsung isso é bom. Diga-me que você gostaria de trabalhar em algo para esse problema juntos.
MageProspero
-1

No BSD, você pode usar a opção de união para montar. No Linux, você pode tentar o unionFS.

julienlf
fonte
2
Isso não parece remotamente relevante. Você interpretou mal a pergunta?
Gilles 'SO- stop be evil'