Е.С.Борисов
понедельник, 5 марта 2012 г.
В этой статье речь пойдёт о построении системы хранения данных на основе OS FreeBSD и файловой системы ZFS.
Под хранилище был выделен сервер HP Proliant с 12 дисками по 2TB каждый, которые были объединены в RAID0 аппаратным контролером.
Заказчик первоначально планировал развернуть на этой аппаратной платформе MS Windows Server. Однако с этим возникли определённые трудности.
Оказалось, что на загрузочном диске MS Windows может использовать не более 2TB.
Единственная версия MS Windows (на момент написания этой статьи), которая не имеет этого ограничения, это система для платформы Itanium (UEFI основанные системы)[ 1 ], для нашей аппаратуры она не годилась.
Для того, что бы развернуть на нашем сервере MS Windows можно было "вынуть" один диск из RAID0 и установить туда эту ОС. В этом случае у нас получалось 2 логических диска: системный на 2TB и дополнительный на 22TB. Таким образом мы выделяем под ОС целый диск 2TB, при этом ОС занимает не более 5GB, остальное пространство фактически не используется.
Расточительное решение, к тому же данные могли и не поместится в оставшихся 22TB. Не говоря уже о том, что в отличии от FreeBSD и Linux, MS Windows Server -- свободно не распространяется и лицензии для неё стоят дополнительных денег.
Вместо MS Windows Server вполне можно использовать FreeBSD, которая лишена описанных выше недостатков, т.е. эту ОС вполне можно развернуть поверх 24TB RAID0, к тому же она распространяется бесплатно.
HDD состоит из одного или нескольких дисков и магнитных головок. Диски (металлические или керамические) покрыты слоем ферромагнитного материала. Магнитные головки с двух сторон каждого диска считывают или оставляют магнитные метки бесконтактным способом [ 2 ].
На заключительном этапе сборки HDD выполняется т.н. низкоуровневое форматирование - на поверхность дисков наносятся специальные магнитные метки. С помощью них на дисках формируются концентрические, замкнутые полосы - дорожки , которые делятся на части - секторы (рис.1). Дорожки на двух сторонах всех дисков равноудалённые от центра, т.е. расположенные точно друг над другом, объединяются в т.н. цилиндры .
Минимальной адресуемой областью данных на жестком диске является сектор.
Рис.1: разметка диска. |
Существует два основных способа адресации секторов на диске: CHS, LBA.
Размер сектора фиксирован и для всех HDD выпущенных до недавнего времени он равнялся 512B.
С появлением новых HDD объёма 2TB и более возникла проблема переполнения адресного пространства секторов, т.е. ячеек по 512B стало слишком много.
Эта проблема была преодолена, количество секторов уменьшили путём их объединения. В 2010 году был внедрён новый стандарт, в котором размер сектора увеличили c 512B до 4КB, таким образом сократив количество секторов в 8 раз.
Однако, оказалось, что значительная часть используемого сегодня программного обеспечения (MS Windows) не умеет работать с новыми HDD, у которых размер сектора равен 4KB.
Тогда производители HDD оснастили свою продукцию дополнительным устройством, которое пакует блоки данных 512B в 4KB секторы, а так же выполняет обратную операцию. Таким образом для ОС винчестер представляется обычным устройством хранения с сектором 512B.
При записи 512B блока на HDD выполняются следующие операции.
Эта техническая особенность вынуждает нас выравнивать границы разделов ФС, что бы они были кратны 4KB, в противном случае будет падение производительности при доступе к дискам [ 3 ].
|
|
||||||||||||||||||||
Рис.2: выравненные разделы. | Рис.3: не выравненные разделы. |
Если границы разделов выбраны не удачно то появляются блоки файловой системы 512KB, которые попадают на границу между 4KB секторами, т.е. смещение таково, что разрезает 512B блок на 2 части - первая часть принадлежит одному сектору, а вторая уже попадает в соседний сектор. Из-за этого обработка такого блока 512B требует два цикла чтения/записи вместо одного, т.е. кроме текущего 4KB сектора необходимо обработать ещё и его соседа. Таким образом скорость доступа к HDD может ощутимо падать.
ОС MS Windows может использовать размеченные GPT диски, однако загружаться умеет только с дисков размеченных MBR. Как уже говорилось выше, исключение составляет только версия этой ОС для платформы Itanium.
ОС FreeBSD работает как с дисками MBR так и с дисками GPT.
Подробней об MBR и GPT можно прочитать в [ 4 , 5 ].
Будем устанавливать ОС FreeBSD 9.0-RELEASE, нам понадобиться DVD образ соответствующей архитектуры, который можно скачать с сайта FreeBSD .
Загружаемся с DVD, выбираем режим "Live CD" и входим в систему как root (без пароля).
На первом этапе необходимо создать разделы и загрузочную запись. Для этого воспользуемся утилитой gpart. Для примера разметим диск на 20GB в GPT. Здесь мы создаём 3 раздела: загрузочную запись, раздел swap, и основной раздел. Границы разделов указываются с учётом выравнивания по 4KB секторам, т.е. значения границ в блоках должны быть кратными 8. После разметки разделов создаём загрузочную запись и выводим результат.
gpart create -s GPT ada0 gpart add -b 40 -s 1024 -t freebsd-boot ada0 gpart add -b 2048 -s 512M -t freebsd-swap -l swap0 ada0 gpart add -s 40892376 -t freebsd-zfs -l data0 ada0 gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 gpart show ada0
Далее в основном разделе создаём файловую систему. Здесь необходимо проделать ещё одну дополнительную операцию. Файловая система FreeBSD UFS имеет фиксированный размер блока данных (16KB) и для устранения эффекта 512-4, описанного выше, выравнивания разделов вполне достаточно. В отличии от UFS, файловая система ZFS имеет блоки данных не фиксированного размера, поэтому при создании ФС необходимо указать фактический размер сектора (4096 байт). Это можно сделать с помощью утилиты gnop [ 8 ].
sysctl kern.geom.debugflags=0x10 # load ZFS kernel modules kldload /boot/kernel/opensolaris.ko kldload /boot/kernel/zfs.ko kldload /boot/kernel/geom_nop.ko # ZFS block 4K align gnop create -S 4096 /dev/gpt/data0 zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot /dev/gpt/data0.nop zpool export zroot gnop destroy /dev/gpt/data0.nop zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot
После этого создаём разделы файловой системы и устанавливаем их параметры (компрессия данных и т.п.).
zpool set bootfs=zroot zroot zfs set atime=off zroot zfs set checksum=fletcher4 zroot # create folders tree zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/share zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp zfs create zroot/usr zfs create zroot/usr/home zfs create -o compression=off -o setuid=off zroot/usr/ports zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src zfs create zroot/var zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash zfs create -o exec=off -o setuid=off zroot/var/db zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg zfs create -o exec=off -o setuid=off zroot/var/empty zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail zfs create -o exec=off -o setuid=off zroot/var/run zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp cd /mnt ; ln -s /usr/home home chmod 1777 /mnt/tmp chmod 1777 /mnt/var/tmp zfs listРазворачиваем файлы ОС (в примере указана установка для i386), создаём основные конфиги и копируем файл zpool.cache для корректной работы ZFS.
cd /usr/freebsd-dist export DESTDIR=/mnt for file in base.txz doc.txz kernel.txz; do (echo $file ; cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}) ; done # install base configs cat << EOF > /mnt/etc/rc.conf zfs_enable="YES" hostname="myhost.office.lan" EOF cat << EOF > /mnt/boot/loader.conf zfs_load="YES" vfs.root.mountfrom="zfs:zroot" vm.kmem_size="512M" vfs.zfs.prefetch_disable=1 EOF cat << EOF > /mnt/etc/fstab # Device Mountpoint FStype Options Dump Pass# /dev/gpt/swap0 none swap sw 0 0 procfs /proc procfs rw 0 0 EOF echo 'LOADER_ZFS_SUPPORT=YES' >> /mnt/etc/src.conf cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cacheЗавершающий этап установки, размонтируем ФС, устанавливаем квоты и точки монтирования разделов.
export LD_LIBRARY_PATH=/lib cd / # correct ZFS mount points and quotas zfs unmount -af zfs set mountpoint=legacy zroot zfs set mountpoint=/usr zroot/usr zfs set reservation=512M zroot/tmp #zfs set quota=1G zroot/tmp zfs set mountpoint=/tmp zroot/tmp zfs set reservation=512M zroot/var #zfs set quota=1G zroot/var zfs set mountpoint=/var zroot/var zfs set mountpoint=/share zroot/share rebootУстановка завершена. Загружаем свежеустановленную систему c HDD, обновляем порты и дерево исходников системы, собираем обновлённый мир и ядро системы в нужной конфигурации.
tzsetup date passwd cd /etc/mail && make all install cd /usr/ports && portsnap fetch && portsnap extract cd /usr/ports/devel/subversion && make config-recursive install clean svn checkout svn://svn.freebsd.org/base/releng/9.0/ /usr/src cd /usr/src && make -s -j4 buildworld buildkernel installkernel ...Для доступа пользователей к файлам хранилища по сети можно использовать samba или ftp, описание процедуры установки и настройки этих сервисов выходит за рамки этой статьи.