Диски и файловые системы
Важность управления файловыми системами и дисками трудно переоценить. (Попробуйте переоценить их важность, а я подожду.) Для операционной системы надежность и гибкость работы с дисками должны быть первостепенно важны, потому что на дисках хранятся ваши данные. Операционная система FreeBSD предоставляет выбор файловых систем и различных вариантов их обслуживания. В этой главе мы рассмотрим типичные компоненты, с которыми имеет дело системный администратор.
Жесткие диски
Большинство воспринимают жесткий диск как «черный ящик». При неаккуратном обращении можно добиться того, что жесткий диск будет визжать и греметь, а при очень плохом обращении из него может пойти дымок и он просто выйдет из строя. Чтобы по-настоящему понимать, что такое файловые системы, вам необходимо немножко понимать, что происходит внутри привода. Если у вас есть старый жесткий диск, который вам больше не нужен, вскройте его корпус и читайте дальше.
Внутри корпуса накопителя на жестких магнитных дисках находится стопка круглых алюминиевых или пластиковых дисков, которые обычно называют пластинами. Во время работы привода эти пластины вращаются со скоростью несколько тысяч оборотов в минуту. Число RPM (revolutions per minute), которое приводится на корпусе жесткого диска, – это и есть скорость вращения пластин. Пластины покрыты тонким слоем магнитного материала. Этот магнитный материал распределен по тысячам концентрических колец, которые называются дорожками (tracks). Они располагаются как годичные кольца в стволе дерева, от сердцевины к внешнему краю. На этих дорожках и хранятся данные в виде последовательностей нулей и единиц. Каждая дорожка делится на секторы. Сектора на внешних дорожках вмещают больше данных, чем на внутренних, и скорость чтения данных, записанных не внешних дорожках, также выше, потому что каждая точка на внешней дорожке имеет более высокую линейную скорость.
Головки, смонтированные над каждой из пластин, записывают и считывают данные с вращающихся пластин точно так же, как игла патефона. Головки могут выполнять чтение и запись очень быстро, но им приходится ждать, пока под ними не окажется нужная позиция на диске. Производительность накопителей на жестких магнитных дисках в основном зависит от скорости вращения пластин, вот почему такой показатель, как скорость вращения, имеет важное значение.
ATA, SATA, SCSI и SAS
Я полагаю, вы уже знакомы с основными понятиями технологии хранения данных на жестких дисках. Если еще нет, тогда я рекомендую провести некоторое время в Интернете и прочитать что-нибудь по этой теме, например статьи в Wikipedia. Я иногда буду ссылаться на эти понятия, но рассказ о том, что такое LUN или SCSI ID, – это тема отдельной книги.
Файлы устройств
В главе 3 мы коротко коснулись файлов устройств, а теперь рассмотрим их более подробно. Файлы устройств – это специальные файлы, представляющие аппаратные средства системы. Они служат логическим интерфейсом между пользовательскими программами с одной стороны и драйверами устройств или физическими устройствами – с другой. Выполняя команду с файлом устройств, посылая информацию файлу устройств или читая данные из него, ядро выполняет те или иные операции с физическим устройством. Для разных устройств эти операции могут существенно различаться, – в конце концов, запись данных на диск дает совсем другие результаты, нежели передача данных звуковой карте. Файлы устройств можно найти в каталоге /dev.
Чтобы приступить к работе с диском или дисковыми разделами, необходимо знать имя устройства или имя файла, который представляет это устройство. Как правило, они основаны на имени драйвера соответствующего аппаратного средства, а имена драйверов устройств, в свою очередь, основаны на названии микросхемы, применяемой в устройстве, а не на его назначении.
В табл. 8.1 приводятся наиболее типичные файлы устройств дисковых накопителей. Более подробное их описание вы найдете в соответствующих страницах руководства.
Файлы устройств 271 Таблица 8.1. Дисковые накопители и типы
Файл устройства
/dev/fd* /dev/acd* Накопители на гибких магнитных дисках CD-ROM с интерфейсом IDE
/dev/ad* /dev/cd* Жесткие диски ATA и SATA и разделы CD-ROM с интерфейсом SCSI
/dev/da* Жесткие диски с интерфейсом SCSI или SAS, устройства хранения данных с интерфейсом USB и flash-накопители
Для отдельных дисков, подключенных к аппаратным контроллерам RAID, файлы устройств не используются. Вместо этого контроллеры RAID представляют по виртуальному диску для каждого контейнера RAID, для чего к имени драйвера RAID добавляется имя устройства. Например, драйвер amr(4) представляет такие виртуальные диски, как /dev/amrd*. Для работы с некоторыми контроллерами RAID используется промежуточный уровень абстракции cam(4), и в этом случае диски отображаются как устройства /dev/da*.
Жесткие диски и разделы
В главе 2 мы уже рассматривали понятие раздела, теперь мы посмотрим на разделы с точки зрения драйвера устройства. Первый диск ATA, подключенный к первому контроллеру ATA, называется /dev/ad0. За ним следуют диски /dev/ad1, /dev/ad2 и т. д. Подразделы на каждом диске начинаются с этого имени. К данному названию добавляются дополнительные символы, например /dev/ad0s1b. Диск можно считать одним целым, но в каталоге /dev, как правило, есть масса файлов подразделов, начинающихся с /dev/ad0:
# ls /dev/ad*
/dev/ad0 /dev/ad0s1a /dev/ad0s1c /dev/ad0s1e /dev/ad0s1 /dev/ad0s1b /dev/ad0s1d /dev/ad0s1f
Итак, что означают все эти подразделы? Вспомните, как вы распределяли дисковое пространство для FreeBSD. Если вы следовали рекомендациям этой книги, весь диск отдан FreeBSD. А может быть, вы создали второй раздел для другой операционной системы или даже разбили диск на две секции FreeBSD. В мире Microsoft и Linux эти секции называются разделами (partitions), а на территории FreeBSD – участками (slices). Символы s1 в предыдущем листинге представляют большие разделы, или участки. Диск ad0, представленный в листинге, имеет один участок ad0s1, который разбит на подразделы, отмеченные символами.
Во FreeBSD раздел – это сегмент внутри участка. Разделы внутри участка создаются во время установки системы. Каждый раздел имеет уникальный файл устройства, название которого образуется добавлением уникального символа к названию файла участка. Например, разделы внутри участка /dev/ad0s1 представлены как /dev/ad0s1a, /dev/ ad0s1b, /dev/ad0s1c и т. д. Каждому разделу, создаваемому во время установки системы (/usr, /var и другим), назначается соответствующий файл устройства.
Название файлу устройства, соответствующего тому или иному разделу, можно давать произвольным образом с некоторыми ограничениями. Традиционно файл устройства, имя которого заканчивается на a (в нашем примере /dev/ad0s1a), – это корневой раздел (root), а файл с замыкающим символом b (/dev/ad0s1b) предназначен для раздела свопинга. Метка c служит признаком всего участка, от начала до конца, а символы от d до h можно назначить любому разделу по своему усмотрению. В одном участке может быть не больше восьми разделов, а на одном диске – не больше четырех участков. Например, файл устройства /dev/ad0s1a соответствует диску с номером 0, участку 1, разделу 1 и, возможно, файловой системе root. Файл устройства /dev/ ad1s2b указывает на диск 2 и, возможно, участок свопинга.
Для приводов, отличных от ATA, вместо /dev/ad следует подставить соответствующие названия устройств.
Нумерация дисков ATA
То, что первый диск ATA будет называться /dev/ad0, вовсе не означает, что у вас обязательно должен быть установлен жесткий диск /dev/ad0. В моем ноутбуке жесткий диск имеет имя /dev/ ad4, потому что он подключен не к встроенному контроллеру ATA, а к контроллеру RAID. Жесткие диски SCSI и SAS нумеруются немного иначе – первый диск получает название /dev/da0 независимо от того, куда он подключен. При необходимости можно заставить систему нумеровать жесткие диски ATA, начиная с 0, для этого достаточно удалить параметр ядра ATA_STATIC_ID.
Таблица файловых систем: /etc/fstab
Так как же операционная система отображает все эти имена устройств на разделы жесткого диска? С помощью таблицы файловых систем /etc/fstab. В этом файле каждая файловая система представлена отдельной строкой, в которой также находятся параметры, используемые командой mount(8). Ниже приводится пример одной из таких строк:
/dev/ad4s2a / ufs rw 1 1
Первое поле в каждой строке соответствует имени устройства.
Второе поле указывает точку монтирования, или каталог, в котором можно найти файловую систему. Каждый раздел, куда можно записывать файлы, подключается к точке монтирования, например /usr, /var и т. д. Некоторые специальные разделы – например, разделы свопинга, могут не иметь точки монтирования (none). Вы не можете записывать файлы в пространство для свопинга, и вам придется решить, для каких целей будет использоваться раздел – либо для хранения файлов, либо для свопинга.
Далее следует тип файловой системы. Для стандартных разделов FreeBSD применяются файловые системы типа ufs (Unix Fast File System – быстрая файловая система UNIX). В примере ниже присутствуют swap (пространство для свопинга), cd9660 (CD) и nfs (Network File System – сетевая файловая система). Перед монтированием раздела необходимо знать, какая файловая система на ней находится. Легко догадаться, что попытка монтировать дискету DOS как файловую систему FFS не даст удовлетворительных результатов.
В четвертом поле представлены параметры mount, которые применяются для данной файловой системы. Они описывают, как ядро должно интерпретировать файловую систему. Далее параметры монтирования будут обсуждаться более подробно, а здесь рассмотрим несколько специальных параметров, применяемых только в /etc/fstab:
ro
rw
noauto
Файловая система не будет монтироваться автоматически во время начальной загрузки или при запуске mount –a. Этот параметр применяется для приводов на сменных носителях, в которых во время загрузки системы может не оказаться сменного носителя.
Пятое поле сообщает программе dump(8), надо ли в этой файловой системе выполнять дамп. Если значение в этом поле равно 0, программа dump не будет сохранять файловую систему. Если в поле стоит ненулевое значение, то заданное число определяет минимальный уровень дампа, необходимый для сохранения файловой системы. За более подробной информацией обращайтесь к главе 4.
Последнее поле Pass# сообщает системе, когда следует выполнять проверку целостности файловой системы во время начальной загрузки. Все файловые системы с одним и тем же значением Pass# проверяются утилитой fsck(8) параллельно. Только корневая файловая система имеет значение параметра Pass#, равное 1, и она проверяется первой. Все остальные файловые системы имеют значение 2 в этом поле, и это означает, что они будут монтироваться после корневой файловой системы.
Файловая система монтируется только для чтения. Даже root не может осуществлять запись в файлы этой файловой системы.
Файловая система монтируется для чтения-записи.
Пространство для свопинга и носители, доступные только для чтения, не требуют проверки на целостность, поэтому для них установлено значение 0.
Теперь, имея необходимые сведения, можно взглянуть на полный файл /etc/fstab.
# Device Mountpoint FStype Options Dump
/dev/ad4s1b none swap sw 0 0
/dev/ad4s2a / ufs /dev/ad4s1a /amd64 ufs /dev/ad4s1f /amd64/usr ufs /dev/ad4s1d /amd64/var ufs
Pass#
rw 1 1
rw 2 2
rw 2 2
rw 2 2
/dev/ad4s1e /tmp /dev/ad4s2e /usr /dev/ad4s2d /var à /dev/ad4s3d /home /dev/acd0 /cdrom
data:/mp3 /mp3
ufs rw 2 2
ufs rw 2 2
ufs rw 2 2
ufs rw 2 2
cd9660 ro,noauto 0 0
nfs rw,noauto,soft 0 0
Первая строка в этом листинге, /dev/ad4s1b , – это пространство для свопинга. Этот раздел никуда не монтируется, FreeBSD использует пространство для свопинга как дополнительную память.
Вторая строка – это корневой раздел. Обратите внимание на имя устройства – тогда как раздел для свопинга располагается в разделе b участка 1, корневая файловая система находится в разделе a участка 1. Корневой каталог и пространство для свопинга располагаются в разных участках!
Третий раздел – /dev/ad4s1a . Судя по имени, можно было бы ожидать, что в этом разделе будет размещаться корневая файловая система, но вместо этого он монтируется в каталог /amd64. Следующие два раздела также располагаются в участке 1, но монтируются в подкаталоги каталога /amd64.
Файловая система /tmp – это раздел в участке 1, который содержит файловую систему каталога /amd64.
Следующие строки, /usr и /var , – это обычные разделы в участке 2. Следующий раздел, /home à, располагается на том же диске, в участ-
ке 3, в разделе d. И откуда здесь взялся третий участок?
Привод компакт-дисков монтируется в каталог /cdrom . Во время за-
грузки это устройство автоматически не монтируется.
Последняя строка начинается не с имени файла устройства. Эта строка соответствует сетевой файловой системе (Network File System – NFS) и говорит, что в каталог /mp3 будет смонтирован раздел mp3, расположенный на удаленном компьютере с именем data. О сетевых файловых системах мы поговорим ниже, в этой же главе.
Эта таблица файловых систем была взята с компьютера, где установлено сразу две операционных системы: FreeBSD/i386 и FreeBSD/amd64.
Именно поэтому данная таблица выглядит не совсем обычно. Я могу получить доступ к файловой системе amd64 и пользоваться пространством для свопинга amd64 при работе в системе FreeBSD/i386.
Что смонтировано сейчас?
Если не все файловые системы монтируются во время загрузки и системный администратор может выполнять монтирование дополнительных файловых систем, как узнать, какие файловые системы смонтированы в настоящий момент? Запуск команды mount(8) без аргументов позволит увидеть список всех смонтированных файловых систем.
# mount
/dev/ad4s2a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad4s1e on /tmp (ufs, local, soft-updates) /dev/ad4s2e on /usr (ufs, local, soft-updates) /dev/ad4s2d on /var (ufs, local, soft-updates) /dev/ad4s3d on /usr/home (ufs, local, soft-updates)
Здесь мы видим, что почти все файловые системы представляют разделы UFS. Слово local говорит о том, что разделы находятся на локальном жестком диске, подключенном к данному компьютеру. Здесь также видно слово soft–updates, эта особенность реализована во FreeBSD и будет рассматриваться далее в этой главе. Если при монтировании разделов применяются такие функции, как NFS или SMB, они будут показаны в выводе.
Вызов mount(8) – еще один быстрый способ получить не только имена устройств для каждого из разделов, но и информацию об использовании некоторых других функций.
Монтирование и демонтирование дисков
Команда mount(8) монтирует файловые системы, размещенные на дисковых устройствах. Если вам прежде никогда не приходилось экспериментировать с монтированием файловых систем, перезагрузите систему FreeBSD, выберите однопользовательский режим и продолжайте чтение.
При загрузке в однопользовательском режиме система монтирует корневой раздел в режиме «только для чтения». Этот раздел содержит всю необходимую информацию для базовой настройки, запуска основных служб системы и поиска остальных файловых систем. Однако эти остальные файловые системы остаются не смонтированными, поэтому их содержимое недоступно. Попробуйте заглянуть в каталог /usr, и вы убедитесь, что этот каталог в однопользовательском режиме пуст. Система не потеряла содержимое этого каталога, просто раздел с этими файлами еще не смонтирован. Чтобы выполнить мало-мальски интересные операции в однопользовательском режиме, надо монтировать другие файловые системы.
Монтирование стандартных файловых систем
Чтобы вручную смонтировать файловую систему, перечисленную в файле /etc/fstab, например /var или /usr, нужно вызвать команду mount(8) и передать ей в качестве аргумента имя файловой системы, которую требуется смонтировать.
# mount /usr
Эта команда смонтирует раздел с учетом всех дополнительных параметров, перечисленных в файле /etc/fstab. Если необходимо смонтировать все файловые системы, перечисленные в /etc/fstab, можно вызвать команду mount(8) с ключом –a.
# mount —a
Монтирование с параметрами
Иногда бывает необходимо смонтировать файловую систему, которая расположена в необычном месте. У меня такая потребность обычно возникает при установке нового диска. В этом случае команде mount(8) следует передать имя монтируемого устройства и каталог, в который оно будет смонтировано. Например, если предположить, что раздел /usr находится на устройстве /dev/ad0s1e и мне необходимо смонтировать его в каталог /mnt, то я могу выполнить следующую команду:
# mount /dev/ad0s1e /mnt Демонтирование раздела
Для отключения файловой системы используется команда umount(8), которая сообщает операционной системе о необходимости демонтировать раздел. (Обратите внимание: команда называется umount, а не unmount.)
# umount /usr
Если файловая система используется какой-либо программой, демонтировать ее будет невозможно. Если вам не удалось демонтировать раздел, вполне возможно, что какая-то программа работает с ним. Демонтировать раздел не удастся и тогда, когда текущим рабочим каталогом является каталог в этом разделе.
Насколько заполнен раздел?
Чтобы узнать объем свободного пространства на каждом разделе, можно воспользоваться командой df(1). Эта команда выведет список смонтированных разделов, объем использованного пространства на каждом из них и точки монтирования. Один из неприятных моментов, связанных с командой df(1), заключается в том, что информация об объеме выводится в виде количества блоков, размером 1 Кбайт. Если раньше, когда диски были достаточно маленькими, это было вполне удобно, то сейчас числа получаются слишком большими, чтобы их можно было достаточно легко воспринимать одним взглядом. К счастью, команда df(1) имеет флаги –h и –H, которые вынуждают команду выводить информацию в удобочитаемом для человека виде. При использовании ключа –h один мегабайт вычисляется как степень 2 и составляет 1024 Кбайт, или 1 048 576 байт, а при использовании ключа – H мегабайт вычисляется как степень 10 и составляет 1000 Кбайт, или 1 000 000 байт. Сетевые администраторы и производители жестких дисков обычно используют степень 10, тогда как системные администраторы предпочитают использовать степень 2.1 Если вы обладаете достаточно богатым опытом работы, вы уже знаете, какой ключ выбрать. Я – сетевой администратор, поэтому вам придется следовать моим предпочтениям при исследовании примеров, независимо от того, что думает по этому поводу мой технический редактор.
# df —H Filesystem /dev/ad4s2a devfs /dev/ad4s1e /dev/ad4s2e /dev/ad4s2d /dev/ad4s3d
Size Used
520M 301M
1.0k 1.0k
520M 2.4M
11G 4.1G
1.0G 322M
49G 43G
Avail Capacity Mounted on
177M 63% /
0B 100% /dev
476M 0% /tmp
5.9G 41% /usr
632M 34% /var
2.0G 96% /usr/home
Здесь видны имена разделов, размер каждого раздела, объем использованного пространства, объем свободного пространства, процент использованного пространства и точки монтирования. Например, каталог /home в данной системе заполнен на 96% и имеет еще 2 Гбайт свободного пространства. Корневой раздел заполнен всего на 63%, но свободным осталось только 177 Мбайт.
Файловая система FFS занимает порядка 8% дискового пространства для нужд оптимизации. Это пространство используется при перемещении файлов и для уменьшения степени фрагментирования. При переполнении диска вы можете даже увидеть отрицательный объем свободного дискового пространства. Когда это происходит, производительность диска падает катастрофически. Поэтому лучше всегда оставлять на разделах немного свободного пространства, чтобы FFS могла постоянно дефрагментировать себя. Хотя существует возможность уменьшить размер пространства, резервируемого файловой системой, но это отрицательно сказывается на производительности, и поступать так будет неразумно. Если вы действительно хотите попробовать уменьшить объем резервируемого пространства, обращайтесь к команде tunefs(8).
Очевидный вопрос: «Что такого хранится на диске, что заняло столько места?» Если ваша система напоминает мою, использованное пространство на диске продолжает расти без каких-либо видимых причин. С помощью команды ls –l можно отыскать отдельные крупные файлы, но рекурсивно выполнять эту команду в каждом каталоге как минимум непрактично.
Объем использованного пространства в отдельном каталоге можно получить с помощью команды du(1). Сначала результаты, которые дает эта команда, кажутся непонятными и могут отпугивать неопытных пользователей. Ниже приводится пример использования du(1) для поиска чего-то, что занимает почти все место в моем домашнем каталоге:
# cd $HOME
# du
1 ./bin/RCS
21459 ./bin/wp/shbin10 53202 ./bin/wp
53336 ./bin
- 5 ./.kde/share/applnk/staroffice_52
- 6 ./.kde/share/applnk
…
Команда продолжает и продолжает выводить информацию, перечисляя каталоги и их размеры в блоках. В данном случае каталог $HOME/bin занимает 53 336 блоков, или порядка 53 Мбайт. Я мог бы устроиться поудобнее и позволить команде du(1) перечислить все каталоги и подкаталоги, но тогда мне придется переварить информации гораздо больше, чем мне требуется в действительности. Кроме того, блоки – это не совсем удобная единица измерения, особенно, когда числовые значения выравниваются по левому краю.
Попробуем вывести результаты в удобочитаемом виде. Во-первых, команда du(1) поддерживает флаг –h, как и команда df. Кроме того, мне совсем не требуется рекурсивное перечисление всех вложенных подкаталогов. Управлять глубиной вложенности можно с помощью ключа –d. Этот ключ принимает один аргумент – глубину вложенности подкаталогов, которые требуется перечислить в выводе. Например, при использовании ключа –d0 не будет перечислен ни один из вложенных подкаталогов, и команда просто выведет общий размер всех файлов в указанном каталоге.
# du —h —d0 $HOME
37G /home/mwlucas
В моем домашнем каталоге накопилось файлов на 37 Гбайт? Попробуем копнуть поглубже и найти наиболее объемный подкаталог.
# du —h —d1 38K ./bin 56M ./mibs …
34G ./mp3 …
Похоже, мне придется искать другое место для хранения своих данных, поскольку все файлы в моем домашнем каталоге слишком важны для меня, чтобы удалять их.
Если вам флаг –h чем-то не нравится, для поиска наиболее объемного подкаталога можно использовать команду sort(1), например так: du – kxd 1 | sort –n.
Fast File System
Операционная система FreeBSD в качестве основной использует файловую систему Fast File System (FFS), которая является прямой наследницей файловой системы, распространявшейся в составе BSD 4.4. Один из авторов исходной файловой системы продолжает развивать эту файловую систему FreeBSD, добавив немало интересных функциональных возможностей за последние годы. Иногда FFS FFS называют UFS (UNIX File System). Многие системные утилиты по-прежнему называют разделы FFS разделами UFS. FreeBSD – не единственная операционная система, где продолжает использоваться файловая система 4.4 BSD или производные от нее. Если производитель UNIX не заявляет явно о своей «улучшенной и усовершенствованной» файловой системе, то почти наверняка он использует FFS.
При разработке FFS предполагалось создать быструю и надежную файловую систему, которой по силам эффективно справляться с обычными (и необычными) ситуациями. FreeBSD поставляется с FFS, которая сконфигурирована в расчете на извлечение максимальной пользы из современных аппаратных средств, однако FFS можно оптимизировать для обслуживания триллионов маленьких файлов или полудюжины файлов размером 30 Гбайт. Знать детали внутренней организации FFS необязательно, но такие основные понятия, как блоки, фрагменты и индексные дескрипторы (inodes) знать необходимо.
Блоки – это сегменты диска, содержащие информацию. По умолчанию в системе FreeBSD блок имеет размер 16 Кбайт. Не все файлы имеют размеры, кратные 16 Кбайт, поэтому в файловой системе FFS для хранения остаточных кусков файлов используются фрагменты. Стандартный размер фрагмента составляет одну восьмую блока, или 2 Кбайт. Например, файл размером 20 Кбайт заполнит один блок и два фрагмента. Индексные дескрипторы – это специальные блоки, которые содержат базовую информацию о файлах, включая права доступа, размер и список блоков, занятых файлом. Данные, хранящиеся в индексных дескрипторах, называются метаданными. Это данные о данных (metadata). Такой способ хранения данных не уникален для FFS – другие файловые системы, такие как NTFS, также используют блоки для хранения данных и индексные дескрипторы. Однако в каждой файловой системе используется свой, уникальный принцип индексации.
Любая файловая система имеет определенное число индексных дескрипторов, число которых пропорционально размеру файловой системы. Современные диски могут иметь сотни тысяч индексных дескрипторов на каждом разделе, что необходимо для обеспечения возможности хранения сотен тысяч файлов. Если у вас имеется огромное число очень маленьких файлов, возможно, вам потребуется перестроить свою файловую систему, чтобы добавить в нее дополнительные индексные дескрипторы. Увидеть количество свободных индексных дескрипторов, доступных в файловой системе, можно с помощью команды du –i. Если вам действительно необходимо перестроить файловую систему, чтобы увеличить число индексных дескрипторов, обращайтесь к главе 18.
Виртуальные индексные дескрипторы
Во времена молодости UNIX, когда жесткие диски постоянно были подключены к компьютерам, индексные дескрипторы и блоки работали замечательно. Однако с годами вошло в практику перемещать диски между различными машинами и даже различными операционными системами. Набрали популярность компакт-диски со своей уникальной файловой системой, доступной только для чтения. Для дискет файловая система FAT32 стала стандартом. В других версиях UNIX разработаны свои варианты файловых систем. Поскольку BSD надо было «общаться» с разнообразными системами, потребовался иной уровень абстракции.
Такая абстракция была реализована в виде виртуальных индексных дескрипторов (virtual nodes), или vnodes. Виртуальными дескрипторами никогда не манипулируют напрямую, однако ссылки на них есть в документации системы. Виртуальный дескриптор играет роль переводчика информации, передаваемой между ядром и той или иной файловой системой. Каждый инструмент, который обращается к диску для чтения или записи данных, действует через виртуальные дескрипторы, которые устанавливают соответствие между данными и файловой системой на физическом носителе. Если файл записывается в файловой системе FFS, виртуальный дескриптор обращается к индексному, а если файл записывается в системе FAT32, виртуальный дескриптор обращается к таблице размещения файлов FAT32. Ссылки на индексные дескрипторы (inodes) можно встретить только в связи с файловыми системами FFS, а виртуальные дескрипторы (vnodes) применяются в работе с любой файловой системой.
Типы монтирования FFS
В отличие от файловых систем Windows, разделы FFS можно интерпретировать по-разному в зависимости от варианта монтирования. Способ монтирования раздела называется типом монтирования (mount type). Для монтирования файловой системы вручную надо указать параметры монтирования в командной строке, но при монтировании файловой системы, перечисленной в файле /etc/fstab, достаточно указать точку ее монтирования, при этом параметры монтирования должны быть указаны в поле Options.
Чтобы указать параметры монтирования в командной строке, команде mount следует передать ключ –o mounttype или определить параметры в файле /etc/fstab, в поле Options.
Монтирование в режиме «только для чтения»
Если надо только просматривать содержимое диска и нет необходимости записывать данные, можно монтировать раздел «только для чтения». Бесспорно, это самый безопасный способ монтирования диска. В то же время это один из бессмысленных способов для большинства серверных приложений, поскольку невозможно изменять данные или записывать новые.
Многие системные администраторы монтируют «только для чтения» корневой раздел (root), и возможно, даже /usr, чтобы минимизировать ущерб в результате выключения электропитания или ошибок в программном обеспечении. Даже если вы «потеряете» физический жесткий диск при всплеске напряжения либо из-за других неполадок в оборудовании, данные на пластинах останутся невредимы. В этом заключается преимущество монтирования в режиме «только для чтения»; недостатком является сложность эксплуатации такой файловой системы из-за невозможности записи на диски, монтированные «только для чтения»!
Монтирование в режиме «только для чтения» особенно удобно использовать при повреждении компьютера. Монтирование в этом режиме возможно даже тогда, когда операционная система отказывается монтировать поврежденные файловые системы в режиме чтения/записи. Это дает шанс восстановить данные с поврежденной системы.
Для монтирования файловой системы в режиме «только для чтения» следует использовать параметр монтирования rdonly или ro. Оба значения дают один и тот же эффект.
Синхронное монтирование
Синхронное (sync) монтирование – это старинный способ монтирования файловой системы. При записи на синхронно смонтированный диск ядро ждет завершения операции, чтобы сообщить программе о выполнении записи. Если запись не завершена, программа вправе предпринимать соответствующие действия.
Синхронное монтирование обеспечивает целостность данных в случае аварии, однако работа с такой файловой системой происходит медленно. Понятие «медленно» в наши дни относительно, т. к. даже дешевый диск может превосходить диски, которые считались лучшими несколько лет назад. Если вы скрупулезно относитесь к соблюдению целостности данных, задумайтесь о применении синхронного монтирования. Однако в большинстве случаев это избыточная мера.
Для монтирования файловой системы в синхронном режиме следует использовать параметр монтирования sync.
Асинхронное монтирование
В наше время асинхронный режим монтирования вытесняется такой функциональной возможностью, как soft updates, но вы по-прежнему можете услышать упоминания об этом режиме. Для ускорения доступа к данным, с более высоким риском их потери, монтируйте разделы асинхронно. Когда диск монтирован асинхронно, ядро записывает данные на диск и сообщает программе о том, что запись прошла успешно. При этом ядро не ждет от диска подтверждения того, что данные действительно записаны. Асинхронное монтирование – прекрасный выбор для второстепенных машин, однако оно не подходит для хранения важных данных. Разница в производительности между работой файловой системы, смонтированной в асинхронном режиме и в режиме noasync с использованием soft updates, очень невелика.
Для монтирования файловой системы в асинхронном режиме следует использовать параметр монтирования async.
Монтирование noasync
Наконец, рассмотрим комбинацию sync и async. Этот метод называется noasync и применяется во FreeBSD по умолчанию. При этом данные, имеющие отношение к индексным дескрипторам, записываются на диск синхронно, а фактические данные – асинхронно. В сочетании с soft updates (см. раздел «Soft Updates» далее в этой главе) режим noasync применяется для создания по-настоящему устойчивых систем.
Для монтирования файловой системы в режиме noasync никаких дополнительных параметров указывать не требуется.
Fast File System 283 Параметры монтирования FFS
В дополнение к типам монтирования система FreeBSD поддерживает несколько дополнительных параметров монтирования. Эти параметры оказывают влияние на поведение монтированных файловых систем.
noatime
В FFS у каждого файла есть «отпечаток» времени доступа, называемый atime, в котором отражается время последнего доступа к файлу. Если у вас большое количество файлов и нет необходимости в таких «отпечатках», можно монтировать диск с параметром noatime и не обновлять информацию о времени доступа. Это особенно удобно для работы с flashнакопителями или с дисками, которые испытывают серьезную нагрузку, например, с дисками, где хранятся буфера телеконференций Usenet.
noexec
Запрещает выполнение любых программ в этом разделе. В разделе /home, монтированном с параметром noexec, пользователи не смогут запускать свои программы, однако для полного предотвращения таких действий параметр noexec следует применять при монтировании /tmp, /var/tmp и других разделов, в которые пользователи могут записывать свои файлы. Обратите при этом внимание, что данный параметр не предотвращает возможность запуска пользователями сценариев командного интерпретатора, которые представляют собой простой набор инструкций программы. Кроме того, параметр noexec иногда используется в случаях, когда на сервере имеются исполняемые двоичные файлы для других операционных систем или других аппаратных архитектур, и вам необходимо предотвратить возможность запуска этих файлов на сервере.
nosuid
Предотвращает запуск setuid-программ на вашей системе. setuid-программы разрешают пользователям запускать программы от имени других пользователей. Например, некоторые программы, такие как login(1), требуют привилегий пользователя root, но должны запускаться обычными пользователями. Очевидно, setuid-программы должны разрабатываться особенно тщательно, чтобы предотвратить возможность их взлома и применения для неавторизованного доступа к системе. Вот почему многие администраторы обычно делают недоступными все ненужные setuid-программы. Для этого можно применить nosuid, однако это не принесет пользы при наличии сценариев-оберток, таких как suidperl, которые дают возможность обойти это ограничение.
nosymfollow
Запрещает применять символические ссылки на файлы, или псевдонимы. Символические ссылки в основном применяются для создания псевдонимов файлов, расположенных в других разделах. Для создания псевдонима файла в том же самом разделе лучше использовать обычные ссылки. Более подробную информацию о ссылках можно получить в странице руководства ln(1).
Для создания псевдонимов каталогов всегда используются символические ссылки, так как для этих целей жесткие ссылки (hard links) использовать нельзя.
Soft Updates и функция журналирования в FFS
Soft Updates – это технология организации и упорядочения операций записи на диск, при использовании которой метаданные файловой системы на диске остаются непротиворечивыми, производительность близка к производительности при асинхронном монтировании, а надежность соответствует надежности синхронного монтирования. Это не означает, что на диск будут записаны все данные – неполадки с электропитанием по-прежнему могут повредить данные. Однако Soft Updates предотвращают значительную часть трудностей. В случае отказа операционной системы, функция soft updates может продолжить работу со своей файловой системой и выполнить ее проверку. На мой взгляд, функция soft updates больше подходит для использования с разделами, чей объем не превышает 80 Гбайт.
Начиная с версии FreeBSD 7.0, файловая система FFS обзавелась поддержкой журналирования. Журналируемая файловая система записывает все изменения, производимые в файловой системе, на отдельный раздел диска, поэтому в случае неожиданного завершения работы системы измененные данные могут быть восстановлены автоматически во время загрузки. Благодаря этому отпадает необходимость запускать утилиту fsck(8). Любая журналируемая файловая система использует порядка 1 Гбайт для хранения журнала, что делает ее слишком расточительной для применения на небольших файловых системах. Однако принцип ведения журнала в системе FreeBSD отличается от аналогичных принципов, принятых в других журналируемых файловых системах, тем, что ведение журнала поддерживается на уровне диска, ниже уровня самой файловой системы. Такой способ ведения журнала является новинкой в FreeBSD и по-прежнему находится на экспериментальной стадии.
Например, к моменту написания этих строк, в моем распоряжении имеется компьютер регистрации. Большая часть дисковых разделов на нем имеет размер менее 10 Гбайт, но раздел /var занимает почти два терабайта. Для раздела /var я использую функцию журналирования, а для других – soft updates. По сравнению с запуском fsck в фоновом режиме восстановление данных в журналируемой системе после неожиданного падения напряжения выполняется быстро и безболезненно.
Кэширование записи
Файловая система FFS лучше всего работает на жестких дисках SCSI и SAS в силу устойчивости архитектуры SCSI. Не менее замечательно FFS работает на жестких дисках архитектуры ATA, за одним важным исключением: многие современные диски IDE поддерживают кэширование записи.
Диски IDE, поддерживающие кэширование записи, имеют встроенную микросхему, которая запоминает данные, предназначенные для записи на диск. Такой механизм может не подойти для функции Soft Updates, поскольку Soft Updates уповают на «честность» жесткого диска – когда тот сообщает о записи данных на диск, механизм Soft Updates предполагает, что данные находятся на пластине. Однако на самом деле механизм кэширования записи IDE сообщает о благополучном сохранении данных в дисковом кэше, а не о том, что данные записаны на диск. Фактическая запись данных на диск может произойти спустя секунду или более.
Этот разрыв во времени не опасен при единичных случаях его возникновения, однако на сервере это происходит постоянно. Поэтому, если вы беспокоитесь о своих данных, отключите кэширование записи, добавив в /boot/loader.conf следующую строку:
hw.ata.wc=0
Отключение кэширования записи замедлит работу диска IDE, однако ваши данные будут в безопасности. Я благополучно применяю кэширование записи на настольном компьютере и ноутбуке, где данные не записываются на диск постоянно, однако на сервере ни в коем случае нельзя оставлять кэширование записи включенным. Вы можете сообщить своему руководству, что диски ATA не обеспечивают необходимой для сервера производительности, и вам требуется дополнительное аппаратное обеспечение или сказать, что из-за перегрузки аппаратных средств происходят потери данных. Лично я предпочитаю первый вариант.
Мгновенные снимки файловой системы
Файловая система FFS с активированной функцией Soft Updates может создавать мгновенные образы диска, или снимки (snapshot), в конкретные моменты времени. Эти снимки можно найти в каталоге .snapshot, который располагается в корневом каталоге каждого раздела.
Хотя вы можете не производить администрирование этих снимков, они используются различными инструментальными средствами во время работы. Например, dump(8) выполняет архивирование снимков, а не работающей файловой системы, благодаря чему обеспечивается внутренняя непротиворечивость резервных копий. Утилита fsck, работающая в фоновом режиме, также использует снимки в своей работе. Снимки можно монтировать и получать отображение файловой системы в конкретный момент времени. Хотя это достаточно интересная информация, но большинство системных администраторов считают снимки не слишком полезными. Тем не менее при работе с FreeBSD вы частенько будете встречать упоминания о снимках.
«Грязные» диски
Нет, диски не пачкаются при эксплуатации (хотя пыль на пластине причинит ей вред, да и вода, безусловно, будет некстати). «Грязный» дисковый раздел FFS находится в неопределенном состоянии: операционная система запрашивает информацию, которая находится в этом разделе, но данные не были записаны полностью. Возможно, записана только часть блоков данных, либо изменен индексный дескриптор, а данные не записаны, либо имеется комбинация этих двух вариантов. Если при записи на диск выключается питание, в системе появляется «грязный» диск.
fsck(8)
В состав операционной системы FreeBSD входит мощный инструмент для проверки файловых систем – fsck(8). Если при загрузке системы будет найден «грязный» диск, fsck автоматически проверит диск и постарается устранить неполадки. Данные, не записанные на диск, будут утеряны, но fsck сделает все возможное, чтобы привести в порядок те данные, что остались. При благоприятном исходе все встанет на свои места – за исключением незаписанных данных!
Неудачный автоматический запуск fsck
Иногда перезагрузка заканчивается неудачно, и вы попадаете в однопользовательский режим, где вас просят запустить fsck(8) вручную. Здесь у вас есть выбор: либо запустить fsck, либо нет. Если ввести команду fsck, эта программа проверит каждый блок и индексный дескриптор на диске. Вероятно, она найдет все блоки, не связанные с соответствующими индексными дескрипторами. Далее программа постарается выяснить былое соответствие. Однако она не сможет сказать, к какому каталогу принадлежат эти файлы.
fsck спросит, надо ли выполнить перегруппировку. Если вы ответите n, программа удалит поврежденные файлы. В случае ответа y потерянный файл будет помещен в каталог находок (например, /usr/lost+ found) в разделе, в котором он был найден. В качестве названия файла будет выступать некое число. Если таких файлов немного, их можно попробовать идентифицировать вручную, а в случае большого числа файлов их можно просмотреть с помощью таких инструментов, как file(1) или grep(1), и произвести идентификацию.
Fast File System 287 Отключение приглашения fsck
Если диск стал «грязным» во время масштабной операции, на нем может появиться множество потерянных файлов. Чтобы не тратить время, снова и снова набирая y и предписывая fsck восстанавливать каждый файл, можно запустить команду fsck –y, заранее ответив y на все вопросы. Это намного проще, чем сидеть и без конца набирать y.
Систему можно настроить на автоматический запуск fsck –y при начальной загрузке. Однако я не рекомендую такой шаг: если есть хотя бы малейший шанс, что моя файловая система вознесется в цифровые небеса, я хочу знать об этом. Я хочу сам набирать опасную команду и трепетать, наблюдая за работой fsck(8). Кроме того, всегда неприятно обнаружить «мусор» в системе, не имея ни малейшего понятия о том, что произошло. Однако если вы более безрассудны, чем я, установите параметр fsck_y_enable=»YES» в файле /etc/rc.conf.
ВНИМАНИЕ!
Запуск fsck с ключом –y не гарантирует полную безопасность. Когда я работал с экспериментальными файловыми системами в ветке -current или выполнял не совсем обычные операции, благодаря fsck –y в каталогах /usr/lost+found и /var/lost+found иногда оказывалось содержимое всего диска. После этого восстанавливать файлы было чрезвычайно трудно. Следует заметить, что в стабильной версии FreeBSD-stable со стандартной файловой системой UFS я не испытывал никаких трудностей.
Что вместо fsck —y
Какой у вас есть выбор вместо fsck –y? Программы fsdb(8) и clri(8) позволяют отлаживать файловую систему и перенаправлять файлы в надлежащее место. Можно восстановить имена файлов и разместить их в исходных каталогах. Однако это трудно1 – такой путь рекомендуется только Мастерам Файловых Систем из Тайного Клана Ниндзя.
Запуск fsck в фоновом режиме
Возможность запуска fsck в фоновом режиме придает файловой системе FFS некоторые преимущества журналируемых файловых систем, без фактического использования части жесткого диска для ведения журнала. Когда после загрузки FreeBSD обнаруживает наличие fsck, работающей в фоновом режиме, она монтирует «грязные» диски в режиме чтения/записи. Утилита fsck(8) работает в фоновом режиме, несмотря на то, что сервер продолжает свою работу, отыскивает потерянные куски файлов и ставит их на место.
Фактически при работе в фоновом режиме fsck проходит две основных стадии. Когда во время инициализации процесса загрузки FreeBSD обнаруживает «грязные» диски, она запускает fsck(8) для выполнения предварительной оценки их состояния. fsck(8) решает, возможно ли их восстановление в ходе работы системы или требуется полноценный запуск fsck в однопользовательском режиме. В большинстве случаев fsck предполагает, что работа может быть продолжена, и дает разрешение на продолжение загрузки системы. Когда система достигает однопользовательского режима, fsck запускается в фоновом режиме с низким приоритетом и выполняет проверку разделов одного за другим. Результаты работы fsck выводятся в файл протокола /var/log/messages.
Пока fsck работает в фоновом режиме, можно ожидать снижения производительности приложений, выполняющих действия с жестким диском. fsck(8) забирает на себя значительную долю производительности диска. Если система медленная, она станет еще медленнее.
По окончании работы fsck в фоновом режиме можно заглянуть в файл /var/log/messages и проверить наличие сообщений об ошибках. На предварительном этапе fsck может ошибиться в своих оценках, и, возможно, для восстановления раздела действительно потребуется полноценный запуск fsck в однопользовательском режиме. Если будет обнаружено подобное сообщение, предусмотрите несколько часов простоя системы на проведение восстановительных работ. Очень неприятно останавливать систему для проведения запланированных работ, однако гораздо неприятнее производить незапланированную остановку, вызванную падением напряжения и работой команды fsck –y в однопользовательском режиме.
Принудительное монтирование «грязных» дисков в режиме чтения/записи
Если вам очень захочется вынудить FreeBSD монтировать «грязный» диск в режиме чтения/записи без использования fsck в фоновом режиме, вы можете это сделать. Но результаты вам не понравятся. Очень. Но поскольку о такой возможности упоминается в странице руководства mount(8), некоторые читатели могут решить, что в этом нет ничего плохого, если заранее не знают, чем это грозит. Для принудительного монтирования в режиме чтения/записи используются флаги –w (read-write – чтение/запись) и –f (force – принудительно) команды mount(8).
Монтирование «грязного» раздела в режиме чтения/записи приведет к повреждению данных. Обратите внимание на отсутствие в этом предложении слова может. Кроме того, в этом предложении отсутствует слово восстановление. Монтирование «грязной» файловой системы может привести к краху системы. Эта операция может разрушить еще оставшиеся на разделе данные и даже уничтожить саму файловую систему. Принудительное монтирование «грязной» файловой системы в режиме чтения/записи – это табу. Никогда не производите его.
Синхронизация и остановка FFS
Во время остановки операционной системы FreeBSD ядро производит синхронизацию всех данных на жестком диске, помечает диск как «чистый» и останавливается. Эти операции с диском выполняются процессом ядра с именем syncer. В ходе подготовки к остановке системы syncer сообщает о ходе синхронизации данных на жестком диске.
В процессе остановки вы будете наблюдать малопонятные сообщения от процесса syncer. В действительности syncer не опускается до работы с блоками и индексными дескрипторами, требующими обновления, – он работает с виртуальными индексными дескрипторами, требующими синхронизации. Благодаря механизму Soft Updates операция записи в один виртуальный индексный дескриптор может приводить к появлению другого виртуального дескриптора, требующего обновления. Вы можете увидеть, как быстро уменьшающееся число буферов, требующих записи на диск, вдруг раз-другой прыгает между нулем и каким-нибудь небольшим значением – это результат фактической синхронизации с жестким диском.
Подлинные подробности о FFS
Если вы хотите побольше узнать о FFS, загрузите схему внутреннего устройства ядра FFS, которую можно найти в документе http://phk.freebsd.dk/misc/ufs.pdf. Чтобы распечатать ее, вам потребуется широкоформатный архитектурный принтер или 18 листов обычной бумаги, а также новая лента для принтера.
Запуск fsck в фоновом режиме, fsck —y, обычный запуск fsck – вот напасть—то!
В реальной жизни могут встретиться все эти варианты использования fsck(8), но как понять, когда FreeBSD использует каждую из этих команд? При принятии решения, когда и как запускать fsck(8), FreeBSD использует следующие условия:
- Если файловая система не содержит ошибок, она монтируется без запуска fsck(8).
- Если во время загрузки файловая система не задействует механизм Soft Updates и окажется «грязной», FreeBSD запускает fsck. Если будут обнаружены серьезные повреждения файловой системы, FreeBSD остановится и запросит вашего вмешательства. Здесь вы сможете либо запустить команду fsck –y, либо вручную подтвердить все попытки восстановления файлов.
Если во время загрузки файловая система задействует механизм Soft Updates и окажется «грязной», FreeBSD выполнит оценочную проверку с помощью fsck(8). В случае умеренных повреждений FreeBSD запустит fsck(8) в фоне, в многопользовательском режиме. Если будут обнаружены серьезные повреждения, FreeBSD прервет загрузку и потребует вмешательства либо в виде запуска команды fsck –y, либо в виде принятия или отклонения каждой обнаруженной проблемы.
Если во время загрузки файловая система задействует механизм журналирования и окажется «грязной», FreeBSD восстановит данные из журнала и продолжит загрузку. Журналируемые файловые системы редко требуют восстановления с помощью fsck(8).
Использование неродных файловых систем
Для наших целей любой раздел или диск, который не является разделом FFS, есть неродная (foreign) файловая система. К счастью, во FreeBSD реализована серьезная поддержка неродных файловых систем. Отметим, что будут работать только те функции, которые поддерживаются в самой файловой системе. Например, файловая система FAT32 компании Microsoft не поддерживает права доступа, а файловые системы, используемые в операционной системе Linux, не поддерживают флаги файлов, характерные для BSD.
Каждая неродная файловая система должна иметь поддержку в ядре FreeBSD. К cчастью, в случае необходимости программа mount(8) автоматически загружает соответствующий модуль ядра.
Для монтирования неродной файловой системы необходима та же информация, что и для монтирования FFS: имя устройства и точка монтирования. Также необходимо знать тип файловой системы и имя команды, которая монтирует файловые системы данного типа. Например, для монтирования CD-ROM в системе FreeBSD имеется точка монтирования /cdrom. Первое устройство IDE CD в системе имеет имя /dev/acd0. Для компакт-дисков используется файловая система ISO 9660, а команда FreeBSD, которая выполняет их монтирование, имеет вид: mount –t cd9660(8). Следующая команда выполняет монтирование компакт-диска в каталог /cdrom:
# mount —t cd9660 /dev/acd0 /cdrom
Теперь можно перейти в каталог /cdrom и ознакомиться с его содержи-
мым. Просто, не правда ли?
При попытке монтировать диск командой, не поддерживаемой в данной файловой системе, будет выдано сообщение об ошибке. Например, у меня дома все дискеты содержат либо файловую систему FAT32, либо FFS. Накопителю на гибких магнитных дисках соответствует файл устройства /dev/fd0, а каталог /media является стандартной точкой монтирования дискет.
# mount /dev/fd0 /media
mount: /dev/fd0 on /media: incorrect super block
(Перевод: монтирование: /dev/fd0 в /media: некорректный суперблок)
Эта дискета содержит файловую систему FAT32. Если бы я запустил команду mount –t msdosfs, никаких ошибок не было бы.
Независимо от типа монтированной файловой системы ее можно размонтировать с помощью umount(8):
# umount /cdrom
Утилита umount(8) не делает никаких предположений о типе файловой системы. Она просто отключает раздел диска.
Поддерживаемые типы неродных файловых систем
Ниже приводится список наиболее распространенных неродных файловых систем с кратким описанием и соответствующими командами монтирования.
FAT (MS—DOS)
Во FreeBSD реализована значительная поддержка файловой системы FAT (DOS/Windows 9x File Allocation Table), обычно используемой для сменных носителей и в случае одновременной установки на компьютер двух операционных систем. Данная поддержка охватывает такие разновидности FAT, как FAT12, FAT16 и FAT32. Впрочем, можно форматировать дискеты в FFS, поэтому не надо слепо полагать, что все дискеты имеют формат FAT. Поскольку дискеты чаще всего используются для переноса файлов с одного компьютера на другой, то обычно они форматируются в файловой системе FAT32. Тип монтируемой системы – msdosfs (mount –t msdosfs).
Если вам приходится монтировать много устройств с файловой системой FAT32, ознакомьтесь как следует с каталогом /usr/ports/tools/ mtools. Здесь собраны программы для работы с файловой системой FAT, обладающие более высокой гибкостью, чем стандартные инструменты FreeBSD.
ISO 9660
ISO-9660 – это стандартная файловая система для компакт-дисков. FreeBSD позволяет считывать данные с CD-ROM, а также записывать их при наличии записывающего привода. Чуть ли не каждый компакт-диск, с которым вы столкнетесь, будет иметь формат ISO 9660. Команда монтирования – mount –t cd9660.
Пакет инструментальных средств cdrtools, который можно найти в /usr/ports/sysutils/cdrtools, содержит множество полезных инструментов для работы с образами компакт-дисков, включая средства создания ISO-образов из файлов на диске.
UDF
Файловая система UDF (Universal Data Format – универсальный формат хранения данных) появилась как замена ISO 9660. Файловую систему UDF можно обнаружить на некоторых DVD-дисках и flash-устройствах с интерфейсом USB, емкость которых превышает 32 Гбайт – верхней границы, поддерживаемой файловой системой FAT32. С ростом емкости сменных носителей вам все чаще и чаще будет встречаться файловая система UDF. Команда монтирования: mount –t udf.
NTFS
Стандартная файловая система Windows NT/2000/XP, NTFS, тесно интегрирована с ядром Microsoft. Чтобы записывать данные в раздел NTFS, необходимо глубоко понимать работу этой файловой системы. К сожалению, Microsoft не предоставляет такую информацию, поэтому FreeBSD может безопасно монтировать разделы NTFS в режиме «только для чтения», а функциональность режима чтения/записи имеет существенные ограничения. Команда монтирования – mount –t ntfs.
Возможность монтирования разделов NTFS наиболее часто бывает необходима при переходе с систем Windows на систему FreeBSD – просто извлеките жесткий диск из Windows-машины, смонтируйте его в FreeBSD-машину и скопируйте необходимые данные. Кроме того, поддержка NTFS бывает необходима, когда на компьютере установлены сразу две операционные системы, и одна из них – Windows.
Так как спецификации NTFS закрыты, а кодирование данных производится малоизвестным способом, поддержка NTFS в системе FreeBSD не гарантирует корректную работу.
ext2fs и ext3fs
Стандартные файловые системы Linux – ext2fs и ext3fs – поддерживают многие функции файловой системы FreeBSD, позволяя безопасно читать и записывать данные. Подобно монтированию NTFS монтирование файловых систем Linux довольно полезно при чрезвычайных обстоятельствах или при наличии двух операционных систем на компьютере. Несмотря на различия в названиях, обе файловые системы монтируются одной и той же командой mount –t ext2fs.
Пользователи файловых систем Linux могут найти полезные инструментальные средства в каталоге /usr/ports/sysutils/e2fsprogs. Кроме всего прочего эти инструменты позволят запускать команду fsck(8) и выполнять оценку повреждений файловых систем Linux.
Использование неродных файловых систем 293 ReiserFS
Файловая система ReiserFS имеет не слишком много приверженцев среди пользователей Linux. FreeBSD поддерживает монтирование разделов ReiserFS исключительно в режиме «только для чтения». Поддержка реализована непосредственно в программе mount(8). Команда монтирования: mount –t reiserfs раздел точка_монтирования.
XFS
Операционная система FreeBSD поддерживает возможность чтения разделов с файловой системой XFS, созданной компанией SGI, однако, к моменту написания этих строк, реализация операции записи находилась еще на экспериментальной стадии. Файловая система XFS – это самая старая журналируемая файловая система, с хорошо отлаженной реализацией. Однако XFS распространяется на основе лицензии GPL, что делает маловероятным включение этой файловой системы в базовую систему FreeBSD. Журналирование в FreeBSD поддерживается командой gjournal, рассматриваемой в главе 18.
Программы форматирования, монтирования и управления разделами XFS можно найти в каталоге /usr/ports/sysutils/xfsprogs.
ZFS
Начиная с версии 7.0, операционная система FreeBSD включает в себя экспериментальную поддержку файловой системы ZFS, перенесенной с платформы OpenSolaris. Хотя инсталлятор FreeBSD и не поддерживает ZFS, тем не менее в случае необходимости вы сможете использовать расширенные возможности ZFS. Порядок лицензирования этой файловой системы не позволяет сделать ее основной в системе FreeBSD, однако ее высокая производительность может оказаться востребованной для определенных применений в многотерабайтных файловых системах и в 64-битных системах. В 32-битных системах ZFS испытывает некоторые проблемы с памятью, но в 64-битных системах репутация ZFS безукоризненна.
Права доступа и неродные файловые системы
Метод, применяемый для монтирования файловой системы, и пользователь, который ее монтирует, определяют права доступа монтированной файловой системы. Например, XFS и ext3fs хранят права доступа в файловой системе, ставя их в соответствие идентификаторам пользователей (UIDs). Поскольку права доступа в них очень напоминают права доступа в FFS, а вся информация о правах доступа находится в самой файловой системе, FreeBSD соблюдает эти права доступа.
Файловая система NTFS имеет свою систему прав доступа. Поскольку NTFS лишь отдаленно похожа на UNIX-подобные системы, права доступа NTFS будут отброшены при монтировании этой файловой системы во FreeBSD. Она будет рассматриваться как аналог CD-ROM или дискеты.
По умолчанию монтировать файловые системы может только root. Он же владеет всеми неродными файловыми системами. Если это не соответствует вашим предпочтениям, то с помощью ключей –u и –g можно указать ID пользователя и группы при монтировании файловых систем FAT32, NTFS или ISO 9660. Например, следующая команда подойдет при монтировании устройства USB с файловой системой FAT32 для пользователя «cstrzelc», причем этот пользователь сможет редактировать содержимое дискеты:
# mount —t msdosfs —u cstrzelc —g cstrzelc /dev/da0 /mnt
Теперь пользователь cstrzelc является владельцем файлов этой дискеты.
Монтируя носители под пользователей, можно заработать мигрень, особенно если это приходится делать на нескольких десятках компьютеров. Чтобы разрешить пользователю монтировать файловые системы, присвойте параметру sysctl vfs.usermount значение 1 и убедитесь, что пользователь владеет точкой монтирования. В результате пользователь cstrzelc не сможет монтировать сменные носители в каталог /mnt, зато сможет монтировать их в каталог /home/cstrzelc/mnt.
Файловые системы на съемных носителях
Популярность съемных носителей сильно выросла за последние несколько лет. Совсем недавно мы носились с дискетами, а теперь у нас есть компакт-диски и устройства USB. Вы должны уметь управляться с любыми съемными носителями, которые будут пересекать порог вашего информационного центра. Далее мы рассмотрим работу с файловыми системами на дискетах, устройствах USB и компакт-дисках.
Из соображений безопасности я не рекомендую подключать съемные носители к рабочим серверам, если на то нет веских оснований. Кто знает, что в действительности находится на устройстве USB данного производителя? Я предпочитаю сначала смонтировать такие устройства на своей рабочей станции, проверить содержимое и лишь затем скопировать необходимые данные на сервер. Съемные носители чрезвычайно удобны и распространены, и, конечно, указанное выше правило не действует, когда речь заходит о моем личном устройстве USB.
Форматирование носителей с файловой системой FAT32
И дискеты, и устройства USB обычно форматируются в файловой системе FAT32. В устройствах USB используется файловая система FAT32, и, как правило, они продаются уже отформатированными. Так как устройства USB имеют ограниченное число циклов чтения/записи, не рекомендуется переформатировать их слишком часто. Это правило не относится к дискетам, которые часто нуждаются в переформатировании при интенсивном использовании. Процесс, который большинство пользователей Windows называют «форматированием дискеты», на самом деле является многоэтапным. Под этим подразумевается форматирование диска, присвоение диску метки и создание файловой системы. Во FreeBSD при создании дискеты надо выполнить все эти операции.
Нестандартные дискеты
Предположим, что есть гибкий диск емкостью 1,44 Мбайт, который был стандартом для аппаратных средств x86 свыше двух десятилетий. Если у вас имеется привод, рассчитанный на работу с дискетами емкостью 800 Кбайт или какой-нибудь другой нестандартной емкостью, потребуется внести поправки, однако последовательность шагов не изменится.
Низкоуровневое форматирование
При форматировании диска первым делом надо выполнить низкоуровневое форматирование с помощью fdformat(1). Эта программа принимает только два аргумента: размер дискеты и имя устройства.
# fdformat —f 1440 /dev/fd0
Format 1440K floppy ‘/dev/fd0.1440’? (y/n): y
Когда вы наберете y, fdformat(1) начнет низкоуровневое форматирование, подготавливая диск к переносу на него файловой системы. Низкоуровневое форматирование – самая медленная операция в процессе подготовки дискеты. Windows выполняет такое форматирование, только когда будет затребовано полное форматирование.
Создание файловой системы FFS
После низкоуровневого форматирования, если вы создаете дискету FFS, то диску надо присвоить метку с помощью disklabel(8). Эта программа записывает на дискету базовую идентификационную информацию, устанавливает данные о разделах и даже может обозначить диск как загрузочный. Обозначение диска в качестве загрузочного не подразумевает копирование на него необходимых программ; маркер, размещаемый на диске, нужен для того, чтобы системный BIOS воспринял этот диск как загрузочный. Если вам нужна загрузочная дискета, скопируйте соответствующий образ диска из установочного комплекта. В следующем примере мы добавим простую метку диска без каких бы то ни было специальных характеристик:
# disklabel —r —w /dev/fd0 fd1440
Ключ –r предписывает disklabel обратиться к диску на низком уровне. Это необходимо, поскольку на диске еще нет файловой системы. Ключ –w предписывает осуществить запись на диск: мы записываем в /dev/ fd0 и устанавливаем стандартную метку для дискеты 1,44 Мбайт. Полный список меток дискет можно найти в /etc/disktab. Там же располагаются метки для устройств других типов.
Наконец, создайте файловую систему с помощью newfs(8).
# newfs /dev/fd0
Далее вы увидите несколько строк текста, которые выведет программа
newfs, после чего управление вернется командной строке.
Следует иметь в виду, что при использовании FFS на дискете впустую расходуется некоторое пространство, кроме того, FFS не обеспечивает должной защиты файлов на дискете, как того можно было бы ожидать. Так как информация о правах доступа сохраняется на дискете, обладатель дискеты легко может их преодолеть. Кроме того, не забывайте, что FFS резервирует порядка 8% общей емкости диска для собственных нужд. Вам действительно нужна дискета емкостью 1.32 Мбайт? Файловая система FFS хороша, но для гибких дисков лучше подойдет FAT32.
Создание файловой системы FAT32
Для перемещения данных между разными компьютерами требуется подготовить дискету в формате FAT32. Как и в предыдущем случае, сначала необходимо выполнить низкоуровневое форматирование, как уже обсуждалось ранее, однако в данном случае не надо присваивать метку. Просто воспользуйтесь программой newfs_msdos(8):
# newfs_msdos /dev/fd0
После того как по экрану пробежит несколько строк текста, вы полу-
чите готовую дискету.
Использование съемных носителей
Работа со съемными носителями ничем не отличается от работы с обычными устройствами, такими как жесткие диски. Вам требуется знать тип файловой системы на устройстве, имя файла устройства и точку монтирования.
Для компакт-дисков используется файловая система ISO 9660, тогда как для дисков DVD – либо UDF, либо комбинация ISO 9660 и UDF. Для устройств USB и дискет обычно используется FAT32. На новейших устройствах USB может использоваться файловая система UDF. Я предполагаю, что UDF станет наиболее привычной файловой системой для съемных устройств, особенно с увеличением емкости flash-накопителей.
Имя файла устройства зависит от типа самого устройства. Приводы компакт-дисков с интерфейсом IDE получают имя /dev/acd0, тогда как приводы с интерфейсом SCSI – /dev/cd0. Накопителям на гибких магнитных дисках соответствует файл устройства /dev/fd0. Устройства USB получают первое свободное имя, производное от /dev/da. При подключении устройства USB в файле протокола /var/log/message и на экране консоли появляется сообщение с указанием имени файла устройства и его типа.
Последнее, что вам потребуется, – это точка монтирования. По умолчанию в системе FreeBSD присутствует точка монтирования /cdrom для монтирования дисков CD и DVD. Здесь также можно обнаружить точку монтирования /media, которая предназначена для монтирования съемных носителей. Вы можете создать дополнительные точки монтирования, какие только пожелаете, поскольку любая точка монтирования – это самый обычный каталог. Для монтирования разнообразных устройств на короткий срок FreeBSD предлагает /mnt.
Так, чтобы смонтировать устройство USB /dev/da0 с файловой системой FAT32 в точку монтирования /media, следует запустить следующую команду:
# mount —t msdosfs /dev/da0 /media
Иногда встречаются устройства, которые содержат настоящую таблицу участков, и такие устройства должны монтироваться как /dev/ da0s1, а не как /dev/da0. Это зависит от того, как было отформатировано устройство, а не от самой FreeBSD.
Единственный раздражающий фактор, связанный с приводами компакт-дисков, состоит в том, что приводам с интерфейсами SCSI и ATA соответствуют разные программные интерфейсы. Значительная часть программного обеспечения написана в расчете исключительно на интерфейс SCSI, поскольку этот интерфейс считается более надежным. Если вам придется столкнуться с таким программным обеспечением, обратите внимание на модуль ядра atapicam(4), который реализует уровень эмуляции для приводов CD-ROM с интерфейсом ATA.
Извлечение съемных носителей
Перед извлечением съемного носителя необходимо демонтировать файловую систему. Лоток CD-ROM не удастся выдвинуть, если компактдиск не будет демонтирован, аналогичным образом не удастся извлечь дискету из накопителя. Безусловно, устройство USB можно извлечь в любой момент, но если файловая система в этот момент не будет демонтирована, это может привести к краху системы и даже к повреждению данных на устройстве. Чтобы демонтировать файловую систему, используйте команду umount(8) как для любой другой файловой системы:
# umount /cdrom
Съемные носители и /etc/fstab
Можно упростить монтирование съемных носителей, добавив соответствующие записи в файл /etc/fstab. Если для файловой системы на съемном носителе имеется запись в /etc/fstab, то при монтировании можно будет не указывать имя устройства и тип файловой системы. Другими словами, не надо помнить имена всех устройств и точные команды для монтирования тех или иных файловых систем. Вероятно, в вашем файле /etc/fstab уже имеется запись для монтирования CD-ROM.
Я уверен, что вы помните назначение каждого поля в /etc/fstab, тем не менее напомню, что данная запись означает следующее: «монтировать /dev/acd0 в /cdrom, с использованием файловой системы ISO 9660, в режиме только для чтения, и не монтировать автоматически это устройство во время загрузки». Используя этот пример в качестве шаблона, вы сможете дополнить /etc/fstab аналогичными записями для устройств USB и накопителей на гибких магнитных дисках.
/dev/fd0 /mnt msdosfs rw,noauto 0 0 /dev/da0 /medi msdosfs rw,noauto 0 0
В системе FreeBSD эти записи по умолчанию отсутствуют, но я нахожу очень удобным иметь их в системах, где регулярно приходится пользоваться съемными носителями. Проверьте, что следующее доступное устройство da – это именно /dev/da0 , иначе, если этот файл устройства соответствует уже смонтированному жесткому диску, данная запись окажется бесполезной.
Когда будете добавлять записи в файл /etc/fstab, не забудьте добавить флаг noauto . В противном случае при отсутствии съемного носителя загрузка остановится в однопользовательском режиме из-за отсутствия файловой системы.
Прочие файловые системы FreeBSD
Помимо FFS и неродных файловых систем, FreeBSD поддерживает различные файловые системы специального назначения. Некоторые из них интересны сами по себе, но обычно не используются, например mount_umapfs(8), а другие используются очень часто или даже используются в обязательном порядке. Далее мы поговорим о файловых системах в памяти – популярном способе оптимизации производительности, который используется в некоторых случаях, о создании файловых систем внутри файлов, а также о файловых системах procfs и fdescfs, которые необходимы для нормальной работы некоторых программ.
Файловые системы в памяти
Операционная система FreeBSD позволяет создавать файловые системы не только в дисковых разделах, но также в памяти, в файлах или в комбинации того и другого. Одно из наиболее популярных применений этой возможности заключается в создании файловых систем в памяти (memory filesystems), или дисков памяти (memory disks). Операции чтения и записи в файлы, находящиеся в памяти, выполняются намного быстрее, чем доступ к файлам, находящимся на диске, что позволяет существенно повысить производительность некоторых приложений. Однако при завершении работы системы все содержимое диска памяти теряется безвозвратно.
/tmp как диск памяти
Наиболее часто файловые системы в памяти используются для размещения каталога /tmp. Делается это так часто, что FreeBSD имеет для этих целей даже специальный параметр в rc.conf. Взгляните на следующие определения в rc.conf:
tmpmfs=»YES»
tmpsize=»20m»
tmpmfs_flags=»-S»
Установив значение YES в параметре tmpmfs , вы тем самым предписываете FreeBSD автоматически создавать во время загрузки файловую систему /tmp в памяти. Размер файловой системы /tmp определяет параметр tmpsize . Назначение флагов мы будем рассматривать немного ниже, в этом же разделе.
Если на этом ваш интерес к файловым системам в памяти исчерпывается, можно считать, что вы достигли желаемого. Если же вам интересно узнать, как с помощью mdmfs(8) создаются и используются специальные устройства памяти, читайте дальше.
Типы дисков памяти
Диски памяти могут быть трех типов: невытесняемые (malloc-backed), вытесняемые (swap-backed) и файловые (vnode-backed).
Невытесняемые диски всегда находятся в памяти. Невытесняемые диски никогда не перемещаются в своп, даже если система испытывает нехватку памяти. Создание невытесняемых дисков памяти большого объема – отличный способ исчерпать доступную память и вызвать крах системы. Диски такого типа наиболее полезны для встраиваемых устройств, не имеющих файла подкачки, с которыми мы познакомимся в главе 20.
Вытесняемые диски большую часть времени находятся в памяти, но они могут вытесняться в системный раздел подкачки (swap). Если система испытывает нехватку памяти, она вытесняет давно не использовавшиеся участки памяти в раздел подкачки, как описывается в главе 19. Вытесняемые диски – это наиболее безопасный способ использования файловых систем в памяти.
Файловые диски – это обычные дисковые файлы. Вы можете использовать обычные файлы в качестве носителей дисков памяти, однако понастоящему эта возможность полезна только разработчикам файловых систем, желающим выполнить серию тестов или смонтировать образ диска.
Тип диска памяти определяется областью его применения. Если в системе отсутствует пространство свопинга, а файловая система доступна только для чтения, единственный доступный тип – это невытесняемые диски. Если речь идет о сервере или рабочей станции, где было бы желательно создать быструю файловую систему для временного хранения данных, то предпочтительнее использовать вытесняемые диски. Файловые диски необходимы только для монтирования образов дисков.
Как только вы определитесь с типом диска памяти, можно приступать к выполнению необходимых операций с помощью mdmfs(8).
Создание и монтирование дисков памяти
Утилита mdmfs(8) представляет собой удобный интерфейс к таким программам, как mdconfig(8) и newfs(8). Она берет на себя тяжелый труд по настройке устройств и созданию файловых систем на этих устройствах. Она упрощает операцию создания дисков памяти настолько, насколько это вообще возможно. Чтобы создать диск памяти, достаточно знать лишь размер диска, его тип и точку монтирования.
По умолчанию создаются вытесняемые диски памяти. Для этого достаточно передать утилите mdmfs(8) размер диска и точку монтирования. Следующая команда создает вытесняемый диск памяти размером 8 Мбайт, смонтированный в каталог /home/mwlucas/test:
# mdmfs —s 8m md /home/mwlucas/test
Ключ –s задает размер диска. Если теперь запустить mount(8) без аргументов, можно будет увидеть устройство диска памяти /dev/md0, смонтированное в указанный выше каталог.
Чтобы создать и смонтировать невытесняемый диск памяти, следует добавить ключ –M.
Чтобы смонтировать файловый диск памяти, следует добавить ключ –F и указать путь к файлу образа.
# mdmfs —F diskimage.file md /mnt
В предыдущих командах в качестве имени устройства использовалось имя md, что означает: «Меня не интересует, как будет названо устройство, я лишь хочу получить первое незанятое имя». Однако в случае необходимости можно явно определить желаемое имя устройства. Следующая команда создаст устройство /dev/md9, которое будет играть роль диска памяти:
# mdmfs —F diskimage.file md9 /mnt Недостатки дисков памяти
Диски памяти – это звучит слишком хорошо, чтобы быть правдой, особенно для высокопроизводительных систем. Они имеют свои ограничения, о которых вам следует знать, прежде чем вы приступите к повсеместному их внедрению.
Самая большая проблема заключается в том, что при выключении системы содержимое таких дисков исчезает безвозвратно. На первый взгляд эта проблема может показаться несущественной, однако мне в своей практике не раз приходилось удивляться пропаже файлов из файловых систем, если я забывал, что это были диски памяти.
Кроме того, невытесняемые диски никогда не отдают память. Когда вы записываете файл на диск памяти, а затем стираете его, этот файл все равно продолжает занимать память. При использовании вытесняемого диска памяти этот файл, в конечном счете, будет вытеснен в раздел подкачки в случае нехватки памяти. Диск памяти в системах, работающих продолжительное время, рано или поздно исчерпает всю оперативную память системы.
Единственный способ освободить использованную память – это демонтировать диск памяти, уничтожить устройство и создать новый диск памяти. По своему опыту могу сказать, что даже на очень нагруженном сервере вполне достаточно выполнять эту операцию раз в месяц.
За пару месяцев до выхода в свет FreeBSD 7.0 в нее была добавлена файловая система tmpfs(5), размещаемая в памяти, которая, как предполагается, освобождает неиспользуемую память и возвращает ее системе. Однако эта файловая система еще достаточно новая и рассматривается как экспериментальная. Если вы читаете эти строки, когда уже вышли в свет более новые версии FreeBSD, я порекомендовал бы обратить внимание на tmpfs(5), но если вы установили версию 7.0 или 7.1, то на вашем месте я бы предпочел, чтобы отловом ошибок занимался кто-то другой.
Удаление дисков памяти
Чтобы удалить диск памяти, нужно демонтировать раздел и уничтожить устройство диска. В момент уничтожения устройства диска происходит освобождение памяти, использованной этим устройством, что бывает полезно при существенном увеличении нагрузки на систему. Чтобы узнать имя файла устройства, запустите команду mount(8) и поищите в списке раздел диска памяти. Он должен выглядеть примерно так:
/dev/md41 on /mnt (ufs, local, soft-updates)
Здесь видно диск памяти /dev/md41, монтированный в каталог /mnt. Давайте демонтируем его и уничтожим.
# umount /mnt
# mdconfig -d -u 41
Демонтирование раздела диска памяти выполняется точно так же, как и любой другой файловой системы, – с помощью команды umount . Однако команда mdconfig(8) вам еще не знакома. Утилита mdconfig(8) используется для непосредственного управления устройствами памяти. Ключ –d означает уничтожить (destroy), а ключ –u определяет номер устройства. Команда, приведенная выше, уничтожит устройство /dev/md41 или устройство md с номером 41. Теперь память, которая использовалась устройством, свободна для других нужд.
Диски памяти и /etc/fstab
Если добавить информацию о дисках памяти в файл /etc/fstab, FreeBSD будет автоматически создавать их на этапе загрузки. Записи, соответствующие дискам памяти, выглядят сложнее, но все не так страшно, если вы поняли, как работать с командами mdmfs(8), которые мы использовали до сих пор. Чтобы освежить вашу память, приведу единственную строку из файла /etc/fstab, которая соответствует стандартной файловой системе.
# Device Mountpoint FStype Options Dump Pass#
/dev/ad4s2a / ufs rw 1 1
Чтобы как-то обозначить, что устройство является диском памяти (memory disk), мы дадим ему имя md. В качестве точки монтирования можно выбрать произвольный каталог, как и для любого другого устройства, а в качестве типа файловой системы укажем mfs. В поле Options укажем параметр rw (read-write – чтение/запись) и параметры командной строки, которые потребуются для создания данного устройства. Для создания нашей файловой системы объемом 8 Мбайт, монтированной в каталог /home/mwlucas/test, используется следующая запись в файле /etc/fstab:
md /home/mwlucas/test mfs rw,-s 8m 0 0
Выглядит достаточно просто, не так ли? Единственная незадача – длинная строка нарушает аккуратный вид файла /etc/fstab. И этот пример не единственный, делающий файл трудночитаемым, в чем вы вскоре убедитесь.
Монтирование образов дисков
Диски памяти могут также использоваться для монтирования и доступа к образам дисков. Эта очень удобная возможность позволяет ознакомиться с содержимым образов компакт-дисков, прежде чем записывать их на болванки. Для этого достаточно подключить диск памяти к файлу с помощью команды mdconfig(8), с ключом –a. Ниже приводится пример подключения ISO-образа с дистрибутивом FreeBSD к устройству памяти:
# mdconfig —a —t vnode —f /home/mwlucas/7.0—CURRENT—snap.iso md0
Эта команда предписывает команде mdconfig(8) подключить файловый (vnode-backed) диск памяти к указанному файлу . После этого mdconfig(8) сообщает, что устройство подключено. Теперь можно просто смонтировать устройство соответствующей командой монтирования, не забыв указать тип файловой системы:
# mount —t cd9660 /dev/md0 /mnt
Одна из распространенных ошибок, которую допускают здесь, – это попытка смонтировать образ без указания файловой системы. В результате вы можете получить сообщение об ошибке, а можете благополучно смонтировать образ, в котором не окажется данных, потому что по умолчанию утилита mount(8) предполагает, что имеет дело с файловой системой FFS.
Закончив просмотр содержимого образа, его обязательно нужно демонтировать, а устройство уничтожить, так же как и любое другое устройство памяти. Хотя диски памяти файлового типа и не потребляют системную память, бесконтрольное создание устройств памяти может привести к тому, что через несколько месяцев у вас появятся вопросы – откуда они взялись в каталоге /dev. Узнать о наличии устройств памяти в системе можно с помощью команды mdconfig –l, которая выведет список всех устройств md(5).
# mdconfig —l md0 md1
Как? У меня два устройства памяти? Чтобы узнать тип устройства памяти, следует добавить ключ –u и номер устройства. Давайте посмотрим, что это за устройство с номером 1 (/dev/md1):
# mdconfig —l —u 1
md1 vnode 456M /slice1/usr/home/mwlucas/iso/omsa-51-live.iso
Оказывается, у меня смонтирован еще один ISO-образ? Ух ты! Возможно, через несколько месяцев мне придется выполнить перезагрузку. Впрочем, это слишком трудоемко для меня, поэтому я просто демонтирую файловую систему.
Файловые системы в файлах
Одна из интересных возможностей, используемых для создания клетки (глава 9) и размещения самодельных встроенных систем (глава 20), заключается в создании полных образов файловой системы в локальной файловой системе. В предыдущем разделе мы видели, как можно использовать диски памяти для монтирования и доступа к образам компакт-дисков. Вы можете использовать тот же самый прием для создания и доступа к образам дисков с файловой системой FFS. Недостаток такого способа состоит в том, что объем такого диска равен размеру файла образа. Если создать образ диска размером 500 Мбайт, он займет 500 Мбайт на диске.
Для работы с файловой системой в файле необходимо создать файл требуемого размера, подключить файл к устройству памяти, разместить файловую систему на устройстве и смонтировать его.
Создание пустого файла
Файл, внутри которого предполагается создать файловую систему, изначально не должен содержать никаких данных – это всего лишь файл нужного размера. Можно было бы усесться поудобнее и вручную набить огромное число нулей, чтобы создать такой файл, однако FreeBSD имеет неограниченный источник «ничего», который избавит вас от такой неприятной работы. Устройство /dev/zero до краев наполнено пустотой, которую можно использовать для заполнения файла.
Здесь вам поможет та же самая команда dd(1), которую вы использовали для копирования установочных дискет в файл с файловой системой. Следующая команда копирует данные из устройства /dev/zero в файл filesystem.file.
# dd if=/dev/zero of=filesystem.file bs=1m count=1k
1048576+0 records in
1048576+0 records out
1073741824 bytes transferred in 24.013405 secs (44714268 bytes/sec)
Эта команда берет данные их входного файла /dev/zero и выводит их в выходной файл filesystem.file . Передача данных производится блоками размером 1 Кбайт , и так один миллион раз . Это занимает всего несколько секунд , а поскольку устройству /dev/zero не приходится всякий раз тратить время на создание очередного символа, файл наполняется с очень высокой скоростью . Если теперь заглянуть в текущий каталог, там можно будет увидеть файл filesystem.file, размером 1 Гбайт.
Очень часто в заблуждение вводят такие параметры команды dd(1), как размер блока (block size) и счетчик (count). Вычисление конечного размера файла, создаваемого командой dd(1), напоминает перемещение груды песка – вся работа делится на три этапа: погрузка, перемещение и выгрузка определенной порции. Вы можете сделать несколько рейсов с тачкой, в несколько раз больше – с ведром или много-много рейсов с ложкой. Объем, переносимый за раз, – это размер блока, а число рейсов – счетчик. Вы можете носить песок в пригоршнях, и тогда размер блока будет маленький, а число рейсов – большим. Возможно, у вас имеется тачка, куда поместится блок среднего размера, и тогда число рейсов будет не так велико. А возможно, у вас есть экскаватор, который способен переместить весь песок за один рейс. Чем больше размер блока, тем выше нагрузка на систему при его перемещении. Команда dd(1) способна воспринимать различные сокращения, используемые для обозначения одного блока и количества перемещений, как показано в табл. 8.2.
Допустим, что вам требуется получить файл размером 1 Гбайт. Не забывайте, что 1k обозначает один килобайт. Один мегабайт – это тысяча килобайт, а один гигабайт – одна тысяча мегабайт. Если использовать блоки размером 1 байт, а количество перемещений задать равным одному 1g, вашей системе придется совершить 1 073 741 824 рейсов, чтобы переместить песок. Каждый рейс будет очень легким, но их будет слишком много! С другой стороны, если выбрать размер блока равным 1g, а счетчик равным 1, тогда системе придется переместить всю кучу за один рейс. Я думаю, ее это не обрадует. Впрочем, как и вас. Вообще говоря, при размере блока 1m и небольшом числе рейсов конечная цель будет достигнута достаточно быстро, причем без особого перенапряжения системы. Если использовать размер блока, равный 1m, то счетчик будет обозначать размер файла в мегабайтах. При счетчике, равном 1k, будет создан файл, размером 1 Гбайт, при счетчике, равном 2k, – 2 Гбайт, при счетчике, равном 32, – 32 Мбайт и т. д.
Таблица 8.2. Сокращения, которые распознает команда dd
Символ Значение
b k m g w
Множитель
512
1024
1048576
1073741824
Размер целого числа в байтах на вашей платформе
Дисковый блок Кило
Мега
Гига
Целое
Создание файловой системы в файле
Чтобы создать файловую систему в файле, для начала необходимо связать файл с устройством диска памяти файлового типа. Делается это точно так же, как и в предыдущем разделе:
# mdconfig —a —t vnode —f filesystem.file md0
Теперь можно создавать файловую систему на этом устройстве. Сама процедура очень напоминает создание файловой системы FFS на дискете с помощью команды newfs(8). Механизм Soft Updates весьма благоприятно сказывается при работе с файловыми системами, расположенными внутри файлов, поэтому желательно указать ключ –U, который активирует этот механизм.
# newfs —U /dev/md0
/dev/md0: 1024.0MB (2097152 sectors) block size 16384, fragment size 2048
using 6 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
with soft updates
super-block backups (for fsck -b #) at:
160, 376512, 752864, 1129216, 1505568, 1881920
Утилита newfs(8) вывела такие основные сведения о диске, как размеры блоков и фрагментов, а также число индексных дескрипторов.
Теперь, когда файловая система создана, ее можно монтировать:
# mount /dev/md0 /mnt
Поздравляю! Теперь в вашем распоряжении имеется файловая система, расположенная внутри файла, размером 1 Гбайт. В нее можно копировать файлы, можно создать резервную копию этой файловой системы на магнитной ленте и делать все то, что можно делать с любой другой файловой системой. Но, кроме того, ее можно перемещать из каталога в каталог, подобно любому другому файлу. Мы будем использовать такую возможность, когда в следующей главе будем рассматривать клетки, которые играют важную роль при создании собственных встроенных систем.
Файловые системы внутри файлов и /etc/fstab
Файловые системы, расположенные внутри файлов, можно монтировать автоматически, во время загрузки системы, если добавить соответствующую строку в /etc/fstab, точно так же, как в случае с другими дисками памяти. Для этого нужно просто указать имя файла с ключом –F и добавить ключ –P, чтобы предотвратить создание новой файловой системы и использовать уже существующую. Следующая строка предполагает автоматическое монтирование созданной выше файловой системы, находящейся внутри файла, в каталог /mnt во время загрузки. (Я предупреждал вас, что нам доведется увидеть примеры строк в /etc/fstab, которые делают его еще более трудночитаемым, не так ли?)
md /mnt mfs rw,-P,-F/home/mwlucas/filesystem.file 0 0
Прочие файловые системы
FreeBSD поддерживает несколько других, малоизвестных файловых систем. Большинство из них используется в достаточно необычных ситуациях, но в системном администрировании такие необычные ситуации случаются ежедневно.
devfs(5) – это файловая система устройств, которая располагается в каталоге /dev. В этой файловой системе нельзя хранить обычные файлы, она поддерживает только файлы устройств. Содержимым этой файловой системы напрямую управляют ядро и демон файловой системы устройств – devd(8).
procfs(5) – это файловая система процессов, она содержит огромный объем информации о процессах. Эта файловая система представляет угрозу безопасности и потому не рекомендуется к использованию в современных версиях FreeBSD. Однако при наличии монтированной файловой системы процессов можно узнать много интересного о процессах. Некоторые старые приложения требуют, чтобы эта файловая система была смонтирована в каталог /proc – если приложение сервера требует наличия procfs, попробуйте найти аналогичное приложение, которое не предъявляет таких требований.
При использовании режима совместимости с Linux (глава 12) может потребоваться монтировать файловую систему linprocfs(5). Значительная часть программного обеспечения для Linux требует наличия файловой системы процессов и при выборе режима совместимости с Linux операционная система FreeBSD предлагает установить linprocfs в каталог /compat/linux/proc. Я рекомендую устанавливать linprocfs, только если имеется программное обеспечение, требующее ее присутствие.
fdescfs(5), файловая система дескрипторов, предоставляет возможность просматривать дескрипторы файлов для каждого процесса. Существуют программы, требующие наличия fdescfs(5). Она представляет меньшую угрозу безопасности, чем procfs, тем не менее использовать ее нежелательно.
Привязка устройств
Диски с интерфейсом SCSI не всегда включаются в одном и том же порядке, но нумерация устройств SCSI в системе FreeBSD соответствует порядку, в каком они подключены к шине SCSI. Кроме того, если изменить порядок подключения устройств к шине SCSI, это приведет к изменению порядка, в каком они будут опрашиваться. Диск, который имел порядковый номер 0 при установке FreeBSD, после добавления нового диска может получить номер 1. Такое изменение может привести к тому, что разделы будут монтироваться в неверные точки монтирования, и может даже вызвать повреждение данных. Похожая проблема может возникнуть при добавлении нового контроллера SCSI, так как в этом случае произойдет переупорядочение шин SCSI! Например, устройство, имевшее имя /dev/da0 при установке FreeBSD, может превратиться в устройство /dev/da1 или даже /dev/da17 после подключения нового накопителя на магнитных лентах. Это приведет к тому, что разделы будут монтированы в неверные точки монтирования.
Во избежание этих трудностей порядок нумерации дисков можно жестко закодировать в ядре. Процесс, избавляющий от подобной путаницы, называется привязкой (wiring down) устройств SCSI. Чтобы выполнить привязку устройств, надо знать SCSI ID, номер шины SCSI и LUN (если применяется) каждого устройства в цепочке SCSI, доступных в /var/run/dmesg.boot. Например, в моей тестовой системе есть следующие записи dmesg для адаптера SCSI:
ahc0: <Adaptec 2940B Ultra2 SCSI adapter> port 0xe000-0xe0ff mem 0xe8042000-
0xe8042fff irq 11 at device 20.0 on pci0
aic7890/91: Ultra2 Wide Channel A, SCSI Id=7, 32/253 SCBs
В первой строке сообщается, что основная карта SCSI – это адаптер «Adaptec 2940B Ultra2». Во второй содержится дополнительная информация об адаптере на этой карте. На самом деле здесь есть только одна физическая карта. Хост-адаптер использует SCSI ID 7. LUN не применяется.
Далее, в файле dmesg.boot содержатся записи для всех дисков SCSI. Эти записи включают в себя такие сведения, как емкость диска, название модели, скорость и дополнительные особенности, но я приведу здесь только первые строки записей для каждого диска:
da0 at ahc0 bus 0 target 8 lun 0 da1 at ahc0 bus 0 target 9 lun 0
da2 at ahc0 bus 0 target 10 lun 0
…
Эти строки сообщают, что диск da0 подсоединен к карте SCSI ahc0 , на шине 0 , SCSI ID 8 , LUN равен 0 . Диск da1 расположен на той же самой карте SCSI и той же шине, однако SCSI ID равен 9 .
Чтобы выполнить привязку дисков, сообщите ядру, какой номер шины SCSI к какой карте подключается, SCSI ID и LUN для каждого диска. Эту информацию следует поместить в файл /boot/device.hints:
hint.scbus._0.at=»ahc0″ hint.da.0.at=»scbus0″ hint.da.0.target=»8″ hint.da.1.at=»scbus0″ hint.da.1.target=»à9″
Здесь ядру FreeBSD сообщается, что шина SCSI с номером 0 должна подключаться к карте ahc0 . Диск da0 подключен к шине SCSI с номером 0 и имеет SCSI ID 8 , а диск da1 подключается к той же шине и имеет SCSI ID 9 à. Во время следующей перезагрузки устройства будут нумероваться так, как указано здесь. Если добавить еще одну карту SCSI или дополнительные жесткие диски SCSI, FreeBSD присвоит номера новым шинам и устройствам с учетом номеров, зарезервированных для этих устройств. При наличии нескольких устройств с разными номерами LUN в файле /boot/device.hints можно использовать параметр lun.
Добавление новых жестких дисков
Прежде чем можно будет использовать новый жесткий диск, его надо отформатировать, разместить на нем файловые системы, смонтировать эти файловые системы и перенести на них данные. Хотя во FreeBSD имеются инструменты командной строки, позволяющие выполнить все эти операции, тем не менее действия можно упростить с помощью sysinstall(8). Если вы спешите, то наверняка выберете sysinstall. Предположим, что вы добавляете диск в существующую систему, а ваша конечная цель состоит в том, чтобы перенести на этот диск данные.
Резервное копирование, резервное копирование и еще раз резервное копирование!
Прежде чем выполнять какие-либо операции с жесткими дисками, следует создать полную резервную копию. Одно неверное движение при выполнении таких операций может разрушить вашу систему! Несмотря на то, что корневая файловая система форматируется очень редко, тем не менее, если такое случается, вам наверняка захочется восстановить ее как можно быстрее.
Добавление новых жестких дисков 309 Создание участков
В первую очередь при работе с новым жестким диском следует создать на нем участки и разделы. Выполните следующие шаги:
- Войдите в систему как root и запустите sysinstall(8). Мы будем конфигурировать систему уже после установки, поэтому выбираем Configure и затем Disk.
- Меню покажется знакомым; вы применяли его при установке FreeBSD. (См. снимки экранов на рис. 2.4 главы 2.) Вы увидите существующий диск FreeBSD и новый диск. Выберите новый диск.
- Если диск взят с другого сервера, на нем может оказаться файловая система. Можно сохранить содержимое диска, а можно очистить его и начать с нуля. Обычно проще всего удалить существующие разделы и файловые системы. С помощью клавиш-стрелок перейдите к существующему разделу и нажмите клавишу D для его удаления.
- Далее создайте новый участок, нажав клавишу C, или задействуйте весь диск (клавиша A). На сервере лучше задействовать весь диск. Выбрав конфигурацию участков, сохраните внесенные изменения нажатием клавиши W. Появится следующее предостережение:
WARNING: This should only be used when modifying an EXISTING installation. If you are installing FreeBSD for the first time then you should simply type Q when you’re finished here and your changes will be committed in one batch automatically at the end of these questions. If you’re adding a disk, you should NOT write from this screen, you should do it from the label editor.
(ПРЕДОСТЕРЕЖЕНИЕ: Такой вариант следует применять только при изменении - СУЩЕСТВУЮЩЕЙ системы. Если вы устанавливаете FreeBSD с нуля, то после
- внесения изменений нажмите <Q>. В этом случае все изменения будут
- одновременно приняты после получения ответов на данные вопросы. Если вы
- добавляете диск, вам НЕ следует осуществлять запись из этого экрана,
- делать это следует в редакторе меток.)
- Абсолютно ли вы уверены в своем выборе?
- Да,выабсолютноуверены.ПерейдитекпунктуYesинажмитеEnter.
- Далее будет задан вопрос о необходимости установки на этот диск менеджера загрузки. На дополнительном диске он не нужен, поэтому спускаемся к пункту Standard и нажимаем клавишу пробела. Программа sysinstall должна сообщить, что информация fdisk записана. Теперь на диске есть участок FreeBSD. Нажмите клавишу Q, чтобы покинуть этот экран systinstall.
Создание разделов
Для создания разделов на диске выполните следующие шаги:
1. ВыберитепунктLabelвsysinstall(8),втомжеподменю,гденаходится FDISK. Выберите новый диск, чтобы перейти в редактор меток. С помощью команды C здесь можно создать новый раздел, указав его размер в мегабайтах, гигабайтах, дисковых блоках или дисковых цилиндрах. Кроме того, необходимо определиться с предназначением каждого нового раздела – будет ли это файловая система или пространство свопа. Когда программа потребует указать точку монтирования, введите каталог /mnt. Программа sysinstall временно будет монтировать новые разделы в этот каталог.
По окончании создания разделов нажмите W для подтверждения изменений. Должен появиться текст предупреждения, который вы уже видели в меню fdisk, а затем сообщение от newfs(8).
По окончании работы с newfs(8) завершите sysinstall.
Конфигурирование /etc/fstab
Теперь следует добавить записи с информацией о новых дисках в /etc/ fstab. Порядок конфигурирования новых разделов свопа и файловых систем выполняется по-разному. Любое пространство свопа в /etc/ fstab описывается следующим образом:
devicename none swap sw 0 0
Если представить, что новому разделу свопа соответствует устройство /dev/da10s1b, тогда в /etc/fstab следует добавить следующую строку:
/dev/da10s1b none swap sw 0 0
Во время следующей загрузки система FreeBSD найдет эту запись и активизирует новое пространство свопа. Чтобы активизировать новое пространство свопа без перезагрузки, можно ввести команду swapon –a devicename.
Если был создан новый раздел данных, добавьте новую запись, как описывалось выше в этой главе, например, такую:
/dev/da10s1d /usr/obj ufs rw 2 2
Теперь можно просто отмонтировать новый раздел от точки временного монтирования, запустить команду mount /usr/obj, и ваш новый диск будет готов к приему файлов.
Перенос существующих файлов на новые диски
Вероятно, новый диск призван заменить существующий раздел FreeBSD либо взять на себя часть данных существующего раздела. Для этого надо предоставить системе доступ к новому разделу во временной точке монтирования. Переместите файлы из старого раздела в новый. Затем заново смонтируйте раздел в требуемом месте.
В примере выше новый раздел был смонтирован в каталог /mnt. Теперь надо перенести файлы из их текущего местоположения в новый раздел, не изменяя права доступа к файлам. Такая задача решается довольно просто с помощью tar(1). Вы можете просто сохранить существующие данные на ленте или в файле с помощью tar, а затем разархивировать их в новом месте. Однако последовательно выполнять эти операции неудобно. Объединив команды tar, можно обойтись без промежуточного этапа:
# tar cfC /old/directory . | tar xpfC /tempmount
Эта строка может озадачить тех, кто не говорит на языке UNIX на вечеринках. Разберем ее по частям. Во-первых, вы переходите в старый каталог и архивируете все его содержимое. Затем вывод этой команды переносится в новый каталог, где данные разархивируются. Например, для перемещения /usr/src на новый раздел, временно монтированный в /mnt, подойдет такая последовательность команд:
# tar cfC /usr/src . | tar xpfC /mnt
Проверьте содержимое точки временного монтирования и убедитесь, что все файлы действительно были скопированы. Как только вы убедитесь, что файлы были благополучно скопированы, удалите файлы из старого каталога и смонтируйте новый диск в новое местоположение. Например, после копирования файлов из /usr/src можно было бы выполнить следующую последовательность команд:
# rm —rf /usr/src/* # umount /mnt
# mount /usr/src
Перенос активных файлов
Вам не удастся благополучно переместить файлы, если они в этот момент подвергаются изменению. Например, при переносе почтового спула на новый раздел выключите почтовые сервисы. В противном случае файлы изменятся, когда вы будете их копировать. Избежать необходимости останавливать сервисы не удастся, но с помощью таких инструментов, как rsync (/usr/ports/ net/rsync), время простоя можно уменьшить.
Составное монтирование
Предположим, что вам нет дела до старых данных, и вы просто хотите освободить место на диске. Вы планируете восстановить свои данные из резервной копии. Разумно. Все файловые системы BSD – составные (stackable). Они обладают расширенными возможностями, которые не особо полезны в повседневном администрировании. Однако эти возможности придут на помощь, когда потребуется разделить один раздел на два.
Предположим, что ваши данные хранятся в /usr/src. Посмотрите объем используемого дискового пространства и затем смонтируйте новый раздел в /usr/src. Если вы зайдете в каталог /usr/src, то увидите, что он пуст.
Есть одна загвоздка: новый раздел монтирован «поверх» старого диска, а все данные по-прежнему находятся на старом диске. На старом разделе не появится свободное место, пока вы не переместите данные. Если размонтировать новый раздел и снова проверить каталог, вы увидите, что данные чудесным образом восстановлены! Новый раздел скрывал старый.
Вы не можете это увидеть, но данные на старом диске по-прежнему занимают определенное пространство. Если вы перераспределяете диск для получения дополнительного пространства, а новый диск монтируете поверх старого, дисковое пространство на исходном диске будет недоступно. Мораль: даже при восстановлении данных с резервной копии надо убедиться, что данные перемещены с исходного диска и дисковое пространство освобождено.
Сетевые файловые системы
Сетевая файловая система обеспечивает возможность доступа по сети к файлам, расположенным на другом компьютере. В качестве сетевых файловых систем наиболее часто используются Network File System (NFS), изначально реализованная в UNIX, и CIFS (известна также как SMB), которая используется в Microsoft Windows. Мы рассмотрим обе файловые системы, но начнем с NFS, старого стандарта для UNIX.
Организовать совместный доступ к каталогам и разделам для UNIXподобных систем проще всего с помощью сетевой файловой системы NFS (Network File System). Система FreeBSD изначально обладает поддержкой NFS. Настройка NFS часто пугает начинающих администраторов, но, выполнив эту процедуру пару раз, вы увидите, что в ней нет ничего сложного.
Все соединения NFS следуют модели клиент-сервер. Один компьютер играет роль сервера – он предоставляет доступ к своим файловым системам для других компьютеров. Это называется экспортирование NFS (NFS exporting), а предоставляемые файловые системы называются предметами экспорта (exports). Клиенты могут монтировать
предметы экспорта почти так же, как локальные файловые системы.
Интересно заметить, что NFS не имеет информации о своем состоянии, она не следит за состоянием соединения. Сервер NFS можно перезагрузить, и клиент при этом не пострадает. Конечно, пока сервер не заработает, он не сможет обращаться к файлам, находящимся в предметах экспорта, но как только сервер запустится, клиент окажется там же, где и остановился. Другие сетевые файловые системы не всегда так дружелюбны. Безусловно, отсутствие информации о состоянии вызывает некоторые проблемы, например, клиент не узнает, что файл, открытый им, был в это же время изменен другим клиентом.
Как для NFS-серверов, так и для NFS-клиентов необходимо выполнить настройку ядра, но различные команды NFS динамически загружают необходимые модули ядра. Ядро FreeBSD GENERIC имеет поддержку NFS, поэтому можно не беспокоиться по поводу настройки ядра.
NFS – это одна из тем, которым посвящены целые книги. Мы не будем рассматривать NFS во всех подробностях, а сфокусируем свое внимание на выполнении основных операций. Если необходимо развернуть NFS сложной конфигурации, то вам придется произвести дополнительные исследования этой темы. Но даже такая простая конфигурация, которая обсуждается ниже, поможет вам в решении многих сложных задач.
Запуск сервера NFS
Чтобы включить поддержку сервера NFS, необходимо добавить в файл rc.conf следующие параметры настройки. Не все из этих параметров являются обязательными для всех возможных случаев, тем не менее все вместе они обеспечивают высокий уровень функциональной совместимости NFS и достаточно приличную производительность.
nfs_server_enable=»YES» rpcbind_enable=»YES»
mountd_enable=»YES»
rpc_lockd_enable=»YES» rpc_statd_enable=»YES»
Первый параметр сообщает FreeBSD о необходимости загрузить модуль nfsserver.ko , если он еще не загружен. rpcbind(8) отображает удаленные вызовы процедур (remote procedure calls, RPC) в локальные сетевые адреса. Все клиенты NFS спрашивают у демона rpcbind(8), работающего на стороне сервера, где они могут отыскать демон mountd(8), чтобы соединиться с ним. mountd(8) ожидает получения запросов клиентов на соединение на одном из портов верхнего диапазона. При активации сервера NFS также запускается демон nfsd(8), который обслуживает фактический доступ к файлам. rpc.lockd(8) обеспечивает блокировку файлов в NFS, а rpc.statd(8) следит за клиентами NFS, чтобы сервер NFS мог освобождать ресурсы после отключения клиентов.
Эти службы можно запускать из командной строки, если вы знакомы с NFS, но после выполнения необходимых настроек лучше выполнить перезагрузку системы. После этого вы сможете увидеть rpc.lockd, rpc.statd, nfsd, mountd и rpcbind в выводе команды sockstat(1). Если какой-то из этих демонов отсутствует в списке, просмотрите содержимое файла /var/log/messages на наличие сообщений об ошибках.
Настройка экспорта NFS
Теперь необходимо сообщить серверу, какие каталоги являются предметом экспорта. Можно было бы просто экспортировать все каталоги и файловые системы сервера, но любой администратор, компетентный в вопросах безопасности, предпочтет внести свои ограничения. Как и в любом другом случае, доступным следует делать лишь то, что действительно необходимо. Например, в большинстве случаев клиентам не требуется монтировать корневую файловую систему сервера NFS.
Перечень клиентов и доступных им файловых систем и каталогов находится в файле /etc/exports. Для каждого диска на стороне сервера в этом файле отводится отдельная строка, в которой также перечисляются клиенты, обладающие правом доступа к этому устройству. Строки могут содержать до трех частей:
- Экспортируемые каталоги или разделы (обязательное поле)
- Параметры экспорта
-
Клиенты, которые могут монтировать этот каталог
Каждой комбинации клиентов и дискового устройства в этом файле может соответствовать всего одна строка. То есть, если на одном и том же разделе находятся каталоги /usr/ports и /usr/home, и оба эти каталога необходимо сделать доступными для одного и того же клиента, они должны быть перечислены в одной и той же строке. Невозможно экспортировать /usr/ports и /usr/home одному и тому же клиенту с разными правами доступа. Не обязательно экспортировать весь диск, можно экспортировать единственный каталог. Этот каталог не может содержать символических ссылок.
Из трех частей записи в /etc/exports обязательной является только первая – имя каталога. Например, если бы мне захотелось экспортировать свой домашний каталог всем желающим в Интернете, я мог бы добавить в файл /etc/exports следующую строку:
/home/mwlucas -
Здесь отсутствуют какие—либо параметры и ограничения. Это, конечно, глупо, но вполне возможно.1
Почему же не предусмотрена защита от таких вот «самострелов»? Надо сказать, операционная система UNIX не считает тех, кто способен на такой шаг, достойными своей дружбы. За такое негуманное поведение многие не устают проклинать UNIX, но, по—моему, так даже интереснее.
После редактирования файла /etc/exports необходимо сообщить демо-
ну mountd о том, чтобы он перечитал его.
# /etc/rc.d/mountd restart
Любые ошибки заносятся демоном mountd(8) в файл протокола /var/ log/messages. Сообщения в файле протокола носят довольно загадочный характер: mountd(8) обычно сообщает, что строка содержит ошибку, но, как правило, не говорит – какую. Наиболее типичные ошибки, из тех, с которыми я сталкивался, связаны с наличием символических ссылок.
Активация клиента NFS
Настройка клиента выглядит намного проще, для этого достаточно поместить в /etc/rc.conf следующую строку:
nfsclient=»YES»
После этого нужно перезагрузить систему или запустить команду /etc/ rc.d/nfsclient start. В обоих случаях будет активирована поддержка клиента NFS.
Теперь можно монтировать каталоги и файловые системы, экспортируемые серверами NFS, только вместо имени устройства следует указывать сетевое имя сервера NFS и монтируемый каталог. Например, чтобы смонтировать каталог /home/mwlucas, экспортируемый сервером sardines, в каталог /mnt, можно запустить такую команду:
# mount sardines:/home/mwlucas /mnt
После этого с помощью df(1) можно убедиться, что каталог смонтирован.
# df
Filesystem 1K-blocks
/dev/ad4s1a 1012974
devfs 1
/dev/ad4s1f 109009798 12959014 87330002 /dev/ad4s1e 1012974 42072 889866 sardines:/home/mwlucas 235492762 150537138 66116204
Mounted on
/
/dev
Смонтированный каталог NFS выглядит как обычный раздел и позволяет читать и записывать файлы, какие понравятся. Ну, может быть, не все, какие понравятся…
NFS и пользователи
Принадлежность файла и права доступа к нему определяются по числовым идентификаторам UID. Для идентификации владельца NFS тоже использует UID. Например, в моем ноутбуке пользователь mwlucas имеет UID, равный 1001. На сервере NFS пользователь mwlucas также имеет UID, равный 1001. Это упрощает мне жизнь, потому что я не должен беспокоиться по поводу принадлежности файлов – у меня одинаковые привилегии и на сервере, и на ноутбуке. В больших сетях, где пользователи обладают привилегиями root на своих машинах, это может вызывать проблемы. Лучший способ избежать их – создать центральный репозитарий авторизованных пользователей с доступом через Kerberos. В небольших сетях или в сетях с небольшим числом пользователей NFS таких проблем обычно не возникает – можно просто синхронизировать файлы /etc/master.passwd на всех системах или просто присвоить одно и то же значение UID каждому пользователю в каждой системе.
Однако пользователь root обслуживается несколько иначе. Сервер NFS не доверяет пользователям root с других компьютеров выполнять операции на сервере от имени root. В конечном итоге едва ли кто-то захочет, чтобы его сервер был остановлен, если злоумышленник взломает сервер NFS. Запросы, поступающие от root, можно отобразить на любую другую учетную запись. Например, можно потребовать, чтобы все запросы, поступающие от пользователя root клиентского компьютера, обслуживались с привилегиями пользователя на сервере nfsroot. При внимательном отношении к группам можно было бы дать пользователю nfsroot ограниченный доступ к файлам. Чтобы отобразить пользователя root в другого пользователя, следует указать параметр –maproot. В следующей строке производится отображение UID 0 (root) на стороне клиента в пользователя с UID 5000 на стороне сервера.
/usr/home/mwlucas -maproot=5000
Если действительно необходимо, чтобы пользователь root клиентского компьютера обладал привилегиями root на сервере, следует использовать отображение –maproot в UID 0. Такой подход может оказаться подходящим для домашней сети или для тестовой системы.
По умолчанию, если не использовать отображение –maproot, NFS будет отображать учетную запись удаленного пользователя root в учетную запись nobody:nobody на сервере.
Не забывайте перезапускать mountd(8) после редактирования файла /etc/exports.
Экспорт нескольких каталогов
Из раздела /usr можно было бы экспортировать множество каталогов. Среди наиболее вероятных кандидатов на экспорт можно было бы назвать каталоги /usr/src, /usr/obj и /usr/ports/distfiles. Список всех каталогов, находящихся на одном и том же разделе, должен располагаться в одной строке файла /etc/exports, сразу вслед за первым каталогом; разделителем должен быть пробел. Мой файл /etc/exports сейчас выглядит так:
/usr/home/mwlucas /usr/src /usr/obj /usr/ports/distfiles -maproot=5000
Здесь нет ни идентификаторов, ни разделителей между отдельными частями строки. Конечно, файл было бы проще читать, если бы описание каждого экспортируемого каталога находилось в отдельной строке, но это невозможно, так как все эти каталоги находятся на одном и том же разделе. Группа разработчиков FreeBSD могла бы ликвидировать эту проблему, но тогда формат файла /etc/exports FreeBSD окажется несовместим с форматом файла в других версиях UNIX.
Как и в случае со многими другими конфигурационными файлами, можно использовать символ обратного слэша для деления одной конфигурационной записи на несколько строк. Так, строка, которая была показана выше, может быть записана более удобочитаемым образом:
/usr/home/mwlucas \
/usr/src \
/usr/obj \
/usr/ports/distfiles \
-maproot = 5000
Ограничение клиентов
Чтобы дать право доступа к экспортируемым каталогам NFS только определенным клиентам, их следует перечислить в конце записи в файле /etc/exports. Ниже показана запись, которая разрешает доступ к разделяемым ресурсам только с одного IP-адреса:
/usr/home/mwlucas /usr/src /usr/obj /usr/ports/distfiles \
-maproot=5000 192.168.1.200
Подобным образом, используя квантификаторы –network и –mask, можно дать право доступа только клиентам из определенной сети:
/usr/home/mwlucas /usr/src /usr/obj /usr/ports/distfiles \
-maproot=5000 -network 192.168.0 -mask 255.255.255.0
Эта запись позволит клиентам, чьи IP-адреса начинаются с 192.168.0, получить доступ к серверу NFS. Подобные настройки я использую для быстрого обновления клиентов. Я собираю новые пакеты и ядро на сервере NFS, а затем позволяю клиентам смонтировать эти разделы и установить скомпилированные двоичные файлы через NFS.
Комбинирование клиентов и экспортируемых каталогов
Каждая строка в файле /etc/exports определяет экспортируемые каталоги из одного раздела и хост или несколько хостов клиентов. Для разных хостов можно создать совершенно разные определения экспорта.
/usr/home/mwlucas /usr/src /usr/obj /usr/ports/distfiles \
-maproot=5000 192.168.1.200
/usr -maproot=0 192.168.1.201
В этом примере несколько каталогов из раздела /usr экспортируются клиенту NFS с IP-адресом 192.168.1.200. А клиент с адресом 192.168. 1.201 может смонтировать весь раздел /usr, и даже с правами root.
Производительность NFS и параметры
FreeBSD использует консервативные настройки NFS по умолчанию, поэтому она прекрасно работает с любыми другими UNIX-подобными операционными системами. Если NFS используется исключительно в окружении систем FreeBSD или сеть состоит только из высокопроизводительных систем UNIX, можно повысить производительность NFS за счет использования дополнительных параметров монтирования.
Во-первых, по умолчанию NFS работает через протокол UDP. Если воспользоваться параметром tcp или –T, для отправки запросов на монтирование клиенты будут использовать протокол TCP.
Программы предполагают, что файловая система не может исчезнуть, но когда речь идет о файловой системе NFS, всегда есть вероятность, что сервер пропадет из сети. В результате программы на стороне клиента, пытающиеся получить доступ к файловой системе NFS, могут зависнуть навсегда. Если с помощью параметра intr сделать операцию монтирования NFS прерываемой (interruptible), можно будет с помощью комбинации Ctrl-C прерывать работу процессов, зависших при попытке смонтировать недоступный раздел NFS.
FreeBSD может уведомлять клиентов в случае недоступности файловой системы. В результате вместо зависания программы будут терпеть неудачу при попытке получить доступ к файловой системе.
Наконец, можно установить размеры запросов на чтение и запись. Значения по умолчанию отлично подходили для сетей начала 90-х годов, но вы с помощью ключей –r и –w можете указать иные размеры, более подходящие для современных условий. Я установил, что для обоих параметров отлично подходит значение 32768. А теперь, объединив все вышесказанное, я мог бы на стороне клиента использовать такую команду монтирования файловой системы NFS:
# mount —o tcp,intr,soft,—w=32768,—r=32768 server:/usr/home/mwlucas /mnt Соответствующая ей запись в файле /etc/fstab выглядит так:
server:/usr/home/mwlucas /mnt nfs rw,-w=32768,-r=32768,tcp,soft,intr 0 0
Такая конфигурация NFS обеспечивает мне хорошую пропускную способность в локальной сети, ограниченную только возможностями аппаратных средств.
Хотя настройка NFS для простых случаев выполняется достаточно легко, тем не менее ее расширение и улучшение может занять массу времени. Если вы предполагаете выстраивать сложные схемы построения окружения NFS, не полагайтесь на это короткое введение, а лучше потратьте свое время на изучение хорошей книги по данной теме.
FreeBSD и CIFS
В типичной офисной сети стандартным протоколом совместного использования файлов в сети является общая межсетевая файловая система (Common Internet File Sharing), или CIFS. (Некогда CIFS была известна как блок сообщений сервера (Server Message Block), или SMB.) Это то самое «Сетевое окружение» («Network Neighborhood»), доступ к которому имеют пользователи Windows. Изначально этот протокол поддерживался только операционной системой Windows, но позднее он стал чем-то вроде стандарта. К счастью, в настоящее время имеется реализация сервера CIFS с открытыми исходными текстами под названием Samba. Многие коммерческие продукты предоставляют свои услуги через этот протокол. Система FreeBSD также включает в себя модули ядра, обеспечивающие поддержку файловой системы и программ для поиска, монтирования и использования разделяемых ресурсов CIFS.
Подготовительные операции
Прежде чем использовать сетевую файловую систему компании Microsoft, необходимо собрать следующую информацию о сети Windows:
- Название рабочей группы или домена
- Имя пользователя Windows и пароль
-
IP—адрес Windows—сервера DNS
Поддержка в ядре
Поддержка CIFS в операционной системе FreeBSD осуществляется несколькими модулями ядра. Базовые операции CIFS поддерживаются модулем smbfs.ko. Модули libmchain.ko и libiconv.ko предоставляют функции поддержки и загружаются автоматически вместе с модулем smbfs.ko. Вы можете скомпилировать эти модули в ядре статически:
options NETSMB - options LIBMCHAIN
- options LIBICONV
- options SMBFS
-
Безусловно, эти модули можно загружать во время загрузки системы, поместив соответствующие записи в файл /boot/loader.conf.
Конфигурирование CIFS
Настройки CIFS могут находиться в конфигурационном файле $HOME/.nsmbrc или /etc/nsmb.conf. Параметры настройки в файле /etc/nsmb.conf имеют приоритет перед настройками, которые размещаются в домашних каталогах. Конфигурационный файл делится на разделы с помощью меток, заключенных в квадратные скобки. Например, настройки, которые применяются к каждому соединению CIFS, находятся в разделе [default]. Создайте свои собственные разделы с указанием серверов, пользователей и разделяемых ресурсов в следующих форматах:
[servername] [servername:username] [servername:username:sharename]
Информация, которая применяется ко всему серверу, помещается в раздел, который следует сразу за именем сервера. Информация, которая применяется к конкретному пользователю, помещается в раздел с именем этого пользователя, а информация, применяемая к конкретному разделяемому ресурсу, вставляется в раздел, заголовок которого включает имя разделяемого ресурса. Если у вас нет информации, конкретной для каждого пользователя или разделяемого ресурса, тогда все сведения можно поместить в один большой раздел [servername].
В конфигурационных записях используются значения из системы CIFS, например, моя учетная запись во FreeBSD имеет имя mwlucas, а в Windows – lucas_m, поэтому я использую имя lucas_m в файле nsmb.conf.
Ключевые слова в nsmb.conf
Параметры настройки в файле nsmb.conf определяются с помощью ключевых слов и значений в соответствующих разделах. Например, серверы имеют IP-адреса, а пользователи – нет, поэтому параметр, определяющий IP-адрес, должен находиться только в разделе описания сервера. Чтобы использовать ключевое слово, ему нужно присвоить значение через знак равенства: keyword=value. Далее перечисляются наиболее часто употребляемые – полный список можно найти в странице руководства nsmb.conf(5).
workgroup=string
Ключевое слово workgroup определяет имя домена Windows или рабочей группы, доступ к которой требуется получить. Это типичная настройка по умолчанию, используемая для всех серверов.
addr=a.b.c.d
Ключевое слово addr определяет IP-адрес сервера CIFS. Данное ключевое слово может находиться только в разделе с меткой [servername].
nbns=a.b.c.d
Ключевое слово nbns определяет IP-адрес сервера имен NetBIOS (WINS). Вы можете добавить эту строку в раздел по умолчанию или в раздел с конкретным сервером. Если у вас имеется служба ActiveDirectory (которая основана на DNS), можно использовать имена хостов в DNS. Добавление сервера WINS не повредит вашей конфигурации и поможет проверить базовые настройки CIFS.
FreeBSD и CIFS 321 password=string
Ключевое слово password определяет пароль в открытом текстовом виде для пользователя или разделяемого ресурса. Если вам придется хранить пароли в /etc/nsmb.conf, вы должны обеспечить доступность этого файла на чтение только для пользователя root. Хранение паролей в многопользовательских системах в файле $HOME/.nsmbrc вообще недопустимо.
Пароли Windows можно зашифровать с помощью команды smbutil crypt. Она сгенерирует строку, которую можно использовать как значение этого ключевого слова. Зашифрованная строка начинается с двух символов доллара ($$). Шифрование предотвращает случайное раскрытие пароля, но злонамеренный пользователь легко может расшифровать его.
Разрешение имен CIFS
Давайте создадим типичный файл nsmb.conf. Для начала нам необходимо как минимум иметь возможность находить хосты в сети, а это означает, что нам необходимо знать имя рабочей группы. У нас имеется контроллер домена в виде сервера WINS. Кроме того, у меня имеется учетная запись на серверах Windows, предоставляющих доступ к разделяемым ресурсам, поэтому я буду использовать их как настройки по умолчанию в nsmb.conf.
[default]
workgroup=BIGLOSER
nbns=192.168.1.66
username=unix
Взяв эту информацию на вооружение, мы сможем производить базовые запросы на получение имен SMB.
# smbutil lookup ntserv1
Got response from 192.168.1.66
IP address of ntserv1: 192.168.1.4
Если все получилось, значит в вашем распоряжении имеется базовая функциональность CIFS.
Прочие функции smbutil(1)
Прежде чем можно будет монтировать разделяемые ресурсы Windows, необходимо иметь возможность зарегистрироваться на компьютере Windows. Эта операция доступна только пользователю root.
# smbutil login //unix@ntserv1 Password:
Итак, наша конфигурация правильная. Давайте с помощью команды smbutil view посмотрим, какие ресурсы предлагает этот сервер.
# smbutil view //unix@ntserv1 Password:
Share Type Comment ——————————-
IPC$ pipe
ADMIN$ disk
C$ disk
unix disk
Remote IPC
Remote Admin
Default share
4 shares listed from 4 available
Вы получите список всех разделяемых ресурсов на сервере CIFS. Теперь предположим, что мы завершили работу с сервером, и выходим из него.
# smbutil logout //unix@ntserv1
Монтирование разделяемого ресурса
Теперь, закончив исследования, можно выполнить монтирование ресурса с помощью mount_smbfs(8). Эта команда имеет следующий синтаксис:
# mount_smbfs //username@servername/share /mount/point
У меня имеется разделяемый ресурс MP3 на компьютере, работающем под управлением Windows, к которому я хочу получить доступ из системы FreeBSD. Чтобы смонтировать его в каталог /home/mwlucas/smbmount, я мог бы запустить следующую команду:
# mount_smbfs //unix@ntserv1/MP3 /home/mwlucas/smbmount
mount(8) и df(1) показывают, что этот ресурс подключен к системе и теперь можно обращаться к документам на этом сервере, как к файлам в любой другой файловой системе.
Другие параметры mount_smbfs
Утилита mount_smbfs поддерживает несколько ключей, влияющих на поведение монтируемых файловых систем CIFS. Ключ –f используется для выбора другого режима назначения прав доступа к файлам, а ключ –d – для выбора другого режима назначения прав доступа к каталогам. Например, чтобы определить права доступа к монтируемому каталогу, которые позволят обращаться к нему только мне, я мог бы запустить команду mount_smbfs –d 700. Это позволило бы сделать права доступа из системы FreeBSD более строгими, чем привилегии в Windows, и в моем случае это было бы именно то, что нужно. Владельца файла можно изменить с помощью ключа –u, а группу – с помощью ключа –g.
Имена файлов в файловых системах корпорации Microsoft не чувствительны к регистру символов, а в системах UNIX – наоборот. Файловая система CIFS по умолчанию оставляет регистр символов в именах файлов без изменений, но это может оказаться нежелательно. Ключ –c вынуждает mount_smbfs(8) менять регистр символов в именах файлов и каталогов: –c l изменяет регистр всех символов на нижний, а –c u – на верхний.
Примеры записей в nsmb.conf
Ниже приводятся примеры записей в файле nsmb.conf для различных ситуаций. В этих примерах предполагается, что все представленные записи являются частью конфигурации, в которой уже определены рабочая группа, сервер имен NetBIOS и имя пользователя с привилегиями доступа к разделяемым ресурсам CIFS.
Уникальный пароль на отдельной системе
Если предположить, что имеется некоторый компьютер с сетевым именем desktop, на котором открыт разделяемый ресурс, защищенный паролем, то можно использовать запись, аналогичную приведенной ниже. Многие системы Windows 9x используют такую возможность.
[desktop:shareusername] password=$$1789324874ea87
Доступ ко второму домену
В этом примере описывается доступ ко второму домену с именем development. В этом домене используются имя пользователя и пароль, которые отличаются от тех, что используются в домене по умолчанию.
[development]
workgroup=development
username=support
Принадлежность файлов в CIFS
Различия в определении принадлежности файлов в UNIX-подобных операционных системах и в Windows могут порождать проблемы. Начнем с того, что имена пользователей FreeBSD, возможно, не получится отобразить в имена пользователей Windows, а кроме того, в UNIX и в Windows используются совершенно непохожие схемы назначения прав доступа.
Если в Windows вы используете отдельную учетную запись для доступа к разделяемому ресурсу, вы обладаете теми правами доступа, которые имеет эта учетная запись в Windows, однако в FreeBSD для этого монтируемого ресурса вам необходимо назначить права доступа, используемые системой FreeBSD. По умолчанию утилита mount_smbfs(8) определяет те же самые права доступа для нового разделяемого ресурса, какие указаны для точки монтирования. В предыдущем примере владельцем каталога /home/mwlucas/smbmount был пользователь mwlucas, а для каталога были определены права 755. Эти права доступа говорят, что пользователь mwlucas обладает возможностью редактировать все, что находится в этом каталоге, но все остальные лишены такого права. Но даже когда FreeBSD позволяет данному пользователю редактирование указанных файлов, Windows может не позволить ему изменять файлы, находящиеся на разделяемом ресурсе.
Обслуживание разделяемых ресурсов CIFS
Точно так же, как операционная система FreeBSD может обращаться к разделяемым ресурсам CIFS, с помощью Samba она может предоставлять доступ клиентам CIFS к своим разделяемым ресурсам. Найти пакет Samba можно в каталоге /usr/ports/net/samba3. На веб-сайте проекта Samba (http://www.samba.org) кроме всего прочего можно найти множество полезных руководств. Обслуживание разделяемых ресурсов в операционной системе FreeBSD выполняется намного сложнее, чем доступ к ним, поэтому мы закончим обсуждение этой темы, чтобы книга не стала слишком толстой.
devfs
devfs(5) – это динамическая файловая система, предназначенная для управления файлами устройств. Не забывайте, что в UNIX-подобных системах все сущее является файлами. Это относится и к физическим устройствам. Для каждого устройства в системе имеется свой файл устройства в каталоге /dev.
Когда-то давно системный администратор нес ответственность за создание этих файлов устройств. Наиболее удачливые администраторы получали систему, поставляемую вместе с файлом сценария на языке командного интерпретатора, который создавал файлы устройств и определял права доступа к ним. Если производитель операционной системы не прилагал подобный сценарий, или к серверу были подключены необычные устройства, которые не обрабатывались этим сценарием, то системному администратору приходилось создавать файлы устройств с помощью магических заклинаний и утилиты mknod(8). В этом случае при малейшей ошибке устройство могло не работать. Как вариант можно было бы распространять операционную систему с файлами устройств для всех мыслимых аппаратных средств. Тогда системные администраторы могли бы быть уверены, или почти уверены, что нужный файл устройства находится где-то в каталоге /dev среди тысяч других файлов.
Безусловно, ядро точно знает, какими характеристиками должен обладать каждый файл устройства. Посредством devfs(5) операционная система FreeBSD просто спрашивает у ядра, какие файлы устройств, по его мнению, должны иметься в системе, и создает только те, которые действительно необходимы. Этот подход оправдывает себя в большинстве случаев. Однако наш с вами случай не попадает в это «большинство». Мы должны быть готовы к появлению многих неожиданностей. Возможно, нам потребуется создавать файлы устройств с другими именами, изменять права доступа или настраивать устройства уникальным образом. В операционной системе FreeBSD задача управления файлами устройств имеет три подзадачи: конфигурирование устройств на этапе загрузки, глобальная видимость и права доступа, а также конфигурирование устройств с помощью devd(8), которые появляются динамически уже после загрузки.
Управление устройствами и серверы
В большинстве случаев управление файлами устройств на серверах не предполагает каких-либо дополнительных настроек и вмешательства со стороны человека. Чаще всего с файлами устройств приходится возиться на ноутбуках и иногда на рабочих станциях. Инструментальные средства операционной системы FreeBSD, предназначенные для управления файлами устройств, обладают высокой гибкостью и включают поддержку таких ситуаций, с которыми я и не предполагал столкнуться в ближайшие сто лет. Мы затронем лишь самые основы. Не надо думать, что вам обязательно нужно овладеть навыками работы с devfs(5), чтобы обеспечить бесперебойную работу своего сервера!
devfs на этапе загрузки: devfs.conf
Самая большая проблема системного администратора, связанная с динамической файловой системой devfs, состоит в том, что все сделанные изменения исчезают при перезагрузке системы. Когда файлы устройств постоянно хранились на диске, системный администратор мог создавать символические ссылки на эти файлы или изменять права доступа к ним, не беспокоясь, что его изменения могут исчезнуть. С появлением автоматизированной и динамической файловой системы устройств такой уверенности больше нет. (Конечно, вам больше не нужно овладевать оккультными командами mknod(8), так что вам, скорее, повезло.) Среди изменений файлов устройств можно назвать следующие:
- Создание файлов устройств под различными именами
- Изменение принадлежности файлов устройств
-
Сокрытие файлов устройств от пользователей
На этапе загрузки devfs(5) создает файлы устройств в соответствии с правилами в файле /etc/devfs.conf.
devfs.conf
С помощью файла /etc/devfs.conf можно создавать символические ссылки, изменять принадлежность файлов устройств и определять права доступа к устройствам на этапе загрузки. Каждое правило имеет следующий формат:
операция устройство желаемое_значение
В качестве операции можно употреблять link (создание ссылки), perm (установка прав доступа) и own (установка принадлежности). Под устройством понимается существующий файл устройства, а последнее поле в записи – это желаемое значение. Например, ниже для файла устройства создается новое имя:
link acd0 cdrom
Нам требуется создать символическую ссылку на файл устройства /dev/acd0 (привод ATAPI CD), и чтобы ссылка имела имя /dev/ cdrom . Если перезагрузиться с этой записью в /etc/devfs.conf, наше устройство /dev/acd0 будет также доступно как /dev/cdrom, как того ожидают многие мультимедийные программы.
Чтобы изменить права доступа к файлу устройства, эти права должны быть определены в восьмеричной форме в поле желаемого значения:
perm acd0 666
Здесь определены такие права доступа к устройству /dev/acd0 (все тот же привод компакт-дисков), которые позволят любому пользователю в системе выполнять запись и чтение с этого устройства. Запомните, изменение прав доступа к символической ссылке /dev/cdrom никак не отразится на правах доступа к файлу устройства – это всего лишь символическая ссылка.
Наконец, можно изменить владельца устройства. Изменение владельца обычно указывает, что вы пытаетесь решить проблему не совсем правильным способом и, возможно, вам следует остановиться и подумать. Однако FreeBSD не будет возражать против такого вмешательства в систему, если вы настаиваете на этом. Следующая строка дает конкретному пользователю безраздельный контроль над дисковым устройством /dev/da20:
own da20 mwlucas:mwlucas
Однако это может и не дать желаемый эффект, поскольку некоторые программы по-прежнему могут считать, что вы должны обладать правами root для выполнения операций с устройством. Я встречал такие программы, которые завершались самостоятельно, если их запускали с привилегиями обычного пользователя, при этом они даже не пытались обратиться к файлу устройства. Изменение прав доступа к файлу устройства никак не отразится на поведении таких программ, если они будут запускаться без привилегий пользователя root.
Процедура конфигурирования devfs(5) позволит решить многие проблемы, но далеко не все. Если необходимо, чтобы устройство было просто невидимо и недоступно, следует использовать правила devfs.
Глобальные правила devfs
Каждый экземпляр devfs(5) ведет себя в соответствии с правилами, которые определены в файле devfs.rules. Правила devfs применяются как к устройствам, которые обнаруживаются на этапе загрузки системы, так и к устройствам, которые подключаются и отключаются во время работы системы. Правила позволяют изменять принадлежность файлов устройств, права доступа к ним, а также могут делать их видимыми или невидимыми. Но с помощью правил devfs нельзя создать символическую ссылку на файл устройства.
FreeBSD использует файлы /etc/devfs.rules и /etc/defaults/devfs.rules подобно файлам /etc/rc.conf и /etc/defaults/rc.conf. Добавляйте свои правила в файл /etc/devfs.rules и не трогайте содержимое файла по умолчанию.
Формат определения набора правил devfs
Каждый набор правил devfs начинается с имени и номера в квадратных скобках. Например, ниже приводятся несколько базовых правил из конфигурации по умолчанию:
[devfsrules_hide_all=1] add hide
Первый набор правил называется devfs_hide_all и имеет номер 1 . Этот набор содержит всего одно правило .
Содержимое набора правил
Все правила devfs (в файлах) должны начинаться со слова add, которое добавляет правило в набор. После него можно указать ключевое слово path и определить регулярное выражение, которое будет соответствовать именам устройств, либо type, и указать тип устройства. В конце правила должно находиться определение выполняемого действия или команды. Ниже приводится пример правила devfs:
add path da* user mwlucas
Это правило назначает пользователя mwlucas владельцем всех файлов устройств, чьи имена начинаются на da. В многопользовательских системах или в системах, оснащенных жесткими дисками SCSI, этого делать не следует. На ноутбуке, где на da начинаются только имена USBустройств хранения данных, это не такая плохая идея.
При определении устройств с помощью ключевого слова path используются стандартные регулярные выражения командного интерпретатора. Если необходимо, чтобы правило применялось к нескольким устройствам, используйте символ звездочки в качестве шаблонного символа. Например, определение path ad1s1 соответствует единственному устройству /dev/ad1s1, а определение path ad*s* будет соответствовать всем устройствам, имена которых начинаются с ad, за которыми могут следовать символы, далее находится символ s, вслед за которым также могут следовать дополнительные символы. Точно определить, какие устройства будут соответствовать шаблону, можно с помощью командной строки:
# ls /dev/ad*s*
Эта команда выведет все участки и разделы на жестких дисках ATA,
но не выведет файлы устройств, которые соответствуют целым дискам.
Ключевое слово type указывает, что данное правило применяется ко всем устройствам заданного типа. Здесь можно использовать ключевые слова disk (дисковые устройства), mem (устройства памяти), tape (накопители на магнитных лентах) и tty (устройства терминалов, включая псевдотерминалы). Ключевое слово type используется достаточно редко именно потому, что оно охватывает целые группы устройств.
Если в правило не включается ключевое слово type или path, то оно применяется ко всем файлам устройств, что практически во всех случаях нежелательно.
В качестве выполняемого действия может быть использовано одно из следующих: group, user, mode, hide и unhide. Действие group позволяет определять принадлежность файла устройства к группе, название которой передается в виде дополнительного аргумента. Похожим образом действие user позволяет назначить владельца устройства. Следующие правила делают пользователя desktop и группу usb владельцами дисков da:
add path da* user desktop
add path da* group usb
Действие mode позволяет определять права доступа к устройству в стандартной восьмеричной форме:
add path da* mode 664
Ключевое слово hide позволяет скрывать файлы устройств, а unhide – делать их видимыми. Так как ни одна программа не может использовать файл устройства, если он невидим, данная возможность находит ограниченное применение, за исключением случаев использования jail(8). Мы будем рассматривать эту специфическую область применения команд hide и unhide в следующей главе.
После того как набор правил devfs будет определен, его можно будет активировать в файле /etc/rc.conf. Следующая строка активирует набор правил devfs с именем laptoprules:
devfs_system_rulesets=»laptoprules»
Не забывайте, что правила devfs применяются как к устройствам, которые определяются на этапе загрузки, так и к устройствам, которые подключаются динамически, после запуска системы. В заключение посмотрим на устройства, подключаемые динамически.
Управление динамическими устройствами с помощью devd(8)
Устройства, допускающие подключение в процессе работы системы, в наше время становятся более привычными, чем, например, десять лет назад. В прошлом столетии сетевые карты для ноутбуков считались ультрасовременными устройствами. Хотя вы можете менять компакт-диски в лотке привода CD-ROM, тем не менее вам едва ли пришлось бы на ходу менять сам привод. В наши дни ситуация полностью изменилась. Flash-накопители, которые по сути можно рассматривать как жесткие диски, подключаемые к порту USB, допускают подключение и отключение в любой момент времени, так же как и другие USBустройства, такие как клавиатуры, мыши и даже сетевые карты.
Файловая система devfs динамически создает новые файлы устройств при подключении таких устройств и удаляет их при отключении, что существенно упрощает использование таких устройств. devd(8) позволяет даже запускать пользовательские программы при включении или отключении устройств.
Конфигурирование devd
Демон devd(8) читает свои настройки из файла /etc/devd.conf и любых других файлов в каталоге /usr/local/etc/devd/. Чтобы упростить дальнейшее обновление системы, я рекомендую размещать свои локальные правила в файле /usr/local/etc/devd/devd.conf. Если конфигурация devd(8) становится слишком сложной, можно разместить правила, касающиеся устройств разных типов, в отдельных файлах. Для devd(8) существует четыре типа правил: attach, detach, nomatch и notify.
Правила attach вызываются, когда соответствующие аппаратные устройства подключаются к системе. Например, когда подключается сетевая карта, правило attach может выполнить настройку IP-адреса и запустить ее в работу.
Правила detach вызываются, когда соответствующие аппаратные устройства отключаются от системы. Правила detach используются редко, так как ядро автоматически помечает ресурсы как недоступные при отключении устройств, однако вы сможете найти им применение.
Правила nomatch вызываются, когда новое оборудование подключено, но не связано с драйвером устройства, то есть когда для устройства отсутствует драйвер в текущем ядре.
Правила notify применяются демоном devd(8), когда ядро отправляет соответствующее уведомление в пространство пользователя. Примером события типа notify может служить вывод на консоль сообщения о том, что сетевой интерфейс подключен. Обычно извещения выводятся на консоль или в файл протокола /var/log/messages.
Правила devd(8) имеют систему приоритетов, где 0 обозначает самый низкий приоритет. Обрабатываются только высокоприоритетные правила, низкоприоритетные – пропускаются. Ниже приводится пример правила devd(8):
notify 0 {
match «system» «IFNET»;
match «type» «ATTACH»;
action «/etc/pccard_ether $subsystem start»;
};
Это правило notify , которое применяется, когда ядро отправляет сообщение в пространство пользователя. Так как правило имеет приоритет 0 , оно будет применяться только в том случае, если будет отсутствовать более высокоприоритетное правило с тем же критерием. Это правило применяется, только если сообщение отправлено сетевой подсистемой IFNET и только если сообщение имеет тип ATTACH или, другими словами, – когда происходит запуск сетевого интерфейса. При этих обстоятельствах devd(8) запускает команду настройки сетевого интерфейса .
devd(8) поддерживает массу параметров на все случаи жизни. Если необходимо автоматически монтировать USB flash-диски в определенные точки монтирования, этого можно добиться, проверяя серийные номера каждого подключаемого USB-устройства. Если необходимо настроить сетевую карту Intel, отличающуюся от сетевых карт 3Com, это также вполне возможно. Далее будет рассказываться достаточно много о конфигурировании devd(8), в основном на примерах, – мы не будем слишком углубляться в подробности.
Пример конфигурирования devd(8): ноутбуки
Я пользуюсь своим ноутбуком и на работе, и дома. На работе у меня проводное подключение к сети, дома – беспроводное. В обоих случаях требуются весьма специфические установки, различные серверы DNS и прочие параметры настройки. Я мог бы схитрить и использовать в моей домашней сети адреса, которые совпадали бы с адресами в сети на работе, но мой опыт подсказывает, что домашняя сеть будет существовать много дольше, чем любая моя работа. (Возможно, я не прав.1) Я хочу, чтобы мой ноутбук сам выполнял необходимые настройки дома – при подключении беспроводной карты. Я хочу, чтобы мой ноутбук сам выполнял необходимые настройки на работе – при подключении кабеля сети к интегрированному сетевому интерфейсу.
Было бы неплохо когда-нибудь получить работу, которая не закончилась бы неприятным моментом, когда четыре гориллы из корпоративной службы безопасности выбрасывают меня за двери, а мой бывший босс сзади кричит что-то о федеральных органах регулирования, крем-брюле и возбужденных лемурах. Это всего лишь случайность, заметьте, так как никто не может меня обвинить в чем-либо.
Если проводной интерфейс настроен на использование DHCP, то при подключении кабеля FreeBSD должна запустить dhclient(8) и выполнить настройку сети. При подключении беспроводного интерфейса FreeBSD должна проверить конфигурацию и попытаться подключиться к сети. Ниже приводится конфигурация из /etc/rc.conf для моего беспроводного интерфейса (в действительности это одна строка, но я разделил ее, чтобы уместить на книжную страницу):
ifconfig_wi0=»inet dhcp ssid WriteFaster wepkey
0xdeadbeefbadc0decafe1234567 weptxkey 1 wepmode on channel 1″
Когда я подключаю свою беспроводную карту, ядро подключает к ней драйвер wi0. В результате этого возникает событие attach, по которому devd(8) отыскивает соответствующее правило. Этому событию соответствует следующая запись:
attach 0 {
media-type «802.11»;
action «/etc/pccard_ether $device-name start»;
};
Итак, в ноутбук была вставлена беспроводная карта, и FreeBSD подключила к ней драйвер wi(4). В результате возникло событие attach . Это правило имеет приоритет 0 , поэтому другое соответствующее правило будет запущено до этого правила по умолчанию. Этому правилу соответствуют любые устройства типа 802.11 (беспроводные). Когда по событию attach будет найдено соответствующее правило, FreeBSD запустит команду конфигурирования сети. Я мог бы написать и запускать свой сценарий настройки, но к чему делать лишнюю работу, когда имеющаяся во FreeBSD встроенная поддержка обеспечивает все, что мне необходимо?
В отличие от беспроводного интерфейса, который я использую дома, интерфейс Ethernet, используемый на работе, постоянно подключен к моей системе. Интерфейс может быть не подключен к сети, но сама карта всегда подключена. Мне совсем не нужно, чтобы этот интерфейс настраивался при каждой загрузке системы, потому что если интерфейс не подключен к сети, то будут возникать длительные задержки, когда демон SSH и другие службы, работающие на моем ноутбуке, будут ожидать истечения тайм-аута запросов DNS. На работе у меня обычно смонтированы некоторые разделы NFS, а также выполняются некоторые нестандартные настройки, недоступные при использовании DHCP.
Это означает, что я должен запустить свой собственный сценарий на языке командного процессора для настройки параметров под сетевое окружение на работе, но только при подключении кабеля сети. Для этого надо, чтобы devd дождался извещения о подключении кабеля к интерфейсу и затем запустил мой сценарий. Для этого я создал следующую запись, которую поместил в файл /usr/local/etc/devd/devd.conf:
notify 10 {
match «system» «IFNET»;
# };
match «type» «LINK_UP»; media-type «ethernet»;
action «/etc/rc.d/dhclient start $subsystem»; àaction «/home/mwlucas/bin/jobnetwork.sh»;
Это правило описывает реакцию devd на извещение , которое применяется, когда ядро посылает системе соответствующее извещение. Кроме того, это правило имеет приоритет 10 , поэтому оно будет иметь преимущество перед любыми правилами по умолчанию. Данное правило применяется, когда сетевая подсистема обнаруживает подключение к сети (то есть подключение кабеля к сетевому интерфейсу) при условии, что это сеть Ethernet . Когда будут соблюдены все эти условия, FreeBSD запустит сценарий à, расположенный в моем домашнем каталоге.
Обратите внимание: это правило содержит закомментированную строку . Я несколько погрешил против истины, когда говорил, что написал это правило. В действительности я скопировал правило по умолчанию из /etc/devd.conf и несколько изменил его. Операционная система FreeBSD уже имеет правила, которые применяются при подключении сетевых интерфейсов к сети, но мне требовалось выполнить ряд действий, которые не предусмотрены правилом по умолчанию. Вместо того, чтобы вспоминать все необходимые условия, я просто нашел запись, которая почти удовлетворяла меня, и немного изменил ее. Я рекомендую вам поступать точно так же. Достаточно лишь присвоить своему правилу более высокий приоритет, чем правило по умолчанию, и тогда FreeBSD будет использовать ваше правило вместо своего собственного.
Еще один пример конфигурирования devd: flash—устройства
К сожалению, не всегда удается копировать записи. Теперь мы рассмотрим пример, когда FreeBSD не предлагает правил по умолчанию. Я хотел бы, чтобы при подключении flash-накопителя он автоматически монтировался бы в каталог /media. Первое устройство USB, подключенное к ноутбуку, появится в системе как /dev/da0, но имя устройства будет umass0. (Если у вас в системе уже имеются подключенные устройства USB или SCSI, номер устройства в вашем случае будет иным.) Вообще говоря, все flash-накопители отформатированы в файловой системе FAT32, поэтому для их монтирования следует использовать команду mount –t msdosfs.
При подключении устройства FreeBSD подключает его к ядру, поэтому следует использовать правило attach:
attach 10 {
match «device-name» «umass0»;
action «/home/mwlucas/bin/mountusb.sh»;
};
Я присвоил этому правилу приоритет 10, поэтому оно будет иметь преимущество перед любыми другими правилами с приоритетом 0, которые могли бы быть установлены при обновлении версии FreeBSD. (Если FreeBSD когда-нибудь окажется в состоянии делать это автоматически, я, вероятно, воспользуюсь этой возможностью, но пока я не хочу, чтобы любое обновление изменило поведение системы без моего ведома.) Критерием в этом правиле является имя устройства . При подключении устройства система запускает сценарий командного интерпретатора, расположенный в моем домашнем каталоге.
Почему бы просто не запустить команду mount(8)? Дело в том, что устройствам USB требуется одна-две секунды на разогрев и стабилизацию, и только потом к ним можно будет обращаться. Кроме того, некоторые flash-накопители необходимо «подергать», прежде чем они действительно начнут работать. Сценарий, который я использую, весьма незамысловат, но меня он вполне устраивает:
#!/bin/sh
sleep 2
/usr/bin/true > /dev/da0
/sbin/mount -t msdosfs /dev/da0s1 /media
Такой прием поможет смонтировать устройство, но devd(8) не в состоянии демонтировать его. Операционная система FreeBSD предполагает, что, прежде чем вынимать устройство, системный администратор демонтирует файловые системы, находящиеся на нем. Это ничем не отличается от процедуры демонтирования компакт-диска (или дискеты) прежде, чем вынимать его.
Демон devd(8) имеет множество более сложных особенностей, тем не менее эти два примера наглядно демонстрируют все его возможности, которые мне необходимы и которые я использую уже несколько лет. Если вам необходима дополнительная информация, обязательно прочитайте страницы справочного руководства (man). А теперь, когда вы чуть больше знаете о файловых системах FreeBSD, давайте поговорим о более эффективных инструментах обеспечения безопасности.
Добавить комментарий