深入理論講解Linux sysfs系統(tǒng)屬性
Linux sysfs系統(tǒng)經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展,很多用戶都很了解Linux sysfs系統(tǒng)了,這里我發(fā)表一下個(gè)人理解,和大家討論討論。Linux sysfs系統(tǒng)下具有使用 SCSI 總線連接的主機(jī)上,與 PCI類似的是也采用四個(gè)號(hào)碼作為一組來(lái)描述一個(gè)設(shè)備,其中位于最頂層的是scsi_host。以社區(qū)支持的方式開發(fā)Linux發(fā)行版Fedora Core Linux,而Red Hat公司原來(lái)Red Hat Linux的開發(fā)團(tuán)隊(duì)也將繼續(xù)參與這一發(fā)行版本的開發(fā)工作。Red Hat公司把Fedora Project看作一個(gè)新技術(shù)的開發(fā)園地,鼓勵(lì)有興趣的自由軟件開發(fā)人員參與此項(xiàng)項(xiàng)目的開發(fā),希望這一發(fā)行版本真正成為以自由軟件開發(fā)為模式的操作系統(tǒng)。
我們從設(shè)備類別 /class/為起點(diǎn)來(lái)探索:
# ls -lU /sys/class/scsi_host總計(jì) 0
lrwxrwxrwx 1 root root 0 12-13 01:59 host0 -> \
../../devices/pci0000:00/0000:00:02.5/host0/scsi_host/host0
lrwxrwxrwx 1 root root 0 12-13 01:59 host1 -> \
../../devices/pci0000:00/0000:00:02.5/host1/scsi_host/host1
注意這是 2.6.27 內(nèi)核的最新變化,在 /sys/class/ 下的都改為符號(hào)鏈接,真實(shí)的 kobject 都存在于 /sys/devices/ 中;我們這里探索其中的 host0 這個(gè) SCSI 控制器:
# readlink -f /sys/class/scsi_host/host0
/sys/devices/pci0000:00/0000:00:02.5/host0/scsi_host/host0
# ls -lU /sys/devices/pci0000:00/0000:00:02.5/host0/scsi_host/host0
總計(jì) 0
-rw-r--r-- 1 root root 4096 12-13 02:02 uevent
lrwxrwxrwx 1 root root 0 12-13 02:02 subsystem -> ../../../../../../class/scsi_host
lrwxrwxrwx 1 root root 0 12-13 02:02 device -> ../../../host0
-r--r--r-- 1 root root 4096 12-13 02:02 unique_id
-r--r--r-- 1 root root 4096 12-13 02:02 host_busy
-r--r--r-- 1 root root 4096 12-13 02:02 cmd_per_lun
-r--r--r-- 1 root root 4096 12-13 02:02 can_queue
-r--r--r-- 1 root root 4096 12-13 02:02 sg_tablesize
-r--r--r-- 1 root root 4096 12-13 02:02 unchecked_isa_dma
-r--r--r-- 1 root root 4096 12-13 02:02 proc_name
--w------- 1 root root 4096 12-13 02:02 scan
-rw-r--r-- 1 root root 4096 12-13 02:02 state
-rw-r--r-- 1 root root 4096 12-13 02:02 supported_mode
-rw-r--r-- 1 root root 4096 12-13 02:02 active_mode
-r--r--r-- 1 root root 4096 12-13 02:02 prot_capabilities
-r--r--r-- 1 root root 4096 12-13 02:02 prot_guard_type
drwxr-xr-x 2 root root 0 12-13 02:02 power
對(duì)這些屬性文件解釋如下:
有四個(gè) SCSI 特有的可寫參數(shù): scan,state,supported_mode,active_mode;可以向其中寫入不同的參數(shù)來(lái)控制此 SCSI 控制器的各種狀態(tài);
其它一些可讀屬性用于讀取這個(gè) SCSI 控制器的一些當(dāng)前值;
其中的 scan 屬性文件在調(diào)試一些 SCSI 硬件驅(qū)動(dòng)時(shí)很有用,它是只寫的,可以寫入三個(gè)至四個(gè)以空格分開的整數(shù),用于分別指定對(duì)應(yīng)的 host, channel, id, lun 進(jìn)行重新搜索。且這個(gè) scan 屬性支持以"-"作為通配符,如以下命令可以執(zhí)行讓整個(gè) scsi_host 進(jìn)行重新搜索,這個(gè)功能用于調(diào)試某些對(duì)熱挺拔實(shí)現(xiàn)不完善的 SCSI 驅(qū)動(dòng)程序很有用:
# echo '- - -' >/sys/devices/pci0000:00/0000:00:02.5/host0/scsi_host/host0/scan
內(nèi)核模塊中的 Linux sysfs系統(tǒng)屬性文件
以一個(gè) 8139too 模塊為例解釋在這個(gè) kboject 下每一個(gè)屬性的用途;
# find /sys/module/8139too/ -ls
6408 0 -r--r--r-- 1 root root 4096 12月 13 02:17 \
/sys/module/8139too/version
6412 0 drwxr-xr-x 2 root root 0 12月 13 02:17 \
/sys/module/8139too/sections
6433 0 drwxr-xr-x 2 root root 0 12月 13 02:17 \
/sys/module/8139too/notes
6434 0 -r--r--r-- 1 root root 36 12月 13 02:17 \
/sys/module/8139too/notes/.note.gnu.build-id
6486 0 drwxr-xr-x 2 root root 0 12月 13 02:17 \
/sys/module/8139too/drivers
6487 0 lrwxrwxrwx 1 root root 0 12月 13 02:17 \
/sys/module/8139too/drivers/pci:8139too -> ../../../bus/pci/drivers/8139too
其中的屬性文件都是只讀的,用于提供信息。從 version, srcversion 上可以了解到這個(gè)模塊所聲明的版本號(hào),源碼版本號(hào), refcnt 是模塊引用計(jì)數(shù), sections 屬性組中有一些模塊加載至內(nèi)存的相應(yīng)節(jié)信息, drivers/ 目錄中是對(duì)所提供的驅(qū)動(dòng)的鏈接;
因?yàn)槟K是Linux sysfs系統(tǒng)內(nèi)核驅(qū)動(dòng)編程的最佳選擇,而一個(gè)模塊有可能提供多個(gè)Linux sysfs系統(tǒng)驅(qū)動(dòng)程序,因而在未知一個(gè)設(shè)備在用哪一個(gè)驅(qū)動(dòng)的情況下可以先從 /sys/module/ 查找相應(yīng)模塊的情況,再?gòu)?drivers/ 發(fā)現(xiàn)出真正的驅(qū)動(dòng)程序。或者也可以完全反過(guò)來(lái)利用這些信息,先用 lspci/lshw 等工具找到 /sys/devices/ 下的設(shè)備節(jié)點(diǎn),再?gòu)钠湓O(shè)備的 driver 鏈接找到 /sys/bus/*/drivers/ 下的 device_driver, 再?gòu)?device_driver 下的 module 鏈接找到 /sys/module/*/,這樣就可以得到已加載模塊中空間是哪一個(gè)模塊在給一個(gè)設(shè)備提供驅(qū)動(dòng)程序。
更多 Linux sysfs系統(tǒng)屬性文件
以上所舉的例子僅僅是一些常見(jiàn)的 Linux sysfs系統(tǒng)屬性用法,實(shí)際的系統(tǒng)中還常常有很多其它的從未見(jiàn)過(guò)的 Linux sysfs系統(tǒng)屬性,因此只有舉例是不夠的,即使維護(hù)了一份 Linux sysfs系統(tǒng)屬性用法參考大全也不夠,未來(lái)的內(nèi)核版本還會(huì)出現(xiàn)新的 Linux sysfs系統(tǒng)屬性,因此還必須了解 Linux 內(nèi)核代碼以找到實(shí)現(xiàn)這些屬性的代碼位置,以學(xué)會(huì)在沒(méi)有相應(yīng)屬性文檔的情況從內(nèi)核源代碼來(lái)分析其 Linux sysfs系統(tǒng)屬性功能。
【編輯推薦】