Разметка больших винчестеров и zfs во FreeBSD

В тот прекрасный день, когда я решил сделать домашний файловый сервер на FreeBSD встал вопрос, как разметить большие винчестеры и получить, по моему мнению, оптимальное соотношение надёжности и не расточительности. Ход мыслей был таков: делать зеркало(дублировать содержимое одного носителя на другом) – жалко место ради медиа контента, т.к. придётся попрощаться с целым винчестером, а делать пул(слить объёмы всех носителей воедино) из нескольких винчестеров – не надёжно, выйдет из строя один из носителей и накроется «всё, что нажито непосильным трудом» и хранится на остальных винчестерах. Поэтому решил использовать gpart для разметки, zfs в качестве файловой системы и делать не зеркало, а пулы но в пуле держать только один винчестер. Пошёл по принципу: один хард – один пул. Таким образом мы и не потеряем место и можем пользоваться прелестями zfs (создание снэпшотов).
Краткие характеристики железа:
Итак в наличии был потенциальный файловый сервер на FreeBSD с четырьмя винчестерами, на одном(40 Гб ide) установлена сама ОС, а 3-и остальных (каждый по 2Тб sata) будут использоваться для хранения. ОЗУ 4Гб, если у вас мало оперативки в сервере, то с zfs не стоит заморачиваться, либо докупить памяти. Тип cpu — I686_CPU. ОС – FreeBSD 8.0-RELEASE.
смотрю свои винчестеры:
cat /var/run/dmesg.boot | grep ad

вижу

ad0: 1907729MB at ata0-master SATA300
ad1: 1907729MB at ata0-slave SATA300
ad2: 1907729MB at ata1-master SATA300
ad4: 38166MB at ata2-master UDMA100

Про ad4 сразу забываем, там ОС стоИт, остаются ad0, ad1, ad2.
Выполняем от root’а, тем самым создавая разметку GPT для каждого из hdd:
gpart create -s GPT ad0
gpart create -s GPT ad1
gpart create -s GPT ad2

После этого можно посмотреть, что получилось:
gpart show

Далее создаём разделы:
gpart add -b 34 -i 00 -t freebsd-zfs -l dsk00 ad0
gpart add -b 34 -i 01 -t freebsd-zfs -l dsk01 ad1
gpart add -b 34 -i 02 -t freebsd-zfs -l dsk02 ad2

здесь:
b –смещение начального блока
s –размер раздела в блоках.этот параметр я не указывал, таким образом создавал один раздел размером в весь винчестер, как и было нужно. 1кБайте=2 блока, при необходимости можно посчитать число блоков и в мб и в Гб. Либо можно написать не в блоках а сразу в Gb. Например: -s 500G
i — индекс в таблице разделов, на которых должен быть размещён новый раздел.
t – тип раздела (может быть: efi, freebsd, freebsd-boot, freebsd-swap, freebsd-ufs, freebsd-vinum, freebsd-zfs, mbr.)
l — метка раздела

опять можно посмотреть изменения:
gpart show

и ещё так:
ls /dev/gpt

Теперь переходим к ZFS.
zfs должен быть подгружен в ядро, поэтому делаем:
kldload zfs

посмотрим загруженные модули:
kldstat

1 9 0xc0400000 b6dfe0 kernel
2 1 0xc292c000 123000 zfs.ko
3 1 0xc2159000 3000 opensolaris.ko

Чтобы включить поддержку zfs при запуске ОС, делаем и заодно подправим кое какие параметры. Сначала в /etc/rc.conf добавляем:
zfs_enable="YES"

И в /boot/loader.conf добавляем:
zfs_load="YES"
vfs.zfs.prefetch_disable="1"
vfs.zfs.arc_max="104857600"
vm.kmem_size_max="1024M"
vfs.zfs.zil_disable="1"

Если вышеуказанные параметры не подправить, сервер казалось бы будет работать, но спустя пару дней может встать в ступор, выдавав в консоль:
panic: kmem_malloc(16384): kmem_map to small:335544320 total allocated cpuid=1
panic:bufwrite: buffer is not busy???

Так же необходимо пересобрать ядро(о том, как это делать здесь ), добавив туда строку:
options KVA_PAGES=512

О том как его пересобрать, уже было рассмотрено.
Создадим точки монтирования пулов(произвольные точки монтирования):
mkdir -p /mnt/pools/dsk00
mkdir -p /mnt/pools/dsk01
mkdir -p /mnt/pools/dsk02
chmod –R 0777 /mnt/pools/

И наконец можно создавать пулы zfs:
zpool create -m /mnt/pools/dsk00 storage00 /dev/gpt/dsk00
zpool create -m /mnt/pools/dsk01 storage01 /dev/gpt/dsk01
zpool create -m /mnt/pools/dsk02 storage02 /dev/gpt/dsk02

здесь:
m – точка монтирования пула.
storage00 , *01 , *02 – названия пула.
/dev/gpt/dsk00 , *dsk01 , *dsk02 – диски, с указанием точного пути (в /dev/gpt/ они должны были появиться после «gpart add», который выполняли выше).

Увидеть список сформировавшихся пулов можно так:
zpool list

Их стало видно и в списке файловых систем:
df -h
Вобщем то и всё, можно перезагружаться.

Если вы напортачили, то:
1) удаляем пулл (на примере пула с названием storage01)
zpool destroy storage01

2) удаляем партицию (в пуле storage01 у меня винчестер ad1)
gpart delete -i 1 ad1

3) уничтожаем схему разметки ad1
gpart destroy ad1
и теперь можно пересоздать всё заново.

Собственно о снимках файловой системы – это образы фс на определённый промежуток времени доступные только на чтение.
Снимок делается так:
zfs snapshot storage01@snap01
здесь мы создали снэпшот пула storage01 под названием snap01

смотрим список снэпшотов:
zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
storage01@snap01 0 — 18.5K —

делаем откат storage01 до снэпшота snap01:
zfs rollback storage01@snap01

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

Разметка больших винчестеров и zfs во FreeBSD: 3 комментария

  1. Уведомление: iscsi-сервер на FreeBSD. iscsi-клиент на windows и mac os x | Media UniX

  2. Уведомление: Как удалить файл, если нет места на диске с ZFS на FreeBSD? | Media UniX

  3. Уведомление: gpart — добавление нового винчестера в систему   Freebsd_Chernigov

Добавить комментарий