Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Разделы диска и средства для работы с ними в Линукс

(C) В.А.Костромин, 2004.

Назад Оглавление Вперед

4. Программа parted и ее производные

Утилиты, рассмотренные в предыдущих частях статьи, имели своим основным назначением создание разделов на новых, девственно чистых дисках. И хотя в последних версиях таких утилит как DiskDrake или YaST предусмотрена возможность трансформации существующих разделов, для решения последней задачи были разработаны специализированные утилиты. Основной утилитой этого типа в Линукс является программа parted (или GNU/parted), название которой, очевидно, происходит от PARTition EDitor.

4.1. Программа parted

Утилита parted представляет собой консольную программу, предназначенную для создания, удаления, копирования, изменения размера и размещения разделов диска, а также для проверки целостности данных на разделе. В документации к программе таблица разделов диска именуется "меткой диска" ("disk label"). Программа умеет работать со следующими типами таблицы разделов (или типами меток диска - label-type):

  • raw access (я перевожу это как "прямой доступ") - используется для логических томов (LVM) и RAID-массивов,
  • bsd,
  • loop (raw disk access),
  • gpt - Intel GPT partition tables,
  • mac,
  • msdos,
  • pc98,
  • sun.

Я знакомился с версией 1.6.9 этой программы, включенной в состав Live CD Knoppix 3.6. При необходимости вы можете найти программу по следующей ссылке - http://qtparted.sourceforge.net/, а документацию к ней - на странице www.gnu.org/software/parted. . В следующей табличке приведены данные о том, какие операции программа позволяет выполнять с разделами, на которых созданы файловые системы разных типов (еще раз напомню, что речь идет о версии 1.6.9 этой программы; вполне возможно, что последующие версии будут иметь больше возможностей).

Таблица 2. Файловые системы, поддерживаемые программой parted

Тип файловой системы обнаруживает создает изменяет размер копирует проверяет
ext2 * * *1 *2 *3
ext3 *   *1 *2 *3
fat16 * * *4 *5 *
fat32 * * * * *
linux-swap * * * * *
HFS *        
JFS *        
NTFS * *6 *6 *6 *6
ReiserFS * *7 *1,7 *7 *7
UFS *        
XFS *        

Примечания:

  1. Для ext2, ext3 и reiserfs: начало раздела не может изменяться.
  2. Для ext2, ext3: размер раздела, в который производится копирование, должен быть больше или точно равен размеру исходного раздела.
  3. Для ext2 и ext3: проверки осуществляются с единственой целью: убедиться, что операции изменения размера раздела и копирования могут быть выполнены корректно.
  4. Для fat: размер раздела после изменения его преобразования или копирования ограничен размером кластера. Parted может уменьшить размер кластера, так что вы всегда можете уменьшить размер раздела. Однако если вы по каким-то причинам не може использовать FAT32, вы не можете увеличить размер вашего раздела.
  5. Parted поддерживает как FAT16, так и FAT32, причем может преобразовать файловую систему FAT16 в FAT32 и наоборот, если это необходимо.
  6. Для работы с NTFS необходимо наличие пакета linux-ntfs.
  7. Поддержка Reiserfs возможна только в том случае, если у вас установлена библиотека libreiserfs, которую можно найти на http://reiserfs.osdn.org.ua. (возможно, ее можно получить также с http://www.namesys.com)

Формат запуска программы имеет следующий вид

[root]# parted [options] [device [command [options...]...]]

Опций у программы всего 4:
  • -h, --help - выдать краткую подсказку;
  • -i, --interactiv - режим интерактивного взаимодействия с пользователем;
  • -s, --script - режим автономной работы, без запросов к пользователю;
  • -v, --version - сообщить номер версии.

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

    Сама программа представляет собой оболочку, распознающую всего 16 команд, с помощью которых можно не только создавать новые разделы, но и изменять структуру существующих. Команды можно указывать непосредственно в командной строке, а можно и после входа в оболочку. Давайте рассмотрим работу с программой в интерактивном режиме (то есть через оболочку), после чего выполнение команд прямо из командной строки уже не должно представлять никаких затруднений.

    Запуск программы в интерактивном режиме осуществляется командой
    [root]# parted /dev/hdb

    После запуска первым делом следует посмотреть на существующую на диске структуру разделов. Это можно сделать с помощью команды print. Я на своем тестовом диске увидел следующую картину:

    (parted) print
    Disk geometry for /dev/hdb: 0.000-1222.593 megabytes
    Disk label type: msdos
    Minor   Start     End   	Type   	  Filesystem   	Flags
    1	  0.031	 126.000	primary	  linux-swap	boot
    2	126.000	1221.609	primary   ext2          

    MINOR здесь и далее означает номер Linux-раздела на текущем диске, а величины START и END задают смещение начала и конца раздела от начала диска (в мегабайтах), причем я в ходе работы с программой всегда использовал целые значения, а программа сама приводила их к каким-то дробным, по ей самой ведомым правилам. Заметим также, что можно использовать отрицательные значения для указания границ размеров разделов. Это будет означать, что смещение будет отсчитываться от конца диска, то есть соответствующая величина будет вычитаться от общего размера диска (следовательно, "-0" равно объему всего диска).

    Краткую справку по всем командам можно получить, введя знак вопроса или команду help в ответ на приглашение программы (рис.22).

    Рис.22. Запуск программы parted в консоли

    Теперь вы знаете с каким диском работаете (см. результат выполнения команды print) и какие действия вам доступны (результат выполнения команды help). Если вы хотите поменять диск, то самое время время воспользоваться командой select DEVICE.

    Теперь давайте перейдем непосредственно к манипуляциям с разделами. Однако имейте в виду, что команды выполняются сразу, как только вы нажмете клавишу <Enter>, то есть все изменения сразу же будут записаны на диск. Правда, программа parted будет выдавать предупреждения всякий раз, когда вы попытаетесь выполнить какое-то потенциально опасное действие, например, выполнить команды rm, mklabel или mkfs. Тем не менее, перед вводом каждой команды имеет смысл посмотреть подсказку по ее использованию, для чего выполнить команду help command (то есть с указанием в виде параметра имени нужной команды), а перед нажатием клавиши <Enter> еще раз подумать, что вы намереваетесь сделать.

    Поскольку на моем диске свобдного места не было, я начал освоение программы parted с уменьшения размера существующего раздела. Эта операция выполняется с помощью команды resize. Мне удалось с помощью этой команды уменьшить размер второго раздела вдвое, обеспечив тем самым наличие свободного пространства, необходимого для последующих операций.

    (parted) resize 2 126 626
    (parted) print
    Disk geometry for /dev/hdb: 0.000-1222.593 megabytes
    Disk label type: msdos
    Minor   Start     End   	Type   	  Filesystem   	Flags
    1	  0.031	 126.000	primary	  linux-swap	boot
    2	126.000	 626.062	primary   ext2          

    Прежде чем создавать новый раздел, я решил испытать команду move. Моя попытка выполнить ее в следующем варианте
    (parted) move 2 326 926
    привела к появлению сообщения о том, что "невозможно переместить раздел самого в себя, попытайтесь изменить размер раздела". В принципе понятно, перемещать можно только в полностью незанятые области. После задания границ нового раздела следующим образом:
    (parted) move 2 626 1026
    команда была успешно выполнена (хотя заняла довольно много времени). Перед перещением раздела я специально записал на него несколько каталогов с файлами и после выполнения команды и монтирования раздела имел возможность убедиться, что вся информация при перемещении сохранилась. Между прочим, перед выполнением этой команды следует размонтировать перемещаемый раздел, иначе программа выдаст сообщение об ошибке:

    "Partition /dev/hdb1 is being used. Modifying it while it is in use could 
    cause severe corruption. 
    Ignore/Cancel?".
    Пытаться игнорировать это сообщение я не стал, можете испытать это на своем диске.

    Создание раздела на свободном пространстве осуществляется с помощью команды
    (parted) mkpart тип-раздела [тип_FS] START END
    где тип_раздела может принимать одно из трех значений: primary, logocal или extended. Параметр тип_FS не обязателен, файловую систему на созданном разделе можно сформировать и позже, с помощью отдельной команды
    (parted) mkfs MINOR тип_FS.
    Создание раздела без создания файловой системы (то есть без задания параметра тип_FS) используется в тех случаях, когда раздел предназначен для файловых систем, не поддерживаемых программой parted, а также при создании логических томов (LVM).
    Мне без проблем удалось создать разделы типа ext2 и fat32, а вот разделы типов ext3, ntfs и xfs программа создавать отказалась (как оно и следует из приведенной выше таблицы 2).

    Создание нового раздела и одной из возможных файловых систем можно выполнить за один раз, если воспользоваться командой
    (parted) mkpartfs тип-раздела тип_FS START END
    Как видите, она аналогична команде mkpart, только здесь параметр тип_FS обязателен.

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

    Команды копирования и перемещения разделов работают только в пределах одного жесткого диска. Зато они доступны для любых файловых систем, поскольку данные операции выполняются посекторно. Например, команда
    (parted) cp 2 3
    скопирует все данные из второго раздела в третий, при этом не имеет значения, что третий раздел больше по размеру, и что на нем до выполнения этой команды была файловая система fat16, а на втором разделе была файловая система ext2. Естественно, все ранее записанные на 3-ий раздел данные будут этой командой уничтожены.

    Команда rescue поможет восстановить структуру накопителя, если таблица разделов по какой-то причине оказалась разрушена. Достаточно лишь указать дисковое пространство (лучше с запасом), на котором находился раздел, и утилита попытается отыскать его сигнатуру. Я удалил со своего диска все разделы, кроме одного swap-раздела и запустил команду rescue. Результат вы видите на следующем рисунке!

    Рис.23. Восстановление разделов

    Как видите, разделы приходится восстанавливать по-очередно, по одному. И найти программа сумела не все только что удаленные разделы, а только два первых раздела диска. Два последних раздела (удаленных первыми) не нашлись. Причина, я полагаю, в том, что никакой структуры на этих разделах не было создано, поскольку файловые системы я на них не создавал. Во всяком случае, когда я снова создал раздел, затем создал на нем файловую систему, потом удалил раздел и снова выполнил команду rescue, удаленный раздел был успешно найден.

    Следущая команда, mklabel label-type, служит для создания новой (пустой) таблицы разбиения диска (метки диска) в MBR. Например, команда

    (parted) mklabel msdos
    создает пустую таблицу разделов типа msdos. Выполнение этой команды не приводит к разрушению данных на диске, однако эти данные становятся недоступными, поскольку фактически уничтожается их адресация. Можно попытаться исправить эту ситуацию с помощью команды rescue.

    В некоторых случаях разделам на диске можно присвоить имена (мне кажется, что здесь термин "метка" был бы более подходящим). Не знаю точно, какие именно типы разделов допускают имена, но при попытке присвоить имя одному из разделов на моем диске я получил в ответ сообщение о том, что для разделов типа msdos имена не поддерживаются.

    Еще одна команда, set minor flag state, служит для установки некоторых флагов на раздел MINOR. Параметр state может принимать значение "on" или "off" (то есть "включено" или "выключено"). Набор допустимых флагов зависит от типа раздела:

    Флаг Тип раздела Пояснения
    boot Mac, msdos, pc98 Этот флаг устанавливается в том случае, когда раздел является загрузочным. Для таблицы разделов типа msdos только один раздел на диске может быть загрузочным. Если вы устанавливаете LILO в какой-то раздел, этот раздел должен быть загрузочным. Для таблицы разделов (метки диска) типа pc98 все разделы должны быть загрузочными (parted автоматически делает их таковыми).
    lba msdos Этот флаг должен быть установлен для того, чтобы MS DOS, MS Windows 9x и MS Windows ME использовали для данного раздела режим линейной адресации (LBA).
    root Mac Этот флаг устанавливается, если раздел является корневым для Linux.
    swap Mac Этот флаг устанавливается, если раздел является swap-разделом для Linux.
    hidden msdos, pc98 Этот флаг проставляется в том случае, если раздел надо скрыть от операционных систем Microsoft.
    raid msdos Этот флаг проставляется в том случае, если нужно известить Линукс о том, что раздел используется для создания программного RAID-массива.
    LVM msdos Этот флаг проставляется в том случае, если нужно известить Линукс о том, что раздел используется как физический том в LVM.
    Пример: командой
    (parted) set 1 boot on
    вы включаете флаг boot для раздела 1. С помощью команды print можно посмотреть, какие флаги на какой раздел установлены.

    Вот мы и рассмотрели все команды утилиты parted, разве что еще раз напомнить, что выход из оболочки (и завершение работы с программой) осуществляется командой quit или просто q. Осталось сделать еще несколько замечаний.

    • Во-первых, при вводе команд разрешены однозначно раскрываемые сокращения. Например, вы можете ввести только "p" вместо "print" или "re" вместо "resize".
    • Во-вторых, если вы не задали необходимый команде параметр, его значение будет запрошено:
      (parted) resize 1
      Start? 0
      End? 400
      
    • В третьих, пользоваться оболочкой вовсе не обязательно. Любую команду или даже группу команд можно указать непосредственно в командной строке вызова программы parted, причем за один раз можно выполнить несколько команд. Пример:
      parted /dev/sda resize 1 52 104 mkfs 2 fat16
      
      Только не забудьте указать имя диска, а то последсвия могут быть плачевными. Напомню, что в интерактивном режиме (то есть при работе через оболочку) вы можете задавать за один раз выполнение только одной команды.
    • В четвертых, как уже говорилось выше, утилита parted производит запись измененной таблицы разделов на диск сразу же после того, как вы выполните какую-то команду, но эти изменения не заносятся автоматически в файл /etc/fstab. Поэтому после перезапуска системы могут возникнуть проблемы из-за несоответствия фактической структуры разделов тому, что записано в fstab. Следовательно, никогда не следует пытаться смонтировать раздел, который был изменен или создан программой parted. Программа напомнит вам об этом при выходе из программы (по команде q), выдав сообщение "Don't forget to update /etc/fstab, if necessery."

      По тем же причинам после того, как вы подредактируете раздел, который был смонтирован, когда вы с ним работали (вы же могли проигнорировать выдаваемое программой предупреждение), следует сразу же внести соответствующие в fstab и немедленно перезагрузить систему.

      Корневой раздел и раздел /boot в смонтированном состоянии изменять вообще не рекомендуется, а если такая необходимость возникла, рекомендуется воспользоваться загрузочным диском, iso-образ которого можно найти на сайте GNU Parted.

    Надо сказать, что интерфейс программы parted не назовешь интуитивно понятным, а поэтому работа с ней не является приятным занятием. Поэтому я закончу на этом ее расмотрение и перейду к рассмотрению графической облочки к утилите parted - программе QTParted.

    4.2. Утилита QTParted

    Внешний вид окна этой программы имеет некоторое сходство с известной Windows-программой Partition Magic фирмы PowerQuest (смотри следующий раздел). Сходство это не случайно, ибо сами создатели программы пишут следующее:
      "QTParted является попыткой создать клон Partition Magic, работающий в Линукс-системах. В действительности такой клон уже сущестует и называется parted. Но parted имеет интерфейс, основанный на командной строке, что затрудняет использование программы неопытными пользователями.
      Программа parted фактически является основанным на командной строке интерфейсом пользователя к библиотеке libparted. Эта библиотека является тем ядром, которое выполняет операции по редактированию разделов. QTParted является графическим пользовательским интерфейсом к той же библиотеке libparted, написанным с использованием QT (отсюда и название: QT + Parted = QTParted)."

    После запуска программы вначале появляется окно, изображенное на рис. 24.

    Рис. 24. Запуск программы QTParted

    Чтобы увидеть разделы диска, необходимо вначале выбрать устройство из списка доступных, приведенного в левой части окна. Только после этого программа считывает таблицу разделов (рис. 25)

    Рис. 25. Считывание информации о структуре разделов

    и отображает структуру диска в графическом виде, и в виде таблицы в правой части окна. В левой части появляется краткая справка о выбранном диске:

    Рис. 26. Отображение существующей структуры разделов

    Поскольку QTParted является оболочкой к той же библиотеке libparted, что программа parted, она имеет примерно те же возможности, что и parted (смотри таблицу 2). Конечно, для работы с NTFS необходимо наличие пакета linux-ntfs. Впрочем, NTFS-разделы все же лучше изменять с помощью программ типа Partition Magic, поскольку более или менее сложные манипуляции с разделами NFTS в среде Linux все еще связаны с риском потери данных.

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

    Если вы видите, что меню операций не активно (все пункты или большинство отображаются серым цветом и щелчок мыши по ним не приводит к видимым результатам), то скорее всего на текущем диске имеются используемые системой разделы. У меня, например, использовался только один swap-раздел, тем не менее программа отказывалась выполнять какие-то действия с диском до тех пор, пока я не отключил его командой swapoff /dev/hdb1. Так что предварительно необходимо размонтировать все обычные разделы и отключить swap-разделы диска.

    Хочу отметить одну особенность отображения разбиения диска утилитой QTParted. На рисунке 27 вы видите картину разбиения моего диска /dev/hda, как его показала эта утилита:

    Рис. 27. Отображение неиспользуемых областей диска

    Обратите внимание на то, что в первом первичном разделе и в каждом из расширенных разделов показаны неиспользуемые "пробелы" объемом 0,3 МБ каждый. Я вначале не мог объяснить причину появления этих "пробелов" и даже "грешил" на утилиту Disk Druid, с помощью которой разбивал диск на разделы в процессе инсталляции. И только когда стал разбираться с командой Maximize в утилите cfdisk, понял, откуда берутся эти "пустоты". Как уже было рассказано при описании утилиты cfdisk, первый раздел диска, а также все логические разделы начинаются со второй дорожки цилиндра, оставляя первую дорожку пустой. Эти пустые дорожки и отображаются утилитой QTParted.

    4.3. Утилита Partition Morpher

    Утилита QTParted, как уже было сказано, является просто графической оболочкой для библиотеки libparted, построенной на основе графической библиотеки QT. Другая аналогичная утилита - Partition Morpher, построена на основе библиотеки GTK2 и той же библиотеку libparted из проекта parted, а поэтому обладает примерно теми же возможностями, что и QTParted.

    Debian-пакет с программой можно найти на сайте http://www.morphix.org/debian

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

    Рис. 28. Основное окно утилиты Partition Morpher

    4.4. Программа gparted

    Как раз в то время, когда готовилась настоящая статья, а точнее 3 декабря 2004 года, в Интернет появилось сообщение о выходе версии 0.0.7 программы GParted. Судя по краткой информации, опубликованой на сайте http://gparted.sourceforge.net, эта утилита тоже основана на библиотеке libparted, поскольку разработчик сообщает, что для ее работы необходимы Parted версии >= 1.6.13 и Gtkmm версии >= 2.4.x.

    Для создания разделов с файловыми системами разных типов утилита использует стандартные утилиты работы с файловыми системами. Например, для разделов с ext2/3 используется пакет e2fstools, а для работы с разделами reiserfs необходимы соответствующие утилиты от Namesys.

    Пока мне нечего больше сказать об этой утилите, поскольку поработать с ней я не успел. Привел я этот материал (как и подраздел о Partition Morpher) только для того, чтобы читатель имел представление о всем спектре программ для работы с разделами диска. При желании вы можете найти эту утилиту самостоятельно по приведенным здесь ссылкам.

    Назад Оглавление Вперед