Вопрос или проблема
У меня есть следующие ограничения:
- У меня есть
.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
перезапишет все данные на указанном устройстве без предупреждения.