授予磁盘设备文件读取权限

授予磁盘设备文件读取权限

如果出于基准测试目的,必须使用hdparmdd直接在设备上使用,我想知道安全地执行此操作的正确方法是什么。

假设有问题的磁盘是/dev/sda

root@igloo:~# ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 May 29 08:23 /dev/sda
brw-rw---- 1 root disk 8, 1 May 29 08:23 /dev/sda1

我真的不想sda任何情况下。那么是否建议以普通用户身份chmod o+r /dev/sda*运行dd或运行它?hdparm

答案1

chmod o+r /dev/sda*非常危险,因为它允许任何程序读取您的整个磁盘(例如,/etc/shadow如果您的根分区位于,则包括中的密码哈希值sda)!

至少有两种方法可以更安全地做到这一点:

  1. 将所有需要读取磁盘的用户添加到该disk组中并运行chmod g-w /dev/sda*以阻止该组的写入访问权限。
  2. 将 的组更改/dev/sda*为仅包含需要读取磁盘的用户的组,例如,chgrp my-benchmarkers /dev/sda*并使用 阻止该组的写访问chmod

请注意,设备节点上的组和权限更改/dev只是暂时的,直到相关设备断开连接或计算机重新启动为止。

一个问题可能是hdparm其大部分功能都需要写访问权限。您必须检查您想要的所有内容是否都可以使用只读访问权限。

编辑:看起来hdparm不需要写访问权限。它更需要CAP_SYS_RAWIO 能力执行大多数 ioctl。您可以使用setcap cap_sys_rawio+ep /sbin/hdparmhdparm 来提供此功能。请注意,这允许任何人谁可以执行hdparm并且至少具有对设备文件的读取访问权限,以执行hdparm该设备上几乎可以执行的任何操作,包括--write-sector手册页描述为“非常危险”、“极其危险”或“异常危险”的所有其他 hdparm 命令。包装脚本可能是更好的解决方案。

如果没有,您要么必须授予写访问权限,要么编写包装器脚本,这些脚本可以由您的用户使用 sudo 规则以 root 身份执行。

答案2

尽管 /dev 的某些部署可能不支持,但一种可能性是使用 ACL。例子:

$ dd if=/dev/sda bs=1M count=200 of=/dev/null
dd: failed to open '/dev/sda': Permission denied
$ sudo setfacl -m u:youruser:r /dev/sd*
$ dd if=/dev/sda bs=1M count=200 of=/dev/null
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.0335544 s, 6.3 GB/s

AFAIKhdparm -t不过需要以 root 身份运行。

相关内容