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

UnixForum






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

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

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

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

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

2. Утилита fdisk и ее ближайшие родственники

В этом разделе мы рассмотрим традиционные средства создания разделов, существующие в Линукс.

2.1. Общая характеристика

Самый известный инструмент для работы с таблицей разбиения - программа fdisk. Программы с таким названием имеются во всех операционных системах. Но, несмотря на совпадение названий, по сути это совершенно разные программы, так что не стоит пользоваться описанием одной из них, применяя другую. К тому же в одном из руководств я нашел утверждение о том, что использование FDISK от Win95/Win98 в системах с несколькими разными файловыми системами (установленными в разные разделы) опасно. Известны случаи, когда эта программа удаляла логические разделы типа, отличного от FAT, хотя ей было задано удалить FAT-раздел, расположенный где-то дальше в цепочке логических разделов.

В Линукс имеются три версии этой программы: fdisk, sfdisk, cfdisk. Их основное назначение - создание разделов на "чистом" диске или изменение разбиения диска. Но основной метод переразбиения диска в этих программах сводится к удалению существующих разделов и созданию новых (соответственно, с потерей всей информации на диске). Правда, man-страница к утилите sfdisk сообщает, что утилита эта может производить переразбиение диска, но предупреждает, что операция эта очень опасна.

Все три упомянутых программы имеют только текстовый интерфейс, то есть запускаются в консоли или окне терминала. На страничке man к программе fdisk сообщается, что cfdisk создает высококачественные таблицы разбиения диска и поэтому, если есть возможность, то надо использовать именно эту программу. Одновременно отмечается, что fdisk обычно дает неплохой результат, но имеет некоторые недостатки и ее не рекомендуется применять, если есть другие возможности. Относительно sfdisk утверждается, что это программа для хакеров - она более корректна, чем fdisk и мощнее чем fdisk и cfdisk, но имеет ужасно неудобный интерфейс. И, действительно, интерфейс cfdisk кажется наиболее удобным, поскольку он уже имеет интуитивно понятное меню. Автор статьи [7] утверждает, что именно по этой причине программа cfdisk используется в текстовых инсталляторах Debian GNU/Linux и Slackware Linux. А вот в системе, установленной из дистрибутива Red Hat Linux 9 этой утилиты почему-то не оказалось.

У fdisk и sfdisk есть одна важная особенность -- они умеют выводить список всех существующих разделов в неинтерактивном режиме. Для этого достаточно запустить эти команды с опцией -l. Причем, если не указывать устройство, то будет выведен список разделов всех имеющихся дисков. Результаты выполнения этих команд выглядят немного по-разному. На моем диске с испорченной таблицей разделов я получил следующие результаты:

Листинг 4.

[root]# /sbin/sfdisk -l /dev/hda

Disk /dev/hda: 77545 cylinders, 16 heads, 63 sectors/track
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/hda1          0+    764-    765-    385528   82  Linux swap
                end: (c,h,s) expected (764,15,62) found (47,254,62)
/dev/hda2   *    765+   4574-   3809    1919736    c  W95 FAT32 (LBA)
                start: (c,h,s) expected (765,1,1) found (48,1,1)
                end: (c,h,s) expected (1023,15,63) found (286,254,63)
/dev/hda3       4574+   4765-    192-     96390   83  Linux
                start: (c,h,s) expected (1023,15,63) found (287,0,1)
                end: (c,h,s) expected (1023,15,63) found (298,254,63)
/dev/hda4       4765+  77535-  72771-  36676395    f  W95 Ext'd (LBA)
                start: (c,h,s) expected (1023,15,63) found (1023,5,1)
                end: (c,h,s) expected (1023,15,63) found (1023,14,63)
/dev/hda5       4765+   6805-   2040-   1028128+  83  Linux
                start: (c,h,s) expected (1023,15,63) found (299,1,1)
                end: (c,h,s) expected (1023,15,63) found (426,254,63)
/dev/hda6       6805+  10885-   4080-   2056288+  83  Linux
                start: (c,h,s) expected (1023,15,63) found (427,1,1)
                end: (c,h,s) expected (1023,15,63) found (682,254,63)
/dev/hda7      10885+  27141-  16257-   8193118+  83  Linux
                start: (c,h,s) expected (1023,15,63) found (683,1,1)
                end: (c,h,s) expected (1023,15,63) found (1023,254,63)
/dev/hda8      27141+  36895-   9754-   4915858+  83  Linux
                start: (c,h,s) expected (1023,15,63) found (1023,254,63)
                end: (c,h,s) expected (1023,15,63) found (1023,254,63)
/dev/hda9      36895+  77535-  40641-  20482843+   b  W95 FAT32
                start: (c,h,s) expected (1023,15,63) found (1023,254,63)
                end: (c,h,s) expected (1023,15,63) found (1023,254,63)

Листинг 5.

[root]# /sbin/fdisk -l /dev/hda

Disk /dev/hda: 40.0 GB, 40020664320 bytes
16 heads, 63 sectors/track, 77545 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1               1         765      385528   82  Linux swap
Partition 1 does not end on cylinder boundary.
/dev/hda2   *         766        4575     1919736    c  W95 FAT32 (LBA)
Partition 2 does not end on cylinder boundary.
/dev/hda3            4575        4766       96390   83  Linux
Partition 3 does not end on cylinder boundary.
/dev/hda4            4766       77536    36676395    f  W95 Ext'd (LBA)
Partition 4 does not end on cylinder boundary.
/dev/hda5            4766        6806     1028128+  83  Linux
/dev/hda6            6806       10886     2056288+  83  Linux
/dev/hda7           10886       27142     8193118+  83  Linux
/dev/hda8           27142       36896     4915858+  83  Linux
/dev/hda9           36896       77536    20482843+   b  W95 FAT32

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

2.2. Программа fdisk

Работа с программой fdisk осуществляется через командный интерфейс. Если запустить ее без опций, мы увидим только приглашение к вводу одной из доступных однобуквенных клавиатурных команд (см. листинг 6).

Листинг 6.

[root]# /sbin/fdisk /dev/hda

The number of cylinders for this disk is set to 2498.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
   
Command (m for help):

Список доступных команд мы получаем по команде <m> (поскольку вызов этих команд осуществляется нажатием соответствующей клавиши, я буду обозначать команды буквой, заключенной в угловые скобки):

Листинг 7.

Command (m for help): m
Command action
      a   toggle a bootable flag
      b   edit bsd disklabel
      c   toggle the dos compatibility flag
      d   delete a partition
      l   list known partition types
      m   print this menu
      n   add a new partition
      o   create a new empty DOS partition table
      p   print the partition table
      q   quit without saving changes
      s   create a new empty Sun disklabel
      t   change a partition's system id
      u   change display/entry units
      v   verify the partition table
      w   write table to disk and exit
      x   extra functionality (experts only)
                                   
Command (m for help):

Самая употребительная из этих команд, пожалуй, команда <p>, по которой выводится полный перечень имеющихся на диске разделов (включая логические). Результат выполнения этой команды аналогичен результату, получаемому после выполнения команды
[root]# /sbin/fdisk -l /dev/hda
из командной строки, так что пример выполнения этой команды вы уже видели (листинг 5). Границы разделов в этом случае показаны в виде номеров цилиндров. Вообще говоря, в процессе знакомства с программами разбиения диска складывается впечатление, что границы разделов лучше всего размещать по границам цилиндров.

Если добавить в вызов утилиты fdisk опцию -u, то границы разделов будут задаваться порядковыми номерами секторов. Я предполагаю (хотя нигде в документации такого утверждения я не встречал), что это соответствует линейной нумерации секторов (LBA). Номера секторов вы увидите и тогда, когда выполните команду <p> после запуска самой утилиты в следующем формате:
[root]# /sbin/fdisk -u /dev/hda
Впрочем, переключиться с одного способа указания границ разделов на другой можно в любой момент работы с программой, достаточно дать клавиатурную команду <u>.

Назначение некоторых клавиатурных команд я поясню так же кратко, как они даются самой утилитой, но на русском языке:

  • <a> - снять/установить флаг активности раздела (номер раздела будет запрошен);
  • <d> - удалить раздел;
  • <l> - вывести список известных программе типов разделов;
  • <n> - создать (добавить) новый раздел;
  • <o> - создать новую пустую таблицу разделов в стиле DOS;
  • <q> - выйти из программы, не записывая на диск сделанные изменения;
  • <t> - изменить метку типа раздела (можно задавать один из типов, перечисленных в выводе команды <l>, причем список этот может быть выведен на экран и после вызова команды <t>);
  • <v> - проверить таблицу разделов (мне показалось, что эта команда мало полезна, но я могу и ошибаться);
  • <w> - записать исправленную таблицу разделов на диск и выйти из программы;
  • <x> - дополнительные возможности (только для экспертов).

Две последних команды требуют дополнительных пояснений. Как видите, разработчики программы предусмотрели некие меры предосторожности, чтобы защититься от необдуманных действий пользователя. Пока вы не выполнили команду <w>, внесенные вами изменения еще не являются необратимыми. Вы всегда можете нажать клавишу <q> и таблица разделов останется нетронутой. Вероятно, программа работает с каким-то временным файлом - образом MBR, и только по команде <w> происходит запись содержимого этого файла в MBR.

По команде <x> мы переходим “на второй уровень” программы fdisk. Как сказано выше, этот уровень - для экспертов! Перечень дополнительных возможностей, доступных на этом уровне, можно снова получить по команде <m> (см. листинг 8):

Листинг 8.

Command (m for help): x

Expert command (m for help): m
Command action
    b   move beginning of data in a partition
    c   change number of cylinders
    d   print the raw data in the partition table
    e   list extended partitions
    f   fix partition order
    g   create an IRIX (SGI) partition table
    h   change number of heads
    m   print this menu
    p   print the partition table
    q   quit without saving changes
    r   return to main menu
    s   change number of sectors/track
    v   verify the partition table
    w   write table to disk and exit
          
Expert command (m for help):

Некоторые из этих команд вам уже знакомы - <p>, <q>, <v>, <w>. Они здесь действуют так же, как на основном уровне. Командой <f> - исправить порядок расположения разделов, вам придется воспользоваться в том случае, когда вы удаляли разделы и создавали новые. Дело в том, что после таких операций порядок нумерации разделов не соответствует порядку их размещения на диске. Команда <f> позволяет исправить это несоответствие. Команда <d> служит для того, чтобы вывести на экран в шестнадцатиричном виде содержимое секторов, в которых хранится структура разделов диска. С помощью других команд второго уровня можно изменить число цилиндров (команда <c>), головок (команда <h>) и секторов (команда <s>), то есть фактически задать "фальшивую" геометрию диска. Но, если вы задумаете это сделать, вы должны четко понимать, к чему это ведет (смотри предыдущую часть этих заметок). Тем более надо представлять себе последствия таких команд, как <b> - перемещение начала данных в разделе. Я ничего не берусь пояснить или добавить к сказанному, ибо не использовал этих команд применительно к реальным ситуациям. Поэтому я закончу рассказ о команде fdisk и перейду к утилите cfdisk.

2.3. Программа cfdisk

Запуск этой утилиты осуществляется в том же формате, что и других команд этой группы:
[root]# /sbin/fdisk /dev/hda

Указание на устройство можно опустить, если вы хотите изменить разбиение на диске /dev/hda (этот диск выбирается по умолчанию). После запуска программа пытается прочесть таблицу разбиения указанного диска. Если ей это по каким-то причинам не удается, выдается сообщение об ошибке и выполнение программы прекращается. Одной из причин может быть некорректная информация о геометрии диска и в таком случае можно заставить программу работать, если указать ей геометрию диска в строке вызова. Другой путь – запустить программу с опцией -z. В этом случае существующая таблица разбиения диска будет игнорирована.

В отличие от fdisk интерфейс программы cfdisk построен на основе небольшого меню, расположенного в нижней части экрана (рис.1).

Рис.1. Окно программы cfdisk

Переход от одного пункта меню к другому осуществляется клавишей <Тab> или с помощью клавиш перемещения курсора "стрелка вправо/влево". Клавиши "стрелка вверх/вниз" используются для выбора раздела диска в списке, отображаемом в центральной части экрана. Для каждого раздела указаны его наименование, значение флагов, тип раздела (первичный или логический), тип файловой системы в разделе, метка раздела и его размер. В графе Flags (флаги) значение может отсутствовать или же может стоять Boot (что означает загрузочный раздел), или NC («Not Compatible with DOS or OS/2» - не совместим с DOS или OS/2). Последний флаг имеет следующее значение. Некоторые операционные системы (в том числе DOS и OS/2) создают разделы на диске таким образом, что первый раздел диска, а также все логические разделы начинаются со второй дорожки, оставляя первую дорожку цилиндра пустой. Установив флаг NC с помощью команды меню Maximize или горячей клавиши <m>, вы сможете использовать это дисковое пространство. Но учтите, что в работающей системе экономить таким образом дисковое пространство не стоит. Я попробовал получить таким образом пару лишних дорожек, и моя система работала только до первой перезагрузки. А при следующей загрузке появилось сообщение о Kernel Panic. К счастью, после того, как я снял с помощью той же программы этот флажок (для чего, конечно, пришлось загрузиться с LiveCD Knopix), работоспособность системы восстановилась.

Размер раздела в cfdisk может быть показан в мегабайтах (по умолчанию), килобайтах, а также в количестве секторов или цилиндров. Переключение между этими режимами осуществляется командой Units или с помощью горячей клавиши <u> (в последнем случае переключение осуществляется по циклу). Если после указания размера стоит звездочка, это означает, что либо границы раздела не совпадают с границами цилиндров, либо используется неверная геометрия диска. Линукс не использует геометрию в работе с дисками, так что бояться этого не стоит. Но можно и поменять геометрию диска, с которой будет работать cfdisk. Для этого служит горячая клавиша <g>. Однако в руководстве к программе сказано, что делать это может только тот, кто знает, что он делает. А остальным в определении геометрии диска лучше довериться программе cfdisk.

С помощью команды Delete или горячей клавиши <d> можно удалить раздел, выделенный в данный момент в списке разделов.

Если в списке разделов подсветка перемещена на свободное пространство, вид меню изменится (смотри рис.2).


Рис.2. Создание нового раздела с помощью cfdisk

Новый раздел создается с помощью команды New или горячей клавиши <n>. Если тип раздела не определяется однозначно, программа попросит вас его задать. Помните, что можно создать не более 4 первичных разделов и что расширенным может быть только один из них. Поэтому все логические разделы должны быть расположены на диске последовательно и не могут чередоваться с первичными. Затем программа запросит у вас размер создаваемого раздела, причем по умолчанию предложит вам создать его равным всему свободному пространству. Если вас это устраивает, можно просто нажать клавишу <Enter>. В противном случае можно ввести желаемый размер, причем программа воспринимает размер, заданный в мегабайтах (M), килобайтах (K), цилиндрах (С) и секторах (S). Приведенные в скобках буквы вы должны указать сразу после цифры, задающей размер (M можно не указывать, это значение по умолчанию). Создаваемый раздел можно разместить либо в начале, либо в конце свободного дискового пространства, и cfdisk снова попросит вас принять решение на этот счет.

К чему приведут сделанные вам изменения, можно просмотреть с помощью команды Print (<P>). При этом возможны три варианта отображения этого результата:

  • так называемый raw data формат, то есть шестнадцатеричный вид секторов, которые будут записаны в первые сектора каждого раздела;
  • секторный формат (рис.3);

Рис.3. Таблица разделов в секторном формате

  • табличный формат (рис.4), в котором разделы упорядочены по их номерам.


Рис.4. Таблица разделов в табличном формате

Чтобы сделанные изменения вступили в силу, необходимо записать таблицу разбиения на диск, что делается с помощью команды Write или горячей клавиши <W> (причем, именно заглавной W). Программа запросит у вас подтверждения и запишет результат на диск.

Для выхода из программы служит команда Quit или горячая клавиша <q>.

2.4. Программа sfdisk

Будучи запущенной без параметров, эта утилита выдает только двухстраничную справку о параметрах запуска. Но только из этой справки понять, как использовать эту утилиту, трудно. Необходимо заглянуть и на страничку интерактивной подсказки man sfdisk. Из этой справки узнаем, что утилита sfdisk имеет 4 основных варианта использования.

Вариант 1. Будучи запущенной с опцией -s partition она выдает размер раздела в блоках. Параметр partition может указывать на конкретный раздел, например, /dev/hda2, либо на весь диск. В таком случае будет выведен объем диска в блоках. А если оставить только опцию -s и не указывать диск или раздел, то будет выведен объем всех разделов на каждом диске и общий объем диска (см. листинг 9).

Листинг 9.

[root]# /sbin/sfdisk -s /dev/hdb
1251936
[root]# /sbin/sfdisk -s 
/dev/hda:  39082680
/dev/hda1: 530113
/dev/hda2: 2048287
/dev/hda3: 104422
/dev/hda4: 1
/dev/hda5: 1534176
/dev/hda6: 2048256
/dev/hda7: 12289693
/dev/hda8: 20523006
/dev/hda9: 4536
/dev/hdb: 1251936
/dev/hdb1: 128992
/dev/hdb2: 1121904

Вариант 2. Второй вариант использования утилиты sfdisk служит для получения информации о таблице разделов диска. Для этого следует запустить ее с опцией -l или же с опцей -d. Будучи запущенной с опцией -l

[root]# /sbin/sfdisk -l [опции] /dev/hdb

утилита sfdisk выдает таблицу разделов указанного диска примерно в таком же формате, как и утилита fdisk (примеры приведены в листингах 4 и 5). Но если запустить программу с дополнительной опцией -x, мы увидим всю цепочку логических разделов, вложенных в расширенный раздел, то есть получим более детальную информацию о разделах (см. листинг 3).

Опция -d (листинг 10) позволяет получить информацию в другом формате, ориентированном на применение утилиты sfdisk для изменения таблицы разделов (смотри ниже описание четвертого варианта использования sfdisk).

Листинг 10.

[root]# /sbin/sfdisk -d /dev/hda
  Warning: extended partition does not start at a cylinder boundary.
  DOS and Linux will interpret the contents differently.
  # partition table of /dev/hda
  unit: sectors

/dev/hda1 : start= 63, size= 1060227, Id=82
/dev/hda2 : start= 1060290, size= 4096575, Id= b, bootable
/dev/hda3 : start= 5156865, size= 208845, Id=83
/dev/hda4 : start= 5365710, size= 72799650, Id= f
/dev/hda5 : start= 5365773, size= 3068352, Id=83
/dev/hda6 : start= 8434188, size= 4096512, Id=83
/dev/hda7 : start= 12530763, size= 24579387, Id=83
/dev/hda8 : start= 37110213, size= 41046012, Id= c

Вариант 3. Третий вариант запуска sfdisk определяется использованием опции -V, и служит для тестирования таблицы разделов на конкретном устройстве. Эту опцию, вероятно, лучше использовать вместе с опцией -l, тогда вы увидите и таблицу разделов и информацию о некорректностях в этой таблице.

Вариант 4. И, наконец, четвертый способ запуска этой программы предназначен изменения таблицы разделов диска. Man-страница предупреждает, что использовать этот вариант надо очень осторожно, поскольку любая ошибка приведет к потере ваших данных. Поэтому предварительно нужно составить четкий и хорошо продуманный план разбиения диска на разделы, так как программа потребует у вас явным образом задать параметры каждого из запланированных разделов, причем никаких подсказок в ходе этого процесса не выдает. Она просто-напросто выводит последовательно запрос на ввод параметров очередного раздела (листинг 11)

Листинг 11.

[root]# /sbin/sfdisk /dev/hdb

/dev/hdb1:
и ожидает от вас ввода параметров раздела в следующем формате
          <номер начального сетора> <размер(в секторах)> <тип(id)> <bootable> <c,h,s> <c,h,s>
Обратите внимание на то, что это фактически тот самый формат, который используется программой для вывода таблицы разделов в том случае, когда она была запущена с опцией -d (см. листинг 10). Поэтому, если вы хотите что-то исправить в существующей таблице разделов, имеет смысл вначале воспользоваться опцией -d, чтобы на основе полученных данных составить план переразбиения диска.

Каждая строка ввода приведенного выше вида определяет один раздел. Поля разделяются пробелами. Можно использовать в качестве разделителей запятую или точку с запятой. Числа могут быть десятичными, восьмеричными или шестнадцатиричными. Поля <c,h,s>, задающие раздел в формате "цилиндр, головка, сектор", могут отсутствовать (man-страница даже рекомендует не задавать эти значения), поскольку утилита умеет вычислять их самостоятельно. Загрузочный раздел помечается звездочкой в соответствующем поле. Впрочем, если у вас не установлено других систем, кроме Линукс, загрузочный раздел можно не указывать, поскольку Линукс не использует эту метку.

Тип раздела (поле Id) задается шестнадциричным кодом без добавления префикса 0x, или просто одним из следующих символов: S - Linux_Swap (82), L - Linux_Native (83), E - Extended (5) или X - Linux_Extended (85).

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

В четвертом варианте запуска утилита sfdisk требует явного указания устройства, с которым ей предстоит работать. Если же указать ей в качестве цели смонтированное устройство (как чаще всего и случается на работающей системе), получим следующее сообщение :

Листинг 12.

[root]# /sbin/sfdisk /dev/hda
Checking that no-one is using this disk right now ...
BLKRRPART: Device or resource busy

This disk is currently in use - repartitioning is probably a bad idea.
Umount all file systems, and swapoff all swap partitions on this disk.
Use the --no-reread flag to suppress this check.
Use the --force flag to overrule all checks.

Так что лучше всего запускать sfdisk в системе вроде Knoppix, или применять ее ко второму жесткому диску, предварительно размонтировав его (отмечу, что fdisk в аналогичной ситуации запускается без возражений). Впрочем, если вы уверены в правильности своих решений, можно заставить утилиту работать, указав опцию -f ("Делай, что говорят, и без рассуждений!"), или просто отменить проверку того, что диск в данный момент используется, указав опцию --no-reread.

Как видите, утилита sfdisk требует заранее продумать структуру создаваемых на диске разделов. В качестве меры предосторожности можно сохранить на диск существующую таблицу разделов командой

[root]# /sbin/sfdisk /dev/hda -O hda-part.save

В этом случае перед записью измененной таблицы на диск, старое содержимое секторов, определяющих разбиение диска, будет сохранено в файле hda-part.save. Если в процессе внесения изменений вы сделаете какую-то ошибку, можно будет восстановить исходное состояние с помощью команды

[root]# /sbin/sfdisk /dev/hda -I hda-part.save

Заметьте, что использование опций -O и -I не эквивалентно простому сохранению таблицы разделов. Информация, сохраняемая при использовании опции -O, представляет собой двоичную версию вывода, получаемого с помощью опции -d.

С помощью утилиты sfdisk можно изменить только один раздел на диске, используя опцию -N.

Прочитав приведенные выше описания трех основных утилит для разбиения диска, существующих в Линукс, вы сами можете выбрать наиболее подходящую для себя. Отмечу только еще раз, что все эти утилиты не позволяют производить переазбиение диска с сохранением информации на уже существующих разделах. Так что если речь идет о переразбиении диска, вам придется позаботиться о том, чтобы сохранить ваши данные на каком-то резервном носителе. В последнее время появились и утилиты, которые позволяют производить переразбиение диска без потери информации (по крайней мере, так утверждается). И я расскажу о таких утилитах, но чуть позже, после того, как приведу краткую характеристику утилит для создания разделов, входящих в состав нескольких дистрибутивов Linux.

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