每個 Linux 程序都是一個可執行文件,它含有操作碼列表,CPU 將執行這些操作碼來完成特定的操作。例如,ls 命令是由 /bin/ls文件提供的,該文件含有機器指令的列表,在屏幕上顯示當前目錄中文件的列表時需要使用這些機器指令。幾乎每個程序的行為都可以通過修改其配置文件來按照您的偏好或需要去定制。
Linux 中有沒有一個標准的配置文件格式?
一句話,沒有。不熟悉 Linux 的用戶(一定)會感到沮喪,因為每個配置文件看起來都象是一個要迎接的新挑戰。在 Linux中,每個程序員都可以自由選擇他或她喜歡的配置文件格式。可以選擇的格式很多,從 /etc/shells 文件(它包含被一個換行符分開的shell 的列表),到 Apache 的復雜的 /etc/httpd.conf 文件。
什麼是系統配置文件?
內核本身也可以看成是一個“程序”。為什麼內核需要配置文件?內核需要了解系統中用戶和組的列表,進而管理文件權限(即根據權限判定特定用戶(UNIX_USERS)是否可以打開某個文件)。注意,這些文件不是明確地由程序讀取的,而是由系統庫所提供的一個函數讀取,並被內核使用。例如,程序需要某個用戶的(加密過的)密碼時不應該打開 /etc/passwd 文件。相反,程序應該調用系統庫的 getpw()函數。這種函數也被稱為系統調用。打開 /etc/passwd 文件和之後查找那個被請求的用戶的密碼都是由內核(通過系統庫)決定的。
除非另行指定,Red Hat Linux 系統中大多數配置文件都在 /etc 目錄中。配置文件可以大致分為下面幾類:
訪問文件
/etc/host.conf 告訴網絡域名服務器如何查找主機名。(通常是 /etc/hosts,然後就是名稱服務器;可通過.netconf 對其進行更改)
/etc/hosts 包含(本地網絡中)已知主機的一個列表。如果系統的 IP 不是動態生成,就可以使用它。對於簡單的主機名解析(點分表示法),在請求 DNS 或 NIS 網絡名稱服務器之前,/etc/hosts.conf 通常會告訴解析程序先查看這裡。
/etc/hosts.allow 請參閱 hosts_aclearcase/" target="_blank" >ccess 的聯機幫助頁。至少由 tcpd 讀取。
/etc/hosts.deny 請參閱 hosts_access 的聯機幫助頁。至少由 tcpd 讀取。
引導和登錄/注銷
/etc/issue & /etc/issue.net 這些文件由mingetty(和類似的程序)讀取,用來向從終端(issue)或通過 telnet會話(issue.net)連接的用戶顯示一個“welcome”字符串。它們包括幾行聲明 Red Hat 版本號、名稱和內核 ID的信息。它們由 rc.local 使用。
/etc/redhat-release 包括一行聲明 Red Hat 版本號和名稱的信息。由 rc.local 使用。
/etc/rc.d/rc 通常在所有運行級別運行,級別作為參數傳送。例如,要以圖形(Graphics)模式(X-Server)引導機器,請在命令行運行下面的命令:init 5。運行級別 5 表示以圖形模式引導系統。
/etc/rc.d/rc.local 非正式的。可以從 rc、rc.sysinit 或 /etc/inittab 調用。
/etc/rc.d/rc.sysinit 通常是所有運行級別的第一個腳本。
/etc/rc.d/rc/rcX.d 從 rc 運行的腳本(X 表示 1 到 5之間的任意數字)。這些目錄是特定“運行級別”的目錄。當系統啟動時,它會識別要啟動的運行級別,然後調用該運行級別的特定目錄中存在的所有啟動腳本。例如,系統啟動時通常會在引導消息之後顯示“entering run-level 3”的消息;這意味著 /etc/rc.d/rc3.d/目錄中的所有初始化腳本都將被調用。
文件系統
內核提供了一個接口,用來顯示一些它的數據結構,這些數據結構對於決定諸如使用的中斷、初始化的設備和內存統計信息之類的系統參數可能很有用。這個接口是作為一個獨立但虛擬的文件系統提供的,稱為 /proc文件系統。很多系統實用程序都使用這個文件系統中存在的值來顯示系統統計信息。例如,/proc/modules文件列舉系統中當前加載的模塊。lsmod 命令讀取此信息,然後將其以人們可以看懂的格式顯示出來。下面表格中指定的 mtab文件以同樣的方式讀取包含當前安裝的文件系統的 /proc/mount 文件。
/etc/mtab 這將隨著 /proc/mount 文件的改變而不斷改變。換句話說,文件系統被安裝和卸載時,改變會立即反映到此文件中。
/etc/fstab 列舉計算機當前“可以安裝”的文件系統。這非常重要,因為計算機引導時將運行 mount -a 命令,該命令負責安裝 fstab 的倒數第二列中帶有“1”標記的每一個文件系統。
/etc/mtools.conf DOS 類型的文件系統上所有操作(創建目錄、復制、格式化等等)的配置。
系統管理
/etc/group包含有效的組名稱和指定組中包括的用戶。單一用戶如果執行多個任務,可以存在於多個組中。例如,如果一個“用戶”是“project1”工程組的成員,同時也是管理員,那麼在 group 文件中他的條目看起來就會是這樣的:user: * : group-id :project1
/etc/nologin 如果有 /etc/nologin 文件存在,login(1) 將只允許 root 用戶進行訪問。它將對其它用戶顯示此文件的內容並拒絕其登錄。
etc/passwd 請參閱“man passwd”。它包含一些用戶帳號信息,包括密碼(如果未被 shadow 程序加密過)。
/etc/rpmrc rpm 命令配置。所有的 rpm 命令行選項都可以在這個文件中一起設置,這樣,當任何 rpm 命令在該系統中運行時,所有的選項都會全局適用。
/etc/securetty 包含設備名稱,由 tty 行組成(每行一個名稱,不包括前面的 /dev/),root 用戶在這裡被允許登錄。
/etc/usertty
/etc/shadow 包含加密後的用戶帳號密碼信息,還可以包括密碼時效信息。包括的字段有:
登錄名
加密後的密碼
從 1970 年 1 月 1 日到密碼最後一次被更改的天數
距密碼可以更改之前的天數
距密碼必須更改之前的天數
密碼到期前用戶被警告的天數
密碼到期後帳戶被禁用的天數
從 1970 年 1 月 1 日到帳號被禁用的天數
/etc/shells 包含系統可用的可能的“shell”的列表。
/etc/motd 每日消息;在管理員希望向 Linux 服務器的所有用戶傳達某個消息時使用。
聯網
/etc/gated.conf gated 的配置。只能被 gated 守護進程所使用。
/etc/gated.version 包含 gated 守護進程的版本號。
/etc/gateway 由 routed 守護進程可選地使用。
/etc/networks 列舉從機器所連接的網絡可以訪問的網絡名和網絡地址。通過路由命令使用。允許使用網絡名稱。
/etc/protocols 列舉當前可用的協議。請參閱 NAG(網絡管理員指南,Network Administrators Guide)和聯機幫助頁。
C 接口是 getprotoent。絕不能更改。
/etc/resolv.conf 在程序請求“解析”一個 IP 地址時告訴內核應該查詢哪個名稱服務器。
/etc/rpc 包含 RPC 指令/規則,這些指令/規則可以在 NFS 調用、遠程文件系統安裝等中使用。
/etc/exports 要導出的文件系統(NFS)和對它的權限。
/etc/services 將網絡服務名轉換為端口號/協議。由 inetd、telnet、tcpdump 和一些其它程序讀取。有一些 C 訪問例程。
/etc/inetd.conf inetd 的配置文件。請參閱 inetd 聯機幫助頁。包含每個網絡服務的條目,inetd必須為這些網絡服務控制守護進程或其它服務。注意,服務將會運行,但在 /etc/services中將它們注釋掉了,這樣即使這些服務在運行也將不可用。格式為:<service_name> <sock_type><proto> <flags> <user> <server_path><args>
/etc/sendmail.cf 郵件程序 sendmail 的配置文件。比較隱晦,很難理解。
/etc/sysconfig/network 指出 NETWORKING=yes 或 no。至少由 rc.sysinit 讀取。
/etc/sysconfig/network-scripts/if* Red Hat 網絡配置腳本。
系統命令
系統命令要獨占地控制系統,並讓一切正常工作。所有如 login(完成控制台用戶身份驗證階段)或 bash(提供用戶和計算機之間交互)之類的程序都是系統命令。因此,和它們有關的文件也特別重要。這一類別中有下列令用戶和管理員感興趣的文件。
/etc/lilo.conf 包含系統的缺省引導命令行參數,還有啟動時使用的不同映象。您在 LILO 引導提示的時候按 Tab 鍵就可以看到這個列表。
/etc/logrotate.conf 維護 /var/log 目錄中的日志文件。
/etc/identd.conf identd 是一個服務器,它按照 RFC 1413 文檔中指定的方式實現 TCP/IP 提議的標准IDENT 用戶身份識別協議。identd 的操作原理是查找特定 TCP/IP連接並返回擁有此連接的進程的用戶名。作為選擇,它也可以返回其它信息,而不是用戶名。請參閱 identd 聯機幫助頁。
/etc/ld.so.conf “動態鏈接程序”(Dynamic Linker)的配置。
/etc/inittab 按年代來講,這是 UNIX 中第一個配置文件。在一台 UNIX 機器打開之後啟動的第一個程序是init,它知道該啟動什麼,這是由於 inittab 的存在。在運行級別改變時,init 讀取 inittab,然後控制主進程的啟動。
/etc/termcap 一個數據庫,包含所有可能的終端類型以及這些終端的性能。
守護進程
守護進程是一種運行在非交互模式下的程序。一般來說,守護進程任務是和聯網區域有關的:它們等待連接,以便通過連接提供服務。Linux 可以使用從 Web 服務器到 ftp 服務器的很多守護進程。
/etc/syslogd.conf syslogd 守護進程的配置文件。syslogd是一種守護進程,它負責記錄(寫到磁盤)從其它程序發送到系統的消息。這個服務尤其常被某些守護進程所使用,這些守護進程不會有另外的方法來發出可能有問題存在的信號或向用戶發送消息。
/etc/httpd.conf Web 服務器 Apache 的配置文件。這個文件一般不在 /etc 中。它可能在/usr/local/httpd/conf/ 或 /etc/httpd/conf/ 中,但是要確定它的位置,您還需要檢查特定的 Apache安裝信息。
/etc/conf.modules or /etc/modules.conf kerneld 的配置文件。有意思的是,kerneld 並不是“作為守護進程的”內核。它其實是一種在需要時負責“快速”加載附加內核模塊的守護進程。
用戶程序
在 Linux(和一般的 UNIX)中,有無數的“用戶”程序。最常見的一種用戶程序配置文件是 /etc/lynx.cfg。這是著名的文本浏覽器lynx 的配置文件。通過這個文件,您可以定義代理服務器、要使用的字符集等等。下面的代碼樣本展示了 lynx.cfg文件的一部分,修改這部分代碼可以改變 Linux 系統的代理服務器設置。缺省情況下,這些設置適用於在各自的 shell 中運行 lynx的所有用戶,除非某個用戶通過指定 --cfg = "mylynx.cfg" 重設了缺省的配置文件。
/etc/lynx.cfg 中的代理服務器設置
.h1 proxy
.h2 HTTP_PROXY
.h2 HTTPS_PROXY
.h2 FTP_PROXY
.h2 GOPHER_PROXY
.h2 NEWS_PROXY
.h2 NNTP_PROXY
# Lynx version 2.2 and beyond supports the use of proxy servers that can act as
# firewall gateways and caching servers. They are preferable to the older
# gateway servers. Each protocol used by Lynx can be mapped separately using
# PROTOCOL_proxy environment variables (see Lynx Users Guide). If you have
# not set them externally, you can set them at run time via this configuration file.
# They will not override external settings. The no_proxy variable can be used
# to inhibit proxying to selected regions of the Web (see below). Note that on
# VMS these proxy variables are set as process logicals rather than symbols, to
# preserve lowercasing, and will outlive the Lynx image.
#
.ex 15
http_proxy:http://proxy3.in.ibm.com:80/
ftp_proxy:http://proxy3.in.ibm.com:80/
#http_proxy:http://penguin.in.ibm.com:8080
#ftp_proxy:http://penguin.in.ibm.com:8080/
.h2 NO_PROXY
# The no_proxy variable can be a comma-separated list of strings defining
# no-proxy zones in the DNS domain name space. If a tail substring of the
# domain-path for a host matches one of these strings, transactions with that
# node will not be proxied.
.ex
no_proxy:demiurge.in.ibm.com, demiurge
更改配置文件
在更改配置文件時,如果程序不是由系統管理員或內核控制的,就要確保重新啟動過使用該配置的程序。普通用戶通常沒有啟動或停止系統程序和/或守護進程的權限。
內核
更改內核中的配置文件會立即影響到系統。例如,更改 passwd 文件以增加用戶將立即使該用戶變為可用。而且任何 Linux 系統的/proc/sys目錄中都有一些內核可調參數。只有超級用戶可以得到對所有這些文件的寫訪問權力;其它用戶只有只讀訪問權力。此目錄中文件的分類的方式和 Linux內核源代碼的分類方式一樣。此目錄中的每個文件都代表一個內核數據結構,這些數據結構可以被動態地修改,從而改變系統性能。
注意:在更改其中任何文件的任何值之前,您應該確保自己全面了解該文件,以避免對系統造成不可修復的損害。
/proc/sys/kernel/ 目錄中的文件
文件名 描述
threads-max 內核可運行的最大任務數。
ctrl-alt-del 如果值為 1,那麼順序按下這幾個鍵將“徹底地”重新引導系統。
sysrq 如果值為 1,Alt-SysRq 則為激活狀態。
osrelease 顯示操作系統的發行版版本號
ostype 顯示操作系統的類型。
hostname 系統的主機名。
domainname 網絡域,系統是該網絡域的一部分。
modprobe 指定 modprobe 是否應該在啟動時自動運行並加載必需的模塊。
守護進程和系統程序
守護進程是永遠運行在後台的程序,它默默地執行自己的任務。常見的守護進程有 in.ftpd(ftp服務器守護進程)、in.telnetd(telnet 服務器守護進程)和syslogd(系統日志記錄守護進程)。有些守護進程在運行時會嚴密監視配置文件,在配置文件改變時就會自動重新加載它。但是大多數守護進程並不會自動重新加載配置文件。我們需要以某種方式“告訴”這些守護進程配置文件已經被發生了改變並應該重新加載。可以通過使用服務命令重新啟動服務來達到這個目的(在 Red Hat Linux 系統上)。
例如,如果我們更改了網絡配置,就需要發出:
service network restart。
注意:這些服務最常見的是 /etc/rc.d/init.d/* 目錄中存在的腳本,在系統被引導時由 init 啟動。所以,您也可以執行如下操作來重新啟動服務:
/etc/rc.d/init.d/<script-for-the-service> start | stop | status
start、stop 和 status 是這些腳本接受的輸入值,用來執行操作。
用戶程序
用戶或系統程序在每次啟動時都會讀取其配置文件。盡管如此,請記住,有些系統程序在計算機打開時情況不一樣,它們的行為依賴於在 /etc/中的配置文件中讀到的內容。所以,用戶程序第一次啟動時將從 /etc/ 目錄中存在的文件讀取缺省配置。然後,用戶可以通過使用 rc 和.(點)文件來定制程序,正如下面一節所示。
用戶配置文件:.(點)文件和 rc 文件
我們已經看到怎樣容易地配置程序。但是如果有的人不喜歡在 /etc/ 中配置程序的方式該怎麼辦呢?“普通”用戶不能簡單地進入 /etc然後更改配置文件;從文件系統的角度來看,配置文件的所有者是 root用戶!這就是大多數用戶程序都定義兩個配置文件的原因:第一個是“系統”級別的,位於/etc/;另一個屬於用戶“專用”,可以在他或她的主目錄中找到。
例如,我在我的系統中安裝了非常有用的 wget 實用程序。/etc/ 中有一個 /etc/wgetrc文件。在我的主目錄中,有一個名為 .wgetrc 的文件,它描述了我定制的配置(只有在我,也就是用戶運行 wget命令時,才會加載這個配置文件)。其它用戶在他們自己的主目錄(/home/other)中也可以有 .wgetrc 文件;當然,只有這些用戶運行wget 命令時,才會讀取這個文件。換句話說,/etc/wgetrc 文件為 wget 提供了“缺省”值,而/home/xxx/.wgetrc 文件列舉了某個用戶的“定制項”。重要的是這只是“一般規則”,並非所有情況都如此。例如,一個象 pine一樣的程序,在 /etc/ 中並沒有任何文件,它只在用戶主目錄中有一個定制配置文件,名為 .pinerc。其它程序可能只有 /etc/中的缺省配置文件,而且可能不允許用戶“定制”這些配置文件(/etc 目錄中只有少數 config. 文件是這種情況)。
通常使用的 rc 和 .(點)文件
文件名 描述
~/.bash_login 請參考“man bash”。如果 ~/.bash_profile 不存在,bash 則將 ~/.bash_login 作為 ~/.bash_profile 處理。
~/.bash_logout 請參考“man bash”。在退出時由 bash 登錄 shell 引用。
~/.bash_profile 由 bash 登錄 shell 引用 /etc/profile 之後引用。
~/.bash_history 先前執行的命令的列表。
~/.bashrc 請參考“man bash”。由 bash 非登錄交互式 shell 引用(沒有其它文件)。除非設置了 BASH_ENV 或 ENV,非交互式 shell 不引用任何文件。
~/.emacs 啟動時由 emac 讀取。
~/.forward
如果這裡包含一個電子郵件地址,那麼所有發往 ~ 的所有者的郵件都會被轉發到這個電子郵件地址。
~/.fvwmrc ~/.fvwm2rc fvwm 和 fvwm2(基本的 X Window 管理器)的配置文件。
~/.hushlogin 請參考“man login”。引起“無提示”登錄(沒有郵件通知、上次登錄信息或者 MOD 信息)。
~/.mail.rc 郵件程序的用戶初始化文件。
~/.ncftp/ ncftp 程序的目錄;包含書簽、日志、宏、首選項和跟蹤信息。請參閱 man ncftp。ncftp的目的是為因特網標准文件傳輸協議(Internet standard File TransferProtocol)提供一個強大而靈活的接口。它旨在替換系統所使用的標准的 ftp 程序。
~/.profile 請參考“man bash”。如果 ~/.bash_profile 和 ~/.bash_login 文件不存在,bash則將 ~/.profile 作為 ~/.bash_profile 處理,並被其它繼承 Bourn 的 shell 使用。
~/.pinerc Pine 配置
~/.muttrc Mutt 配置
~/.exrc 這個文件可以控制 vi 的配置。
示例:set ai sm ruler
在此文件中寫入上面一行會讓 vi 設置自動縮進、匹配括號、顯示行號和行-列這幾個選項。
~/.vimrc 缺省的“Vim”配置文件。和 .exrc 一樣。
~/.gtkrc GNOME 工具包(GNOME Toolkit)。
~/.kderc KDE 配置。
~/.netrc ftp 缺省登錄名和密碼。
~/.rhosts 由 r- 工具(如 rsh、rlogin 等等)使用。因為冒充主機很容易,所以安全性非常低。
必須由用戶(~/ 的所有者)或超級用戶擁有。
列出一些主機,用戶可以從這些主機訪問該帳號。
如果是符號鏈接則被忽略。
~/.rpmrc 請參閱“man rpm”。如果 /etc/rpmrc 不存在則由 rpm 讀取。
~/.signature 消息文本,將自動附加在從此帳號發出的郵件末尾。
~/.twmrc twm(The Window Manager)的配置文件。
~/.xinitrc 啟動時由 X 讀取(而不是由 xinit 腳本讀取)。通常會啟動一些程序。
示例:exec /usr/sbin/startkde
如果該文件中存在上面這行內容,那麼在從這個帳號發出 startx 命令時,這一行就會啟動“KDE 視窗管理器”(KDE Window Manager)。
~/.xmodmaprc 此文件被傳送到 xmodmap 程序,而且可以被命名為任何文件(例如 ~/.Xmodmap 和 ~/.keymap.km)。
~/.xserverrc 如果 xinit 可以找到要執行的 X,xinit 就會將該文件作為 X 服務器運行。
~/News/Sent-Message-IDs gnus 的缺省郵件歷史文件。
~/.Xauthority 由 xdm 程序讀和寫,以處理權限。請參閱 X、xdm 和 xauth 聯機幫助頁。
~/.Xdefaults,
~/.Xdefaults-hostname 在主機 hostname 的啟動過程中由 X 應用程序讀取。如果找不到 -hostname 文件,則查找 .Xdefaults 文件。
~/.Xmodmap 指向 .xmodmaprc;Red Hat 有使用這個名稱的 .xinitrc 文件。
~/.Xresources 通常是傳送到 xrdb 以加載 X 資源數據庫的文件的名稱,旨在避免應用程序需要讀取一個很長的 .Xdefaults 文件這樣的情況。(有些情況曾經使用了 ~/.Xres。)
~/mbox
用戶的舊郵件。