diff --git a/ru_RU.KOI8-R/books/handbook/vinum/Makefile b/ru_RU.KOI8-R/books/handbook/vinum/Makefile new file mode 100644 index 0000000000..02f7d6da87 --- /dev/null +++ b/ru_RU.KOI8-R/books/handbook/vinum/Makefile @@ -0,0 +1,17 @@ +# +# Build the Handbook with just the content from this chapter. +# +# $FreeBSD$ +# $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/handbook/vinum/Makefile,v 1.1 2003/11/29 21:10:53 marck Exp $ +# Original revision: 1.1 +# + +CHAPTERS= vinum/chapter.sgml + +VPATH= .. + +MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX} + +DOC_PREFIX?= ${.CURDIR}/../../../.. + +.include "../Makefile" diff --git a/ru_RU.KOI8-R/books/handbook/vinum/chapter.sgml b/ru_RU.KOI8-R/books/handbook/vinum/chapter.sgml new file mode 100644 index 0000000000..3d527a6860 --- /dev/null +++ b/ru_RU.KOI8-R/books/handbook/vinum/chapter.sgml @@ -0,0 +1,1394 @@ + + + + + Менеджер дискового пространства Vinum + + + Краткая аннотация + + Какие бы диски у вас ни были, они всегда будут подвержены + ограничениям: + + + + Слишком маленькие + + + + Слишком медленные + + + + Недостаточно надежные + + + + + + + + + Greg + Lehey + Изначально написано + + + + + Диски слишком малы + + Vinum + RAID + Software + + Vinum (произносится Винум, + с ударением на первом слоге) — так называемый + Менеджер дисковых томов — представляет + собой виртуальный дисковый драйвер, призванный решить три вышеописанные + проблемы. Взглянем на них более подробно. Предлагаются + (и реализованы) следующие пути: + + Объемы дисков растут, тем не менее, растут и требования к объемам + систем хранения данных. Вы запросто можете оказаться в ситуации, когда + требуемый объем файловой системы превышает размеры доступных + дисков. Надо признать, что в настоящее время данная проблема стоит не + так остро, как 10 лет назад, но тем не менее она существует. Некоторые + системы выходят из этого тупика посредством создания мета-устройств, + распределяющих хранящиеся данные по нескольким дискам. + + + + Ограниченная пропускная способность + + Современным системам часто необходим одновременный доступ ко многим + данным. В частности, крупный FTP или HTTP-сервер может обслуживать + тысячи одновременных соединений, поступающих по нескольким + 100 Mbit/s каналам во внешний мир, что ощутимо превышает скорость + передачи данных большинства дисков. + + Современные диски могут передавать данные со скоростями до + 70 MB/s; однако, эти цифры труднодостижимы в случае, когда к диску + обращается большое число независимых процессов, каждый из которых + может получить лишь часть этого значения. Интересным будет + взглянуть на проблему с точки зрения дисковой подсистемы: важным + параметром в нашем случае будет загрузка подсистемы фактом передачи + фрагмента данных, а именно время, в течение которого диски, участвующие в + передаче, будут заняты. + + При любом запросе диск сначала должен спозиционировать головки, + дождаться подхода к головкам первого сектора из необходимых, и лишь затем + выполнить обращение. Данная операция может рассматриваться как + атомарная: нет никакого смысла ее прерывать. + + + Рассмотрим типичный запрос на передачу 10 kB информации. Современные + высокопроизводительные диски подводят головки в нужную позицию в среднем + за 3.5 миллисекунды. Самые быстрые диски вращаются со скоростью + 15000 об/мин, так что среднее время на подход первого сектора к + головке (rotational latency, половина времени одного оборота) составит + еще 2 миллисекунды. При линейной скорости передачи данных в + 70 MB/s собственно чтение/запись займет около + 150 микросекунд — исчезающе мало по сравнению с временем + позиционирования. В нашем случае, эффективная скорость передачи данных + падает почти до 1 MB/s и, очевидно, сильно зависит от размера + передаваемого блока. + + Традиционным и очевидным решением этой проблемы является принцип + больше шпинделей: вместо использования одного большого + диска можно применить несколько дисков меньшего размера. Диски + позиционируют головки и передают данные независимо, так что эффективная + пропускная способность возрастает примерно во столько раз, сколько дисков + мы применяем. + + Точная цифра, разумеется, будет несколько ниже: диски могут передавать + данные параллельно, но у нас нет средства обеспечить строго равномерное + распределение нагрузки по всем дискам. Нагрузка на один диск неизбежно + будет больше чем на другой. + + + disk concatenation + + + Vinum + сцепленные диски (concatenation) + + + Равномерность распределения нагрузки на диски серьезно зависит от + способа распределения по ним данных. В терминах дальнейшего обсуждения, + будет удобно представить пространство хранения набором большого + количества секторов с данными, которые адресуются по номеру, подобно + страницам в книге. Наиболее очевидным методом будет поделить виртуальный + диск на группы расположенных последовательно секторов размером с + физический диск (которые будут подобны разделам книги). Этот метод + называется конкатенацией или сцеплением + (concatenation); его преимуществом является то, что он не + налагает никаких ограничений на размеры применяемых дисков. Конкатенация + эффективна, если нагрузка на дисковое пространство распределена + равномерно. В случае концентрации нагрузки в малой области диска + увеличение производительности не будет заметно. Организация секторов на + сцепленных единицах хранения показана на . + + +
+ Организация сцепленных дисков + +
+
+ + + disk striping + + + Vinum + striping (перемежение) + + + Альтернативным подходом будет разделение адресного пространства на + компоненты одного, сравнительно небольшого размера, и расположение их + последовательно на разных устройствах. Например, первая группа из 256 + секторов будет расположены на первом физическом диске, + вторая — на следующем и т.д. n+1-я группа попадает на первый + диск вслед за первой. Такое расположение называется + перемежающимся (striping) или + RAID-0. + + + RAID + + RAID — сокращение от термина + Redundant Array of Inexpensive Disks (массив недорогих дисков с + резервированием); различные виды RAID + предоставляют разные формы защиты от сбоев. RAID-0, + вообще говоря, не является RAID, поскольку не + обеспечивает резервирования.. + + Перемежение требует дополнительных усилий для нахождения нужного блока + данных и может приводить к дополнительным нагрузкам на подсистемы + ввода-вывода, если передаваемый блок пересекает границу stripe (тем самым + попадая на разные диски), зато обеспечивает более равномерное + распределение нагрузки по физическим дискам. Распределение блоков по + физическим дискам в случае striping иллюстрируется + . + + +
+ Организация с перемежением + +
+
+
+ + + Целостность данных + + Наконец, слабым местом современных дисков является их ограниченная + надежность. Несмотря на то, что за последние несколько лет она ощутимо + выросла, из всех компонентов сервера отказ дисков наиболее вероятен. + Отказ может привести к катастрофическим + результатам: замена отказавшего диска и восстановление данных может + занять несколько дней. + + + disk mirroring + + + Vinum + зеркалирование (mirroring) + + + RAID-1 + + + Традиционным путем решения проблемы надежности является + зеркалирование (mirroring), обеспечивающее + хранение всей информации в двух копиях на различных физических + носителях. С момента изобретения аббревиатуры RAID + эту технику также называют RAID уровня 1 или просто + RAID-1. Любой запрос на запись в таком томе + приводит к записи в оба подтома, чтение может производиться из любой + половины, так что данные остаются доступны в случае отказа одного из + дисков. + + Зеркалирование имеет два слабых места: + + + + Цена: требуется вдвое больше дисков. + + + + Проблемы с производительностью: запись производится на оба + диска, требуя вдвое большей пропускной способности шины. + Производительность чтения не уменьшается, более того, часто + увеличивается. + + + + RAID-5 + + + Альтернативным решением является хранение контрольных сумм + (четности), реализованное в RAID уровней + 2, 3, 4 и 5. Наиболее интересен RAID-5. В + реализации Vinum, это вариант организации тома с перемежением, при + котором один из блоков в страйпе выделяется для хранения четности + остальных n-1 блоков. Как требует спецификация + RAID-5, положение блока четности меняется от страйпа + к страйпу. + + +
+ Организация RAID-5 + +
+
+ + По сравнению с зеркалированием преимуществом RAID-5 + является гораздо меньшее требование к объему дисков. Скорость чтения + сравнима с чтением в случае томов с перемежением, а вот запись + происходит ощутимо медленнее (примерно вчетверо медленнее чтения). При + отказе одного из дисков массив продолжает работать в "деградировавшем" + режиме: запросы на чтение с оставшихся дисков производятся обычным + образом, а блоки с отказавшего диска перевычисляются из данных + остальных блоков страйпа. + +
+ + + Объекты Vinum + Для обеспечения необходимой функциональности Vinum использует + четырехуровневую иерархию объектов: + + + + "Видимая снаружи" сущность — виртуальный диск, + называемый томом (volume). Тома в основном + аналогичны дискам &unix;, хотя имеются и мелкие различия. На тома + нет ограничений по размеру. + + + + Тома образуются из наборов (plex), каждый + из которых представляет полное адресное пространство тома. Данный + уровень иерархии, таким образом, реализует избыточность. Наборы + являются аналогами отдельных дисков в зеркалированном массиве; + содержимое наборов идентично. + + + + Поскольку Vinum работает в среде подсистемы хранения данных + &unix;, многодисковые наборы можно было бы реализовать на базе + дисковых разделов &unix;. На практике, подобная реализация + недостаточно гибка (диски &unix; могут иметь весьма ограниченное + число разделов). Вместо этого Vinum вводит еще один + уровень абстракции: единый дисковый раздел &unix; + (drive в терминах Vinum) делится на + непрерывные области, называемые поддисками + (subdisk), которые и будут "строительным материалом" для + наборов. + + + + Поддиски, как уже упоминалось, располагаются внутри + приводов (drive) Vinum, существующих + дисковых разделов &unix;. Привод может содержать неограниченное + количество поддисков. Небольшая область в начале привода + зарезервирована под хранение информации о конфигурации и состоянии + Vinum; все остальное пространство пригодно для хранения + данных. + + Сейчас мы опишем, как эта иерархия обеспечивает необходимую + функциональность для Vinum. + + + Размер тома + + Наборы могут состоять из большого количества поддисков, + распределенных по разным приводам Vinum. Стало быть, размеры отдельных + дисков не ограничивают размер набора, а следовательно, и тома. + + + + Избыточность + + Vinum реализует избыточность посредством связывания с томом + нескольких наборов. Содержимое каждого набора является полной копией + содержимого тома. Количество наборов в томе может быть от одного до + восьми. + + Хотя набор представляет данные тома целиком, отдельные части + содержимого тома могут быть представлены не всеми наборами. + Во-первых, для некоторых частей набора поддиски могут быть не + определены; во-вторых, часть набора может быть потеряна из-за отказа + диска. До тех пор, пока хотя бы один набор может обеспечить данные для + полного адресного пространства тома, том полностью функционален. + + + + Производительность + + Vinum поддерживает как конкатенацию, так и перемежение на уровне + наборов: + + + + Сцепленный набор использует пространство + поддисков последовательно, склеивая их "встык". + + + + Набор с перемежением разбивает данные по + поддискам в соответствии с размером страйпа. Поддисков должно быть + по меньшей мере два (чтобы отличить набор от сцепленного), и все + они должны быть одинакового размера. + + + + + + Организация наборов: что выбрать? + + + Vinum, распространяемый с FreeBSD версии &rel.current; поддерживает + два вида организации наборов: + + + + Сцепленные наборы наиболее гибки в использовании: они могут + содержать любое количество поддисков произвольного размера. Такой + набор может быть расширен "на лету" путем добавления дополнительных + поддисков. Поддержка сцепленных наборов требует меньших затрат + процессорного времени, чем поддержка наборов с перемежением (хотя + различие вряд ли поддается измерению). + С другой стороны, они наиболее чувствительны к концентрации + нагрузки в одной области тома, при которой один из дисков принимает + на себя всю нагрузку, а остальные бездействуют. + + + + Основным преимуществом наборов с перемежением + (RAID-0) является распределение "горячих точек" + нагрузки; вы можете даже полностью уравнять ее, выбрав оптимальный + размер страйпа (около 256 kB). Недостатки такой + организации — более сложный код и ограничения на поддиски: + все они должны быть строго одного размера. Кроме того, процесс + добавления поддиска в набор с перемежением "на ходу" является + настолько нетривиальной задачей, что в настоящее время Vinum не + поддерживает эту операцию. Дополнительное (тривиальное) + ограничение состоит в том, что набор с перемежением должен + содержать как минимум два поддиска, иначе он будет неотличим от + сцепленного. + + + + Преимущества и недостатки различных методов организации наборов + описаны в . + + + Методы организации наборов Vinum + + + + Тип набора + Поддисков, мин. + Расширяется "на лету" + Поддиски строго одного размера + Применение + + + + + + сцепленный (concatenated) + 1 + да + нет + Крупные системы хранения, требующие максимальной + гибкости и умеренной производительности + + + + с перемежением (striped) + 2 + нет + да + Высокая производительность, в том числе в случае + параллельного доступа к данным + + + +
+
+
+ + + Несколько примеров + + Vinum ведет базу данных конфигурации, в которой + описаны все объекты Vinum в отдельной системе. Начальная конфигурация + создается пользователем при помощи системной утилиты &man.vinum.8; из + одного или нескольких конфигурационных файлов. Копия конфигурации + хранится в начале каждого дискового раздела (привода) Vinum. Все копии + обновляются при изменении состояния томов, поэтому после перезапуска + состояние объектов Vinum восстанавливается. + + + Конфигурационный файл + Конфигурационный файл описывает объекты Vinum. Описание простого + тома может быть таким: + + + drive a device /dev/da3h + volume myvol + plex org concat + sd length 512m drive a + + Здесь описываются четыре объекта Vinum: + + + + Строка drive объявляет дисковый раздел + (привод) и его местоположение на физическом + диске. Приводу дано символьное имя a. + Разделение символьных имен и имен устройств дает возможность + перемещать физические диски (например, по разным контроллерам, или + менять их местами) без изменения конфигурации. + + + + Строка volume описывает том. + Единственным требуемым параметром является имя тома + myvol. + + + + Строка plex определяет набор. + Единственный обязательный параметр — метод организации + набора, в нашем случае concat (сцепленный). + Давать набору имя в явном виде не обязательно: Vinum автоматически + сгенерирует имя набора из имени тома и суффикса + .px, где + x — номер набора в томе. В нашем + случае набор будет называться myvol.p0. + + + + Наконец, строка sd описывает поддиск. + Минимальными требованиями к его описанию являются имя + привода, на котором он будет располагаться, и + его размер. Как и в случае набора, имя указывать не обязательно: + имя поддиска будет построено добавлением + .sx к имени набора, где + x будет номером поддиска в наборе. Наш + поддиск получит имя myvol.p0.s0. + + + + В результате обработки такого конфигурационного файла &man.vinum.8; + выдаст нам следующее: + + + &prompt.root; vinum -> create config1 + Configuration summary + Drives: 1 (4 configured) + Volumes: 1 (4 configured) + Plexes: 1 (8 configured) + Subdisks: 1 (16 configured) + + D a State: up Device /dev/da3h Avail: 2061/2573 MB (80%) + + V myvol State: up Plexes: 1 Size: 512 MB + + P myvol.p0 C State: up Subdisks: 1 Size: 512 MB + + S myvol.p0.s0 State: up PO: 0 B Size: 512 MB + + На этом кратком листинге показан формат вывода &man.vinum.8;. + Графически созданный нами том представлен на + . + + +
+ Простой том Vinum + +
+
+ + Этот и последующие рисунки изображают том, содержащий один или + несколько наборов, каждый из которых, в свою очередь, состоит из одного + или нескольких поддисков. В первом тривиальном примере том состоит из + одного набора, представленного одним поддиском. + + Построенный нами только что том не имеет никаких преимуществ перед + обычным дисковым разделом. Он содержит единственный набор, так что не + обеспечивает избыточность; набор состоит из одного поддиска, поэтому + методика распределения дисковых блоков ничем не отличается от дискового + раздела. В последующих параграфах мы рассмотрим более интересные + конфигурации. +
+ + + Повышаем надежность: зеркалирование + + Надежность тома может быть повышена при помощи зеркалирования. + Планируя зеркалированный том, важно не забыть о том, чтобы поддиски + каждого набора располагались на разных физических дисках, чтобы отказ + одного из них не привел к выходу из строя более чем одного набора. Вот + конфигурация, определяющая зеркалированный том: + + + drive b device /dev/da4h + volume mirror + plex org concat + sd length 512m drive a + plex org concat + sd length 512m drive b + + Как мы видим, нет необходимости вновь описывать привод + a, поскольку Vinum сохраняет состояние уже + сконфигурированных объектов. После обработки этих определений + конфигурация будет выглядеть так: + + + Drives: 2 (4 configured) + Volumes: 2 (4 configured) + Plexes: 3 (8 configured) + Subdisks: 3 (16 configured) + + D a State: up Device /dev/da3h Avail: 1549/2573 MB (60%) + D b State: up Device /dev/da4h Avail: 2061/2573 MB (80%) + + V myvol State: up Plexes: 1 Size: 512 MB + V mirror State: up Plexes: 2 Size: 512 MB + + P myvol.p0 C State: up Subdisks: 1 Size: 512 MB + P mirror.p0 C State: up Subdisks: 1 Size: 512 MB + P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB + + S myvol.p0.s0 State: up PO: 0 B Size: 512 MB + S mirror.p0.s0 State: up PO: 0 B Size: 512 MB + S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB + + иллюстрирует структуру + полученного тома. + + +
+ Зеркалированный том Vinum + +
+
+ + В данном примере каждый набор содержит все 512 MB адресного + пространства тома. Как и в предыдущем случае, каждый набор состоит + из одного поддиска. +
+ + + Оптимизируем производительность + + Зеркалированный том из предыдущего примера гораздо более + отказоустойчив, чем обычный том, но его производительность ниже: + каждый запрос на запись выливается в две операции физической записи, + что вдвое увеличивает необходимую пропускную способность шины дисковой + подсистемы. Увеличение производительности требует иного подхода: + вместо зеркалирования данные распределяются (перемежением) по + максимальному количеству физических дисков. Следующий пример + конфигурации создает том с перемежением на четырех дисках: + + + drive c device /dev/da5h + drive d device /dev/da6h + volume stripe + plex org striped 512k + sd length 128m drive a + sd length 128m drive b + sd length 128m drive c + sd length 128m drive d + + Как и ранее, нет необходимости переопределять уже + сконфигурированные приводы. Общий вид базы конфигурации Vinum после + создания нового тома будет таким: + + + Drives: 4 (4 configured) + Volumes: 3 (4 configured) + Plexes: 4 (8 configured) + Subdisks: 7 (16 configured) + + D a State: up Device /dev/da3h Avail: 1421/2573 MB (55%) + D b State: up Device /dev/da4h Avail: 1933/2573 MB (75%) + D c State: up Device /dev/da5h Avail: 2445/2573 MB (95%) + D d State: up Device /dev/da6h Avail: 2445/2573 MB (95%) + + V myvol State: up Plexes: 1 Size: 512 MB + V mirror State: up Plexes: 2 Size: 512 MB + V striped State: up Plexes: 1 Size: 512 MB + + P myvol.p0 C State: up Subdisks: 1 Size: 512 MB + P mirror.p0 C State: up Subdisks: 1 Size: 512 MB + P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB + P striped.p1 State: up Subdisks: 1 Size: 512 MB + + S myvol.p0.s0 State: up PO: 0 B Size: 512 MB + S mirror.p0.s0 State: up PO: 0 B Size: 512 MB + S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB + S striped.p0.s0 State: up PO: 0 B Size: 128 MB + S striped.p0.s1 State: up PO: 512 kB Size: 128 MB + S striped.p0.s2 State: up PO: 1024 kB Size: 128 MB + S striped.p0.s3 State: up PO: 1536 kB Size: 128 MB + + +
+ Том с перемежением + +
+
+ + Новосозданный том представлен на + . Плотность заштрихованных участков + показывает расположение страйпов в адресном пространстве набора (от + светлых к темным). +
+ + + Отказоустойчивость и производительность одновременно + + + При наличии достаточного количества дисков можно создать том, + сочетающий повышенную отказоустойчивость и высокую производительность + по сравнению со стандартными дисковыми разделами &unix;. Типичная + конфигурация может быть такой: + + + volume raid10 + plex org striped 512k + sd length 102480k drive a + sd length 102480k drive b + sd length 102480k drive c + sd length 102480k drive d + sd length 102480k drive e + plex org striped 512k + sd length 102480k drive c + sd length 102480k drive d + sd length 102480k drive e + sd length 102480k drive a + sd length 102480k drive b + + Как вы можете заметить, поддиски второго набора смещены на два + привода относительно поддисков первого. В результате даже при запросе + на запись, пересекающем границы страйпа, не возникнет двух обращений к + одному физическому диску. + + отражает структуру нового + тома. + + +
+ Зеркалированный том с перемежением + +
+
+
+
+ + + Правила именования объектов + + Как уже было описано, Vinum автоматически именует создаваемые + наборы и поддиски, хотя эти имена и могут быть переопределены. На самом + деле, мы не рекомендовали бы переопределять стандартные имена: опыт с + дисковым менеджером VERITAS показал, что гибкость в именовании объектов + не дает ощутимого преимущества, а запутать пользователя может. + + Имена объектов могут состоять из любых непробельных символов. + Впрочем, рекомендуем ограничиться буквами, цифрами и подчеркиваниями. + Имена томов, наборов и поддисков могут быть до 64 символов длиной; + максимальная длина имени привода — 32 символа. + + Для объектов Vinum в иерархии /dev/vinum + создаются файлы устройств. Приведенный выше пример конфигурации создаст + следующий набор устройств: + + + + Управляющие устройства + /dev/vinum/control и + /dev/vinum/controld, используемые системной + утилитой &man.vinum.8; и даемоном Vinum соответственно. + + + + Блоковые и символьные устройства для каждого из томов. + Основные устройства, используемые Vinum'ом. Блоковые устройства + именуются в соответствии с именами томов; символьные, в соответствии + с традицией именования устройств BSD, имеют префикс + r. Таким образом, вышеописанная конфигурация + будет включать блоковые устройства + + /dev/vinum/myvol, + /dev/vinum/mirror, + /dev/vinum/striped, + /dev/vinum/raid5 и + /dev/vinum/raid10, + и символьные устройства + /dev/vinum/rmyvol, + /dev/vinum/rmirror, + /dev/vinum/rstriped, + /dev/vinum/rraid5 и + /dev/vinum/rraid10. + + + + + + Каталог /dev/vinum/drive + с записями для каждого привода. В реальности, каждая запись является + символьной ссылкой на соответствующий файл дискового + устройства. + + + + Каталог /dev/vinum/volume + с записями для томов. В нем содержатся поддиректории для каждого + набора, внутри которых, в свою очередь, имеются поддиректории для + каждого из поддисков. + + + + Каталоги + /dev/vinum/plex, + /dev/vinum/sd и + /dev/vinum/rsd, + содержащие блочные устройства для наборов, блочные и символьные + устройства для каждого из поддисков. + + + + Например, для конфигурации, описываемой как + + drive drive1 device /dev/sd1h + drive drive2 device /dev/sd2h + drive drive3 device /dev/sd3h + drive drive4 device /dev/sd4h + volume s64 setupstate + plex org striped 64k + sd length 100m drive drive1 + sd length 100m drive drive2 + sd length 100m drive drive3 + sd length 100m drive drive4 + + после обработки &man.vinum.8;, созданный набор устройств в каталоге + /dev/vinum будет таким: + + + brwx------ 1 root wheel 25, 0x40000001 Apr 13 16:46 Control + brwx------ 1 root wheel 25, 0x40000002 Apr 13 16:46 control + brwx------ 1 root wheel 25, 0x40000000 Apr 13 16:46 controld + drwxr-xr-x 2 root wheel 512 Apr 13 16:46 drive + drwxr-xr-x 2 root wheel 512 Apr 13 16:46 plex + crwxr-xr-- 1 root wheel 91, 2 Apr 13 16:46 rs64 + drwxr-xr-x 2 root wheel 512 Apr 13 16:46 rsd + drwxr-xr-x 2 root wheel 512 Apr 13 16:46 rvol + brwxr-xr-- 1 root wheel 25, 2 Apr 13 16:46 s64 + drwxr-xr-x 2 root wheel 512 Apr 13 16:46 sd + drwxr-xr-x 3 root wheel 512 Apr 13 16:46 vol + + /dev/vinum/drive: + total 0 + lrwxr-xr-x 1 root wheel 9 Apr 13 16:46 drive1 -> /dev/sd1h + lrwxr-xr-x 1 root wheel 9 Apr 13 16:46 drive2 -> /dev/sd2h + lrwxr-xr-x 1 root wheel 9 Apr 13 16:46 drive3 -> /dev/sd3h + lrwxr-xr-x 1 root wheel 9 Apr 13 16:46 drive4 -> /dev/sd4h + + /dev/vinum/plex: + total 0 + brwxr-xr-- 1 root wheel 25, 0x10000002 Apr 13 16:46 s64.p0 + + /dev/vinum/rsd: + total 0 + crwxr-xr-- 1 root wheel 91, 0x20000002 Apr 13 16:46 s64.p0.s0 + crwxr-xr-- 1 root wheel 91, 0x20100002 Apr 13 16:46 s64.p0.s1 + crwxr-xr-- 1 root wheel 91, 0x20200002 Apr 13 16:46 s64.p0.s2 + crwxr-xr-- 1 root wheel 91, 0x20300002 Apr 13 16:46 s64.p0.s3 + + /dev/vinum/rvol: + total 0 + crwxr-xr-- 1 root wheel 91, 2 Apr 13 16:46 s64 + + /dev/vinum/sd: + total 0 + brwxr-xr-- 1 root wheel 25, 0x20000002 Apr 13 16:46 s64.p0.s0 + brwxr-xr-- 1 root wheel 25, 0x20100002 Apr 13 16:46 s64.p0.s1 + brwxr-xr-- 1 root wheel 25, 0x20200002 Apr 13 16:46 s64.p0.s2 + brwxr-xr-- 1 root wheel 25, 0x20300002 Apr 13 16:46 s64.p0.s3 + + /dev/vinum/vol: + total 1 + brwxr-xr-- 1 root wheel 25, 2 Apr 13 16:46 s64 + drwxr-xr-x 3 root wheel 512 Apr 13 16:46 s64.plex + + /dev/vinum/vol/s64.plex: + total 1 + brwxr-xr-- 1 root wheel 25, 0x10000002 Apr 13 16:46 s64.p0 + drwxr-xr-x 2 root wheel 512 Apr 13 16:46 s64.p0.sd + + /dev/vinum/vol/s64.plex/s64.p0.sd: + total 0 + brwxr-xr-- 1 root wheel 25, 0x20000002 Apr 13 16:46 s64.p0.s0 + brwxr-xr-- 1 root wheel 25, 0x20100002 Apr 13 16:46 s64.p0.s1 + brwxr-xr-- 1 root wheel 25, 0x20200002 Apr 13 16:46 s64.p0.s2 + brwxr-xr-- 1 root wheel 25, 0x20300002 Apr 13 16:46 s64.p0.s3 + + Заметим, что, несмотря на то что наборы и поддиски не рекомендуется + называть каким-либо специальным образом, приводы Vinum должны быть + поименованы. Именование позволяет отвязать приводы от физических + устройств, и при этом обеспечить их автоматическое распознавание. Имена + приводов могут достигать длины в 32 символа. + + + Создание файловых систем + + Тома с точки зрения системы аналогичны дискам, за одним малым + исключением: в отличие от дисков &unix;, тома Vinum не содержат таблиц + разделов. В результате + потребовалось модифицировать некоторые утилиты работы с дисками, в + первую очередь &man.newfs.8;, которая ранее использовала последний + символ имени тома для определения идентификатора раздела. Например, + дисковое устройство может именоваться + /dev/ad0a — первый раздел + (a) первого (0) IDE-диска + (ad) — или + /dev/da2h — восьмой раздел + (h) третьего (2) диска SCSI + (da). Том Vinum может называться, например, + /dev/vinum/concat — как легко + видеть, имя тома никак не связано с именем раздела. + + Обычно &man.newfs.8; пытается интерпретировать имя раздела и + сообщает об ошибке при невозможности такой интерпретации: + + &prompt.root; newfs /dev/vinum/concat +newfs: /dev/vinum/concat: can't figure out file system partition + + Дальнейшее относится к версиям FreeBSD до 5.0: + + Для создания файловых систем на томе Vinum следует использовать + опцию &man.newfs.8; : + + &prompt.root; newfs -v /dev/vinum/concat + + + + + + Создание конфигурации Vinum + + Стандартное (GENERIC) ядро FreeBSD не включает + Vinum. Хотя и можно собрать специальное ядро с включенной поддержкой + Vinum, этот вариант не рекомендуется. Обычный способ активизации + Vinum — загрузка модуля для ядра (kld). При + этом, явно использовать команду &man.kldload.8; нет необходимости: при + старте утилита &man.vinum.8; проверит наличие поддержки Vinum в ядре и + при необходимости загрузит модуль автоматически. + + + Активация + + Vinum хранит конфигурационную информацию на дисковых разделах + в той же форме, что используется в файлах конфигурации при создании + объектов. Впрочем, в них применяются некоторые ключевые слова, не + разрешенные в файлах конфигурации. Например, хранимая на диске база + может выглядеть так: + + volume myvol state up +volume bigraid state down +plex name myvol.p0 state up org concat vol myvol +plex name myvol.p1 state up org concat vol myvol +plex name myvol.p2 state init org striped 512b vol myvol +plex name bigraid.p0 state initializing org raid5 512b vol bigraid +sd name myvol.p0.s0 drive a plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 0b +sd name myvol.p0.s1 drive b plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 1048576b +sd name myvol.p1.s0 drive c plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 0b +sd name myvol.p1.s1 drive d plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 1048576b +sd name myvol.p2.s0 drive a plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 0b +sd name myvol.p2.s1 drive b plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 524288b +sd name myvol.p2.s2 drive c plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1048576b +sd name myvol.p2.s3 drive d plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1572864b +sd name bigraid.p0.s0 drive a plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 0b +sd name bigraid.p0.s1 drive b plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 4194304b +sd name bigraid.p0.s2 drive c plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 8388608b +sd name bigraid.p0.s3 drive d plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 12582912b +sd name bigraid.p0.s4 drive e plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 16777216b + + Видно, что каждый объект имеет явно описанное имя, а поддиски + еще и явное положение на приводе (и то и другое может, хотя это и не + рекомендуется, устанавливаться пользователем). Помимо этого, для + каждого объекта хранится его состояние (и установка состояния + напрямую пользователю недоступна). Vinum не хранит в + конфигурационных базах информацию о приводах: она создается при + сканировании дисковых разделов, помеченных как Vinum. Это дает + возможность Vinum правильно идентифицировать диски при смене имени + устройства. + + + Автоматическая активация + + Для автоматического старта Vinum при загрузке системы добавьте + следующую строку в файл конфигурации системы + /etc/rc.conf: + + start_vinum="YES" # set to YES to start vinum + + Если в вашей системе нет файла + /etc/rc.conf, создайте его с таким содержимым. + Данная строка вызовет активацию kld модуля Vinum + при загрузке, а также старт всех объектов, упомянутых в конфигурации + Vinum. Активация Vinum происходит до монтирования файловых систем, + так что возможны автоматическая проверка (&man.fsck.8;) и + монтирование файловых систем на томах Vinum. + + При старте с помощью команды vinum start, + Vinum читает базы конфигурации с одного из приводов. В нормальной + ситуации все приводы содержат идентичную информацию о конфигурации, + так что не имеет значения, какой именно диск будет читаться. В + случае краха Vinum определяет, какая копия является наиболее свежей, + в дальнейшем использует ее, а также обновляет ее на оставшихся + приводах. + + + + + + Vinum для корневой файловой системы + + Сервер, все информационные файловые системы которого дублированы, + хотелось бы оснастить и зеркалированной корневой файловой системой. + Создание такой конфигурации не вполне тривиально по сравнению с + зеркалированием прочих файловых систем: + + + + Корневая файловая система должна быть доступна для чтения + в самом начале процесса загрузки, так что инфраструктура Vinum + должна к этому моменту уже работать. + + + Том с корневой файловой системой содержит, помимо прочего, + системный загрузчик и ядро, которые должны читаться "родными" + (native) утилитами компьютера (BIOS для машин архитектуры PC); + обеспечить поддержку ими тонкостей Vinum зачастую невозможно. + + + + + В данном разделе термин корневой том означает + том Vinum, содержащий корневую файловую систему. Неплохой идеей является + назвать такой том "root", хотя это, разумеется, и + необязательно. Все наши примеры, впрочем, будут использовать именно это + имя. + + + Активизация Vinum на ранней стадии процесса загрузки + + Для обеспечения этого необходимо следующее: + + + + Vinum должен быть доступен ядру еще на этапе загрузки. + Метод, описанный в разделе , + неприменим; на самом деле, параметр start_vinum + не должен быть установлен. Одним из вариантов + является сборка ядра с поддержкой Vinum, что возможно, но, как + правило, нежелательно. Более удобный вариант — загрузка + модуля ядра Vinum при помощи /boot/loader + (), для чего в файл + /boot/loader.conf следует добавить + строку + + vinum_load="YES" + + + + Vinum должен быть активирован достаточно рано, поскольку + требуется предоставить том для корневой файловой системы. По + умолчанию Vinum в ядре не начинает поиск приводов, содержащих + информацию о томах Vinum, до команды администратора (или одного из + стартовых скриптов) vinum start. + + Данный раздел описывает необходимые действия для FreeBSD + версии 5.x и старше. Шаги, необходимые в случае FreeBSD версии 4.x, + описаны ниже: . + + Строка + + vinum.autostart="YES" + + в файле /boot/loader.conf, указывает + Vinum автоматически просканировать все диски + для сбора информации о томах в процессе загрузки ядра. + + + Обращаем ваше внимание, что нет необходимости как-либо + специально сообщать ядру, где находится корневая файловая система. + Загрузчик (/boot/loader) найдет необходимое + имя устройства в + /etc/fstab и передаст его ядру. В момент + монтирования корневой файловой системы ядро передаст имя устройства + соответствующему драйверу для декодирования (трансляции в пару + идентификаторов устройств — major/minor device + number). + + + + + + Загрузчик должен прочесть корневой том Vinum + + В настоящее время начальный загрузчик FreeBSD ограничен размером + всего в 7.5 KB, и этот размер фактически исчерпан (загрузчик должен + уметь прочесть файл /boot/loader с файловой + системы формата UFS и передать ему управление). Невозможно разместить + в загрузчике внутренние структуры Vinum, чтобы он мог считать настройку + Vinum и самостоятельно определить элементы загрузочного тома. + Поэтому, для создания у + загрузчика иллюзии, что загрузка происходит со стандартного раздела + "a" требуются некоторые дополнительные + ухищрения. + + Для того, чтобы такая загрузка вообще была возможной, корневой том + должен отвечать следующим требованиям: + + + + быть только зеркалированным (ни перемежение, ни RAID5 + невозможны); + + + + содержать ровно один поддиск на каждом из наборов. + + + + Заметим, что возможно (и является, вообще говоря, основной целью), + чтобы корневой том содержал несколько наборов, каждый с копией корневой + файловой системы. В процессе загрузки, впрочем, используется только + одна из копий (на этапе поиска начального загрузчика и его + конфигурационных файлов, ядра, модулей и т.п. до момента монтирования + корневой файловой системы). Для обеспечения возможности загрузки + поддиск каждого из наборов должен быть отображен в псевдо-раздел + "a". Вообще говоря, эти псевдо-разделы не обязаны + находиться на одних и тех же местах дисков; тем не менее, во избежание + излишней путаницы, рекомендуется создавать тома с одинаково устроенными + дисками для зеркалирования. + + Для создания псевдо-разделов "a" необходимо + для каждого из дисков, содержащих копию корневого тома, проделать + следующее: + + + + Определить положение (смещение от начала устройства) и размер + поддиска, являющегося частью корневого тома: + + vinum l -rv root + + Отметим, что все размеры и смещения в терминах Vinum указаны + в байтах. Для получения номеров блоков, используемых в утилите + disklabel, все числа надо поделить + на 512. + + + + Выполнить команду + + disklabel -e + devname + + для каждого из дисков, на котором будет расположен корневой + том. devname будет или именем диска + (например, da0) для дисков без таблицы + слайсов, или именем слайса (ad0s1). + + Если на устройстве уже есть раздел "a" + (скорее всего, это предыдущая инкарнация корневой файловой + системы), он должен быть переименован (чтобы быть доступным в + будущем, на всякий случай; при этом стартовый загрузчик больше не + должен выбирать его по умолчанию). Не забудьте, что активный + (например, смонтированный) раздел не может быть переименован, так + что переименование нужно производить или загрузившись с диска + Fixit, или в два шага (для конфигурации с + зеркалированием сначала переименовать раздел на втором диске, + затем, после перезагрузки, на первом). + + Затем, адрес начала нового раздела "a" + вычисляется как сумма начального смещения раздела Vinum и + подсчитанного выше адреса поддиска внутри привода. Совместно с + вычисленным размером эти значения вносятся в поля + "offset" и "size" строки + "a" &man.disklabel.8;; Поле + "fstype" должно быть 4.2BSD. + Значения полей "fsize", + "bsize" и "cpg" желательно + заполнить в соответствии с имеющейся файловой системой, хотя + в обсуждаемом контексте это и не строго обязательно. + + Как можно заметить, новосозданный раздел + "a" располагается внутри раздела Vinum. Утилита + disklabel разрешает разделам пересекаться только + в случае, если один из них корректно описан как имеющий тип + "vinum". + + + + Готово! Сконструированный псевдо-раздел + "a" создан на каждом из устройств, содержащих + реплики корневого тома. Крайне важно проверить результат + еще раз, выполнив команду + + fsck -n + /dev/devnamea + + + + Следует помнить, что все файлы, содержащие загрузочную + конфигурацию, должны быть построены в соответствии с новой корневой + файловой системой; скорее всего, эта информация не будет соответствовать текущему + положению вещей. В особенности, следует обратить внимание на + содержимое файлов /etc/fstab и + /boot/loader.conf. + + После перезагрузки начальный загрузчик должен определить данные + новой корневой файловой системы на основе Vinum и действовать в + соответствии с ними. В завершение процесса инициализации ядра, после + упоминания всех определившихся устройств, должно появиться сообщение + вида: + + Mounting root from ufs:/dev/vinum/root + + + + Пример конфигурации корневой файловой системы на базе Vinum + + После создания корневого тома, вывод команды + vinum l -rv root будет примерно таким: + + + +... +Subdisk root.p0.s0: + Size: 125829120 bytes (120 MB) + State: up + Plex root.p0 at offset 0 (0 B) + Drive disk0 (/dev/da0h) at offset 135680 (132 kB) + +Subdisk root.p1.s0: + Size: 125829120 bytes (120 MB) + State: up + Plex root.p1 at offset 0 (0 B) + Drive disk1 (/dev/da1h) at offset 135680 (132 kB) + + + + Из этой информации нас более всего интересует смещение в + 135680 байт относительно раздела + /dev/da0h. После деления на 512 получим 265 + дисковых блоков для утилиты disklabel. Аналогичным + образом, размер тома составит 245760 512-байтных блоков. Так же + устроена реплика тома на диске + /dev/da1h. + + Разметка разделов (disklabel) будет выглядеть примерно так: + + + +... +8 partitions: +# size offset fstype [fsize bsize bps/cpg] + a: 245760 281 4.2BSD 2048 16384 0 # (Cyl. 0*- 15*) + c: 71771688 0 unused 0 0 # (Cyl. 0 - 4467*) + h: 71771672 16 vinum # (Cyl. 0*- 4467*) + + + + Как уже отмечалось, размер ("size") + псевдо-раздела "a" соответствует значению, + вычисленному ранее; смещение ("offset") равно сумме + смещения поддиска внутри раздела Vinum ("h") и + смещения самого этого раздела относительно начала диска (слайса). Так + мы избегаем проблем, описанных ниже (). Заметим также, что раздел + "a" целиком размещен внутри раздела + "h", описывающего все данные Vinum на этом + диске. + + Заметим, что в описанном примере все дисковое пространство отдано + Vinum. Корневого раздела, существовавшего до настройки Vinum, нет, + поскольку это вновь установленный диск, предназначенный для + использования исключительно в Vinum. + + + + + + Проблемы и их устранение + + Если что-то пошло не так, должен быть путь для восстановления + доступа к информации. Далее описаны некоторые известные проблемные + ситуации и способы их устранения. + + + Загрузчик работает, но система не грузится + + Если по каким-то причинам система не может завершить загрузку, + загрузчик может быть прерван нажатием пробела в течение первых 10 (по + умолчанию) секунд. Вы можете посмотреть переменные загрузчика (такие + как vinum.autostart) при помощи команды + show и изменить их содержимое командами + set и unset. + + Если единственной проблемой было отсутствие загруженного + модуля ядра Vinum, поможет просто команда + load vinum. + + Процесс загрузки должен быть продолжен командой + boot -as. Параметры заставят + ядро спросить о корневой файловой системе (параметр + ) и остановить процесс загрузки в + однопользовательском (параметр ) режиме. При этом + корневая файловая система будет смонтирована в режиме "только для + чтения" (read-only). В результате, даже если будет смонтирован лишь + один набор из многонаборного тома, риска рассинхронизации наборов + нет. + + Ответом на приглашение ввести адрес корневой файловой системы + может быть имя любого устройства, указывающего на файловую систему, + пригодную для загрузки. При корректно построенной карте файловых + систем (/etc/fstab) значением по умолчанию + должно быть что-то вроде ufs:/dev/vinum/root. + Распространенной альтернативой будет, например, + ufs:da0d (раздел, содержащий корневую файловую + систему в эпоху "до Vinum"). Будьте осторожны, монтируя в качестве + корневой файловой системы раздел "a", ссылающийся + внутрь привода Vinum. В зеркалированном томе смонтируется только + часть файловой системы. Если вам потребуется изменить ее + содержимое, необходимо будет также удалить и создать заново остальные + наборы тома в конфигурации Vinum, иначе они будут содержать + несинхронизированные данные. + + + + Работает только основной загрузчик + + Если /boot/loader не загружается, + а основной загрузчик все еще пригоден к работе (в + начале процесса загрузки появляется одиночный минус в первой колонке экрана), + можно попытаться прервать основной загрузчик нажатием пробела в этот + момент. При этом загрузка будет остановлена на второй стадии + (см. ). Можно + попробовать загрузиться с другого раздела, например, содержащего + предыдущую копию корневой файловой системы (бывший раздел + "a", см. выше). + + + + Ничего не грузится, загрузчик падает + + Это происходит, когда загрузчик на диске затерт Vinum'ом. + К сожалению, Vinum оставляет лишь 4 KB в начале своего раздела + до записи своих управляющих блоков. Две стадии первоначального + загрузчика в совокупности с меткой диска BSD (disklabel) требуют + 8 KB. Так что попытка создать раздел Vinum по смещению 0 диска + или слайса, который должен быть загруженным, затрет загрузчик. + + Что хуже, попытка разрешить описанную ситуацию посредством + загрузки с диска Fixit и перезаписи начального + загрузчика при помощи команды disklabel -B (как + описано в ) приведет к тому, что + загрузчик затрет управляющий заголовок Vinum, и тот не сможет найти + свой диск. Хотя собственно конфигурация Vinum при этом не + потеряется, и все данные могут быть восстановлены посредством + создания объектов на их предыдущих местах, очень сложно окончательно + исправить ситуацию. Весь раздел Vinum должен быть смещен по + крайней мере на 4 KB, так чтобы загрузчики и заголовок Vinum + более не пересекались. + + + + + + + Отличия для FreeBSD версий 4.x + + В системах под управлением FreeBSD 4.x отсутствуют некоторые + функции ядра, необходимые для автоматического сканирования дисков + Vinum'ом; кроме того, код, определяющий номера устройств корневой + файловой системы, недостаточно продвинут для того, чтобы понимать + конструкции вида /dev/vinum/root. Требуется + приложение дополнительных усилий. + + Во-первых, в файле /boot/loader.conf должен + быть явно указан список дисков, которые Vinum будет сканировать: + + vinum.drives="/dev/da0 + /dev/da1" + + Важно, чтобы были описаны все приводы, на которых могут встретиться + данные Vinum. Не произойдет ничего плохого, если будет описано + больше дисков, чем необходимо. Также, нет нужды + описывать все слайсы и/или разделы (Vinum сканирует их + автоматически). + + Поскольку подпрограммы разбора имени корневой файловой системы + и определения номеров устройств воспринимают только + классические имена, такие как + /dev/ad0s1a, для них не подходят имена типа + /dev/vinum/root. Имя корневого тома должно + быть сообщено Vinum отдельно. Для этого служит переменная загрузчика + vinum.root. Соответствующая строка в файле + /boot/loader.conf будет выглядеть так: + + vinum.root="root" + + + Процедура инициализации ядра выглядит так: перед определением + корневого устройства для загрузки проверяется, не установил ли + какой-либо модуль соответствующий параметр ядра. В случае + положительного ответа и при совпадении основного + (major) номера устройства драйвера и установленной файловой системы + автоопределение прекращается, что дает возможность передать продолжение + процесса загрузки и монтирование корневого тома Vinum. + + Следует отметить, впрочем, что обработчик ответа на запрос имени + корневой файловой системы (boot -a) не может + разобрать имя тома Vinum. Можно ввести имя устройства, отличное от + устройства Vinum (в этом случае произойдет стандартная процедура + разбора, так что можно указать, например, + ufs:da0d). Имена же, подобные + ufs:vinum/root не могут быть распознаны. + Единственным выходом из этой ситуации будет перезагрузка и введение + имени устройства заново (префикс /dev/ в + ответе на запрос askroot всегда можно опустить). + + +