Як зробити зображення (.img) з того, що є на SD-картці (але такою ж компактною, як оригінальна)?


20

Я намагався:

sudo dd bs=4k if=/dev/mmcblk0 of=/media/1BAB47551C66A42B/raspbian_migs2.gz

Він створює .img-файл із 7,6 ГБ (розмір картки, АЛЕ те, що на картці, має 700 МБ).

І:

sudo dd bs=4k if=/dev/mmcblk0 | gzip > /media/1BAB47551C66A42B/raspbian_migs2.gz

створює .gz файл з 2,7 ГБ.

В оригінальній програмі Raspbian ( Debian 7 (Wheezy)) від http://www.raspberrypi.org/downloads є 494,44 Мб.

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

(Я на Ubuntu.)


Відповіді:


18

У коментарі до RooTer ви згадуєте, що A) ви зменшили початковий розмір розділу за допомогою gparted, але ddвсе-таки копіюєте всю карту і B), що хочете включити обидва розділи до зображення.

Випуск "А" пояснити нескладно: ви все ще копіюєте всю карту, тому що саме це /dev/mmcblk0стосується. Окремі розділи - це звичайно /dev/mmcblk0p1і /dev/mmcblk0p2. Це ускладнення у випуску "B", але ви не можете просто ddкожен розділ і об'єднати два файли разом, оскільки таблиця розділів, на початку /dev/mmcblk0 якої індексує початок і довжину кожного розділу. Без цього зображення буде непридатним.

Однак ви можете отримати довжину кожного розділу fdisk -lі використовувати його для визначення деяких параметрів dd. Наприклад:

> fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 16.1 GB, 16138633216 bytes
4 heads, 16 sectors/track, 492512 cylinders, total 31520768 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: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1    8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2  122880    26746879    13312000   83  Linux

Одиниці "Пуск" і "Кінець" - це сектори, і помічаємо розмір сектору, 512 байт. Для /dev/mmcblk0p2, 26746879 (останній сектор) - 122880 (перший сектор) = 26623999/2 (для 2 секторів на кБ) / 1024 (кБ на МБ) / 1024 (МБ на ГБ) = 12,69, що я зростав розділ за допомогою gparted до 12 ГБ, тому це виглядає правильно (справді я повинен використовувати 1000, а не 1024 як дільник зі сховищем, який працює на 13,31 ГБ, але я підозрюю, що gparted та деякі інші інструменти також використовують 1024).

Отже, перше, що ви хочете перевірити, це те, що ваш другий розділ справді меншого розміру, на який ви його встановили. Далі просто використовуйте ці цифри за допомогою dd; для мене це було б:

dd if=/dev/mmcblk0 of=rpi.img bs=512 count=26746880

У мене є додатковий сектор, щоб уникнути будь-якого виду через одне непорозуміння того, як це ddпрацює. Існує простий спосіб перевірити, чи спрацювало це:

> fdisk -l rpi.img

Disk rpi.img: 102 MB, 102400000 bytes
255 heads, 63 sectors/track, 12 cylinders, total 200000 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: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
rpi.img1          8192      122879       57344    c  W95 FAT32 (LBA)
rpi.img2        122880    26746879    13312000   83  Linux

Зауважте, тут є деяка розбіжність: сектори "Пуск" і "Кінець" відповідають оригінальній таблиці розділів, але загальний розмір у статистиці вгорі становить лише 102 МБ! Це тому, що я насправді використовувався count=200000як параметр, ddтому що я не дуже хотів турбуватися копією в 12 ГБ (зауважте також "всього 200000 секторів"). Причина, що таблиця внизу не відображає це, полягає в тому, що fdisk отримує свою інформацію з даних про розділи, скопійованих дослівно на початку зображення з початку карти SD, що, як я вже згадував у другому абзаці, є життєво важливим підтримувати. Якби я (правильно) скопіював решту, цифри були б просторовими, а зображення було б життєздатним.

Спробуйте. :)


На OSX fdisk чітко не роздруковує розмір сектору в байтах. Замість цього він пропонує "геометрію: 966/255/63 [15523840 секторів]", що представляє циліндри / головки / сектори. Які значення bs і count слід використовувати в цьому випадку?
Артур Геберт

@ArthurHebert: Загальна кількість байтів / загальна кількість секторів. Наприклад, у першому випадку вище це було б 16138633216/31520768 = 512, у другому 102400000/200000 = 512.
золотинки

1
Ви можете використовувати fdisk -l <device>і те, що повинно надрукувати таблицю, не входячи в інтерактивний режим.
berto

5

Я б здогадався, що проблема полягає в колись використаних секторах, які все ще мають в собі бруд. Після видалення файлу з файлової системи видаляються лише метадані, а не самі дані, таким чином залишаються кілька випадкових одно нулів замість простого стиснення нульових блоків.

Просте рішення, але вимагає перезаписати весь вільний простір на картці. Пам'ятайте, що тривалість життя SD-карт обмежена кількістю переписувань, тому цей спосіб не є кращим.

dd bs=4M if=/dev/zero of=/root/junk
sync
rm junk

Більш задіяне рішення, оскільки вам потрібно встановити zerofree на іншому комп'ютері, який не використовуватиме цю SD-карту в той час.

zerofree /dev/mmcblk0p2

Детальніше читайте на http://intgat.tigress.co.uk/rmy/uml/index.html

Що ви повинні пам’ятати, це те, що, виконуючи dd of / dev / mmcblk0, ви копіюєте весь пристрій, навіть якщо розділи менші. Якщо ви використовували raspi-config для розширення основного розділу перед тим, як зробити один із перерахованих вище способів, вам буде добре.

PS Якщо ви не заперечуєте проти зміни формату файлу зображення, ви можете використовувати partimage, який у відомих файлових системах залишає звільнені блоки, навіть якщо в них все ще є бруд. Знову частку найкраще використовувати, коли файлова система не змонтована, щоб уникнути пошкодження резервної копії. Ви, мабуть, могли б уникнути, перераховуючи його лише для читання, але я залишаю це на ваш розсуд.


як частина моєї квести на спробу отримати це зробити, я використовував GParted , щоб зменшити розділ SDCard для acomodate тільки даних я, то я намагався дд Ing і результати такі ж 7.6GB файл, Partimage косяк зберегти 2 розділів (/ boot + /) в 1 зображення
mf_

можливо я не зробив це досить зрозумілим - це має змінитись, коли ви стискаєте його, як ви намагалися з gzip раніше.
RooTer

Заповнення картки таким чином спричинить цілу купу циклів запису та скоротить термін служби картки. спробуйтеdd bs=4M if=/dev/zero of=/root/junk
nc4pk

@ tapped-out thx, відредаговано;)
RooTer

4

Коротка відповідь - використовуйте SD-карту 2 Гб.

Довга відповідь, ddпоняття не має, де закінчуються "хороші" дані, ви повинні якось це сказати.

Існує два способи, найпростіше - використовувати SD-карту 2 Гб, яка автоматично припинить копіювання понад 2 ГБ і призведе до стисненого файлу в 500 МБ за вашим бажанням.

Інший спосіб, більш складний для залученого, - це обчислити правильний розмір даних із таблиці розділів і вказати цей правильний розмір як параметри для ddкоманди. Ви можете використовувати для цього параметри bs=XXX(розмір блоку) та count=XXX(кількість блоків). Наприклад, ви можете вказати bs=10Mрозмір блоку 10 Мб (що, безумовно, зробить копіювання набагато швидшим порівняно з розміром блоку 4k, який ви використовуєте у своїх командах), і count=200скопіювати 10 МБ * 200 = 2000 МБ (2 ГБ). Можливо, вам доведеться відрегулювати розмір блоку та кількість блоків відповідно до схеми розділів вашої SD-карти .


1
Надання ddконкретного розміру НІКОЛИ не працює. Це передбачає, що всі фактичні дані у файловій системі акуратно розташовані на початку пристрою, тому якщо у вас є 2 Гб на 8 ГБ розділі, потрібно просто скопіювати перші 2 ГБ. Це ЛЮДИНА. Ці 2 ГБ даних будуть розкидані по всьому простору, особливо на сучасних картах SD, які не використовують повторно блоки, поки всі наявні блоки не будуть використані хоча б один раз (це називається вирівнюванням зносу і це продовжує термін служби карти).
золотинки

@goldilocks Що робити, якщо я зміню розмір sdcard, щоб зменшити всі розділи до максимально можливого розміру (лише дані) ??
mf_

@goldilocks, уважно прочитайте питання та відповідь, я говорю про розділ 2 Гб на 8 Гб SD-картці, а не про дані 2 ГБ на 8 ГБ розділі, як ваша дика фантазія якось вам сказала.
lenik

1
lenik: Так, я трохи приголомшений, я так вас інтерпретував, вибачте - на жаль, я не можу змінити свій відгук, якщо ви не редагуєте публікацію: / хоча я все ще не думаю, що ця відповідь є особливо корисною (без образи - - тому що це не просто укладення розділу , інструкції, як це зробити, знову не корисні), але я це зроблю. @mf_ Так, це реально (ви читали мою відповідь? Це спрацює ...)
goldilocks

@goldilocks Я відредагував відповідь. Не знаєте, чому це не корисно, особливо коли ви дали точно таку ж відповідь, лише з більш детальною інформацією.
lenik

1

dd - copy and convertне є правильним інструментом для виконання заданої вами роботи. Це низький рівень, інструмент копіювання (і конвертування) сектору за сектором, який чудово копіює завантажувальні сектори, форматування пристроїв та всілякі завдання низького рівня. Під час використання ddви копіюєте зображення по секторах, навіть якщо воно не включено до структури файлової системи.

Зображення, надані Фондом Raspberry Pi, - це спеціально складені зображення із скриптами встановлення, розпакуванням бінарних файлів та початковою установкою, після чого вам доведеться все одно отримувати оновлення з Інтернету. Це все навмисно, але досить завдання змусити його працювати так.

Одне популярне рішення уникнути копіювання порожніх секторів - використовувати систему копіювання файлового рівня - і CloneZilla є автономною, завантажувальною з компакт-диска, подібно до, ye olde Norton Ghostале clonezilla підтримує файлову систему Linux (і більше). Таким чином, він буде копіювати лише ті файли, які використовуються, і створювати контейнер лише з цих файлів. Значно зменшує розмір!


1

У мене було таке саме точне запитання і хотів простий у використанні інструмент. Після пошуку та не знайденого я написав mkimg.sh . Я окреслю процес, який я використовував на веб- сайті: /raspberrypi//a/37899/32585

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