вторник, 7 августа 2012 г.

Обновление загрузчика

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

Немного об изменениях. Было добавлено два программных интерфейса, назовём их PART и DISK. Первый предоставляет функции для работы с различными таблицами разделов: поиск метаданных таблиц разделов, парсинг и формирование списков разделов, получение информации по каждому разделу и т.п. На данный момент поддерживаются GPT, MBR, EBR, BSD label и VTOC8. Набор поддерживаемых таблиц разделов определяется переменными make на этапе компиляции. Обычно это GPT, MBR+EBR и BSD label.

PART API можно использовать напрямую, как это теперь делает ZFS, либо через DISK API. DISK API предназначен для использования в дисковых драйверах загрузчика. Интерфейс вобрал в себя всё общее, что есть между драйверами дисков загрузчиков разных аппаратных архитектур. Это позволило, во-первых, значительно упростить код драйверов, а, во-вторых, унифицировать алгоритмы их работы относительно определения таблиц разделов. Причём, эти алгоритмы почти на 100% совпадают с используемыми ядром. Поэтому, теперь не должно возникать ситуаций, когда загрузчик видит одни разделы, а ядро другие. Раньше такое было вполне возможно.

Основные особенности, которые попали в CURRENT:
  • теперь loader умеет считать контрольную сумму для GPT заголовка и таблицы, а так же использовать резервную копию GPT;
  • PMBR так же научился работать с резервной GPT;
  • в качестве дополнительного бонуса, улучшенная поддержка EBR позволяет загрузить систему с логического тома. Правда boot0 делать этого не умеет, на сколько я помню.
  • Так как ZFS научилась читать таблицы разделов, теперь она не перебирает все возможные комбинации разделов, а тестирует только те, на которых ZFS может быть установлена. Т.е. это разделы с типом "freebsd" и "freebsd-zfs", так что, если у вас есть загрузочный пул на разделах с другим типом, это нужно исправлять.
От идеи с определением метаданных GEOM в загрузчике пока отказались. Так же остались ещё патчи для uboot и архитектур arm/powerpc, которые так никто и не протестировал.

Мой студент в GSoC прошёл первый "отборочный тур", пока с небольшим отставанием от графика, но надежда на то, что скоро у нас на x86 заработает загрузка через EFI есть.

Дальше я планирую провести серию тестов по загрузке системы в различных конфигурациях с разным размером дискового кеша. Сейчас по-умолчанию его размер всего 16 Кбайт, и как показали первые тесты, его увеличение даёт прирост в скорости загрузки на несколько секунд, по крайней мере на моей машине.

В свободное время почитал код различных библиотек, утилит, загрузчиков и UEFI шелла, а так же документацию, какую удалось найти. Теперь уже гораздо лучше представлю, как будет работать наш UEFI загрузчик. Так что, если студент не справится, его работа не пропадёт даром :)

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

  1. С точки зрения профана, как то всё туманно, но всё одно любопытно :)
    Про EFI уже любопытнее, а больше инфы по статусу проекта нет, или только следить за http://lists.freebsd.org/pipermail/soc-status/ ?

    ОтветитьУдалить
  2. Ну, в общем да, кроме этого есть ещё wiki страница и svn репозиторий студентов:
    http://wiki.freebsd.org/SummerOfCode2012/IntelEFIBoot
    https://socsvn.freebsd.org/socsvn/soc2012/emc2/

    ОтветитьУдалить
    Ответы
    1. Тут напомнили про эту "неприятность", так что из проекта ничего не вышло? где то тут в коментах вроде была слабая надежда же, что не проектом так вашими стараниями :)

      Удалить
    2. UEFI сейчас пилит benno@ в отдельном бранче projects/uefi. И у него там уже довольно неплохой прогресс.

      Удалить
  3. Когда можно ждать доработанный loader в 9-STABLE ветке ?

    ОтветитьУдалить
    Ответы
    1. Думаю это случится не раньше середины сентября.
      Нужно дать время пользователям CURRENT найти спрятанные грабли :)

      Удалить
  4. Здравствуйте.

    Подскажите, а как корректно удалить раздел GPT? Обилие вариантов опций в команде "gpart" ( remove | stop | deactivate ) не очень понятно.

    Мне потребовалось изменить размер корневого раздела системного диска. Причина в том, что "Providers - Mediasize" GPT на новом сервере уже в 10 раз меньше, чем "Consumers - Mediasize". Утилит изменяющих размер GPT я не нашел. Логическое продолжение:
    - удалить зеркало,
    - изменить размеры разделов,
    - пересоздать зеркало.

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