今天使用 Zabbix 监控系统对磁盘监控的时候发现一个问题,smartctl 命令不能用普通用户去执行。
smartcl 是磁盘管理工具 Smart 提供的命令,使用这个命令来获取磁盘的一些状态信息,比如下面这样:
[root@Erdong-TEST ~]# smartctl -A /dev/nvme0n1 smartctl 7.0 2018-12-30 r4883 [x86_64-linux-3.10.0-693.el7.x86_64] (local build) Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org === START OF SMART DATA SECTION === SMART/Health Information (NVMe Log 0x02) Critical Warning: 0x00 Temperature: 29 Celsius Available Spare: 100% Available Spare Threshold: 10% Percentage Used: 0% Data Units Read: 80 [40.9 MB] Data Units Written: 0 Host Read Commands: 1,897 Host Write Commands: 10 Controller Busy Time: 0 Power Cycles: 10 Power On Hours: 923 Unsafe Shutdowns: 7 Media and Data Integrity Errors: 0 Error Information Log Entries: 0 Warning Comp. Temperature Time: 0 Critical Comp. Temperature Time: 0 [root@Erdong-TEST ~]#
Smart 工具的 smartctl 命令只能用 root 去执行,是不能用普通用户执行的。
但是当 Zabbix 监控系统使用这个命令监控的时候,缺省是使用 zabbix 这个系统里创建的用户来执行的,这个时候只能使用 root 权限来执行,比如添加 sudo 权限给 zabbix 用户来执行这个命令。
给 zabbix 用户root 权限以后继续执行这个命令,这个时候就会报错:
[zabbix@Erdong-TEST ~]$ smartctl -A /dev/nvme0n1 smartctl 7.0 2018-12-30 r4883 [x86_64-linux-3.10.0-693.el7.x86_64] (local build) Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org Smartctl open device: /dev/nvme0n1 failed: Permission denied
这里又提到了一个没权限,这个没有权限是 /dev/nvme0n1 这个块设备没有权限。查看块设备发现它的数组是 disk ,这个组有读写权限,那么给 zabbix 用户添加到 disk 组中,那么就可以解决上边的问题。
[root@Erdong-TEST ~]# ll -h /dev/nvme0n1 brw-rw---- 1 root disk 259, 0 5月 31 10:43 /dev/nvme0n1 [root@Erdong-TEST ~]#
添加到组可以使用这个命令:
usermod -a -G disk zabbix
如果到这里你的问题解决了的话,那么恭喜。
我接着遇到了新的问题:
[zabbix@Erdong-TEST ~]$ smartctl -A /dev/nvme0n1 smartctl 7.0 2018-12-30 r4883 [x86_64-linux-3.10.0-693.el7.x86_64] (local build) Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org Read NVMe Identify Controller failed: NVME_IOCTL_ADMIN_CMD: Permission denied
NVME_IOCTL_ADMIN_CMD 是 NVME 的一个函数,这我不知道要怎么给函数授权了。
所以我用了一个终极大招,我修改了 Zabbix Agent 的启动用户,修改成了 root ,现在一下就解决问题了。
对于 Zabbix 遇到权限问题,Zabbix 官方的建议是在 sudo 命令的文件 /etc/sudoers 文件中对命令进行授权,并且最好遵循最小授权的原则。我这次在执行过程中,到最后进入到了函数的权限管理,是没什么办法了,只能使用 root 用户来解决了。
如果你们有其他的方法,欢迎交流讨论。