На этой неделе я опубликовал два патча, в тестировании которых мне нужна помощь, возможно, среди читателей найдутся желающие :)
Первый патч предназначен для решения проблемы с метками разделов, которые, как известно, реализуются сейчас классом 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)
Вот чтоб не исчезали - это действительно нужно.
ОтветитьУдалитьНеоднократно матерился по этому поводу, когда раздел по имени смонтировали - а в итоге метки как корова языком слизала из /dev/label/....
Патч с выравниванием я закоммитил, а с метками пока отложил, можете не тестировать, он уже много раз изменялся :)
ОтветитьУдалитьПробую эксперементироватть с выравниванием на 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.
На MBR это практически не работает, MBR выравнивает самостоятельно относительно геометрии, т.е. в вашем случае размер трека равен 9 секторам, по ним и выравнивает.
ОтветитьУдалитьЧтобы правильно выравнять в MBR нужно умножать размер трека на величину выравнивания, либо искать наименьшее общее кратное от них.
ОтветитьУдалитьДругой вариант - не замарачиваться на вырванивании в MBR, а выравнять разделы внутри BSD label. Т.е. использовать -a 4k при создании разделов внутри md0s1.