如果出於基準測試目的,必須使用hdparm
或dd
直接在設備上使用,我想知道安全地執行此操作的正確方法是什麼。
假設有問題的磁碟是/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
)!
(至少)有兩種方法可以更安全地做到這一點:
- 將所有需要讀取磁碟的使用者新增至該
disk
群組並執行chmod g-w /dev/sda*
以阻止該群組的寫入存取權限。 - 將 的群組變更
/dev/sda*
為僅包含需要讀取磁碟的使用者的群組,例如,chgrp my-benchmarkers /dev/sda*
並使用 阻止該群組的寫入存取chmod
。
請注意,設備節點上的群組和權限變更/dev
只是暫時的,直到相關設備斷開連接或電腦重新啟動為止。
一個問題可能是hdparm
其大部分功能都需要寫入存取權限。您必須檢查您想要的所有內容是否都可以使用唯讀存取權限。
編輯:看起來hdparm
不需要寫入存取權限。它更需要CAP_SYS_RAWIO
能力執行大多數 ioctl。您可以使用setcap cap_sys_rawio+ep /sbin/hdparm
hdparm 來提供此功能。請注意,這允許任何人誰可以執行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 身分運作。