DragonFly: Установка и первичная настройка

Алексей Федорчук
Линуксцентр
актуализированная версия

2005-07-26

назад | к началу | вперед

Интермедия: стратегия дисковой разметки

А вот разделить по Божьи -
Тут очень расчет нужон.
Александр Галич

У пользователя со стажем работы, например, в Linux или какой-либо BSD-системе, скорее всего, сложились уже собственные представления об идеальной схеме разметки разделов. И представления эти, с некоторыми коррективами, вполне применимы и к DragonFly. Однако позволю себе осветить свои представления по этому вопросу - во-первых, ввиду важности, а во-вторых - потому что особенности текущего состояния BSD Installer делают ошибки в дисковой разметке весьма трудноустранимыми его средствами. Ну и вообще для DragonFly этот вопрос имеет ряд специфических аспектов.

Итак - сакраментальный российский вопрос - что делать? (при разметке диска), и кто виноват? (если "опять все не получилось!" - как сказал в отчаянии хирург, кромсая большим медицинским скальпелем внутренности пациента после неудачной операции аппендикса).

Правда, на второй вопрос ответить легко: виноват, в 99 случаев из ста, сам хирург, то есть пользователь, устанавливающий систему. А вот первый - это действительно вопрос, сродни Гамлетовскому.

Существует широко известный стандарт FHS (Filesystem Hierarchy Standart), описание которого доступно в русском переводе благодаря Виктору Костромину. Хотя его конкретная реализация и не столь уж общепризнанна, как это кажется его авторам (или, скорее, как бы им хотелось), положенные в его основу принципы вполне можно взять на вооружение при определении стратегии дисковой разметки.

В основу FHS положена пара альтернатив:

  1. противопоставление неизменяемых и изменяемых файловых систем;
  2. обособление файловых систем неразделяемых и разделяемых.

Контент неизменяемых файловых систем создается при инсталляции ОС ее первичной настройке, и в дальнейшем не претерпевает модификации. По крайней мере, без участия администратора - а тот должен прибегать к ней лишь при наличии веских причин. Типичный пример - корневая файловая система. Такая ее ветвь, как /usr, также по хорошему должна бы быть неизменяемой, и, как мы увидим дальше, в BSD, в отличие от Linux, это легко реализовать.

Изменяемые файловые системы содержат не только пользовательские данные (постоянное модифицирование которых очевидно). Это и такие ветви, как /tmp и /var: ведь в эти каталоги запись осуществляют не столько сами пользователи, сколько запускаемые ими программы, наследующие в подавляющем большинстве случаев эффективные ID своих хозяев.

К изменяемым ветвям файлового древа можно отнести также каталоги /usr/local и, в ряде случаев, /usr/X11R6. Конечно, инсталляция дополнительного программного обеспечения (для которого и предназначен /usr/local) - обычно привилегия администратора (и это подчеркивается атрибутами доступа к этим каталогам). Однако у пользователя, ведущего активную софтверную жизнь (а таких среди истинных POSIX'ивистов - большинство) это происходит достаточно часто. Что же касается /usr/X11R6 - то теоретически, по стандарту FHS, он предназначен только для штатных компонентов оконной системы X - все X-приложения должны помещаться в каталоги /usr, /usr/local или /opt (в зависимости от используемой системы пакетного менеджмента). Однако последний в BSD-системах не используется вообще), а X-приложения, например, устанавливаемые из системы портов и коллекции пакетов FreeBSD (используемых также в DragonFly) распределяются между ветвями /usr/X11R6 и /usr/local весьма причудливым образом. В альтернативной же системе пакетного менеджмента - pkgcrs, заимствованной из NetBSD, - в число изменяемых попадают также каталоги /usr/pkgsrc (собственно дерево управления этой системой) и /usr/pkg, куда помещаются собранные бинарники, в том числе и Иксы - в подкаталог /usr/pkg/xorg (каталог /usr/X11R6 при этом не используется).

Я подробно остановился на альтернативе неизменяемости/изменяемости потому, что она важна для пользователя вообще и, как станет ясным в дальнейшем, для пользователя DragonFly в особенности. Что же касается неразделяемости/разделяемости (то есть доступа к каталогам только с локальной машины или также и с удаленных), то эта альтернатива имеет значение в основном для администратора сети, и пользователю десктопа мало интересна. Поэтому замечу только, что к неразделяемым ветвям файловой иерархии относится корень локального файлового древа, тогда как такие ветви, как /usr, /usr/X11R6, /usr/local и аналогичные - должны быть разделяемыми, для обеспечения запуска приложений с удаленных машин.

На мой взгляд, для настольного пользователя более важна третья альтернатива - каталогов восстановимых и невосстановимых. Контент первых в особо критических случаях легко (и относительно быстро) восстанавливается с дистрибутивного носителя. Полное же восстановление содержания вторых либо невозможно в принципе, как пользовательских данных (при любой практически выполнимой стратегии резервного копирования без потерь тут не обойтись, хотя минимизировать их можно), либо сопряжено с затратами времени, трафика и, в конечном счете, денег.

Специфика DragonFly (и других BSD и дистрибутивов Linux, использующих родственные системы управления пакетами - но в нашем случае она выражена ярче всего) такова, что в ней выделяется четыре градации ветвей файловой иерархии по степени восстановимости контента:

  1. легко восстановимые с дистрибутива - корневая файловая система и каталог /usr - только туда помещаются компоненты базовой системы (то, что во FreeBSD называется Distributions);
  2. восстановимые с затратами времени - каталоги для дополнительных программ, не входящих в базовый комплект - /usr/local, /usr/X11R6 или /usr/pkg (в зависимости от используемой системы пакетного менеджмента);
  3. восстановимые с затратами времени и трафика - /usr/src (исходники базовой системы), /usr/ports или /usr/pkgsrc (собственно древа систем управления пакетами), а также ветви последних - /usr/ports/distfiles или /usr/pkgsrc/distfiles (исходники программ для сборки их из портов); их специфика - в том, что они а) регулярно обновляются (например, через cvs), то есть в принципе невосстановимы с дистрибутива (а в дистрибутива DragonFly их просто нет) и б) содержат личные данные (файлы конфигурации ядра, собственноручно модифицированные Make-файлы и тому подобное);
  4. практически невосстановимые пользовательские данные (каталог /home со всеми его ответвлениями).

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

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

Первый принцип нашей схемы разметки - вычленение за пределы корневой файловой системы всего, чего можно. Точнее, всего ненужного для работы в однопользовательском режиме. Принцип этот интуитивно понятен и общепринят на практике. Ведь чем меньше корневой раздел - тем быстрее он будет восстановлен после сбоя, что позволит перейти к "ремонту" прочих файловых систем при необходимости (ну и к прочим восстановительным работам).

То есть каталог / - первый кандидат на обособление в отдельном разделе слайса. И остаться в нем должны только ядро (/kernel) и такие ветви, как /boot, /etc, /dev, /modules, /root, /bin, /sbin - то, без чего запуск и функционирование системы окажутся невозможными.

Маленькое отступление: Внимательный читатель (и к тому же пользователь Linux по натуре) наверняка задаст вопрос: пардон, а где же здесь общесистемные библиотеки? В частности, glibc, без которой ничего не работает. Ибо в Linux предназначенный для них каталог находится непосредственно в корне файловой системы (/lib), которого в списке кандидатов на исконность корней не видно. Забегая впред, отвечу: файлы главной системной библиотеки в BSD-системах (здесь она величается просто - libc) размещаются в каталоге /usr/lib, который мы в следующем абзаце отчленим от корня и поместим на отдельный раздел.

Но как же тогда будут работать бинарники из каталогов /bin и /sbin в однопользовательском режиме, когда никакие другие файловые системы, кроме корневой, не монтируются? - задаст следующий вопрос пользователь, просветленный Linux'ом. Очень просто: в DragonFly все системные утилиты из каталогов /bin и /sbin (а их содержимое - и есть системные утилиты, просто в первом лежат те, к которым иногда прибегает и простой пользователь, а утилиты из второго ему без надобности), слинкованы с libc статически, и в наличии ее не нуждаются.

Реплика в сторону: раньше (включая все версии 4-й ветки) так было и во FreeBSD, но в 5-й ветке бинарник из каталогов /bin и /sbin линкуются динамически, а статически слинкованные утилиты "на всякий пожарный случай" располагаются в каталоге /restore.

Так что от выноса на отдельный раздел неизменяемого (и легко восстановимого) каталога /usr - вреда ни малейшего. А заодно отделяем и изменяемые каталоги - /tmp и /var, ну и конечно же /home. То есть пока мы движемся в русле схемы разметки, предложенной по умолчанию. Но вот теперь пойдут разночтения. Потому что /usr в этом случае оказывается сборной солянкой неизменяемых и изменямых подкаталогов, к тому же - разной степени восстановимости. Так что с безжалостностью эсторского палача-расчленителя по прозвищу Голый Дьявол приступим к его разделу.

Для начала вычленяем из древа /usr его заведомо изменяемую часть - каталог /usr/obj: это то место, куда по умолчанию помещаются промежуточные продукты компиляции ядра и базовой системы, как будет показано в следующей статье, роль его весьма велика.

Теперь - умеренно восстановимые части, /usr/local и /usr/X11R6, а при использовании системы pkgsrc - также и /usr/pkg. Это обеспечит нам сохранность инсталляций дополнительных программ при переустановке базовой системы.

Правда, не до конца: для обеспечения контроля их зависимостей потребуется еще и сохранить базу данных установленных пакетов. Так что "умолчальный" ее каталог /var/db/pkg также логично было бы вынести на отдельный раздел. Хотя, если это делать не хочется (а так оно и есть - больно уж много чести для массива данных в десяток мегабайт, эту сохранность можно обеспечить иными способами (о них речь пойдет в статье про управление пакетами), не говоря уже о простом backup.

Теперь отрезаем изменяемые и трудновосстановимые части - /usr/ports и (или) /usr/pkgsrc. Лишним резоном к чему будет специфика из содержимого - очень большое число (многие десятки тысяч) очень маленьких (по несколько байт) файлов. И потому из состава этих ветвей целесообразно вытащить их менее специфичные и наиболее "затратные" (в том числе и финансово:-) компоненты - /usr/ports/disfiles (или, соответственно, /usr/pkgsrc/distfiles). На чем сердце расчленителя может успокоиться - вряд ли на индивидуальной машине имеет смысл дробить на подкаталоги /home или /var (хотя на большом сервере это, скорее всего, необходимость).

В итоге получаем максимальное целесообразное количество отдельных ветвей файловой системы - 14, что вполне укладывается в допустимый максимум слайса DragonFly (16 подразделов). Впрочем, очевидно, что все перечисленное и не понадобится: вряд ли есть смысл в использовании и системы портов, и pkgsrc. Так что реальное число ветвей сразу уменьшается на три. Ну и без отдельного раздела под /usr/X11R6 также можно обойтись в любом случае. При pkgsrc он вообще не нужен, а при использовании портов его можно оставить внутри /usr: если следить за тем, чтобы все X-приложения собирались в каталог /usr/local (как - будет рассказано в статье про управление пакетами), то /usr/X11R6 сразу станет фактически неизменяемым.

Далее, может иметь смысл помещение трудновосстановимых и невосстановимых разделов (/usr/src, /usr/ports, /usr/ports/distfiles, /home) на отдельный слайс: именно поэтому ранее я столь подробно останавливался на том, как средствами DragonFly сделать это вручную. Смысл такого действия - облегчить полную переустановку системы в случае необходимости. Правда, надеюсь, таковой не будет - в следующей статье будет говориться и о том, как избирательно восстановить с дистрибутива только нужные ветви файлового древа. Но - береженого Бог бережет...

Итак, с количеством и назначением разделов разобрались. Теперь остается только "разделить по Божьи" между ними наличное дисковое пространство. И действительно - "тут очень рассчет нужон". Причем при рассчетах следует помнить о специфике файловой системы UFS вообще: в ней быстродействие файловых операций (и так не рекордное сравнительно с Ext2fs или ReiserFS) резко падает, как только объем свободного места становится менее 10%. Так что, как говорится, запас горба не сломит (тем более на современных-то дисках).

Для начала - вычисляем корень. Тут можно спокойно согласиться с "умолчальным" предложением в 256 Мбайт. Да и того за глаза хватит - у меня, например, в данный момент в корне (того самого размера) задействовано даже менее 50 Мбайт; ну да ладно - не будем жмотничать на важнейшем каталоге.

С предлагаемым по умолчанию объемом раздела под каталог /var я, не мудрствуя лукаво, тоже согласился (правда, у меня он обычно используется едва на 15-15%). А вот от раздела под /tmp я давно отказался: при достаточном количестве памяти (начиная с 512 Мбайт - точно, а меньше - я и забыл, когда было) в этот каталог целесообразно смонтировать файловую систему в оперативной памяти (mfs - Memory Filesystem), и при финальных настройках системы (в заключительно разделе этой статьи) мы будем исходить из этого.

Остается отпрепарировать каталог /usr. Ясно, что при предложенной выше схеме разметки 8 "умолчальных" (и даже 4 допускаемых) гигабайта для него - излишне. Подсчет объема, занимаемого "родными" подкаталогами (от /usr/bin до /usr/share) в установленной системе даст около 180 Мбайт, "чистые" Иксы добавят еще сотню. То есть при использовании портов на весь /usr можно кинуть 512 Мбайт, а при pkgsrc - сократить этот объем вдвое.

Объем промежуточных продуктов компиляции базовой системы, включая ядро, помещаемых в каталог /usr/obj, составляет, в зависимости от настроек ее условий, 500-600 Мбайт. С учетом разрастания ее в будущем - отводим под это дело 1 Гбайт. Причем при тех же 512 Мбайт ОЗУ и в этот каталог можно смонтировать файловую систему mfs, что имеет как свои плюсы, так и минусы, которые подробно будут рассмотрены в следующей статье.

Труднее всего определиться с каталогом /usr/local (или его аналогом /usr/pkg для системы pkgsrc). Требуемое под него место определяется исключительно аппетитами пользователя на дополнительный софт. У меня под /usr/local отведено 2 Гбайт - и до их исчерпания (при установленных KDE и OpenOffice) еще далеко.

Теперь исходники базовой системы. Вместе с ядром в распакованном из тарбалла (доступного на некоторых ftp-зеркалах проекта) виде они занимают около 400 Мбайт. Снапшот текущего дерева, полученный через cvs, будет несколько больше. Так что под каталог /usr/src я не поскупился бы гигабайтом - с запасом на будущее.

Как ни странно, трудно определиться также с пространством под /usr/ports (или /usr/pkgsrc). Правда, объем дерева соответствующей системы вычисляется легко - в распакованном из тарбалла виде они займут около 150 Мбайт. Однако следует учесть, что по умолчанию здесь же окажутся и промежуточные продукты сборки - распакованные исходники, объектные модули и т.д., а для pkgsrc - еще и собранные бинарные пакеты. От всего этого потом можно избавиться - однако, дабы не получить в процесс сборки KDE или OpenOffice сообщения об исчерпании дискового пространства, лучше создать под эти каталоги разделы с о-очень большим запасом. Руководство к системе pkgsrc рекомендует 5 Гбайт, однако для /usr/ports, мне кажется, хватит и двух.

Относительно /usr/ports/distfiles (или /usr/pkgsrc/distfiles) можно сказать то же самое, что и о /usr/local (или /usr/pkg): выделяемое под них пространство определяется запросами пользователя. Руководство по pkgsrc определяет полный объем исходников для этой системы в 10 Гбайт. Какой процент из входящих в pkgsrc 5 тысяч приложений потребуется именно вам - предлагается рассчитать в качестве домашнего задания. Я лично под /usr/ports/distfiles ограничиваюсь 2 Гбайт.

И, наконец, с /home все ясно. Под него отводится места а) сколько нужно, б) сколько можно или в) сколько не жалко. У меня это всегда - все оставшееся дисковое пространство (собственно, так BSD Installer и предлагает по умолчанию.

В заключение - о swap-разделе, не несущем файловой системы. Рекомендуемый его объем равен удвоенному ОЗУ, и я всегда следую этому правилу. Конечно, при объеме памяти 512 Мбайт и больше можно вообще обойтись без подкачки (или ограничиться swap-файлом, на всякий случай). Однако мы ведь решили разместить на mfs (то есть в оперативной памяти) каталог /tmp, а возможно, и /usr/obj, под что физической памяти, при некоторых услвоиях, может и не хватить. И тут в дело вступит swap - ведь для системы он вместе с физическим ОЗУ предстает в виде единой виртуальной памяти.

Казалось бы, с точки зрения быстродействия, замена дискового раздела разделом подкачки - все равно что сменить шило на мыло. Однако на самом деле это не так, и механизм виртуальной памяти DragonFly обеспечит некоторый прирост производительности и в этом случае. А кроме того, перемещение этих ветвей файлового древа в mfs обеспечивает автоматическую очистку от временных файлов при рестарте системы. Что однозначно полезно для /tmp (хотя в некоторых случаях может быть лишним для /usr/obj - но это мы обсудим в следующей статье.

Свои представления об оптимальной схеме дисковой разметки для установки DragonFly я суммировал бы так (табл. 4).

Таблица 4. Схема дисковой разметки для DragonFly

## Раздел Mnt Размер Назначение
1 ad0s1a / 256 Мбайт Файлы и каталоги, необходимые для старта в однопользовательском режиме
2 ad0s1b swap 1024 Мбайт Раздел подкачки
2 mfs /tmp Нет Временные файлы
3 ad0s1d /var 256 Мбайт Изменяемые файлы кэшей спуллингов и т.д.
4 ad0s1e /usr 512 Мбайт Основная часть базовой системы
5 ad0s1f /usr/obj 1024 Мбайт Временные продукты компиляции базовой системы
6 ad0s1g /usr/local 2048 Мбайт Пользовательские программы из портов и пакетов
7 ad0s1h /usr/ports 2048 Мбайт Дерево системы портов
8 ad0s1n /usr/ports/disfiles 2048 Мбайт Исходники для сборки портов
9 ad0s1p /home Все, что осталось Пользовательские данные

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

Столь дробная схема разметки полезна еще и тем, что позволяет индивидуально определить размер блока и его фрагмента для каждой файловой системы - в зависимости от специфики размещаемых на ней данных. При разметке в нормальном режиме (см. рис. 5) оба эти параметра, влияющие на производительность файловых операций, эффективность использования дискового пространства и максимально возможное количество файлов, вычисляются автоматически - исходя из объема раздела. И в большинстве случаев с этим можно согласиться. Исключение - файловая система ветви /usr/ports (или /usr/pkgsrc), Как уже говорилось, обе они образованы невообразимым количеством малюсеньких файлов. И потому для них, не зависимо от объема раздела, размеры блока и фрагмента лучше сделать поменьше - например, 1024 b 512 байт соответственно.

И еще, как можно видеть из рис. 6, режим эксперта позволяет включить или выключить механизм Softupadets (по умолчанию включено для всех файловых систем, кроме корневой). Это такая интересная штука, которая волшебным образом способствует как росту быстродействия файловых операций, так и повышению надежности файловой системы. Однако она имеет альтенартиву - чисто асинхронное монтирование, при котором производительность растет еще больше, хотя и надежность резко уменьшается. Почему оно обычно и не рекомендуется к употреблению резонными людьми. Однако при вычленении из файловой иерархии частей, в надежности заведомо не нуждающихся (в нашем случае это будут /tmp и /usr/obj), к ним вполне может быть применимо - с предварительным отключением Softupadets в режиме эксперта).

О монтировании файловых систем речь пойдет в заключительной части статьи. А более полную информацию о затронутых здесь вопросах устройства файловой системы UFS вообще поищите в материалах списка ссылок.

назад | к началу | вперед