24.11.2024

Настройка Multipath I/O в Linux

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

  • Astra Linux 1.7
  • Debian 10, 11, 12
  • Ubuntu 20.04 LTS, 22.04 LTS, 24.04 LTS

Пример настройки СХД HPE MSA P2000, HPE MSA 2040,HPE MSA 2050, HPE MSA 2060, HPE 3Par 8200, HPE 3Par 8440

apt install -y multipath-tools

Смотрим какие диски получили

multipath -ll

Если вывод пустой то посмотрим так

lsblk

В данном случае получаем для СХД HPE MSA  формируется от 2 до 4 путей, в зависимости от модели

Интересующие диск по 2 путям sdb, sdc

NAME    MAJ:MIN RM   SIZE  RO TYPE MOUNTPOINT
fd0     2:0     1      4K  0  disk
sda     8:0     0    127G  0  disk
├─sda1  8:1     0    123G  0  part /
├─sda2  8:2     0      1K  0  part
└─sda5  8:5     0      4G  0  part [SWAP]
sdb     8:16    0   10.9T  0  disk
sdc     8:32    0   10.9T  0  disk
sr0     11:0    1   1024M  0  rom

В данном случае получаем для СХД HPE 3Par  формируется от 4 до 8 путей, в зависимости от модели

Интересующие диск по восьми путям sdb, sdc, sdd, sde, sdf, sdg, sdh, sdk

NAME     MAJ:MIN RM   SIZE   RO TYPE MOUNTPOINTS
sda      8:0     0  447.1G   0  disk 
├─sda1   8:1     0   1007K   0  part 
├─sda2   8:2     0      1G   0  part /boot/efi
└─sda3   8:3     0  446.1G   0  part 
sdb      8:16    0   10.9T   0  disk 
sdc      8:32    0   10.9T   0  disk 
sdd      8:48    0   10.9T   0  disk 
sde      8:64    0   10.9T   0  disk 
sdf      8:80    0   10.9T   0  disk 
sdg      8:96    0   10.9T   0  disk 
sdh      8:112   0   10.9T   0  disk 
sdk      65:128  0   10.9T   0  disk

Получаем их uuid выбирая любой из дисков, например sdb

/lib/udev/scsi_id -g -u -d /dev/sdb

#3600c0ff00012be6bd05f1e6601000000

Либо находим uuid в выводе

HPE MSA

multipath -v3

#===== paths list =====
#uuid hcil dev dev_t pri dm_st chk_st vend/pro
#3600224807bc1e4a554afc0dc5e935f25 0:0:0:0 sda 8:0 1 undef undef Msft,Vir
#3600c0ff00012be6bd05f1e6601000000 2:0:2:94 sdb 8:16 10 undef undef HP,P2000
#3600c0ff00012be6bd05f1e6601000000 2:0:3:94 sdc 8:32 50 undef undef HP,P2000

HPE 3Par

multipath -v3

#===== paths list =====
#uuid hcil dev dev_t pri dm_st chk_st vend/prod/rev dev_st
#3600508b1001c7060e9b26bb639d3fcc2 2:1:0:0 sda 8:0 1 undef undef HPE,LOGICAL VOLUME unknown
#3600c0ff00012be6bd05f1e6601000000 0:0:0:0 sdb 8:16 50 undef undef 3PARdata,VV unknown
#3600c0ff00012be6bd05f1e6601000000 0:0:1:0 sdc 8:32 50 undef undef 3PARdata,VV unknown
#3600c0ff00012be6bd05f1e6601000000 0:0:2:0 sdd 8:48 50 undef undef 3PARdata,VV unknown
#3600c0ff00012be6bd05f1e6601000000 0:0:3:0 sde 8:64 50 undef undef 3PARdata,VV unknown
#3600c0ff00012be6bd05f1e6601000000 0:0:4:0 sdf 8:80 50 undef undef 3PARdata,VV unknown
#3600c0ff00012be6bd05f1e6601000000 0:0:5:0 sdg 8:96 50 undef undef 3PARdata,VV unknown
#3600c0ff00012be6bd05f1e6601000000 0:0:6:0 sdh 8:112 50 undef undef 3PARdata,VV unknown
#3600c0ff00012be6bd05f1e6601000000 0:0:7:0 sdk 8:128 50 undef undef 3PARdata,VV unknown

Добавляем данный uuid как путь в назначенному тому

multipath -a 3600c0ff00012be6bd05f1e6601000000

Для блокировки локальных дисков нужно перечислить диски и контроллеры в файле multipath.conf

blacklist { 
    wwid ".*"
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode "^hd[a-z][[0-9]*]"
    devnode "^sda[[0-9]*]"
    devnode "^nvme[0-9]*"
    devnode "^cciss!c[0-9]d[0-9]*"
}

Для исключения блокировки томов нужно их перечислить в файле multipath.conf

blacklist_exceptions { 
    wwid 3600c0ff00012be6bd05f1e6601000000
}

Получим список multipath томов и обратим внимание что наш uuid находится в dm-1

ls -l /dev/mapper/

#crw------- 1 root root 10, 236 Nov 21 13:33 control
#lrwxrwxrwx 1 root root 7 Nov 21 13:33 pve-root -> ../dm-0
#lrwxrwxrwx 1 root root 7 Nov 21 13:41 vms -> ../dm-1

Создадим раздел GPT

fdisk /dev/dm-1

#Command (m for help): g
#Created a new GPT disklabel (GUID: 67752DFA-8643-8E4E-9E62-4E24D620D080).

#Command (m for help): n
#Partition number (1-128, default 1):
#First sector (2048-23418489566, default 2048):
#Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-23418489566, default 23418488831):

#Created a new partition 1 of type 'Linux filesystem' and of size 10.9 TiB.

#Command (m for help): w
#The partition table has been altered.
#Syncing disks.

Можно использовать cfdisk /dev/dm-1

Проверим что создали дополнительный раздел, нумерация аналогичная привычной /dev/sdb => /dev/sdb1 только /dev/dm-0 => /dev/dm-1

ls -l /dev/mapper/ 
#root@pve:~# ls -l /dev/mapper/
#total 0
#crw------- 1 root root 10, 236 Nov 21 13:33 control
#lrwxrwxrwx 1 root root 7 Nov 21 13:33 pve-root -> ../dm-0
#lrwxrwxrwx 1 root root 7 Nov 21 13:41 vms -> ../dm-1
#lrwxrwxrwx 1 root root 7 Nov 21 13:41 vms-part1 -> ../dm-2

Создадим нужную файловую систему

mkfs.ext4 /dev/dm-2
mkdir -p /data/vms
mount /dev/dm-2 /data/vms

Поверим

df -h

#Filesystem Size Used Avail Use% Mounted on
#/dev/mapper/3600c0ff00012be6bd05f1e6601000000 10.9T 24K 87G 1% /data

Создадим необходимую запись в fstab для автомонтирования диска

Получим UUID тома в системе, не путайте с uuid multipath

blkid /dev/dm-2

#/dev/dm-2: UUID="2c9e39d1-8860-458b-adee-18c99a3bb9c7" BLOCK_SIZE="4096" TYPE="ext4"

nano /etc/fstab

# vms
UUID=2c9e39d1-8860-458b-adee-18c99a3bb9c7 /data/vms ext4 defaults 0 2

Проверим

umount /data/vms
mount -a

multipath.conf

При необходимости можно создать multipath.conf с перечнем своих правил сканирования и подключения внешних томов

nano /etc/multipath.conf

defaults {
    # for debian and proxmox
    find_multipaths "no"
    user_friendly_names "yes"
    polling_interval 10
    path_selector "round-robin 0"
    path_grouping_policy "failover"
    prio "const"
    path_checker "tur"
    max_fds "max"
    rr_min_io 100
    rr_min_io_rq 1
    rr_weight "uniform"
    failback "immediate"
    no_path_retry 12
}

blacklist {
    wwid ".*"
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode "^hd[a-z][[0-9]*]"
    devnode "^sda[[0-9]*]"
    devnode "^nvme[0-9]*"
    devnode "^cciss!c[0-9]d[0-9]*"
}

blacklist_exceptions {
    wwid 3600c0ff00012be6bd05f1e6601000000
    wwid 3600c0ff00012be6b87c1846501000000
}

multipaths {
    multipath {
        wwid 3600c0ff00012be6bd05f1e6601000000
        alias vms
    }
    multipath {
        wwid 3600c0ff00012be6b87c1846501000000
        alias vmb
    }
}

devices {
    device {
        vendor "HP"
        product "(MSA2[02]12fc|MSA2012i)"
        path_grouping_policy "multibus"
        no_path_retry 18
    }
    device {
        vendor "HP"
        product "(MSA2012sa|MSA23(12|24)(fc|i|sa)|MSA2000s VOLUME)"
        path_grouping_policy "group_by_prio"
        prio "alua"
        path_selector "round-robin 0"
        hardware_handler "0"
        failback "immediate"
        no_path_retry 18
    }
    device {
        vendor "HP|HPE"
        product "(P2000 G3 FC|P2000 G3 FC/iSCSI|P2000 G3 SAS|P2000 G3 iSCSI)"
        path_grouping_policy "group_by_prio"
        prio "alua"
        path_selector "round-robin 0"
        hardware_handler "0"
        failback "immediate"
        no_path_retry 18
    }
    device {
        vendor "HP|HPE"
        product "MSA [12]0[456]0 (SAN|SAS|FC|iSCSI)"
        path_grouping_policy "group_by_prio"
        prio "alua"
        path_selector "round-robin 0"
        hardware_handler "0"
        failback "immediate"
        no_path_retry 18
    }
    device {
        vendor "HP"
        product "A6189A"
        path_grouping_policy "multibus"
        no_path_retry 12
    }
    device {
        vendor "3PARdata"
        product "VV"
        path_grouping_policy "group_by_prio"
        prio "alua"
        hardware_handler "1 alua"
        path_selector "round-robin 0"
        failback "immediate"
        no_path_retry 18
        fast_io_fail_tmo 10
        dev_loss_tmo "infinity"
        vpd_vendor "hp3par"
    }
}

Тестирование производительности подключенного тома

apt install -y fio

Тест: чтение 60%, запись 40%, размер блока 4Кб, глубина очереди 32, использовать 6 файлов размером 10Gb, длительность теста 600 секунд, прямая запись на диск минуя кеш и не использовать аппаратное кеширование

fio --name=IO-RAND --ioengine=libaio --iodepth=32 --rw=randrw --rwmixread=60 --bs=4k --direct=1 --buffered=0 --size=10G --numjobs=6 --time_based=1 --runtime=600 --group_reporting && rm -f IO-RAND*