Linux

linux 多久會注意到磁碟已分離?它可以更快嗎?

  • August 1, 2018

我發現如果我從我的 Linux 伺服器(CentOS 7)分離磁碟,相關/dev/sd*文件將在大約 10 秒後自動消失。

我想知道Linux如何知道磁碟已分離?是否有類似掃地機的東西不斷掃描所有設備?

有沒有可能讓它更快?

延遲很可能是udisk2& udev 造成的。

研究

$ ps -eaf|grep [u]disk
root     17041     1  0 09:48 ?        00:00:00 /usr/libexec/udisks2/udisksd

可以像這樣查詢它的儲存設備:

$ udisksctl status
MODEL                     REVISION  SERIAL               DEVICE
--------------------------------------------------------------------------
VBOX HARDDISK             1.0       VBc5aaf476-f419b1f1  sda

如果你看這個udisk2過程:

$ lsof -p $(pidof udisksd) | tail
udisksd 17041 root    3u     unix 0xffff88003a49d400      0t0     611852 socket
udisksd 17041 root    4u  a_inode                0,9        0       4852 [eventfd]
udisksd 17041 root    5u  a_inode                0,9        0       4852 [eventfd]
udisksd 17041 root    6u     unix 0xffff88003a49c000      0t0     611853 socket
udisksd 17041 root    7u  a_inode                0,9        0       4852 [eventfd]
udisksd 17041 root    8r      REG                0,3        0     611907 /proc/17041/mountinfo
udisksd 17041 root    9r      REG                0,3        0 4026532019 /proc/swaps
udisksd 17041 root   10r  a_inode                0,9        0       4852 inotify
udisksd 17041 root   11u  netlink                         0t0     611910 KOBJECT_UEVENT
udisksd 17041 root   12u  a_inode                0,9        0       4852 [eventfd]

那裡沒什麼可說的,吸引我眼球的就是那裡inotify。每當我看到那個,我立刻想到udev。

尋找udev規則

$ find /etc/udev/rules.d/ /usr/lib/udev/rules.d  | grep sto
/usr/lib/udev/rules.d/90-alsa-restore.rules
/usr/lib/udev/rules.d/60-persistent-storage.rules
/usr/lib/udev/rules.d/60-persistent-storage-tape.rules

第二個文件看起來很有趣,看看裡面。這條線看起來像原因:

$ cat /usr/lib/udev/rules.d/60-persistent-storage.rules
...
# enable in-kernel media-presence polling
ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_poll_msecs}=="0", ATTR{parameters/events_dfl_poll_msecs}="2000"

ATTR{parameters/events_dfl_poll_msecs}==“0”, ATTR{parameters/events_dfl_poll_msecs}=“2000”

參考

引用自:https://unix.stackexchange.com/questions/459861