歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 使用 /sys 文件系統訪問 Linux 內核

使用 /sys 文件系統訪問 Linux 內核

日期:2017/2/28 16:50:35   编辑:Linux教程

sysfs 是 Linux 內核中設計較新的一種虛擬的基於內存的文件系統,它的作用與 proc 有些類似,但除了與 proc 相同的具有查看和設定內核參數功能之外,還有為 Linux 統一設備模型作為管理之用。相比於 proc 文件系統,使用 sysfs 導出內核數據的方式更為統一,並且組織的方式更好,它的設計從 proc 中吸取了很多教訓。本文就 sysfs 的掛載點 /sys 目錄結構、其與 Linux 統一設備模型的關系、常見屬性文件的用法等方面對 sysfs 作入門介紹,並且就內核編程方面,以具體的例子來展示如何添加 sysfs 支持。

sysfs 的歷史,其與 proc 的關系?

sysfs 本身並不是一項很新的技術,但筆者發現,雖然 sysfs 從2003年誕生至今已有5年,但人們對 sysfs 依然缺乏了解;一個很重要的原因可能是缺乏文檔, Linux 內核方面最重要的理論書籍“Linux 設備驅動第3版”和“理解 Linux 內核第2版”都誕生於2003年前後,並且從那以後尚未有再版過,其它一些重要文章則多對 sysfs 與 proc 相提並論且舉例常常只有 proc,這導致了 sysfs 的很多重要概念至今仍鮮為人知,因此有必要對 sysfs 作更多介紹,這是寫作本文的初衷。

sysfs 與 /sys

sysfs 文件系統總是被掛載在 /sys 掛載點上。雖然在較早期的2.6內核系統上並沒有規定 sysfs 的標准掛載位置,可以把 sysfs 掛載在任何位置,但較近的2.6內核修正了這一規則,要求 sysfs 總是掛載在 /sys 目錄上;針對以前的 sysfs 掛載位置不固定或沒有標准被掛載,有些程序從 /proc/mounts 中解析出 sysfs 是否被掛載以及具體的掛載點,這個步驟現在已經不需要了。請參考附錄給出的 sysfs-rules.txt 文件鏈接。

sysfs 與 proc

sysfs 與 proc 相比有很多優點,最重要的莫過於設計上的清晰。一個 proc 虛擬文件可能有內部格式,如 /proc/scsi/scsi ,它是可讀可寫的,(其文件權限被錯誤地標記為了 0444 !,這是內核的一個BUG),並且讀寫格式不一樣,代表不同的操作,應用程序中讀到了這個文件的內容一般還需要進行字符串解析,而在寫入時需要先用字符串格式化按指定的格式寫入字符串進行操作;相比而言, sysfs 的設計原則是一個屬性文件只做一件事情, sysfs 屬性文件一般只有一個值,直接讀取或寫入。整個 /proc/scsi 目錄在2.6內核中已被標記為過時(LEGACY),它的功能已經被相應的 /sys 屬性文件所完全取代。新設計的內核機制應該盡量使用 sysfs 機制,而將 proc 保留給純淨的“進程文件系統”。

初識 /sys

清單 1. 與 /sys 文件系統的一次交互(視內核版本號和外接設備的不同,在您的系統上執行這些命令的結果可能與此有所不同)

ls -F /sys

block/ bus/ class/ dev/ devices/ firmware/ fs/ kernel/ module/ power/

$ ls -F /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/

broken_parity_status enable modalias resource0 rom uevent

class irq msi_bus resource0_wc subsystem@ vendor

config local_cpulist power/ resource1 subsystem_device

device local_cpus resource resource2 subsystem_vendor

這是在 Fedora 10 的 2.6.27.5-117.fc10.i686 的內核上,可以看到在 /sys 目錄下有 block, bus, class, dev, devices, firmware, fs, kernel, module, power 這些子目錄,本文將分別介紹這些目錄存在的含義。

第二個 ls 命令展示了在一個 pci 設備目錄下的文件, "ls" 命令的 "-F" 命令為所列出的每個文件使用後綴來顯示文件的類型,後綴 "/" 表示列出的是目錄,後綴 "@" 表示列出的是符號鏈接文件。可以看到第二個目錄下包含有普通文件 (regular file) 和符號鏈接文件 (symbolic link file) ,本文也將以這個具體的設備為例說明其中每一個普通文件的用途。

Copyright © Linux教程網 All Rights Reserved