/proc 文件系統是 Linux 的優秀特性之一,本文向您詳細講述了它的一些最實用的基礎知識。使用 /proc,您再也不用關閉并重新引導機器來管理操作系統的許多細節問題,這對那些要求系統的可用性盡可能高的管理員來說非常有用。
任何管理過具有商業重要性的系統的人都知道計算機正常運行時間的價值 — 或者反過來講,知道用戶因故障時間會給您帶來諸多頭痛問題。公司采用 UNIX 服務器的主要原因之一是由于它的可靠性和穩定性。如果仔細管理,通??梢院荛L時間不需重啟這些服務器。為了做到盡善盡美,您可以實時執行一些管理任務,甚至是內核這一級別的任務,從而保持服務器的可用性。雖然因升級硬件或因某人踢掉電源線而仍需要重啟系統,但了解到許多管理任務可以在不干擾服務的情況下執行,總是有益的。
本文提供了 不需要重新引導就能夠執行關于各種管理任務和更改系統的提示和技巧。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
中的每個文件都有一組分配給它的非常特殊的文件許可權,并且每個文件屬于特定的用戶標識。這一點實現得非常仔細,從而提供給管理員和用戶正確的功能。下面這個列表匯總了各個文件上有哪些特定的許可權:
/proc
中的某個文件是可寫的,則通常只能由 root 用戶來寫 關于 /proc
,您會發現最通常的情況是,它的大多數文件是只讀的,除了 /proc/sys
目錄。該目錄下存放著大多數的內核參數(而不是信息),并且設計成可以在系統運行的同時進行更改。因此這個目錄是本文的主旨所在。
就更改 /proc
中什么內容而言,要了解的最后一點是,應該向這些文件實際寫些什么。當查看 /proc
中各種文件時,會發現其中一些文件對我們來說是可讀的,一些文件是數據文件。通過用特定的實用程序(譬如 top
、 lspci
和 free
),這些數據文件仍然也可讀。您還會注意到,對我們來說可讀文件有兩種不同格式:一些是二進制開關,另一些包含其它信息。二進制開關文件只包含代表特定內核功能的 0(關)或 1(開)。
詳細介紹有關 /proc
中每個文件的用法和確切信息超出了本文所涉及的范圍。要獲得任何關于本文沒有涉及到的 /proc
文件的其它信息,一個最佳來源就是 Linux 內核源代碼本身,它包含了一些非常優秀的文檔。對于系統管理員, /proc
中的以下文件較有用。這不意味著它是一份詳盡的說明,而只是日常使用中便于查閱的參考。
/proc/scsi/scsi
作為系統管理員,需要了解的最有用內容是,在有熱交換驅動器情況下,如何不重啟系統就可以添加更多磁盤空間。假使不使用 /proc
,您可以插入驅動器,但為了使系統識別新磁盤,必須隨即重新引導系統。這里,可以用以下命令來使系統識別新的驅動器:
echo "scsi add-single-device w x y z" > /proc/scsi/scsi
為使該命令正常運行,必須指定正確的參數值 w、x、y 和 z,如下所示:
一旦將磁盤添加到系統中之后,可以掛裝任何先前已格式化的文件系統,也可以開始對它進行格式化等。例如,如果不確定磁盤是什么設備,或者想檢查任何先前已有的分區,則可以用如 fdisk -l
這樣的命令來向您報告這方面的信息。
相反的,在不重新引導系統的情況下將設備從系統中除去的命令是:
echo "scsi remove-single-device w x y z" > /proc/scsi/scsi
在輸入這條命令并將熱交換 SCSI 磁盤從系統中除去之前,請確保首先卸下已從該磁盤安裝的任何文件系統。
/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/aclearcase/" target="_blank" >cct
該文件有三個可配置值,根據包含日志的文件系統上可用空間的數量(以百分比表示),這些值控制何時開始進行進程記帳:
要更改這個文件的某個值,應該回送用空格分隔開的一串數字。
缺省設置:2 4 30
如果包含日志的文件系統上只有少于 2% 的可用空間,則這些值會使記帳停止,如果有 4% 或更多可用空間,則再次啟動記帳。每 30 秒做一次檢查。
/proc/sys/kernel/ctrl-alt-del
該文件有一個二進制值,該值控制系統在接收到 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/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/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 和重定向方法,將這些命令添加到啟動腳本中,這樣系統每次引導時,都會執行它們。
CC">用于設置系統的命令
在系統運行的同時更改其它非內核系統參數,而且在不重新引導系統的情況下使這些設置生效,這種做法是可能的。在 /etc/init.d
目錄中列出了包含這些參數的文件,它們主要按服務、守護程序和服務器來分類。由于越來越多各方面的腳本可以羅列在這個目錄下,所以這里不可能討論所有各種配置。不過,下面列舉了一些示例,這些示例討論了如何在不同的 Linux 分發版上操作 /etc/init.d
下的腳本。這里的示例可能很有用,其中討論了更改守護程序,然后在不重新引導系統的情形下重新裝入配置:
首先,常見的方法是,直接通過 /etc/init.d
中的腳本來操作系統服務。這些腳本用參數來操作它們所控制的服務;可以通過輸入腳本名但不帶任何參數這種方法來查看有哪些有效的選項。常見的參數有:
例如,下面這條命令將在不終止任何已連接的用戶會話的情形下,重新裝入 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
與更改內核參數類似,一旦重新引導系統,則對這些服務的更改將會丟失?,F在越來越多的分發版開始采用 chkconfig
命令,它管理在各種運行級別下(包括引導時)啟動的服務。在撰寫本文時, chkconfig
命令的語法會因 Linux 版本的不同而略有差異,不過如果輸入不帶任何參數的命令 chkconfig
,則會顯示一個如何使用該命令的列表。也可以通過 chkconfig(8) 的聯機幫助頁找到更多有關 chkconfig
的信息。
使用 /proc
文件系統實時配置 Linux 內核不是一件輕松的事情,然而一旦了解了該文件系統的結構,以及掌握了如何操作各種文件和參數,則您就擁有了一個功能強大的工具,使您的服務器在任何時候都可用。
我十分感謝 Adrian Fewings 先生對本文的校對。