使用 /proc 文件系統來控制系統
來源:網絡轉載 日期:2006/05/20 15:51
-->
級別:中級
作者:Graham White(gwhite at uk.ibm.com)
IT 專家,Hursley,IBM
2003 年 8 月
/proc 文件系統是 Linux 的優秀特性之一,本文向你周詳講述了他的一些最實用的基礎知識。使用 /proc,你再也不用關閉并重新引導機器來管理操作系統的許多細節問題,這對那些需求系統的可用性盡可能高的管理員來說非常有用。
所有管理過具有商業重要性的系統的人都知道計算機正常運行時間的價值 - 或反過來講,知道用戶因故障時間會給你帶來諸多頭痛問題。公司采用 UNIX 服務器的主要原因之一是由于他的可靠性和穩定性。如果仔細管理,通常能非常長時間不需重啟這些服務器。為了做到盡善盡美,你能實時執行一些管理任務,甚至是內核這一級別的任務,從而保持服務器的可用性。雖然因升級硬件或因某人踢掉電源線而仍需要重啟系統,但了解到許多管理任務能在不干擾服務的情況下執行,總是有益的。
本文提供了不必重新引導就能夠執行關于各種管理任務和更改系統的提示和技巧。Linux 提供了各種方法,用以在保持系統正常運行的情況下,更改底層操作系統的值和設置。這些方法有兩種基本形式,一種形式對于所有 Linux 系統都是通用的,并在 Linux 內核中提供這一形式(你能在 Linux Kernel Archives 上查找更多關于 Linux 內核的信息和下載內核原始碼;請參閱參考資料,里面有至 Linux Kernel Archives 的鏈接),更有一種形式是各分發版所獨有的,并且由供給商提供。本文將討論這兩種方法。
更改運行中的內核的參數
Linux 向管理員提供了非常好的方法,使他們能在系統運行時更改內核,而不必重新引導內核/系統。這是通過 /proc 虛擬文件系統實現的。Linux Gazette 給出了一份有關 /proc 的參考,他是我所看到過的最簡單且最容易的參考之一。(請參閱參考資料,其中有至這篇文章的鏈接。)/proc 文件系統主要能讓你查看運行中的內核,這一點對于監視性能、查找系統信息、了解系統是怎么設置的及更改該設置非常有用。該文件系統被稱為虛擬文件系統,因為他實際上根本不是個文件系統。他只是內核提供的一個映射,被附加在通常的文件系統結構之上,從而使你能夠訪問他。
我們能采用某種方法在系統正常運行的同時更改運行中的內核的參數,這一事實賦予了系統管理員在更改內核設置方面強大的能力和高的靈活性。這種實現是出自部分 Linux 內核研發人員富有靈感的想法。但能力太大會是一件壞事嗎?有時確實如此。如果準備更改 /proc 文件系統中的所有內容,你必須確保自己知道在更改什么及這會對系統產生什么影響。這些技術確實有用,但錯誤的舉動會帶來完全不希望得到的結果。如果你不熟悉這方面的內容,或不確定你所做的某項更改會帶來什么影響,那么請在一臺對你或你公司不重要的機器上進行實踐。
怎么更改
首先,考慮怎樣做不會對內核進行更改。有兩條充分的理由說明了為什么不能直接轉換至 /proc 文件系統,用文本編輯器打開一個文件,做一系列更改,然后保存該文件,再退出。這兩條理由是:
數據完整性:所有這些文件描述了運行中的系統,由于內核能隨時更改這些文件中的所有一個,因此如果打開一個編輯器,然后更改某些數據,而同時,系統也正在底層更改這些數據,那么無論你保存下來的所有內容都不可能是內核所期望的內容。
虛擬文件:所有這些文件實際上都不存在。怎么使保存的數據同步,等等?
所以,解決辦法是,不使用編輯器來更改所有這些文件。每當更改 /proc 文件系統中的所有內容時,應該使用 echo 命令,然后從命令行將輸出重定向至 /proc 下所選定的文件中。例如:
echo "Your-New-Kernel-Value" > /proc/your/file
類似的,如果希望查看 /proc 中的信息,應該使用專門用于此用途的命令,或使用命令行下的 cat 命令。
更改什么
要非常好地使用 /proc 不必你是一位內核方面的高手,只需基本了解這個文件系統的結構就能極大地幫助你。直到有一天用戶向你詢問某些特定的功能,使你非常高興曾下功夫了解過在哪里進行更改,你才可能會覺得有必要知道關于 /proc 中的所有事情。在這方面,/proc 文件系統通過其結構和文件許可權幫助系統管理員。
/proc 中的每個文件都有一組分配給他的非常特別的文件許可權,并且每個文件屬于特定的用戶標識。這一點實現得非常仔細,從而提供給管理員和用戶正確的功能。下面這個列表匯總了各個文件上有哪些特定的許可權:
只讀:所有用戶都不能更改該文件;他用于表示系統信息
root 寫:如果 /proc 中的某個文件是可寫的,則通常只能由 root 用戶來寫
root 讀:有些文件對一般系統用戶是不可見的,而只對 root 用戶是可見的
其他:出于各種原因,你可能會看到不同于上面常見的三種許可權的組合
關于 /proc,你會發現最通常的情況是,他的大多數文件是只讀的,除了 /proc/sys 目錄。該目錄下存放著大多數的內核參數(而不是信息),并且設計成能在系統運行的同時進行更改。因此這個目錄是本文的主旨所在。
就更改 /proc 中什么內容而言,要了解的最后一點是,應該向這些文件實際寫些什么。當查看 /proc 中各種文件時,會發現其中一些文件對我們來說是可讀的,一些文件是數據文件。通過用特定的實用程式(譬如 top、lspci 和 free),這些數據文件仍然也可讀。你還會注意到,對我們來說可讀文件有兩種不同格式:一些是二進制開關,另一些包含其他信息。二進制開關文件只包含代表特定內核功能的 0(關)或 1(開)。
進行更改
周詳介紹有關 /proc 中每個文件的用法和確切信息超出了本文所涉及的范圍。要獲得所有關于本文沒有涉及到的 /proc 文件的其他信息,一個最佳來源就是 Linux 內核原始碼本身,他包含了一些非常優秀的文件。對于系統管理員,/proc 中的以下文件較有用。這不意味著他是一份詳盡的說明,而只是日常使用中便于查閱的參考。
/proc/scsi
/proc/scsi/scsi
作為系統管理員,需要了解的最有用內容是,在有熱交換驅動器情況下,怎么不重啟系統就能添加更多磁盤空間。假使不使用 /proc,你能插入驅動器,但為了使系統識別新磁盤,必須隨即重新引導系統。這里,能用以下命令來使系統識別新的驅動器:
echo "scsi add-single-device w x y z" > /proc/scsi/scsi
為使該命令正常運行,必須指定正確的參數值 w、x、y 和 z,如下所示:
w 是主機適配器標識,第一個適配器為零(0)
x 是主機適配器上的 SCSI 通道,第一個通道為零(0)
y 是設備的 SCSI 標識
z 是 LUN 號,第一個 LUN 為零(0)
一旦將磁盤添加到系統中之后,能掛裝所有先前已格式化的文件系統,也能開始對他進行格式化等。例如,如果不確定磁盤是什么設備,或想檢查所有先前已有的分區,則能用如 fdisk -l 這樣的命令來向你報告這方面的信息。
相反的,在不重新引導系統的情況下將設備從系統中除去的命令是:
echo "scsi remove-single-device w x y z" > /proc/scsi/scsi
在輸入這條命令并將熱交換 SCSI 磁盤從系統中除去之前,請確保首先卸下已從該磁盤安裝的所有文件系統。
/proc/sys/fs/
/proc/sys/fs/file-max
該文件指定了能分配的文件句柄的最大數目。如果用戶得到的錯誤消息聲明由于打開文件數已達到了最大值,從而他們不能打開更多文件,則可能需要增加該值。可將這個值設置成有任意多個文件,并且能通過將一個新數字值寫入該文件來更改該值。
缺省設置:4096
/proc/sys/fs/file-nr
該文件和 file-max 相關,他有三個值:
已分配文件句柄的數目
已使用文件句柄的數目
文件句柄的最大數目
該文件是只讀的,僅用于顯示信息。
/proc/sys/fs/inode-*
所有以名稱"inode"開頭的文件所執行的操作和上面那些以名稱"file"開頭的文件所執行的操作相同,但所執行的操作和索引節點有關,而和文件句柄無關。
/proc/sys/fs/overflowuid 和 /proc/sys/fs/overflowgid
這兩個文件分別保存那些支持 16 位用戶標識和組標識的所有文件系統的用戶標識(UID)和組標識(GID)。能更改這些值,但如果你確實覺得需要這樣做,那么你可能會發現更改組和密碼文件項更容易些。
缺省設置:65534
/proc/sys/fs/super-max
該文件指定終極塊處理程式的最大數目。掛裝的所有文件系統需要使用終極塊,所以如果掛裝了大量文件系統,則可能會用盡終極塊處理程式。
缺省設置:256
/proc/sys/fs/super-nr
該文件顯示當前已分配終極塊的數目。該文件是只讀的,僅用于顯示信息。
/proc/sys/kernel
/proc/sys/kernel/acct
該文件有三個可設置值,根據包含日志的文件系統上可用空間的數量(以百分比表示),這些值控制何時開始進行進程記帳:
如果可用空間低于這個百分比值,則停止進程記帳
如果可用空間高于這個百分比值,則開始進程記帳
檢查上面兩個值的頻率(以秒為單位)
要更改這個文件的某個值,應該回送用空格分隔開的一串數字。
缺省設置:2 4 30
如果包含日志的文件系統上只有少于 2% 的可用空間,則這些值會使記帳停止,如果有 4% 或更多可用空間,則再次啟動記帳。每 30 秒做一次檢查。
/proc/sys/kernel/ctrl-alt-del
該文件有一個二進制值,該值控制系統在接收到 ctrl alt delete 按鍵組合時怎么反應。這兩個值表示:
零(0)值表示捕捉 ctrl alt delete,并將其送至 init 程式。這將允許系統能完美地關閉和重啟,就好象你輸入 shutdown 命令相同。
壹(1)值表示不捕捉 ctrl alt delete,將執行非干凈的關閉,就好象直接關閉電源相同。
缺省設置:0
/proc/sys/kernel/domainname
該文件允許你設置網絡
域名。他沒有缺省值,也許已設置了
域名,也許沒有設置。
/proc/sys/kernel/hostname
該文件允許你設置網絡主機名。他沒有缺省值,也許已設置了主機名,也許沒有設置。
/proc/sys/kernel/msgmax
該文件指定了從一個進程發送到另一個進程的消息的最大長度。進程間的消息傳遞是在內核的內存中進行,不會交換到磁盤上,所以如果增加該值,則將增加操作系統所使用的內存數量。
缺省設置:8192
/proc/sys/kernel/msgmnb
該文件指定在一個消息隊列中最大的字節數。
缺省設置:16384
/proc/sys/kernel/msgmni
該文件指定消息隊列標識的最大數目。
缺省設置:16
/proc/sys/kernel/panic
該文件表示如果發生"內核嚴重錯誤(kernel panic)",則內核在重新引導之前等待的時間(以秒為單位)。零(0)秒設置在發生內核嚴重錯誤時將禁止重新引導。
缺省設置:0
/proc/sys/kernel/printk
該文件有四個數字值,他們根據日志記錄消息的重要性,定義將其發送到何處。關于不同日志級別的更多信息,請閱讀 syslog(2) 聯機幫助頁。該文件的四個值為:
控制臺日志級別:優先級高于該值的消息將被打印至控制臺
缺省的消息日志級別:將用該優先級來打印沒有優先級的消息
最低的控制臺日志級別:控制臺日志級別可被設置的最小值(最高優先級)
缺省的控制臺日志級別:控制臺日志級別的缺省值
缺省設置:6 4 1 7
/proc/sys/kernel/shmall
該文件是在所有給定時刻系統上能使用的共享內存的總量(以字節為單位)。
缺省設置:2097152
/proc/sys/kernel/shmax
該文件指定內核所允許的最大共享內存段的大小(以字節為單位)。
缺省設置:33554432
/proc/sys/kernel/shmmni
該文件表示用于整個系統共享內存段的最大數目。
缺省設置:4096
/proc/sys/kernel/sysrq
如果該文件指定的值為非零,則激活 System Request Key。
缺省設置:0
/proc/sys/kernel/threads-max
該文件指定內核所能使用的線程的最大數目。
缺省設置:2048
/proc/sys/net
/proc/sys/net/core/message_burst
寫新的警告消息所需的時間(以 1/10 秒為單位);在這個時間內所接收到的其他警告消息會被丟棄。這用于防止某些企圖用消息"淹沒"你系統的人所使用的拒絕服務(Denial of Service)攻擊。
缺省設置:50(5 秒)
/proc/sys/net/core/message_cost
該文件存有和每個警告消息相關的成本值。該值越大,越有可能忽略警告消息。
缺省設置:5
/proc/sys/net/core/netdev_max_backlog
該文件指定了,在接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
缺省設置:300
/proc/sys/net/core/optmem_max
該文件指定了每個套接字所允許的最大緩沖區的大小。
/proc/sys/net/core/rmem_default
該文件指定了接收套接字緩沖區大小的缺省值(以字節為單位)。
/proc/sys/net/core/rmem_max
該文件指定了接收套接字緩沖區大小的最大值(以字節為單位)。
/proc/sys/net/core/wmem_default
該文件指定了發送套接字緩沖區大小的缺省值(以字節為單位)。
/proc/sys/net/core/wmem_max
該文件指定了發送套接字緩沖區大小的最大值(以字節為單位)。
/proc/sys/net/ipv4
所有 IPv4 和 IPv6 的參數都被記錄在內核原始碼文件中。請參閱文件 /usr/src/linux/Documentation/networking/ip-sysctl.txt。
/proc/sys/net/ipv6
同 IPv4。
/proc/sys/vm
/proc/sys/vm/buffermem
該文件控制用于緩沖區內存的整個系統內存的數量(以百分比表示)。他有三個值,通過把用空格相隔的一串數字寫入該文件來設置這三個值。
用于緩沖區的內存的最低百分比
如果發生所剩系統內存不多,而且系統內存正在減少這種情況,系統將試圖維護緩沖區內存的數量。
用于緩沖區的內存的最高百分比
缺省設置:2 10 60
/proc/sys/vm/freepages
該文件控制系統怎么應對各種級別的可用內存。他有三個值,通過把用空格相隔的一串數字寫入該文件來設置這三個值。
如果系統中可用頁面的數目達到了最低限制,則只允許內核分配一些內存。
如果系統中可用頁面的數目低于這一限制,則內核將以較積極的方式啟動交換,以釋放內存,從而維持系統性能。
內核將試圖保持這個數量的系統內存可用。低于這個值將啟動內核交換。
缺省設置:512 768 1024
/proc/sys/vm/kswapd
該文件控制允許內核怎么交換內存。他有三個值,通過把用空格相隔的一串數字寫入該文件來設置這三個值:
內核試圖一次釋放的最大頁面數目。如果想增加內存交換過程中的帶寬,則需要增加該值。
內核在每次交換中試圖釋放頁面的最少次數。
內核在一次交換中所寫頁面的數目。這對系統性能影響最大。這個值越大,交換的數據越多,花在磁盤尋道上的時間越少。然而,這個值太大會因"淹沒"請求隊列而反過來影響系統性能。
缺省設置:512 32 8
/proc/sys/vm/pagecache
該文件和 /proc/sys/vm/buffermem 的工作內容相同,但他是針對文件的內存映射和一般高速緩存。
使內核設置具有持久性
這里提供了一個方便的實用程式,用于更改 /proc/sys 目錄下的所有內核參數。他使你能更改運行中的內核(類似于上面用到的 echo 和重定向方法),但他更有一個在系統引導時執行的設置文件。這使你能更改運行中的內核,并將這些更改添加到設置文件,以便于在系統重新引導之后,這些更改仍然生效。
該實用程式稱為 sysctl,在 sysctl(8) 的聯機幫助頁中,對這個實用程式進行了完整的文件說明。sysctl 的設置文件是 /etc/sysctl.conf,能編輯該文件,并在 sysctl.conf(8) 下記錄了該文件。sysctl 將 /proc/sys 下的文件視為能更改的單個變量。所以,以 /proc/sys 下的文件 /proc/sys/fs/file-max 為例,他表示系統中所允許的文件句柄的最大數目,這個文件被表示成 fs.file-max。
這個示例揭示了 sysctl 表示法中的一些奇妙事情。由于 sysctl 只能更改 /proc/sys 目錄下的變量,并且人們始終認為變量是在這個目錄下,因此省略了變量名的那一部分(/proc/sys)。另一個要說明的更改是,將目錄分隔符(正斜杠 /)換成了英文中的句號(點 .)。
將 /proc/sys 中的文件轉換成 sysctl 中的變量有兩個簡單的規則:
去掉前面部分 /proc/sys。
將文件名中的正斜杠變為點。
這兩條規則使你能將 /proc/sys 中的任一文件名轉換成 sysctl 中的任一變量名。一般文件到變量的轉換為:
/proc/sys/dir/file --> dir.file
dir1.dir2.file --> /proc/sys/dir1/dir2/file
能使用命令 sysctl -a 查看所有能更改的變量和其當前設置。
用 sysctl 還能更改動量,他所做的工作和上面所用的 echo 方法完全相同。其表示法為:
sysctl -w dir.file="value"
還是用 file-max 作為示例,使用下面兩種方法中的一種將該值更改為 16384:
sysctl -w fs.file-max="16384"
或:
echo "16384" > /proc/sys/fs/file-max
不要忘記 sysctl 不會將所做的更改添加到設置文件中;這要你用手工來完成。如果你希望在重新引導之后,前面所做的更改仍然有效,則必須維護這個設置文件。
注:不是所有的分發版都提供 sysctl 支持。如果你的特定系統屬于這種情況,則能用上面所描述的 echo 和重定向方法,將這些命令添加到啟動腳本中,這樣系統每次引導時,都會執行他們。
用于設置系統的命令
在系統運行的同時更改其他非內核系統參數,而且在不重新引導系統的情況下使這些設置生效,這種做法是可能的。在 /etc/init.d 目錄中列出了包含這些參數的文件,他們主要按服務、守護程式和服務器來分類。由于越來越多各方面的腳本能羅列在這個目錄下,所以這里不可能討論所有各種設置。不過,下面列舉了一些示例,這些示例討論了怎么在不同的 Linux 分發版上操作 /etc/init.d 下的腳本。這里的示例可能非常有用,其中討論了更改守護程式,然后在不重新引導系統的情形下重新裝入設置:
更改 Web 服務器設置,然后重新裝入 Apache
除去不必的 inetd 登錄服務
操作網絡設置
通過 NFS 導出新的文件系統
啟動/停止防火墻
首先,常見的方法是,直接通過 /etc/init.d 中的腳本來操作系統服務。這些腳本用參數來操作他們所控制的服務;能通過輸入腳本名但不帶所有參數這種方法來查看有哪些有效的選項。常見的參數有:
start:啟動已停止的服務
stop:停止正在運行的服務
restart:停止正在運行的服務,然后再重啟該服務;他將啟動已停止的服務
reload:在不中斷所有連接的情況下,重新裝入服務設置
status:報告服務處于運行狀態,還是停止狀態
例如,下面這條命令將在不終止所有已連接的用戶會話的情形下,重新裝入 xinetd 設置(如果你更改了 /etc/xinetd.conf,那么這條命令非常有用):
/etc/init.d/xinetd reload
Red Hat 提供了 service 這條命令,他能為你操作服務。service 命令提供的功能和輸入腳本名本身的功能相同。他的語法如下所示:
service script-name [parameter]
例如:
service xinetd reload
SuSE 也提供名為 rc 的命令。該命令類似于上面的 service 命令,但該命令和腳本名之間沒有空格。他的語法如下所示:
rc{script-name} parameter
例如:
rcapache start
和更改內核參數類似,一旦重新引導系統,則對這些服務的更改將會丟失。目前越來越多的分發版開始采用 chkconfig 命令,他管理在各種運行級別下(包括引導時)啟動的服務。在撰寫本文時,chkconfig 命令的語法會因 Linux 版本的不同而略有差異,不過如果輸入不帶所有參數的命令 chkconfig,則會顯示一個怎么使用該命令的列表。也能通過 chkconfig(8) 的聯機幫助頁找到更多有關 chkconfig 的信息。
結束語
使用 /proc 文件系統實時設置 Linux 內核不是一件輕松的事情,然而一旦了解了該文件系統的結構,及掌控了怎么操作各種文件和參數,則你就擁有了一個功能強大的工具,使你的服務器在所有時候都可用。
致謝
我十分感謝 Adrian Fewings 先生對本文的校對。
關于作者
Graham 于 2000 年 7 月獲得了 Exeter 大學計算機科學和管理科學的理學士學位(榮譽)。在毫無一點經驗的情況下,他于 2000 年 9 月加入了 IBM,從事 IT 支持工作,并且開始學習 Linux。一年后,于 2001 年 9 月,他獲得了 Red Hat 認證工程師。他所從事的工作和個人愛好使他具有了在各個平臺上運行各種版本的 Linux 的經歷,來支持 IBM 位于英國的 Hursley Laboratory 的研發社區。最近,他已撰寫了一些關于 Linux 方面的文章,他的第一部也是唯一的一部出版物被收錄在 Linux Documentation Project 的指南中。能通過 gwhite at uk.ibm.com 和 Graham 聯系。