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


13

Я намагався створити нове зображення Raspbian з іншим ядром (з підтримкою CAN) та з встановленим Python 3.3. Замість того, щоб робити все це на Raspberry Pi, я подумав, що було б цікаво зробити це на комп’ютері (дотримуючись цих інструкцій ). Однак, як тільки я встановив зображення і готовий до роботи, я швидко вичерпав місце на диску. Я припускаю, що це розмір зображення, який має бути лише досить великим, сподіваючись, що користувач змінить розмір файлової системи після запису на SD-карту.

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


Це питання вам , мабуть, допоможе.
Відхилення

1
@ Життя: усі ці відповіді описують, як змінити розмір зображення після його запису на SD-карту. Я знаю, як це зробити; Мене цікавить, як змінити розмір зображення, перш ніж записати його на SD-карту.
DrAl

Відповіді:


8

Ось як змінити розмір необробленого файлу зображень. Я знаю, це звучить тупо спрощено, але це спрацює.

Створіть порожнє зображення розміру, який ви хочете розширити оригінал (у моєму прикладі я використовую 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 Гб більше!


Це звучить ідеально, дякую: тестую це сьогодні ввечері.
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 Ей, я намагався ваше рішення , використовуючи resize2fsна /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

дякую ... наведені вище інструкції не працювали для мене, але це було. Я отримав попередження під час написання таблиці розділів: `` Команда (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

Сподіваюсь, це трохи допомагає.


Дякую за таке рішення, дуже хитро. Це єдиний, кому мені вдалося знайти, який є безкоштовним і відмінно працює в Windows. У мене виникли проблеми з картками 16 Гб, які були не зовсім однакового розміру і потрібні для зміни розміру зображення.
Джош

Я отримав панічну помилку ядра. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX

Зверніть увагу, що це обрізання зображення - ви втратите дані, якщо вже є позначка 7000MB - команди не попереджають і не скаржаться.
Майк Редроудж

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 / цикл

losetup -d /dev/loop0

Готово! Тепер ваш диск повинен бути на 5 Гб більше!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.