sysfs 檔案系統總是被掛載在 /sys 掛載點上。雖然在較早期的2.6核心系統上並沒有規定 sysfs 的標準掛載位置,可以把 sysfs 掛載在任何位置,但較近的2.6核心修正了這一規則,要求 sysfs 總是掛載在 /sys 目錄上;針對以前的 sysfs 掛載位置不固定或沒有標準被掛載,有些程式從 /proc/mounts 中解析出 sysfs 是否被掛載以及具體的掛載點,這個步驟現在已經不需要了。請參考附錄給出的 sysfs-rules.txt 檔案鏈結。
sysfs 與 proc 相比有很多優點,最重要的莫過於設計上的清晰。乙個 proc 虛擬檔案可能有內部格式,如/proc/scsi/scsi
,它是可讀可寫的,(其檔案許可權被錯誤地標記為了 0444 !,這是核心的乙個bug),並且讀寫格式不一樣,代表不同的操作,應用程式中讀到了這個檔案的內容一般還需要進行字串解析,而在寫入時需要先用字串格式化按指定的格式寫入字串進行操作;相比而言, sysfs 的設計原則是乙個屬性檔案只做一件事情, sysfs 屬性檔案一般只有乙個值,直接讀取或寫入。整個/proc/scsi
目錄在2.6核心中已被標記為過時(legacy),它的功能已經被相應的 /sys 屬性檔案所完全取代。新設計的核心機制應該盡量使用 sysfs 機制,而將 proc 保留給純淨的「程序檔案
sysfs 本身並不是一項很新的技術,但筆者發現,雖然 sysfs 從2023年誕生至今已有5年,但人們對 sysfs 依然缺乏了解;乙個很重要的原因可能是缺乏文件, linux 核心方面最重要的理論書籍「linux 裝置驅動第3版」和「理解 linux 核心第2版」都誕生於2023年前後,並且從那以後尚未有再版過,其它一些重要文章則多對 sysfs 與 proc 相提並論且舉例常常只有 proc,這導致了 sysfs 的很多重要概念至今仍鮮為人知,因此有必要對 sysfs 作更多介紹,這是寫作本文的初衷.
在 sysfs 下的很多 kobject 下都有 uevent 屬性,它主要用於核心與 udev (自動裝置發現程式)之間的乙個通訊介面;從 udev 本身與核心的通訊介面 netlink 協議套接字來說,它並不需要知道裝置的 uevent 屬性檔案,但多了 uevent 這樣乙個介面,可用於 udevmonitor 通過核心向 udevd (udev 後台程式)傳送訊息,也可用於檢查裝置本身所支援的 netlink 訊息上的環境變數,這個特性一般用於開發人員除錯 udev 規則檔案, udevtrigger 這個除錯工具本身就是以寫各裝置的 uevent 屬性檔案實現的。
這些 uevent 屬性檔案一般都是可寫的,其中 /sys/devices/ 樹下的很多 uevent 屬性在較新核心下還支援可讀:
#find /sys/ -type f -name uevent -ls11 0 -rw-r--r-- 1 root root 4096 12月 12 21:10 \/sys/devices/platform/uevent
1471 0 -rw-r--r-- 1 root root 4096 12月 12 21:10 \
/sys/devices/platform/pcspkr/uevent
3075 0 -rw-r--r-- 1 root root 4096 12月 12 21:10 \
/sys/devices/platform/vesafb.0/uevent
3915 0 -rw-r--r-- 1 root root 4096 12月 12 21:10 \
/sys/devices/platform/serial8250/uevent
3941 0 -rw-r--r-- 1 root root 4096 12月 12 21:10 \
/sys/devices/platform/serial8250/tty/ttys2/uevent
3950 0 -rw-r--r-- 1 root root 4096 12月 12 21:10 \
/sys/devices/platform/serial8250/tty/ttys3/uevent
5204 0 -rw-r--r-- 1 root root 4096 12月 12 21:10 \
/sys/devices/platform/i8042/uevent
[...]
912 0 -rw-r--r-- 1 root root 4096 12月 12 21:17 \
/sys/devices/pci0000:00/0000:00:02.5/uevent
[...]
上面擷取的最後乙個是 scsi 硬碟控制器裝置的 uevent 屬性檔案,這些 /devices/ 屬性檔案都支援寫入,當前支援寫入的引數有 "add","remove","change","move","online","offline"。如,寫入 "add",這樣可以向 udevd 傳送一條 netlink 訊息,讓它再重新一遍相關的 udev 規則檔案;這個功能對開發人員除錯 udev 規則檔案很有用。
# echo add > /sys/devices/pci0000:00/0000:00:02.5/uevent
/sys
下的子目錄
內容 /sys/devices
該目錄下是全域性裝置結構體系,包含所有被發現的註冊在各種匯流排上的各種物理裝置。一般來說,所有的物理裝置都按其在匯流排上的拓撲結構來顯示,但有兩個例外,即platform devices
和system devices
。platform devices
一般是掛在晶元內部的高速或者低速匯流排上的各種控制器和外設,它們能被cpu
直接定址;system devices
不是外設,而是晶元內部的核心結構,比如cpu
,timer
等,它們一般沒有相關的驅動,但是會有一些體系結構相關的**來配置它們。
(sys/devices
是核心對系統中所有裝置的分層次表達模型,也是/sys
檔案系統管理裝置的最重要的目錄結構)
sys/dev
該目錄下維護乙個按照字元裝置和塊裝置的主次號碼(major:minor)
鏈結到真是裝置(/sys/devices)
的符號鏈結檔案。
/sys/class
該目錄下包含所有註冊在kernel
裡面的裝置型別,這是按照裝置功能分類的裝置模型,每個裝置型別表達具有一種功能的裝置。每個裝置型別子目錄下都是這種哦哦那個裝置型別的各種具體裝置的符號鏈結,這些鏈結指向/sys/devices/name
下的具體裝置。裝置型別和裝置並沒有一一對應的關係,乙個物理裝置可能具備多種裝置型別;乙個裝置型別只表達具有一種功能的裝置,比如:系統所有輸入裝置都會出現在/sys/class/input
之下,而不論它們是以何種匯流排連線到系統的。(/sys/class
也是構成linux
統一裝置模型的一部分)
/sys/block
該目錄下的所有子目錄代表著系統中當前被發現的所有塊裝置。按照功能來說防止在/sys/class
下會更合適,但由於歷史遺留因素而一直存在於/sys/block
,但從linux2.6.22
核心開始這部分就已經標記為過去時,只有開啟了config_sysfs_deprecated
配置編譯才會有這個目錄存在,並且其中的內容在從linux2.6.26
版本開始已經正式移到了/sys/class/block
,舊的介面/sys/block
為了向後相容而保留存在,但其中的內容已經變為了指向它們在/sys/devices/
中真實裝置的符號鏈結檔案。
/sys/bus
該目錄下的每個子目錄都是kernel
支援並且已經註冊了的匯流排型別。這是核心裝置按照匯流排型別分層放置的目錄結構,/sys/devices
中的所有裝置都是連線於某種匯流排之下的,bus
子目錄下的每種具體匯流排之下可以找到每個具體裝置的符號鏈結,
一般來說每個子目錄(
匯流排型別)
下包含兩個子目錄,乙個是devices
,另乙個是drivers
;其中devices
下是這個匯流排型別下的所有裝置,這些裝置都是符號鏈結,它們分別指向真正的裝置(/sys/devices/name/
下);而drivers
下是所有註冊在這個匯流排上的驅動,每個driver
子目錄下 是一些可以觀察和修改的driver
引數。
(它也是構成linux
統一裝置模型的一部分)
/sys/fs
按照設計,該目錄使用來描述系統中所有的檔案系統,包括檔案系統本身和按照檔案系統分類存放的已掛載點。
/sys/kernel
這個目錄下存放的是核心中所有可調整的引數
/sys/firmware
該目錄下包含對韌體物件(firmware object)
和屬性進行操作和觀察的介面,即這裡是系統載入韌體機制的對使用者空間的介面.(
關於韌體有專用於韌體載入的一套api)
/sys/hypervisor
該目錄是與虛擬化xen
相關的裝置。(xen
是乙個開放源**的虛擬機器監視器)
/sys/module
該目錄下有系統中所有的模組資訊,不論這些模組是以內聯(inlined)
方式編譯到核心映像檔案中還是編譯為外模組(.ko
檔案),都可能出現在/sys/module
中。即module
目錄下包含了所有的被載入kernel
的模組。
/sys/power
該目錄是系統中的電源選項,對正在使用的power
子系統的描述。這個目錄下有幾個屬性檔案可以用於控制整個機器的電源狀態,如可以向其中寫入控制命令讓機器關機/
重啟等等。
linux sys 檔案系統
一 檔案系統 1.window檔案系統 ntfs u盤 fat32 linux檔案系統 ext2 ext3 ext4 stat裡面的時間辨析 atime 最近訪問時間 mtime 最近更改時間 指最近修改檔案內容的時間。ctime 最近改動時間 指最近改動inode的時間。3.access檢查乙個檔...
linux sys檔案的建立
1 sys 檔案的建立 1.1 定義 show 和 store函式,這兩個函式對應對sys檔案的讀寫,show對應read store對應write 函式的型別如下 ssize t show struct device d,struct device attribute attr,char buf ...
Linux目錄介紹
linux目錄介紹使用 root 登入進入系統後預設進入的使用者的 home 目錄,可以使用 pwd列印當前工作目錄的位置 在根目錄下面輸入 ls 檢視。由於 root 使用者許可權比較高,不要輕易使用,先建立乙個普通使用者,使用 useradd rathat 命令建立 rathat 命令passw...