Использование DD для копирования только половины (части) съемного устройства

Использование DD для копирования только половины (части) съемного устройства

У меня естьSD-карта 32 ГБс такой структурой (или очень близкой):

luis@Fresoncio:~$ sudo fdisk -l
Disk /dev/mmcblk0: 29.2 GiB, 31393316864 bytes, 61315072 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
Disklabel type: dos
Disk identifier: 0xec4e4f57

Device         Boot    Start      End  Sectors  Size Id Type
/dev/mmcblk0p1             1   125000   125000   61M  c W95 FAT32 (LBA)
/dev/mmcblk0p2        125001 33292287 33167287 15.8G 83 Linux
/dev/mmcblk0p3      33292288 61315071 28022784 13.4G 83 Linux

И япередано(с другого компьютера, поэтому устройства, где sdaи sdb) это к (я выбрал неправильный)SD-карта 64 ГБчерез dd( dcfldd, на самом деле):

# dcfldd if=/dev/sda of=/dev/sdb bs=1M

Итак, моя новая SD-карта на 64 ГБ — это:

luis@Fresoncio:~$ sudo fdisk -l
Disk /dev/mmcblk0: 59.5 GiB, 63864569856 bytes, 124735488 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
Disklabel type: dos
Disk identifier: 0xec4e4f57

Device         Boot    Start      End  Sectors  Size Id Type
/dev/mmcblk0p1             1   125000   125000   61M  c W95 FAT32 (LBA)
/dev/mmcblk0p2        125001 33292287 33167287 15.8G 83 Linux
/dev/mmcblk0p3      33292288 61315071 28022784 13.4G 83 Linux

Ну, пока проблем нет, но теперь у меня больше нет исходной SD-карты на 32 ГБ, осталась только SD-карта на 64 ГБ, и я хотел бы снова перенести ее на какую-нибудь пустую SD-карту на 32 ГБ.
В этом случае я предполагаю, что не могу использовать ddилиdcfldd

Что я могу сделать? Могу ли я использовать ddили dcfldd? Что может произойти, когда перевод прибудет вГраница 32 ГБна целевой SD-карте (проблемы с целостностью данных)?

Дополнительные примечания:

  • Любойдругой методклонировать SD-карты было бы нормально, но у меня есть проблема: в данном случае это загрузочный диск SD-карты дляRaspberry Pi 2, и клонирование через partimageили gpartedне сработало (Raspberry не загружается). Только ddкажется, что клонирование выполняется без изъянов.

  • Похожийвопрос, но я думаю, что это не одно и то же.

  • Инструмент dcflddимеет тот же синтаксис и поведение, что и dd. Он просто дает больше информации (прогресс... и т.д.). Вотстраница руководства.

решение1

Предположим, что sda — это ваша исходная SD-карта на 64 ГБ, а sdb — ваша целевая SD-карта на 32 ГБ. Вы можете ограничить dd, чтобы копировать только необходимое количество секторов с помощью:

dd if=/dev/sda of=/dev/sdb bs=512 count=61315072

решение2

Я делал это с жесткими дисками много раз: вы просто ddвставляете большой диск в маленький. Он выйдет из строя, когда достигнет 32 ГБ, но это нормально.

Если у вас все еще есть сомнения, я предлагаю вам попробовать сделать это на старой USB-флешке/жестком диске, которая у вас завалялась.

решение3

Для создания копии можно использовать любой инструмент, например cat(ddне имеет никаких преимуществ перед cat, только недостатки). Он остановится, когда достигнет конца целевого диска. Недостатком этого простого подхода является то, что трудно сказать, была ли копия интересующей вас части успешной.

Чтобы гарантировать, что команда копирования вернет статус успеха, если она успешно скопирует то, что вы хотели скопировать, и выдаст ошибку в противном случае, используйте команду, которая копирует правильный объем данных. Чтобы скопировать первые N байт файла, используйте head -c. Количество байт для копирования — это количество секторов, умноженное на размер сектора (512 байт в вашем fdiskсписке). Не забывайте, что секторы начинаются с 0 (сектор 0 содержит таблицу разделов), поэтому общее количество секторов для копирования — это наибольшее «конечное» значение плюс один.

head -c $((61315071*512+512)) /dev/sdSOURCE >/dev/sdDESTINTATION

Замените sdSOURCEи sdDESTINATIONна соответствующие имена устройств. Выполните fdisk -l /dev/sdDESTINATIONи grep sdDESTINATION /proc/partitionsи file -s /dev/sdDESTINATIONи любую другую команду, которую вы считаете полезной, чтобы убедиться, что перезаписываемое вами устройство — это то устройство, которое вы намеревались перезаписать.

Связанный контент