iscsi+ocfs2 на CentOS 6.5

iscsi+ocfs2 на CentOS 6.5

Это статья — копипаст мануала. И не более того. Здесь  не будет каких-либо рассуждений о тюнинге и красоте конфигурации. Здесь будет показана простая и быстрая настройка iscsi + ocfs2 и не более того.

Возникла необходимость — подготовить хранилище для архивных таблиц базы, доступное с обоих серверов баз данных. Решил для начала собрать на тестовом стенде. Вот что из этого получилось.

Имеется два сервера на centos 6.5. Задача: на первом сервере поднять iscsi target и подключить к нему же через iscsi initiator. Второй же сервер нужно просто подключить iscsi initiator.

Сервера:

sam@centos2:~$ cat /etc/redhat-release
CentOS release 6.5 (Final)

с ядром:

linuz-2.6.32-358.el6.i686

Устанавливаем необходимый софт:

sudo yum -y install scsi-target-utils iscsi-initiator-utils

Подготавливаем хранилище:

sudo pvcreate /dev/vdb1
sudo vgcreate -s 32M vg_target00 /dev/vdb1
sudo lvcreate  -n lv_target00 vg_target00
sudo lvcreate -L 5G -n lv_target00 vg_target00
sudo lvcreate -L 5000M -n lv_target00 vg_target00

Настраиваем таргет:

sam@centos1:~$ sudo grep -v "#" /etc/tgt/targets.conf
default-driver iscsi
<target iqn.2014-06.centos1:target1>
backing-store /dev/vg_target00/lv_target00
initiator-address 192.168.1.0/24
</target>

Имя таргета имеет строгий формат, рекомендуется его соблюдать: iqn.year-month.hostname:name-target.

Включаем сервис в автозапуск и стартуем его:

sudo chkconfig tgtd on
sudo /etc/init.d/tgtd restart

Смотрим состояние:

sam@centos1:~$ sudo tgt-admin --show
Target 1: iqn.2014-06.centos1:target1
    System information:
        Driver: iscsi
        State: ready
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: null
            Backing store path: None
            Backing store flags:
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 5268 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: rdwr
            Backing store path: /dev/vg_target00/lv_target00
            Backing store flags:
    Account information:
    ACL information:
        192.168.1.0/24

Переходим к инициатору. Ставим утилиты, дополнительной настройки не требуется. Нужно только дать имена инициаторам (имеет такой же формат):

sam@centos1:~$ cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.centos1:648a11486a2
InitiatorAlias=initiator01

Не стал что-то придумывать, просто поменял hostname, остальное оставил как есть.

Снова добавим в автозапуск:

sudo chkconfig iscsid on

Теперь ищем таргет:

sam@centos1:~$ sudo iscsiadm --mode discovery -t sendtargets --portal 192.168.1.4
192.168.1.4:3260,1 iqn.2014-06.centos1:target1

И подключаем:

sudo iscsiadm --mode node --targetname iqn.2014-06.centos1:target1 --portal 192.168.1.4 --login

Смотрим, что получилось:

sam@centos1:~$ sudo tgt-admin --show
Target 1: iqn.2014-06.centos1:target1
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
        I_T nexus: 2
            Initiator: iqn.1994-05.centos1:648a11486a2
            Connection: 0
                IP Address: 192.168.1.4
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: null
            Backing store path: None
            Backing store flags:
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 5268 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: rdwr
            Backing store path: /dev/vg_target00/lv_target00
            Backing store flags:
    Account information:
    ACL information:
        192.168.1.0/24

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

sam@centos1:~$ sudo tgt-admin --show
Target 1: iqn.2014-06.centos1:target1
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
        I_T nexus: 2
            Initiator: iqn.1994-05.centos1:648a11486a2
            Connection: 0
                IP Address: 192.168.1.4
        I_T nexus: 4
            Initiator: iqn.1994-05.com.centos2:648a11486a2
            Connection: 0
                IP Address: 192.168.1.5
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: null
            Backing store path: None
            Backing store flags:
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 5268 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: rdwr
            Backing store path: /dev/vg_target00/lv_target00
            Backing store flags:
    Account information:
    ACL information:
        192.168.1.0/24

Отлично, оба сервера подключены, теперь займемся ocfs2.

К сожалению, данное ядро не поддерживает ocfs2. Попытки поставить отдельно модули и софт закончилась безуспешно, ибо тянут за собой некоторые зависимости, поэтому я решил вспомнить молодость и собрать новое ядро =)

Ставим необходимый для сборки софт:

sudo yum install gcc ncurses ncurses-devel

Качаем исходники и распаковываем:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.5.tar.bz2
sudo tar xfvj linux-3.5.tar.bz2
cd linux-3.5/

Вызываем меню конфигурации:

sudo make menuconfig

В меню обязательно указываем необходимые модули для работы ocfs2 и собираем:

sudo make

Ставим:

sudo make modules_install install

Правим загрузчик:

sudo nano /etc/grub.conf

Выставляем значение default=0.

Ребутаем:

sudo reboot

Смотрим, что получилось:

sam@centos2:~$ uname -a
Linux centos2 3.5.0 #1 SMP Thu Jun 19 17:46:48 YEKT 2014 i686 i686 i386 GNU/Linux

Теперь ставим пакеты:

wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/awk2007:/free/CentOS_CentOS-6/i686/ocfs2-tools-1.6.4-2.2.i686.rpm
sam@centos1:~$ sudo rpm -ivh ocfs2-tools-1.6.4-2.2.i686.rpm
предупреждение: ocfs2-tools-1.6.4-2.2.i686.rpm: Заголовок V3 DSA/SHA1 Signature, key ID 872e7574: NOKEY
ошибка: Неудовлетворенные зависимости:
        at нужен для ocfs2-tools-1.6.4-2.2.i686
        gettext нужен для ocfs2-tools-1.6.4-2.2.i686
        mailx нужен для ocfs2-tools-1.6.4-2.2.i686
        time нужен для ocfs2-tools-1.6.4-2.2.i686

Ага, опять что-то не устраивает, нужно избавиться от зависимостей:

sudo yum install at time gettext mailx

Теперь ставим пакеты:

sudo rpm -ivh ocfs2-tools-1.6.4-2.2.i686.rpm

И идем править конфигурации:

sudo nano /etc/sysconfig/o2cb

выставляем O2CB_ENABLED=true.

Создаем папку для конфигурации:

sudo mkdir /etc/ocfs2

и вносим следующий конфиг:

sam@centos1:~$ cat /etc/ocfs2/cluster.conf
node:
        ip_port = 7000
        ip_address = 192.168.1.4
        number = 1
        name = centos1
        cluster = ocfs2
node:
        ip_port = 7000
        ip_address = 192.168.1.5
        number = 2
        name = centos2
        cluster = ocfs2

cluster:
        node_count = 2
        name = ocfs2

По опыту знаю, что ocfs2 «иногда придирается к порядку конфигурации, поэтому я всегда использую только такой». Стартуем:

sam@centos1:~$ sudo /etc/init.d/o2cb start
/etc/init.d/o2cb: line 22: /lib/lsb/init-functions: No such file or directory

Опять 25! Не хватает одного пакета, сейчас исправим:

sam@centos1:~$ sudo yum install redhat-lsb.i686

Теперь старт пройдет нормально:

sudo /etc/init.d/o2cb start

Отлично. Эти операции выше нужно проделать на обоих серверах.

Далее готовим саму файловую систему. Это делаем на любом одном сервере.

sudo parted -s /dev/sda mklabel msdos
sudo parted -s -- /dev/sda mkpart primary 0 -1

Тюнить не буду, укажу стандартные для меня значения:

sudo mkfs.ocfs2 -b 4k -C 32k -N4 -L cluster-storage /dev/sda1

Далее выполняем снова на обоих серверах:

sudo blockdev --rereadpt /dev/sda
sudo mkdir /mnt/arch-ocfs2
sudo mount -L cluster-storage /mnt/arch-ocfs2

Смотрим статус:

sam@centos1:~$ sudo /etc/init.d/o2cb status
Driver for "configfs": Loaded
Filesystem "configfs": Mounted
Stack glue driver: Loaded
Stack plugin "o2cb": Loaded
Driver for "ocfs2_dlmfs": Loaded
Filesystem "ocfs2_dlmfs": Mounted
Checking O2CB cluster ocfs2: Online
Heartbeat dead threshold = 31
  Network idle timeout: 30000
  Network keepalive delay: 2000
  Network reconnect delay: 2000
Checking O2CB heartbeat: Active

sam@centos1:~$ mount | grep ocfs
ocfs2_dlmfs on /dlm type ocfs2_dlmfs (rw)
/dev/sda1 on /mnt/arch-ocfs2 type ocfs2 (rw,_netdev,heartbeat=local)

Отлично! Все замонтировалось. Тестовый стенд успешно собран, далее — работа с базой, когда-нибудь это я размещу здесь.

PS. Картинка к статье отношения не имеет =)