Файловая система ZFS, разработанная компанией Sun™, основана на использовании метода пулов устройств хранения данных. Это значит, что емкость носителя занимается только тогда, когда она становится необходимой для сохранения данных. ZFS также была разработана с упором на максимальную целостность данных, поддерживая снимки (snapshot), множество копий и контрольные суммы данных. Новая модель репликации данных, известная как RAID-Z, подобна RAID-5, но специально разработана для предотвращения повреждений данных при записи.
Подсистема ZFS занимает значительную часть ресурсов системы. Чтобы получить от нее максимум эффективности в повседневном использовании, потребуется выполнить некоторые настройки. ZFS является экспериментальной функциональной возможностью в FreeBSD, но ситуация может измениться в ближайшем будущем; однако на данный момент рекомендуется выполнить следующие шаги.
Общий размер ОЗУ должен быть как минимум равен одному гигабайту, хотя рекомендуется два гигабайта или более. Во всех нижеследующих примерах используется система с 1ГБ памяти совместно с другими специальными настройками.
Известно, что некоторые пользователи преуспели в использовании ZFS на системах, имеющих менее одного гигабайта памяти, но с таким ограниченным объемом ОЗУ и при серьезной загрузке машины очень вероятны паники FreeBSD из-за нехватки памяти.
Рекомендуется исключить из файла конфигурации ядра неиспользуемые драйвера и опции. Так как большинство драйверов устройств доступно в виде модулей, то они просто могут быть загружены с помощью соответствующих записей в файле /boot/loader.conf.
Пользователям архитектуры i386™ необходимо добавить следующую опцию в их файл конфигурации ядра, перестроить ядро и перезагрузиться:
options KVA_PAGES=512
Эта опция расширит адресное пространство ядра, тем самым позволяя переменной
vm.kvm_size
быть установленной за текущий предел в
1 ГБ (2 ГБ для PAE). Чтобы
найти наиболее подходящее значение для этой опции, разделите имеющийся объем ОЗУ,
выраженный в мегабайтах, на 4. Приведенное выше значение 512 рекомендуется для систем с 2 ГБ оперативной
памяти.
Адресное пространство 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.
Существует стартовый механизм, позволяющий монтировать ZFS пулы во время инициализации системы. Чтобы его задействовать, выполните следующие команды:
# echo 'zfs_enable="YES"' >> /etc/rc.conf # /etc/rc.d/zfs start
Здесь и далее в статье подразумевается, что в системе установлено три SCSI диска с именами устройств da0, da1 и da2. Использующим IDE диски необходимо подставить имена устройств ad вместо имен устройств SCSI.
Для создания простого пула 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 поддерживает эту функциональную возможность в своем дизайне, и это описано в следующем разделе.
Как уже было сказано выше, в этой статье подразумевается, что в нашей системе в распоряжении есть три 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
Каждая система программных 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
В выводе сообщается, что при перестроении массива ошибок обнаружено не было.
Как уже было сказано ранее, 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
Время завершения отображается в простом виде в этом примере. Очистка помогает удостовериться в целостности данных на протяжении длительного времени.
В этом разделе была освещена лишь малая часть возможностей ZFS. За более подробной информацией обратитесь к страницам справочника zfs(8) и zpool(8).
Пред. | Начало | След. |
Поддержка файловых систем | Уровень выше | Менеджер дискового пространства Vinum |
Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.