Как получить образ SD-карты, содержащий только реальные разделы, а не пустое пространство после них?

Как получить образ SD-карты, содержащий только реальные разделы, а не пустое пространство после них?

У меня есть SD-карта на 16 ГБ (конкретно загрузочная Mobian SD-карта для PinePhone) с двумя разделами, общим объемом 6 ГБ. Оставшееся пространство не распределено. Как мне получить образ SD-карты на 6 ГБ?

решение1

Возможно, с помощью немного хрупкой команды, скопировать первый раздел диска в файл образа по запросу. Однако есть несколько вещей, о которых следует знать:

  • Поскольку необходим прямой доступ к файлам устройства из командной строки, вся команда должна быть выполнена как root(например, sudo suкоманда перед использованием решения).
  • Резервная таблица разделов, если это таблица разделов GPT,воляНЕТбыть скопированным.
  • «Фокус» зависит от полноты таблицы разделов — нераспределенного пространства, о котором упоминаетсяна самом деленераспределенный, а не какой-то раздел, который вы просто не хотите копировать.
  • Раздел или разделы собираются спереди. Если у них есть зазор, этот зазор будет скопирован.
  • Это зависит от того, установлены ли в вашей системе обе fdiskкоманды (вероятно) и bc(возможно). Обе являются стандартными и могут быть установлены из вашего репозитория по умолчанию, если это необходимо.
  • Файл изображения будет принадлежать пользователю root, поэтому вам придется сделать chownэто, если вам нужно предоставить пользователю полный доступ.

Вот полная команда, разбитая на строки для удобства чтения.

dd if=/dev/sdx of=Mobian.img\
    bs="$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)"\
    count="$(echo "$(fdisk -o end -l /dev/sdx | tail -1) + 1"|bc)"\
    status=progress

Разбивка:

Во-первых, /dev/sdxнеобходимо изменить имя устройства так, чтобы оно отражало правильное имя, если только у вас нет 23 других, ранее подключенных дисков.

Первая строка — это ожидаемая ddкоманда, при этом имя устройства и имя файла задаются в соответствии с вашими текущими потребностями.

Вторая строка устанавливает размер блока для ddразмера сектора SD-карты. Он почти наверняка равен 512 байтам. Если вы на 100% уверены, что это 512, вы можете заменить строку на bs=512. Если вы хотите быть в безопасности и сохранить возможность использования команды на любом устройстве в будущем, сохраните лишнее там. Операция такая:

  • fdisk -l /dev/sdxотчет данные об устройстве
  • grep sector«sector» появляется дважды в выводе
  • tail -1получить только последнюю строку с «sector» в ней
  • cut -d' ' -f6используя пробелы между полями получаем только 6-е поле (размер сектора в байтах)

Третья строка сообщает, ddсколько «блоков» размера bs=копировать. Опять же, если вы точно знаете, что это за число, используйте его вместо команды. Для «запаса на будущее» я снова сохранил полную команду:

- `fdisk -o end -l /dev/sdx` list the partition information about the device, and only output the ending sector ID of each `-o end`
- `tail -1` it don't matter how many there are, we only need the last sector of the last partion.
- `echo "... + 1" | bc` add one to the last sector ID. Uses the `bc` command, which is in integers unless told otherwise. Sectors are numbered from zero, to to copy sector #10 we have to copy 10 + 1 sectors (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Четвертая строка — для развлекательной ценности. Хорошая карта, класс скорости 10, будет читать вам 6 ГБ данных примерно за 4 минуты. опция status=progressвызовет ddобновления терминала по мере его «прогресса». В противном случае у вас будет просто терминал, ожидающий команды на завершение, и это будет казаться вечностью.

Финал: Если вы точно знаете, что копируемый вами файл соответствует самым высоким стандартам, имеет правильно выровненные разделы и размер ровно 6 ГиБ, вы можете воспользоваться простой командой:

dd if=/dev/sdx of=Mobian.img bs=1048576 count=6145 status=progress

Конечно, как только они сделают новое изображение и вы переключитесь на него, все ставки на короткую версию отменяются. Оригинальное верхнее изображение продолжит работать. Оно также будет работать для других «изображений», которые вам может понадобиться скопировать позже.

Бонус:

Если по какой-либо причине вам это не нравится dd, вы можете использовать те же шаги по сбору чисел и headвместо этого применить команду:

head -c $(\echo "\
    "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" *\
    ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc)\
    /dev/sdx > Mobian.img

Вкратце:

head -c $(\echo " "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" * ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc) /dev/sdx > Mobian.img'

решение2

Вы можете использовать команду linux dd. У вас есть выбор: считать оба раздела по отдельности и затем объединить их или выполнить некоторые вычисления для определения последнего сектора второго раздела. Затем вы запустите команду dd, используя параметры bs (размер блока) и count (количество блоков), чтобы копирование закончилось в конце второго раздела.

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