Изображение 16-гигабайтной карты с неразмеченным пробелом в конце: возможно усечение?

18

Я хотел подготовить дистрибутив для некоторых друзей.
Поскольку у меня больше ничего не лежало, я использовал SD-карту 16 Гб.

Я начал с изображения Debian Weezy 2Gb по умолчанию и не менял размеры.
Теперь, когда я закончил, я хотел создать образ того, что я сделал, но я получил файл размером 16 ГБ, содержащий 14 ГБ неразделенного (не разделенного и свободного) пространства в конце.

[Я использовал Windows // Win32DiskImager, так как сейчас у меня нет ничего, что можно было бы вставить в RPI]

Могу ли я просто обрезать файл изображения сразу за разделенным пространством и перенести ведущую часть на меньшую карту, тогда?

Nippey
источник
2
Если у вас есть доступ к компьютеру с Linux, запустите dd if=/dev/path/to/SD/card of=~/SpecialImage.img, затем установите GParted и запустите gparted ~/SpecialImage.img. Как только GParted откроет ваш .imgфайл, просто измените размер разделов по своему вкусу! (Обе команды должны запускаться с правами root, они должны дать sudo suвам то, что вам нужно. Когда вы $переключаетесь на a #, вы - Root. Будьте осторожны, это Linux-эквивалент Бога.) GParted - это, в основном, GUI-интерфейс для управления тайными разделами. инструменты вам понадобятся Использование GParted просто делает все намного проще и более успешным.
JamesTheAwesomeDude
Пожалуйста, внимательно прочитайте мой вопрос.
Ниппи
Да, я прочитал ваш вопрос и могу сказать, что просто обрезать образ диска опасно. Конечно, вы можете просто вырезать последние байты изображения, но нет гарантии, что вы случайно не обрежете какие-либо файлы, тем более что Linux намеренно распределяет их файлы . Кроме того, в конце файловой системы могут быть некоторые важные метаданные или что-то в этом роде. В целом безопаснее использовать правильные утилиты для изменения размера файловой системы, чем пытаться просто отрубить конец файла самостоятельно.
JamesTheAwesomeDude
1
Хорошо, но я говорю о неразделенном пространстве. Даже Linux не будет помещать данные на дисковое пространство, которые помечены как не разделенные, но остаются в блоке, как написано в таблице разделов. Мое беспокойство было вызвано форматом файла изображения: возможно, файл изображения содержит метаданные, лежащие в конце файла, поэтому я волновался, обрезая информацию о файле. (Надеюсь, мой предыдущий комментарий не прозвучал слишком сильно, sry;)
Nippey
Ох, я понимаю, что вы говорите сейчас. Если вас беспокоит какое-либо поврежденное конечное свободное пространство, запустите GParted на образе после его усечения. Вероятно, в списке будет указана последняя область как «нераспределенная» или «поврежденная» - создайте новый «неформатированный» раздел в этом пространстве. Тогда у вас не будет никаких проблем. :)
JamesTheAwesomeDude

Ответы:

33

Я наконец нашел ресурс, который объясняет мой вопрос.

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

Короткий:

Да, усечение возможно!

Краткое описание процесса:

Извлечение информации о разделе из изображения с помощью 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

Мы видим, что раздел имеет размер около 2,8 Гб (5872026 * 512), остальное разделено .

Итак, все после окончания раздела можно удалить.
Это будет сделано с помощью инструмента truncate. Не забудьте добавить 1 к числу секторов, так как номера блоков начинаются с 0.

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


Редактировать:

Для тех , кто слишком ленив , чтобы перейти на Linux:
Также работает на Windows , с Cygwin «s fdisk.exeи truncate.exe!

Что такое Cygwin?

Я могу процитировать: «Cygwin: почувствуй себя в Linux - под Windows» ( https://www.cygwin.com/ ).
Это набор исполняемых файлов, которые могут работать под Windows, но предоставляют все программы командной строки, которые вы обычно знаете из Linux. Установка Cygwin может занять очень много времени, если вы выбираете каждый пакет во время установки, но, следуя этому примеру, просто убедитесь, что помимо конфигурации по умолчанию, также выбраны пакеты util-linux(fdisk) и coreutils(truncate).
В зависимости от вашего окружения, вам нужно добавить /usr/binи /usr/sbinсвоего $PATH.

Nippey
источник
1
Какой пакет мне нужно установить, чтобы получить fdisk.exeи truncate.exe?
PythonNut
1
Привет @PythonNut, я обновил свой ответ выше и добавил необходимые пакеты: o)
Nippey
Что, если раздел имеет размер диска, даже если используется меньше?
piegames
5

Я знаю, что это старый вопрос, но я хотел бы показать, как выполнить этот процесс на Mac, потому что это не так просто: fdiskне имеет -lопции и truncateне устанавливается по умолчанию:

1. Шаг 1. Установите усечение в Mac OS X:

Для этого вам нужны MacPorts или Homebrew. Я использую MacPorts. Если у вас нет ни одного из них, сначала установите их. Ссылка на MacPorts

Теперь мы можем установить усечение . Откройте свой терминал и введите:

sudo port install truncate

Для варки:

brew install truncate

Это должно сделать это.

2. С помощью Дисковых утилит смонтируйте наш IMG так, чтобы он был виден команде терминала diskutil .

Вскоре вы поймете, почему нам нужен этот шаг. Откройте приложение Дисковая утилита. Нажмите Файл (на верхней панели) -> Открыть образ диска и выберите файл IMG.

3. Проверьте размер раздела IMG и где он установлен.

В терминале введите:

diskutil list

И это должно показать что-то вроде этого где-то в конце:

/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

Итак, мы видим, что около 12 ГБ не разделены. Нам нужно их укоротить.

Эта команда нужна нам для того, чтобы проверить, где смонтирован образ диска. В моем случае он находится под: / dev / disk3

4. Узнайте фактический размер раздела.

3,9 ГБ и 62,9 МБ - это значения, которые не будут работать с усечением. Нам нужно найти размеры разделов в байтах.

5. Запустите fdisk .

В вашем терминале выполните эту команду:

   fdisk /dev/diskX

Где X - это число, которое вы узнали на предыдущем шаге. Это должно привести к чему-то вроде этого:

         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. Время усекать !

На вашем терминале, cdв каталог, в котором находится ваше изображение. Затем написать:

truncate FILE SIZE

ФАЙЛ твой файл, конечно.

РАЗМЕР - это размер в байтах. Что я сделал, так это добавил к столбцу размераfdisk команды, начальному столбцу и умножил на 512. Итак, в моем случае SIZE будет: 512 * (7553024 + 131072) = 3934257152 , что составляет примерно 3,9 ГБ.

Вам потребуется начало и размер этого последнего раздела , что проявляется fdisk. (Не обязательно самый большой, но тот, что в конце файла IMG)

Я немного поэкспериментировал, и всякий раз, когда я вводил 7553024 * 512 или (7553024 + 1) * 512 байт, файл IMG был поврежден. Так что, чтобы быть уверенным, сделайте это, как я указал выше. Это может добавить больше, чем необходимо, но это безопасный вариант.

7. (Необязательно) Легко проверьте, не повреждено ли IMG.

Зайдите еще раз в Дисковую утилиту и попробуйте открыть новый файл IMG, как и раньше. Если он монтируется, вы также можете увидеть новый (меньший) размер. Если это не повышается, что-то пошло не так. (Возможно попробуйте увеличить размер в truncateкоманде)

Это не лучший тест, но это верный способ проверить, поврежден ли новый IMG или нет. Так что не стоит на это рассчитывать, но стоит попробовать ...

Я надеюсь, что кто-то найдет это полезным!

ant0nisk
источник
1
Хороший! Спасибо за расширение знаний :) Хорошо, что вы указали, что 512*(Size+1)не работает. Как видите, я использовал Endи нет Size, так как вы должны сохранить оба раздела, если их более одного. Таким образом, использование 7553024 + 131072( +1) на 100% правильно!
Ниппи
1

Недавний Win32DiskImager фактически имеет возможность включать только выделенные разделы в образ диска. Это сделает обрезку в один клик.

введите описание изображения здесь

Дмитрий Григорьев
источник
Отлично, делает это намного проще в Windows!
Ниппи
0

Это то, что я недавно заметил, когда выполняю множество операций Win32diskimg для резервного копирования образов RPI для развертывания. Недавно я начал тестировать SD-триммер для очистки частей SD-карты, которые не используются для теоретического выравнивания износа. Не уверен насчет того, какой эффект он будет иметь, но один побочный эффект был, когда я представил образ 16-Гбайт SD-раздела, а затем использовал 7zip для его сжатия. Я перешел с обычных 16 ГБ до 9,5 ГБ, теперь файл размером 2,5 ГБ. Сейчас я проверяю, чтобы убедиться, что все в порядке, но кажется, что использование TRIM для обозначения неиспользуемого пространства как 0 делает сжатие изображения намного более эффективным (что имеет смысл). Просто хотел сообщить, что это было очень легко сделать, и не было нескольких шагов.

jctghost
источник
Хотя это не так, на самом деле это не решает вопрос.
RalfFriedl