Использование dd для резервного копирования только содержимого образа на SD-карте

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

У меня есть Raspberry Pi (RPi) с SD-картой объемом 128 ГБ. Эта SD-карта содержит полную ОС и настройки для RPi, и я хотел бы сделать ее резервную копию. Общий размер всех файлов на SD-карте составляет около 350 МБ.

Я вставил SD-карту в свой ноутбук, на котором установлена дистрибутив Linux, и использовал dd для создания копии содержимого SD-карты:

sudo dd if=/dev/sdb of=RPi4Image.img

Эта команда выполнялась долго, и я проверил размер создаваемого файла на своем ноутбуке, который составил 44 ГБ и еще не завершил создание. Я предполагаю, что в итоге у меня будет файл размером 128 ГБ, чтобы сделать резервную копию 350 МБ содержимого, что не полезно для меня.

Я остановил процесс.

Мне кажется, что эта команда dd создает образ всей SD-карты, все 128 ГБ, даже когда мне нужно только сделать резервную копию 350 МБ содержимого / файлов на ней.

  • Правильно ли я предполагаю, что команда dd делает резервную копию всего устройства и, следовательно, создает файл, размер которого равен общему размеру SD-карты?
  • Если да, то есть ли способы сделать резервную копию и при необходимости восстановить ее на SD-карту, используя только 350 МБ содержимого SD-карты?

Правильно ли я предполагаю, что команда dd делает резервную копию всего устройства и, следовательно, создает файл, размер которого равен общему размеру SD-карты?

Да, dd делает поблочную копию.

Если да, то есть ли способы сделать резервную копию и при необходимости восстановить ее на SD-карту, используя только 350 МБ содержимого SD-карты?

Вы можете использовать Partclone, чтобы достичь этого.

dd без аргументов копирует из источника в пункт назначения до конца одного из них, но это не единственный способ использования инструмента и даже не самый распространенный. Если, например, вы знаете, что файловая система на карте ограничена первыми 2 ГБ пространства, вы можете указать, чтобы сохранить только столько. Вы делаете это с помощью опции bs (размер блока) и опции count.

dd if=/dev/sdb1 of=new.img bs=1M count=2048

Если необходимо, вы можете использовать resize2fs, чтобы изменить размер файловой системы Linux, чтобы она занимала только начало диска.

Однако, если файловая система не ограничена частью диска и не является файловой системой, которую вы можете изменить из Linux, такой как ext2/3/4, то единственный вариант — сделать образ всего диска/раздела.

К счастью, если ваша система была установлена на свежую карту и вы не использовали ее в режиме записи и чтения долгое время, эта система обычно будет иметь МНОГО нулей и будет сжиматься до почти точно используемого пространства. Так что сожмите файл образа, как только он у вас появится.

Вы даже можете сделать это на лету, чтобы вам никогда не нужно было иметь весь файл на диске:

dd if=/dev/sdb1 | gzip | dd of=new.img.gz

Это происходит потому, что если if или of не указаны, они по умолчанию равны stdin или stdout. Это не ускорит время копирования, но сэкономит дисковое пространство, необходимое для хранения образа.

Что я предлагаю, не ускорит процесс, но, вероятно, создаст гораздо меньший файл для хранения.
Что я обычно делаю, так это сжимаю файл img, как только загружаю его.
Однако это требует, чтобы все неиспользуемое пространство было нулями (или чем-то постоянным).
Я делаю это, затирая все пустые пространства одним или несколькими файлами, полными нулей пока оригинальная система все еще работает.
Для систем Linux, таких как Raspberry Pi, это означает запуск dd.
Сначала используйте команду df, чтобы определить, сколько пустого пространства есть:

df -h

(-h означает удобочитаемый формат. Попробуйте без него, и вы поймете)
На Rpi вы получите что-то вроде этого:

Файловая система       Размер  Использовано  Доступно  Использование%  Смонтировано на
udev                  317M      0          317M         0%            /dev
tmpfs                 91M      1.1M        90M         2%            /run
/dev/mmcblk0p2       59G      13G         43G        24%            /
tmpfs                454M      8.0K       454M         1%            /dev/shm
tmpfs                 5.0M      12K       5.0M         1%            /run/lock
/dev/mmcblk0p1      510M      67M        444M        14%            /boot/firmware
tmpfs                 91M      48K        91M         1%            /run/user/1001

Ищите устройство, которое по размеру похоже или немного меньше вашей SD-карты.
В моем случае это моя 64 ГБ SD-карта:

Файловая система       Размер  Использовано  Доступно  Использование%  Смонтировано на
/dev/mmcblk0p2       59G      13G         43G        24%            /

показывает, что около 43 ГБ является свободным пространством.
Эта команда:

dd if=/dev/zero of=nulls.bin count=1024 bs=1048576

создаст файл размером 1 ГБ, заполненный нулями.
(bs — это размер блока, а count — количество блоков.
(1024 * 1048576 = 1,073,741,824 = 1 ГБ)
Читать больше о dd, если хотите знать, что происходит.
В моем примере выше мне нужно будет создать около 42 ГБ нулей
(оставьте немного запаса, так как свободное количество будет немного меняться, пока RPi работает).
Сделав расчеты, я меняю количество блоков с 1024 на 42 * 1024 = 43008:

dd if=/dev/zero of=nulls.bin count=43008 bs=1048576

Это создаст файл объемом 42 ГБ, полностью заполненный нулями в текущем каталоге.
Убедитесь, что вы немедленно удалили этот файл перед тем, как снять SD-карту, чтобы скопировать ее в образный файл.
Это необходимо, чтобы 42 ГБ пространства, занятых файлом нулей, были освобождены как на вашей работающей системе, так и на вашей резервной копии.
Хотя файл исчез, и освободил эти 42 ГБ свободного пространства, он гарантировал, что свободное пространство заполнено нулями, перезаписав все остатки от предыдущих действий.
Как только файл образа создан, сожмите его обычным образом.
Смотря на некоторые из моих старых резервных копий, я обнаружил, что одна 32 ГБ SD-карта была сжата до 1.8 ГБ, а другая, гораздо более полная 32 ГБ карта, до 7.5 ГБ.
Это работает, потому что zip может распознавать, что 42 ГБ нулей могут быть summarizowane как несколько байтов, которые означают что-то вроде “42 ГБ последовательных нулей”.

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

Резервное копирование содержимого карты SD с помощью dd: детальный подход

Введение

Ваша задача — выполнить резервное копирование содержания карты SD объемом 128 ГБ, на которой установлена операционная система Raspberry Pi. Важно отметить, что фактический размер данных составляет всего 350 МБ. Используя команду dd для создания образа, вы столкнулись с проблемой: файл образа, создаваемый системой, оказался значительно больше необходимого.

Понимание команды dd

Команда dd предназначена для поблочного копирования данных. Это означает, что dd копирует все элементы данных с исходного устройства (в данном случае, карты SD) в файл-образ, что и приводит к тому, что создаваемый файл имеет размер, равный или близкий к полному объему устройства. Таким образом, при использовании следующей команды:

sudo dd if=/dev/sdb of=RPi4Image.img

вы действительно создаете образ всего устройства, что в вашем случае приводит к круговой генерации файла размером около 128 ГБ.

Как выполнить резервное копирование только нужных данных

Чтобы создать образ, содержащий только актуальные данные, можно рассмотреть несколько альтернативных подходов.

  1. Создание образа с ограниченной длиной: Если вы знаете, что объем данных не превышает определенного лимита, можно указать count, чтобы создать образ только нужной части:
sudo dd if=/dev/sdb1 of=new.img bs=1M count=350

Такой способ позволит создать файл размером лишь с объем актуальных данных.

  1. Использование gzip для сжатия: В случае, если вы хотите сохранить полное содержание, вы можете сжать образ на лету, что значительно уменьшит его размер:
sudo dd if=/dev/sdb | gzip > RPi4Image.img.gz

Такой подход позволяет избежать создания большой временной файловой системы, так как gzip проводит сжатие одновременно с копированием.

  1. Заполнение свободного пространства нулями: Прежде чем выполнять резервное копирование, вы можете заполнить свободное пространство на SD-карте нулями, что позволит вашему образу эффективно сжиматься. Для этого выполните следующую команду:
dd if=/dev/zero of=/path/to/nulls.bin bs=1M count=43008

Где count должен соответствовать количеству гигабайт свободного пространства на вашей SD-карте. Не забудьте удалить файл nulls.bin после процесса. Это гарантирует, что образ, созданный с помощью dd, будет иметь много нулевых байтов, что сделает сжатие более эффективным.

Заключение

Ваша первоначальная проблема с созданием большого образа SD-карты с помощью dd вполне закономерна, так как это поведение команды. Однако альтернативные пути и методы, предложенные выше, позволяют вам эффективно резервировать лишь необходимые данные и экономить пространство, создавая при этом удобный и сжатый образ.

Эти методы обеспечивают гибкость и удобство в работе с резервными копиями данных, что особенно важно для пользователей Raspberry Pi и других подобных систем. Благодаря этим подходам вы не только сохраните уникальные данные, но и оптимизируете использование файлового пространства и времени на резервное копирование.

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

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