Прочие файловые системы FreeBSD


Помимо FFS и неродных файловых систем, FreeBSD поддерживает различные файловые системы специального назначения. Некоторые из них интересны сами по себе, но обычно не используются, например mount_umapfs(8), а другие используются очень часто или даже используются в обязательном порядке. Далее мы поговорим о файловых системах в памяти — популярном способе оптимизации производительности, который используется в некоторых случаях, о создании файловых систем внутри файлов, а также о файловых системах procfs и fdescfs, которые необходимы для нормальной работы некоторых программ.

Файловые системы в памяти

Операционная система FreeBSD позволяет создавать файловые системы не только в дисковых разделах, но также в памяти, в файлах или в комбинации того и другого. Одно из наиболее популярных применений этой возможности заключается в создании файловых систем в памяти (memory filesystems), или дисков памяти (memory disks). Операции чтения и записи в файлы, находящиеся в памяти, выполняются намного быстрее, чем доступ к файлам, находящимся на диске, что позволяет существенно повысить производительность некоторых приложений. Однако при завершении работы системы все содержимое диска памяти теряется безвозвратно.

/tmp как диск памяти

Наиболее часто файловые системы в памяти используются для размещения каталога /tmp. Делается это так часто, что FreeBSD имеет для этих целей даже специальный параметр в rc.conf. Взгляните на следующие определения в rc.conf:

Установив значение YES в параметре tmpmfs (1), вы тем самым предписываете FreeBSD автоматически создавать во время загрузки файловую систему /tmp в памяти. Размер файловой системы /tmp определяет параметр tmpsize (2). Назначение флагов (3) мы будем рассматривать немного ниже, в этом же разделе.

Если на этом ваш интерес к файловым системам в памяти исчерпывается, можно считать, что вы достигли желаемого. Если же вам интересно узнать, как с помощью 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 (1). Однако команда mdconfig(8) вам еще не знакома. Утилита mdconfig(8) используется для непосредственного управления устройствами памяти. Ключ -d (2) означает уничтожить (destroy), а ключ -u (3) определяет номер устройства. Команда, приведенная выше, уничтожит устройство /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), с ключом -а. Ниже приводится пример подключения ISO-образа с дистрибутивом FreeBSD к устройству памяти:

Эта команда предписывает команде mdconfig(8) подключить (1) файловый (vnode-backed) (2) диск памяти к указанному файлу (3). После этого mdconfig(8) сообщает, что устройство (4) подключено. Теперь можно просто смонтировать устройство соответствующей командой монтирования, не забыв указать тип файловой системы:

# 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/hone/nwlucas/iso/omsa-51-live.iso

Оказывается, у меня смонтирован еще один ISO-образ? Ух ты! Возможно, через несколько месяцев мне придется выполнить перезагрузку. Впрочем, это слишком трудоемко для меня, поэтому я просто демонтирую файловую систему.

Файловые системы в файлах

Одна из интересных возможностей, используемых для создания клетки (глава 9) и размещения самодельных встроенных систем (глава 20), заключается в создании полных образов файловой системы в локальной файловой системе. В предыдущем разделе мы видели, как можно использовать диски памяти для монтирования и доступа к образам компакт-дисков. Вы можете использовать тот же самый прием для создания и доступа к образам дисков с файловой системой FFS. Недостаток такого способа состоит в том, что объем такого диска равен размеру файла образа. Если создать образ диска размером 500 Мбайт, он займет 500 Мбайт на диске.

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

Создание пустого файла

Файл, внутри которого предполагается создать файловую систему, изначально не должен содержать никаких данных — это всего лишь файл нужного размера. Можно было бы усесться поудобнее и вручную набить огромное число нулей, чтобы создать такой файл, однако FreeBSD имеет неограниченный источник «ничего», который избавит вас от такой неприятной работы. Устройство /dev/zero до краев наполнено пустотой, которую можно использовать для заполнения файла.

Здесь вам поможет та же самая команда dd(1), которую вы использовали для копирования установочных дискет в файл с файловой системой. Следующая команда копирует данные из устройства /dev/zero в файл filesystem.file.

Эта команда берет данные их входного файла /dev/zero (1) и выводит их в выходной файл filesystem.file (2). Передача данных производится блоками размером 1 Кбайт (3), и так один миллион раз (4). Это занимает всего несколько секунд (5), а поскольку устройству /dev/zero не приходится всякий раз тратить время на создание очередного символа, файл наполняется с очень высокой скоростью (6). Если теперь заглянуть в текущий каталог, там можно будет увидеть файл filesystem.file, размером 1 Гбайт.

Очень часто в заблуждение вводят такие параметры команды dd(1), как размер блока (block size) и счетчик (count). Вычисление конечного размера файла, создаваемого командой dd(1), напоминает перемещение груды песка — вся работа делится на три этапа: погрузка, перемещение и выгрузка определенной порции. Вы можете сделать несколько рейсов с тачкой, в несколько раз больше — с ведром или много-много рейсов с ложкой. Объем, переносимый за раз, — это размер блока, а число рейсов — счетчик. Вы можете носить песок в пригоршнях, и тогда размер блока будет маленький, а число рейсов — большим. Возможно, у вас имеется тачка, куда поместится блок среднего размера, и тогда число рейсов будет не так велико. А возможно, у вас есть экскаватор, который способен переместить весь песок за один рейс. Чем больше размер блока, тем выше нагрузка на систему при его перемещении. Команда dd(1) способна воспринимать различные сокращения, используемые для обозначения одного блока и количества перемещений, как показано в табл. 8.2.

Комментарии запрещены.