на главную ] 

FreeBSD и диски большого объёма

Е.С.Борисов

понедельник, 5 марта 2012 г.


В этой статье речь пойдёт о построении системы хранения данных на основе OS FreeBSD и файловой системы ZFS.

Введение

История эта началась с того, что потребовалось хранилище данных объёмом более 20TB. Данные периодически (не часто) должны были записываться туда с других носителей, при этом обычные пользователи только считывали информацию, ничего туда не записывая. Важна была скорость доступа, сохранность данных была не так критична, поскольку копии этих данных хранились в другом месте.

Под хранилище был выделен сервер 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, к тому же она распространяется бесплатно.

512 из 4

Прежде чем описывать процедуру установки ОС FreeBSD на наш сервер, рассмотрим подробнее некоторые особенности устройства больших (2TB и более) винчестеров.

HDD состоит из одного или нескольких дисков и магнитных головок. Диски (металлические или керамические) покрыты слоем ферромагнитного материала. Магнитные головки с двух сторон каждого диска считывают или оставляют магнитные метки бесконтактным способом [2].

На заключительном этапе сборки HDD выполняется т.н. низкоуровневое форматирование - на поверхность дисков наносятся специальные магнитные метки. С помощью них на дисках формируются концентрические, замкнутые полосы - дорожки, которые делятся на части - секторы (рис.1). Дорожки на двух сторонах всех дисков равноудалённые от центра, т.е. расположенные точно друг над другом, объединяются в т.н. цилиндры.

Минимальной адресуемой областью данных на жестком диске является сектор.

hdd
 
Рис.1: разметка диска.

Существует два основных способа адресации секторов на диске: CHS, LBA.

Размер сектора фиксирован и для всех HDD выпущенных до недавнего времени он равнялся 512B.

С появлением новых HDD объёма 2TB и более возникла проблема переполнения адресного пространства секторов, т.е. ячеек по 512B стало слишком много.

Эта проблема была преодолена, количество секторов уменьшили путём их объединения. В 2010 году был внедрён новый стандарт, в котором размер сектора увеличили c 512B до 4КB, таким образом сократив количество секторов в 8 раз.

Однако, оказалось, что значительная часть используемого сегодня программного обеспечения (MS Windows) не умеет работать с новыми HDD, у которых размер сектора равен 4KB.

Тогда производители HDD оснастили свою продукцию дополнительным устройством, которое пакует блоки данных 512B в 4KB секторы, а так же выполняет обратную операцию. Таким образом для ОС винчестер представляется обычным устройством хранения с сектором 512B.

При записи 512B блока на HDD выполняются следующие операции.

  1. контролер считывает соответствующий 4KB сектор в буфер
  2. 512B вписываются в 4KB с определённым смещением
  3. обновлённый 4KB буфер записывается обратно на своё место
Аналогично выполняется операция чтения.

Эта техническая особенность вынуждает нас выравнивать границы разделов ФС, что бы они были кратны 4KB, в противном случае будет падение производительности при доступе к дискам [3].

 блоки данных: 
 512B   ...   512B 
 сектор HDD: 
 4KB 
     
 блоки данных: 
 ...  512B  512B   512B  ... 
 сектор HDD: 
       4KB               4KB       
 
Рис.2: выравненные разделы.   Рис.3: не выравненные разделы.

Если границы разделов выбраны не удачно то появляются блоки файловой системы 512KB, которые попадают на границу между 4KB секторами, т.е. смещение таково, что разрезает 512B блок на 2 части - первая часть принадлежит одному сектору, а вторая уже попадает в соседний сектор. Из-за этого обработка такого блока 512B требует два цикла чтения/записи вместо одного, т.е. кроме текущего 4KB сектора необходимо обработать ещё и его соседа. Таким образом скорость доступа к HDD может ощутимо падать.

MBR и GPT

Перед тем как развернуть файловую систему и инсталлировать OC на жесткий диск (или массив из жестких дисков), его необходимо разметить т.е. создать разделы и загрузочную запись. Для ОС MS Windows обычным способом разметки есть MBR (master boot record), максимальный размер диска, который можно разметить таким способом - 2TB. Для дисков объёмом более 2TB этот способ не годиться. Существует альтернативный способ - GPT, он позволяет размечать диски объёмом до 9ZB (9 x 1021 байт).

ОС MS Windows может использовать размеченные GPT диски, однако загружаться умеет только с дисков размеченных MBR. Как уже говорилось выше, исключение составляет только версия этой ОС для платформы Itanium.

ОС FreeBSD работает как с дисками MBR так и с дисками GPT.

Подробней об MBR и GPT можно прочитать в [4,5].

Инсталляция FreeBSD

Вместо обычной для FreeBSD файловой системы UFS будем использовать файловую систему ZFS. Она была разработана компанией Sun Microsystems для операционной системы Solaris. ZFS предназначена для хранения больших объёмов данных, обладает сравнительно простым управлением томами, поддерживает механизм снапшотов и контроль целостности данных, и имеет ещё много полезных свойств. ZFS является проектом с открытым исходным кодом и распространяется под лицензией CDDL (Common Development and Distribution License). Подробней об этой файловой системе можно прочитать в [6,7].

Будем устанавливать ОС 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, описание процедуры установки и настройки этих сервисов выходит за рамки этой статьи.


Пример скрипта инсталяции системы можно скачать [здесь].


Литература

  1. Windows and GPT FAQ

  2. Википедия : Жёсткий диск

  3. Dmitriy Luzanov Создание "правильной" геометрии диска

  4. Википедия : MBR

  5. Википедия : GPT

  6. Википедия : ZFS

  7. Руководство по администрированию файловых систем ZFS Solaris

  8. Dmitriy Luzanov GEOM: gnop

 

При использовании материалов этого сайта, пожалуйста вставляйте в свой текст ссылку на мою статью.