Исправляем проблему прав доступа разделов журнала Ceph

Устраняем проблему прав доступа при создании нескольких разделов под журнал на SSD.

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

OSD::mkfs: ObjectStore::mkfs failed with error -13
** ERROR: error creating empty object store in /var/lib/ceph/tmp/mnt.RXIG74: (13) Permission denied

Если немного поискать, то можно наткнуться на http://tracker.ceph.com/issues/13833BUG #13833, в котором представлено несколько костыльных решений, начиная от изменения прав (временное решение), заканчивая сменой UUID, что мы и будем делать. А также добавлю некоторое от себя исходя из практики.

Очень важно, чтобы таблица разделов диска была GUID. В противном случае после каждой перезагрузки права будут “слетать” на root:disk.

Итак. Сперва добавим пользователя ceph в существующую группу disk, в противном случае демоны не активируются и буду висеть с ошибкой.

sudo usermod -a -G disk ceph

После установки Ceph и затирания дисков (zap) создадим необходимое количество разделов на SSD, допустим:

Disk /dev/sdd: 240.1 GB, 240057409536 bytes, 468862128 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: gpt
 
#         Start          End    Size  Type            Name
1         2048    167774207     80G  Linux filesyste
2    167774208    335546367     80G  Linux filesyste

Теперь необходимо получить значение Partition GUID code данных разделов, для этого воспользуемся sgdisk где ключ –info=1 это номер раздела:

[ceph@KVM-01 ~]$ sudo sgdisk --info=1 /dev/sdd
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: EEBA05DA-248C-4C19-8DAF-FD60BE514FEC
First sector: 2048 (at 1024.0 KiB)
Last sector: 167774207 (at 80.0 GiB)
Partition size: 167772160 sectors (80.0 GiB)
Attribute flags: 0000000000000000
Partition name: ''

Полученное значение Partition GUID code необходимо изменить для блока журналов в udev rules:

Обратите внимание, что sgdisk выводит GUID прописными буквами, в 95-ceph-osd.rules необходимо использовать строчные. Это очень важно!

Переходим в директорию /lib/udev/rules.d/ и редактируем файл 95-ceph-osd.rules, в котором изменяем значение ID_PART_ENTRY_TYPE на полученное ранее:

 # JOURNAL_UUID
ACTION=="add", SUBSYSTEM=="block", \
  ENV{DEVTYPE}=="partition", \
  ENV{ID_PART_ENTRY_TYPE}=="0fc63daf-8483-4772-8e79-3d69d8477de4", \
  OWNER:="ceph", GROUP:="ceph", MODE:="660", \
  RUN+="/usr/sbin/ceph-disk --log-stdout -v trigger /dev/$name"
ACTION=="change", SUBSYSTEM=="block", \
  ENV{ID_PART_ENTRY_TYPE}=="0fc63daf-8483-4772-8e79-3d69d8477de4", \
  OWNER="ceph", GROUP="ceph", MODE="660"

Сохраняемся и запускаем триггер для каждого из разделов:

ceph-disk trigger /dev/sdd1
ceph-disk trigger /dev/sdd2

После проделанных действий для разделов журнала будут назначены соответствующие права и привилегии, и после перезагрузки все сохранится и примаунтится.

Теперь можем создавать OSD с указанием журнала на SSD.

Если у нас MBR и очень хочется “костылей”, то добавляем в /etc/rc.local команду ceph-disk trigger /dev/sdd1.
В этом случае будут выдаваться верные права на раздел и OSD будут запускаться.