proc文件系統(tǒng)是一個(gè)偽文件系統(tǒng),它只存在內(nèi)存當(dāng)中,而不占用外存空間。它以文件系統(tǒng)的方式為訪問系統(tǒng)內(nèi)核數(shù)據(jù)的操作提供接口。用戶和應(yīng)用程序可以通過proc得到系統(tǒng)的信息,并可以改變內(nèi)核的某些參數(shù)。由于系統(tǒng)的信息,如進(jìn)程,是動(dòng)態(tài)改變的,所以用戶或應(yīng)用程序讀取proc文件時(shí),proc文件系統(tǒng)是動(dòng)態(tài)從系統(tǒng)內(nèi)核讀出所需信息并提交的。它的目錄結(jié)構(gòu)如下: 目錄名稱 目錄內(nèi)容 apm 高級(jí)電源管理信息 cmdline 內(nèi)核命令行 Cpuinfo 關(guān)于Cpu信息 Devices 可以用到的設(shè)備(塊設(shè)備/字符設(shè)備) Dma 使用的DMA通道 Filesystems 支持的文件系統(tǒng) Interrupts 中斷的使用 Ioports I/O端口的使用 Kcore 內(nèi)核核心印象 Kmsg 內(nèi)核消息 Ksyms 內(nèi)核符號(hào)表 Loadavg 負(fù)載均衡 Locks 內(nèi)核鎖 Meminfo 內(nèi)存信息 Misc 雜項(xiàng) Modules 加載模塊列表 Mounts 加載的文件系統(tǒng) Partitions 系統(tǒng)識(shí)別的分區(qū)表 Rtc 實(shí)時(shí)時(shí)鐘 Slabinfo Slab池信息 Stat 全面統(tǒng)計(jì)狀態(tài)表 Swaps 對(duì)換空間的利用情況 Version 內(nèi)核版本 Uptime 系統(tǒng)正常運(yùn)行時(shí)間 并不是所有這些目錄在你的系統(tǒng)中都有,這取決于你的內(nèi)核配置和裝載的模塊。另外,在/proc下還有三個(gè)很重要的目錄:net,scsi和 sys。Sys目錄是可寫的,可以通過它來訪問或修改內(nèi)核的參數(shù)(見下一部分),而net和scsi則依賴于內(nèi)核配置。例如,如果系統(tǒng)不支持scsi,則 scsi目錄不存在。 除了以上介紹的這些,還有的是一些以數(shù)字命名的目錄,它們是進(jìn)程目錄。系統(tǒng)中當(dāng)前運(yùn)行的每一個(gè)進(jìn)程都有對(duì)應(yīng)的一個(gè)目錄在/proc下,以進(jìn)程的 PID號(hào)為目錄名,它們是讀取進(jìn)程信息的接口。而self目錄則是讀取進(jìn)程本身的信息接口,是一個(gè)link。Proc文件系統(tǒng)的名字就是由之而起。進(jìn)程目錄的結(jié)構(gòu)如下: 目錄名稱 目錄內(nèi)容 Cmdline 命令行參數(shù) Environ 環(huán)境變量值 Fd 一個(gè)包含所有文件描述符的目錄 Mem 進(jìn)程的內(nèi)存被利用情況 Stat 進(jìn)程狀態(tài) Status 進(jìn)程當(dāng)前狀態(tài),以可讀的方式顯示出來 Cwd 當(dāng)前工作目錄的鏈接 Exe 指向該進(jìn)程的執(zhí)行命令文件 Maps 內(nèi)存映象 Statm 進(jìn)程內(nèi)存狀態(tài)信息 Root 鏈接此進(jìn)程的root目錄 用戶如果要查看系統(tǒng)信息,可以用cat命令。例如: # 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 Mouse 13: 1 XT-PIC fpu PS/2 14: 1232265 XT-PIC ide0 15: 7 XT-PIC ide1 NMI: 0 用戶還可以實(shí)現(xiàn)修改內(nèi)核參數(shù)。在/proc文件系統(tǒng)中有一個(gè)有趣的目錄:/proc/sys。它不僅提供了內(nèi)核信息,而且可以通過它修改內(nèi)核參數(shù),來優(yōu)化你的系統(tǒng)。但是你必須很小心,因?yàn)榭赡軙?huì)造成系統(tǒng)崩潰。最好是先找一臺(tái)無關(guān)緊要的機(jī)子,調(diào)試成功后再應(yīng)用到你的系統(tǒng)上。 要改變內(nèi)核的參數(shù),只要用vi編輯或echo參數(shù)重定向到文件中即可。下面有一個(gè)例子: # cat /proc/sys/fs/file-max 4096 # echo 8192 > /proc/sys/fs/file-max # cat /proc/sys/fs/file-max 8192 如果你優(yōu)化了參數(shù),則可以把它們寫成添加到文件rc.local中,使它在系統(tǒng)啟動(dòng)時(shí)自動(dòng)完成修改。 /proc文件系統(tǒng)中網(wǎng)絡(luò)參數(shù) 在/proc/sys/net/ipv4/目錄下,包含的是和tcp/ip協(xié)議相關(guān)的各種參數(shù),下面我們就對(duì)這些網(wǎng)絡(luò)參數(shù)加以詳細(xì)的說明。 ip_forward 參數(shù)類型:BOOLEAN 0 - 關(guān)閉(默認(rèn)值) not 0 - 打開ip轉(zhuǎn)發(fā) 在網(wǎng)絡(luò)本地接口之間轉(zhuǎn)發(fā)數(shù)據(jù)報(bào)。該參數(shù)非常特殊,對(duì)該參數(shù)的修改將導(dǎo)致其它所有相關(guān)配置參數(shù)恢復(fù)其默認(rèn)值(對(duì)于主機(jī)參閱RFC1122,對(duì)于路由器參見RFC1812) ip_default_ttl 參數(shù)類型:INTEGER 默認(rèn)值為 64 。表示IP數(shù)據(jù)報(bào)的Time To Live值。 ip_no_pmtu_disc 參數(shù)類型:BOOLEAN 關(guān)閉路徑MTU探測,默認(rèn)值為FALSE ipfrag_high_thresh 參數(shù)類型:整型 用來組裝分段的IP包的最大內(nèi)存量。當(dāng)ipfrag_high_thresh數(shù)量的內(nèi)存被分配來用來組裝IP包,則IP分片處理器將丟棄數(shù)據(jù)報(bào)直到ipfrag_low_thresh數(shù)量的內(nèi)存被用來組裝IP包。 ipfrag_low_thresh 參數(shù)類型:整型 參見ipfrag_high_thresh。 ipfrag_time 參數(shù)類型:整型 保存一個(gè)IP分片在內(nèi)存中的時(shí)間。 inet_peer_threshold 參數(shù)類型:整型 INET對(duì)端存儲(chǔ)器某個(gè)合適值,當(dāng)超過該閥值條目將被丟棄。該閥值同樣決定生存時(shí)間以及廢物收集通過的時(shí)間間隔。條目越多,存活期越低,GC 間隔越短 inet_peer_minttl 參數(shù)類型:整型 條目的最低存活期。在重組端必須要有足夠的碎片(fragment)存活期。這個(gè)最低存活期必須保證緩沖池容積是否少于 inet_peer_threshold。該值以 jiffies為單位測量。 inet_peer_maxttl 參數(shù)類型:整型 條目的最大存活期。在此期限到達(dá)之后,如果緩沖池沒有耗盡壓力的話(例如,緩沖池中的條目數(shù)目非常少),不使用的條目將會(huì)超時(shí)。該值以 jiffies為單位測量。 inet_peer_gc_mintime 參數(shù)類型:整型 廢物收集(GC)通過的最短間隔。這個(gè)間隔會(huì)影響到緩沖池中內(nèi)存的高壓力。 該值以 jiffies為單位測量。 inet_peer_gc_maxtime 參數(shù)類型:整型 廢物收集(GC)通過的最大間隔,這個(gè)間隔會(huì)影響到緩沖池中內(nèi)存的低壓力。 該值以 jiffies為單位測量。 tcp_syn_retries 參數(shù)類型:整型 對(duì)于一個(gè)新建連接,內(nèi)核要發(fā)送多少個(gè) SYN 連接請(qǐng)求才決定放棄。不應(yīng)該大于255,默認(rèn)值是5,對(duì)應(yīng)于180秒左右。 tcp_synack_retries 參數(shù)類型:整型 對(duì)于遠(yuǎn)端的連接請(qǐng)求SYN,內(nèi)核會(huì)發(fā)送SYN + ACK數(shù)據(jù)報(bào),以確認(rèn)收到上一個(gè) SYN連接請(qǐng)求包。這是所謂的三次握手( threeway handshake)機(jī)制的第二個(gè)步驟。這里決定內(nèi)核在放棄連接之前所送出的 SYN+ACK 數(shù)目。 tcp_keepalive_time 參數(shù)類型:整型 當(dāng)keepalive打開的情況下,TCP發(fā)送keepalive消息的頻率,默認(rèn)值是2個(gè)小時(shí)。 tcp_keepalive_probes 參數(shù)類型:整型 TCP發(fā)送keepalive探測以確定該連接已經(jīng)斷開的次數(shù),默認(rèn)值是9。 tcp_keepalive_interval 參數(shù)類型:整型 探測消息發(fā)送的頻率,乘以tcp_keepalive_probes就得到對(duì)于從開始探測以來沒有響應(yīng)的連接殺除的時(shí)間。默認(rèn)值為75秒,也就是沒有活動(dòng)的連接將在大約11分鐘以后將被丟棄。 tcp_retries1 參數(shù)類型:整型 當(dāng)出現(xiàn)可疑情況而必須向網(wǎng)絡(luò)層報(bào)告這個(gè)可疑狀況之前,需要進(jìn)行多少次重試。最低的 RFC 數(shù)值是 3 ,這也是默認(rèn)值,根據(jù)RTO的值大約在3秒 - 8分鐘之間。 tcp_retries2 參數(shù)類型:整型 在丟棄激活的TCP連接之前,需要進(jìn)行多少次重試。RFC1122規(guī)定,該值必須大于100秒。默認(rèn)值為15,根據(jù)RTO的值來決定,相當(dāng)于13-30分鐘, tcp_orphan_retries 參數(shù)類型:整型 在近端丟棄TCP連接之前,要進(jìn)行多少次重試。默認(rèn)值是 7 個(gè),相當(dāng)于 50秒 - 16分鐘,視 RTO 而定。如果您的系統(tǒng)是負(fù)載很大的web服務(wù)器,那么也許需要降低該值,這類 sockets 可能會(huì)耗費(fèi)大量的資源。另外參的考 tcp_max_orphans 。 tcp_fin_timeout 參數(shù)類型:整型 對(duì)于本端斷開的socket連接,TCP保持在FIN-WAIT-2狀態(tài)的時(shí)間。對(duì)方可能會(huì)斷開連接或一直不結(jié)束連接或不可預(yù)料的進(jìn)程死亡。默認(rèn)值為 60 秒。過去在2.2版本的內(nèi)核中是 180 秒。您可以設(shè)置該值,但需要注意,如果您的機(jī)器為負(fù)載很重的web服務(wù)器,您可能要冒內(nèi)存被大量無效數(shù)據(jù)報(bào)填滿的風(fēng)險(xiǎn),F(xiàn)IN-WAIT-2 sockets 的危險(xiǎn)性低于 FIN-WAIT-1 ,因?yàn)樗鼈冏疃嘀怀?1.5K 的內(nèi)存,但是它們存在時(shí)間更長。另外參考 tcp_max_orphans。 tcp_max_tw_buckets 參數(shù)類型:整型 系統(tǒng)在同時(shí)所處理的最大timewait sockets 數(shù)目。如果超過此數(shù)的話,time-wait socket 會(huì)被立即砍除并且顯示警告信息。之所以要設(shè)定這個(gè)限制,純粹為了抵御那些簡單的 DoS 攻擊,千萬不要人為的降低這個(gè)限制,不過,如果網(wǎng)絡(luò)條件需要比默認(rèn)值更多,則可以提高它(或許還要增加內(nèi)存)。 tcp_tw_recycle 參數(shù)類型:布爾 打開快速 TIME-WAIT sockets 回收。默認(rèn)值是1。除非得到技術(shù)專家的建議或要求,請(qǐng)不要隨意修改這個(gè)值。 tcp_max_orphans 參數(shù)類型:整型 系統(tǒng)所能處理不屬于任何進(jìn)程的TCP sockets最大數(shù)量。假如超過這個(gè)數(shù)量,那么不屬于任何進(jìn)程的連接會(huì)被立即reset,并同時(shí)顯示警告信息。之所以要設(shè)定這個(gè)限制,純粹為了抵御那些簡單的 DoS 攻擊,千萬不要依賴這個(gè)或是人為的降低這個(gè)限制 tcp_abort_on_overflow 參數(shù)類型:布爾 當(dāng)守護(hù)進(jìn)程太忙而不能接受新的連接,就象對(duì)方發(fā)送reset消息,默認(rèn)值是false。這意味著當(dāng)溢出的原因是因?yàn)橐粋(gè)偶然的猝發(fā),那么連接將恢復(fù)狀態(tài)。只有在你確信守護(hù)進(jìn)程真的不能完成連接請(qǐng)求時(shí)才打開該選項(xiàng),該選項(xiàng)會(huì)影響客戶的使用。 tcp_syncookies 參數(shù)類型:整型 只有在內(nèi)核編譯時(shí)選擇了CONFIG_SYNCOOKIES時(shí)才會(huì)發(fā)生作用。當(dāng)出現(xiàn)syn等候隊(duì)列出現(xiàn)溢出時(shí)象對(duì)方發(fā)送syncookies。目的是為了防止syn flood攻擊。默認(rèn)值是false。 注意:該選項(xiàng)千萬不能用于那些沒有收到攻擊的高負(fù)載服務(wù)器,如果在日志中出現(xiàn)synflood消息,但是調(diào)查發(fā)現(xiàn)沒有收到synflood攻擊,而是合法用戶的連接負(fù)載過高的原因,你應(yīng)該調(diào)整其它參數(shù)來提高服務(wù)器性能。參考: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow. syncookie嚴(yán)重的違背TCP協(xié)議,不允許使用TCP擴(kuò)展,可能對(duì)某些服務(wù)導(dǎo)致嚴(yán)重的性能影響(如SMTP轉(zhuǎn)發(fā))。 tcp_stdurg 參數(shù)類型:整型 使用 TCP urg pointer 字段中的主機(jī)請(qǐng)求解釋功能。大部份的主機(jī)都使用老舊的 BSD解釋,因此如果您在 Linux 打開它,或會(huì)導(dǎo)致不能和它們正確溝通。默認(rèn)值為為:FALSE tcp_max_syn_backlog 參數(shù)類型:整型 對(duì)于那些依然還未獲得客戶端確認(rèn)的連接請(qǐng)求,需要保存在隊(duì)列中最大數(shù)目。對(duì)于超過 128Mb 內(nèi)存的系統(tǒng),默認(rèn)值是 1024 ,低于 128Mb 的則為 128。如果服務(wù)器經(jīng)常出現(xiàn)過載,可以嘗試增加這個(gè)數(shù)字。警告!假如您將此值設(shè)為大于 1024,最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE ,以保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ,并且編進(jìn)核心之內(nèi)。 tcp_window_scaling 參數(shù)類型:布爾 正常來說,TCP/IP 可以接受最大到65535字節(jié)的 windows。對(duì)于寬帶網(wǎng)絡(luò),該值可能是不夠的,通過調(diào)整該參數(shù)有助于提高寬帶服務(wù)器性能。 tcp_timestamps 參數(shù)類型:布爾 Timestamps 用在其它一些東西中,可以防范那些偽造的 sequence 號(hào)碼。一條1G的寬帶線路或許會(huì)重遇到帶 out-of-line數(shù)值的舊sequence 號(hào)碼(假如它是由于上次產(chǎn)生的)。Timestamp 會(huì)讓它知道這是個(gè) '舊封包'。 tcp_sack 參數(shù)類型:布爾 使用 Selective ACK,它可以用來查找特定的遺失的數(shù)據(jù)報(bào)--- 因此有助于快速恢復(fù)狀態(tài)。 tcp_fack 參數(shù)類型:布爾 打開FACK擁塞避免和快速重傳功能。 tcp_dsack 參數(shù)類型:布爾 允許TCP發(fā)送"兩個(gè)完全相同"的SACK。 tcp_ecn 參數(shù)類型:布爾 打開TCP的直接擁塞通告功能。 tcp_reordering 參數(shù)類型:整型 TCP流中重排序的數(shù)據(jù)報(bào)最大數(shù)量默認(rèn)值是 3 。 tcp_retrans_collapse 參數(shù)類型:布爾 對(duì)于某些有bug的打印機(jī)提供針對(duì)其bug的兼容性。 tcp_wmem - 三個(gè)整數(shù)的向量: min, default, max min:為TCP socket預(yù)留用于發(fā)送緩沖的內(nèi)存最小值。每個(gè)tcp socket都可以在建議以后都可以使用它。默認(rèn)值為4K。 default:為TCP socket預(yù)留用于發(fā)送緩沖的內(nèi)存數(shù)量,默認(rèn)情況下該值會(huì)影響其它協(xié)議使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默認(rèn)值為16K。 max: 用于TCP socket發(fā)送緩沖的內(nèi)存最大值。該值不會(huì)影響net.core.wmem_max,今天選擇參數(shù)SO_SNDBUF則不受該值影響。默認(rèn)值為128K。 tcp_rmem - 三個(gè)整數(shù)的向量: min, default, max min:為TCP socket預(yù)留用于接收緩沖的內(nèi)存數(shù)量,即使在內(nèi)存出現(xiàn)緊張情況下tcp socket都至少會(huì)有這么多數(shù)量的內(nèi)存用于接收緩沖,默認(rèn)值為8K。 default:為TCP socket預(yù)留用于接收緩沖的內(nèi)存數(shù)量,默認(rèn)情況下該值影響其它協(xié)議使用的 net.core.wmem_default 值。該值決定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win:0是默認(rèn)值情況下,tcp 窗口大小為65535。 max:用于TCP socket接收緩沖的內(nèi)存最大值。該值不會(huì)影響 net.core.wmem_max,今天選擇參數(shù) SO_SNDBUF則不受該值影響。默認(rèn)值為 128K。默認(rèn)值為87380*2 bytes。 tcp_mem - 三個(gè)整數(shù)的向量: low, pressure, high low:當(dāng)TCP使用了低于該值的內(nèi)存頁面數(shù)時(shí),TCP不會(huì)考慮釋放內(nèi)存。 pressure:當(dāng)TCP使用了超過該值的內(nèi)存頁面數(shù)量時(shí),TCP試圖穩(wěn)定其內(nèi)存使用,進(jìn)入pressure模式,當(dāng)內(nèi)存消耗低于low值時(shí)則退出pressure狀態(tài)。 high:允許所有tcp sockets用于排隊(duì)緩沖數(shù)據(jù)報(bào)的頁面量。 一般情況下這些值是在系統(tǒng)啟動(dòng)時(shí)根據(jù)系統(tǒng)內(nèi)存數(shù)量計(jì)算得到的。 tcp_app_win - 整數(shù) 保留max(window/2^tcp_app_win, mss)數(shù)量的窗口由于應(yīng)用緩沖。當(dāng)為0時(shí)表示不需要緩沖。默認(rèn)值是31。 tcp_adv_win_scale - 整數(shù) 計(jì)算緩沖開銷bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0),默認(rèn)值為2。 ip_local_port_range - 兩個(gè)整數(shù) 定于TCP和UDP使用的本地端口范圍,第一個(gè)數(shù)是開始,第二個(gè)數(shù)是最后端口號(hào),默認(rèn)值依賴于系統(tǒng)中可用的內(nèi)存數(shù): > 128Mb 32768-61000 < 128Mb 1024-4999 or even less. 該值決定了活動(dòng)連接的數(shù)量,也就是系統(tǒng)可以并發(fā)的連接數(shù) icmp_echo_ignore_all - 布爾類型 icmp_echo_ignore_broadcasts - 布爾類型 如果任何一個(gè)設(shè)置為true(>0)則系統(tǒng)將忽略所有發(fā)送給自己的ICMP ECHO請(qǐng)求或那些廣播地址的請(qǐng)求。 icmp_destunreach_rate - 整數(shù) icmp_paramprob_rate - 整數(shù) icmp_timeexceed_rate - 整數(shù) icmp_echoreply_rate - 整數(shù)(not enabled per default) 限制發(fā)向特定目標(biāo)的ICMP數(shù)據(jù)報(bào)的最大速率。0表示沒有任何限制,否則表示jiffies數(shù)據(jù)單位中允許發(fā)送的個(gè)數(shù)。 icmp_ignore_bogus_error_responses - 布爾類型 某些路由器違背RFC1122標(biāo)準(zhǔn),其對(duì)廣播幀發(fā)送偽造的響應(yīng)來應(yīng)答。這種違背行為通常會(huì)被以告警的方式記錄在系統(tǒng)日志中。如果該選項(xiàng)設(shè)置為True,內(nèi)核不會(huì)記錄這種警告信息。默認(rèn)值為False。 (1) Jiffie: 內(nèi)核使用的內(nèi)部時(shí)間單位,在i386系統(tǒng)上大小為1/100s,在Alpha中為1/1024S。在/usr/include/asm/param.h中的HZ定義有特定系統(tǒng)的值。 conf/interface/*: conf/all/*是特定的,用來修改所有接口的設(shè)置,is special and changes the settings for all interfaces. Change special settings per interface. log_martians - 布爾類型 記錄帶有不允許的地址的數(shù)據(jù)報(bào)到內(nèi)核日志中。 accept_redirects - 布爾類型 收發(fā)接收ICMP重定向消息。對(duì)于主機(jī)來說默認(rèn)為True,對(duì)于用作路由器時(shí)默認(rèn)值為False。 forwarding - 布爾類型 在該接口打開轉(zhuǎn)發(fā)功能 mc_forwarding - 布爾類型 是否進(jìn)行多播路由。只有內(nèi)核編譯有CONFIG_MROUTE并且有路由服務(wù)程序在運(yùn)行該參數(shù)才有效。 proxy_arp - 布爾類型 打開proxy arp功能。 shared_media - 布爾類型 發(fā)送(路由器)或接收(主機(jī)) RFC1620 共享媒體重定向。覆蓋ip_secure_redirects的值。默認(rèn)為True。 secure_redirects - 布爾類型 僅僅接收發(fā)給默認(rèn)網(wǎng)關(guān)列表中網(wǎng)關(guān)的ICMP重定向消息,默認(rèn)值是TRUE。 send_redirects - 布爾類型 如果是router,發(fā)送重定向消息,默認(rèn)值是TRUE bootp_relay - 布爾類型 接收源地址為0.b.c.d,目的地址不是本機(jī)的數(shù)據(jù)報(bào)。用來支持BOOTP轉(zhuǎn)發(fā)服務(wù)進(jìn)程,該進(jìn)程將捕獲并轉(zhuǎn)發(fā)該包。默認(rèn)為False,目前還沒有實(shí)現(xiàn)。 accept_source_route - 布爾類型 接收帶有SRR選項(xiàng)的數(shù)據(jù)報(bào)。對(duì)于主機(jī)來說默認(rèn)為False,對(duì)于用作路由器時(shí)默認(rèn)值為True。 rp_filter 參數(shù)類型 1 - 通過反向路徑回溯進(jìn)行源地址驗(yàn)證(在RFC1812中定義)。對(duì)于單穴主機(jī)和stub網(wǎng)絡(luò)路由器推薦使用該選項(xiàng)。 0 - 不通過反向路徑回溯進(jìn)行源地址驗(yàn)證。 默認(rèn)值為0。某些發(fā)布在啟動(dòng)時(shí)自動(dòng)將其打開。 |
理解 Proc 文件系統(tǒng) -------------------------------------------------------------------------------- 作者:王旭 翻譯 2004-10-05 18:25:55 來自:linuxfocus 目錄: /proc --- 一個(gè)虛擬文件系統(tǒng) 加載 proc 文件系統(tǒng) 察看 /proc 的文件 得到有用的系統(tǒng)/內(nèi)核信息 有關(guān)運(yùn)行中的進(jìn)程的信息 通過 /proc 與內(nèi)核交互 結(jié)論 參考文獻(xiàn) 摘要: Linux 內(nèi)核提供了一種通過 /proc 文件系統(tǒng),在運(yùn)行時(shí)訪問內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)、改變內(nèi)核設(shè)置的機(jī)制。盡管在各種硬件平臺(tái)上的 Linux 系統(tǒng)的 /proc 文件系統(tǒng)的基本概念都是相同的,但本文只討論基于 intel x86 架構(gòu)的 Linux /proc 文件系統(tǒng)。 _________________ _________________ _________________ /proc --- 一個(gè)虛擬文件系統(tǒng) /proc 文件系統(tǒng)是一種內(nèi)核和內(nèi)核模塊用來向進(jìn)程 (process) 發(fā)送信息的機(jī)制 (所以叫做 /proc)。這個(gè)偽文件系統(tǒng)讓你可以和內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)進(jìn)行交互,獲取 有關(guān)進(jìn)程的有用信息,在運(yùn)行中 (on the fly) 改變設(shè)置 (通過改變內(nèi)核參數(shù))。 與其他文件系統(tǒng)不同,/proc 存在于內(nèi)存之中而不是硬盤上。如果你察看文件 /proc/mounts (和 mount 命令一樣列出所有已經(jīng)加載的文件系統(tǒng)),你會(huì)看到其中 一行是這樣的: grep proc /proc/mounts /proc /proc proc rw 0 0 /proc 由內(nèi)核控制,沒有承載 /proc 的設(shè)備。因?yàn)?/proc 主要存放由內(nèi)核控制的狀態(tài)信息,所以大部分這些信息的邏輯位置位于內(nèi)核控制的內(nèi)存。對(duì) /proc 進(jìn)行一次 'ls -l' 可以看到大部分文件都是 0 字節(jié)大的;不過察看這些文件的時(shí)候,確實(shí)可以看到一些信息。這怎么可能?這是因?yàn)?/proc 文件系統(tǒng)和其他常規(guī)的文件系統(tǒng)一樣把自己注冊到虛擬文件系統(tǒng)層 (VFS) 了。然而,直到當(dāng) VFS 調(diào)用它,請(qǐng)求文件、目錄的 i-node 的時(shí)候,/proc 文件系統(tǒng)才根據(jù)內(nèi)核中的信息建立相應(yīng)的文件和目錄。 加載 proc 文件系統(tǒng) 如果系統(tǒng)中還沒有加載 proc 文件系統(tǒng),可以通過如下命令加載 proc 文件系統(tǒng): mount -t proc proc /proc 上述命令將成功加載你的 proc 文件系統(tǒng)。更多細(xì)節(jié)請(qǐng)閱讀 mount 命令的 man page。 察看 /proc 的文件 /proc 的文件可以用于訪問有關(guān)內(nèi)核的狀態(tài)、計(jì)算機(jī)的屬性、正在運(yùn)行的進(jìn)程的狀態(tài)等信息。大部分 /proc 中的文件和目錄提供系統(tǒng)物理環(huán)境最新的信息。盡管 /proc 中的文件是虛擬的,但它們?nèi)钥梢允褂萌魏挝募庉嬈骰蛳?more', 'less'或 'cat'這樣的程序來查看。當(dāng)編輯程序試圖打開一個(gè)虛擬文件時(shí),這個(gè)文件就通過內(nèi)核中的信息被憑空地 (on the fly) 創(chuàng)建了。這是一些我從我的系統(tǒng)中得到的一些有趣結(jié)果: $ ls -l /proc/cpuinfo -r--r--r-- 1 root root 0 Dec 25 11:01 /proc/cpuinfo $ file /proc/cpuinfo /proc/cpuinfo: empty $ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 1000.119 cache size : 256 KB fdiv_bug : no hlt_bug : no sep_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr xmm bogomips : 1998.85 processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 1000.119 cache size : 256 KB fdiv_bug : no hlt_bug : no sep_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr xmm bogomips : 1992.29 這是一個(gè)從雙 CPU 的系統(tǒng)中得到的結(jié)果,上述大部分的信息十分清楚地給出了這個(gè)系統(tǒng)的有用的硬件信息。有些 /proc 的文件是經(jīng)過編碼的,不同的工具可以被用來解釋這些編碼過的信息并輸出成可讀的形式。這樣的工具包括:'top', 'ps', 'apm' 等。 得到有用的系統(tǒng)/內(nèi)核信息 proc 文件系統(tǒng)可以被用于收集有用的關(guān)于系統(tǒng)和運(yùn)行中的內(nèi)核的信息。下面是一些重要的文件: /proc/cpuinfo - CPU 的信息 (型號(hào), 家族, 緩存大小等) /proc/meminfo - 物理內(nèi)存、交換空間等的信息 /proc/mounts - 已加載的文件系統(tǒng)的列表 /proc/devices - 可用設(shè)備的列表 /proc/filesystems - 被支持的文件系統(tǒng) /proc/modules - 已加載的模塊 /proc/version - 內(nèi)核版本 /proc/cmdline - 系統(tǒng)啟動(dòng)時(shí)輸入的內(nèi)核命令行參數(shù) proc 中的文件遠(yuǎn)不止上面列出的這么多。想要進(jìn)一步了解的讀者可以對(duì) /proc 的每一個(gè)文件都'more'一下或讀參考文獻(xiàn)[1]獲取更多的有關(guān) /proc 目錄中的文件的信息。我建議使用'more'而不是'cat',除非你知道這個(gè)文件很小,因?yàn)橛行┪募?(比如 kcore) 可能會(huì)非常長。 有關(guān)運(yùn)行中的進(jìn)程的信息 /proc 文件系統(tǒng)可以用于獲取運(yùn)行中的進(jìn)程的信息。在 /proc 中有一些編號(hào)的子目錄。每個(gè)編號(hào)的目錄對(duì)應(yīng)一個(gè)進(jìn)程 id (PID)。這樣,每一個(gè)運(yùn)行中的進(jìn)程 /proc 中都有一個(gè)用它的 PID 命名的目錄。這些子目錄中包含可以提供有關(guān)進(jìn)程的狀態(tài)和環(huán)境的重要細(xì)節(jié)信息的文件。讓我們試著查找一個(gè)運(yùn)行中的進(jìn)程。 $ ps -aef | grep mozilla root 32558 32425 8 22:53 pts/1 00:01:23 /usr/bin/mozilla 上述命令顯示有一個(gè)正在運(yùn)行的 mozilla 進(jìn)程的 PID 是 32558。相對(duì)應(yīng)的,/proc 中應(yīng)該有一個(gè)名叫 32558 的目錄 $ ls -l /proc/32558 total 0 -r--r--r-- 1 root root 0 Dec 25 22:59 cmdline -r--r--r-- 1 root root 0 Dec 25 22:59 cpu lrwxrwxrwx 1 root root 0 Dec 25 22:59 cwd -> /proc/ -r-------- 1 root root 0 Dec 25 22:59 environ lrwxrwxrwx 1 root root 0 Dec 25 22:59 exe -> /usr/bin/mozilla* dr-x------ 2 root root 0 Dec 25 22:59 fd/ -r--r--r-- 1 root root 0 Dec 25 22:59 maps -rw------- 1 root root 0 Dec 25 22:59 mem -r--r--r-- 1 root root 0 Dec 25 22:59 mounts lrwxrwxrwx 1 root root 0 Dec 25 22:59 root -> // -r--r--r-- 1 root root 0 Dec 25 22:59 stat -r--r--r-- 1 root root 0 Dec 25 22:59 statm -r--r--r-- 1 root root 0 Dec 25 22:59 status 文件 "cmdline" 包含啟動(dòng)進(jìn)程時(shí)調(diào)用的命令行。"envir" 進(jìn)程的環(huán)境變兩。 "status" 是進(jìn)程的狀態(tài)信息,包括啟動(dòng)進(jìn)程的用戶的用戶ID (UID) 和組ID(GID) ,父進(jìn)程ID (PPID),還有進(jìn)程當(dāng)前的狀態(tài),比如"Sleelping"和"Running"。每個(gè)進(jìn)程的目錄都有幾個(gè)符號(hào)鏈接,"cwd"是指向進(jìn)程當(dāng)前工作目錄的符號(hào)鏈接,"exe"指向運(yùn)行的進(jìn)程的可執(zhí)行程序,"root"指向被這個(gè)進(jìn)程看作是根目錄的目錄 (通常是"/")。目錄"fd"包含指向進(jìn)程使用的文件描述符的鏈接。 "cpu"僅在運(yùn)行 SMP 內(nèi)核時(shí)出現(xiàn),里面是按 CPU 劃分的進(jìn)程時(shí)間。 /proc/self 是一個(gè)有趣的子目錄,它使得程序可以方便地使用 /proc 查找本進(jìn)程地信息。/proc/self 是一個(gè)鏈接到 /proc 中訪問 /proc 的進(jìn)程所對(duì)應(yīng)的 PID 的目錄的符號(hào)鏈接。 通過 /proc 與內(nèi)核交互 上面討論的大部分 /proc 的文件是只讀的。而實(shí)際上 /proc 文件系統(tǒng)通過 /proc 中可讀寫的文件提供了對(duì)內(nèi)核的交互機(jī)制。寫這些文件可以改變內(nèi)核的狀態(tài),因而要慎重改動(dòng)這些文件。/proc/sys 目錄存放所有可讀寫的文件的目錄,可以被用于改變內(nèi)核行為。 /proc/sys/kernel - 這個(gè)目錄包含反通用內(nèi)核行為的信息。 /proc/sys/kernel/{domainname, hostname} 存放著機(jī)器/網(wǎng)絡(luò)的域名和主機(jī)名。這些文件可以用于修改這些名字。 $ hostname machinename.domainname.com $ cat /proc/sys/kernel/domainname domainname.com $ cat /proc/sys/kernel/hostname machinename $ echo "new-machinename" > /proc/sys/kernel/hostname $ hostname new-machinename.domainname.com 這樣,通過修改 /proc 文件系統(tǒng)中的文件,我們可以修改主機(jī)名。很多其他可配置的文件存在于 /proc/sys/kernel/。這里不可能列出所有這些文件,讀者可以自己去這個(gè)目錄查看以得到更多細(xì)節(jié)信息。 另一個(gè)可配置的目錄是 /proc/sys/net。這個(gè)目錄中的文件可以用于修改機(jī)器/網(wǎng)絡(luò)的網(wǎng)絡(luò)屬性。比如,簡單修改一個(gè)文件,你可以在網(wǎng)絡(luò)上癮藏匿的計(jì)算機(jī)。 $ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 這將在網(wǎng)絡(luò)上癮藏你的機(jī)器,因?yàn)樗豁憫?yīng) icmp_echo。主機(jī)將不會(huì)響應(yīng)其他主機(jī)發(fā)出的 ping 查詢。 $ ping machinename.domainname.com no answer from machinename.domainname.com 要改回缺省設(shè)置,只要 $ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all /proc/sys 下還有許多其它可以用于改變內(nèi)核屬性。讀者可以通過參考文獻(xiàn) [1], [2] 獲取更多信息。 結(jié)論 /proc 文件系統(tǒng)提供了一個(gè)基于文件的 Linux 內(nèi)部接口。它可以用于確定系統(tǒng)的各種不同設(shè)備和進(jìn)程的狀態(tài)。對(duì)他們進(jìn)行配置。因而,理解和應(yīng)用有關(guān)這個(gè)文件系統(tǒng)的知識(shí)是理解你的 Linux 系統(tǒng)的關(guān)鍵。 參考文獻(xiàn) [1] 有關(guān)Linux proc 文件系統(tǒng)的文檔位于: /usr/src/linux/Documentation/filesystems/proc.txt [2] RedHat Guide: The /proc File System: http://www.redhat.com/docs/manuals/linux/RHL-7.3-Manual/ref-guide/ch-proc.html |
頂! |