Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Оглавление


Информация
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 и РУСБ.10015-10 (очередное обновление 1.7)
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)

  • Astra Linux Special Edition РУСБ.10015-16 исп. 1

  • Astra Linux Common Edition 2.12


Автоматическая разметка дисковых разделов с помощью partman-auto

Информация
Данная статья является переводом статьи : https://github.com/xobs/debian-installer/blob/master/doc/devel/partman-auto-recipe.txt

Введение

Директива partman-auto является частью системы управления дисковыми разделами, автоматизирующей разбиение дисков на дисковые разделы. Порядок разбиения управляется рецептами, предоставляемыми в виде файлов, а также может управляться пакетами udeb (пакетами, предназначенными для Debian Installer) или указанием параметров разметки в файле предварительных настроек для автоматической установки preseed. В настоящем документе описываются формы рецептов и порядок их применения.

Форма рецептов

Рецепты представляются в текстовых файлах. Все символы перевода строки и табуляции преобразуются в пробелы. Далее каждые два или более пробела заменяются одним пробелом. Почти все лексемы разделяются пробелами. Важным исключением является открывающая фигурная скобка ("{"); перед которой не должно быть пробелов. Далее в правилах пробелы обозначаются символом подчеркивания ("_").

Блок кода
 <рецепт>::=<заголовок>_<раздел>
 <заголовок>::=<простое имя>|<имя debconf>
 <простое имя>::=<имя>_:
<имя> может быть, например "Multi user system".
Блок кода
<имя debconf>::=<шаблон debconf>_::

Назначением лексемы <имя debconf> является перевод имен рецептов на другие языки.

Блок кода
<раздел>::=<раздел>|<раздел>_<разделы>
<раздел>::=<лимиты>_<спецификации>_.
<лимиты>::=<минимальный размер>_<приоритет>_<максимальный размер>_<файловая система>
  • <минимальный размер> задает минимальный допустимый размер дискового раздела в мегабайтах. Размер округляется до размера дискового цилиндра, поэтому есть задать минимальный размер 20МБ при размере цилиндра 12МБ размер дискового раздела будет 12МБ. Размеры также могут быть заданы в процентах от общего объёма системного ОЗУ или (начиная с partman-auto версии 87) как число плюс проценты (например, "2000+50%"), что задает размер как указанное число плюс указанный процент от общего объёма системного ОЗУ;
  • <приоритет> - некоторое число, обычно между числами <минимальный размер> и <максимальный размер>. Оно определяет приоритеты разделов при назначении размера. Если <приоритет> слишком мал (относительно приоритета другого раздела) этот раздел получит размер ближе к величине <минимальный размер>. Для маленьких разделов рекомендуется задавать <приоритет> больше чем их <максимальный размер>;
  • <максимальный размер> - максимальный размер раздела. Специальное значение -1 используется для задания разделов неограниченного размера;
  • <файловая система> - файловая система для этого раздела. Может быть задана как $default_filesystem для использования значения по умолчанию (в настоящее время ext3).


Блок кода
<спецификаторы>::=<спецификатор>|<спецификатор>_<спецификаторы>
<спецификатор>::=<внутренний спецификатор>|<регулярный спецификатор>|<спецификатор типа>
<внутренний спецификатор>::=$primary{_}|$bootable{_}|$default_filesystem{_}
  • $primary{_} - раздел должен быть создан как первичный (если это возможно);
  • $bootable{_} - раздел должен быть загрузочным;
  • $default_filesystem{_} - определяет, что должна использоваться файловая система, заданная по умолчанию (в настоящее время ext3).
Блок кода
<регулярный спецификатор>::=<имя файла>{ <содержимое файла> }
  • <file name> - имя файла, который будет создан в разделе (подробности см. часть 2.4 руководства по partman);
  • <file contents> - информация, которая будет записана в этот файл.
Блок кода
<спецификатор типа>::=$lvmok{_}|$defaultignore{_}|$lvmignore{_}
  • $lvmok{_} - указувает, что раздел может быть логическим томом LVM при использовании LVM;
  • $defaultignore{_} - используется для очистки принятых по умолчанию параметров раздела (применимо при использовании LVM);
  • $lvmignore{_} -  используется для очистки принятых по умолчанию параметров раздела LVM (применимо при неиспользовании LVM)

Спецификаторы defaultignore и lvmignore позволяют в одном рецепте определить разные параметры, например, раздела /boot в LVM-схеме разбиения на разделы и не-LVM схеме.

Примеры рецептов

Пример: корневой раздел и раздел подкачки (swap)

Блок кода
partman-auto/text/atomic_scheme:
500 10000 1000000 ext4
 $primary{ }
 $bootable{ }
 method{ format }
 format{ }
 use_filesystem{ }
 filesystem{ ext4 }
 mountpoint{ / } .

64 512 300% linux-swap
 method{ swap }
 format{ } .

Этим рецептом задается, что:

  • Раздел root должен быть не менее 500 МБ и фактически не имеет максимального размера. Размер раздела swap изменяется от 64МБ до тройного размера системного ОЗУ;
  • Параметр $bootable{ } делает раздел загружаемым, и параметр $primary{ } делает раздел первичным.

Кроме того, в примере используются параметры:

  • method{ format } - указывает, что раздел должен быть отформатирован. Для разделов подкачки (swap) используется значение "swap". Для создания раздела без форматирования используется значение "keep" (такой раздел может применяться для резервирования дискового пространства);
  • format{ } - следует указать, чтобы раздел был отформатирован;
  • use_filesystem{ } - указывает, что на разделе размещается файловая система;
  • filesystem{ ext4 } - указывает тип файловой системы для размещения на разделе;
  • mountpoint{ / } - задает точку монтирования раздела. Дополнительно можно задать опции монтирования, например, для задания опций "nodev,ro":

    Блок кода
     options/nodev{ nodev }
     options/ro{ ro }


Также возможно задать метку файловой системы для поддерживающих метки файловых систем. Например, для задания метки "astralinux":

Блок кода
 label{ astralinux }

При установке должен быть отформатирован один дисковый раздел, помеченный как:

Блок кода
 method{ format }

Пример: корневой раздел, раздел подкачки и отдельный раздел /home 

Блок кода
titlepartman-auto/text/home_scheme:
300 4000 7000 ext4
        $primary{ }
        $bootable{ }
        method{ format }
        format{ }
        use_filesystem{ }
        filesystem{ ext4 }
        mountpoint{ / } .

64 512 300% linux-swap
        method{ swap }
        format{ } .

100 10000 1000000000 ext4
        method{ format }
        format{ }
        use_filesystem{ }
        filesystem{ ext4 }
        mountpoint{ /home } .


Информация
Разделы будут создаваться в том порядке, в котором они  перечислены в рецепте.

Опции, специфичные для LVM

При использовании метода автоматического разбиения "lvm" в рецепте задаются специальные опции. Это позволяет разбить на разделы несколько дисков, определяя разделы, содержащие физические тома, принадлежность этих томов группам томов, имена и принадлежность логических томов.
В одной сессии может быть обработано несколько дисков, что также должно быть указано в рецепте. Разделы, не являющиеся логическими томами и не имеющие назначенных дисков (например, /boot) по умолчанию размещаются на первом диске. Для явного задания физического тома определим раздел следующим образом:

Блок кода
100 1000 1000000000 ext4
        $defaultignore{ }
        $primary{ }
        method{ lvm }
        device{ /dev/hdb }
        vg_name{ vg00 } .

 Параметры Параметры "device{ ... }" и "vg_name{ }" опциональнынеобязательны.
Указанные в параметре device устройства обязательно должны быть объявлены с помощью параметра partman-auto/disk.
Группа томов, в которую входит логический том, может быть задана как "in_vg{ }", например:


Блок кода
96 512 300% linux-swap
        $lvmok{ }
        in_vg{ vg00 }
        lv_name{ myswap }
        method{ swap }
        format{ } .

Параметр "lv_name{ }" задает имя логического тома, который будет создан.

Зависимость от архитектуры

Некоторые архитектуры предъявляют специфические требования к дисковым разделам. Например, многие из них требуют выделения специального дискового радела для поддержки загрузки. В частности, так называемые NewWorld PowerMAC машины требуют загрузочный дисковый раздел, размещенный в начале дискаnдиска. Ниже приведен фрагмент рецепта для создания такого раздела:

Блок кода
1 1 1 hfs
 $bootable{ }
 method{ newworld } .

Этот раздел должен быть первым в списке разделов и он не должен быть отформатирован.

Другой пример — архитектура  netwinder, требующая небольшой раздел /boot, отформатированный в файловую систему ext2 версии 0:

Блок кода
50 500 100 ext2
 $primary{ }
 $bootable{ }
 method{ format }
 format{ }
 use_filesystem{ }
 filesystem{ ext2r0 }
 mountpoint{ /boot } .

И, наконец, пример настройки загрузочного раздела EFI для архитектуры ia64:

Блок кода
100 100 150 fat16
        $primary{ }
        method{ efi }
        format{ } .

Для других архитектур см. соответствующие рецепты в udeb-пакете partman_auto.

Ограничения

Из-за ограничений реализации partman-auto для того, чтобы было использовано всё свободное дисковое пространство, должен быть задан один раздел максимального размера.  Обычно для этого используется раздел /home, которому назначается максимальный размер 1000000000, что достаточно для существующих устройств хранения данных. Если большой раздел /home не нужен, можно задать дополнительный дисковый раздел с размером 1000000000, с методом создания "keep" и оставить его не примонтированным. После завершения инсталляции такой раздел можно удалить. 

Порядок вычисления размеров разделов

Предположим, требуется создать N разделов и min[i], max[i] и priority[i] — максимальный размер, минимальный размер и приоритет раздела i как описано в части 1 настоящей статьи.
Предположим free_space — размер свободного места для размещения разделов. Тогда:

Блок кода
for(i=1;i<=N;i++) {
   factor[i] = priority[i] - min[i];
}
ready = FALSE;
while (! ready) {
   minsum = min[1] + min[2] + ... + min[N];
   factsum = factor[1] + factor[2] + ... + factor[N];
   ready = TRUE;
   for(i=1;i<=N;i++) {
      x = min[i] + (free_space - minsum) * factor[i] / factsum;
      if (x > max[i])
         x = max[i];
      if (x != min[i]) {
         ready = FALSE;
         min[i] = x;
      }
   }
}

В итоге значение min[i] будет значением размера радела  i.