第一次使用 serverfault,如有违反礼仪,请谅解。
我已经在服务器的本地存储中创建了多个 LVM2 逻辑卷,并且希望其中一个设备节点(而不是文件系统或挂载点)由 root:root 以外的用户/组拥有。
这几乎是默认的 RHEL5 服务器。我知道设备节点是在 LVM 扫描磁盘中的 pv/vg/lvs 后在启动时动态创建的。我不太清楚 udev、mapper 和 lvm 如何交互来创建这些节点,而且配置文件规范对于没有太多经验的人来说有点难以理解。
将会有更多需要替代权限的 lv,但理想情况下,我希望将卷组中的其他 lv 保留在 root:root 下,并且只更改特定的 lv。
有人能帮我解决这个问题吗?我已经在 Google 上搜索了好几个小时了。
提前致谢,托尼
更新:
我通过以下方式实现了这一点。这可能是一种迂回的做事方式,但这只是一个临时环境(著名的遗言!)。哦,我可能还想删除打印到 /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
请注意,上述解决方案会自动更改名称中包含“ora”的任何 LV。嘿,目前它有效。
答案1
以下应该有效(根据需要进行调整):
# 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 可以访问它,这有点像 hack,但可以工作。
(我之前的回答有点仓促且未经测试。但我真的很好奇如何正确地做到这一点:)