четверг, 28 апреля 2011 г.

Метки разделов и выравнивание в gpart


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

Первый патч предназначен для решения проблемы с метками разделов, которые, как известно, реализуются сейчас классом GEOM_LABEL. Основная проблема в том, что для приемлемой работы с метками GEOM_LABEL предъявляет некоторые требования к провайдерам. Например, обнаружение меток GEOM_LABEL выполняет только во время tasting. Изменение меток может быть обнаружено только при условии использования механизма spoiling с последующим retaste. Что при существующей реализации класса GEOM_PART не представляется возможным.
Класс GEOM_PART управляет таблицей разделов и метки этих разделов хранятся в таблице, а не на провайдере раздела. Поэтому, при изменении метки механизм spoiling'а не запускается для провайдера раздела.

Предлагаемый мной патч отключает реализацию меток gpt/gptid в GEOM_LABEL и добавляет новый класс PART::LABEL. Он тесно связан с классом PART и, кроме того, имеет несколько функциональных отличий от GEOM_LABEL. Во-первых, он не использует механизм tasting, объекты класса и его провайдеры создаются по инициативе класса PART. Во-вторых, он не использует механизм spoiling, поэтому его провайдеры существуют всё время, а не исчезают, когда какой либо связанный провайдер начинает использоваться. Благодаря этому устраняется проблема с изменением меток, которые становятся видны сразу после изменения. И, на мой взгляд, удобнее, когда метки в /dev существуют всегда. К тому же, кроме реализации gpt/gptid я добавил поддержку меток в схемы PC98 и APM.

Я планирую включить этот патч в head/ примерно через неделю. Второй патч не вносит изменений в ядро. Он добавляет к утилите gpart(8) новую опцию "-а alignment", при использовании которой gpart выполняет выравнивание создаваемых разделов на заданную величину. Например так:

# gpart create -s gpt md0
md0 created
# gpart show md0
=>    34  409533  md0  GPT  (200M)
      34  409533       - free -  (200M)

# gpart add -t freebsd-boot -s 128k -a 4k md0
md0p1 added
# gpart add -t freebsd-ufs -s 60m -a 4k md0
md0p2 added
# gpart add -t freebsd-ufs -a 4k md0
md0p3 added
# gpart show md0
=>    34  409533  md0  GPT  (200M)
      34       6       - free -  (3.0K)
      40     256    1  freebsd-boot  (128K)
     296  122880    2  freebsd-ufs  (60M)
  123176  286384    3  freebsd-ufs  (139M)
  409560       7       - free -  (3.5K)

5 комментариев:

  1. Вот чтоб не исчезали - это действительно нужно.
    Неоднократно матерился по этому поводу, когда раздел по имени смонтировали - а в итоге метки как корова языком слизала из /dev/label/....

    ОтветитьУдалить
  2. Патч с выравниванием я закоммитил, а с метками пока отложил, можете не тестировать, он уже много раз изменялся :)

    ОтветитьУдалить
  3. Пробую эксперементироватть с выравниванием на md0 - что то не получается:

    gpart create -s mbr md0
    gpart add -a 4k -s 40m -t freebsd md0

    :~> gpart show md0
    => 9 204791 md0 MBR (100M)
    9 9 - free - (4.5k)
    18 81918 1 freebsd (40M)
    81936 122864 - free - (60M)

    Смещение раздела от начала - 18 секторов (по 512 байт), что не кратно 4 кб. Чтобы было кратно нужно 16.

    ОтветитьУдалить
  4. На MBR это практически не работает, MBR выравнивает самостоятельно относительно геометрии, т.е. в вашем случае размер трека равен 9 секторам, по ним и выравнивает.

    ОтветитьУдалить
  5. Чтобы правильно выравнять в MBR нужно умножать размер трека на величину выравнивания, либо искать наименьшее общее кратное от них.
    Другой вариант - не замарачиваться на вырванивании в MBR, а выравнять разделы внутри BSD label. Т.е. использовать -a 4k при создании разделов внутри md0s1.

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