ATA Over Ethernet (ATAoE,AoE,aoe) — протокол доступа к блочным SATA/SAS устройствам напрямую через транспорт Ethernet. Предназначен для организации бюджетного в пределах одного Ethernet сегмента.
Разработкой и поддержкой протокола занимается компания
Структурно состоит из «сервера» (Taget’а) и «клиента» (Initiator’а).
Почему ATAoE?
Мой выбор пал на ATAoE прежде всего из-за топорной своей простоты и элегантности, сочетающейся с производительностью и стабильностью. Как известно, чем проще протокол, тем меньше в нем потенциальных глюков.
На протоколе ATAoE можно очень быстро поднять сторедж или его клиент под любым линуксом.
ATAoE работает на уровне Ethernet и не использует TCP стек и его накладные расходы вообще. Что касается авторизации, присутствует фильтр по MAC адресам.
Конечно, у iSCSI больше свистелок и перделок чем в ATAoE. Но они в моих задачах не нашли применения. Авторизация в пределах одного Ethernet сегмента не нужна, ибо я в силах обозвать свой сегмент безопасным. Протокол TCP ни к чему, ибо я еще не дошел до маразма гонять ATA команды через глобальные сети.
Я честно не знаю как данный протокол работает на других системах. Говорят, драйверы есть. Но в мои задачи входили только линуксы, а там он работает идеально.
ATAoE Target
Серверная часть AoE, представляет из себя драйвер, который экспортирует заданное блочное устройство в сегмент Ethernet.
При настройках экспорта указываются номера «Shelf» и «Slot». Shelf — порядковый номер компьютера или стораджа, на котором находится блочное устройство, Slot — порядковый номер блочного устройства. Например, номер ATAoE устройства 1.2 говорит о том, что блочное устройство располагается на сервере (shelf) с порядковым номером 1 под порядковым номером (Slot) 2.
В ОС GNU/Linux представляет из себя user-space GPL-демона vblade из пакета . vblade может экспортировать любое блочное устройство, как то диск, партицию, устройство md или LVM logical volume. Так же vlbade может экспортировать файл заданного размера на файловой системе как блочное устройство.
Так же, поставляет готовые к использованию хардварные стораджи, выступающие в качестве AoE Target в сегменте Ethenet. Они работают под управлением OS Plan9, для доступа к ним по Ethernet необходима GPL утилита «Coraid Ethernet Console» или «cec» из пакета .
ATAoE Initiator
Клиентская часть AoE, представляет из себя драйвер, позволяющий импортировать расшаренные в Ethernet сегменете диски (AoE targets).
В ОС GNU/Linux представляет из себя модуль ядра aoe, входящий в ванильное ядро Linux. Однако для корректной работы модуля и использования последних нововведений рекомендуется обновлять драйвер aoe из пакета до последней версии (при каждом обновлении версии ядра).
Импортированные диски видны в системе в директории /dev/etherd/ с именами «eN.M», например /dev/etherd/e1.0. Где N — номерShelf, M — номер Slot.
При этом, если устройство eN.M имеет главную таблицу разделов, то соответствующие партиции будут видны как/dev/etherd/eN.Mp1, /dev/etherd/eN.Mp2 и т.д.
Установка AoE Initiator под OS GNU/Linux
Программные требования:
- OS CentOS >=5 (можно и любой другой Linux, но описанный способ использует CentOS)
- Ядро из стандартной ветки
- RPM: kernel-headers, kernel-devel, make, gcc
Требования по железу:
- 1Gbps Ethernet
- Желательно, выделенный Ethernet-сегмент для коммуникаций с AoE Targets
- Желательно, сетевая карта с поддержкой Jumbo Frames на Initiator’е и Target’ах, свитч с поддержкой Jumbo frames, Ethernet кабель категории 6
, распаковываем.
Делаем make install.
Для корректной загрузки драйвера при старте, имеется RC-скрипт. Он загружает модуль, конфигурирует MTU и txqueuelength на сетевом интерфейсе, и делает поиск сетевых дисков:
#!/bin/bash # # aoe Start/Stop the aoe. # # chkconfig: 3 15 30 # description: Starts/Stops AOE Initiator for GPFS # processname: aoe # Source function library. . /etc/init.d/functions prog="aoe" t=/usr/bin/test if [ -f /etc/sysconfig/$prog ]; then . /etc/sysconfig/$prog fi start() { echo $"Starting $prog." echo -n $"Checking aoe not loaded" s=`/sbin/lsmod | /bin/grep aoe | /bin/grep -v grep` if $t -n "$s" ; then failure echo return 1 fi passed echo echo -n $"Configuring $AOE_IF" /sbin/ifconfig $AOE_IF txqueuelen $AOE_IF_TXQ mtu $AOE_IF_MTU up RETVAL=$? if [ $RETVAL -ne 0 ]; then failure echo return 1 fi passed echo echo -n $"Loading aoe module...." /sbin/modprobe aoe aoe_deadsecs=$AOE_TIMEOUT aoe_maxsectors=$AOE_MAXSECTORS aoe_iflist=$AOE_IF aoe_maxout=$AOE_MAXOUT RETVAL=$? if [ $RETVAL -ne 0 ]; then failure echo return 1 fi passed echo # Give some time to identiy devices echo -n $"Prepare for discover...." num1=0 while [ ! -c /dev/etherd/discover ]; do sleep 1 num1=$(($num+1)) if [ $num1 -gt 60 ]; then echo -n $"timeout $num1" failure echo return 1 fi done passed echo echo -n $"Waiting for devices...." /usr/sbin/aoe-discover num=0 # Здесь необходимо дождаться появления определенного блочного устройства - изменить на свой вкус # until [ -b /dev/etherd/e1.0 ]; do until [ -d /dev/etherd ]; do sleep 1 num=$(($num+1)) if [ $num -gt 60 ]; then echo -n $"timeout $num" failure echo return 1 fi /usr/sbin/aoe-discover done passed echo touch "/var/lock/subsys/$prog"; echo -n $"AOE driver initialization complete" success echo return 0 } stop() { echo -n $"Stopping $prog: not supported" success echo return 0 } rhstatus() { status $prog } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) rhstatus ;; condrestart) [ -f "/var/lock/subsys/$prog" ] && restart || : ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart}" exit 1 esac
Скрипт автозагрузки требует конфигурационный файл /etc/sysconfig/aoe:
# IO Timeout AOE_TIMEOUT=180 # Max Sectors Per single IO AOE_MAXSECTORS=4096 # AOE Interface AOE_IF=eth2 # Interface txqueuelen AOE_IF_TXQ=5000 # Interface MTU AOE_IF_MTU=4200 # AOE Sleep settle AOE_SLEEP=4 AOE_MAXOUT=100
Где
- AOE_TIMEOUT — таймаут в секундах ожидания ответа от Target, после которого выдается ошибка IO.
- AOE_IF — интерфейс, который смотрит в сегмент Ethernet с AoE Targets.
- AOE_IF_TXQ — txqueuelength для AOE_IF
- AOE_IF_MTU — MTU для AOE_IF
- AOE_SLEEP,AOE_MAXOUT,AOE_MAXSECTORS — недокументированные параметры, подсказанные мне поддержкой Coraid, для моего случая.
После чего, включаем aoe в автозагрузку:
chkconfig --add aoe
И пробуем:
/etc/init.d/aoe start
Jumbo frames
Для продуктивной работы ATAoE требуется установить MTU на транспортном сетевом интерфейсе в 4200, а txqueuelength (OS GNU/Linux) в 5000.
Установка MTU в значение >1500 называется «поддержкой »
Далеко не все сетевые карты поддерживают jumbo frames, по этому перед установкой необходимо убедиться в том, что карта поддерживает эту возможность. Сделать это можно командой:
ifconfig eth2 mtu 4200
Если команда выполнена без ошибок, то все в порядке.
Jumbo frames должен поддерживать как Initiator так и Target. Кроме того, jumbo frames должен поддерживать еще и свитч. Т.е. jumbo frames должны поддерживаться на всем пути от Initiator до Target, иначе они не имеют смысла.