options KVA_PAGES=512
Глава 19. Поддержка файловых систем
Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.
Содержание
19.1. Краткий обзор
Файловые системы - неотъемлемая часть любой операционной системы. Они позволяют пользователям записывать и хранить файлы, получать доступ к данным, и, конечно-же, пользоваться жесткими дисками. У разных операционных систем есть одна общая черта - их основная файловая система (native filesystem). Для FreeBSD это Fast File System (или FFS), которая произошла от Unix™ File System (сокращенно UFS).
FreeBSD также поддерживает ряд других файловых систем, тем самым предоставляя возможность получать доступ к данным от других операционных систем локально, например: к данным, находящимся на подключенных USB устройствах хранения, флэш-накопителях и жестких дисках. В списке поддерживаемых есть файловые системы, разработанные для других операционных систем, например Linux® Extended File System (EXT) и Sun™ Z File System (ZFS).
FreeBSD имеет разные уровни поддержки для разных файловых систем. Для некоторых будет достаточно загрузки модуля ядра, другим может потребоваться установка набора утилит (toolset). Цель этого раздела - дать представления пользователям FreeBSD о возможностях использования других файловых систем на их операционных системах. Начнем с Sun™ Z file system.
После прочтения этого раздела вы будете знать:
Разницу между основной и поддерживаемой файловой системой.
Какие файловые системы поддерживаются FreeBSD.
Как подключить, сконфигурировать, получить доступ и использовать поддерживаемые файловые системы.
Перед прочтением этого раздела вам необходимо:
Понимать основы UNIX® и FreeBSD (Основы UNIX).
Знать азы конфигурирования и компиляции ядра (Настройка ядра FreeBSD).
Уметь устанавливать приложения сторонних разработчиков в FreeBSD (Установка приложений. порты и пакеты).
Быть знакомым с именованием дисков и устройств хранения в FreeBSD (Устройства хранения).
19.2. Файловая система ZFS
Файловая система ZFS, разработанная компанией Sun™, основана на использовании метода пулов устройств хранения данных. Это значит, что емкость носителя занимается только тогда, когда она становится необходимой для сохранения данных. ZFS также была разработана с упором на максимальную целостность данных, поддерживая снимки (snapshot), множество копий и контрольные суммы данных. Новая модель репликации данных, известная как RAID-Z, подобна RAID-5, но специально разработана для предотвращения повреждений данных при записи.
19.2.1. Настройка ZFS
Подсистема ZFS занимает значительную часть ресурсов системы. Чтобы получить от нее максимум эффективности в повседневном использовании, потребуется выполнить некоторые настройки. ZFS является экспериментальной функциональной возможностью в FreeBSD, но ситуация может измениться в ближайшем будущем; однако на данный момент рекомендуется выполнить следующие шаги.
19.2.1.1. Память
Общий размер ОЗУ должен быть как минимум равен одному гигабайту, хотя рекомендуется два гигабайта или более. Во всех нижеследующих примерах используется система с 1ГБ памяти совместно с другими специальными настройками.
Известно, что некоторые пользователи преуспели в использовании ZFS на системах, имеющих менее одного гигабайта памяти, но с таким ограниченным объемом ОЗУ и при серьезной загрузке машины очень вероятны паники FreeBSD из-за нехватки памяти.
19.2.1.2. Настройка ядра
Рекомендуется исключить из файла конфигурации ядра неиспользуемые драйвера и опции. Так как большинство драйверов устройств доступно в виде модулей, то они просто могут быть загружены с помощью соответствующих записей в файле /boot/loader.conf.
Пользователям архитектуры i386™ необходимо добавить следующую опцию в их файл конфигурации ядра, перестроить ядро и перезагрузиться:
Эта опция расширит адресное пространство ядра, тем самым позволяя переменной vm.kvm_size
быть установленной за текущий предел в 1 ГБ (2 ГБ для PAE). Чтобы найти наиболее подходящее значение для этой опции, разделите имеющийся объем ОЗУ, выраженный в мегабайтах, на 4. Приведенное выше значение 512
рекомендуется для систем с 2 ГБ оперативной памяти.
19.2.1.3. Параметры loader.conf
Адресное пространство kmem должно быть увеличено на всех FreeBSD архитектурах. На тестовой системе с одним гигабайтом физической памяти стабильная работа была получена со следующими параметрами, которые необходимо внести в файл /boot/loader.conf и перезагрузить систему.
vm.kmem_size="330M" vm.kmem_size_max="330M" vfs.zfs.arc_max="40M" vfs.zfs.vdev.cache.size="5M"
За более детальными рекомендациями по тонкой настройке системы под ZFS, обратитесь к странице: http://wiki.freebsd.org/ZFSTuningGuide.
19.2.2. Использование ZFS
Существует стартовый механизм, позволяющий монтировать ZFS пулы во время инициализации системы. Чтобы его задействовать, выполните следующие команды:
# echo 'zfs_enable="YES"' >> /etc/rc.conf
# /etc/rc.d/zfs start
Здесь и далее в статье подразумевается, что в системе установлено три SCSI диска с именами устройств da0, da1 и da2. Использующим IDE диски необходимо подставить имена устройств ad вместо имен устройств SCSI.
19.2.2.1. Простой дисковый пул
Для создания простого пула ZFS без избыточности, задействовав при этом один жесткий диск, воспользуйтесь командой zpool
:
# zpool create example /dev/da0
Чтобы увидеть новый пул, просмотрите вывод команды df
:
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235230 1628718 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032846 48737598 2% /usr
example 17547136 0 17547136 0% /example
Этот вывод четко показывает, что пул example
был не только создан, но также и примонтирован. Он также доступен, как и обычная файловая система, в нем можно создавать файлы, а пользователи могут просматривать его содержимое, например:
# cd /example
# ls
# touch testfile
# ls -al
total 4
drwxr-xr-x 2 root wheel 3 Aug 29 23:15 .
drwxr-xr-x 21 root wheel 512 Aug 29 23:12 ..
-rw-r--r-- 1 root wheel 0 Aug 29 23:15 testfile
Однако в этом примере простого пула не задействованы никакие функциональные возможности ZFS. Создайте файловую систему в этом пуле и активируйте сжатие данных на ней:
# zfs create example/compressed
# zfs set compression=gzip example/compressed
С этого момента для файловой системы ZFS example/compressed
активировано сжатие данных. Попробуйте поместить на нее несколько больших файлов копируя их в /example/compressed.
А вот как можно отключить сжатие данных:
# zfs set compression=off example/compressed
Для того чтобы размонтировать файловую систему, выполните следующую команду и проверьте результат утилитой df
:
# zfs umount example/compressed
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235232 1628716 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
Снова смонтируйте файловую систему и проверьте результат при помощи df
:
# zfs mount example/compressed
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235234 1628714 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
example/compressed 17547008 0 17547008 0% /example/compressed
Пул и файловая система также отображается в выводе команды mount
:
# mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
example on /example (zfs, local)
example/data on /example/data (zfs, local)
example/compressed on /example/compressed (zfs, local)
Как вы уже убедились, файловые системы ZFS после создания могут использоваться как и обычные файловые системы; однако доступно множество других возможностей. В следующем примере мы создадим новую файловую систему data
. На ней мы будем содержать важные данные, поэтому файловая система сконфигурирована хранить две копии каждого блока:
# zfs create example/data
# zfs set copies=2 example/data
Снова проверьте свободное и использованное место выполнив команду df
:
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235234 1628714 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
example/compressed 17547008 0 17547008 0% /example/compressed
example/data 17547008 0 17547008 0% /example/data
Заметьте, что каждая файловая система в пуле имеет тот же объем свободного места. Мы использовали команду df
на протяжении этих примеров, чтобы показать, что файловые системы занимают только необходимое им пространство, используя ресурс одного и того же пула. ZFS уходит от привычных понятий "том (volume)" и "раздел (partition)", позволяя файловым системам занимать один и тот же пул. Уничтожьте файловые системы, потом уничтожьте пул, так как в них уже нет нужды:
# zfs destroy example/compressed
# zfs destroy example/data
# zpool destroy example
Жесткие диски со временем выходят из строя, это неизбежно. Когда этот диск выйдет из строя, данные будут утеряны. Одним из способов избежать потери данных из-за вышедшего из строя жесткого диска является построение RAID массивов. ZFS поддерживает эту функциональную возможность в своем дизайне, и это описано в следующем разделе.
19.2.2.2. ZFS RAID-Z
Как уже было сказано выше, в этой статье подразумевается, что в нашей системе в распоряжении есть три SCSI диска: da0, da1 и da2 (или ad0 и далее в случае IDE дисков). Для того, чтобы создать RAID-Z пул, выполните следующую команду:
# zpool create storage raidz da0 da1 da2
Sun™ рекомендует использовать от трех до девяти жестких дисков в конфигурации RAID-Z. Если есть необходимость в использовании 10 или более дисков, подумайте над тем, чтобы разбить их на меньшие группы RAID-Z. Если у вас есть только два диска и вам всё-таки требуется избыточность, возможно лучшим вариантом будет создание ZFS зеркала. Смотрите страницу справочника zpool(8) для получения более подробных сведений. |
По завершении команды должен создаться пул storage
. Как и прежде, это может быть проверено при помощи команд mount(8) и df(1). Больше дисковых устройств может быть задействовано путем добавления их в конец списка параметров команды, приведенной выше. Создайте в пуле новую файловую систему, называемую home
, в которой будут размещаться пользовательские файлы:
# zfs create storage/home
На данном этапе возможно активировать сжатие данных и организовать автоматическое создание копий пользовательских домашних каталогов и файлов. Это может быть достигнуто так же, как и ранее, при помощи следующих команд:
# zfs set copies=2 storage/home
# zfs set compression=gzip storage/home
Чтобы организовать в этой файловой системе хранение домашних каталогов пользователей, скопируйте сюда их содержимое и создайте соответствующие символические ссылки:
# cp -rp /home/* /storage/home
# rm -rf /home /usr/home
# ln -s /storage/home /home
# ln -s /storage/home /usr/home
С этого момента пользовательские данные сохраняются на новой файловой системе /storage/home. Для проверки создайте учетную запись нового пользователя и войдите ею в систему.
Попробуйте создать снимок (snapshot), к которому можно будет откатиться при необходимости:
# zfs snapshot storage/home@08-30-08
Заметьте, что снимок (snapshot) захватит реальную файловую систему, а не домашний каталог или файл. Символ @
отделяет имя файловой системы или имя тома от имени снимка. Когда возникнет необходимость восстановить пользовательские домашние каталоги, выполните следующую команду:
# zfs rollback storage/home@08-30-08
Чтобы получить список имеющихся в наличии снимков, выполните команду ls
в каталоге .zfs/snapshot. Например, чтобы увидеть сделанный ранее снимок, выполните следующую команду:
# ls /storage/home/.zfs/snapshot
Можно написать скрипт, выполняющий снимки пользовательских данных ежемесячно; однако, со временем, они могут занять значительную часть дискового пространства. Предыдущий снимок может быть удален используя следующую команду:
# zfs destroy storage/home@08-30-08
Нет причины после наших экспериментов далее держать в текущем состоянии /storage/home. Сделаем ее реальной файловой системой /home:
# zfs set mountpoint=/home storage/home
Выполнение команд df
и mount
покажет, что с этого момента операционная система воспринимает нашу файловую систему как обычную /home:
# mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
storage on /storage (zfs, local)
storage/home on /home (zfs, local)
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235240 1628708 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032826 48737618 2% /usr
storage 26320512 0 26320512 0% /storage
storage/home 26320512 0 26320512 0% /home
На этом завершим конфигурацию RAID-Z. Чтобы во время ночных запусков periodic(8) получать информацию о статусе созданных файловых систем, выполните следующую команду:
# echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.conf
19.2.2.3. Восстановление RAID-Z
Каждая система программных RAID массивов предоставляет возможность отображать информацию о своем состоянии
. ZFS - не исключение. Статус устройств RAID-Z может быть просмотрен при помощи следующей команды:
# zpool status -x
Если пулы исправны и всё нормально, возвратится следующее сообщение:
all pools are healthy
А если есть какие-то неполадки, например диск выведен из массива, возвращенное состояние пула будет подобным следующему:
pool: storage
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
storage DEGRADED 0 0 0
raidz1 DEGRADED 0 0 0
da0 ONLINE 0 0 0
da1 OFFLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errors
Вывод показывает, что устройство было переведено в автономный режим администратором. Это верно для данного отдельного примера. Чтобы перевести диск в автономный режим, была выполнена команда:
# zpool offline storage da1
Теперь после останова системы возможно заменить da1. Когда система загрузится снова, выполните следующую команду чтобы заменить диск в массиве:
# zpool replace storage da1
С этого момента статус может быть проверен опять и на этот раз без флага -x
:
# zpool status storage
pool: storage
state: ONLINE
scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errors
В выводе сообщается, что при перестроении массива ошибок обнаружено не было.
19.2.2.4. Проверка данных
Как уже было сказано ранее, ZFS использует контрольные суммы
для проверки целостности сохраненных данных. Подсчет и сохранение контрольных сумм включается автоматически во время создания файловых систем и может быть отключен при помощи команды:
# zfs set checksum=off storage/home
Отключение подсчета контрольных сумм - не очень хорошая идея; особенно ввиду того, что они занимают мало места, а также при их использовании нет существенных расходов ресурсов системы. Пока подсчет включен, возможно выполнять проверки целостности данных ZFS, используя контрольные суммы. Этот процесс известен как "очистка (scrubbing)". Чтобы проверить целостность данных пула storage
, выполните следующую команду:
# zpool scrub storage
Этот процесс может занять значительное время в зависимости от количества сохранённых данных. Очистка (scrubbing) порождает интенсивный ввод/вывод, поэтому только один экземпляр этой операции может выполняться в один момент времени. После завершения очистки (scrubbing) статус обновится, его можно просмотреть выполнив следующий запрос:
# zpool status storage
pool: storage
state: ONLINE
scrub: scrub completed with 0 errors on Sat Aug 30 19:57:37 2008
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errors
Время завершения отображается в простом виде в этом примере. Очистка помогает удостовериться в целостности данных на протяжении длительного времени.
Изменено: 9 марта 2024 г. by Danilo G. Baio