У меня есть 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 (количество блоков), чтобы копирование закончилось в конце второго раздела.