Откуда приходит информация о “физическом размере”?

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

У меня есть встроенное устройство Linux (не Raspberry Pi), которое имеет два раздела на накопителе eMMC. Я использовал инструмент, предоставленный производителем, чтобы скопировать эти два раздела на USB-накопитель размером, примерно равным размеру накопителя eMMC.

После этого я смонтировал USB-накопитель на компьютере с Linux и использовал инструменты такие как e2fsck и resize2fs -M, чтобы изменить размер второй файловой системы до минимально допустимого значения, а затем использовал gdisk, чтобы изменить размер самого раздела для соответствия.

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

После этих операций у меня есть USB-накопитель объемом 16 ГБ с разделом загрузки на 118 Миб и разделом корневой файловой системы размером 3.1 ГиБ. Затем я использовал dd, чтобы считать данные прямо с USB-накопителя, используя параметры bs= и count=, чтобы ограничить количество считываемых данных до места, где заканчивается второй раздел, плюс дополнительный сектор для учета “нулевого сектора”.

В результате у меня теперь есть файл образа, в котором два раздела имеют точно такой же размер, как и их соответствующие источники, но когда я использую опцию “Файл” -> “Свойства” инструмента 7-Zip, он утверждает, что “Физический размер” (обведенный красным) больше, чем эти разделы, и больше, чем то, что я указал dd для копирования из источника.

Откуда берется это значение “Физический размер”? Является ли оно частью таблицы разделов? Или dd каким-то образом считывает его с диска?

Есть ли способ модифицировать его, чтобы избавиться от ошибки “Неожиданный конец данных”?

Изображение из 7-zip

Откуда берется это значение “Физический размер”? Является ли оно частью таблицы разделов?

Да.

См. Таблица разделов GUID – Википедия

Есть ли способ модифицировать его, чтобы избавиться от ошибки “Неожиданный конец данных”?

Да.

Похоже, стандартные инструменты Linux знают, как исправить усеченный GPT-диск.

Создание test-short.img с той же проблемой

$ dd if=/dev/zero bs=1M count=10 of=test.img
10+0 записей введено
10+0 записей выведено
10485760 байт (10 МБ, 10 Миб) скопировано, 0.0161485 с, 649 МБ/с

$ gdisk test.img
GPT fdisk (gdisk) версия 1.0.8

Сканирование таблицы разделов:
  MBR: не присутствует
  BSD: не присутствует
  APM: не присутствует
  GPT: не присутствует

Создание новых записей GPT в памяти.

Команда (? для помощи): n
Номер раздела (1-128, по умолчанию 1): 
Первый сектор (34-20446, по умолчанию = 2048) или {+-}размер{KMGTP}: 
Последний сектор (2048-20446, по умолчанию = 20446) или {+-}размер{KMGTP}: 18430    
Текущий тип 8300 (файловая система Linux)
Шестнадцатеричный код или GUID (L для показа кодов, Enter = 8300): 
Изменен тип раздела на 'файловая система Linux'

Команда (? для помощи): w

Финальные проверки завершены. Собираемся записать данные GPT. ЭТО ЗАТРЕТ СУЩЕСТВУЮЩИЕ
РАЗДЕЛЫ!!

Вы хотите продолжить? (Y/N): y
ОК; запись новой таблицы разделов GUID (GPT) в test.img.
Предупреждение: Ядро все еще использует старую таблицу разделов.
Новая таблица будет использоваться при следующей перезагрузке или после того, как вы
запустите partprobe(8) или kpartx(8)
Операция завершена успешно.

$ dd if=test.img bs=1M count=9 of=test-short.img
9+0 записей введено
9+0 записей выведено
9437184 байт (9.4 МБ, 9.0 Миб) скопировано, 0.00650826 с, 1.5 ГБ/с

Как исправить проблему

Насколько я понимаю, вы оставили один свободный сектор в конце файла образа, который мы можем использовать для “вторичного заголовка GPT” (трейлера?). Учитывая, что таблица имеет обычные 128 записей разделов, вам необходимо добавить еще 32 сектора для них, и затем вы сможете исправить проблему.

$ dd if=/dev/zero bs=512 count=32 >> test-short.img

$ gdisk test-short.img
GPT fdisk (gdisk) версия 1.0.8

Предупреждение! Размер диска меньше, чем это указывает главный заголовок! Загружается
вторичный заголовок из последнего сектора диска! Вы должны использовать 'v' для
проверки корректности диска, и, возможно, опции в меню экспертов для восстановления
диска.
Осторожно: недействительный резервный заголовок GPT, но действительный главный заголовок; воссоздание
резервного заголовка из главного заголовка.

Предупреждение! Ошибка 25 при чтении таблицы разделов для проверки CRC!
Предупреждение! Один или несколько CRC не совпадают. Вам следует восстановить диск!
Главный заголовок: ОК
Резервный заголовок: ОШИБКА
Главная таблица разделов: ОК
Резервная таблица разделов: ОШИБКА

Сканирование таблицы разделов:
  MBR: защитный
  BSD: не присутствует
  APM: не присутствует
  GPT: поврежден

****************************************************************************
Осторожно: Найден защитный или гибридный MBR и поврежденный GPT. Используется GPT, но
проверка и восстановление диска настоятельно рекомендуются.
****************************************************************************

Команда (? для помощи): p
Диск test-short.img: 18464 секторов, 9.0 Миб
Размер сектора (логический): 512 байт
Идентификатор диска (GUID): 01BD61C8-5DC3-42CA-824D-B5C1B3B09A77
Таблица разделов вмещает до 128 записей
Главная таблица разделов начинается с сектора 2 и заканчивается в секторе 33
Первый используемый сектор 34, последний используемый сектор 20446
Разделы будут выравнены по границам 2048-секторов
Всего свободного места 4030 секторов (2.0 Миб)

Номер  Начало (сектор)    Конец (сектор)  Размер       Код  Имя
   1            2048           18430   8.0 Миб     8300  Файловая система Linux

Команда (? для помощи): x

Команда эксперта (? для помощи): e
Релокация резервных структур данных в конец диска

Команда эксперта (? для помощи): w

Финальные проверки завершены. Собираемся записать данные GPT. ЭТО ЗАТРЕТ СУЩЕСТВУЮЩИЕ
РАЗДЕЛЫ!!

Вы хотите продолжить? (Y/N): y
ОК; запись новой таблицы разделов GUID (GPT) в test-short.img.
Предупреждение: Ядро все еще использует старую таблицу разделов.
Новая таблица будет использоваться при следующей перезагрузке или после того, как вы
запустите partprobe(8) или kpartx(8)
Операция завершена успешно.

Для подтверждения, что test-short.img был исправлен

$ gdisk test-short.img
GPT fdisk (gdisk) версия 1.0.8

Сканирование таблицы разделов:
  MBR: защитный
  BSD: не присутствует
  APM: не присутствует
  GPT: присутствует

Найдена действительная GPT с защитным MBR; используется GPT.

Команда (? для помощи): p
Диск test-short.img: 18464 секторов, 9.0 Миб
Размер сектора (логический): 512 байт
Идентификатор диска (GUID): 01BD61C8-5DC3-42CA-824D-B5C1B3B09A77
Таблица разделов вмещает до 128 записей
Главная таблица разделов начинается с сектора 2 и заканчивается в секторе 33
Первый используемый сектор 34, последний используемый сектор 18430
Разделы будут выравнены по границам 2048-секторов
Всего свободного места 2014 секторов (1007.0 Киб)

Номер  Начало (сектор)    Конец (сектор)  Размер       Код  Имя
   1            2048           18430   8.0 Миб     8300  Файловая система Linux

Команда (? для помощи): q

Когда создается файловая система, 5% отводится для записи, выполняемой пользователем root. Это изначально предназначалось для обеспечения возможности восстановления системы даже после чрезмерного использования процессами пользователей.

Таким образом, “минимально допустимый размер” неприемлем для процессов, не являющихся root.

В качестве альтернативы создайте раздел размером 4 ГБ, выполните копирование, затем уменьшите размер до подходящего минимума.

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

Где берется информация о "физическом размере"?

Информация о "физическом размере" в файловых системах и образах дисков возникает из структуры разметки диска, в частности, из таблицы разделов. В случае GPT (GUID Partition Table) таблица разделов содержит заголовки и записи, которые определяют, как именно физическое пространство диска или образа диска организовано, что включает в себя размеры разделов и расположение данных на диске.

Когда вы используете инструменты, такие как dd, для создания образов, они копируют фактические данные на уровне битов. Однако, если ваша операция привела к тому, что размер образа меньше, чем указано в заголовках GPT, это может вызвать проблемы, такие как ошибка "Неожиданный конец данных" в приложениях, таких как 7-Zip. Это происходит потому, что программа ожидает, что "физический размер" будет совпадать с информацией, указанной в таблице разделов, что может привести к неполадкам при чтении образа.

Как исправить проблему

Чтобы исправить эту проблему, необходимо обновить заголовок GPT и убедиться, что все структуры данных правильно соответствуют фактическому размеру образа. Для этого выполните следующие шаги:

  1. Создание резервного образа: Начните с создания резервной копии вашего текущего образа (например, test-short.img), чтобы избежать потери данных.

  2. Добавление недостающего пространства: Вы можете использовать команду dd, чтобы добавить недостающее пространство в ваш образ для хранения резервного заголовка GPT и таблицы разделов. Например:

    dd if=/dev/zero bs=512 count=32 >> test-short.img
  3. Исправление заголовка GPT: Используйте утилиту gdisk для работы с вашим образом и исправления поврежденных структур GPT. Запустите gdisk на вашем образе:

    gdisk test-short.img

    После этого введите команды для проверки и обновления заголовков, как показано в исходном примере. Важно пересоздать резервные структуры данных на конце диска.

  4. Запись изменений: После завершения всех действий убедитесь, что вы сохранили изменения с помощью команды w в gdisk. Это приведет к записи новой таблицы разделов и заголовков на диск.

Подтверждение исправления

Если исправление прошло успешно, вы сможете снова запустить gdisk и подтвердить, что информация о структуре вашего диска теперь соответствует фактическому размеру образа:

gdisk test-short.img

Вы должны увидеть корректные значения для "Physical size" и структур таблицы разделов, без предупреждений и ошибок.

Заключение

Работа с образами дисков и разметкой требует тщательного обращения с структурными данными, чтобы избежать потери информации. Убедитесь, что всегда сохраняете резервные копии данных прежде чем вносить изменения, и тщательно проверяйте целостность образов после любых операций, связанных с разметкой и копированием данных.

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

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