Linux procfs詳解
1.0 proc文件系統(tǒng)總覽
在類Unix系統(tǒng)中體現(xiàn)了一種良好的抽象哲學(xué),就是幾乎所有的數(shù)據(jù)實(shí)體都被抽象成一個(gè)統(tǒng)一的接口--文件來(lái)看待,這樣我們就可以用一些簡(jiǎn)單的基本工具完成大量復(fù)雜的操作。在Linux中存在著一類
特殊的偽文件系統(tǒng),用于使用與文件接口統(tǒng)一的操作來(lái)完成各種功能,例如ptyfs、devfs、sysfs和procfs。而procfs就是其中應(yīng)用最廣泛的一種偽文件系統(tǒng)。
procfs是Linux內(nèi)核信息的抽象文件接口,大量?jī)?nèi)核中的信息以及可調(diào)參數(shù)都被作為常規(guī)文件映射到一個(gè)目錄樹(shù)中,這樣我們就可以簡(jiǎn)單直接的通過(guò)echo或cat這樣的文件操作命令對(duì)系統(tǒng)信息進(jìn)行查取
和調(diào)整了。同時(shí)procfs也提供了一個(gè)接口,使得我們自己的內(nèi)核模塊或用戶態(tài)程序可以通過(guò)procfs進(jìn)行參數(shù)的傳遞。在當(dāng)今的Linux系統(tǒng)中,大量的系統(tǒng)工具也通過(guò)procfs獲取內(nèi)核參數(shù),例如ps、
lspci等等,沒(méi)有procfs它們將可能不能正常工作。
procfs的使用如同常規(guī)的文件系統(tǒng)一樣,例如加載一個(gè)procfs (首先確定你的內(nèi)核已經(jīng)支持procfs默認(rèn)如此):
# mount -t proc none /proc
也可以在/etc/fstab中加入如下一行使系統(tǒng)在啟動(dòng)時(shí)自動(dòng)加載procfs(大多數(shù)系統(tǒng)中也是默認(rèn)如此):
none /proc proc defaults 0 0
在proc文件系統(tǒng)中,主要包含三大類內(nèi)容,進(jìn)程相關(guān)部分,系統(tǒng)信息部分,以及系統(tǒng)子系統(tǒng)部分。在下面我們可以看到一個(gè)典型的procfs布局:
> ls /proc
1 2 2166 2281 cmdline interrupts meminfo stat
13 2001 2167 3 cpuinfo iomem misc swaps
1646 2042 2168 4 crypto ioports modules sys
1780 2058 2169 5 devices irq mounts sysrq-trigger
1834 2087 2170 6 dma isapnp mtrr sysvipc
1838 2096 2171 7 driver kcore net tty
1857 2107 2207 71 execdomains kmsg partitions uptime
1877 2117 2208 8 fb ksyms pci version
1889 2143 2216 9 filesystems loadavg scsi
1905 2153 2217 apm fs locks self
1960 2165 2219 bus ide mdstat slabinfo
在上面的布局中我們可以看到procfs包含的內(nèi)容:
* 進(jìn)程相關(guān)部分 (只讀)
這部分文件都是以數(shù)字為名的子目錄,這個(gè)數(shù)字就是相關(guān)進(jìn)程的進(jìn)程ID,在 1.1節(jié)中會(huì)詳細(xì)介紹進(jìn)程相關(guān)子目錄的結(jié)構(gòu)和信息。
需要注意的是procfs中進(jìn)程子系統(tǒng)部分的一個(gè)特殊點(diǎn),就是/proc/self,它是指向當(dāng)前執(zhí)行進(jìn)程的符號(hào)連接,或者說(shuō)--是指向未來(lái)你將要執(zhí)行指令的心靈感應(yīng):
> cat self/cmdline
catself/cmdline
在這個(gè)命令中,我們希望它顯示當(dāng)前進(jìn)程的cmdline參數(shù),它恰恰就顯示了當(dāng)前進(jìn)程--我們所執(zhí)行的這條命令,cat self/cmdline。幸好這條指令顯示出的信息會(huì)忽略空格,導(dǎo)致顯示略微的不正常,否則我們倒是可以很容易的使用`cat self/cmdline`這樣的命令制造出永遠(yuǎn)循環(huán)執(zhí)行的進(jìn)程來(lái)。;>
* 內(nèi)核信息部分 (只讀)
這部分文件同樣處于/proc的頂層目錄,不過(guò)它們大部分都是常規(guī)、只讀的文本文件,可以直接用cat查看信息。作為系統(tǒng)內(nèi)核執(zhí)行體的抽象,我們也可以把它看作內(nèi)核"進(jìn)程"的信息部分,當(dāng)然雖然并不存在這個(gè)進(jìn)程實(shí)體。這里比較特別的一個(gè)文件是 /proc/cmdline :
>cat cmdline
ro root=/dev/hda2
在這個(gè)文件中存放的是系統(tǒng)內(nèi)核引導(dǎo)時(shí)的命令行參數(shù)。此部分內(nèi)容將在 1.3節(jié)中說(shuō)明。
* 內(nèi)核各子系統(tǒng)相關(guān)部分 (部分可調(diào))
這部分是系統(tǒng)內(nèi)核參數(shù)調(diào)整的重頭戲,在procfs中,除去上面所述的兩部分內(nèi)容外,還有很大一部分信息文件被存放在了一些并非以數(shù)字命名的特殊目錄中,這些目錄下的信息就是內(nèi)核各個(gè)重要子系統(tǒng)的信息和可調(diào)參數(shù),主要有:
bus 總線信息(只讀)
drivers 驅(qū)動(dòng)信息(只讀)
fs 文件系統(tǒng)特別信息(只讀)
ide IDE接口信息(只讀)
irq IRQ信息(只讀)
net 網(wǎng)絡(luò)子系統(tǒng)信息(只讀)
scsi SCSI系統(tǒng)信息(只讀)
sysvipc IPC子系統(tǒng)信息(只讀)
tty tty子系統(tǒng)信息(只讀)
sys 系統(tǒng)內(nèi)核可調(diào)參數(shù) (可調(diào))
作為L(zhǎng)inux系統(tǒng)內(nèi)核參數(shù)的抽象文件接口,Linux內(nèi)核的大部分默認(rèn)可調(diào)參數(shù)都被放在了 /proc/sys目錄下,這些參數(shù)都以常規(guī)文件的形式體現(xiàn),并且可以用echo/cat等文件操作命令進(jìn)行調(diào)整,調(diào)整的效果是即時(shí)的,并且在系統(tǒng)運(yùn)行的整個(gè)生命周期之間都有效(知道再次改變它們或者系統(tǒng)重啟)。
當(dāng)然Linux也提供了另外一種途徑sysctl來(lái)調(diào)整這些參數(shù),sysctl是從BSD系統(tǒng)繼承而來(lái)的一種系統(tǒng)參數(shù)動(dòng)態(tài)調(diào)整方法,sysctl的使用更為簡(jiǎn)單,并且可以使用/etc/sysctl.conf保存配置以在下次啟動(dòng)時(shí)自動(dòng)加載這些設(shè)置。對(duì)于sysctl可調(diào)參數(shù)體積調(diào)整方法將在另一篇文章中說(shuō)明。
對(duì)于內(nèi)核信息和參數(shù)的說(shuō)明將在 1.4 - 1.7節(jié)中解釋;對(duì)于/proc/sys中的可調(diào)參數(shù)將在第二章中詳細(xì)說(shuō)明。
1.1 進(jìn)程相關(guān)子目錄
在/proc目錄中包含了一些以數(shù)字為名的子目錄,這些目錄就是系統(tǒng)當(dāng)前運(yùn)行進(jìn)程的proc抽象。每一個(gè)目錄都以相關(guān)聯(lián)的活動(dòng)系統(tǒng)進(jìn)程PID為目錄名,在目錄下包含了一些文件,用于顯示進(jìn)程相關(guān)的信息。每個(gè)進(jìn)程映射子目錄的結(jié)構(gòu)都如 Table 1-1.
..............................................................................
文件名 內(nèi)容
cmdline 執(zhí)行進(jìn)程的命令行參數(shù)
cpu 在SMP系統(tǒng)中近程最后的執(zhí)行CPU (2.4)(smp)
cwd 到當(dāng)前工作目錄的符號(hào)鏈接
environ 環(huán)境變量
exe 鏈接到進(jìn)程對(duì)應(yīng)的源可執(zhí)行文件
fd 包含所有進(jìn)程打開(kāi)的文件描述符的子目錄
maps 進(jìn)程內(nèi)存映射,包含進(jìn)程執(zhí)行空間以及動(dòng)態(tài)鏈接庫(kù)信息 (2.4)
mem 進(jìn)程內(nèi)存空間
root 連接到進(jìn)程執(zhí)行時(shí)的 / (root)目錄
stat 進(jìn)程狀態(tài)
statm 進(jìn)程內(nèi)存狀態(tài)信息
status 進(jìn)程狀態(tài)總覽,包含進(jìn)程名字、當(dāng)前狀態(tài)和各種信息統(tǒng)計(jì)
..............................................................................
舉例來(lái)說(shuō),要獲取一個(gè)進(jìn)程的狀態(tài),只要讀取下面進(jìn)程PID子目錄下的status文件 /proc/PID/status:
>cat /proc/self/status
Name: cat
State: R (running)
Pid: 5452
PPid: 743
TracerPid: 0 (2.4)
Uid: 501 501 501 501
Gid: 100 100 100 100
Groups: 100 14 16
VmSize: 1112 kB
VmLck: 0 kB
VmRSS: 348 kB
VmData: 24 kB
VmStk: 12 kB
VmExe: 8 kB
VmLib: 1044 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 00000000fffffeff
CapPrm: 0000000000000000
CapEff: 0000000000000000
如同第一節(jié)所說(shuō),/proc/self連接指向讀取它自身的進(jìn)程映像,在之后一節(jié)的例子中都將以它作為我們的范例。
這條命令顯示的信息與你通過(guò) /bin/ps 命令獲取到的進(jìn)程信息基本相同,這恰巧是因?yàn)?ps也是通過(guò)讀取procfs來(lái)獲取這些信息的。statm 文件包含了更詳細(xì)的進(jìn)程內(nèi)存狀態(tài),statm的詳細(xì)內(nèi)容按照數(shù)據(jù)項(xiàng)由左向右依次如 Table 1-2.
> cat /proc/self/statm
105 105 93 4 12 89 12
..............................................................................
數(shù)據(jù)項(xiàng) 內(nèi)容
size 程序大小
resident 常駐內(nèi)存空間大小
shared 共享內(nèi)存頁(yè)數(shù)
trs 代碼段占用內(nèi)存頁(yè)數(shù)
drs 數(shù)據(jù)/堆棧段占用內(nèi)存頁(yè)數(shù)
lrs 引用庫(kù)占用內(nèi)存頁(yè)數(shù)
dt 臟頁(yè)數(shù)量
..............................................................................
1.2 內(nèi)核數(shù)據(jù)
相似于進(jìn)程入口,在/proc目錄下的其他一些文件給出了內(nèi)核信息數(shù)據(jù),這些文件包含了系統(tǒng)當(dāng)前運(yùn)行內(nèi)核相關(guān)信息。/proc目錄下內(nèi)核相關(guān)信息文件在Table 1-3 中列出,依賴于您的系統(tǒng)配置和加載的內(nèi)核模塊,在您的系統(tǒng)中的顯示可能會(huì)略有不同。
..............................................................................
文件 內(nèi)容
apm 高級(jí)電源管理信息
bus bus總線相關(guān)信息
cmdline 內(nèi)核引導(dǎo)命令行參數(shù)
cpuinfo cpu信息
devices 當(dāng)前可用設(shè)備 (包含所有塊設(shè)備和字符設(shè)備)
dma DMA通道使用狀況
filesystems 當(dāng)前內(nèi)核支持的文件系統(tǒng)
driver 驅(qū)動(dòng)相關(guān)信息 (2.4)
execdomains 安全相關(guān)的Execdomains信息 (2.4)
fb Frame Buffer 設(shè)備 (2.4)
fs 本地文件系統(tǒng)參數(shù) (2.4)
ide IDE子系統(tǒng)相關(guān)信息的子目錄
interrupts 中斷使用狀況
iomem 內(nèi)存映射圖 (2.4)
ioports I/O端口使用狀況
irq 關(guān)聯(lián)到cpu的irq使用狀況 (2.4)(smp?)
isapnp ISA PnP (即插即用) 信息 (2.4)
kcore Kernel core image,內(nèi)核轉(zhuǎn)儲(chǔ)映像 (2.4)
kmsg Kernel messages
ksyms Kernel symbol table,內(nèi)核符號(hào)表
loadavg 最后1、5 、15 分鐘的平均負(fù)載
locks Kernel locks, 內(nèi)核鎖信息
meminfo 內(nèi)存信息
misc 內(nèi)核信息雜項(xiàng)
modules 已加載內(nèi)核模塊列表
mounts 已加載的文件系統(tǒng)
net 網(wǎng)絡(luò)子系統(tǒng)信息
partitions 已識(shí)別的本地系統(tǒng)分區(qū)表
pci PCI總線相關(guān)信息,在新版本中指向 /proc/bus/pci/ 目錄 (2.4)
rtc rtc實(shí)時(shí)鐘
scsi SCSI 總線信息
slabinfo Slab 內(nèi)存分配池信息
stat 內(nèi)核狀態(tài)總覽
swaps Swap 空間狀態(tài)
sys 內(nèi)核系統(tǒng)參數(shù) (參見(jiàn)第二章)
sysvipc SysVIPC 資源狀態(tài) (msg, sem, shm) (2.4)
tty TTY驅(qū)動(dòng)信息
uptime 系統(tǒng) uptime
version 內(nèi)核版本
video video 資源狀態(tài) (2.4)
..............................................................................
在proc文件系統(tǒng)中大多數(shù)文件都是可讀的文本,可以直接使用系統(tǒng)中的常規(guī)文件處理命令進(jìn)行操作。當(dāng)然,這也依賴于目標(biāo)文件的權(quán)限屬性。例如要查看系統(tǒng)中斷信息 /proc/interrupts:
> cat /proc/interrupts
CPU0
0: 8728810 XT-PIC timer
1: 895 XT-PIC keyboard
2: 0 XT-PIC cascade
3: 531695 XT-PIC aha152x
4: 2014133 XT-PIC serial
5: 44401 XT-PIC pcnet_cs
8: 2 XT-PIC rtc
11: 8 XT-PIC i82365
12: 182918 XT-PIC PS/2 Mouse
13: 1 XT-PIC fpu
14: 1232265 XT-PIC ide0
15: 7 XT-PIC ide1
NMI: 0
在2.4版內(nèi)核中,當(dāng)使用了SMP時(shí)這個(gè)文件末尾會(huì)多出兩行SMP相關(guān)屬性 LOC & ERR :
> cat /proc/interrupts
CPU0 CPU1
0: 1243498 1214548 IO-APIC-edge timer
1: 8949 8958 IO-APIC-edge keyboard
2: 0 0 XT-PIC cascade
5: 11286 10161 IO-APIC-edge soundblaster
8: 1 0 IO-APIC-edge rtc
9: 27422 27407 IO-APIC-edge 3c503
12: 113645 113873 IO-APIC-edge PS/2 Mouse
13: 0 0 XT-PIC fpu
14: 22491 24012 IO-APIC-edge ide0
15: 2183 2415 IO-APIC-edge ide1
17: 30564 30414 IO-APIC-level eth0
18: 177 164 IO-APIC-level bttv
NMI: 2457961 2457959
LOC: 2457882 2457881
ERR: 2155
NMI是每個(gè)CPU上產(chǎn)生的不可屏蔽中斷(Non Maskable Interrupt)的計(jì)數(shù);
LOC是每個(gè)CPU上APIC本地中斷的計(jì)數(shù)。
ERR是SMP系統(tǒng)中IO-APIC總線失敗錯(cuò)誤的計(jì)數(shù),如果這個(gè)數(shù)量太高,可能你的內(nèi)核運(yùn)行會(huì)有問(wèn)題,這時(shí)候就需要測(cè)試內(nèi)核,查看硬件和APIC是否有兼容性問(wèn)題。
在2.4內(nèi)核中irq相關(guān)的內(nèi)核信息被放在/proc/irq目錄下,在這個(gè)目錄下包含一個(gè)文件
prof_cpu_mask和每個(gè)IRQ獨(dú)屬的一個(gè)子目錄。
> ls /proc/irq/
0 10 12 14 16 18 2 4 6 8 prof_cpu_mask
1 11 13 15 17 19 3 5 7 9
> ls /proc/irq/0/
smp_affinity
2.4內(nèi)核中可以使用IRQ綁定屬性,是某個(gè)或全部的IRQ掛接到SMP集合中的某個(gè)CPU上,這個(gè)特性可以通過(guò)prof_cpu_mask和smp_affinity來(lái)調(diào)整。在默認(rèn)情況下這兩個(gè)文件的內(nèi)容都"ffffffff",作為一個(gè)位映射而存在,你可以使用echo命令來(lái)指定一個(gè)CPU處理IRQ事件。
> cat /proc/irq/0/smp_affinity
ffffffff
> echo 1 > /proc/irq/prof_cpu_mask
這天命令的結(jié)果就是系統(tǒng)中只有第一個(gè)CPU可以捕獲IRQ事件,如果您使用的是"echo 5"的話那么第一和第四個(gè)CPU都可以捕獲和處理事件(1 + 4)。
在默認(rèn)情況下IRQ事件由IO-APIC分配,它將輪詢每個(gè)配置中的CPU,等待其中一個(gè)處理事件響應(yīng)。
在slabinfo文件文件中我們可以看到Linux內(nèi)核的內(nèi)存分配池信息,2.4版本內(nèi)核中使用slab算法來(lái)為內(nèi)核對(duì)象(網(wǎng)絡(luò)緩存、目錄高速緩存以及文件分配表等等)分配內(nèi)存頁(yè)。
在/proc目錄下還有三個(gè)重要的目錄: net,scsi和sys,我們會(huì)在后面的章節(jié)中陸續(xù)描述;此外如果您的系統(tǒng)中沒(méi)有SCSI設(shè)備(或沒(méi)有SCSI驅(qū)動(dòng))的話,/proc/scsi目錄是不存在的。
1.3 IDE設(shè)備 /proc/ide
/proc/ide目錄下包含了所有內(nèi)核識(shí)別出的IDE設(shè)備的信息。在/proc/ide目錄下包含drivers文件和若干個(gè)以IDE設(shè)備名或IDE控制器名為名的子目錄。
> ls -alF /proc/ide/
total 3
dr-xr-xr-x 4 root root 0 10月 9 23:36 ./
dr-xr-xr-x 54 root root 0 2004-10-10 ../
-r--r--r-- 1 root root 0 10月 9 23:36 drivers
lrwxrwxrwx 1 root root 8 10月 9 23:36 hda -> ide0/hda/
lrwxrwxrwx 1 root root 8 10月 9 23:36 hdb -> ide0/hdb/
lrwxrwxrwx 1 root root 8 10月 9 23:36 hdc -> ide1/hdc/
dr-xr-xr-x 4 root root 0 10月 9 23:36 ide0/
dr-xr-xr-x 3 root root 0 10月 9 23:36 ide1/
-r--r--r-- 1 root root 0 10月 9 23:36 piix
drivers文件包含了當(dāng)前加載的IDE設(shè)備驅(qū)動(dòng):
> cat /proc/ide/drivers
ide-floppy version 0.99.newide
ide-disk version 1.17
ide-default version 0.9.newide
在/proc/ide目錄下還可以看到其他一些以設(shè)備命名的目錄,在這些目錄下我們可以看到更詳細(xì)的信息。piix是IDE控制芯片組的名字,在你的系統(tǒng)中可能是其他名字。此外還包含若干個(gè)(一般的PC上是2個(gè))IDE控制器為名的目錄,以及以IDE終端設(shè)備名命名的快捷方式,它門將鏈接到控制器目錄下對(duì)應(yīng)的設(shè)備文件上。
在ide*目錄中我們可以得到更多的信息,如 Table 1-4.
..............................................................................
文件名 內(nèi)容
channel IDE通道 (0 or 1)
config 配置 (only for PCI/IDE bridge)
mate Mate name
model IDE控制器的類型/芯片組
hd? IDE總線上連接的可用設(shè)備
..............................................................................
當(dāng)前連接在控制器上的每個(gè)設(shè)備也將成為一個(gè)單獨(dú)的子目錄,如 Table 1-5.
..............................................................................
文件名 內(nèi)容
cache 設(shè)備緩存大小
capacity 設(shè)備數(shù)據(jù)塊數(shù)量 (按 512Byte 塊)
driver 驅(qū)動(dòng)和版本
geometry 物理和邏輯的設(shè)備參數(shù)
identify 設(shè)備標(biāo)示塊
media 媒體類型
model 設(shè)備標(biāo)識(shí)符(型號(hào)或名字)
settings 設(shè)備配置參數(shù)
smart_thresholds IDE disk management thresholds
smart_values IDE disk management values
..............................................................................
在這里比較有用的信息是settings文件,它包含了一個(gè)驅(qū)動(dòng)器相關(guān)的信息總覽:
# cat /proc/ide/ide0/hda/settings
name value min max mode
---- ----- --- --- ----
bios_cyl 526 0 65535 rw
bios_head 255 0 255 rw
bios_sect 63 0 63 rw
breada_readahead 4 0 127 rw
bswap 0 0 1 r
file_readahead 72 0 2097151 rw
io_32bit 0 0 3 rw
keepsettings 0 0 1 rw
max_kb_per_request 122 1 127 rw
multcount 0 0 8 rw
nice1 1 0 1 rw
nowerr 0 0 1 rw
pio_mode write-only 0 255 w
slow 0 0 1 rw
unmaskirq 0 0 1 rw
using_dma 0 0 1 rw
1.4 網(wǎng)絡(luò)信息 /proc/net
/proc/net 子目錄包含了系統(tǒng)中網(wǎng)絡(luò)相關(guān)的內(nèi)核統(tǒng)計(jì)信息和視圖,常規(guī)的文件列表如Table 1-7 中說(shuō)明; 如果你的內(nèi)核支持IPV6,那么還有一些IPV6相關(guān)信息在 Table 1-6中
..............................................................................
文件名 內(nèi)容
udp6 UDP sockets (IPv6)
tcp6 TCP sockets (IPv6)
raw6 Raw 設(shè)備狀態(tài) (IPv6)
igmp6 系統(tǒng)當(dāng)前加入的IP多播地址 (IPv6)
if_inet6 IPv6 網(wǎng)絡(luò)接口地址列表
ipv6_route IPv6 內(nèi)核路由表
rt6_stats IPv6 全局路由表狀態(tài)
sockstat6 Socket 狀態(tài) (IPv6)
snmp6 Snmp 數(shù)據(jù) (IPv6)
..............................................................................
..............................................................................
文件名 內(nèi)容
arp 內(nèi)核 ARP 表
atm atm設(shè)備接口信息
drivers 加載的驅(qū)動(dòng)模塊信息
dev 網(wǎng)絡(luò)設(shè)備以及狀態(tài)
dev_mcast 二層多播組以及監(jiān)聽(tīng)設(shè)備信息
(包含interface index, label, number of references, number of
bound addresses).
dev_stat 網(wǎng)絡(luò)設(shè)備狀態(tài)
ip_fwchains ipchains 防火墻規(guī)則鏈 (2.2)
ip_fwnames ipchains 防火墻規(guī)則鏈名 (2.2)
ip_masq 包含IP偽裝映射表的目錄 (2.2)
ip_masquerade 主IP偽裝映射表 (2.2)
netstat 網(wǎng)絡(luò)狀態(tài)
raw 原始設(shè)備狀態(tài)
route 內(nèi)核路由表
rpc 包含rpc信息的目錄
rt_cache 路由cache
snmp SNMP 數(shù)據(jù)
sockstat Socket 狀態(tài)
tcp TCP sockets
tr_rif Token ring RIF 令牌環(huán)網(wǎng)路由表
udp UDP sockets
unix UNIX domain sockets
wireless Wireless 接口數(shù)據(jù) (Wavelan etc)
igmp 主機(jī)當(dāng)前加入的IP多播組地址
psched 全局?jǐn)?shù)據(jù)包調(diào)度參數(shù)
netlink PF_NETLINK sockets 列表
ip_mr_vifs 多播虛擬地址列表
ip_mr_cache 多播路由cache列表
..............................................................................
由于2.4之后的內(nèi)核引入了netfilter/iptables防火墻,因此在防火墻部分的信息與2.2略有不同:
..............................................................................
文件名 內(nèi)容
ip_tables_matches iptables支持的過(guò)濾模式
ip_tables_names iptables規(guī)則表名字
ip_tables_targets iptables規(guī)則鏈目標(biāo)
ip_conntrack iptables狀態(tài)檢測(cè)跟蹤表
..............................................................................
您可以使用這些信息來(lái)查看當(dāng)前系統(tǒng)中可用的網(wǎng)絡(luò)設(shè)備,以及這些設(shè)備上通過(guò)的流量和路由信息:
> cat /proc/net/dev
Inter-|Receive |[...
face |bytes packets errs drop fifo frame compressed multicast|[...
lo: 908188 5596 0 0 0 0 0 0 [...
ppp0:15475140 20721 410 0 0 410 0 0 [...
eth0: 614530 7085 0 0 0 0 0 1 [...
...] Transmit
...] bytes packets errs drop fifo colls carrier compressed
...] 908188 5596 0 0 0 0 0 0
...] 1375103 17405 0 0 0 0 0 0
...] 1703981 5535 0 0 0 3 0 0
如果系統(tǒng)中使用了Ethernet Channel特性,使若干個(gè)物理接口綁定為一個(gè)邏輯設(shè)備的話,這個(gè)邏輯設(shè)備將會(huì)擁有一個(gè)以設(shè)備名命名的子目錄,其中包含一些bond模塊相關(guān)的特殊信息。例如把eth0和eth1綁定為設(shè)備 bond0 ,那么可以在 /proc/net/bond0/目錄下看到bond的特殊信息,例如主從接口、鏈路狀態(tài)等等。
1.5 SCSI 設(shè)備信息
如果你的系統(tǒng)中含有任何SCSI設(shè)備,那么在 /proc/scsi 目錄下可以看到系統(tǒng)識(shí)別到的SCSI設(shè)備相關(guān)信息:
>cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: IBM Model: DGHS09U Rev: 03E0
Type: Direct-Access ANSI SCSI revision: 03
Host: scsi0 Channel: 00 Id: 06 Lun: 00
Vendor: PIONEER Model: CD-ROM DR-U06S Rev: 1.04
Type: CD-ROM ANSI SCSI revision: 02
系統(tǒng)中的SCSI設(shè)備將映射到/proc/scsi目錄下形成一個(gè)子樹(shù),按照對(duì)應(yīng)的設(shè)備模塊和設(shè)備總線號(hào)可以查看相應(yīng)設(shè)備的參數(shù)信息,例如一個(gè)Adaptec AHA-2940 SCSI 適配器:
> cat /proc/scsi/aic7xxx/0
Adaptec AIC7xxx driver version: 5.1.19/3.2.4
Compile Options:
TCQ Enabled By Default : Disabled
AIC7XXX_PROC_STATS : Disabled
AIC7XXX_RESET_DELAY : 5
Adapter Configuration:
SCSI Adapter: Adaptec AHA-294X Ultra SCSI host adapter
Ultra Wide Controller
PCI MMAPed I/O Base: 0xeb001000
Adapter SEEPROM Config: SEEPROM found and used.
Adaptec SCSI BIOS: Enabled
IRQ: 10
SCBs: Active 0, Max Active 2,
Allocated 15, HW 16, Page 255
Interrupts: 160328
BIOS Control Word: 0x18b6
Adapter Control Word: 0x005b
Extended Translation: Enabled
Disconnect Enable Flags: 0xffff
Ultra Enable Flags: 0x0001
Tag Queue Enable Flags: 0x0000
Ordered Queue Tag Flags: 0x0000
Default Tag Queue Depth: 8
Tagged Queue By Device array for aic7xxx host instance 0:
{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}
Actual queue depth per device for aic7xxx host instance 0:
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
Statistics:
(scsi0:0:0:0)
Device using Wide/Sync transfers at 40.0 MByte/sec, offset 8
Transinfo settings: current(12/8/1/0), goal(12/8/1/0), user(12/15/1/0)
Total transfers 160151 (74577 reads and 85574 writes)
(scsi0:0:6:0)
Device using Narrow/Sync transfers at 5.0 MByte/sec, offset 15
Transinfo settings: current(50/15/0/0), goal(50/15/0/0), user(50/15/0/0)
Total transfers 0 (0 reads and 0 writes)
1.6 并口信息 /proc/parport
/proc/parport 包含系統(tǒng)并口信息,按照并口端口號(hào)(0,1,2,...)每個(gè)設(shè)備將映射到一個(gè)子目錄中。在這個(gè)目錄下包含的信息如 Table 1-8.
..............................................................................
文件名 內(nèi)容
autoprobe IEEE-1284 標(biāo)準(zhǔn)兼容的設(shè)備ID信息
devices 端口使用的設(shè)備驅(qū)動(dòng)列表
hardware 端口使用的base address, IRQ line 和 DMA channel.
irq 端口使用的IRQ號(hào),你可以寫入一個(gè)新值指定IRQ號(hào) (IRQ number or none).
..............................................................................
1.7 TTY信息 /proc/tty
-------------------------
在/proc/tty目錄中包含了系統(tǒng)中當(dāng)前在用的tty及其信息,在這個(gè)目錄中也可以找到設(shè)備
信息和線路disciplines,如 Table 1-9.
Table 1-9: /proc/tty 中的文件
..............................................................................
文件名 內(nèi)容
drivers 設(shè)備及引用計(jì)數(shù)
ldiscs registered line disciplines
driver/serial tty線路狀態(tài)
..............................................................................
要查看系統(tǒng)中的當(dāng)前在用ttys,可以簡(jiǎn)單的查看 /proc/tty/drivers:
> cat /proc/tty/drivers
pty_slave /dev/pts 136 0-255 pty:slave
pty_master /dev/ptm 128 0-255 pty:master
pty_slave /dev/ttyp 3 0-255 pty:slave
pty_master /dev/pty 2 0-255 pty:master
serial /dev/cua 5 64-67 serial:callout
serial /dev/ttyS 4 64-67 serial
/dev/tty0 /dev/tty0 4 0 system:vtmaster
/dev/ptmx /dev/ptmx 5 2 system
/dev/console /dev/console 5 1 system:console
/dev/tty /dev/tty 5 0 system:/dev/tty
unknown /dev/tty 4 1-63 console
本章介紹了 /proc 文件系統(tǒng)提供的系統(tǒng)運(yùn)行時(shí)信息. 在 /proc 文件系統(tǒng)中,您不僅可以簡(jiǎn)單直接的訪問(wèn)進(jìn)程相關(guān)信息,也可以通過(guò)它查看各個(gè)方面的系統(tǒng)內(nèi)核狀態(tài)。
在 /proc 文件系統(tǒng)中,大部分信息都以常規(guī)或文本文件的形式反映出來(lái),您可以任意使用簡(jiǎn)單的文件處理命令來(lái)查看它(只要權(quán)限允許);如果某些文件不能被查看或者產(chǎn)生亂碼,那么它可能是一些特殊類型的文件,需要其它手段來(lái)處理,例如 /proc/kcore 可以通過(guò)gdb等內(nèi)核調(diào)試工具來(lái)查看,而其他一些數(shù)據(jù)則可以被ps、top等工具所理解。
在這一章中,我們對(duì)procfs的結(jié)構(gòu)進(jìn)行了一下縱覽,對(duì)它的作用也該有一些了解了。在procfs中除了得到大量系統(tǒng)內(nèi)核信息之外,它最重要的一個(gè)作用莫過(guò)于對(duì)進(jìn)程的監(jiān)控和分析了。有了procfs,你也可以寫出自己的ps/top來(lái),甚至不用任何編程工具......
比如,很多Linux新手都常常遇到的一個(gè)問(wèn)題,就是夾在了一個(gè)文件系統(tǒng)之后不能卸載,系統(tǒng)報(bào)告這樣的錯(cuò)誤:
代碼:
# umount /db1
umount: /db1: device is busy
經(jīng)驗(yàn)老到的管理員們都知道,這個(gè)問(wèn)題是由于某些進(jìn)程的工作目錄還在這個(gè)目錄下,導(dǎo)致系統(tǒng)卷忙而無(wú)法卸載,只要?dú)⒌裟莻€(gè)進(jìn)程,文件系統(tǒng)就可以正常卸載了。但究竟是哪個(gè)進(jìn)程還在那里呢?找起來(lái)恐怕也要費(fèi)半天神。雖然有pfile和lsof之類的工具可用,但總 也有應(yīng)急的時(shí)候吧,這棵小腳本就可以為你解憂。
代碼:
#!/bin/bash
#pcwd.sh,查找系統(tǒng)中工作在目標(biāo)路徑下的進(jìn)程,使用方法: pcwd.sh 路徑名
test $1 || { echo "Usage: pcwd.sh path(absolute path)" && exit };
PS=`ls /proc/*[0-9]*|grep :` ;
PSList=`echo $PS |tr -d '/proc'|tr -d ':'`;
for PID in $PSList
do
test -e /proc/$PID && (ls -alF /proc/$PID/cwd|grep $1 >/dev/null ) && echo "Process $PID (`cat /proc/$PID/status |grep Name |tr -d 'Name: '`) is work in $1 ";
done
就是這樣短短的幾行代碼,甚至不用任何的臨時(shí)文件,我們就獲取了執(zhí)行命令前的當(dāng)前系統(tǒng)進(jìn)程表映像,然后遍歷每個(gè)進(jìn)程的proc目錄,找到占用我們目錄的"壞進(jìn)程"。
在我的系統(tǒng)上的輸出:
代碼:
[elly@frost.llnl]/tmp# ./pcwd.sh
Usage: pcwd.sh path(absolute path)
[elly@frost.llnl]/tmp# ./pcwd.sh /usr
Process 1283 (vi) is work in /usr ;
Process 3113 (bsh) is work in /usr ;
在上面的例子中,我們只用了最簡(jiǎn)單的四五個(gè)文件和文本處理命令,就完成了這個(gè)小程序,你甚至可以把所有的語(yǔ)句寫在一行上,通過(guò)命令行或alias定義就完成這個(gè)功能。
把它稍稍修改一下就是另外一個(gè)功能,查找正在使用某個(gè)文件的進(jìn)程:
代碼:
#!/bin/bash
test $1 || { echo "Usage: pfile.sh filename(absolute path)" && exit };
PS=`ls /proc/*[0-9]*|grep :` ;
PSList=`echo $PS |tr -d '/proc'|tr -d ':'`;
for PID in $PSList
do
test -e /proc/$PID && (ls -alF /proc/$PID/fd|grep $1 >/dev/null ) && echo "Process $PID (`cat /proc/$PID/status |grep Name |tr -d 'Name: '`) is openning $1;";
done
在我系統(tǒng)上的輸出:
代碼:
[elly@frost.llnl]/tmp# ./pfile.sh
Usage: pfile.sh filename(absolute path)
[elly@frost.llnl]/tmp# ./pfile.sh access_log
Process 109 (httpd) is openning access_log;
Process 110 (httpd) is openning access_log;
Process 112 (httpd) is openning access_log;
Process 113 (httpd) is openning access_log;
Process 116 (httpd) is openning access_log;
Process 99 (httpd) is openning access_log;
目標(biāo)文件名可以使用相對(duì)或絕對(duì)路徑,甚至可以只輸入半個(gè)文件名...當(dāng)然路徑越精確查找的結(jié)果也越準(zhǔn)確。在這個(gè)例子中,很容易就可以擴(kuò)展它的功能,讓它實(shí)現(xiàn)類似lsof的功能,可以列舉系統(tǒng)中所有正在被使用的文件。好啦,我們做一個(gè)有用點(diǎn)的程序。
ps,每臺(tái)機(jī)器上都有吧。不幸的是,在某些極端環(huán)境下,系統(tǒng)中的PS是不可靠的,比如,壞了...或被人替換了。
很多惡意的黑客入侵系統(tǒng)之后會(huì)在系統(tǒng)上安裝一類叫rootkit的后門包,用來(lái)替換系統(tǒng)中ps、netstat等重要程序以隱藏自己的痕跡,這個(gè)時(shí)候一般比較穩(wěn)妥的辦法是自己上傳一份可靠的系統(tǒng)工具包,或者靜態(tài)編譯的工具包。當(dāng)然,也可以用這個(gè)土辦法,直 接從procfs里讀取信息。(如果是比較高明的黑客,使用LKM等內(nèi)核后門那這個(gè)就沒(méi)有用了哦)
范例:懶人的ps,就叫它lps吧。
代碼:
#!/bin/bash
PS=`ls /proc/*[0-9]*|grep :` ;
PSList=`echo $PS |tr -d '/proc' |tr -d ':' |sort `;
echo -e "PID PPID UID GID STAT MEM TTY CMD"
for PID in $PSList
do
test -e /proc/$PID && sPID=`cat /proc/$PID/status |grep ^Pid: |awk '{print $2}'`
&& sPPID=`cat /proc/$PID/status |grep ^PPid: |awk '{print $2}'`
&& sTTY=`ls -alF /proc/$PID/fd |grep /dev/ |awk '{print $11}' |grep ty |head -n 1`
&& sUID=`cat /proc/$PID/status |grep ^Uid: |awk '{print $2}'`
&& sGID=`cat /proc/$PID/status |grep ^Gid: |awk '{print $2}'`
&& sSTAT=`cat /proc/$PID/status |grep ^State: |awk '{print $2 $3}'`
&& sMEM=`cat /proc/$PID/status |grep ^VmSize: |awk '{print $2 $3}'`
&& if [ -e /proc/$PID/exe ]
then
sCMD=`ls -alF /proc/$PID/exe |awk '{print $11}' |tr -d '$*' `
else
sCMD=`cat /proc/$PID/status |grep ^Name: |awk '{print $2}'`
sCMD="[ $sCMD ]"
fi
echo -e "$sPID $sPPID $sUID $sGID $sSTAT $sMEM $sTTY $sCMD"
done
簡(jiǎn)要介紹,這個(gè)lps或列舉系統(tǒng)中自身進(jìn)程(lps)之外的所有進(jìn)程,然后讀取和顯示他們的八項(xiàng)屬性,依次是:進(jìn)程ID(PID) 父進(jìn)程ID(PPID) 屬主UID(UID) 屬主GID(GID) 當(dāng)前狀態(tài) 占用內(nèi)存 運(yùn)行終端 完全執(zhí)行路徑。
在顯示格式參考了Linux標(biāo)準(zhǔn)ps輸出的一部分,例如某些系統(tǒng)線程沒(méi)有可執(zhí)行文件的,就會(huì)顯示他們的內(nèi)核名字,例如[ ksoftirqd_CPU0 ] 。
懶人的PS中沒(méi)有任何參數(shù),你也可以擴(kuò)展它的功能,使之能支持按照進(jìn)程樹(shù)狀顯示等等。
在我系統(tǒng)上的輸出:
代碼:
[elly@frost.llnl]/tmp# ./lps.sh
PID PPID UID GID STAT MEM TTY CMD
1 0 0 0 S(sleeping) 1116kB /sbin/init
101 1 0 0 S(sleeping) 2168kB /usr/local/sbin/sshd
109 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
110 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
112 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
113 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
116 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
118 1 0 0 S(sleeping) 1656kB /bin/bash
119 1 0 0 S(sleeping) 1648kB /bin/bash
120 1 0 0 S(sleeping) 1648kB /bin/bash
128 1 0 0 S(sleeping) 2224kB /dev/tty1 /bin/login
1283 3113 0 0 S(sleeping) 1512kB /dev/ttyp0 /bin/vi
129 1 0 0 S(sleeping) 1136kB /dev/tty2 /sbin/getty
130 1 0 0 S(sleeping) 1136kB /dev/tty3 /sbin/getty
131 1 0 0 S(sleeping) 1136kB /dev/tty4 /sbin/getty
135 1 0 0 S(sleeping) 1136kB /dev/tty5 /sbin/getty
136 1 0 0 S(sleeping) 1136kB /dev/tty6 /sbin/getty
137 1 0 0 S(sleeping) 1140kB /dev/ttyS0 /sbin/getty
15329 3112 0 0 S(sleeping) 1792kB /dev/ttyp1 /bin/bash
2 1 0 0 S(sleeping) [ keventd ]
256 128 0 0 S(sleeping) 1712kB /dev/tty1 /bin/bash
3 1 0 0 S(sleeping) [ ksoftirqd_CPU0 ]
3112 101 0 0 S(sleeping) 2452kB /dev/ptyp1 /usr/local/sbin/sshd
3113 3112 0 0 S(sleeping) 1728kB /dev/ttyp0 /bin/bash
3872 120 0 0 S(sleeping) 1084kB /bin/sleep
4 1 0 0 S(sleeping) [ kswapd ]
4 1 0 0 S(sleeping) [ kswapd ]
4 1 0 0 S(sleeping) [ kswapd ]
4089 15329 0 0 S(sleeping) 1664kB /dev/ttyp1 /bin/bash
4089 15329 0 0 S(sleeping) 1664kB /dev/ttyp1 /bin/bash
5 1 0 0 S(sleeping) [ bdflush ]
6 1 0 0 S(sleeping) [ kupdated ]
99 1 0 0 S(sleeping) 6016kB /usr/local/apache/bin/httpd
Solaris上有/usr/proc/bin工具集,里面的ptree和pmap很是好用,甚至比本來(lái)的ps還好:P可惜Linux上是沒(méi)有的,現(xiàn)在你可以自己寫一個(gè),用來(lái)綜合顯示更多的進(jìn)程狀態(tài)。
代碼:
#!/bin/bash
#PROC=`mount |grep 'type proc'|awk '{print $3}'`
test $1 || { echo "Usage: pstat.sh PID" && exit };
PID=$1;
echo "Process $1 Status...";
echo "......................";
echo
cat /proc/$PID/status|grep ^Name:
cat /proc/$PID/status|grep ^Pid:
cat /proc/$PID/status|grep ^PPid:
cat /proc/$PID/status|grep ^Uid:
cat /proc/$PID/status|grep ^Gid:
cat /proc/$PID/status|grep ^State:
cat /proc/$PID/status|grep ^VmSize:
echo
CMD=`ls -alF /proc/$PID/exe |awk '{print $11}' |tr -d '$*'`;echo "Command path: $CMD";
ARG=`cat /proc/$PID/cmdline`;echo "Command line: $ARG";
CWD=`ls -alF /proc/$PID/cwd |awk '{print $11}'`;echo "CWD: $CWD";
echo
ENVI=`cat /proc/$PID/environ`;echo "ENVIRON: $ENVI";
echo
echo
echo "Process shared object:";
echo "......................";
cat /proc/$PID/maps |grep $CMD |grep xp;
cat /proc/$PID/maps |grep .so |grep xp;
echo
echo
echo "Process used file:";
echo "......................";
ls -alF /proc/$PID/fd |grep '->' |awk '{print $11}' |sort |uniq -c |sort -rn ;
echo
這個(gè)程序叫pstat.sh,可以顯示進(jìn)程的綜合信息。輸出分為四段,分別是進(jìn)程狀態(tài)(包含父子進(jìn)程關(guān)系、進(jìn)程信任狀以及內(nèi)存占用),執(zhí)行環(huán)境(包含進(jìn)程執(zhí)行程序,命令行參數(shù)和環(huán)境變量),進(jìn)程執(zhí)行對(duì)象(包含進(jìn)程執(zhí)行體和引用的共享庫(kù)),最后是進(jìn)程打開(kāi)的 所有文件。
代碼:
[elly@frost.llnl]/tmp# ./pstat.sh
Usage: pstat.sh PID
[elly@frost.llnl]/tmp# ./pstat.sh 7238
Process 7238 Status...
......................
Name: vi
Pid: 7238
PPid: 3113
Uid: 0 0 0 0
Gid: 0 0 0 0
State: S (sleeping)
VmSize: 1648 kB
Command path: /bin/vi
Command line: vi
CWD: /usr/
ENVIRON: USERNAME=root
Process shared object:
......................
08048000-08098000 r-xp 00000000 03:01 3891 /bin/vi
40000000-40013000 r-xp 00000000 03:01 3942 /lib/ld-2.1.3.so
40016000-40019000 r-xp 00000000 03:01 4002 /lib/libtermcap.so.2.0.8
4001a000-40107000 r-xp 00000000 03:01 3949 /lib/libc-2.1.3.so
4010f000-40117000 r-xp 00000000 03:01 3981 /lib/libnss_files-2.1.3.so
Process used file:
......................
/dev/ttyp0
/etc/motd