- 內容摘要:Linux系統上的/proc目錄是一種文件系統,即proc文件系統。
Linux系統上的/proc目錄是一種文件系統,即proc文件系統。與其它常見的文件系統不一樣的是,/proc是一種僞文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶能夠經過這些文件查看有關係統硬件及當前正在運行進程的信息,甚至能夠經過更改其中某些文件來改變內核的運行狀態。
基於/proc文件系統如上所述的特殊性,其內的文件也常被稱做虛擬文件,並具備一些獨特的特色。例如,其中有些文件雖然使用查看命令查看時會返回大量信息,但文件自己的大小卻會顯示爲0字節。此外,這些特殊文件中大多數文件的時間及日期屬性一般爲當前系統時間和日期,這跟它們隨時會被刷新(存儲於RAM中)有關。
爲了查看及使用上的方便,這些文件一般會按照相關性進行分類存儲於不一樣的目錄甚至子目錄中,如/proc/scsi目錄中存儲的就是當前系統上全部SCSI設備的相關信息,/proc/N中存儲的則是系統當前正在運行的進程的相關信息,其中N爲正在運行的進程(能夠想象獲得,在某進程結束後其相關目錄則會消失)。
大多數虛擬文件可使用文件查看命令如cat、more或者less進行查看,有些文件信息表述的內容能夠一目瞭然,但也有文件的信息卻不怎麼具備可讀性。不過,這些可讀性較差的文件在使用一些命令如apm、free、lspci或top查看時卻能夠有着不錯的表現。
1、 進程目錄中的常見文件介紹
/proc目錄中包含許多以數字命名的子目錄,這些數字表示系統當前正在運行進程的進程號,裏面包含對應進程相關的多個信息文件。
[root@rhel5 ~]# ll /proc total 0 dr-xr-xr-x 5 root root 0 Feb 8 17:08 1 dr-xr-xr-x 5 root root 0 Feb 8 17:08 10 dr-xr-xr-x 5 root root 0 Feb 8 17:08 11 dr-xr-xr-x 5 root root 0 Feb 8 17:08 1156 dr-xr-xr-x 5 root root 0 Feb 8 17:08 139 dr-xr-xr-x 5 root root 0 Feb 8 17:08 140 dr-xr-xr-x 5 root root 0 Feb 8 17:08 141 dr-xr-xr-x 5 root root 0 Feb 8 17:09 1417 dr-xr-xr-x 5 root root 0 Feb 8 17:09 1418
|
上面列出的是/proc目錄中一些進程相關的目錄,每一個目錄中是當程自己相關信息的文件。下面是做者系統(RHEL5.3)上運行的一個PID爲2674的進程saslauthd的相關文件,其中有些文件是每一個進程都會具備的,後文會對這些常見文件作出說明。
[root@rhel5 ~]# ll /proc/2674 total 0 dr-xr-xr-x 2 root root 0 Feb 8 17:15 attr -r-------- 1 root root 0 Feb 8 17:14 auxv -r--r--r-- 1 root root 0 Feb 8 17:09 cmdline -rw-r--r-- 1 root root 0 Feb 8 17:14 coredump_filter -r--r--r-- 1 root root 0 Feb 8 17:14 cpuset lrwxrwxrwx 1 root root 0 Feb 8 17:14 cwd -> /var/run/saslauthd -r-------- 1 root root 0 Feb 8 17:14 environ lrwxrwxrwx 1 root root 0 Feb 8 17:09 exe -> /usr/sbin/saslauthd dr-x------ 2 root root 0 Feb 8 17:15 fd -r-------- 1 root root 0 Feb 8 17:14 limits -rw-r--r-- 1 root root 0 Feb 8 17:14 loginuid -r--r--r-- 1 root root 0 Feb 8 17:14 maps -rw------- 1 root root 0 Feb 8 17:14 mem -r--r--r-- 1 root root 0 Feb 8 17:14 mounts -r-------- 1 root root 0 Feb 8 17:14 mountstats -rw-r--r-- 1 root root 0 Feb 8 17:14 oom_adj -r--r--r-- 1 root root 0 Feb 8 17:14 oom_score lrwxrwxrwx 1 root root 0 Feb 8 17:14 root -> / -r--r--r-- 1 root root 0 Feb 8 17:14 schedstat -r-------- 1 root root 0 Feb 8 17:14 smaps -r--r--r-- 1 root root 0 Feb 8 17:09 stat -r--r--r-- 1 root root 0 Feb 8 17:14 statm -r--r--r-- 1 root root 0 Feb 8 17:10 status dr-xr-xr-x 3 root root 0 Feb 8 17:15 task -r--r--r-- 1 root root 0 Feb 8 17:14 wchan
|
1.一、cmdline — 啓動當前進程的完整命令,但殭屍進程目錄中的此文件不包含任何信息;
[root@rhel5 ~]# more /proc/2674/cmdline /usr/sbin/saslauthd
|
1.二、cwd — 指向當前進程運行目錄的一個符號連接;
1.三、environ — 當前進程的環境變量列表,彼此間用空字符(NULL)隔開;變量用大寫字母表示,其值用小寫字母表示;
[root@rhel5 ~]# more /proc/2674/environ TERM=linuxauthd
|
1.四、exe — 指向啓動當前進程的可執行文件(完整路徑)的符號連接,經過/proc/N/exe能夠啓動當前進程的一個拷貝;
1.五、fd — 這是個目錄,包含當前進程打開的每個文件的文件描述符(file descriptor),這些文件描述符是指向實際文件的一個符號連接;
[root@rhel5 ~]# ll /proc/2674/fd total 0 lrwx------ 1 root root 64 Feb 8 17:17 0 -> /dev/null lrwx------ 1 root root 64 Feb 8 17:17 1 -> /dev/null lrwx------ 1 root root 64 Feb 8 17:17 2 -> /dev/null lrwx------ 1 root root 64 Feb 8 17:17 3 -> socket:[7990] lrwx------ 1 root root 64 Feb 8 17:17 4 -> /var/run/saslauthd/saslauthd.pid lrwx------ 1 root root 64 Feb 8 17:17 5 -> socket:[7991] lrwx------ 1 root root 64 Feb 8 17:17 6 -> /var/run/saslauthd/mux.accept
|
1.六、limits — 當前進程所使用的每個受限資源的軟限制、硬限制和管理單元;此文件僅可由實際啓動當前進程的UID用戶讀取;(2.6.24之後的內核版本支持此功能);
1.七、maps — 當前進程關聯到的每一個可執行文件和庫文件在內存中的映射區域及其訪問權限所組成的列表;
[root@rhel5 ~]# cat /proc/2674/maps 00110000-00239000 r-xp 00000000 08:02 130647 /lib/libcrypto.so.0.9.8e 00239000-0024c000 rwxp 00129000 08:02 130647 /lib/libcrypto.so.0.9.8e 0024c000-00250000 rwxp 0024c000 00:00 0 00250000-00252000 r-xp 00000000 08:02 130462 /lib/libdl-2.5.so 00252000-00253000 r-xp 00001000 08:02 130462 /lib/libdl-2.5.so
|
1.八、mem — 當前進程所佔用的內存空間,由open、read和lseek等系統調用使用,不能被用戶讀取;
1.九、root — 指向當前進程運行根目錄的符號連接;在Unix和Linux系統上,一般採用chroot命令使每一個進程運行於獨立的根目錄;
1.十、stat — 當前進程的狀態信息,包含一系統格式化後的數據列,可讀性差,一般由ps命令使用;
1.十一、statm — 當前進程佔用內存的狀態信息,一般以「頁面」(page)表示;
1.十二、status — 與stat所提供信息相似,但可讀性較好,以下所示,每行表示一個屬性信息;其詳細介紹請參見 proc的man手冊頁;
[root@rhel5 ~]# more /proc/2674/status Name: saslauthd State: S (sleeping) SleepAVG: 0% Tgid: 2674 Pid: 2674 PPid: 1 TracerPid: 0 Uid: 0 0 0 0 Gid: 0 0 0 0 FDSize: 32 Groups: VmPeak: 5576 kB VmSize: 5572 kB VmLck: 0 kB VmHWM: 696 kB VmRSS: 696 kB …………
|
1.1三、task — 目錄文件,包含由當前進程所運行的每個線程的相關信息,每一個線程的相關信息文件均保存在一個由線程號(tid)命名的目錄中,這相似於其內容相似於每一個進程目錄中的內容;(內核2.6版本之後支持此功能)
2、/proc目錄下常見的文件介紹
2.一、/proc/apm
高級電源管理(APM)版本信息及電池相關狀態信息,一般由apm命令使用;
2.二、/proc/buddyinfo
用於診斷內存碎片問題的相關信息文件;
2.三、/proc/cmdline
在啓動時傳遞至內核的相關參數信息,這些信息一般由lilo或grub等啓動管理工具進行傳遞;
[root@rhel5 ~]# more /proc/cmdline ro root=/dev/VolGroup00/LogVol00 rhgb quiet
|
2.四、/proc/cpuinfo
處理器的相關信息的文件;
2.五、/proc/crypto
系統上已安裝的內核使用的密碼算法及每一個算法的詳細信息列表;
[root@rhel5 ~]# more /proc/crypto name : crc32c driver : crc32c-generic module : kernel priority : 0 type : digest blocksize : 32 digestsize : 4 ………… |
2.六、/proc/devices
系統已經加載的全部塊設備和字符設備的信息,包含主設備號和設備組(與主設備號對應的設備類型)名;
[root@rhel5 ~]# more /proc/devices Character devices: 1 mem 4 /dev/vc/0 4 tty 4 ttyS ………… Block devices: 1 ramdisk 2 fd 8 sd ………… |
2.七、/proc/diskstats
每塊磁盤設備的磁盤I/O統計信息列表;(內核2.5.69之後的版本支持此功能)
2.八、/proc/dma
每一個正在使用且註冊的ISA DMA通道的信息列表;
[root@rhel5 ~]# more /proc/dma 2: floppy 4: cascade
|
2.九、/proc/execdomains
內核當前支持的執行域(每種操做系統獨特「個性」)信息列表;
[root@rhel5 ~]# more /proc/execdomains 0-0 Linux [kernel]
|
2.十、/proc/fb
幀緩衝設備列表文件,包含幀緩衝設備的設備號和相關驅動信息;
2.十一、/proc/filesystems
當前被內核支持的文件系統類型列表文件,被標示爲nodev的文件系統表示不須要塊設備的支持;一般mount一個設備時,若是沒有指定文件系統類型將經過此文件來決定其所需文件系統的類型;
[root@rhel5 ~]# more /proc/filesystems nodev sysfs nodev rootfs nodev proc iso9660 ext3 ………… …………
|
2.十二、/proc/interrupts
X86或X86_64體系架構系統上每一個IRQ相關的中斷號列表;多路處理器平臺上每一個CPU對於每一個I/O設備均有本身的中斷號;
[root@rhel5 ~]# more /proc/interrupts CPU0 0: 1305421 IO-APIC-edge timer 1: 61 IO-APIC-edge i8042 185: 1068 IO-APIC-level eth0 …………
|
2.1三、/proc/iomem
每一個物理設備上的記憶體(RAM或者ROM)在系統內存中的映射信息;
[root@rhel5 ~]# more /proc/iomem 00000000-0009f7ff : System RAM 0009f800-0009ffff : reserved 000a0000-000bffff : Video RAM area 000c0000-000c7fff : Video ROM …………
|
3.2.12. /proc/iomem
This file shows you the current map of the system's memory for each physical device: html
00000000-0009fbff : System RAM
0009fc00-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
000f0000-000fffff : System ROM
00100000-07ffffff : System RAM
00100000-00291ba8 : Kernel code
00291ba9-002e09cb : Kernel data
e0000000-e3ffffff : VIA Technologies, Inc. VT82C597 [Apollo VP3] e4000000-e7ffffff : PCI Bus #01
e4000000-e4003fff : Matrox Graphics, Inc. MGA G200 AGP
e5000000-e57fffff : Matrox Graphics, Inc. MGA G200 AGP
e8000000-e8ffffff : PCI Bus #01
e8000000-e8ffffff : Matrox Graphics, Inc. MGA G200 AGP
ea000000-ea00007f : Digital Equipment Corporation DECchip 21140 [FasterNet]
ea000000-ea00007f : tulip ffff0000-ffffffff : reserved
The first column displays the memory registers used by each of the different types of memory. The second column lists the kind of memory located within those registers and displays which memory registers are used by the kernel within the system RAM or, if the network interface card has multiple Ethernet ports, the memory registers assigned for each port.node
/opt/qtmarvell/mvqt # cat /proc/iomem
00000000-0fffffff : System RAM
0002b000-00554fff : Kernel text
00556000-005a22f3 : Kernel data
10000000-1fffffff : System RAM
e0000000-e7ffffff : PEX0 Memory
e0000000-e0003fff : 0000:00:01.0
e0004000-e0004fff : 0000:00:01.0
e8000000-efffffff : PEX1 Memory
f1012100-f10121ff : serial8250.0
f1012100-f101211f : serial
f1090000-f10903ff : mvsdio
f1090000-f10903ff : mvsdio
f10a0000-f10a3fff : mv88fx_snd.0
f10a0000-f10a3fff : mv88fx_snd
f10c0000-f10d0000 : dovefb.0 寄存器地址映射到這個
f10c0000-f10d0000 : dovefb_ovly.0linux
/opt/qtmarvell/mvqt # ./framebuffer
The framebuffer device was opened successfully. git
Fixed screen info:
id: GFX Layer 0
smem_start: 0x12000000
smem_len: 33554432
type: 0
type_aux: 0
visual: 2
xpanstep: 1
ypanstep: 1
ywrapstep: 0
line_length: 2560
mmio_start: 0xf10c0000
mmio_len: 65537程序員
2.1四、/proc/ioports
當前正在使用且已經註冊過的與物理設備進行通信的輸入-輸出端口範圍信息列表;以下面所示,第一列表示註冊的I/O端口範圍,其後表示相關的設備;
[root@rhel5 ~]# less /proc/ioports 0000-001f : dma1 0020-0021 : pic1 0040-0043 : timer0 0050-0053 : timer1 0060-006f : keyboard …………
|
2.1五、/proc/kallsyms
模塊管理工具用來動態連接或綁定可裝載模塊的符號定義,由內核輸出;(內核2.5.71之後的版本支持此功能);一般這個文件中的信息量至關大;
[root@rhel5 ~]# more /proc/kallsyms c04011f0 T _stext c04011f0 t run_init_process c04011f0 T stext …………
|
2.1六、/proc/kcore
系統使用的物理內存,以ELF核心文件(core file)格式存儲,其文件大小爲已使用的物理內存(RAM)加上4KB;這個文件用來檢查內核數據結構的當前狀態,所以,一般由GBD一般調試工具使用,但不能使用文件查看命令打開此文件;
2.1七、/proc/kmsg
此文件用來保存由內核輸出的信息,一般由/sbin/klogd或/bin/dmsg等程序使用,不要試圖使用查看命令打開此文件;
2.1八、/proc/loadavg
保存關於CPU和磁盤I/O的負載平均值,其前三列分別表示每1秒鐘、每5秒鐘及每15秒的負載平均值,相似於uptime命令輸出的相關信息;第四列是由斜線隔開的兩個數值,前者表示當前正由內核調度的實體(進程和線程)的數目,後者表示系統當前存活的內核調度實體的數目;第五列表示此文件被查看前最近一個由內核建立的進程的PID;
[root@rhel5 ~]# more /proc/loadavg 0.45 0.12 0.04 4/125 5549 [root@rhel5 ~]# uptime 06:00:54 up 1:06, 3 users, load average: 0.45, 0.12, 0.04
|
2.1九、/proc/locks
保存當前由內核鎖定的文件的相關信息,包含內核內部的調試數據;每一個鎖定佔據一行,且具備一個唯一的編號;以下輸出信息中每行的第二列表示當前鎖定使用的鎖定類別,POSIX表示目前較新類型的文件鎖,由lockf系統調用產生,FLOCK是傳統的UNIX文件鎖,由flock系統調用產生;第三列也一般由兩種類型,ADVISORY表示不容許其餘用戶鎖定此文件,但容許讀取,MANDATORY表示此文件鎖按期間不容許其餘用戶任何形式的訪問;
[root@rhel5 ~]# more /proc/locks 1: POSIX ADVISORY WRITE 4904 fd:00:4325393 0 EOF 2: POSIX ADVISORY WRITE 4550 fd:00:2066539 0 EOF 3: FLOCK ADVISORY WRITE 4497 fd:00:2066533 0 EOF
|
2.20、/proc/mdstat
保存RAID相關的多塊磁盤的當前狀態信息,在沒有使用RAID機器上,其顯示爲以下狀態:
[root@rhel5 ~]# less /proc/mdstat Personalities : unused devices: <none>
|
2.2一、/proc/meminfo
系統中關於當前內存的利用情況等的信息,常由free命令使用;可使用文件查看命令直接讀取此文件,其內容顯示爲兩列,前者爲統計屬性,後者爲對應的值;
[root@rhel5 ~]# less /proc/meminfo MemTotal: 515492 kB MemFree: 8452 kB Buffers: 19724 kB Cached: 376400 kB SwapCached: 4 kB ………… |
2.2二、/proc/mounts
在內核2.4.29版本之前,此文件的內容爲系統當前掛載的全部文件系統,在2.4.19之後的內核中引進了每一個進程使用獨立掛載名稱空間的方式,此文件則隨之變成了指向/proc/self/mounts(每一個進程自身掛載名稱空間中的全部掛載點列表)文件的符號連接;/proc/self是一個獨特的目錄,後文中會對此目錄進行介紹;
[root@rhel5 ~]# ll /proc |grep mounts lrwxrwxrwx 1 root root 11 Feb 8 06:43 mounts -> self/mounts
|
以下所示,其中第一列表示掛載的設備,第二列表示在當前目錄樹中的掛載點,第三點表示當前文件系統的類型,第四列表示掛載屬性(ro或者rw),第五列和第六列用來匹配/etc/mtab文件中的轉儲(dump)屬性;
[root@rhel5 ~]# more /proc/mounts rootfs / rootfs rw 0 0 /dev/root / ext3 rw,data=ordered 0 0 /dev /dev tmpfs rw 0 0 /proc /proc proc rw 0 0 /sys /sys sysfs rw 0 0 /proc/bus/usb /proc/bus/usb usbfs rw 0 0 ………… |
2.2三、/proc/modules
當前裝入內核的全部模塊名稱列表,能夠由lsmod命令使用,也能夠直接查看;以下所示,其中第一列表示模塊名,第二列表示此模塊佔用內存空間大小,第三列表示此模塊有多少實例被裝入,第四列表示此模塊依賴於其它哪些模塊,第五列表示此模塊的裝載狀態(Live:已經裝入;Loading:正在裝入;Unloading:正在卸載),第六列表示此模塊在內核內存(kernel memory)中的偏移量;
[root@rhel5 ~]# more /proc/modules autofs4 24517 2 - Live 0xe09f7000 hidp 23105 2 - Live 0xe0a06000 rfcomm 42457 0 - Live 0xe0ab3000 l2cap 29505 10 hidp,rfcomm, Live 0xe0aaa000 ………… |
2.2四、/proc/partitions
塊設備每一個分區的主設備號(major)和次設備號(minor)等信息,同時包括每一個分區所包含的塊(block)數目(以下面輸出中第三列所示);
[root@rhel5 ~]# more /proc/partitions major minor #blocks name 8 0 20971520 sda 8 1 104391 sda1 8 2 6907950 sda2 8 3 5630782 sda3 8 4 1 sda4 8 5 3582463 sda5
|
2.2五、/proc/pci
內核初始化時發現的全部PCI設備及其配置信息列表,其配置信息多爲某PCI設備相關IRQ信息,可讀性不高,能夠用「/sbin/lspci –vb」命令得到較易理解的相關信息;在2.6內核之後,此文件已爲/proc/bus/pci目錄及其下的文件代替;
2.2六、/proc/slabinfo
在內核中頻繁使用的對象(如inode、dentry等)都有本身的cache,即slab pool,而/proc/slabinfo文件列出了這些對象相關slap的信息;詳情能夠參見內核文檔中slapinfo的手冊頁;
[root@rhel5 ~]# more /proc/slabinfo slabinfo - version: 2.1 # name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <ac tive_slabs> <num_slabs> <sharedavail> rpc_buffers 8 8 2048 2 1 : tunables 24 12 8 : slabdata 4 4 0 rpc_tasks 8 20 192 20 1 : tunables 120 60 8 : slabdata 1 1 0 rpc_inode_cache 6 9 448 9 1 : tunables 54 27 8 : slabdata 1 1 0 ………… ………… ………… |
2.2七、/proc/stat
實時追蹤自系統上次啓動以來的多種統計信息;以下所示,其中,
「cpu」行後的八個值分別表示以1/100(jiffies)秒爲單位的統計值(包括系統運行於用戶模式、低優先級用戶模式,運系統模式、空閒模式、I/O等待模式的時間等);
「intr」行給出中斷的信息,第一個爲自系統啓動以來,發生的全部的中斷的次數;而後每一個數對應一個特定的中斷自系統啓動以來所發生的次數;
「ctxt」給出了自系統啓動以來CPU發生的上下文交換的次數。
「btime」給出了從系統啓動到如今爲止的時間,單位爲秒;
「processes (total_forks) 自系統啓動以來所建立的任務的個數目;
「procs_running」:當前運行隊列的任務的數目;
「procs_blocked」:當前被阻塞的任務的數目;
[root@rhel5 ~]# more /proc/stat cpu 2751 26 5771 266413 2555 99 411 0 cpu0 2751 26 5771 266413 2555 99 411 0 intr 2810179 2780489 67 0 3 3 0 5 0 1 0 0 0 1707 0 0 9620 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12781 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ctxt 427300 btime 1234084100 processes 3491 procs_running 1 procs_blocked 0
|
2.2八、/proc/swaps
當前系統上的交換分區及其空間利用信息,若是有多個交換分區的話,則會每一個交換分區的信息分別存儲於/proc/swap目錄中的單獨文件中,而其優先級數字越低,被使用到的可能性越大;下面是做者系統中只有一個交換分區時的輸出信息;
[root@rhel5 ~]# more /proc/swaps Filename Type Size Used Priority /dev/sda8 partition 642560 0 -1
|
2.2九、/proc/uptime
系統上次啓動以來的運行時間,以下所示,其第一個數字表示系統運行時間,第二個數字表示系統空閒時間,單位是秒;
[root@rhel5 ~]# more /proc/uptime 3809.86 3714.13
|
2.30、/proc/version
當前系統運行的內核版本號,在做者的RHEL5.3上還會顯示系統安裝的gcc版本,以下所示;
[root@rhel5 ~]# more /proc/version Linux version 2.6.18-128.el5 (mockbuild@hs20-bc1-5.build.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)) #1 SMP Wed Dec 17 11:42:39 EST 2008
|
2.3一、/proc/vmstat
當前系統虛擬內存的多種統計數據,信息量可能會比較大,這因系統而有所不一樣,可讀性較好;下面爲做者機器上輸出信息的一個片斷;(2.6之後的內核支持此文件)
[root@rhel5 ~]# more /proc/vmstat nr_anon_pages 22270 nr_mapped 8542 nr_file_pages 47706 nr_slab 4720 nr_page_table_pages 897 nr_dirty 21 nr_writeback 0 …………
|
2.3二、/proc/zoneinfo
內存區域(zone)的詳細信息列表,信息量較大,下面列出的是一個輸出片斷:
[root@rhel5 ~]# more /proc/zoneinfo Node 0, zone DMA pages free 1208 min 28 low 35 high 42 active 439 inactive 1139 scanned 0 (a: 7 i: 30) spanned 4096 present 4096 nr_anon_pages 192 nr_mapped 141 nr_file_pages 1385 nr_slab 253 nr_page_table_pages 2 nr_dirty 523 nr_writeback 0 nr_unstable 0 nr_bounce 0 protection: (0, 0, 296, 296) pagesets all_unreclaimable: 0 prev_priority: 12 start_pfn: 0 ………… |
3、/proc/sys目錄詳解
與 /proc下其它文件的「只讀」屬性不一樣的是,管理員可對/proc/sys子目錄中的許多文件內容進行修改以更改內核的運行特性,事先可使用「ls -l」命令查看某文件是否「可寫入」。寫入操做一般使用相似於「echo DATA > /path/to/your/filename」的格式進行。須要注意的是,即便文件可寫,其通常也不可使用編輯器進行編輯。
3.一、/proc/sys/debug 子目錄
此目錄一般是一空目錄;
3.二、/proc/sys/dev 子目錄
爲系統上特殊設備提供參數信息文件的目錄,其不一樣設備的信息文件分別存儲於不一樣的子目錄中,如大多數系統上都會具備的/proc/sys/dev /cdrom和/proc/sys/dev/raid(若是內核編譯時開啓了支持raid的功能) 目錄,其內存儲的一般是系統上cdrom和raid的相關參數信息文件。
Linux內核通訊之---proc文件系統
使用 /proc 文件系統來訪問 Linux 內核的內容,這個虛擬文件系統
在內核空間和用戶空間之間打開了一個通訊窗口:
算法
/proc 文件系統是一個虛擬文件系統,經過它可使用一種新的方法在 Linux內核空間和用戶間之間進行通訊。在 /proc 文件系統中,咱們能夠將對虛擬文件的讀寫做爲與內核中實體進行通訊的一種手段,可是與普通文件不一樣的是,這些虛擬文件的內容都是動態建立的。本文對 /proc 虛擬文件系統進行了介紹,並展現了它的用法。centos
最初開發 /proc 文件系統是爲了提供有關係統中進程的信息。可是因爲這個文件系統很是有用,所以內核中的不少元素也開始使用它來報告信息,或啓用動態運行時配置。清單 1 是對 /proc 中部分元素進行一次交互查詢的結果。它顯示的是 /proc 文件系統的根目錄中的內容。注意,在左邊是一系列數字編號的文件。每一個實際上都是一個目錄,表示系統中的一個進程。因爲在 GNU/Linux 中建立的第一個進程是 init
進程,所以它的 process-id
爲 1。而後對這個目錄執行一個 ls
命令,這會顯示不少文件。每一個文件都提供了有關這個特殊進程的詳細信息。/proc 中另一些有趣的文件有:cpuinfo
,它標識了處理器的類型和速度;pci
,顯示在 PCI 總線上找到的設備;modules
,標識了當前加載到內核中的模塊。api
另外,咱們還可使用 sysctl
來配置這些內核條目。/proc 文件系統並非 GNU/Linux 系統中的唯一一個虛擬文件系統。在這種系統上,sysfs 是一個與 /proc 相似的文件系統,可是它的組織更好(從 /proc 中學習了不少教訓)。不過 /proc 已經確立了本身的地位,所以即便 sysfs 與 /proc 相比有一些優勢,/proc 也依然會存在。還有一個 debugfs 文件系統,不過(顧名思義)它提供的更可能是調試接口。debugfs 的一個優勢是它將一個值導出給用戶空間很是簡單(實際上這不過是一個調用而已)。緩存



這些文件的解釋和意義以下:數據結構
cmdline:系統啓動時輸入給內核命令行參數 cpuinfo:CPU的硬件信息 (型號, 家族, 緩存大小等) devices:主設備號及設備組的列表,當前加載的各類設備(塊設備/字符設備) dma:使用的DMA通道 filesystems:當前內核支持的文件系統,當沒有給 mount(1) 指明哪一個文件系統的時候, mount(1) 就依靠該文件遍歷不一樣的文件系統 interrupts :中斷的使用及觸發次數,調試中斷時頗有用 ioports I/O:當前在用的已註冊 I/O 端口範圍 kcore:該僞文件以 core 文件格式給出了系統的物理內存映象(比較有用),能夠用 GDB 查探當前內核的任意數據結構。該文件的總長度是物理內存 (RAM) 的大小再加上 4KB kmsg:能夠用該文件取代系統調用 syslog(2) 來記錄內核日誌信息,對應dmesg命令 kallsym:內核符號表,該文件保存了內核輸出的符號定義, modules(X)使用該文件動態地鏈接和捆綁可裝載的模塊 loadavg:負載均衡,平均負載數給出了在過去的 一、 5,、15 分鐘裏在運行隊列裏的任務數、總做業數以及正在運行的做業總數。 locks:內核鎖 。 meminfo物理內存、交換空間等的信息,系統內存佔用狀況,對應df命令。 misc:雜項 。 modules:已經加載的模塊列表,對應lsmod命令 。 mounts:已加載的文件系統的列表,對應mount命令,無參數。 partitions:系統識別的分區表 。 slabinfo:sla池信息。 stat:全面統計狀態表,CPU內存的利用率等都是從這裏提取數據。對應ps命令。 swaps:對換空間的利用狀況。 version:指明瞭當前正在運行的內核版本。 |
可加載內核模塊(LKM)是用來展現 /proc 文件系統的一種簡單方法,這是由於這是一種用來動態地向 Linux 內核添加或刪除代碼的新方法。LKM 也是 Linux 內核中爲設備驅動程序和文件系統使用的一種流行機制。若是你曾經從新編譯過 Linux 內核,就可能會發如今內核的配置過程當中,有不少設備驅動程序和其餘內核元素都被編譯成了模塊。若是一個驅動程序被直接編譯到了內核中,那麼即便這個驅動程序沒有運行,它的代碼和靜態數據也會佔據一部分空間。可是若是這個驅動程序被編譯成一個模塊,就只有在須要內存並將其加載到內核時纔會真正佔用內存空間。
集成到 /proc 文件系統中
內核程序員可使用的標準 API,LKM 程序員也可使用。
方法一:(create_proc_entry建立proc文件)
1.1 .建立目錄:
- struct proc_dir_entry *proc_mkdir(const char *name,
- struct proc_dir_entry *parent);
1.2 .建立proc文件:
- struct proc_dir_entry *create_proc_entry( const char *name, mode_t mode,
- struct proc_dir_entry *parent );
create_proc_entry函數用於建立一個通常的proc文件,其中name是文件名,好比「hello」,mode是文件模式,parent是要建立的proc文件的父目錄(若parent = NULL則建立在/proc目錄下)。create_proc_entry
的返回值是一個 proc_dir_entry
指針(或者爲 NULL,說明在 create
時發生了錯誤)。而後就可使用這個返回的指針來配置這個虛擬文件的其餘參數,例如在對該文件執行讀操做時應該調用的函數。
- struct proc_dir_entry {
- ......
- const struct file_operations *proc_fops; <==文件操做結構體
- struct proc_dir_entry *next, *parent, *subdir;
- void *data;
- read_proc_t *read_proc; <==讀回調
- write_proc_t *write_proc; <==寫回調
- ......
- };
1.3 .刪除proc文件/目錄:
- void remove_dir_entry(const char *name, struct proc_dir_entry *parent);
要從 /proc 中刪除一個文件,可使用 remove_proc_entry
函數。要使用這個函數,咱們須要提供文件名字符串,以及這個文件在 /proc 文件系統中的位置(parent)。
三、proc文件讀回調函數
static int (*proc_read)(char *page, char **start, off_t off, int count, int *eof, void *data);
四、proc文件寫回調函數
static int proc_write_foobar(struct file *file, const char *buffer, unsigned long count, void *data);
proc文件其實是一個叫作proc_dir_entry的struct(定義在proc_fs.h),該struct中有int read_proc和int write_proc兩個元素,要實現proc的文件的讀寫就要給這兩個元素賦值。但這裏不是簡單地將一個整數賦值過去就好了,須要實現兩個回調函數。在用戶或應用程序訪問該proc文件時,就會調用這個函數,實現這個函數時只需將想要讓用戶看到的內容放入page便可。在用戶或應用程序試圖寫入該proc文件時,就會調用這個函數,實現這個函數時須要接收用戶寫入的數據(buff參數)。
寫回調函數
咱們可使用 write_proc
函數向 /proc 中寫入一項。這個函數的原型以下:
int mod_write( struct file *filp, const char __user *buff,
unsigned long len, void *data );
filp
參數其實是一個打開文件結構(咱們能夠忽略這個參數)。buff
參數是傳遞給您的字符串數據。緩衝區地址其實是一個用戶空間的緩衝區,所以咱們不能直接讀取它。len
參數定義了在 buff
中有多少數據要被寫入。data
參數是一個指向私有數據的指針。在這個模塊中,咱們聲明瞭一個這種類型的函數來處理到達的數據。
Linux 提供了一組 API 來在用戶空間和內核空間之間移動數據。對於 write_proc
的狀況來講,咱們使用了 copy_from_user
函數來維護用戶空間的數據。
讀回調函數
咱們可使用 read_proc
函數從一個 /proc 項中讀取數據(從內核空間到用戶空間)。這個函數的原型以下:
int mod_read( char *page, char **start, off_t off,
int count, int *eof, void *data );
page
參數是這些數據寫入到的位置,其中 count
定義了能夠寫入的最大字符數。在返回多頁數據(一般一頁是 4KB)時,咱們須要使用 start
和 off
參數。當全部數據所有寫入以後,就須要設置 eof
(文件結束參數)。與 write
相似,data
表示的也是私有數據。此處提供的 page
緩衝區在內核空間中。所以,咱們能夠直接寫入,而不用調用 copy_to_user
。
實例代碼:
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/proc_fs.h>
- #include <linux/jiffies.h>
- #include <asm/uaccess.h>
-
-
- #define MODULE_VERS "1.0"
- #define MODULE_NAME "procfs_example"
-
- #define FOOBAR_LEN 8
-
- struct fb_data_t {
- char name[FOOBAR_LEN + 1];
- char value[FOOBAR_LEN + 1];
- };
-
-
- static struct proc_dir_entry *example_dir, *foo_file;
-
- struct fb_data_t foo_data;
-
- static int proc_read_foobar(char *page, char **start,
- off_t off, int count,
- int *eof, void *data)
- {
- int len;
- struct fb_data_t *fb_data = (struct fb_data_t *)data;
-
-
- len = sprintf(page, "%s = '%s'\n",
- fb_data->name, fb_data->value);
-
- return len;
- }
-
-
- static int proc_write_foobar(struct file *file,
- const char *buffer,
- unsigned long count,
- void *data)
- {
- int len;
- struct fb_data_t *fb_data = (struct fb_data_t *)data;
-
- if(count > FOOBAR_LEN)
- len = FOOBAR_LEN;
- else
- len = count;
-
- if(copy_from_user(fb_data->name, buffer, len))
- return -EFAULT;
-
- fb_data->value[len] = '\0';
-
- return len;
- }
-
-
- static int __init init_procfs_example(void)
- {
- int rv = 0;
-
-
- example_dir = proc_mkdir(MODULE_NAME, NULL);
- if(example_dir == NULL) {
- rv = -ENOMEM;
- goto out;
- }
-
-
- foo_file = create_proc_entry("foo", 0644, example_dir);
- if(foo_file == NULL) {
- rv = -ENOMEM;
- goto no_foo;
- }
-
- strcpy(foo_data.name, "foo");
- strcpy(foo_data.value, "foo");
- foo_file->data = &foo_data;
- foo_file->read_proc = proc_read_foobar;
- foo_file->write_proc = proc_write_foobar;
-
-
- printk(KERN_INFO "%s %s initialised\n",
- MODULE_NAME, MODULE_VERS);
- return 0;
-
-
- no_foo:
- remove_proc_entry("jiffies", example_dir);
-
- out:
- return rv;
- }
-
-
- static void __exit cleanup_procfs_example(void)
- {
-
- remove_proc_entry("foo", example_dir);
- remove_proc_entry(MODULE_NAME, NULL);
-
- printk(KERN_INFO "%s %s removed\n",
- MODULE_NAME, MODULE_VERS);
- }
-
-
- module_init(init_procfs_example);
- module_exit(cleanup_procfs_example);
-
- MODULE_AUTHOR("Erik Mouw");
- MODULE_DESCRIPTION("procfs examples");
- MODULE_LICENSE("GPL");