Монтирование нескольких файлов img как одноконтурного устройства


19

Есть ли способ взять файл img диска, который разбит на части, и смонтировать его как одноконтурное устройство?


1
Как это сломано? Какой это формат? Для этого может быть какая-то магия плавкого предохранителя, если это специальный формат, но я подозреваю, что ответ состоит в том, чтобы поймать их вместе!
Калеб

Я ограничен форматом устройства файлами, которые меньше 4 гигов. У меня есть root-доступ к устройству. Есть ли что-то, что я могу с LVM
MageProspero

Ответы:


16

Я не думаю, что вы можете сделать это на месте, но если у вас достаточно места, это должно сработать:

# 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

Вы не можете просто создать массив RAID из исходных файлов, поскольку диски RAID имеют специальный заголовок, в котором хранится количество дисков, уровень RAID и т. Д. Если вы сделаете это, то часть ваших исходных файлов будет перезаписана.

Вы можете использовать mdadm --buildдля создания массива без метаданных, но тогда вы действительно должны сначала сделать резервную копию. Или если монтирования только для чтения достаточно:

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

почему ты хочешь сделать это? Если ваша файловая система не может обрабатывать файлы> 4 ГБ, вам следует просто переключиться на нормальную.


Может быть, это можно сделать и с помощью устройства отображения, но выше это проще.
Водин

Извините, что так долго принимал, очень хороший ответ. Я бы не стал делать это при нормальных обстоятельствах, это скорее вопрос режима приключений.
MageProspero

2
Возможно, вы захотите использовать truncateвместо, ddпоскольку он намного быстрее (он не выполняет фактическую запись в FS, а просто выделяет иноды и помечает файл как просто содержащий отверстие).
Мацей Пехотка

Ницца. Я этого не знал.
стрибика

Исходя из опыта, если вы используете облачные решения для резервного копирования или синхронизации большого объема, такие как CrashPlan или платный Google Drive, очень и очень хорошая идея использовать небольшие разделенные файлы вместо одного большого файла. В случае неудачной загрузки файла вам нужно будет повторно загрузить, скажем, 1 ГБ вместо целых 100 ГБ.
RAKK

3

Чтобы смонтировать разделенный образ диска (или образ раздела), вы должны использовать affuseиз afftools, которые в настоящее время поддерживаются здесь: https://github.com/sshock/AFFLIBv3

Итак, если у вас есть файл, разбейте его на несколько подфайлов 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

тогда вы можете присоединиться к ним практически с 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

(это объединяет все файлы, начиная с файла 000, затем 001, 002,…)

А затем смонтировать образ

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

Использование описано здесь и некоторые примеры здесь . Справочная страница также доступна после компиляции и установки или здесь .

PS: для меня affuseработало, только если размер разделенных файлов был кратным 512 байтам.


4
Я только что попробовал этот метод. Он имеет серьезное предостережение: он позволит вам монтировать ваш образ только для чтения.
РАКК

Прекрасно работает, если у вас есть только сотни, а не тысячи файловых блоков. Может быть лучше использовать mdadm для создания линейного рейдового раздела: unix.stackexchange.com/a/98779/22709
Джей Тейлор

1

Вы можете написать свое собственное расширение блочного устройства хранения (подумайте о расширении в виде плавкого предохранителя) и выполнять поиск в зависимости от того, какой адрес.

Здесь вы можете найти пример использования предохранителя https://github.com/libfuse/python-fuse/blob/master/example/hello.py


спасибо, я действительно должен обернуть голову вокруг мета-круглости этого одного дня
MageProspero

0

Самое близкое, что я знаю до сих пор, - это создание виртуальной машины VMware. Вы запускаете Linux live CD, такой как Rescatux или Knoppix, вы создаете общую папку SMB на своем хост-компьютере, вы монтируете этот общий ресурс SMB на вашей виртуальной машине, а затем вы помещаете ddобраз в виртуальный HD. VMware по умолчанию сохраняет свои образы дисков в виде разделенных файлов, так что это самая близкая вещь для непосредственного чтения образа диска, разделенного на несколько файлов.

Позже, если вы хотите получить доступ к файлам с вашего хост-компьютера, вы можете попробовать добавить второй виртуальный HD к образу и скопировать туда файлы. Затем вы настраиваете общую папку SMB на виртуальной машине и подключаетесь к ней со своего хоста. Таким образом, вы можете, например, нарушить ограничение в 4 ГБ для файла FAT32 в случае, если вы используете iPod Classic (который использует только fat32) или SD-карту вашего смартфона (обычно вам нужно установить пользовательское ПЗУ, чтобы чтобы использовать Ext3 или NTFS на внешнем хранилище, для этого вам понадобится телефон от популярного производителя, такого как Samsung или Motorola, поэтому, если у вас есть китайский смартфон, вы в тупике).

Однако, по общему признанию, это неэффективное решение, но, поскольку я был ограничен тем, что не смог использовать на своем iPod Classic или на смартфонах Samsung со стандартным ПЗУ любую ФС, кроме fat32, я в значительной степени исследовал весь Интернет в Интернете. Прошлое и до сих пор не могу найти эффективное решение для этого. Я мог бы даже написать это сам.

PS: забыл упомянуть, что если вы используете Windows, это может быть единственным способом сделать это.


Прошло некоторое время с тех пор, как я посетил эту проблему. У меня все еще есть это. И у меня это точно так же, как и у тебя. Интересно, можете ли вы запустить процесс, который имеет свою собственную файловую систему, честно говоря, я хотел бы попробовать это. Я знаю, что могу сделать это в узле. Я имел успех, воспитывая переводчика в корне. Я не знаю, решит ли это вашу проблему, хотя, если я сделал. На моем оборудовании самсунг галактик это нормально. Скажите, хотите ли вы вместе поработать над этой проблемой?
MageProspero

-1

Под BSD вы можете использовать опцию объединения для монтирования. Под Linux вы можете попробовать unionFS.


2
Это не выглядит отдаленно актуальным. Вы неправильно прочитали вопрос?
Жиль "ТАК - прекрати быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.