четверг, 18 марта 2010 г.

Использование gpart

Утилита gpart служит для управления GEOM классом PART. На самом деле это хардлинк на утилиту geom(8), которая является универсальной утилитой управления для многих GEOM классов.

Как я уже упоминал в предыдущей заметке, класс PART служит для работы с таблицами партиций и предоставляет доступ к провайдерам этих партиций. С появлением этой утилиты можно уже забыть такие утилиты как fdisk и bsdlabel, они морально устарели. Большинство их действий можно выполнять при помощи утилиты gpart. Нужно только понять и запомнить основные понятия - схема и партиция. Прежде чем создавать партиции, необходимо выбрать тип таблицы - схему. Например, для привычной разметки с использованием MBR необходимо выполнить команду 'gpart create' с указанием имени схемы в опции "-s mbr":
# gpart create -f x -s mbr md0
md0 created
# gpart show md0
=>     17  1023978  md0  MBR  (500M)
       17  1023978       - free -  (500M)

# gpart commit md0
Опция "-f x" указывает классу не вносить изменения на провайдер носителя сразу. Т.е. если вы не уверены в своих действиях, вы можете с каждой командой указывать эту опцию и после того как будете уверены, выполнить команду `gpart commit`, либо отменить изменения командой `gpart undo`. Не имеет значения, какой флаг вы укажете после опции "-f", т. к. класс отслеживает только наличие опции и её отличие от значения, принятого по-умолчанию. Если не указывать опцию "-f", то её значение по-умолчанию будет установлено в "-f C", что приведёт к автоматическому выполнению команды `gpart commit`.

Таблица MBR может содержать максимум 4 записи, т.е. не более 4 партиций. После того как схема создана можно создавать партиции при помощи команды `gpart add`. Каждая партиция обладает несколькими обязательными свойствами - смещение начала, смещение конца, индекс в таблице и тип партиции. А так же одно дополнительное свойство, которым обладают партиции некоторых схем - символьная метка.  Все эти параметры видны пользователю, за исключением смещения конца. Смещение заменяется на вычисляемый из него размер.
К тому же, для создания партиции при помощи утилиты gpart нужен только один обязательный параметр - это тип партиции, остальные параметры могут быть вычеслены автоматически.

Тип партиции может быть задан символьным именем либо специальным номером, в зависимости от используемой схемы. Поддерживаемые символьные имена можно увидеть в мануале gpart(8). При необходимости задать какой-то специфический для схемы тип партиции, он указывается после знака восклицания. Например, для схемы MBR тип партиции FreeBSD представлен номером 165, который можно указать как "-t !165" (не забываем экранировать знак восклицания, если выполняем команду из shell - "\!165"), либо символьным именем "-t freebsd".

Размер и смещение начала партиции по-умолчанию задаются в блоках, размер которых обычно соответствует размеру физического сектора, т.е. 512 байт. Для того чтобы не вычислять количество блоков, эти параметры можно указывать с суффиксом размера: b, k, m, g, t, p, e - т.е. от байт до экзабайт. Но есть одна особенность реализации - парсер при разборе этих параметров ещё не знает какой размер сектора имеет носитель, поэтому если он отличается от 512 байт, то лучше указывать размер в секторах, иначе размер будет вычислен неправильно.  Размер партиции указывается после опции "-s", а смещение начала - после "-b". При опускании любого из этих параметров они выбираются автоматически: смещение начала - на первый доступный блок, размер - на максимально возможный из доступного свободного пространства.

Вычисление индекса партиции обычно можно оставить утилите gpart. Только если вам не нужна какая-нибудь особенная конфигурация, например, чтобы система устанавливалась на ad0s3 нужно указать параметр "-i 3".

Итак, схема создана, создадим партицию:
# gpart add -s 400m -t freebsd md0
md0s1 added
# gpart show md0
=>     17  1023978  md0  MBR  (500M)
       17   819196    1  freebsd  (400M)
   819213   204782       - free -  (100M)

Как видно, партиция была создана с типом "freebsd" и размером в 400 Мбайт, индекс и смещение начала были выбраны автоматически.

Теперь на созданной партиции можно сделать дополнительную разметку для BSD схемы:
# gpart create -s bsd md0s1
md0s1 created
# gpart show md0
=>     17  1023978  md0  MBR  (500M)
       17   819196    1  freebsd  (400M)
   819213   204782       - free -  (100M)

# gpart show md0s1
=>     0  819196  md0s1  BSD  (400M)
       0  819196         - free -  (400M)

Теперь добавим партиции, только вместо bsdlabel используем тот же gpart:
# gpart add -s 100m -t freebsd-ufs md0s1
md0s1a added
# gpart add -s 100m -t freebsd-swap md0s1
md0s1b added
# gpart add -t freebsd-ufs md0s1
md0s1d added
# gpart show md0s1
=>     0  819196  md0s1  BSD  (400M)
       0  204800      1  freebsd-ufs  (100M)
  204800  204800      2  freebsd-swap  (100M)
  409600  409596      4  freebsd-ufs  (200M)

Всё достаточно легко и просто. Для записи загрузочного кода можно использовать всю ту же утилиту. Для этого предназначена команда `gpart bootcode`. Например, аналогом команды `bsdlabel -B` будет:
# gpart bootcode -b /boot/boot md0s1
md0s1 has bootcode
Аналогично можно записать загрузочный код для схемы MBR:
# gpart bootcode -b /boot/mbr md0
md0 has bootcode
Если же необходимо установить менеджер загрузки, то нужно всего лишь выбрать другой образ загрузочного кода - /boot/boot0. Так же, не стоит забывать, что у схемы MBR есть аттрибут активного раздела, чтобы его установить нужно использовать команду `gpart set`:
# gpart set -a active -i 1 md0
md0s1 has active set
# gpart show md0
=>     17  1023978  md0  MBR  (500M)
       17   819196    1  freebsd  [active]  (400M)
   819213   204782       - free -  (100M)

В принципе, этого набора команд достаточно для работы. Если иметь понятие, что и для чего нужно сделать - то сложностей в использовании вообще не вижу. Даже если такая необходимость возникает нечасто, все команды утилиты gpart имеют описание:
# gpart 
usage: gpart add [-b start] [-s size] -t type [-i index] [-l label] [-f flags] geom
       gpart bootcode [-b bootcode] [-p partcode] [-i index] [-f flags] geom
       gpart commit geom
       gpart create -s scheme [-n entries] [-f flags] provider
       gpart delete -i index [-f flags] geom
       gpart destroy [-f flags] geom
       gpart modify -i index [-l label] [-t type] [-f flags] geom
       gpart set -a attrib -i index [-f flags] geom
       gpart show [-lr] [geom ...]
       gpart undo geom
       gpart unset -a attrib -i index [-f flags] geom
       gpart help
       gpart list [name ...]
       gpart status [-s] [name ...]
       gpart load [-v]
       gpart unload [-v]

7 коммент.:

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

    ОтветитьУдалить
  2. Вместе с SSD и HDD от WD пришла новая проблема - сектора размером 4K. Хорошо бы автоматически (либо по специальной опции)выравнивать начало партициий по границе сектора. При наличии опции с параметром, я бы всегда задавал выравнивание по границе 1М (удобно и для SSD и для RAID).

    ОтветитьУдалить
  3. Скажите пожалуйста, а как метку раздела снести?

    # gpart modify -i 2 -l "" ad10
    ad10p2 modified

    # gpart show -l ad10
    => 34 234441581 ad10 GPT (112G)
    34 256 1 boot (128K)
    290 8388608 2 sysswap (4.0G)
    8388898 4194304 3 sysroot (2.0G)
    12583202 62914560 4 sysvar (30G)
    75497762 158943853 5 sysusr (76G)

    Таким образом чото не получается.

    ОтветитьУдалить
  4. у меня работает. Какая версия системы? Что выводит команда:
    # ident /sys/geom/part/g_part_gpt.c

    ОтветитьУдалить
  5. # uname -mrs
    FreeBSD 8.2-RELEASE-p2 amd64

    # ident /sys/geom/part/g_part_gpt.c
    /sys/geom/part/g_part_gpt.c:
    $FreeBSD: src/sys/geom/part/g_part_gpt.c,v 1.16.2.13.2.1 2010/12/21 17:09:25 kensmith Exp $

    ОтветитьУдалить
  6. Добрый день!
    А можно по подробнее рассказать про bootcode?
    Я немного ни понимаю различай между -p и -b опциями, и что применять для моего случая со sparc64 =(

    ОтветитьУдалить
  7. Лично у меня не было возможности поработать с FreeBSD на спарках,
    поэтому ничего конкретного тут посоветовать не могу. Видимо, тут всё зависит от того,
    какая таблица разделов у вас используется. Некоторое время назад я добавил главу
    "BOOTSTRAPPING" в мануал gpart(8). Там есть объяснение с примерами, какой загрузочный код
    где должен находиться: gpart(8)

    Разница между -p и -b в том, что первый - partcode, располагается на специально выделенном
    для него разделе, а второй - bootcode, находится в области метаданных таблицы разделов.

    ОтветитьУдалить