Как разархивировать и записать образ диска на SD-карту одной командой?

Вопрос или проблема

У меня есть следующие ограничения:

  • У меня есть .zip файл размером 1.0 ГБ на компьютере, который содержит один файл — образ диска raspbian. После распаковки этот файл имеет размер 3.2 ГБ и называется 2015-11-21-raspbian-jessie.img.
  • После загрузки zip-файла у меня осталось чуть меньше 1.0 ГБ свободного места на компьютере, что недостаточно для извлечения образа на компьютер.
  • Этот файл необходимо распаковать и записать на SD-карту, используя обычную команду dd.

Могу ли я записать образ на SD-карту с учетом этих ограничений?

Я знаю, что возможно передавать данные через tar, а затем отправлять их в другое место, однако, будет ли это работать для формата zip, или весь архив нужно распаковать, прежде чем какие-либо файлы станут доступны?

Используйте unzip -p:

unzip -p 2015-11-21-raspbian-jessie.zip 2015-11-21-raspbian-jessie.img | dd of=/dev/sdb bs=1M

-p извлекает файлы в stdout

После некоторой борьбы с предыдущим решением:

 unzip -p ~/Downloads/2020-02-05-raspbian-buster-lite.zip | sudo dd of=/dev/disk2 bs=1M

или, если вы хотите видеть прогресс и у вас установлен pv:

 unzip -p ~/Downloads/2020-02-05-raspbian-buster-lite.zip | pv | sudo dd of=/dev/disk2 bs=1M

Я обычно использую unzip -p 2015-11-21-raspbian-jessie.zip >/dev/sdb или zcat 2015-11-21-raspbian-jessie.gz >/dev/sdb для удобства. Это связано с тем, что при больших передачах данных мы ожидаем, что операционная система автоматически подберет размер блока (в соответствии с размером блока источника, размером блока назначения, доступной памятью и т.д.) для оптимальной производительности, и оказывается, что они работают быстрее, чем dd if= of= bs= (возможно, потому что я не пытался методом грубой силы попробовать все возможные варианты размеров блоков для dd) ^_^

Ответ или решение

Для выполнения задачи записи образа диска на SD-карту без предварительного извлечения файла образа на диск компьютера, можно воспользоваться командой unzip с флагом -p, которая позволяет извлекать содержимое zip-файла и выводить его на стандартный вывод (stdout). Затем мы можем использовать команду dd, чтобы записать этот вывод непосредственно на SD-карту.

Вот как это можно сделать в одну команду:

unzip -p /путь/к/вашему/файлу/2015-11-21-raspbian-jessie.zip | sudo dd of=/dev/sdX bs=1M

Не забудьте заменить /путь/к/вашему/файлу/2015-11-21-raspbian-jessie.zip на фактический путь к вашему zip-файлу, а /dev/sdX — на устройство вашей SD-карты (например, /dev/sdb). Чтобы убедиться, что вы правильно указали устройство, вы можете использовать команду lsblk или fdisk -l для отображения подключенных дисков.

Пояснение:

  • unzip -p: Этот флаг позволяет извлечь содержимое zip-файла и вернуть его в stdout.
  • sudo dd of=/dev/sdX bs=1M: Здесь мы используем dd для записи данных на SD-карту. Параметр of указывает целевое устройство (SD-карту), а bs=1M устанавливает размер блока в 1 мегабайт, что обычно оптимально для работы с образами дисков.

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

Если вы хотите видеть прогресс выполнения операции, вы можете использовать утилиту pv, которая позволяет отслеживать скорость передачи и оставшееся время. Команда с pv будет выглядеть следующим образом:

unzip -p /путь/к/вашему/файлу/2015-11-21-raspbian-jessie.zip | pv | sudo dd of=/dev/sdX bs=1M

Убедитесь, что на вашей системе установлены необходимые утилиты (unzip, pv, dd), и что ваш пользователь имеет права для доступа к SD-карте (обычно это требует прав суперпользователя).

Важное предупреждение:

Перед выполнением операций с dd, убедитесь, что вы указываете правильное устройство для записи, так как dd перезапишет все данные на указанном устройстве без предупреждения.

Оцените материал
Добавить комментарий

Капча загружается...