雖然我了解 udev 的偉大之處並欣賞開發人員的努力,但我只是想知道是否有替代方案。
例如,我可能想像應該有一種方法來製作啟動腳本來建立大多數設備節點,這些設備節點在我的系統(不更改硬體)上無論如何都是最相同的。
我想跳過的好處或原因udev
與跳過相同dbus
,即降低複雜性,並透過增加我的變更來更安全地設定係統。
答案1
現代 Linux 核心支援devtmpfs
檔案系統(不要與古老的檔案系統混淆devfs
),一旦核心發現所有裝置節點,它就會動態建立它們。 (事實上,最新udev
版本要求這;你會發現 udev 不再建立任何裝置節點,只建立符號連結。
同樣,韌體載入也已移至核心中,因此唯一udev
執行的剩餘任務是模組載入(根據模態別名)以及應用裝置權限和其他 udev 規則。
所以從理論上講,一個完全整體的內核應該啟動沒有 udev 就可以了。
然而,這裡真正的問題是後來發生的事。
相當多的用戶空間程式依賴 udev 維護其設備資料庫,可通過
libudev
.雖然枚舉裝置和監聽新增/刪除的事件可以直接使用核心介面(sysfs 和 netlink)完成,但您仍然沒有各種 udev 規則附加的所有元資料。/dev/disk/by-*
udev 規則也維護、/dev/mapper
、/dev/input/by-path
、/dev/snd/by-path
等中的各種「持久」符號連結。例如,如果連接了兩個磁碟,則不能保證第一個磁碟始終是sda
orsdb
,但 udev 確保 中的符號連結/dev/disk/by-uuid
將繼續指向正確的磁碟。雖然設備節點現在由內核創建,因此不再是您關心的問題,但仍然需要注意的是,某些設備類型已開始使用動態分配的主/次編號,因此即使您今天有
/dev/fuse
10,228 和/dev/hpet
10,229,它們將要每次重新啟動後都有不同的數字,因此devtmpfs
或(在舊系統上)偵聽 uevents 的程式是必需的。
mdev
當然,其中許多事情可以透過其他程序輕鬆完成,例如。我的觀點是靜態/etc/MAKEDEV
腳本不再運作......
因此,基本上,當談到啟動複雜性時,udev 很可能是至少您的擔憂。
答案2
有多種替代方案udev
。貌似Gentoo可以使用一個叫做mdev
。另一種選擇是嘗試使用udev
其前身devfsd
。最後,您始終可以使用mknod
.
請注意,對於後者,無需在啟動時創建所有內容,因為節點可以在磁碟上創建,而不是像其他選項一樣在臨時檔案系統中創建。當然,當插入新硬體(例如 USB 記憶棒)時,您將失去動態建立裝置檔案的靈活性。我相信這個時代的標準方法是已經創建了您合理需要的每個設備文件/dev
(即許多設備文件)。
當然,在現代發行版中使用這些方法的難度可能相當高。 Gentoo wiki 提到了mdev
使用桌面環境的困難(更不用說在 Gentoo 之外)。最後一個devfsd
版本是 2002 年,我不知道它是否能與現代核心一起工作。手動建立節點可能是最可行的方法,但即使停用也udev
可能是一個挑戰,特別是在使用 distos 時systemd
(udev
現在是 的一部分systemd
,這表明存在很強的依賴性)。
我的建議是堅持udev
;)
答案3
有幾種選擇:
- 只需在作為引導程式的一部分執行的腳本中包含一組適當的
chmod
、chown
、等命令即可。ln
- 使用
systemd-udev
屬於 systemd 專案一部分的即插即用管理器。 - 使用根圖的
eudev
,它是 systemd 的一個分支,systemd-udev
現在已經與它顯著不同。 - 使用德萬的
vdev
,這是由 Jude Nelson 開發的即插即用管理器,是 Devuan 的一部分。 - 使用
mdev
,與另一個答案相反,這不是 Gentoo 的事情。它是內建的即插即用管理器忙碌盒。 - 使用無吸
mdev
這是 Dimitris Papastamos 開發的即插即用管理器。 - 使用洛朗·貝爾科特
mdevd
,它的配置與 BusyBox 相容mdev
,但有自己的套接字處理並且不理解 LISTEN 協定。
除了第一個之外,所有這些都需要一組規則來描述如何對有關設備的核心通知事件做出反應。明顯地。
還有一些工具可以取得為 設計的程序/proc/sys/kernel/hotplug
,例如兩個mdev
s,並透過偵聽 netlink 套接字然後產生這些程序來調整和序列化它們:
答案4
這是舊的,但我想在這裡為其他徒勞搜索的人捕獲我的解決方案。
避免 udev 並不容易。將 DEVTMPFS 排除在配置之外並不會阻止核心在 /dev 上安裝 RAM 磁碟並填充它。不幸的是,它沒有創建必要的 /dev/shm 和 /dev/pts 掛載點。必要的是將 devtmpfs.mount=0 新增到引導參數中。