Назад | Перейти на главную страницу

Смена владельца узла устройства LVM LV в RHEL5

При первом использовании serverfault извините за любые нарушения этикета.

Я создал несколько логических томов LVM2 в локальном хранилище на сервере и хотел бы, чтобы один из узлов устройства, а не файловая система или точка монтирования, принадлежал пользователю / группе, отличной от root: root.

Это в значительной степени сервер RHEL5 по умолчанию. Я понимаю, что узел устройства создается динамически во время загрузки после того, как LVM сканирует диски на наличие pv / vg / lvs. Я не совсем уверен, как udev, mapper и lvm взаимодействуют для создания этих узлов, а спецификации файла конфигурации немного загадочны для кого-то без большого опыта.

Будет еще больше уровней, которым также потребуются альтернативные разрешения, но в идеале я хотел бы оставить другие уровни в группе томов в root: root и изменить только определенные.

Может ли кто-нибудь помочь мне разобраться в этом? Я гуглил часами.

Заранее спасибо, Тони


Обновить:

Я добился этого следующим образом. Это может быть окольный путь, но это лишь временная среда (знаменитые последние слова!). О, я также могу удалить строки, которые печатаются в / tmp / foo.

[root@xxxxxxx rules.d]# **cat /etc/udev/rules.d/11-lvm.rules**
ACTION=="add|change", KERNEL=="dm-*", PROGRAM="/bin/sh -c /etc/udev/scripts/oracle_perms.sh"

[root@xxxxxxx rules.d]# **cat /etc/udev/scripts/oracle_perms.sh**
#!/bin/bash

echo "DEVPATH=$DEVPATH" >> /tmp/foo
MAJMIN=`cat /sys${DEVPATH}/dev`
echo "MAJMIN=$MAJMIN" >> /tmp/foo
MAJ=`echo ${MAJMIN} | awk -F: '{ print $1 }'`
MIN=`echo ${MAJMIN} | awk -F: '{ print $2 }'`
DEVNODE=`/sbin/dmsetup info -j ${MAJ} -m ${MIN} | grep Name | awk '{ print $2 }'`
echo "DEVNODE=${DEVNODE}" >> /tmp/foo
echo "${DEVNODE}" | grep ora >/dev/null 2>&1
if [ "$?" == "0" ]; then
  echo "Making change...." >> /tmp/foo
  chown oracle:dba /dev/mapper/${DEVNODE}
  chmod 660 /dev/mapper/${DEVNODE}
  ls -l /dev/mapper/${DEVNODE} >> /tmp/foo
else
  echo "No 'ora' name detected. No change necessary." >> /tmp/foo
fi

Обратите внимание, что приведенное выше решение автоматически изменяет ЛЮБОЙ LV, созданный с «ora» в имени. Эй, пока работает.

Следующее должно работать (при необходимости адаптировать):

# cat /etc/udev/rules.d/99-custom.rules
ENV{DM_NAME}=="system-test", ACTION=="add|change", MODE="0664", OWNER="michael", GROUP="disk", PROGRAM="/bin/logger /dev/$env{DM_NAME} owner changed to michael", SYMLINK+="oracle-$env{DM_NAME}"

Тогда вы должны получить результат:

# lvcreate -L 1G /dev/system -n test
# ls -al /dev/dm-9 /dev/oracle-system-test /dev/system/test /dev/mapper/system-test
brw-rw-r-- 1 michael disk 253, 9 2009-08-08 01:20 /dev/dm-9
brw-r----- 1 root    disk 253, 9 2009-08-08 01:20 /dev/mapper/system-test
lrwxrwxrwx 1 root    root      4 2009-08-08 01:20 /dev/oracle-system-test -> dm-9
lrwxrwxrwx 1 root    root     23 2009-08-08 01:20 /dev/system/test -> /dev/mapper/system-test

Мне не удалось понять, как изменить фактический узел устройства, созданный LVM, но я смог изменить узел сопоставления устройств. Затем я добавил символическую ссылку для oracle, чтобы получить к ней доступ, что немного похоже на взлом, но работает.

(мой предыдущий ответ был немного поспешным и непроверенным. Но мне действительно стало любопытно, как это сделать правильно :)