Linux系統上的/proc目錄是一種文件系統,即proc文件系統。與其它常見的文件系統不同的是,/proc是一種僞文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關係統硬件及當前正在運行進程的信息,甚至可以通過更改其中某些文件來改變內核的運行狀態。
基於/proc文件系統如上所述的特殊性,其內的文件也常被稱作虛擬文件,並具有一些獨特的特點。例如,其中有些文件雖然使用查看命令查看時會返回大量信息,但文件本身的大小卻會顯示爲0字節。此外,這些特殊文件中大多數文件的時間及日期屬性通常爲當前系統時間和日期,這跟它們隨時會被刷新(存儲於RAM中)有關。
爲了查看及使用上的方便,這些文件通常會按照相關性進行分類存儲於不同的目錄甚至子目錄中,如/proc/scsi目錄中存儲的就是當前系統上所有SCSI設備的相關信息,/proc/N中存儲的則是系統當前正在運行的進程的相關信息,其中N爲正在運行的進程(可以想象得到,在某進程結束後其相關目錄則會消失)。
大多數虛擬文件可以使用文件查看命令如cat、more或者less進行查看,有些文件信息表述的內容可以一目瞭然,但也有文件的信息卻不怎麼具有可讀性。不過,這些可讀性較差的文件在使用一些命令如apm、free、lspci或top查看時卻可以有着不錯的表現。
一、 進程目錄中的常見文件介紹
/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.1、cmdline — 啓動當前進程的完整命令,但殭屍進程目錄中的此文件不包含任何信息;
[root@rhel5 ~]# more /proc/2674/cmdline /usr/sbin/saslauthd |
1.2、cwd — 指向當前進程運行目錄的一個符號鏈接;
1.3、environ — 當前進程的環境變量列表,彼此間用空字符(NULL)隔開;變量用大寫字母表示,其值用小寫字母表示;
[root@rhel5 ~]# more /proc/2674/environ TERM=linuxauthd |
1.4、exe — 指向啓動當前進程的可執行文件(完整路徑)的符號鏈接,通過/proc/N/exe可以啓動當前進程的一個拷貝;
1.5、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.6、limits — 當前進程所使用的每一個受限資源的軟限制、硬限制和管理單元;此文件僅可由實際啓動當前進程的UID用戶讀取;(2.6.24以後的內核版本支持此功能);
1.7、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.8、mem — 當前進程所佔用的內存空間,由open、read和lseek等系統調用使用,不能被用戶讀取;
1.9、root — 指向當前進程運行根目錄的符號鏈接;在Unix和Linux系統上,通常採用chroot命令使每個進程運行於獨立的根目錄;
1.10、stat — 當前進程的狀態信息,包含一系統格式化後的數據列,可讀性差,通常由ps命令使用;
1.11、statm — 當前進程佔用內存的狀態信息,通常以“頁面”(page)表示;
1.12、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.13、task — 目錄文件,包含由當前進程所運行的每一個線程的相關信息,每個線程的相關信息文件均保存在一個由線程號(tid)命名的目錄中,這類似於其內容類似於每個進程目錄中的內容;(內核2.6版本以後支持此功能)
二、/proc目錄下常見的文件介紹
2.1、/proc/apm
高級電源管理(APM)版本信息及電池相關狀態信息,通常由apm命令使用;
2.2、/proc/buddyinfo
用於診斷內存碎片問題的相關信息文件;
2.3、/proc/cmdline
在啓動時傳遞至內核的相關參數信息,這些信息通常由lilo或grub等啓動管理工具進行傳遞;
[root@rhel5 ~]# more /proc/cmdline ro root=/dev/VolGroup00/LogVol00 rhgb quiet |
2.4、/proc/cpuinfo
處理器的相關信息的文件;
2.5、/proc/crypto
系統上已安裝的內核使用的密碼算法及每個算法的詳細信息列表;
[root@rhel5 ~]# more /proc/crypto name : crc32c driver : crc32c-generic module : kernel priority : 0 type : digest blocksize : 32 digestsize : 4 ………… |
2.6、/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.7、/proc/diskstats
每塊磁盤設備的磁盤I/O統計信息列表;(內核2.5.69以後的版本支持此功能)
2.8、/proc/dma
每個正在使用且註冊的ISA DMA通道的信息列表;
[root@rhel5 ~]# more /proc/dma 2: floppy 4: cascade |
2.9、/proc/execdomains
內核當前支持的執行域(每種操作系統獨特“個性”)信息列表;
[root@rhel5 ~]# more /proc/execdomains 0-0 Linux [kernel] |
2.10、/proc/fb
幀緩衝設備列表文件,包含幀緩衝設備的設備號和相關驅動信息;
2.11、/proc/filesystems
當前被內核支持的文件系統類型列表文件,被標示爲nodev的文件系統表示不需要塊設備的支持;通常mount一個設備時,如果沒有指定文件系統類型將通過此文件來決定其所需文件系統的類型;
[root@rhel5 ~]# more /proc/filesystems nodev sysfs nodev rootfs nodev proc iso9660 ext3 ………… ………… |
2.12、/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.13、/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 ………… |
2.14、/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.15、/proc/kallsyms
模塊管理工具用來動態鏈接或綁定可裝載模塊的符號定義,由內核輸出;(內核2.5.71以後的版本支持此功能);通常這個文件中的信息量相當大;
[root@rhel5 ~]# more /proc/kallsyms c04011f0 T _stext c04011f0 t run_init_process c04011f0 T stext ………… |
2.16、/proc/kcore
系統使用的物理內存,以ELF核心文件(core file)格式存儲,其文件大小爲已使用的物理內存(RAM)加上4KB;這個文件用來檢查內核數據結構的當前狀態,因此,通常由GBD通常調試工具使用,但不能使用文件查看命令打開此文件;
2.17、/proc/kmsg
此文件用來保存由內核輸出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要試圖使用查看命令打開此文件;
2.18、/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.19、/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.21、/proc/meminfo
系統中關於當前內存的利用狀況等的信息,常由free命令使用;可以使用文件查看命令直接讀取此文件,其內容顯示爲兩列,前者爲統計屬性,後者爲對應的值;
[root@rhel5 ~]# less /proc/meminfo MemTotal: 515492 kB MemFree: 8452 kB Buffers: 19724 kB Cached: 376400 kB SwapCached: 4 kB ………… |
2.22、/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.23、/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.24、/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.25、/proc/pci
內核初始化時發現的所有PCI設備及其配置信息列表,其配置信息多爲某PCI設備相關IRQ信息,可讀性不高,可以用“/sbin/lspci –vb”命令獲得較易理解的相關信息;在2.6內核以後,此文件已爲/proc/bus/pci目錄及其下的文件代替;
2.26、/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.27、/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.28、/proc/swaps
當前系統上的交換分區及其空間利用信息,如果有多個交換分區的話,則會每個交換分區的信息分別存儲於/proc/swap目錄中的單獨文件中,而其優先級數字越低,被使用到的可能性越大;下面是作者系統中只有一個交換分區時的輸出信息;
[root@rhel5 ~]# more /proc/swaps Filename Type Size Used Priority /dev/sda8 partition 642560 0 -1 |
2.29、/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 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)) #1 SMP Wed Dec 17 11:42:39 EST 2008 |
2.31、/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.32、/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 ………… |
三、/proc/sys目錄詳解
與/proc下其它文件的“只讀”屬性不同的是,管理員可對/proc/sys子目錄中的許多文件內容進行修改以更改內核的運行特性,事先可以使用“ls -l”命令查看某文件是否“可寫入”。寫入操作通常使用類似於“echo DATA > /path/to/your/filename”的格式進行。需要注意的是,即使文件可寫,其一般也不可以使用編輯器進行編輯。
3.1、/proc/sys/debug 子目錄
此目錄通常是一空目錄;
3.2、/proc/sys/dev 子目錄
爲系統上特殊設備提供參數信息文件的目錄,其不同設備的信息文件分別存儲於不同的子目錄中,如大多數系統上都會具有的/proc/sys/dev/cdrom和/proc/sys/dev/raid(如果內核編譯時開啓了支持raid的功能) 目錄,其內存儲的通常是系統上cdrom和raid的相關參數信息文件。