Академический Документы
Профессиональный Документы
Культура Документы
При использовании информации для подготовки лабораторных работ рекомендуется проверить версию
программного обеспечения, установленного в лаборатории – данные материалы разработаны на основе опыта
эксплуатации Solaris Express Developer Edition 9/07 и Solaris 10 11/06. Версии Solaris, более ранние, чем Solaris
10 11/06, могут не иметь части описанных особенностей.
Документ подготовил Филипп Торчинский, консультант по Solaris компании Sun Microsystems. В документе
использованы авторские материалы Филиппа Торчинского и Сергея Пикалева, а также презентации ряда
сотрудников Sun Microsystems на конференциях и документация Sun Microsystems.
Содержание
Программное обеспечение с открытым кодом. Обзор особенностей Solaris.................................3
Введение. Программное обеспечение с открытым кодом. ..........................................................3
Дистрибутивы, основанные на открытом коде Solaris..................................................................4
Отличия Solaris от других операционных систем.........................................................................5
Установка Solaris.....................................................................................................................................7
Совместим ли Solaris с вашим компьютром?.................................................................................7
Подготовка...........................................................................................................................................8
Установка шаг за шагом....................................................................................................................8
Первый запуск..................................................................................................................................11
Куда делись другие операционные системы?..............................................................................11
Доводка..............................................................................................................................................12
Дополнительные источники пакетов.............................................................................................13
Управление пользователями................................................................................................................14
Зачем распределять пользователей по группам?.........................................................................14
Концепция безопасности UNIX.....................................................................................................15
Объект...........................................................................................................................................15
Разделение всех пользователей по отношению к объекту....................................................15
Назначение прав доступа по-отдельности...............................................................................16
Каждый объект имеет владельца и группу..............................................................................16
Структура файлов /etc/passwd, /etc/shadow, /etc/group.................................................................16
Учетные записи пользователей.................................................................................................17
Пользовательские файлы конфигурации.................................................................................20
Группы пользователей................................................................................................................20
Программы управления учетными записями пользователей....................................................21
Solaris Management Console........................................................................................................22
useradd...........................................................................................................................................23
Управление дисками и файловыми системами. Общий обзор.......................................................25
Термин “файловая система”...........................................................................................................25
Две концепции файловой системы в UNIX..................................................................................26
1
Файлы устройств в Solaris...............................................................................................................27
файлы устройств для разделов дисков в Solaris...........................................................................28
Жесткие диски.............................................................................................................................28
каталог /devices............................................................................................................................31
Структура файловых систем, соответствующих POSIX............................................................32
Основные понятия: суперблок, метаданные, точка монтирования.....................................32
монтирование и демонтирование файловых систем...................................................................34
монтирование дискет и прочих сменных носителей..................................................................35
Суперблок.....................................................................................................................................36
Таблица индексных дескрипторов............................................................................................36
Дерево каталогов.........................................................................................................................36
Поддерживаемые типы файловых систем...............................................................................36
дерево каталогов..........................................................................................................................39
файлы и каталоги.............................................................................................................................40
типы файлов.................................................................................................................................40
имена файлов и каталогов..........................................................................................................41
действия с файлами и каталогами............................................................................................43
Каталоги........................................................................................................................................44
ссылки................................................................................................................................................45
права доступа....................................................................................................................................47
индексные дескрипторы..................................................................................................................49
списки ACL........................................................................................................................................49
Расширенные права доступа (ACL) к файлам.........................................................................50
Расширенные права доступа (ACL) к каталогам....................................................................51
Монтирование файлов в качестве устройств (lofi)......................................................................52
Устройство и администрирование файловой системы UFS...........................................................53
разбиение диска на разделы...........................................................................................................53
разметка нового диска.....................................................................................................................54
количество индексных дескрипторов в файловой системе...................................................56
элементы файловой системы..........................................................................................................56
таблица индексных дескрипторов: детали...................................................................................57
обычные индексные дескрипторы............................................................................................59
теневые индексные дескрипторы..............................................................................................59
оптимизация размеров разделов....................................................................................................60
как узнать, сколько места осталось на диске?.........................................................................61
Минимальное свободное пространство...................................................................................62
фрагментация....................................................................................................................................63
изменение размеров раздела...........................................................................................................64
проверка файловых систем.............................................................................................................64
Концепция, устройство и администрирование ZFS.........................................................................65
Концепция ZFS.................................................................................................................................65
Пулы накопителей вместо разрозненных дисков...................................................................65
Сквозной контроль целостности...............................................................................................66
Транзакционность.......................................................................................................................68
Легкость администрирования....................................................................................................68
ZFS в работе......................................................................................................................................68
элементы файловой системы.....................................................................................................68
виртуальные устройства (vdev), метки виртуальных устройств и загрузочный блок..69
Виртуальные устройства..................................................................................................69
Метки виртуальных устройств........................................................................................70
2
Содержание метки виртуального устройства................................................................71
указатели блоков и блоки косвенной адресации................................................................74
копирование при записи данных в ZFS (copy on write)..........................................................80
снимки и резервное копирование.............................................................................................80
RAID-Z..........................................................................................................................................81
Резервирование метаданных.....................................................................................................82
масштабируемость ZFS..............................................................................................................83
производительность ZFS............................................................................................................83
Практическое администрирование ZFS: команды..................................................................85
Квотирование и резервирование пространства......................................................................86
Дополнительные материалы для чтения о ZFS...........................................................................87
Управление процессами и проектами................................................................................................87
Также различают бесплатное ПО, которое называют также свободным (по принципу
распространения – свободно, без оплаты).
ПО с открытым кодом пользуется заслуженной популярностью во всем мире, так как оно:
● гарантирует независимость пользователя от производителей (исходный код остается у
пользователя, даже если производитель перестанет поддерживать свой продукт);
● дает возможность каждому пользователю лично убедиться в отсутствии постороннего
по отношению к заявленной функциональности или вредоносного кода;
● обладает большей гибкостью: пользователь может модифицировать исходный код для
адаптации ПО к своим нуждам, как самостоятельно, так и поручив эту работу
независимым разработчикам;
● дешевле обходится в эксплуатации: начальная стоимость равна нулю, стоимость
поддержки обычно ниже, чем стоимость поддержки закрытого ПО, широкое открытое
для общения сообщество пользователей позволяет тратить меньше денег на обучение
и решение проблем.
В мире распространены самые разные программные пакеты, и одна из проблем тех, кто ими
пользуется – совместимость форматов, в котором эти программные пакеты сохраняют
данные. Современное ПО как с открытым, так и с закрытым кодом обычно разрабатывается
так, чтобы быть совместимым по форматам данных как с другими открытыми программными
пакетами, так и с разработками компаний, продающих свои продукты с закрытым кодом.
3
Например, пакет офисных программ StarOffice 81, функционально практически идентичный
другим широко распространенным офисным пакетам, использует для хранения данных
открытый стандарт, но допускает сохранение и импорт данных в закрытых форматах других
офисных пакетов.
Solaris работает на платформах SPARC, x86 и x64 – с процессорами от Sun, AMD и Intel, на
компьютерах любого масштаба – лаптопах, десктопах, рабочих станциях, серверах и в
кластерах. Как и другие системы UNIX, Solaris в силу архитектурных особенностей
потенциально менее подвержен вирусам, чем широко распространенные системы других
архитектур. На практике подтвержденных случаев заражения Solaris 10 вирусами не
зарегистрировано вообще.
Код Solaris 10 сейчас доступен для всех на сайте opensolaris.org. После того, как код ОС
Solaris был открыт, и был анонсирован проект OpenSolaris, смысл которого – в
усовершенствовании базовой системы, появилось несколько дистрибутивов, основанных на
этом коде:
● Solaris Express Community Edition – самый свежий двоичный (без исходных кодов в
поставке) дистрибутив для тех, кто хочет испробовать самые новые технологии, еще
не включенные в другие дистрибутивы, и еще не опубликованные в сборнике кодов на
opensolaris.org. Обновляется раз в две недели. Этот дистрибутив еще называют Solaris
Nevada, build XX, указывая соответствующий номер выпуска. Работает на платформах
SPARC, x86/x64. На его основе создается другой дистрибутив, Solaris Express Developer
Edition;
● Solaris Express Developer Edition – тестируемый Sun Microsystems дистрибутив,
распространяется для x86, однако может быть собран из компонент для SPARC.
Выпускается раз в три месяца;
● BeleniX – дистрибутив, созданный с использованием исходного кода, открытого в
рамках проекта OpenSolaris. Сейчас распространяется в виде загружаемой с CD
системы (LiveCD), однако разработчики рассчитывают сделать из него полноценный
дистрибутив с установкой на диск;
● marTux – первый не связанный с выпусками Solaris Express и сообществом
разработчиков Solaris Express дистрибутив для SPARC;
1 StarOffice 8 – это ПО с закрытым кодом, использующее открытые стандарты. На данный момент продается
за деньги, однако для образовательных и исследовательских организаций бесплатен для всех
поддерживаемых ОС – Solaris, Linux и Windows. Кроме того, StarOffice 8 входит в дистрибутив Solaris
Express Developer Edition, и поэтому оказывается бесплатным для всех пользователей этой ОС. Пользователи
Windows могут его скачать и использовать бесплатно в составе Google Pack от Google.
2 В ОС Solaris версии нумеруются в виде MM/YY, т.е. месяц/год, 11/06 означает выпуск, вышедший в ноябре
2006 года – прим. авт.
4
● Nexenta – распространяемая по лицензии GNU система, разработанная на основе
открытого кода ядра Solaris. Nexenta объединяет ядро Solaris и разнообразные
открытые приложения;
● SchilliX, основанный на коде Solaris дистрибутив на Live CD для x86/x64/EM64T.
Все зоны разделяют между собой одно ядро, работающее в главной, “глобальной” зоне, и это
значительно снижает накладные расходы зон на планирование задач, делая это решение
самым эффективным среди всех вариантов виртуализации серверов (а еще есть как минимум
Xen, VMware и Qemu – с которыми Solaris 10 тоже полностью совместим).
5
Совершенно новая 128-разрядная транзакционная файловая система ZFS – по архитектуре и
применяемым техническим решениям. В ней нет традиционных томов, равно и проблем с
недостатком свободного места или нехваткой индексных дескрипторов. Благодаря
транзакционному механизму даже при неожиданном отключении питания занудной проверки
диска после старта не последует: все назаконченные транзакции тихо исчезнут. ZFS легко и
логично администрируется, имеет новый, совместимый с NFSv4 набор прав доступа (схожий
с применяемым в NTFS), в частности, наследование прав доступа от родительского каталога.
Другие впечатляющие новинки – сквозное контрольное суммирование не только данных, но и
метаданных, мгновенное создание “снимков” (образов всей файловой системы), незаменимое
для резервного копирования “на ходу” , программное зеркалирование, RAID с переменным
размером полос, возможность двойной избыточности программных RAID-массивов RAID-Z
(этого обычно нет и в аппаратной реализации избыточности), и долгожданный рост
максимального размера файлов и файлового хранилища: теперь максимальный размер файла
равен 264 байт.
В других системах UNIX для того, чтобы доверенный пользователь мог выполнить какую-то
административную задачу (скажем, добавить пользователя), ему либо сообщают пароль root,
либо он использует sudo. И то, и другое решение неидеально. Строгие правила безопасности
и печальный опыт поколений требуют, чтобы пароль привилегированного пользователя был
известен минимальному количеству людей (в идеале - одному человеку и еще записан на
бумаге у него в сейфе). А sudo всего лишь позволяет исполнять определенные программы, в
то время как по сути надо делегировать выполнение определенных обязанностей. Тонкая
настройка прав доступа в Solaris позволяет делегировать обычным пользователям строго
необходимые им права, напрмер “добавлять принтер”, “выбирать сеть wi-fi для
подключения”. Ничего лишнего: только то, что требуется. Добавляющий только принтеры не
сможет добавить пользователя, а выбирающий сеть для подключения не сможет установить
новый ключ для шифрования в протоколе WEP.
6
Для более опытных системных администраторов и разработчиков есть еще динамический
трассировщик DTrace, позволяющий отследить цепочку системных вызовов любой
программы или ядра, а также померять время, которое процессор потратил на выполнение
любой группы вызовов. Функциональность DTrace встроена в ядро и не требует
перекомпиляции программ для отслеживания их кода.
Установка Solaris
7
драйвера сторонних производителей, и особенно это касается драйверов с закрытым кодом.
Так что поиски можно продолжить.
Во-первых, имеет смысл посетить сайт производителя самого устройства. Последнее время
многие производители железа сопровождают свои устройства драйверами и для ОС Solaris.
Во-вторых, имеет смысл посетит страницу http://www.sun.com/bigadmin/hcl/indexRes.html, где
можно найти большое количество ссылок на сторонних производителей драйверов для
Solaris.
Ну и в-третьих, творческое использование поисковых систем иногда творит чудеса.
Подготовка
Итак, вы решились поставить Solaris на ваш компьютер.
Первое, что нужно сделать – отвободить место на диске. Минимальная инсталляция (без X-
Window) занимает чуть больше двух гигабайт. Полная – около шести. С учетом swap 8-10
гигабайт будет вполне достаточно.
Некоторые тонкости, о которых хочется предупредить сразу. Во-первых, не стоит помечать
раздел как Solaris с помощью gparted или fdisk из Linux. Они «думают», что ставят
правильный идентификатор, но на самом деле это не так. Самое простое – это сделать на
диске просто пустое неразмеченное место. Инсталлятор Solaris найдет его и обработает
корректно. Впрочем, если у Вас уже стоял Solaris 10 (или Вы уже пометили раздел как Solaris
при помощи fdisk из инсталлятора Solaris), то в этом случае идентификатор раздела
правильный, и убирать его не надо. Инсталлятор найдет этот раздел и предложит поставиться
в него.
Во-вторых, Solaris не может поставиться в расширенные разделы, ему нужно именно пустое
место на диске.
В-третьих, если у вас уже установлен Linux, и вы планируете его сохранить, то обязательно
скопируйте куда-нибудь содержимое файла /boot/grub/menu.lst, оно потом
пригодится.
А в-четвертых, если у вас есть Linux swap в первичном разделе, удалите его. Потому что по
каким-то причинам идентификатор раздела Solaris совпадает с идентификатором Linux swap.
Восстановить работоспособность Linux можно будет позже. Но не забудьте при выделении
маста для Solaris оставить место и для восстановления Linux swap.
8
графическом окне и полностью текстовый. Функционально все они эквивалентны. Также в
меню наличествует пункт Custom JumpStart. Это сильно кастомизируемая установка, и в
данной случае мы ее рассматривать не будем.
Для запуска графического инсталлятора вам потребуется наличие 400Mb оперативной
памяти. Если у вас меньше – используйте текстовые режимы. Впрочем, инсталлятор сам
определит, что он не может запустить графику и перейдет в текстовый режим. Если вы
решили использовать графический инсталлятор, то в данный момент не стоит отвлекаться от
монитора: перейдя в графический режим, система спросит, все ли хорошо видно, и если в
течение определенного времени ей не сообщить, что все в порядке, она автоматически
перейдет в текстовый режим.
Далее страница за страницей и этап за этапом система будет задавать вопросы.
В текстовом режиме переход от страницы к странице (и от этапа к этапу) по причинам чисто
исторического характера осуществляется функциональными клавишами. Например, вперед –
клавишей F2, назад – F3. Однако если по каким-то причинам функциональная клавиатура не
работает, вместо нее можно использовать комбинацию Esc + соответствующая цифровая
клавиша. Например, F2 заменяется на последовательность Esc 2.
После каждого блока вопросов показывается сводная таблица, которую можно либо
подтвердить, либо перейти назад и исправить то, что ранее было указано неправильно.
Первый же вопрос – выбор раскладки клавиатуры. Он касается только процесса инсталляции,
поэтому можно ограничиться us_EN. Раскладки, которые будут использоваться после
установки, конфигурируются позже.
Выбор языка. Это язык, на котором с вами будет разговаривать инсталлятор. Русского, к
сожалению, еще нет (впрочем, если вам достался дистрибутив OpenSolaris, выпущенный в
2008 году, build 79a и более свежие, то русский язык уже есть; возможно, вам будет
интересно посмотреть, понятно ли переведены сообщения установщика).
Следующий вопрос – будет ли компьютер работать с сетью. В принципе, можно ответить
«нет» и пропустить весь блок вопросов про сеть. После сетевой интерфейс можно будет
настроить вручную. Однако я рекомендую сказать «да», чтобы инсталлятор настроил сетевую
карту сам.
Далее следует вопрос про использование протокола DHCP для получения сетевых установок.
В случае стационарного компьютера ответ зависит от того, как у вас настроено сетевое
окружение. Для компьютера я рекомендую сказать «да» даже если он не подключен к сети
вообще, просто чтобы пропустить дальнейшие вопросы про сеть. Все равно реальные
конфигурации сетевых сервисов будут производиться позже.
Если же вы ответили «да», то вас ждет блок вопросов про настройку сети. В частности – имя
машины, IP-адрес, маску, маршрутизатор. После этого конфигурация сети закончена.
Просмотрим сводную табличку. Все в порядке? Пошли дальше.
Kerberos. Ну, это как хотите. Если нужен, включите.
Сервисы имен. Опять же по историческим причинам инсталлятор предлагает выбрать только
один сервис из набора nis (yp), nis+, dns и ldap или отказаться от этого сервиса вообще.
Однако это не значит, что Solaris может пользоваться только одним. Для стационарного
компьютера – выбираете один из доступных в вашей сети, а остальные можно будет
настроить позже, и в файле /etc/nsswitch.conf задать порядок их использования. Для
компьютера отказываемся от этого вообще. Эти сервисы мы будет настраивать позже и
другими инструментами.
9
NFS4. Оставляем как есть. Опять же, если это стационарный компьютер у вас в локальной
сети есть NFS4, то можете и настроить.
Дальше можно выбрать временную зону, причем как по отклонению от GMT так и выбором
географического региона, и установить время.
После этого надо ввести пароль для пользователя root. Естественно, два раза. Этап под
названием «идентификация системы» завершен. Далее следует собственно процесс
установки.
Установка может осуществляться двумя способами – Standard и Flash. Standard – с диска,
Flash – с флэш-архива. Поскольку этого архива у нас под рукой нет, а диск есть, выбираем
Standard.
Далее подряд идут два вопроса о поведении системы после установки: открыть ли привод с
диском автоматически и перегрузить ли системы автоматически. Отвечать на них надо так:
открыть привод автоматически, перегрузить вручную. Причины для этого следующие. Во-
первых, загрузчик на диске не имеет в меню пункта «загрузиться с жесткого диска» (как это
есть в большинстве дистрибутивов Linux), а при этом на многих компьютерах по каким-то
причинам не удается автоматически открыть DVD-привод. В результате если система
перезагрузится автоматически, то она опять загрузится с DVD и опять попадет в инсталлятор,
а это совсем не то, что нам надо. Поэтому лучше всего мы лично убедимся, что установка
завершена, и лично же нажмем кнопку «перезагрузить».
Теперь на экране появится лицензия. Желательно согласиться с ней, иначе на этом
инсталляция и кончится.
Выбор поддержки географического региона. А вот тут уже имеет смысл выбрать то, что надо,
Россию, например, потому что это список тех локализаций, которые будут устанавливаться.
Пусть не пугает надпись про ISO8859-5, реальная кодировка выбирается в другом месте. А
поставлены будут четыре: ANSI 1251, ISO8859-5, KOI8-R и UTF-8. Mac-кодировки в Solaris
нет.
На следующей странице выбор умолчательной локализации – в которой система будет
грузиться. В принципе, все это может быть настроено и позже. Так что выбирайте то, что
нравится.
Дополнительные продукты пропускаем.
Выбор уровня наполнения. Это предопределенные наборы пакетов. Уровней пять. Про
полный все понятно. Уровень для разработчика – без некоторых серверов. Уровень для
конечного пользователя не содержит include-файлов и библиотек для разработки. Следующий
уровень не содержит графической среды. Минимальная установка – вообще чистый клиент
без серверов.
Далее переходим к разметке диска. Сначала – выбор физического.
Первым делом система предлагает либо использовать весь диск (тогда она просто снесет все
разделы и создаст свои). Предложение делается по умолчанию, но пугаться его не стоит,
нужно выбрать второй пункт – поработать с разделами самому.
Далее, как уже говорилось, если есть пустое место, то на нем можно создать раздел Solaris.
Размер можно указать как в Mb так и в цилиндрах. Не обязательно занимать все свободное
место. А вот внутри расширенных разделов Solaris жить пока не умеет. Однако может удалить
любой раздел, в том числе и расширенный.
Возвращаемся в выбор диска. Диск с разделом Solaris уже помечен.
10
Далее - Layout. Это разбиение раздела Solaris на логические разделы – слайсы (слои). Его
можно сделать как автоматически, так и вручную, и тогда все поля придется заполнять
самому. Я рекомендую выбрать автоматическую раскладку, то уже внутри нее можно выбрать
пункт «customize» (настроить) и поправить так, как вам хочется.
Несколько слов о том, как подправлять. Итак, слайс номер 2 – overlap – просто оставить так
как есть. Это служебный, и его размер совпадает с размером всего Solaris-раздела. Корень –
слайс номер 0. Автораскладка определяет его размер пропорционально всему разделу и
исходя из минимальных требований системы соответственно выбранному набору
программного обеспечения. Но при этом следует помнить, что все пакеты ставятся в /opt,
так что если у Вас большие планы на установку дополнительных пакетов, имеет смысл этот
факт учесть. Swap всегда предлагается один и тот же, чуть больше полугигабайта,
теоретически может отсутствовать вообще. Идеальным являетя размер совпадающий с ОЗУ.
Впрочем, если у вас другие взгляды на необходимый размер swap или специальные
требования к системе – исходите из них. Слайс номер 7 – /export/home. Мой личный
совет – монтировать его не на /export/home, а просто на /export. Так удобнее. Также
можно сделать на отдельных слайсах /var (полезно для серверов с большим количеством
логов), /opt (чтобы ставить все пакеты в специально отведенное место, не пересекающееся
с корнем и домашними каталогами). Также какое-то пространство можно выделить, но не
приписывать к какой-то конкретной точке монтирования, потом этот слайс можно будет
использовать под ZFS, например.
Опять же, стоит отметить, что для компьютера все это может быть не сильно важным, и
достаточно иметь только swap и корень.
Далее инсталлятор спросит про монтирование удаленных сетевых дисков с дополнительным
программным обеспечением (уже установленным, естественно). Он пропишет это в
/etc/vfstab и будет автоматически монтировать при загрузке системы. Нужно для
стационарных станций, которые берут /usr/local или инфраструктуру GRID из одного
места. Для компьютера просто пропускаем.
Последний раз взгляд на сводную таблицу. Все в порядке? Жмем «begin installation» и идем
пить кофе. Для установки с DVD это около 40-50 минут.
Первый запуск
При первом запуске Solaris сначала настроит smf-сервисы (Service Management Facility),
отобразив на экране прогресс этой настройки. Потом запустит графическое приглашение.
Теперь можно начинать работать.
Естественно, первый раз зайти можно будет только под пользоветелем root, ведь других
пользователей еще не создано. Что и рекомендуется проделать при первом запуске – зайти и
создать.
11
chainloader +1
где n – номер раздела, на котором стоит BSD.
В случае Linux надо добавить в файл /boot/grub/menu.lst строки, заботливо
скопированные из такого же файла на Linux перед началом инсталляции. Однако если вы
захотите восстановить загрузчик от Linux, сделав его первичным, то стоит помнить, что
GRUB, поставляемый с Linux, не знает ничего о файловой системе Solaris, и директиву
kernel выполнить не сможет. Чтобы загрузить Solaris из под Linux, надо использовать
директиву chainloader.
Теперь рассмотрим случай, при котором перед установкой удалялся Linux swap. Для его
восстановления надо загрузиться в GRUB, выбрать командой root диск, на котором стоит
Linux, и загрузиться с него вручную (последовательность kernel, initrd, boot). После
этого запустить fdisk или gparted и восстановить Linux swap на заранее оставленном для этого
месте. И, наконец, в файле /etc/fstab написать новые номера разделов (после операций
удаления и создания заново нумерация может измениться). Работоспособность Linux
восстановлена.
Теперь вы видите все операционные системы, установленные на вашем компьютере.
Доводка
Управление сетевыми подключениями.
В исходной установке Solaris управление сетевыми подключениями довольно статично. Оно
и понятно, ведь изначально Solaris проектировался как ОС для стационарных рабочих
станций. И даже динамическое получение IP-адреса по протоколу DHCP (с помощью
команды ifconfig <интерфейс> dhcp) действительно динамически работает только с
IP-адресом. А вот динамически же настроить NIS, DNS или другие службы имен оно уже не в
состоянии, поскольку это низкоуровневая команда, предназначенная для управления именно
сетевыми интерфейсами, но никак не сервисами, которые с этими интерфейсами могут быть
связаны.
Однако для Solaris есть инструмент, который помогает решить и эту задачу. Называется он
inetmenu, и расположен он тут:
http://www.opensolaris.org/os/community/laptop/inetmenu/
После его установки нужно удалить из системы некоторые файлы, например,
/etc/hostname.<интерфейс>, /etc/resolv.conf, поскольку они будут
генерироваться корректно при соответствующем сетевом подключении). Сам инструмент
позволяет создавать профайлы и переключаться между ними на лету.
В данный момент inetmenu поддерживает статическое задание IP-адреса, маршрутизации и
сервисов имен, динамическое получение по DHCP и настройку IP-адреса, маршрутизации и
сервисов имен, работу с беспроводной сетью.
Индикатор заряда аккумулятора.
Еще один момент, на который Вы наверняка обратите внимание – отсутствие индикатора
батарейки. Попытка найти его в списке апплетов для gnome будет безуспешной – его там нет.
Но это не значит, что его нет вообще.
Для установки данного апплета (а также некторых других полезных компонент) нужно
воспользоваться специальным инструментом, который называется frkit. Данный
инструмент разработан сообществом Laptop на opensolaris.org и предназначен для загрузки и
12
управления модулями, специфичными именно для компьютеров.
В данный момент в наборе всего 4 модуля:
• acpidrv
• gnome battery applet
• powerdown
• gnome emi-freq applet
Страница, посвященная данному инструменту, расположена здесь:
http://www.opensolaris.org/os/community/laptop/frkit/
После загрузки скрипта и его запуска вышеуказанные модули будут добавлены в систему, и
после этого можно добавить индикатор заряда батареи на панель. Также с их помощью
можно настроить функции засыпания. Замечу только, что в настоящий момент эти функции
работают только для платформы AMD, поддержка платформы Intel планируется.
Драйверы устройств.
По разным причинам (в основном лицензионного характера) в мире существует гораздо
больше драйвером устройств для Solaris, чем содержится в дистрибутиве.
В первую очередь я опять сошлюсь на страницу со ссылками на драйвера сторонних
производителей: http://www.sun.com/bigadmin/hcl/indexRes.html. Для большинства наиболее
популярных моделей компьютеров этой страницы хватает для того, чтобы найти драйвера для
всех устройств. Исключение все еще составляют встроенные устройства для чтения flash-
карт.
Если по какой-то причине Solaris не нашел драйвера для беспроводной карты, рекомендую
посетить страницу http://www.opensolaris.org/os/community/laptop/wireless/. Возможно, Вам
удастся доработать напильником то, что не осилил базовый инсталлятор.
В самом крайнем случае могу посоветовать воспользоваться ndiswrapper. Он позволяет
использовать Windows-драйвера под ОС Solaris.
Рекомендую обратить внимание на такой сайт как http://www.opensound.com/download.cgi. Там
есть OSS драйвера и для Solaris 8/9, и для Solaris 10/OpenSolaris, причем как для Sparc-
платформы, так и для x86. Стоит отметить, что пакет поддерживает большое количество
аудио-карт, многие из которых все еще не поддержаны в Solaris. Недостаток этого пакета – он
не просто закрытый, он еще и платный. Однако тестовый период составляет полгода. А
несомненным достоинством является то, что это настоящий Open Sound.
13
творит чудеса.
Управление пользователями
Представьте: после четвертой чашки кофе ваш взгляд упирается в файл /etc/passwd и в
мозгу начинает неотвязно биться мысль: нет ли в системе лишних пользователей? Может
быть, завалялись какие-нибудь устаревшие учетные записи и их можно вычистить? Открыв /
etc/passwd вы видите несколько сотен пользователей, полтора года назад отнесенных к
группе pop3. Ага, догадываетесь вы, эти забирают почту с нашего сервера. А вот эти, из
группы oldlamer, что тут делают?
После того, как пользователям назначена главная группа, каждый из них может быть
добавлен в другие группы. Все группы, кроме главной, в которых участвует пользователь,
называются дополнительными для этого пользователя. Для добавления пользователя в
дополнительные группы следует использовать программы управления учетными записями.
Эти программы изменят файл /etc/group, так как именно этот файл хранит информацию о
дополнительных группах пользователей. С другой стороны, вы можете вручную исправить
запись о группе в /etc/group, указав в ее последнем поле через запятую тех
пользователей, которых собираетесь добавить в эту группу, вот так:
sys::3:root,bin,adm,skomorox
14
Концепция безопасности UNIX
Вся система безопасности UNIX изначально строилась на трех китах: разделение всех
пользователей по отношению к объекту на владельца объекта, группу объекта и всех
остальных, назначение им прав доступа по-отдельности и обязательное наличие у каждого
объекта владельца и группы.
В современных системах UNIX для большей гибкости прав доступа введены дополнительные
свойства объектов, такие как флаги для файлов и каталогов, списки управления доступом
(ACL) для файлов и каталогов, аутентификация и авторизация с использованием различных
служб аутентификации подобных TACACS и RADIUS, а также модули аутентификации и
авторизации (pluggable authentication modules - PAM).
Тем не менее, для начала познакомимся с классической концепцией безопасности, так как все
остальные дополнения представляют собой лишь надстройку над ней.
Объект
Объектом в контексте разговора о безопасности мы называем файл, каталог или процесс.
Файл и каталог записаны на некий носитель, их свойства хранятся на том же носителе.
Процесс запущен в памяти системы, его свойства возникают при запуске процесса,
существуют вместе с ним, пока он работает, и исчезают, как только процесс завершается.
Вообще говоря, одну и ту же программу можно запустить с совершенно разными свойствами.
Однако, в ряде случаев запускаемый процесс будет принадлежать не тому, кто запустил
процесс-родитель, а иному пользователю. Например, при входе пользователя в систему имя и
15
пароль он сообщает программе login. Она работает от имени root (т.е. ее владельцем является
пользователь root). Но программа login запускает для пользователя командный интерпретатор
так, чтобы владельцем процесса командного интерпретатора был сам входящий в систему
пользователь.
16
Учетные записи пользователей
cat /etc/passwd
root:x:0:1:Super-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
lp:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
smmsp:x:25:25:SendMail Message Submission Program:/:
listen:x:37:4:Network Admin:/usr/net/nls:
nobody:x:60001:60001:Nobody:/:
noaccess:x:60002:60002:No Access User:/:
nobody4:x:65534:65534:SunOS 4.x Nobody:/:
col:x:100:1::/home/col:/bin/sh
temp:x:101:1::/home/temp:/bin/sh
qaz:x:102:1::/home/qaz:/bin/sh
Termos:x:103:1::/home/Termos:/usr/bin/bash
Файл состоит из записей, каждая из которых описывает одного пользователя и занимает одну
строку. Поля записей разделяются двоеточиями.
Первое поле – имя пользователя в системе. Это имя пользователь вводит для входа в систему.
Имя в Solaris должно иметь длину от 2 до 8 символов и содержать только латинские буквы и
цифры. Имя пользователя в Solaris может содержать прописные латинские буквы, однако, из
соображений совместимости с другими системами UNIX, рекомендуется использовать только
строчные (маленькие) буквы.
Второе поле – признак наличия пароля. Пустое поле означает отсутствие пароля. Для
фактического отсутствия пароля у пользователя необходимо, кроме того, чтобы второе поле в
файле /etc/shadow в описании этого пользователя имело значение NP.
Пятое поле (иногда его называют GECOS) – описание пользователя. Обычно оно содержит
полное имя пользователя (имя и фамилию) и координаты для связи с ним – номер офиса,
адрес, телефон или пейджер.
Седьмое поле – командный процессор, который будет запущен для пользователя при
интерактивном входе в систему. Некоторые сетевые службы (например, ftpd) требуют, чтобы
у каждого пользователя, пытающегося получить доступ к сетевой службе, был
существующий в системе на самом деле командный процессор. Файл /etc/shells описывает
17
доступные в системе командные процессоры, которые следует назначать пользователям.
Сразу после установки системы файл /etc/shells не существует. Системный администратор
должен создать его вручную, если он требуется для каких-то программ в системе, например,
для ftpd.
Каждый элемент этого поля (например, полное имя, номер комнаты в офисе, контактный
телефон) принято отделять от других запятой, но это необязательное требование. В
настоящее время, к сожалению, не существует строго определенного правила заполнения
поля комментария. Хорошим стилем является указание в этом поле следующей информации:
полные фамилия, имя и (если это необходимо для однозначной идентификации) отчество
пользователя или, если это учетная запись предопределенного псевдопользователя типа bin,
полное название приложения, использующего эту запись)
номер комнаты и ее местоположение, или контактное лицо, ответственное за запуск
приложения, использующего запись
рабочий телефон
другая контактная информация (пейджер, факс, мобильный телефон и т.п.)
Не всегда требуется указывать всю эту информацию. На деле достаточно указать ровно
столько сведений, сколько достаточно системному админитсратору для однозначной
идентификации владельца учетной записи. Пожалуйста, только имейте в виду – не одному-
единственному конкретному системному администратору, а любому администратору,
которому придется управлять созданной вами системой. Вдруг нынешний системный
администратор уволится или уедет в отпуск? Сможет ли его преемник или заместитель
быстро разобраться в записях в /etc/passwd? Делайте записи в поле комментария полезными
сведениями, а не отписками.
Последнее, что следует сказать о поле GECOS: почему оно так называется.
18
cat /etc/shadow
root::6445::::::
daemon:NP:6445::::::
bin:NP:6445::::::
sys:NP:6445::::::
adm:NP:6445::::::
lp:NP:6445::::::
uucp:NP:6445::::::
nuucp:NP:6445::::::
smmsp:NP:6445::::::
listen:*LK*:::::::
nobody:NP:6445::::::
noaccess:NP:6445::::::
nobody4:NP:6445::::::
col:9NvfZSaIQgcQk:12435::::::
temp:*LK*:::::::
qaz:v.srD227fHRx2:12448::::::
Termos:o3HzHXFopdwbU:::::::
Данный формат /etc/shadow характерен как для Solaris, так и для других подобных System V
систем UNIX, например, для Linux.
В /etc/shadow обязательно присутствуют только первые три поля в каждой записи, остальные
могут отсутствовать – все или часть из них. Рекомендуется не вносить исправления в
/etc/shadow вручную, а делать это с помощью программ smc, usermod, useradd, passwd.
Однако, в одном случае – если вы забыли пароль root – придется исправлять /etc/shadow в
текстовом редакторе.
19
Пользовательские файлы конфигурации
ls -a
Группы пользователей
Группы, определенные в системе, перечислены в файле /etc/group. В системе могут быть
определены и другие группы, если для аутентификации и авторизации помимо файлов
/etc/passwd и /etc/group используются и другие источники (например, каталог LDAP).
cat /etc/group
root::0:root
other::1:
bin::2:root,bin,daemon
sys::3:root,bin,sys,adm
adm::4:root,adm,daemon
uucp::5:root,uucp
mail::6:root
tty::7:root,adm
lp::8:root,lp,adm
nuucp::9:root,nuucp
staff::10:
daemon::12:root,daemon
sysadmin::14:
20
smmsp::25:smmsp
nobody::60001:
noaccess::60002:
nogroup::65534:
Второе поле – зашифрованный пароль; это устаревшее поле, в настоящее время нет команды,
которая бы позволила установить пароль на группу и обычно нет необходимости это делать.
Если все же такая необходимость появится, то можно установить требуемый пароль какому-
нибудь пользователю с помощью программы passwd, а затем копировать поле пароля из
/etc/shadow в /etc/group. Пароль группы используется в Solaris только программой newgrp. Эта
программа требуется для изменения эффективного группового идентификатора пользователя
в ходе его интерактивной работы. Если группа, которой соответствует новый групповой
идентификатор, имеет пароль, то программа newgrp его запросит.
Третье поле – идентификатор группы (GID). Этот идентификатор должен быть уникальным в
пределах системы, а в случае использования общих файлов групп и паролей – в пределах
всей сети организации. Номера от 0 до 99 и от 60001 до 60002 зарезервированы для
системных групп. Создавайте свои группы с идентификаторами от 100 до 60000
включительно.
Четвертое поле – список пользователей через запятую; для этих пользователей данная
группа будет являться дополнительной. В Solaris принято по умолчанию, что один
пользователь может принадлежать не более чем к 15 дополнительным группам.
21
Solaris Management Console
В системах Solaris 9 (до мая 2002 года) для управления учетными записями пользователей
было возможно использовать программу admintool (рис. 1). В системах Solaris 8 и более
ранних программа admintool также использовалась для управления пакетами ПО. Сейчас
программа admintool считается устаревшей и в состав системы не входит. Вместо нее следует
использовать Solaris Management Console (SMC).
Здесь достаточно посмотреть, как именно можно управлять пользователем в smc (рис. 2).
Любая программа типа smc для работы со свойствами учетной записи пользователя в
графическом режиме, все равно вызывает простые системные программы с интерфейсом
командной строки для выполнения любых операций с этими свойствами. В Solaris для
создания новой учетной записи пользователя (добавления пользователя в систему)
используется программа useradd, для модификации учетной записи пользователя - usermod,
для удаления учетной записи - userdel.
22
Рис. 3: Управление учетными записями с
помощью Solaris Management Console (smc)
useradd
Для добавления нового пользователя из командной строки без использования smc следует
выполнить команду useradd.
Имя пользователя или роли не может быть длиннее 8 символов, и должно содержать только
латинские символы, цифры, точку, знак подчеркивания и дефис. Точка является допустимым
символом не для всех систем UNIX, поэтому ее не рекомендуется использовать в Solaris в
23
целях совместимости, хотя это требование не является жестким. Первый символ имени
должен быть буквой, по крайней мере одна буква в имени должна быть буквой нижнего
регистра.
-b base_dir
каталог, в котором должен быть создан домашний каталог пользователя; не требуется
указывать, если используется ключ –d
-c comment
поле GECOS общей информации о пользователе, как минимум, следует указать полное
имя пользователя
-d dir
домашний каталог пользователя; по умолчанию создается в каталоге /home и носит то
же имя, что и пользователь (для пользователя lena создается домашний каталог
/home/lena)
-D
показать значения по умолчанию для группы, системного каталога для домашних
каталогов, каталога базовых пользовательских файлов конфигурации, командного
процессора и ряда других свойств.
-e expire
дата истечения срока действия учетной записи; формат даты определен, как
рассказано в man 3C getdate; по умолчанию не задано, после наступления этой даты
пользователь не сможет войти в систему; используется для создания учетных записей
временных сотрудников или гостей
-f inactive
максимальное число дней, в течение которых пользователь может не входить в
систему, по истечении этого срока учетная запись блокируется; удачное решение для
забывчивых системных администраторов, которые не удаляют учетные записи при
увольнении сотрудника, позволяет бороться с накоплением «мертвых душ в системе»
-g group
главная группа пользователя, по умолчанию – other; подробности настройки групп по
умолчанию см. в man useradd
24
-k skel_dir каталог с базовыми пользовательскими файлами конфигураций, указанный
каталог должен существовать, копии всех содержащихся в нем файлов будут помещены в
домашний каталог нового пользователя. По умолчанию - /etc/skel.
-m требует создать домашний каталог нового пользователя; если каталог уже есть, у главной
группы пользователя должно быть право на чтение, запись и поиск в этом каталоге.
-s shell полное имя файла, который будет назначен пользователю в качестве командного
процессора при входе в систему; файл должен существовать
-u uid
явное указание значения UID.
25
файловой системы».
(2) Во-вторых, файловая система – это совокупность всех файлов, хранимых в компьютере.
(3) В-третьих, и это значение термина характерно именно для UNIX-систем, файловая
система – это совокупность всех файлов на разделе диска или устройстве, или, что точнее,
файловая система – это логическая единица монтирования (то, что можно смонтировать
командой mount в отдельный каталог дерева каталогов).
В этой книге мы будем говорить о файловых системах во всех трех смыслах, и там, где из
контекста неясно, что именно имеется в виду, будем отдельно оговаривать, в каком смысле
употребляем это выражение.
26
вируальную память, в которой работают процессы в UNIX.
В самом деле, когда вы запускаете новое приложение, и оно запрашивает у системы некий
объем памяти для работы, система обходится без указания ей, в каких именно микросхемах
памяти разместить данные и код нового приложения! Так и новая концепция пулов устройств
требовала лишь указания, какие физические устройства (или, если администратор пожелает,
их части) будут входить в пул. После этого вы можете пожелать выделить какой угодно объем
памяти для ваших файлов или файловых систем, и он будет вам предоставлен – если только
хватит места в пуле (понятно, что если у вас есть диск объемом 250 Гб и вы просите
выделить место для записи 500-гигабайтного файла, то места может и не хватить!)
Вторая концепция была впервые воплощена в файловой системе ZFS, разработанной
компанией Sun Microsystems в 2004 году, поддержка которой появилась в Solaris 10. К началу
2008 года код поддержки ZFS был портирован во FreeBSD и Mac OS X Leopard.
Ниже в этой лекции будут рассмотрено строение файловой системы UFS, воплощающее
первую, более старую концепцию файловой системы и типовые задачи, связанные с
администрированием UFS. В следующих двух лекциях будет дано более подробное описание
файловых систем UFS и ZFS соответственно.
ls -l /devices/pseudo/
...
crw-rw-rw- 1 root sys 26, 0 Мар 17 10:56 ptsl@0:ttyp0
crw-rw-rw- 1 root sys 26, 1 Мар 17 10:56 ptsl@0:ttyp1
crw-rw-rw- 1 root sys 26, 2 Мар 17 10:56 ptsl@0:ttyp2
crw-rw-rw- 1 root sys 26, 3 Мар 17 10:56 ptsl@0:ttyp3
...
ls -l /devices/pci@0,0/pci-ide@7,1/ide@0
...
brw-r----- 1 root sys 102, 0 Мар 17 10:56 cmdk@0,0:a
27
crw-r----- 1 root sys 102, 0 Мар 17 10:56 cmdk@0,0:a,raw
brw-r----- 1 root sys 102, 1 Мар 24 21:19 cmdk@0,0:b
crw-r----- 1 root sys 102, 1 Мар 17 10:56 cmdk@0,0:b,raw
...
Файл устройства является псевдофайлом, он не размещен на диске, о нем есть только запись,
которая используется при доступе к устройству. Первое число, которое стоит в поле длины
файла в выводе программы ls для файлов устройств - это major номер, а второе, после запятой
- minor номер. Первый из них означает номер типа устройств и одновременно - позицию в
ядре, в которой следует искать драйвер устройства. Второй - номер экземпляра устройства
данного типа. Поэтому файлы однотипных устройств в вышеприведенном выводе ls имеют
одинаковые major номера.
Устройство каждого типа имеет свой major номер. Major номера назначаются автоматически
программой add_drv. Соответствие имени драйвера и major номера определяется в файле
/etc/name_to_major.
В Solaris все устройства имеют три имени разных типов: логическое имя, физическое имя и
экземплярное имя.
Жесткий диск принято делить на разделы (в Solaris их называют slices). Раздел – это группа
расположенных рядом цилиндров. Смысл разделения диска на разделы состоит в том, чтобы
(1) минимизировать расстояние, которое потребуется головке диска для считывания
фрагментов одного файла,
(2) разделить данные разных типов, чтобы обезопасить системные данные от возможной
порчи пользовательскими программами,
(3) зарезервировать под системные нужды достаточное пространтство на диске так, чтобы
несистемные файлы не могли его занять.
Жесткие диски
В Solaris на одном физическом жестком диске может быть до восьми разделов, которые
принято нумеровать цифрами от 0 до 7.
28
Каждому разделу соответствует свой файл устройства в каталоге /dev/dsk. Пространство под
разделы выделяется цилиндрами. Раздел однозначно определяется номерами начального и
Так, для системы с дисками SCSI /dev/dsk/c0t0d0s0 будет указывать на нулевой контроллер
SCSI (c0), диск со SCSI ID 0 (t0), диск номер 0 на этом SCSI контроллере (d0), нулевой раздел
на этом диске (s0).
Как показано на Рис. 4, при создании файла устройства для раздела, который находится на
IDE-диске, в названии файла учитываются номер адаптера IDE (как правило, в компьютерах
x86 используют системные платы с одним адаптером, который поддерживает два канала IDE),
номер канала (он кодируется как SCSI ID, как показано в табл.Табл. 2), номер диска (всегда
d0) и номер раздела (первый раздел на диске – s0 и т.д., подобно разделам на SCSI дисках).
29
номер диска в подсистеме IDE позиция диска в подсистеме IDE
0 primary master
1 primary slave
2 secondary master
3 secondary slave
Каждому файлу в каталоге /dev/dsk соответствует файл устройства прямого доступа (raw disk) в каталоге
/dev/rdsk:
# ls /dev/dsk
c0d0p0 c0d0s1 c0d0s15 c0d0s7 c1t0d0p3 c1t0d0s12 c1t0d0s4
c0d0p1 c0d0s10 c0d0s2 c0d0s8 c1t0d0p4 c1t0d0s13 c1t0d0s5
c0d0p2 c0d0s11 c0d0s3 c0d0s9 c1t0d0s0 c1t0d0s14 c1t0d0s6
c0d0p3 c0d0s12 c0d0s4 c1t0d0p0 c1t0d0s1 c1t0d0s15 c1t0d0s7
c0d0p4 c0d0s13 c0d0s5 c1t0d0p1 c1t0d0s10 c1t0d0s2 c1t0d0s8
c0d0s0 c0d0s14 c0d0s6 c1t0d0p2 c1t0d0s11 c1t0d0s3 c1t0d0s9
# ls /dev/rdsk
c0d0p0 c0d0s1 c0d0s15 c0d0s7 c1t0d0p3 c1t0d0s12 c1t0d0s4
c0d0p1 c0d0s10 c0d0s2 c0d0s8 c1t0d0p4 c1t0d0s13 c1t0d0s5
c0d0p2 c0d0s11 c0d0s3 c0d0s9 c1t0d0s0 c1t0d0s14 c1t0d0s6
c0d0p3 c0d0s12 c0d0s4 c1t0d0p0 c1t0d0s1 c1t0d0s15 c1t0d0s7
c0d0p4 c0d0s13 c0d0s5 c1t0d0p1 c1t0d0s10 c1t0d0s2 c1t0d0s8
c0d0s0 c0d0s14 c0d0s6 c1t0d0p2 c1t0d0s11 c1t0d0s3 c1t0d0s9
В Solaris принято, что раздел номер 2 (slice 2) представляет собой весь диск, т.е. является
репрезентацией всего диска в целом, со всеми его разделами. Иначе говоря, на диске на
самом деле может быть создано до 7 разделов, а восьмой (раздел 2) всегда охватывает все эти
разделы вместе. Поэтому на разделе 2 нельзя создать файловую систему и записывать туда
файлы: он слу\жит для системных надобностей. В частности, в структурах, адресуемых через
раздел 2, хранятся сведения о диске в целом: реальный размер, число цилиндров и т.п.
30
Говоря о разных типах имен устройств можно рассмотреть пример именования разделов
диска. Так, разделам SCSI-диска со SCSI ID, равным 6, присоединенному к нулевому
контроллеру, будут соответствовать логические имена устройств (разделов диска) от /dev/dsk/
c0t6d0s0 до /dev/dsk/c0t6d0s7, физические имена от /devices/pci@1f,0/pci@1,1/scsi@6/sd@0,0:a
до /devices/pci@1f,0/pci@1,1/scsi@6/sd@0,0:g. При этом диску в целом будет соответствовать
экземплярное имя sd6.
каталог /devices
Каталог /devices отражает аппаратную конфигурацию компьютера. Дерево его подкаталогов
строится в соответствии с реальными подключениями устройств к шинам и контроллерам.
Поэтому для компьютеров различных архитектур структура дерева подкаталогов /devices
будет разной. Содержание этих подкаталогов будет разным для разных компьютеров, даже
если они имеют одинаковую архитектуру, потому что компьютеры могут иметь разную
конфигурацию: неодинаковое количество жестких дисков, различные контроллеры
интерфейсов (SCSI, IDE), по-разному подсоединенные к ним диски. Например, для
компьютера x86 дерево может быть таким:
./pseudo
./isa
./isa/fdc@1,3f0
./isa/i8042@1,60
./pci@0,0
./pci@0,0/pci8086,7191@1
./pci@0,0/pci-ide@2,1/ide@0
./pci@0,0/pci-ide@2,1/ide@1
./pci@0,0/pci-ide@2,1
Это пример дерева каталогов Solaris 9, установленного на ноутбук IBM ThinkPad 390X.
Полный список всех устройств компьютера, с которыми система Solaris готова работать,
содержится в файле /etc/path_to_inst.
Обычно системному администратору незачем изменять этот файл. Для просмотра полного
списка устройств следует использовать команду prtconf:
prtconf
Это позволяет отфильтровать в выводе prtconf строки, содержащие слово “not”, например,
“device not attached”.
31
Структура файловых систем, соответствующих POSIX
32
Как видно из рис. 5, до того, как ветвь будет присоединена к файловой системе, должна
существовать и файловая система, и ветвь. Проще говоря, если вы присоединяете новый
носитель к существующей файловой системе, на этом носителе уже должны быть размечены
разделы и содержаться файловая система известного операционной системе типа. Это
происходит, например, когда вы вставляете DVD-диск в привод и желаете его прочесть.
Чтобы содержимое нового диска стало доступным для операционной системы, требуется
произвести операцию “монтирования”, т.е. сообщить операционной системе, в какой каталог
существующей файловой системы следует поместить содержимое нового диска. Этот каталог
называется “точкой монтирования” (на рис. 5 точка монтирования показана красной
стрелкой). После монтирования файловая система приобретает целостный вид, и
пользователю (или стороннему наблюдателю) кажется, что дерево файловой системы
монолитно, хотя на самом деле оно может состоять из нескольких ветвей, каждая из которых
присоединена в свою точку монтировния (рис. 6).
Предположим, что для начала у нас есть только корень дерева (корневой раздел). Мы можем
присоединить к нашей фаловой системе другие разделы. Присоединим еще один раздел (в
нем хранятся какие-то каталоги, но пока он не имеет имени в нашей файловой системе).
Обратите внимание на то, что если каталог является точкой монтирования, то он находится
на отдельном разделе, а если нет – то он расположен на том же разделе, что и родительский
каталог. Например, каталог /var в примерах ниже расположен на отдельном разделе, а
каталог /etc – в том же разделе, что и каталог /.
FreeBSD:
mount
/dev/ad0s1a on / (ufs, local)
/dev/ad0s1e on /var (ufs, local, soft-updates)
/dev/ad0s1f on /cache (ufs, local, soft-updates)
/dev/ad0s1g on /usr (ufs, local, soft-updates)
procfs on /proc (procfs, local)
Linux:
mount
/dev/hda1 on / type ext2 (rw)
none on /proc type proc (rw)
/dev/hda5 on /usr type ext2 (rw)
/dev/hda6 on /var type ext2 (rw)
33
Solaris:
/ on /dev/dsk/c0d0s0
read/write/setuid/devices/intr/largefiles/logging/xattr/onerror=panic/dev=1980000 on Пн янв. 14
23:48:38 2008
/devices on /devices read/write/setuid/devices/dev=4380000 on Пн янв. 14 23:48:21 2008
/dev on /dev read/write/setuid/devices/dev=43c0000 on Пн янв. 14 23:48:21 2008
/system/contract on ctfs read/write/setuid/devices/dev=4400001 on Пн янв. 14 23:48:21 2008
/proc on proc read/write/setuid/devices/dev=4440000 on Пн янв. 14 23:48:21 2008
/etc/mnttab on mnttab read/write/setuid/devices/dev=4480001 on Пн янв. 14 23:48:21 2008
/etc/svc/volatile on swap read/write/setuid/devices/xattr/dev=44c0001 on Пн янв. 14 23:48:21 2008
/system/object on objfs read/write/setuid/devices/dev=4500001 on Пн янв. 14 23:48:21 2008
/usr on /dev/dsk/c0d0s6
read/write/setuid/devices/intr/largefiles/logging/xattr/onerror=panic/dev=1980006 on Пн янв. 14
23:48:38 2008
/lib/libc.so.1 on /usr/lib/libc/libc_hwcap2.so.1 read/write/setuid/devices/dev=1980006 on Пн янв. 14
23:48:35 2008
/dev/fd on fd read/write/setuid/devices/dev=4680001 on Пн янв. 14 23:48:38 2008
/var on /dev/dsk/c0d0s1
read/write/setuid/devices/intr/largefiles/logging/xattr/onerror=panic/dev=1980001 on Пн янв. 14
23:48:39 2008
/tmp on swap read/write/setuid/devices/xattr/dev=44c0002 on Пн янв. 14 23:48:39 2008
/var/run on swap read/write/setuid/devices/xattr/dev=44c0003 on Пн янв. 14 23:48:39 2008
/opt on /dev/dsk/c0d0s5
read/write/setuid/devices/intr/largefiles/logging/xattr/onerror=panic/dev=1980005 on Пн янв. 14
23:48:44 2008
/export/home on /dev/dsk/c0d0s7
read/write/setuid/devices/intr/largefiles/logging/xattr/onerror=panic/dev=1980007 on Пн янв. 14
23:48:44 2008
/home/filip on /export/home/filip read/write/setuid/devices/dev=1980007 on Вт янв. 15 14:06:53 2008
Solaris:
mount -p | grep dsk | awk '{print $3 " on " $1 " (" $7 ")"}'
/ on /dev/dsk/c0d0s0 (rw,intr,largefiles,logging,xattr,onerror=panic)
/usr on /dev/dsk/c0d0s6 (rw,intr,largefiles,logging,xattr,onerror=panic)
/var on /dev/dsk/c0d0s1 (rw,intr,largefiles,logging,xattr,onerror=panic)
/opt on /dev/dsk/c0d0s5 (rw,intr,largefiles,logging,xattr,onerror=panic)
/export/home on /dev/dsk/c0d0s7 (rw,intr,largefiles,logging,xattr,onerror=panic)
Те файловые системы, которые в столбце mount at boot отмечены как yes, будут проверены и
3 Внимание! В других системах UNIX этот файл имеет другое название - /etc/fstab
34
смонтированы при старте системы. Файловую систему можно смонтировать в любой момент,
надо лишь указать ей в качестве точки монтирования пустой каталог, который уже
существует и доступен в системе. Операцию монтирования и демонтирования файловой
системы может осуществить только root.
Например
При монтировании файловой системы следует явно указывать ее тип, если он отличается от
UFS.
umount mount_point
Например
umount /mnt
35
выясняет тип файловой системы вставленного диска, и, если этот тип поддерживается, монти
рует диск. Список предопределенных точек монтирования можно посмотреть с помощью
man rmmount
Программу rmmount можно запускать и вручную. Кроме того, можно использовать команду
volrmmount для форсирования перемонтирования или демонтирования файловой системы на
сменном носителе. Детали использования следует почерпнуть в man volrmmount.
Суперблок
Дерево каталогов
Файлы в UNIX’e разложены по каталогам. Каталоги образуют древовидную структуру: есть
корневой каталог, который обозначается знаком ”/” (слэш), и его подкаталоги. В каждом из
последних есть свои подкаталоги и т.д. Ограничений на число файлов в каталоге нет. Разные
каталоги («ветви» дерева каталогов) могут размещаться на разных дисках, это незаметно для
пользователя. Чтобы обратиться к файлу, не нужно знать о том, на каком физическом
устройстве или разделе диска записан файл. Это значит, лихорадочный поиск по дискам С:,
D: E:, K:, R:, Y: незнаком человеку, работающему с UNIX’ом. Он лихорадочно ищет
потерянные файлы в густой кроне UNIX-каталогов, начиная от корня.
Между прочим, забавно, что уже много лет все упорно называют деревом структуру
каталогов, у которой корень находится наверху, а его ближайшие отростки-подкаталоги
называются каталогами верхнего уровня… Кто из нас видел деревья, растущие кронами
вниз?
36
nfs псевдосисте сеть файловая система для монтирования
ма каталогов на других компьютерах
(подобно разделяемым каталогам
Windows)
cachefs псевдосисте другая ФС использует локальный диск для кэширования
ма удаленной файловой системы NFS
autofs псевдосисте другая ФС использует динамические объекты для
ма монтирования других файловых систем
specfs псевдосисте драйверы файловая система файлов устройств /dev
ма
procfs псевдосисте ядро /proc – отображеине процессов в
ма структуру ФС
sockfs псевдосисте сеть соединения типа «сокет»
ма
fifos псевдосисте файлы программные каналы (pipe API)
ма
Табл. 3 Файловые системы, поддерживаемые Solaris 9 и 10
К 1985 году операционные системы фирмы Sun использовали Berkeley fast filesystem (FFS).
Эта файловая система базировалась на концепции индексных дескрипторов, которая
органично трансформировалась в концепцию виртуальных индексных дескрипторов в новой
файловой системе UFS, которая вобрала в себя структуру FFS и новые идеи организации
виртуальной файловой системы. Взаимодействие независимого от конкретного типа
файловой системы уровня виртуальной файловой системы и файловых систем строго
определенных типов иллюстрирует Рис. 7.
Файловая система UFS претерпела некоторые изменения с 1985 года. Так, начиная с выпуска
Solaris 9 8/03 поддерживаются многотерабайтные разделы, в то время как до этого UFS в
Solaris могла работать только с разделами размером до 1 Тб. В настоящее время большие
разделы поддерживаются только в 64-разрядной версии Solaris 9.
37
Рис. 7 Структура виртуальной файловой системы Solaris
В файловой системе UFS размер блока может составлять от 512 байт до 8192 байт, по
умолчанию в Solaris принят размер 8192 байт.
38
В последние годы непременным условием использования файловой системы стала
поддержка современных дисков больших объемов и больших файлов. Если несколько лет
назад «большим» назывался диск объемом в 1 гигабайт, то сейчас дисковые массивы объемом
в несколько терабайт становятся обычными для систем среднего класса. Скоро они придут в
системы малых офисов и в дома, а сети предприятий начнут работать с серверами, в которых
установлены дисковые массивы, содержащие десятки и сотни терабайт информации. Что на
это отвечают создатели файловых систем для UNIX?
С 1991 года файловая система UFS претерпела заметные изменения, появилась версия UFS2.
В Solaris модификация файловой системы позволила достичь предела поддерживаемого
дискового объема одного раздела UFS в 1 терабайт.
дерево каталогов
Все файлы в UNIX организованы древовидно: всегда существует корневой каталог, который
обозначается “/”. В нем есть подкаталоги. Обычно есть подкаталоги, перечисленные в Табл.
5.
Каталог /bin является символической ссылкой на каталог /usr/bin: так бывает не всегда.
Каталог для временных файлов /tmp монтируется в Solaris на отдельную виртуальную файловую систему типа
tmpfs. Это особый тип файловой системы. Если в системе есть свободная оперативная память, то драйвер tmpfs
хранит данные, записанные на файловую систему этого типа в оперативной памяти, а не диске. Если объем
свободной памяти падает и она начинает требоваться другим программам, файлы из tmpfs записываются на
раздел свопинга. Получается, что файлы, размещенные в файловой системе типа tmpfs всегда занимают остаток
оперативной памяти системы, чтобы она использовалась эффективно. Если свободной памяти нет, tmpfs
39
размещается в пространстве свопинга.
Это автоматически приводит к тому, что записанные в файловую систему tmpfs файлы теряются после
перезагрузки. Поэтому не следует записывать в /tmp какие-либо полезные файлы.
Скорость работы файловой системы tmpfs высока, т.к. часто все ее файлы физически расположены в
оперативной памяти. Вследствие этого кэширование файлов на tmpfs не производится: они и так хранятся не на
диске.
Казалось бы, использование tmpfs таит в себе резерв увеличения производительности любого приложения,
поскольку достаточно записать данные в каталог /tmp и работать с ними там, чтобы скорость доступа к данным
возросла многократно. На самом деле это не так, потому что чтение и запись любых дисков кэшируется, и лишь
для некоторых приложений использование tmpfs оправдано. Несомненно увеличивается быстродействие
компиляторов и других программ с большими объемами промежуточных файлов – но они и так используют
/tmp для хранения временной информации в процессе работы.
По умолчанию Solaris применяет tmpfs только для /tmp. При этом система избегает
существенного объема дискового ввода-вывода, так как /tmp используется для временных
файлов различных программ.
Внимание: создание отдельного раздела /tmp на диске приведет к тому, что /tmp не будет
создан системой автоматически с типом файловой системы tmpfs и производительность
системы может уменьшиться!
файлы и каталоги
типы файлов
Если дать команду ls –l, то тип файла будет указан первым символом первого столбца вывода:
#ls –l /etc
Вывод команды ls для каталога /etc сильно обрезан в этом примере, там несравнимо больше
файлов. Нас интересуют различные типы файлов, которые мы здесь встретим.
В системах UNIX файлы могут быть обычными (этому типу соответствует обозначение -), а
также представлять собой каталог (d), файл символьного (c) или блочного (b) устройства,
символьную ссылку на другой файл (l), программный канал (p). В Solaris есть еще
специальный тип door (дверь), ассоциированный с набором потоков в системе и требуемый
для программирования взаимодействия потоков.
Обычный файл может содержать текст или двоичные данные, система не делает никаких
предположений о содержимом файла в зависимости от его имени, в отличие от Windows-
систем. Возможность запустить файл определяется исключительно правами доступа к файлу.
При попытке запустить двоичный файл система будет искать в нем корректный заголовок
40
исполняемого кода. Если этот файл на самом деле не является программой UNIX, система
просто сообщит об ошибке. При попытке выполнить текстовый файл, он будет
рассматриваться как скрипт командного процессора (если иное не указано в первой строке
файла, где можно указать иной интерпретатор). Если файл не является скриптом, командный
процессор завалит вас сообщениями об ошибках. Он будет выдавать не меньше одного
ругательного сообщения на каждую строку. Не пытайтесь запускать то, что не должно
запускаться!
Файлы символьных или блочных устройств – это файлы, которые располагаются в каталоге
/dev или связанном с ним, как рассказано в лекции 6. Обмен данными с символьным
устройством (например, с терминалом) идет посимвольно, с блочным (например, с диском) –
поблочно.
О символьных ссылках будет рассказано ниже в разделе «символьные ссылки»; это – файлы
специального типа, аналог ярлыка в Windows.
Программный канал – это файл, образующийся в некоторых случаях при организаци каналов
связи между процессами. От администратора обычно не требуется никаких действий в
отношении файлов типа p.
В каталоге /etc мы видим обычные файлы, символьные ссылки, каталоги и даже один
программный канал. Файлы этих типов (за исключением файлов каналов), и составляют
большинство в системе.
d каталог (directory)
D дверь (door)
l символическая ссылка (symbolic link)
b файл блочного устройства (block)
с файл символьного устройства, устройства прямого доступа (character)
p специальный файл программного канала (FIFO, named pipe)
s сокет
- обычный файл
Имена файлов и каталогов в UNIX состоят из латинских букв верхнего и нижнего регистра,
цифр и знаков препинания. Регистр букв имеет значение! Буквы верхнего и нижнего регистра
в UNIX считаются разными символами, имена Alliance и alliance – это разные имена, хотя и
отличаются всего одной буквой.
41
Из знаков препинания рекомендуется использовать только точку “.”, тире “-“ и
подчеркивание “_”. Использование других знаков (запятых, скобок, звездочки, решетки,
вопросительного и восклицательного знаков и других) теоретически возможно, но неудобно.
Дело в том, что командные процессоры и стандартные системные функции в UNIX
интерпретируют такие знаки специальным образом (а именно, как шаблоны имен файлов или
модификаторы команд в командном процессоре). Обращаться к файлу с именем ,/?*&^q-
+|! придется тоже специальным образом, а это быстро надоест.
В UNIX’e не используется понятие «расширение имени файла», так как точка считается
равноправным символом в имени. Следовательно, имя several.news.from.New.York смотрится
в UNIX не более экзотично, чем index.html. UNIX не делает предположений о содержимом
или назначении файла в зависимости от его имени и того, какие символы стоят справа от
самой правой точки в имени.
Для того, чтобы решить, что содержится в файле, не открывая его, можно использовать
программу file:
file bad.words
English text
Имя может быть полным (абсолютным) или относительным. Полное имя файла – это имя с
указанием пути к файлу от корневого каталога, например,
/usr/local/squid/etc/squid.conf. Полное имя легко идентифицировать: оно всегда
начинается с символа “/”.
Относительное имя файла может быть очень коротким, например, просто f. Если в имени
файла вообще нет знака “/” (слэш), то имя относится к файлу текущего каталога. Если слэш
есть (но не в начале имени – например, squid/etc/squid.conf), то все, что находится
слева от первого в имени слэша, расценивается как подкаталог текущего каталога.
Полное имя любого файла не должно быть длиннее 1023 символов. Однако, для обращения к
файлу, расположенному очень глубоко в структуре каталогов, следует перейти в
промежуточный каталог командой cd и оттуда обратиться к файлу по относительному имени.
Скажем, вместо
vi /usr/home/ivan/projects/united_states/texas/cowboys/horses/\
red/seats/sellers_training
42
интерпретирован как пустой символ, а не как символ завершения команды.
Полное имя файла также называют «путем к файлу» , «путем файла» или «путевым именем
файла».
touch filename
Эта операция бывает нужна при сборке программы из нескольких файлов, если мы хотим,
чтобы были перекомпилированы все исходные тексты (по умолчанию компилируются только
свежие).
Также можно использовать команду mkfile, для того чтобы создать файл определенного
размера, так
создаст файл testfile размером 500 мегабайт. Команда mkfile специфична для Solaris (хотя
в ряде дистрибутивов Linux и FreeBSD она тоже может быть).
43
mv file /usr/progs/useless/
Если Вы переносите или копируете файл или несколько файлов в каталог, то имя каталога
правильнее указывать с завершающим слэшем в конце имени (например,
/usr/progs/useless/). Это явным образом указывает на то, что имеется в виду именно
каталог.
Если произошла ошибка и последний аргумент команды оказался не каталогом, а файлом,
программа сообщит об этом. Если слэш не указать, то в случае ошибки старое содержимое
файла, в который копируется новая информация, будет безвозвратно утеряно.
Файлы удаляют с помощью команды rm. В системах UNIX не предусмотрена возможность
восстановления удаленных файлов (unerase), поэтому все, что стерто, пропадает навсегда.
Системы UNIX в структуре файловой системы не имеют «мусорной корзины» (trash), в
которую файлы попадают перед окончательным удалением. Однако, большинство
графических сред обеспечивают такую «корзину», но только для тех файлов, которые были
удалены программами, специально написанными с учетом этой возможности среды. Так, в
Solaris в CDE есть своя корзина. В нее попадают те удаленные файлы и каталоги, которые
были удалены программами, знающими об этой корзине. Как правило, о ее существовании
подозревает только File Manager CDE. Возможность восстановления стертых файлов
предоставляется не операционной системой, а графической оболочкой CDE, поэтому не стоит
рассчитывать, что любой файл можно восстановить из корзины CDE. Например, если файл
был удален командой rm из командной строки xterm (эмулятор терминала для графической
среды), то его уже не восстановить. Команда rm не знает о существовании корзины в CDE,
даже если запускается в окне терминала в графическом режиме.
Вывести файл на экран можно командами cat, more, less, pg, page.
Программы cat и more есть в любой системе UNIX, другие перечисленные выше команды
- это варианты команды more и присутствуют не всегда. Назначение more и ее коллег –
поэкранный вывод длинных файлов. При выводе информации программа more
останавливается, заполнив экран содержимым очередной страницы файла и ждет команды.
По нажатию «Enter» выводится следующая строка, по нажатию «пробела» – следующая
страница. Можно искать подстроку в тексте, по команде
/подстрока
Клавишами <Ctrl-B>, <Ctrl-F> можно перемещаться назад и вперед на одну страницу,
клавиша q служит для выхода из программы во время просмотра текста.
Каталоги
Слово «каталог» - употребляется наряду со словом «директория» (directory). В терминологии
большинства Windows-систем то же самое обозначает слово «папка» (folder). Среди
системных администраторов UNIX принято употреблять термин «каталог».
Каталог представляет собой файл особого типа, который содержит таблицу из двух столбцов:
в первом из значится имя файла, во втором – номер индексного дескриптора, который
описывает файл. В одном каталоге не может быть файлов или подкаталогов с одинаковыми
именами.
rm –rf каталог
44
например, по команде
rm –rf /usr/local/squid/
будут удалены каталог /usr/local/squid, а также все файлы в нем и все его подкаталоги.
Перенести или переименовать каталог можно командой mv, для копирования каталогов
вместе с подкаталогами используется команда cp –Rp.
Список файлов и подкаталогов в каталоге выдает команда ls. Если запустить ls без
параметров, она выдаст только список имен фaйлов. Эта команда имеет множество ключей,
из которых более всего полезны перечисленные в Табл. 6
В каждом каталоге при создании всеглда появляются две записи – “.” (точка) и “..” (две
точки). “Точка” ссылается на сам текущий каталог, а “две точки” – на родительский каталог. В
корневом каталоге обе эти записи указывают на корневой каталог.
ссылки
В любой системе UNIX существуют жесткие и символические ссылки.
Жесткая ссылка – это ссылка на индексный дескриптор файла. В этом смысле имя файла и
есть жесткая ссылка, причем у одного файла может быть несколько разных имен в разных
каталогах. Это значит, что в разных каталогах могут быть записи, ссылающиеся на один и тот
же файл и, следовательно, один и тот же индексный дескриптор. Этот файл будет доступен
под всем этими именами. Число жестких ссылок на файл хранится в его индексном
дескрипторе.
45
# ls -li file*
16852 -rw-r--r-- 2 root root 0 Mar 20 16:11 file
16852 -rw-r--r-- 2 root root 0 Mar 20 16:11 file1
Видно, что в каталоге есть два файла с разными именами, но все остальные свойства у них
одинаковы. Это обусловлено тем, что у них один и тот же индексный дескриптор (его номер
выводится в первом столбце).
Число в третьем столбце показывает, сколько в файловой системе есть жестких ссылок на
этот файл. Физически файл один, так как местоположение содержимого файла на диске
определяется индексным дескриптором. При этом можно обратиться к этому файлу, называя
его разными именами. Фактически, после создания жесткой ссылки на файл, определить,
какое из имен было придумано раньше, невозможно. Права доступа ко всем жестким ссылкам
на файл одинаковы, так как определяются одним и тем же индексным дескриптором.
Смысл жесткой ссылки состоит в возможности поместить в разные каталоги записи об одном
и том же файле, без многократного копирования этого файла во все каталоги, где нужна
запись о нем. При модификации файла, независимо от того, через какую именно жесткую
ссылку к нему обратились, изменяется информация в самом файле. Если модифицировать
файл, обратившись к нему по одному имени (через одну жесткую ссылку) и записать
сделанные изменения, то при последующем обращении к нему через другую жесткую ссылку
вы увидите уже новую, модифицированную информацию.
При создании жесткой ссылки сам файл не модифицируется, старое имя никак не изменяется,
результат выполнения команды проявляется только в создании еще одного имени этого
файла.
Нельзя создать жесткую ссылку на файл, который располагается на другом разделе UNIX.
Это связано с тем, что таблица индексных дескрипторов в каждом разделе файловой системы
своя, а указать в каталоге индексный дескриптор чужого раздела невозможно.
Файл в любой файловой системе UNIX считается удаленным только тогда, когда удалены все
жесткие ссылки на него. Удаление жесткой ссылки выполняется командой rm и внешне
ничем не отличается от удаления обычного файла.
ls –l
lrwxrwxrwx 1 root root …. qq ->/usr/home/qq
46
Windows. При удалении символической ссылки с файлом ли каталогом, на который она
ссылается, ничего не происходит. При удалении файла, на который ссылкается
символическая ссылка, она «повисает в воздухе», ссылаясь на пустоту. В последнем случае
при обращении к такой «пустой» ссылке возникнет ошибка file not found, несмотря на
то, что сама ссылка будет видна и доступна в списке файлов.
права доступа
Давно известно, что в Москве раньше были две угнетаемые нации: "погазоны" и "улюки". Их
никто никогда не видел, но всем было их очень жалко. Куда ни пойдешь, везде пестрели
надписи: "Погазонам не ходить", "Машины улюков не ставить".
В каждой многопользовательской системе полагается развешивать такие таблички по каталогам, чтобы доступ
к информации имели только те, кому он разрешен.
Система безопасности UNIX основывана на правах доступа к объектам файловой системы – файлам и
каталогам. У каждого каталога или файла есть один владелец и один групповой владелец. Группового
владельца файла мы будем для краткости называть группой файла.
Читая словосочетание «группа файла» не следует считать, что файлы объединены в каки-то группы. Группа
файла обозначает группу пользователей, которой даны некие специальные права на доступ к этому файлу.
Первый столбец – это тип файла (первый символ) и права доступа (остальные девять
символов). Затем указаны число жестких ссылок на файл, владелец и группа файла, размер
файла в байтах, дата последней модификации в формате «Месяц Число Год» и имя файла. Год
часто не указывается для тех файлов, которые были модифицированы в течение последних 12
месяцев.
Права доступа делятся на три части: права, данные, соответственно, владельцу файла, группе
файла и всем остальным (обозначаются термином other или world). Таким образом, девять
бит слова прав доступа делятся на три части по три бита:
rwx | rw- | r--|
u g o
Часть, обозначенная буквой u (user), определяет права доступа владельца файла, буквой g –
права доступа группы файла, o – права всех остальных. Существуют права трех типов: на
чтение (r, read), запись (w, write) и запуск на выполнение (x, execute). Пользователю, который
хочет обратиться к файлу, даются права доступа либо владельца, либо группы файла, либо
права “всех остальных”. Права доступа проверяются так (см.Рис. 8, на примере слова прав
доступа rwxrw-r--):
47
Рис. 8 Алгоритм получения доступа к файлу
Право запуска в отношении каталога определяется как право поиска в каталоге, что на
практике означает право на чтение индексных дескрипторов файлов и подкаталогов этого
каталога. Действительно, возможность узнать, какие именно файлы есть в каталоге,
определяется правом на чтение каталога. А вот более подробная информация о файлах (кто
их хозяин, где лежат и т.п.) доступна только тем, кто имеет право на поиск в каталоге.
Наличие или отсутствие права поиска в каталоге не влияет на права пользователя root: ему
разрешен поиск в любом каталоге.
Старшие три бита слова прав доступа относятся к запуску файла, поэтому детально они
48
рассмотрены в лекции 8. Вот как выглядит слово прав доступа:
su sg t r w x r w x r w x
Старшие три бита – это бит установки владельца при запуске файла (suid), бит установки
группы (sgid) при запуске файла и бит запрета выгрузки файла на диск при выполнении (t).
Для каталога биты suid и sgid имеют другое значение. По умолчанию при создании файла он
наследует владельца и группу от процесса, который его создал. Аналогичное правило
действует и на каталоги. Однако, в правах доступа к каталогу установлен бит suid, то
созданный в нем файл или подкаталог будет принадлежать не владельцу по умолчанию, а
владельцу каталога с битом suid. Это правило не работает для систем Solaris, хотя
справедливо для некоторых других систем UNIX.
Бит запрета выгрузки файла на диск при выполнении (sticky bit) в старых версиях UNIX
использовался для указания того, что при выполнении программы, записанной в этом файле,
ее страницы запрещено выгружать на диск. В настоящее время sticky bit используется для
каталогов, с тем, чтобы указать особые условия удаления файлов из каталога. Если sticky bit
установлен для каталога, то все пользователи, кроме root’a, могут удалять из каталога только
те файлы, которые им принадлежат, независимо от прав доступа к каталогу. В разных
системах UNIX он может интерпретироваться по-разному, поэтому смотрите для уточнений
man sticky и man chmod.
индексные дескрипторы
Формат таблицы индексных дескрипторов и самих дескрипторов обсуждался в лекции 6.
Следует сказать, что непосредственное изменение индексного дескриптора невозможно, так
как модификацию дескриптора выполняют различные программы в процессе своей работы.
Нет необходимости вмешиваться в содержимое индексного дескриптора напрямую. Для
восстановления таблицы индексных дескрипторов после сбоя следует воспользоваться
программой fsck.
списки ACL
Стандартные права доступа в UNIX не всегда идеальным образом подходят для решения
задач администрирования системы. Например, что сделает администратор, если доступ к
файлу на чтение и запись надо дать одной группе пользователей? Конечно, сделает эту
группу владелицей файла, а затем делегирует право чтения и записи файла этой группе, вот
так:
А если надо дать право доступа только одному из членов этой группы? Тогда можно создать
49
новую группу специально для этой цели, сделать ее членом только одного пользователя, и
затем указать, что эта новая группа будет владеть файлом:
addgroup новая_группа
chgrp новая_группа файл
chmod g=rw файл
#редактируем /etc/group и добавляем в новую группу существующего пользователя
vi /etc/group
Такое ухищрение нам помогло, но что делать, если надо дать право чтения, записи и запуска
двум разным пользователям, а еще двум – право чтения и записи, а еще одному – только
чтения. а всем остальным – вообще не дать доступ к этому файлу? На такой вопрос нет
ответа, если вы работаете в «классической» версии UNIX. Однако, некоторые современные
системы UNIX (например, Solaris и FreeBSD) обладают требуемым механизмом. Это – списки
управления доступом к файловой системе, access control lists (ACLs).
Списки управления доступом дают более гибкие возможности назначения прав доступа, чем
традиционные права доступа UNIX. С помощью ACL можно назначить как права доступа
хозяина файла, группы файла и всех остальных, так и отдельные права для указанных
пользователей и групп, а также максимальные права доступа по умолчанию, которые
разрешено иметь любому пользователю.
Здесь и далее мы будем называть ACL для файлов и каталогов «расширенными правами
доступа». Расширенные права доступа к файлам и каталогам устанавливаются командой
setfacl.
Здесь entry_type – тип расширенного права доступа, uid и gid – идентификаторы пользователи
и группы, соответственно, а perms – собственно назначаемые права доступа.
Расширенные права доступа к файлу могут быть такими, как показано в Табл. 7.
50
и групп. Установка маски представляет собой самый быстрый путь изменить фактические
(эффективные) права доступа всех пользователей и групп. Например, маска r — —
показывает, что пользователи и группы не могут иметь больших прав, чем просто чтение,
даже если им назначены права доступа на чтение и запись.
Кроме расширенных прав доступа к файлу, которые могут быть применены и к каталогу,
существуют специфические права доступа к каталогу, а именно права доступа по умолчанию.
Файлы и подкаталоги, которые будут создаваться в этом каталоге, будут получать такие же
расширенные права доступа по умолчанию, которые заданы в расширеных правах доступа к
этому каталогу.
Например, для установки права на чтение и запись файла project07 для пользователей lena и
petr надлежит выполнить команду
Ключ -m служит для добавления прав доступа, а не для их замены. Эффективные (т.е. те,
которые в самом деле будут иметь место) права доступа пользователей lena и petr определяют
51
не только их персональные права доступа к этому файлу, но и маска, которая показывает
права доступа по умолчанию. Из персональных прав и маски выбираются наиболее строгие
ограничения, поэтому, если в персональных правах доступа или в маске для файла project07
отсутствует право на запись, ни lena, ни petr не получат реальной возможности изменить
файл project07.
getfacl имя_файла
Помните, что назначение прав доступа с помощью chmod может привести к изменению
записей ACL, а изменение маски ACL может повлиять на фактические права доступа к
объекту для его владельца, группы и всех остальных пользователей.
Для работы с образом диска, записанным в файл, требуется программа lofiadm, которая
управляет драйвером lofi. Этот драйвер позволяет связать файл с блочным
псевдоустройством. После этого содержимое файла будет доступно посредством обращения
к файлу этого блочного устройства. У системы будет полное впечатление, что это и есть
устройство и его можно монтировать с помощью mount, проверять на корректность записей
на нем с помощью fsck и т.п.
Filesystem
kbytes used avail capacity Mounted on
/dev/lofi/1
512418 512418 0 100% /mnt
52
Для демонтирования псевдоустройства и его удаления из системы следует дать следующие
команды:
umount /mnt
lofiadm -d /dev/lofi/1
lofiadm -a /export/home/test
/dev/lofi/1
newfs /dev/rlofi/1
newfs: construct a new file system /dev/rlofi/1: (y/n)? y
/dev/rlofi/1:
71638 sectors in 119 cylinders of 1 tracks, 602 sectors 35.0MB in 8 cyl
groups (16 c/g, 4.70MB/g, 2240 i/g) super-block backups (for fsck -F ufs -o b=#)
at: 32, 9664, 19296, 28928, ...
Отметим, что при использовании файловой системы ZFS думать о разбиении диска на
разделы незачем, но об этом подробнее рассказывается в лекции 8.
53
работы системы подкаталогов. Это подкаталоги /bin, /sbin, /dev, /devices, /etc, /tmp. Также
обычно есть подкаталоги /usr и /opt, а также /export, они обычно являются точками
монтирования других разделов.
Вообще говоря, перед планированием разделов следует подумать о том, как будет
использоваться компьютер под управлением Solaris. Если это будет сервер Oracle, надо
зарезервировать один неразмеченный (неотформатированный) раздел под базы данных
Oracle. Если планируется сделать почтовый сервер, то следует отвести под раздел /var
достаточно места для размещения всех почтовых ящиков в каталоге /var/mail, а если это
будет файловый сервер, надо сделать отдельный большой раздел для хранения файлов
пользователей (например, /export/home).
Таким образом, фактическое пространство, которое следует отвести под каталог /var,
зависит от назначения компьютера. Исходя из собственного опыта, я всегда создаю для /var
раздел размером как минимум 256Мб в системах с небольшой нагрузкой (почтовый сервер,
http-cache и ftp для сети из 10-50 компьютеров) и до 2-3Гб в системах со средней нагрузкой
(почтовый сервер, http-cache, СУБД типа MySQL, веб-сервер с 5-10 виртуальными хостами в
сети из 50-150 компьютеров).
При установке нового диска его разметку поможет провести программа format. Эта
программа также может использоваться для получения информации о геометрии диска, для
низкоуровнего форматирования SCSI-дисков и восстановления некоторой служебонй
информации после сбоев.
Предположим, мы подключили новый диск, и это IDE primary slave диск. Для того, чтобы
создать на нем файловую систему, потребуется создать на новом диске разделы (по крайней
мере один) и затем на каждом из разделов создать новую файловую систему.
Создание разделов на диске выполняется с помощью команды format или fdisk. Последняя
применяется только для платформы x86. Однако, из format можно вызвать fdisk и делать
именно так предпочтительнее. Почему – будет ясно из следующего описания.
54
После подключения нового диска нет надобности перенастраивать ядро Solaris, если диски
этого типа в системе уже есть. Например, если у вас уже есть один IDE-диск, и система с ним
уже работает, незачем перезапускать систему с ключом r или создавать файл /reconfigure и
перезапускаться для обнаружения нового устройства. Достаточно создать новые файлы
устройств в каталогах /devices и /dev. Для этого в более ранних версиях Solaris использовалась
программа disks, а начиная с версии Solaris 9 следует запускать devfsadm. При запуске без
параметров новый диск будет обнаружен и требуемые файлы будут молча добавлены в
каталоги /devices, ./dev/dsk и /dev/rdsk.
Теперь любая программа работы с диском, требующая файл устройства в каталоге /dev/rdsk,
уже может работать с диском. Запустим программу format. В меню программы следует
выбрать диск, а затем выбрать запуск fdisk. После этого мы будем работать в среде
программы fdisk. Ее интерфейс нам знаком по другим системам, только обратите внимание,
что есть возможность создавать разделы нескольких типов. Если мы добавляем
дополнительный диск для работы с ним из среды Solaris, то следует выбрать тип Solaris.
Раздел на новом диске не должен быть помечен как «активный», если только с него не будет
загружаться какая-нибудь система в будущем.
Обязательно выберите пункт label для записи получившейся таблицы разделов на диск.
Программа mkfs позволяет создавать файловые системы разных типов, включая UFS, а newfs
является более удобным интерфейсом к mkfs исключительно для создания файловых систем
UFS.
# newfs /dev/rdsk/c0d1s0
55
661856, 678048, 694240, 710432, 726624, 742816, 759008, 774176, 790368, 806560,
822752, 838944, 855136, 871328, 887520, 903712, 919904, 936096, 952288, 968480,
984672, 1000864, 1017056, 1032224, 1048416, 1064608, 1080800, 1096992, 1113184,
1129376, 1145568, 1161760, 1177952, 1194144, 1210336, 1226528, 1242720, 1258912,
1275104, 1290272, 1306464, 1322656, 1338848, 1355040, 1371232, 1387424, 1403616,
1419808, 1436000, 1452192, 1468384, 1484576, 1500768, 1516960, 1533152, 1548320,
1564512, 1580704, 1596896, 1613088, 1629280, 1645472, 1661664, 1677856, 1694048,
1710240, 1726432, 1742624, 1758816, 1775008, 1791200, 1806368, 1822560, 1838752,
1854944, 1871136, 1887328, 1903520, 1919712, 1935904, 1952096, 1968288, 1984480,
2000672, 2016864, 2033056, 2049248,
Обратите внимание, при создании файловой системы сразу создается каталог lost+found
на ней, для того, чтобы при автоматическом восстановлении файлов после сбоя (при
перезагрузке, например) программе fsck было куда записать потерявшиеся фрагменты
файлов. Кроме этого, в некоторые блоки (их список выводится при работе newfs или mkfs)
записана резервная копия суперблока новой файловой системы.
Например
Параметр nbpi обозначает число байтов, приходящихся на один индексный дескриптор4, что
при известном объеме диска однозначно определяет число индексных дескрипторов в
файловой системе.
Программы mkfs и newfs поддерживают еще ряд ключей, которые позволяют гибко
описывать параметры создаваемой файловой системы.
56
списки управления доступом (ACL). Хранение списков ACL обеспечивают так называемые
теневые индексные дескрипторы (shadow inodes).
Загрузочный блок (boot block) – это, как правило, часть метки диска (disk label). В
загрузочном блоке записана маленькая программа, которая при старте системы загружает
ядро ОС с диска в оперативную память. Загрузочный блок располагается в первом секторе
диска. Загрузочный блок имеет смысл только для первого раздела жесткого диска, однако
место для него резервируется в каждом разделе.
Суперблок содержит общую информацию о файловой системе как совокупности файлов на
данном разделе жесткого диска, в частности, размер раздела UNIX, число свободных и
занятых блоков и индексных дескрипторов и флаг целостности файловой системы. Этот флаг
устанавливается при успешном завершении работы с файловой системой, например, при
корректной остановке операционной системы. В случае, если компьютер выключили
рубильником, не дождавшись корректной остановки системы, при следующем старте
системы программа fsck автоматически начнет проверку дисков и выдаст сообщение “clean
flag is not set in superblock”. Копии суперблока многократно записываются в нескольких
блоках внутри каждого раздела для пущей надежности. В файловой системе UFS
записывается по одной копии суперблока на каждую группу цилиндров. Если выяснится, что
оригинал суперблока в начале раздела поврежден, будет использована копия суперблока.
Таблица индексных дескрипторов (i-node table) содержит дескрипторы файлов. Дескриптор
файла содержит сведения о типе файла, размещении файла на диске, правах доступа к нему,
UID владельца файла, GID группы файла, время последнего доступа к файлу, время
последней модификации файла, время последней модификации самого индексного
дескриптора. Подробнее структура таблицы индексных дескрипторов рассмотрена в
подраздел «таблица индексных дескрипторов: детали».
В ранних версиях UNIX таблица индексных дескрипторов занимала фиксированное пространство в начале
устройства; в файловых системах UFS современных систем эта таблица распределена по диску, потому что
каждая часть таблицы отвечает за часть диска.
В файловых системах, которые основанны на FFS (ext2, ext3, UFS), диск разбит на группы
цилиндров. В каждой группе цилиндров есть свои копия суперблока, битовая карта
свободных блоков этой группы цилиндров и таблица индексных дескрипторов для файлов,
специальной версии Solaris – Trusted Solaris, которая была сертифицирована на уровень безопасности B1.
57
расположенных на цилиндрах этой группы. Такая структура хороша тем, что, во-первых,
ускоряется доступ к системным структурам данных, во-вторых, повышается устойчивость к
сбоям диска. При повреждении только одного участка поверхности диска теряется только
небольшая часть служебной информации о файлах и диске (такая информация в
документации часто называется метеданными – metadata).
Если файл имеет размер более двенадцати блоков (т.е. его длина больше 12*8192 =98304
байт), то предпоследние три номера обозначают не номера блоков данных, а номера
косвенных блоков (indirect blocks), в которых хранятся указатели на следующие блоки данных
и, возможно, на следующие косвенные блоки.
Первые двенадцать номеров блоков содержат просто номера блоков данных. Тринадцатый номер – это номер
косвенного блока первого уровня. В блоке первого уровня содержится до 2048 адресов блоков данных (речь
идет о 8192-байтных блоках).
Четырнадцатый номер блока содержит номер косвенного блока второго уровня. Косвенный блок второго уровня
содержит 2048 номеров косвенных блоков первого уровня, таким образом, через косвенный блок второго
уровня адресуется до 20482 блоков данных.
В пятнадцатый номер блока записан номер косвенного блока третьего уровня. Косвенный блок третьего уровня
содержит 2048 номеров косвенных блоков второго уровня, так что через косвенный блок третьего уровня
адресуется до 20483 блоков данных.
58
Файл не может располагаться на разных разделах UNIX. Файл может быть фрагментирован,
хотя файловая система построена так, чтобы свести фрагментацию к минимуму.
Теоретически рекомендуется не заполнять файловую систему более, чем на 70%, чтобы не
увеличивать фрагментацию при работе.
Максимальный размер файла может быть легко посчитан, так как мы знаем правила
адресации блоков данных. Если размер блока равен 512 байт, то
Напрямую адресуемые из индексного дескриптора блоки в сумме дают размер 12 × 8192
байт= 98304 байт
Адресуемые через номер косвенного блока первого уровня - 2048 × 8192 байт = 16777216
байт
Адресуемые через номер косвенного блока второго уровня – 20482 × 8192 байт = 34359738368
байт
Адресуемые через номер косвенного блока третьего уровня – 20483 × 8192 байт =
70368744177664 байта
Вместе получается примерно 64 Тбайта. Однако, Solaris 9, насколько об этом можно судить
по доступным фактам, не поддерживает файлы размером более 1 Тбайта на данный момент.
28 байт в таком дескрипторе отводится под разные расширения, включая место для 32-
разрядных идентификаторов владельца и группы файла, а также под 64-разрядные поля
времен модификации. Введение 64-разрядных полей времени в UNIX вместо прежних 32-
разрядных нужно для того. чтобы избежать «проблемы 2031 года», т.к. именно в этом году
перестанет хватать 32 байт для представления времени в системах UNIX. Разработчики
обоснованно полагают, что до тех пор все существующие системы UNIX будут
заблаговременно переведены на 64-разрядную архитектуру.
59
Если в отношении файла назначены расширенные права доступа (например, с помощью
команды setfacl), то будет создан теневой индексный дескриптор для этого файла и в
обычный индексный дескриптор этого файла будет записана ссылка на теневой индексный
дескриптор. Теневой индексный дескриптор не имеет специального формата, он
представляет собой точно такой же индексный дескриптор, как и обычный, но с указанием в
поле типа дескриптора на то, что он – теневой.
Как гласит русская народная поговорка в переводе на английский и обратно, “Недостаток ума
нередко компенсируется усиленной ходьбой”. Вопрос об оптимизации дисковой подсистемы
обычно встает как неизбежный результат отсутствия детального планирования системы в
целом. Поэтому первым правилом, которое следует соблюдать системным администраторам,
которые желают видеть свою систему быстрой и надежной, будет “планируй все заранее”. В
случае использования ZFS, впрочем, удачная концепция файловой системы заранее поможет
даже рассеянному администратору.
Когда требуется установить новый сервер Solaris, стоит подумать, чем этот сервер будет
занят. В современном мире задачи компьютеров меняются быстрее, чем оборудование. Если
пять лет назад почтовый сервер, обслуживающий сто пользователей, мог работать на
медленном компьютере с диском 1 Гб, то нынче с почтой связано намного больше задач, чем
просто прием, передача и хранение. Современный почтовый сервер для тех жа ста
пользователей принимает почту, проверяет ее на вирусы, блокирует спам, возможно,
выполняет контекстный анализ письма для фильтрации спама, и только после этого сохраняет
на диске. Объемы передаваемой почты тоже существенно возрасли. Письма часто
отправляются в формате HTML, а многие адресаты вкладывают в письма не только текстовые
документы, но и фотографии, музыкальные файлы и видеоклипы. Поэтому, планируя с
запасом свой новый почтовый сервер, вы не ошибетесь. Сейчас средний пользователь хранит
в своем почтовом ящике несколько гигабайт информации, следует ожидать, что в ближайшее
время придется оценивать возможную нагрузку на файловую систему почтового сервера
исходя из десятков гигабайт на каждого пользователя. Разумеется, наш прогноз не относится
к серверам, которые только передают почту, но не хранят почтовые ящики пользователей.
Для передачи и приема нескольких писем в секунду придется установить новый компьютер с
новым процессором Pentium IV, если на сервере будет запущена программа контекстного
анализа писем для фильтрации спама (например, spamasassin). Объем памяти, естественно,
тоже должен быть достаточным для одновременного запуска десятков копий программы
sendmail или ее аналога.
60
Из этого примера видно, что характер работы сервера надо планировать еще до начала его
установки. Во время установки следует задать верные размеры файловых систем. Это
избавит вас от необходимости модифицировать их размеры в дальнейшем.
В Solaris размер корневой файловой системы / вполне может быть менее 3 Гб. Даже с учетом
возможного обновления системы этого достаточно. Но файловая система /opt, куда будут
устанавливаться все новые пакеты, должна быть спланирована с запасом. Если работа
сервера будет связана с большой дисковой нагрузкой (кэширование http-запросов, хранение
файлов или почты), то для этих специфических целей (например, кэш http-запросов) можно
выделить отдельный раздел и назначить ему такой размер, который соответствует вашим
потребностям.
Надо будет учесть такие факторы, как возможный рост потребностей, требуемая
производительность (для подсистем SCSI лучше установить 6 дисков по 9 Гб, чем один
размером 54 Гб – будет быстрее) и не забыть учесть «запас», который создает система на
каждом разделе6.
#df
/ (/dev/dsk/c0d0s0): 1787406 blocks 419477 files
/boot (/dev/dsk/c0d0p0:boot): 19452 blocks -1 files
/proc (/proc ): 0 blocks 2896 files
/etc/mnttab (mnttab ): 0 blocks 0 files
/dev/fd (fd ): 0 blocks 0 files
/var/run (swap ): 1265832 blocks 30240 files
/tmp (swap ): 1265832 blocks 30240 files
/export/home (/dev/dsk/c0d0s7 ): 7647080 blocks 481212 files
Чтобы получить более удобную картину, в которой размер занятых блоков приводится в
килобайтах, следует дать команду df –k:
#df –k
Filesystem kbytes used avail capacity Mounted on
/dev/dsk/c0d0s0 1857844 964142 837967 54% /
/dev/dsk/c0d0p0:boot 11234 1508 9726 14% /boot
/proc 0 0 0 0% /proc
mnttab 0 0 0 0% /etc/mnttab
fd 0 0 0 0% /dev/fd
swap 632924 20 632904 1% /var/run
swap 633208 304 632904 1% /tmp
/dev/dsk/c0d0s7 3823549 9 3785305 1% /export/home
Команда
df –o i
61
внимание на то, что в других UNIX это делается с помощью команды
df -i
Для оценки размеров подкаталогов любого каталога используйте du. Например, для
определения того, сколько места на дисках занимают подкаталоги корневого каталога, дайте
команду du –s /*:
#du –s /*
2 /bin
3011 /boot
87255 /cdrom
1424 /core
3068 /dev
76 /devices
6262 /etc
26 /export
6 /floppy
4 /format.log
1 /home
20702 /kernel
2 /lib
16 /lost+found
2 /Mail
2 /mnt
1 /net
2 /nsmail
14 /opt
3822 /platform
730131 /proc
50 /qq
2 /qqqq
34154 /sbin
640 /tmp
46 /TT_DB
1811752 /usr
46138 /var
0 /vol
19 /xfn
В этой команде ключ –s указывает, что следует выдать суммарные значения по всем
подкаталогам, а аргумент /* требует, чтобы была посчитана статистика по всем подкаталогам
и файлам корневого каталога. Без указания ключа –s программа du сообщит о том, сколько
места занимает каждый из «листьев» дерева каталогов, т.е. выдаст длинный и подробный
список всех подкаталогов вообще, включая подкаталоги подкаталогов подкаталогов...
62
Чтобы уменьшить такие параноидальные издержки, значение minfree достаточно установить
равным 1%. Кстати при установке Solaris 9 на мой ноутбук ThinkPad 390X с диском размером
4 гигабайта, по умолчанию файловая система была создана именно с таким minfree.
Несмотря на это, документация на mkfs_ufs утверждала, что 10% является значением по
умолчанию. При создании файловой системы минимальное свободное пространство можно
задать так:
mkfs_ufs –o free=1
или так:
newfs –m 1
фрагментация
Любая файловая система так или иначе ищет компромисс между бесконтрольной
фрагментацией, как в системе FAT, и полным запретом на фрагментацию, как в файловой
системе ОС RT-11. Одной из проблем FAT является необходимость регулярно
дефрагментировать раздел, а в файловой системе RT-11 приходилось регулярно выполнять
программу squeese, которая записывала друг за другом, последовательно, все файлы,
разбросанные по диску. Фрагментация FAT приводила к снижению производительности
ввода-вывода, а запрет на фрагментацию в RT-11 делал невозможным запись на диск
большого файла, даже если на диске было полно участков с размером хоть чуть меньше его
длины, так как файл должен был быть записан только в последовательно расположенные
блоки.
Как удается достичь такого? Нужно ли что-то делать системному администратору, чтобы
фрагментация не мешала производительности в UNIX?
63
файл А А Б файл Б
Как много фрагментов (в понимании UFS) на разделе, можно выяснить, дав команду fsck –n.
Для уменьшения числа фрагментов (в понимании FAT), т.е. частей файла, записанных на
разделе в разных цилиндрах вдали друг от друга, для записи файла в последовательные
блоки, следует воспользоваться коммерческими программами дефрагментации (см.,
например, http://www.eaglesoft.com/products.html – только для платформы SPARC) или
выполнить резервное копирование всех файлов раздела и обратное их восстановление
посредством программ ufsdump / ufsrestore.
Для изменения размеров раздела UFS можно воспользоваться программой growfs. Кроме
этого, если изменить размер раздела по какой-либо причине не представляется возможным,
следует установить новый диск и перенести часть информации на него, возможно, создав
соответствующие символические ссылки на переполненном разделе. Подробнее об
изменении размеров разделов дисков и повышении их производительности рассказано в
лекции 20.
fsck /dev/dsk/c0d0s7
Программа fsck проверяет файловую систему и, если находит ошибки, исправляет их. Найдя
ошибки, об исправлении которых она не может принять самостоятельное решение, fsck
выдает сообщение об этом на терминал, с которого ее запустили, и ждет решения
администратора.
Если в настоящий момент файловая система смонтирована, fsck не начинает проверку такой
файловой системы,. Это правило можно обойти, если потребовать от fsck обращаться к
диску как к символьному устройству, а не как к блочному:
64
fsck /dev/dsk/c0d0s7
/dev/dsk/c0d0s7 is a mounted file system, ignored
fsck /dev/rdsk/c0d0s7
** /dev/rdsk/c0d0s7
** Currently Mounted on /export/home
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
2 files, 9 used, 3823540 free (20 frags, 477940 blocks, 0.0% fragmentation)
Концепция ZFS
Новая 128-разрядная файловая система ZFS была разработана компанией Sun Microsystems
для удовлетворения растущих потребностей индустрии. В ее основу положены несколько
базовых принципов, которы мы обсудим ниже, а затем перейдем к обсуждению их
реализации и конкретным приемам администрирования. Вот эти принципы:
1. организация всего доступного дискового пространства в единый пул
2. сквозной контроль целостности данных
3. транзакционность
4. легкость администрирования
Рассмотрим их значение подробнее.
65
Сквозной контроль целостности
До последнего времени проверка целостности каждого блока данных, который считывается с
диска, казалась неоправданной тратой процессорного времени. Однако сейчас, с
лавинообразным ростом мощности процессоров, это оказалось совсем недорого по
сравнению с ценой потерь от порчи данных.
Под сквозным контролем целостности понимается запись на диск контрольной суммы для
каждого блока данных, причем контрольная сумма и данные специально разносятся
максимально далеко друг от друга для снижения вероятности их совместной порчи. Если в
пуле несколько устройств, то для данных, размещенных на одном из них, контрольная сумма
будет записана на другом. Контрольные суммы вычисляются не только для данных, но и для
метаданных, и получается, что в пуле всегда есть контрольная сумма для каждого блока
информации.
При считывании любого блока подсчитывается его контрольная сумма и результат
сравнивается с контрольной суммой, хранящейся на диске. В случае расхождения ошибка
сразу обнаруживается. Разумеется, если в пуле не было запланировано никакого
резервирования (ни RAID-Z, ни иного), то ошибку уже не исправишь, но зато испорченные
данные не будут выданы за истинные.
Смысл сквозного контроля целостности данных в том, чтобы предотвратить скрытую
незаметную порчу данных в результате сбоя оборудования или встроенного программного
обеспечения диска или контроллера. Несмотря на то, что вероятность такого события кажется
низкой, некоторые исследования показывают, что она вполне значима для организаций
разного масштаба. Например, такие данные есть в отчете CERN от 8 апреля 2008 года[1].
Функциональность сквозного контроля целостности пока предоставляет всего одна файловая
система в мире – ZFS.
Разумеется, обеспечить гарантированную сохранность и неизменность данных с момента их
записи на диск до момента считывания позволяют только те или иные средства
резервирования. Поэтому, если у вас всего один раздел одного жесткого диска, то лучшее, что
может предложить ZFS – это проинформировать вас о том, что с данными непорядок.
Эта функциональность реализована и в других файловых системах, отличие ZFS в том, что
256-битные контрольные суммы блоков сохраняются не вместе с блоками, а в блоке
адресации верхнего уровня, т.е. вместе с адресом блока хранится контрольная сумма
адресуемого блока данных. Контрольные суммы считаются по любому объекту, не только по
блоку данных, но и по блоку адресации, и если в блоке адресации из-за сбоя при хранении
оказался неверный адрес, то система сама определит, что адрес неверный и ошибочные
данные просто не будут выданы по запросу (рис. 10).
66
Рис. 10: Дерево данных и метаданных ZFS
67
Транзакционность
Транзакционность ZFS обеспечивается тем, как данные записываются на диск. Операции
записи группируются в транзакции, а те, в свою очередь – в группы транзакций. Каждая
транзакция, состоящая из операций записи в разные файлы, выполняется так: вначале в
свободные блоки пишутся данные, затем записываются метаданные, относящиеся к
модифицированным файлам; если запись не прошла до конца, изменения в файлах нигде не
будут учтены. Никакой коррекции метаданных в таком случае никогда не требуется, о
программе fsck можно забыть. Это иллюстрирует рис. 10. Применяемая в ZFS схема
называется “copy on write” (копирование-при-записи), что означает, что по ходу записи новых
данных старые не перезаписываются, а остаются записанными “рядом”, в других блоках, и
файл считается окончательно измененным только после изменения всех метаданных.
Это – существенное преимущество ZFS по сравнению с журналируемыми файловыми
системами, которые широко используются в последние годы во всех операционных системах.
Дело в том, что при наличии журнала возможна ситуация, когда приложение инициировало
две последовательные операции записи на диск, и при этом одна прошла успешно, а до
завершения второй произошел, скажем, сбой питания. В такой ситуации файл на диске
окажется “недомодифицированным”, хотя благодаря журналу метаданные могут остаться
согласованными.
В случае с ZFS файл никогда не будет считаться модифицированным до того, как все
метаданные – с самого нижнего уровня адресации до самого верхнего – не будут корректно
изменены.
Легкость администрирования
Следствием продуманной концепции ZFS стало значительное облегчение работы
администраторов с ней. В самом деле, например, для добавления дискового пространства
достаточно дать одну-единственную команду, включающую в пул новый накопитель.
Но самое впечатляющее – это то, что теперь можно делать резервные копии всей файловой
системы в разгар работы, мгновенно, и всего одной командой! Подробности рассказаны
ниже, в разделе “ZFS в работе” в секции “снимки и резервное копирование”.
ZFS в работе
● пул (пул памяти) – набор виртуальных устройств для размещения на них данных
● данные – информация, хранимая в файлах, каждый из которых имеет имя; в отличие
от метаданных, которые хранятся в выделенных блоках и не имеют имен.
● Метаданные – служебная информация, описывающая объект; например, если объект –
это файл, то метаданные включают набор прав доступа к файлу (access control list), тип
файла, размер файла, время модификации файла, информацию о виртуальных блоках,
68
в которых размещен файл и т.п.
● RAID-Z – массив дисков, на которые записываются данные и соответствующие им
избыточные блоки четности; в ZFS реализованы одинарная и двойная избыточность,
позволяющие исправлять однократные и двукратные ошибки в данных соответственно
● моментальный (или мгновенный) снимок – зафиксированное на определенный момент
времени состояние файловой системы – всех данных и метаданных
● клон файловой системы – ее моментальный снимок, в который разрешена запись
● набор данных (dataset) – файловая система, моментальный снимок, клон файловой
системы.
Виртуальные устройства
69
Виртуальные устройства образуют древовидную структуру, листьями которой являются
физические устройства. Каждый пул имеет специальное логическое виртуальное устройство,
которое считается корневым (root). Все прямые потомки корневого устройства называются
виртуальными устройствами верхнего уровня. Рисунок 11 показывает дерево виртуальных
устройств некоего пула, содержащего два зеркала. Первое зеркало, M1, содержит два диска, A
и B. Второе зеркало, M2, содержит другие два диска, С и D. Виртуальные устройства A, B, C,
D – это физические виртуальные устройства. M1 и M2 – логические виртуальные устройства,
которые являются виртуальными устройвами верхнего уровня, так как они находятся
непосредственно под корневым виртуальным устройством.
Метка виртуального устройства служит двум целям: предоставлению доступа к пулу в целом
и проверке его целостности и доступности устройств в нем. Чтобы метка всегда содержала
70
актуальную информацию и могла быть прочтена, используются принципы избыточности и
поэтапного изменения: на каждом физическом виртуальном устройстве хранится четыре
копии метки устройства (избыточность), и (для гарантии актуальности) эти копии
изменяются поэтапно.
Избыточность
На каждом физическом виртуальном устройстве в пуле хранится четыре копии метки
устройства. За исключением короткого времени во время изменения метки, все четыре копии
идентичны и любая из них может быть использована для доступа к пулу и проверки его
содержимого. Когда устройство добавляется в пул, ZFS помещает две метки в начало
устройства и две – в конец. Рисунок 12 показывает метки, размещенные на диске размера N:
L0 и L1 – метки в начале диска, метки L2 и L3 – в конце.
71
Рис. 13: Элементы метки виртуального устройства (свободное место, заголовок
загрузочного блока, пары имя/значение, массив uber-блоков)
ZFS поддерживает и метки диска VTOC, и метки EFI в качестве допустимых описателей
разметки диска. Метки EFI пишутся в отдельную область диска, а метки VTOC – в первые
8Кб первого раздела диска. Поэтому из сообржений совместимости первые 8 Кб метки
виртуального устройства оставлены пустыми.
Uber-блок
Сразу за списком имен/значений в метке виртуального устройства идет массив uber-блоков.
Uber-блок – это часть метки, необходимая для того, чтобы иметь доступ к содержимому
пула10. В каждый момент времени всего один uber-блок в пуле считается активным, а именно
тот, который имеет самый большой номер группы транзакций и корректную контрольную
сумму, рассчитанную по алгоритму SHA-256.
72
Рис. 14: Массив uber-блоков; содержимое uber-блоков
ub_magic
Специфическое поле, 64-битное целое, идентифицирующее данное устройство как
содержащее данные ZFS. Значение поля – 0x00bab10c (oo-ba-block, произносится схоже с
uberblock). Таблица показывает значения поля в зависимости от порядка байт так, как они
записываются на диски:
ub_version
Поле используется для указания формата, в котором на диске хранятся данные. В настоящее
время определено только значение 0x1. Это поле должно содержать то же значение. что и
поле “version”, описанное в разделе 1.3.3.
ub_txg
11 здесь и далее мы переводим термин big endian (в младших адресах памяти располагаются более значимые
байты) как “тупоконечный” и little endian (в младших адресах памяти располагаются менее значимые байты)
как “остроконечный” порядки байт. Тупоконечный порядок характерен для процессоров SPARC, а
остроконечный – для Intel и AMD. Термины я впервые услашал от Игоря Николаева из СПбГУ при
обсуждении того, что переводы “обратный” и “прямой” порядок неявно подразумевали некую
“правильность” того или иного варианта, в то время как на самом деле и тот, и другой порядки имеют равное
право на существование.
73
Все операции записи в ZFS выполняются группами транзакций. Каждая группа
ассоциируется с определенным номером транзакции. Значение ub_txg показывает, в пределах
какой группы транзакций был записан этот uber-блок. Чтобы это значение считалось
корректным, надо, чтобы оно должно быть больше или равно значения поля txg, хранящегося
в nvlist для этой метки виртуального устройства.
ub_guid_sum
Это поле служит для проверки доступности устройств внутри пула.
Пока пул используется, драйвер ZFS пробегает все физические устройства пула и суммирует
значения GUID с каждого устройства в пуле (значение хранится в паре имя/значение с
именем guid в списке пар имя/значние, как описано в разделе 1.3.3). Подсчитанная сумма
сравнивается с ub_guid_sum для того, чтобы подтвердить доступность все устройств в пуле.
ub_timestamp
Время, когда был записан этот uber-блок - в секундах, отсчитанное с 1 января 1970 (часовой
пояс UTC).
ub_rootbp
ub_rootbp - это структура blkptr, содержащая расположение MOS. И MOS, и blkptr описаны в
главах 4 и 2 этого документа соответственно.
74
Рис. 15: Побайтовая структура указателя блока
75
адресов в указателе блока основано на политике12 файловой системы и называется
“шириной” указателя блока, обычный указатель (1 DVA), указатель двойной ширины (2 DVA)
и тройной ширины (3 DVA).
Поле vdev (32-разрядное целое) каждого DVA в указателе блока однозначно идентифицирует
виртуальное устройство, на котором хранится блок. Поле offset (63-разрядное цулое) – это
адрес блока на устройстве, отсчет начинается сразу после меток виртуального устройства L0
и L1 и загрузочного блока – в пределах того устройства, на котором хранятся данные. Vdev и
offset вместе определяют уникальное адрес блока данных. В поле offset указывается адрес в
секторах (т.е. в кусках пространства по 512 байт).
Для того, чтобы найти смещение физического блока в байтах от начала раздела (slice),
значение поля offset следует сдвинуть влево на 9 разрядов (29 =512) и затем сложить с
0x400000 (размер двух меток устройства vdev_label и загрузочного блока):
GRID
Поле зарезервировано для последующего использования в отказоустойчивах конфигурациях
Raid-Z.
GANG
Группирующий (gang) блок – это блок, содержащий указатели на блоки. Группирующие
блоки используются в случае если запрошенное дисковое пространство невозможно
выделить одним непрерывным блоком. В этом случае выделяются несколько блоков
меньшего размера так, чтобы их суммарный размер был равен запрошенному, и создается
группирующий блок, в котором будут храниться указатели для выделенных блоков.
Приложению, которое запросило дисковое пространство, возвращается указатель на
группирующий блок, что создает у него “ощущение” того, что ему выделен единственный
блок.
0 обычный блок
1 группирующий блок
Табл. 9: Значения бита G
Группирующий блок имеет размер 512 байт и сам содержит свою контрольную сумму. Он
может содержать до 3 указателей на блоки, за которыми следует 32-разрядная контрольная
сумма. Формат группирующего блока описывает следующая структура:
12 по состоянию на август 2007 года политика такая: самые важные метеданные пишутся с тройным
резервированием (3DVA), менее важные метаданные – с двойным (2 DVA), а просто данные – без
резервирования вовсе (1 DVA).
76
typedef struct zio_gbh {
blkptr_t zg_blkptr[SPA_GBH_NBLKPTRS];
uint64_t zg_filler[SPA_GBH_FILLER];
zio_block_tail_t zg_tail.;
} zio_gbh_phys_t;
typedef zio_cksum {
uint64_t zc_word[4];
}zio_cksum_t;
77
comp (Сжатие)
ZFS поддерживает несколько алгоритмов сжатия. Какой тип сжатия использовать для данного
блока, определяется полем comp указателя блока:
Размер блока
Размер блока определяется тремя разными полями в указателе блока:
psize, lsize, and asize.
lsize: логический размер. Показывает размер данных без учета сжатия, программного
RAID (RAID-Z) или накладных расходов, связанных с группирующими блоками (gang).
psize: физический размер блока на диске после сжатия
asize: фактически занятое данными пространство, общий размер всех блоков, занятых
для хранения этих данных, включая заголовки группирующих блоков или блоки
четности RAID-Z.
Если сжатие данных не включено, и ZFS организовано без RAID-Z, то значения lsize, asize,
и psize одинаковы. Все эти значения записываются как количество 512-байтных секторов
минус один, которые занимает блок.
Endian Value
Little Endian 1
Big Endian 0
Табл. 12: Значения поля E (порядок байт в слове)
ZFS легко адаптируется к переносу между компьютерами разной архитектуры, даже если в
них используется различный порядок байт в слове – тупоконечный (big endian, в младших
адресах памяти располагаются более значимые байты, SPARC) или остроконечный (little
endian, в младших адресах памяти располагаются менее значимые байты, x86). Поле E
указателя блока (от Endianness) содержит 1 для блока, записанного в остроконечном порядке
байт (x86), и 0 – для блока, записанного в тупоконечном порядке (SPARC). Данные всегда
пишутся на диск в формате того компьютера, на котором это происходит. Если пул
перемещается из компьютера с одним порядком байт на компьютер с другим порядком байт,
содержимое блока конвертируется в новый порядок при чтении, а на диске старое
содержимое остается в прежнем формате.
78
Типов немало, и они перечислены в таблице 13.
Тип Значение
DMU_OT_NONE 0
DMU_OT_OBJECT_DIRECTORY 1
DMU_OT_OBJECT_ARRAY 2
DMU_OT_PACKED_NVLIST 3
DMU_OT_NVLIST_SIZE 4
DMU_OT_BPLIST 5
DMU_OT_BPLIST_HDR 6
DMU_OT_SPACE_MAP_HEADER 7
DMU_OT_SPACE_MAP 8
DMU_OT_INTENT_LOG 9
DMU_OT_DNODE 10
DMU_OT_OBJSET 11
DMU_OT_DSL_DATASET 12
DMU_OT_DSL_DATASET_CHILD_MAP 13
DMU_OT_OBJSET_SNAP_MAP 14
DMU_OT_DSL_PROPS 15
DMU_OT_DSL_OBJSET 16
DMU_OT_ZNODE 17
DMU_OT_ACL 18
DMU_OT_PLAIN_FILE_CONTENTS 19
DMU_OT_DIRECTORY_CONTENTS 20
DMU_OT_MASTER_NODE 21
DMU_OT_DELETE_QUEUE 22
DMU_OT_ZVOL 23
DMU_OT_ZVOL_PROP 24
Табл. 13: Типы объектов
Уровень (lvl)
Это поле содержит число уровней до этого блока, т.е. количество указателей блоков, которые
надо просмотреть для того, чтобы добраться до данных в текущем блоке.
79
Номер породившей блок группы транзакций (birth txg)
64-битное целое поле birth txg (birth transaction) содержит номер группы транзакций, в ходе
которой данный блок был занят под информацию.
Заполнители (padding)
Три блока-заполнителя в указателе блоков зарезервированы для использования в будущем.
80
программ – не уйдет ли на резервное копирование все рабочее время?
Функциональность мгновенных снимков системы (sbapshots) дает возможность
зафиксировать состояние всей файловой системы на определенный момент времени (причем
гарантированно – все файлы фиксируются в том виде, в котором они существовали в ту
конкретную наносекунду, когда вы потребовали сделать snapshot).
А чему радоваться разработчику? Да это же настоящая находка – не надо никаких средств
архивирования версий; достаточно создать по мгновенному снимку на каждую версию
разрабатываемой программы, и двигаться дальше. Все версии ваших файлов будут сохранены
автоматически.
Разумеется, мгновенные снимки требуют места на диске – за функциональность приходится
платить. Но так как мгновенный снимок не требует копирования всех файлов (фактически
новое место требуется только под измененные после “фотографирования” файлы), то и
накладные расходы куда меньше, чем при резервном копировании всей файловой системы на
соседний диск или ленту. Плюс к тому, мгновенный снимок и создается мгновенно, никакой
траты времени на перезаписывание гигабайтов данных нет.
Сделать моментальный снимок файловой системы проще простого: он создается при
помощи команды zfs snapshot, которой следует указать имя создаваемого моментального
снимка. Имя моментального снимка указывается как filesystem@snapname:
# zfs snapshot pool/home/ahrens@friday
Создать моментальные снимки всех подчиненных файловых систем можно при помощи
ключа -r.
Мгновенные снимки можно использовать для резервного копирования; и – внимание! - все
это на лету, без перехода в однопользовательский режим, в том числе – с версии Solaris
Express build 62 – и для корневой файловой системы!
Как же это устроено внутри файловой системы? Что происходит при создании мгновенного
снимка?
Как видно из рис. 2, при перезаписи файла блоки с его старым содержимым остаются
неизменными. Ничто не мешает в любой момент потребовать от системы сохранить старое
состояние всего дерева блоков файловой системы, включая метаданные. Более того,
моментальный снимок занимает мало места, так как данные, которые не изменялись с
момента создания снимка, попросту являются общими и для рабочей файловой системы, и
для снимка.
Кроме моментальных снимков можно создавать клоны файловой системы – снимки с
возможностью записи в них. Когда в любом из клонов изменяются данные, новые блоки
оказываются своими для каждого из клонов, но неизмененые данные хранятся в блоках,
общих для всех клонов.
RAID-Z
Для этого в ZFS предусмотрена реализация RAID-Z – это организация программного RAID-
массива с блоками переменной длины. Переменная длина дает значительный выигрыш в
производительности, но меняет алгоритм восстановления данных, поскольку каждый блок в
массиве может иметь разную длину. Кроме этого, в отличие от традиционных массивов
RAID, в ZFS можно организовать не только однократный, но и двукратный контроль
81
четности, и это защищает от одновременного сбоя двух физических носителей.
Легко видеть, что ZFS в самом деле гарантирует сохранность данных, если у вас достаточно
надежное оборудование – по крайней мере один диск в запасе. Кстати, ZFS поддерживает и
диски “горячего резерва” (spare disks), на которые ничего не записывается до момента, когда
один из рабочих дисков RAID-Z выйдет из строя. Зато как только понадобится, сбойный диск
будет исключен из пула дисков, а диск горячего резерва немедленно включен туда.
Если же диск не дает сбоев в целом, но какая-то часть даных оказалась повреждена (т.е.
контрольные суммы не соответствуют данным), то происходит автоматическая запись на
сбойный диск данных с “правильного” диска, как показано на рис. 16. Ошибочный блок
данных показан красным цветом, корректный – зеленым. Вначале при выполнении чтения
обнаруживается ошибочный блок (расхождение с контрольной суммой), приложению
передается корректный блок данных с другого диска в зеркале, и затем сбойный блок на
первом диске замещается корректным.
Резервирование метаданных
Все метаданные в ZFS пишутся на диск в нескольно разных мест, для большей
отказоустойчивости. В зависимости от ценности метаданных, делается три или – как
минимум – две копии. В отличие от UFS, где на диск записывается несколько копий только
суперблока, здесь делаются копии всех метаданных, причем если в пуле несколько устройств,
ZFS старается разнести копии метаданных по разным устройствам.
82
масштабируемость ZFS
Максимальный размер файла, который можно сохранить в ZFS – 264 байт, т.е. 16 экзабайт.
Это в 18 миллиардов миллиардов ( 18,4 х 1018) раз больше, чем позволяют современные 64-
битные файловые системы. Максимальный размер одной файловой системы ZFS такой же -
264 байт. Если создавать по 1000 файлов в секунду, то для достижения максимального
количества файлов в ZFS (248 штук) понадобится примерно 9000 лет. Нетрудно видеть, что
ZFS действительно создавалась так, чтобы избежать скорого достижения лимитов!
Автор проекта ZFS Джефф Бонвик (Jeff Bonwick) подсчитал, что на 100%-е заполнение
файловой системы ZFS потребуется больше энергии, чем для того, чтобы вскипятить океан.
[3]
Так, Сет Ллойд (Seth Lloyd) в 2000 году в статье “Ultimate physical limits to computation” [4]
показал, что 1 килограмм материи, ограниченный 1 литром объема, может произвести не
более чем 1051 операций над не более чем 1031 битами информации. Заполненный дло отказа
128-битный пул памяти будет содержать 2128 блоков = 2137 байт = 2140 бит. Минимальная масса,
которая вместит такое количество информации будет равна (2140 бит) / (1031 бит/кг) = 136
миллиардов килограммов.
Если вспомнить известную формулу зависимости массы и энергии E=mc2 и представить
массу такого компьютера в форме энергии, это составит 1.2x1028джоулей.
Известно, что масса всех океанов на планете примерно равна 1.2x1028
кг, и что для того, чтобы превратить в кипяток 1 кг льда требуется 400 000 джоулей, причем
скрытая энергия на испарение добавит еще 2 000 000 джоулей на килограмм, итого 2,4х106
джоулей на килограмм. Стало быть, для испарения океанов надо порядка 2.4x106 Дж/кг *
1.4x1021 кг = 3.4x1027 Дж.
Выходит, заполнить 128-битную файловую систему действительно сложнее, чем вскипятить
океан!
Конечно, в этом расчете Джефф не учел, что океан не находится в замороженном состоянии,
но – согласитесь – потенциальный объем ZFS все равно впечаталяет! И вряд ли в ближайшие
несколько десятилетий бизнес, выбравший ZFS, будет сталкиваться с проблемой
переполнения файловой системы – скорее уж перестанет хватать электричества для питания
дисковых массивов!
производительность ZFS
Удивительно, но все эти возможности достались нам в ZFS без снижения
производительности: для этого используется несколько важных технологий, среди которых
конвейерный механизм ввода - вывода, подобный конвейерам центрального процессора.
Каждая операция ввода-вывода имеет свой приоритет и связанный с ним крайний срок
выполнения. Чем выше приоритет, тем ближе крайний срок. С крайним сроком выполнения
связывается логический адрес блока (LBA) для операции записи – чем более поздний срок ей
назначен, тем меньше будет значение LBA: так достигается практически линейное движение
по диску по мере выполнения все менее и менее “срочных” операций. Операции чтения с
диска имеют больший приоритет, чем операции записи, потому что при записи асинхронный
вызов write() возвратит управление приложению как только данные попадут в кэш, а вызов
read() синхронный, потому что приложение вынуждено ждать, пока ему будут выданы
данные с диска.
83
Кроме этого, ZFS осуществляет интеллектуальную предвыборку, подбирая схему
предвыборки для каждого потребителя данных в отдельности, в отличие от других систем,
которые делают предвыборку всегда одинаково – в расчете на последовательный доступ к
данным.
При записи ZFS старается писать данные в последовательные блоки, благо схема copy-on-
write исключает модификацию уже заполненных данными блоков. ZFS также поддерживает
параллельную запись в один файл. Кроме этого, ZFS выбирает размер блока – от 512 байт до
128 Кбайт исходя из воображений производительности диска, а не его размера.
Когда в системе несколько устройств, ZFS балнсирует нагрузку на них так, чтобы
задействовать каждое с максимальной продуктивностью, и при добавлении нового диска к
пулу автоматически заполняет его новыми данными так, чтобы достичь максимальной
скорости доступа к данным. Если какое-то устройство в пуле замедлилось из-за сбоя или
заполнения значительной части его объема, ZFS старается не записывать на него новых
данных, чтобы не снижать общую скорость системы.
Вот еще некоторые приемы, которые помогают повысить производительность ZFS – пусть не
всегда, но в определенных случаях.
Пустые блоки, если файл содержит таковые, не копируются физически при копировании
файла.
В чем здесь идея? Предположим, мы записали 1 байт в начале файла, затем отступили от
начала 1 гигабайт, и записали еще один значимый байт в файл. Получили файл размером в 1
гигабайт и 1 байт, который в середине содержит гигабайтное пространство, заполненное
нулями. При копировании такого файла нет смысла переписывать все эти нули, это бы
значительно снизило скорость операции. Поэтому было найдено решение, логично
вытекающее из структуры ZFS: файл в ZFS – это дерево блоков, каждый блок косвенной
адресации содержит поле, в котором указывается число блоков, лежащих одним уровнем
ниже него (см. рис. “Файл с нулевыми блоками внутри”) [5].
Строго говоря, как именно обращаться с файлами, содержащими обширные поля нулей
внутри себя, решает не файловая система, а каждое приложение индивидуально. В случае с
ZFS файловая система умеет работать с расширенной функцией lseek, в которой
поддерживаются операции SEEK_HOLE (найти следующую область нулей, размером не
менее переданного lseek аргумента) и SEEK_DATA (найти следующую за областью нулей
область единиц, не менее переданного аргумента размером). В Solaris такая
функциональность реализована, а пользоваться ей или нет – дело разработчика программы.
L4 6
-----------------------------------
L3 5 0 1
----------- ----------- -----------
L2 3 0 2 0 0 1
--- --- --- --- --- ---
84
L1 111 101 001
Рис. Файл с нулевыми блоками внутри (рисунок взят из [5]). Файл состоит из 9 блоков, три
из которых на 100% заполенны нулями.
Еще один момент: место под файл выделяется согласно простому, но эффективному
эмпирическому алгоритму; при выборе блоков для размещения файла выбираются вначале
устройство, на которое будет происходить запись, затем область диска – более удаленая от
центра диски или менее удаленная, и наконец – собственно блоки. Выбор делается в
соответствии с весом каждого устройства, области и блока; вес определяется по правилам,
которые в следующих версиях ZFS могут измениться для повышения эффективности.
Текущие правила, например, включают предпочтительность записи данных на свободные
внешние дорожки дисков, потому что конструкция современных дисков дает двукратное
превышение пропускной способности диска при такой записи – по сравнению с внутренними
дорожками. Естественно, что это некие усредненные данные - на практике реальный прирост
производительности будет зависеть от размера записываемого блока, от размера файла, от
конструкции диска и от того, как соотносится размер кэша диска с размером файла и блока.
Что касается цифр, то любое тестирование можно провести так, чтобы нужный продукт
выглядел более выигрышно. Поэтому все, что я считаю важным подчеркнуть в отношении
известных результатов тестирования ZFS, сводится к перечню тестовых операций, в которых
она уже показала значительное (2-6 раз) превышение производительности по сравнению с
UFS: [6]
● открытие файла, резервирование пространства под его расширение и однократная
запись в файл
● последовательная модификация (перезапись) всех данных в файле порциями по 32К
● создание файла размером в ½ свободной памяти посредством записи в него порциями
по 1Мб, затем двукратное последовательное чтение всего файла
● параллельная синхронная запись в 100-мегабайтный файл четырьмя потоками
Разумеется, количество тестов будет расти с ростом промышленного использования ZFS, так
что в скором времени появятся новые результаты тестов.
Перейдем к делу: как создать пул памяти ZFS, как смонтировать файловые системы и как
модифицировать созданные системы?
Создание пула giant из двух дисков - c1t0d0 и c1t1d0
# zpool create giant c1t0d0 c1t1d0
85
# zpool create giant mirror c1d0 c2d0
Для создания массива с двойным контролем четности надо вместо raidz указать raidz2.
Уничтожить пул можно командой zpool destroy. Осторожно: она уничтожает пул, даже если
в нем содержатся смонтированные наборы данных.
# zpool destroy giant
Добавление устройства в пул – команда zpool add, например для добавления еще двух
устройств к зеркалу giant надо скомандовать
zpool add giant mirror c2t1d0 c2t2d0
После создания пула пора создавать файловые системы, которые будут размещаться в нем -
командой zfs create, которой требуется аргумент - имя файловой системы; оно указывается
как путь, начиная с имени пула: pool-name/[filesystem-name/]filesystem-name
Имя пула и исходные имена файловой системы в пути идентифицируют то местоположение,
где будет создана новая файловая система. Все файловые системы верхнего уровня уже
должны существовать в пуле. Последнее имя в пути идентифициреут имя создаваемой
файловой системы.
Так мы создаем файловую систему oracle в файловой системе giant/home.
# zfs create giant/home/oracle
Если создание файловой системы прошло успешно, система ZFS автоматически монтирует
ее. По умолчанию точкой монтирования считается путь, указанный в zfs create. В
нашемпримере вновь созданная файловая система oracle монтируется в
/giant/home/oracle.
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
dbspace 340G 162G 178G 47% ONLINE -
samba 204G 134G 69.9G 65% ONLINE -
usrdb 68G 27.3G 40.7G 40% ONLINE -
86
введена еще одна интересная возможность, резервирование места для файлов пользователя.
В самом деле, если вы знаете, что пользователь oracle или mail нуждается в хранении
большого количества данных, удобно гарантировать ему это хранение независимо от чьих-то
аппетитов по выкачиванию видео из Сети.
Для резервирования в ZFS следует дать несколько простых команд (только надо помнить, что
зарезервировать можно только свободное место, если его уже не хватает, то вначале надо
удалить лишнее):
# zfs set reservation=4G pool/home/oracle
# zfs get reservation pool/home/oracle
NAME PROPERTY VALUE SOURCE
pool/home/oracle reservation 4.00G local
Нельзя зарезервировать для пользователя больше места, чем дозволено квотой. При
резервировании размер зарезервированного пространства определяется последней по
порядку командой zfs set reservation, значения последовательных команд НЕ
складываются.
Литература
1: Bernd Panzer-Steindel, Data integrity, , http://indico.cern.ch/getFile.py/access?
contribId=3&sessionId=0&resId=1&materialId=paper&confId=13797
2: , ZFS on-disk specification, 2006,
http://opensolaris.org/os/community/zfs/docs/ondiskformat0822.pdf
3: , , , http://en.wikipedia.org/wiki/ZFS
4: Seth Lloyd, Ultimate physical limits to computation, 2000
5: Jeff Bonwick, , , http://blogs.sun.com/bonwick/
6: , , , http://blogs.sun.com/roch/entry/zfs_to_ufs_performance_comparison
87