
Набор инструментов для разметки дисков GPT и MBR с утилитами для манипуляции, восстановления и преобразования таблиц разделов. Включает специальное исправление для уязвимости CVE-2021-0308.
GPT fdisk (также gdisk, cgdisk и sgdisk) и FixParts автор: Roderick W. Smith, [email protected]
Этот пакет включает исходный код четырёх родственных программ для разбиения дисков:
gdisk — Эта программа создана по образцу Linux fdisk, но работает с дисками, использующими таблицу разделов GUID (GPT), а не с дисками MBR, которые изменяет fdisk. Таким образом, gdisk — это интерактивный текстовый инструмент для управления разделами, но он не затрагивает содержимое этих разделов (обычно файловые системы, иногда пространство подкачки или другие данные).
cgdisk — Эта программа создана по образцу Linux cfdisk, но работает с дисками GPT, а не с дисками MBR, которые изменяет cfdisk. Таким образом, cgdisk — это основанный на curses текстовый инструмент для управления разделами, то есть он использует интерфейс, основанный на клавишах-стрелках и динамическом отображении, а не на командных буквах и прокручивающемся отображении, как gdisk.
sgdisk — Эта программа концептуально похожа на Linux sfdisk и FreeBSD gpt, но отличается деталями работы. Она позволяет управлять дисками GPT с помощью параметров командной строки, поэтому подходит для использования в скриптах или экспертами для выполнения определённых задач, которые в gdisk потребовали бы нескольких команд.
fixparts — Эта программа, в отличие от трёх предыдущих, работает с дисками MBR. Она предназначена для исправления определённых проблем, которые могут быть созданы различными утилитами. В частности, она может исправить расширенные разделы неправильного размера и основные разделы, расположенные в середине расширенных разделов. Она также позволяет изменять статус основного/логического раздела (в пределах допустимого в схеме MBR) и вносить некоторые другие незначительные изменения. Она НЕ поддерживает создание новых разделов; для этого следует использовать fdisk, parted или другой инструмент.
Более подробная информация о возможностях этих инструментов приведена ниже.
Все четыре программы используют один и тот же набор базового кода; они различаются только интерфейсами управления (определёнными в gdisk.cc, cgdisk.cc, sgdisk.cc и fixparts.cc, соответственно) и используемым вспомогательным кодом.
Программа gdisk задумана как (в некоторой степени) аналог fdisk для дисков с GPT, cgdisk — аналогично для cfdisk, а sgdisk предоставляет большую часть функциональности gdisk в более удобной для скриптов программе. Хотя libparted и программы, использующие её (GNU Parted, gparted и т.д.), предоставляют возможность работы с дисками GPT, у них есть определённые ограничения, которые gdisk преодолевает. Конкретные преимущества gdisk, cgdisk и sgdisk включают:
Возможность преобразования дисков с MBR-разделами на месте в формат GPT без потери данных
Возможность преобразования BSD-дисклейблов на месте для создания GPT-разделов без потери данных
Возможность преобразования из формата GPT в формат MBR без потери данных (только gdisk и sgdisk)
Более гибкое указание кодов типов файловых систем GUID, которые GNU Parted имеет тенденцию повреждать
Чёткая идентификация количества нераспределённых секторов на диске
Пользовательский интерфейс, знакомый давним пользователям Linux fdisk и cfdisk (только gdisk и cgdisk)
Код загрузчика MBR остаётся нетронутым
Возможность создания гибридного MBR, который позволяет ОС, не знакомым с GPT, обращаться к трём разделам GPT на диске (только gdisk и sgdisk)
Конечно, GPT fdisk не лишён ограничений. Наиболее заметно, что ему не хватает осведомлённости о файловых системах и связанных с файловыми системами функций GParted. Например, вы не можете изменить размер файловой системы раздела или создать раздел с уже существующей файловой системой с помощью gdisk. Графической версии gdisk не существует.
Пакет GPT fdisk предоставляет три программных файла: интерактивный текстовый gdisk, интерактивный на основе curses cgdisk и управляемый из командной строки sgdisk. Первые два предназначены для использования при ручном разбиении дисков или изменении деталей разделов; sgdisk предназначен для использования в скриптах для автоматизации задач, таких как клонирование дисков или подготовка нескольких дисков для установки Linux.
Создание этой программы было мотивировано просьбами о помощи, которые я видел на онлайн-форумах от пользователей, чьи таблицы разделов были повреждены различными багги-инструментами разбиения. Хотя большинство ОС могут нормально работать с пострадавшими дисками, инструменты на основе libparted (GParted, parted, большинство установщиков Linux и т.д.) часто выходят из строя при работе с этими дисками. Обычно симптом — диск, который, кажется, не содержит разделов; однако иногда инструмент libparted показывает разделы, отличные от тех, что видит ОС.
Я наблюдал четыре причины этих симптомов, три из которых FixParts может исправить:
Старые данные GPT — Если диск использовался как GPT-диск, а затем повторно использовался как MBR-диск, данные GPT могут быть удалены не полностью. Это происходит, например, если диск переразбивается с помощью fdisk или установщика Microsoft Windows. (Инструменты на основе libparted корректно удаляют старые данные GPT при преобразовании из GPT в MBR.) FixParts проверяет эту проблему при запуске и предлагает её исправить. Если вы решите удалить данные GPT, это удаление происходит немедленно, в отличие от других изменений, которые вносит программа.
Расширенные разделы неправильного размера — Некоторые инструменты создают расширенный раздел, который слишком велик, обычно заканчивающийся после последнего сектора диска. FixParts автоматически исправляет эту проблему (если вы используете опцию 'w' для сохранения таблицы разделов).
Основные разделы внутри расширенного раздела — Некоторые утилиты создают или перемещают основные разделы в диапазон, охватываемый расширенным разделом. FixParts обычно может исправить эту проблему, превратив основной раздел в логический или изменив один или несколько других логических разделов на основные. Однако такие исправления не всегда возможны, по крайней мере без удаления или изменения размера других разделов.
Остаточные данные RAID — Если диск использовался в массиве RAID, а затем повторно использовался как не-RAID диск, некоторые утилиты могут запутаться и не увидеть диск. FixParts НЕ может исправить эту проблему. Чтобы исправить эту проблему, вы должны уничтожить старые данные RAID или, возможно, удалить пакет dmraid из системы.
При запуске FixParts предоставляет интерфейс, похожий на fdisk, позволяющий изменять типы разделов (основной, логический или пропущенный), изменять коды типов, изменять загрузочный флаг и т.д. Хотя вы можете удалить раздел (пропустив его), вы не можете создавать новые разделы с помощью программы. Если вы привыкли разбивать диски, особенно с помощью Linux fdisk, два необычных свойства FixParts требуют разъяснения:
Нет расширенных разделов — Внутренне FixParts читает таблицу разделов и отбрасывает данные о любых найденных расширенных разделах. Когда вы сохраняете таблицу разделов, программа генерирует новый расширенный раздел. Эта конструкция означает, что программа автоматически исправляет многие проблемы, связанные с расширенным разделом. Это также означает, что вы не увидите никаких признаков расширенных разделов в пользовательском интерфейсе FixParts, хотя он отслеживает требования и предотвращает создание недопустимых макетов, таких как основной раздел между двумя логическими.
Нумерация разделов — В большинстве инструментов Linux разделы 1–4 являются основными, а разделы 5 и выше — логическими. Хотя допустимая таблица разделов, загруженная в FixParts, изначально будет соответствовать этому соглашению, некоторые типы повреждённых таблиц могут ему не соответствовать, и различные изменения, которые вы вносите, также могут вызвать отклонения. Когда FixParts записывает таблицу разделов, её нумерация будет изменена в соответствии со стандартными соглашениями MBR, но для определения статуса раздела вы должны использовать явную маркировку разделов как основных или логических, а не номера разделов.
Для компиляции GPT fdisk у вас должны быть установлены соответствующие инструменты разработки, в первую очередь GNU Compiler Collection (GCC) и его компилятор g++ для C++. Я также тестировал компиляцию с помощью Clang, которая, похоже, работает; однако я не проводил обширного тестирования полученных двоичных файлов, кроме проверки нескольких основ. В Windows вместо этого можно использовать Microsoft Visual C++ 2008. Кроме того, обратите внимание на следующие требования:
В Linux, FreeBSD, OS X и Solaris должна быть установлена libuuid. Это стандарт для Linux и OS X, хотя вам может потребоваться установить пакет uuid-dev или что-то подобное для получения заголовочных файлов. На FreeBSD должен быть установлен порт e2fsprogs-libuuid.
Библиотека ICU (http://site.icu-project.org), которая обеспечивает поддержку имён разделов в Юникоде, является необязательной на всех платформах, кроме Windows, где она не поддерживается. Использование этой библиотеки было обязательным для правильной поддержки имён разделов UTF-16 в версиях GPT fdisk до 0.8.9, но начиная с этой версии она больше не должна требоваться. Тем не менее, вы можете использовать её, если у вас возникли проблемы с новой поддержкой UTF-16. Эта библиотека обычно установлена в Linux и OS X, но вам может потребоваться установить заголовочные файлы разработки (libicu-dev или что-то подобное в Linux; или пакет libicu36-dev Fink в OS X). Для компиляции с поддержкой ICU вы должны изменить Makefile: найдите закомментированные строки, которые ссылаются на USE_UTF16, -licuuc, -licudata или -licucore. Раскомментируйте их и закомментируйте эквиваленты, в которых этих строк нет.
Программа cgdisk требует библиотеку ncurses и её файлы разработки (заголовки). Большинство дистрибутивов Linux устанавливают ncurses по умолчанию, но вам может потребоваться установить пакет libncurses5-dev, ncurses-devel или что-то подобное для получения заголовочных файлов. Эти файлы уже были установлены в моей системе разработки Mac OS X; однако они могли быть установлены как зависимости других программ, которые я установил. Если у вас возникли проблемы с установкой ncurses, вы можете скомпилировать gdisk и/или sgdisk без cgdisk, указав только те цели, которые вы хотите скомпилировать для make.
Программа sgdisk требует библиотеку popt и её файлы разработки (заголовки). Большинство дистрибутивов Linux устанавливают popt по умолчанию, но вам может потребоваться установить пакет popt-dev, popt-devel или что-то подобное для получения заголовочных файлов. Пользователи Mac OS могут найти версию popt для Mac OS из Darwin Ports (http://popt.darwinports.com) или Fink (http://www.finkproject.org); однако сначала вам нужно будет установить DarwinPorts или Fink (инструкции есть на соответствующих страницах проектов). Альтернативно, вы можете скомпилировать только gdisk и/или cgdisk без sgdisk; gdisk не требует popt.
Когда все необходимые инструменты разработки и библиотеки установлены, вы можете распаковать пакет и ввести "make" в командной строке в полученном каталоге. (Возможно, вам потребуется ввести "make -f Makefile.mac" в Mac OS X, "make -f Makefile.freebsd" во FreeBSD, "make -f Makefile.solaris" в Solaris или "make -f Makefile.mingw" для компиляции с помощью MinGW for Windows.) Вам также может потребоваться добавить каталоги заголовков (include) или библиотек, установив переменную среды CXXFLAGS или отредактировав Makefile. В результате должны получиться файлы программ с именами gdisk, cgdisk, sgdisk и fixparts. Ввод "make gdisk", "make cgdisk", "make sgdisk" или "make fixparts" скомпилирует только запрошенные программы. Вы можете использовать эти программы на месте или скопировать файлы в подходящий каталог, например /usr/local/sbin. Вы можете скопировать man-страницы (gdisk.8, cgdisk.8, sgdisk.8 и fixparts.8) в /usr/local/man/man8, чтобы сделать их доступными.
ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ЯВЛЯЕТСЯ БЕТА-ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ! ЕСЛИ ОНО УНИЧТОЖИТ ВАШ ЖЁСТКИЙ ДИСК ИЛИ СЪЕСТ ВАШЕГО КОТА, НЕ ВИНИТЕ МЕНЯ! На сегодняшний день я тестировал это программное обеспечение на нескольких USB-флешках, физических жёстких дисках и виртуальных дисках в средах QEMU и VirtualBox. Многие другие также использовали это программное обеспечение на своих компьютерах. Я считаю, что все ошибки, приводящие к повреждению данных, устранены, но я прекрасно понимаю, что вероятность того, что я что-то упустил, высока. Это особенно верно для больших дисков (более 2 ТиБ); моё прямое тестирование с такими дисками ограничено виртуальными дисками QEMU и VirtualBox. Однако я получал отчёты пользователей об успешной работе с массивами RAID размером более 2 ТиБ.
Моя основная платформа разработки — система, работающая под 64-битной версией Gentoo Linux. Я также тестировал на нескольких других 32- и 64-битных дистрибутивах Linux, Intel-совместимых Mac OS X 10.5 и 10.6, 64-битной FreeBSD 7.1 и Windows 7.
Эта программа лицензирована в соответствии с условиями GNU GPL (см. файл COPYING).
Этот код в основном мой собственный; однако я использовал три функции из двух других программ под лицензией GPL:
Код, используемый для генерации CRC, взят из программы efone, написанной Krzysztof Dabrowski и ElysiuM deeZine. (См. файлы исходного кода crc32.h и crc32.cc.)
Функция для определения размера диска взята из Linux fdisk, написанной A. V. Le Blanc. Впоследствии этот код был существенно изменён.
Дополнительные авторы кода включают:
Yves Blusseau ([email protected])
David Hubbard ([email protected])
Justin Maggard ([email protected])
Dwight Schauer ([email protected])
Florian Zumbiehl ([email protected])
Guillaume Delacour (внёс вклад в виде скрипта gdisk_test.sh)