Как изменить размер файла изображения перед записью на SD-карту?

13

Я пытался создать новый образ Raspbian с другим ядром (с поддержкой CAN) и с установленным Python 3.3. Вместо того, чтобы делать все это на Raspberry Pi, я подумал, что было бы интересно сделать это на компьютере (следуя этим инструкциям ). Однако, как только я смонтировал образ и был готов к работе, у меня быстро закончилось место на диске. Я предполагаю, что это потому, что размер изображения достаточно велик, и ожидается, что пользователь изменит размер файловой системы после его записи на SD-карту.

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

Dral
источник
Этот вопрос , вероятно, поможет вам.
Jivings
1
@Jivings: все эти ответы описывают, как изменить размер изображения после его записи на SD-карту. Я знаю, как это сделать; Меня интересует, как изменить размер изображения перед записью на SD-карту.
Dral

Ответы:

7

Это как изменить размер файла необработанного изображения. Я знаю, это звучит глупо упрощенно, но это будет работать.

Создайте пустое изображение, размер которого вы хотите увеличить оригинал (в моем примере я использую 5 ГБ);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Добавьте это к исходному изображению:

cat /path/to/temp_image >> /path/to/rasperrypi.img

Измените размер файловой системы, которая находится в конце диска (обычно это та, которую вы хотите больше):

resize2fs -f /path/to/rasperrypi.img

Выполнено! Теперь ваш диск должен быть на 5 ГБ больше!

Jivings
источник
Звучит отлично, спасибо: я проверю это сегодня вечером.
DrAl
5
Я только что попробовал это, и когда я добираюсь до стадии resize2fs (после добавления 1 ГБ в файл), я получаю «Плохое магическое число в суперблоке при попытке открыть 2012-12-16-wheezy-raspbian.img Couldn» найти правильный суперблок файловой системы. " Любые предложения относительно того, что я делаю неправильно?
DrAl
Мне кажется, это проблема с тем фактом, что я пытаюсь изменить размер всего изображения (эквивалент / dev / sda) вместо раздела (эквивалент / dev / sda2). Тем не менее, я могу ошибаться и попробовал несколько других вещей безуспешно (например, изменение размера раздела с помощью fdisk, который, кажется, работает, но не помогает мне изменить размер файловой системы).
DrAl
3
Хорошо, я нашел ответ на последний вопрос, немного погуглив: мне нужно было создать петлевое устройство, указывающее на раздел в изображении. Я сделал это, получив начальный сектор второго раздела fdisk -l file.img(это было 122880), а затем losetup --offset $((122880 * 512)) /dev/loop0 file.img. Тогда я мог бы использовать resize2fsна /dev/loop0и убирать с losetup -d /dev/loop0. Если вы обновите свой ответ, чтобы включить его, я отмечу его как принятый ответ. Спасибо, что указал мне правильное направление.
DrAl
1
@DrAl Эй, я попробовал ваше решение, используя resize2fson, /dev/loop0но получил при запуске панику ядра, говоря, что размер суперблока и размер раздела не совпадают: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksвы сталкивались с чем-то вроде этого?
GuySoft
4

Это обобщение ответов выше и в другом месте, которые работали для меня - создайте резервную копию вашего изображения на случай, если вы допустите ошибку:

Сначала увеличьте размер файла изображения (здесь мы добавляем 1 ГБ в конец):

truncate -s +1G ./image.img

Далее сопоставьте все изображение как устройство цикла, чтобы мы могли тыкать в таблицу разделов

sudo losetup /dev/loop0 ./image.img

Для дальнейшего использования сделаем это:

sudo fdisk -l /dev/loop0

Вывод выглядит так:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

Теперь мы переделаем последний раздел, удалив его, а затем воссоздадим в том же начальном месте, того же типа, но в другом конечном месте. Так что обратите внимание на столбец «Пуск» для loop0p2 (раздел 2 - раздел Linux) - мы будем использовать его позже - его 122880 здесь.

sudo fdisk /dev/loop0

Введите следующее - они безопасны для ввода - ничего постоянного не произойдет, пока вы не прочитаете мое объяснение, которое следует:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. просто нажмите Enter, чтобы принять значение по умолчанию
  9. p

Шаг 1 - распечатать текущую таблицу. Шаги 2-3 - удалить раздел 2, Шаги 4-8 - заново создать раздел 2 с новой конечной точкой (по умолчанию это конец изображения), Шаг 9 - распечатать новую таблицу.

Предполагая, что ваша вновь напечатанная таблица идентична исходной таблице, за исключением значения «Конец» и «Блоки» (т. Е. Размер изменился), который вы готовы зафиксировать.

Введите, wчтобы подтвердить изменения, затем нажмите, qчтобы выйти.

Вы можете удалить это петлевое устройство, мы сделаем другое для второго раздела. Запомните начальное смещение, которое вы отметили и использовали выше - мы будем использовать его снова:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

Это создаст новое отображение для /dev/loop0указания только на раздел 2 - для ссылки 512 - размер сектора, который вы можете видеть в первом fdiskвыводе.

Теперь измените размер раздела, чтобы заполнить доступное пространство:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

Готово - теперь убираюсь:

sudo losetup -d /dev/loop0
Greg
источник
спасибо ... вышеуказанные инструкции не сработали для меня, но это сработало. Я получил предупреждение при написании таблицы разделов: `` `Команда (m для справки): w Таблица разделов была изменена. Вызов ioctl () для перечитывания таблицы разделов. Перечитать таблицу разделов не удалось. Неверный аргумент Ядро все еще использует старую таблицу. Новая таблица будет использоваться при следующей перезагрузке или после запуска partprobe (8) или kpartx (8). «Я просто проигнорировал это, и это было прекрасно.
StFS
Отлично! Вы единственный, кто сделал правильный ответ! Благодарю.
yushulx
3

Для тех, у кого работает Oracle VM VirtualBox, это довольно просто.

На Windows-машине все идет следующим образом:

input.imgздесь изображение, размер которого должен быть уменьшен, и output.imgявляется окончательным изображением - в этом примере определено, что оно имеет размер 7000 МБ.

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

Надеюсь, что это помогает немного.

Markus
источник
Спасибо за это решение, очень хитрое. Это единственный, который я смог найти, он бесплатный и отлично работает на Windows. У меня были некоторые проблемы с 16 ГБ картами, которые были не совсем одинакового размера и нуждались в изменении размера моего изображения.
Джош
Я получил ошибку паники ядра. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX
Обратите внимание, что это усечение изображения - вы потеряете данные, если они будут превышать отметку 7000 МБ - команды не будут предупреждать или жаловаться.
Майк Редроб
2

Это как изменить размер файла необработанного изображения. Я знаю, это звучит глупо упрощенно, но это будет работать.

Создайте пустое изображение, размер которого вы хотите увеличить оригинал (в моем примере я использую 5 ГБ);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Добавьте это к исходному изображению:

cat /path/to/temp_image >> /path/to/rpi.img

Далее происходит изменение размера раздела и файловой системы. Сначала получите смещение раздела;

fdisk -l /path/to/rpi.img

Результаты в таблице, как это:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

Обратите внимание на начальное смещение второго раздела

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

Наконец размонтировать / dev / loop

losetup -d /dev/loop0

Выполнено! Теперь ваш диск должен быть на 5 ГБ больше!

Йонас Стумф Стевнсвиг
источник