深入理解linux根目錄結構

在根目錄(/,也稱爲root)下很多的目錄,比如etc、usr、var、bin、sys...等目錄,而在這些目錄下也有很多的目錄或文件。文件系統在Linux下看上去就是一個樹形結構,linux文件系統的最頂端就是/,所有的目錄、文件、設備都在/之下,/就是Linux文件系統的組織者,也是最上級的領導者。

由於linux是開放源代碼,各大公司和團體根據linux的核心代碼做各自的操作,編程。這樣就造成在根下的目錄的不同。這樣就造成個人不能使用他人的linux系統的PC。因爲你根本不知道一些基本的配置,文件在哪裏。。。這就造成了混亂。這就是FHS(Filesystem Hierarchy Standard)機構誕生的原因。該機構是linux愛好者自發的組成的一個團體,主要是是對linux做一些基本的要求,不至於是操作者換一臺主機就成了linux的‘文盲’。

根據FHS(http://www.pathname.com/fhs/)的官方文件指出,他們的主要目的是希望讓使用者可以瞭解到已安裝軟件通常放置於那個目錄下,所以他們希望獨立的軟件開發商、操作系統製作者、以及想要維護系統的用戶,都能夠遵循FHS的標準。也就是說,FHS的重點在於規範每個特定的目錄下應該要放置什麼樣子的數據而已。這樣做好處非常多,因爲Linux操作系統就能夠在既有的面貌下(目錄架構不變)發展出開發者想要的獨特風格。

事實上,FHS是根據過去的經驗一直再持續的改版的,FHS依據文件系統使用的頻繁與否與是否允許使用者隨意更動,而將目錄定義成爲四種交互作用的形態,用表格來說有點像這樣:

 

可分享的(shareable)

不可分享的(unshareable)

不變的(static)

/usr (軟件放置處)

/etc (配置文件)

/opt (第三方協力軟件)

/boot (開機與核心檔)

可變動的(variable)

/var/mail (使用者郵件信箱)

/var/run (程序相關)

/var/spool/news (新聞組)

/var/lock (程序相關)

四種類型:

1.可分享的:

可以分享給其他系統掛載使用的目錄,所以包括執行文件與用戶的郵件等數據,是能夠分享給網絡上其他主機掛載用的目錄;

2.不可分享的:

自己機器上面運作的裝置文件或者是與程序有關的socket文件等,由於僅與自身機器有關,所以當然就不適合分享給其他主機了。

3.不變的:

有些數據是不會經常變動的,跟隨着distribution而不變動。例如函式庫、文件說明文件、系統管理員所管理的主機服務配置文件等等;

4.可變動的:

經常改變的數據,例如登錄文件、一般用戶可自行收受的新聞組等。

事實上,FHS針對目錄樹架構僅定義出三層目錄底下應該放置什麼數據而已,分別是底下這三個目錄的定義:

/    :與開機系統有關;

/usr :與軟件安裝/執行有關;

/var :與系統運作過程有關。

 

一. 根目錄 (/) 的意義與內容:

根目錄是整個系統最重要的一個目錄,因爲不但所有的目錄都是由根目錄衍生出來的,同時根目錄也與開機/還原/系統修復等動作有關。由於系統開機時需要特定的開機軟件、核心文件、開機所需程序、函式庫等等文件數據,若系統出現錯誤時,根目錄也必須要包含有能夠修復文件系統的程序才行。因爲根目錄是這麼的重要,所以在FHS的要求方面,他希望根目錄不要放在非常大的分區,因爲越大的分區內你會放入越多的數據,如此一來根目錄所在分區就可能會有較多發生錯誤的機會。

因此FHS標準建議:根目錄(/)所在分區應該越小越好,且應用程序所安裝的軟件最好不要與根目錄放在同一個分區內,保持根目錄越小越好。如此不但效能較佳,根目錄所在的文件系統也較不容易發生問題。說白了,就是根目錄和Windows的C盤一個樣。

根據以上原因,FHS認爲根目錄(/)下應該包含如下子目錄:

目錄

應放置檔案內容

/bin

系統有很多放置執行檔的目錄,但/bin比較特殊。因爲/bin放置的是在單人維護模式下還能夠被操作的指令。在/bin底下的指令可以被root與一般帳號所使用,主要有:cat,chmod(修改權限),chown,date,mv,mkdir,cp,bash等等常用的指令。

/boot

主要放置開機會使用到的檔案,包括Linux核心檔案以及開機選單與開機所需設定檔等等。Linux kernel常用的檔名爲:vmlinuz,如果使用的是grub這個開機管理程式,則還會存在/boot/grub/這個目錄。

/dev

在Linux系統上,任何裝置與周邊設備都是以檔案的型態存在於這個目錄當中。只要通過存取這個目錄下的某個檔案,就等於存取某個裝置。比要重要的檔案有/dev/null,/dev/zero,/dev/tty,/dev/lp*,/dev/hd*,/dev/sd*等等

/etc

etc就是Et cetra,表示其他、等等什麼的。該目錄包含系統啓動腳本、服務啓動配置文件、用戶登陸配置文件、網絡配置文件、httpd 配置文件、IPSec 配置文件和其他文件。系統主要的設定檔幾乎都放置在這個目錄內,例如人員的帳號密碼檔、各種服務啓動/停止等等。一般來說,這個目錄下的各檔案屬性是可以讓一般使用者查閱的,但是隻有root有權力修改。FHS建議不要放置可執行檔(binary)在這個目錄中。比較重要的檔案有:/etc/inittab,/etc/init.d/,/etc/modprobe.conf,/etc/X11/,/etc/fstab,/etc/sysconfig/等等。另外,其下重要的目錄有:/etc/init.d/下存放所有服務的預設啓動停止,例如要啓動或者關閉iptables的話:/etc/init.d/iptables start或/etc/init.d/iptables stop

/etc/xinetd.d:就是所謂superdaemon(後臺程序)管理的各項服務的設定檔目錄。

/etc/X11/:與X Window有關的各種設定檔都在這裏,尤其是xorg.conf或XF86Config這兩個X Server的設定檔。

/home

這是系統預設的使用者家目錄(home directory)。在你新增一個一般使用者帳號時,預設的使用者家目錄都會規範到這裏來。比較重要的是,家目錄有兩種代號: 
~:代表當前使用者的家目錄,而~guest:則代表用戶名爲guest的家目錄。cd ~ : 切換到home下面的用戶名目錄下

/lib

系統的函式庫非常的多,而/lib放置的則是在開機時會用到的函式庫,以及在/bin或/sbin底下的指令會呼叫的函式庫而已。什麼是函式庫呢?可以將他想成是外掛,某些指令必須要有這些外掛才能夠順利完成程式的執行之意。尤其重要的是/lib/modules/這個目錄,因爲該目錄會放置核心相關的模組(驅動程式)。

/media

media是媒體的英文,顧名思義,這個/media底下放置的就是可移除的裝置。包括軟碟、光碟、DVD等等裝置都暫時掛載於此。 常見的檔名有:/media/floppy,/media/cdrom等等。

/mnt

如果想要暫時掛載某些額外的裝置,一般建議妳可以放置到這個目錄中。在古早時候,這個目錄的用途與/media相同。只是有了/media之後,這個目錄就用來暫時掛載用了。

/opt

這個是給第三方協力軟體放置的目錄。什麼是第三方協力軟體?舉例來說,KDE這個桌面管理系統是一個獨立的,不過他可以安裝到Linux系統中,因此KDE的軟體就建議放置到此目錄下了。另外,如果妳想要自行安裝額外的軟體(非原本的distribution提供的),那麼也能夠將你的軟體安裝到這裏來。不過,以前的Linux系統中,我們還是習慣放置在/usr/local目錄下。

/root

系統管理員(root)的家目錄。之所以放在這裏,是因爲如果進入單人維護模式而僅掛載根目錄時,該目錄就能夠擁有root的家目錄,所以我們會希望root的家目錄與根目錄放置在同一個分區中。

/sbin

可視爲super bin的縮寫,Linux有非常多指令是用來設定系統環境的,這些指令只有root才能夠利用來設定系統,其他使用者最多隻能用來查詢而已。放在/sbin底下的爲開機過程中所需要的,裏面包括了開機、修復、還原系統所需要的指令。至於某些伺服器軟體程式,一般則放置到/usr/sbin/當中。至於本機自行安裝的軟體所產生的系統執行檔(system binary),則放置到/usr/local/sbin/當中了。常見的指令包括:fdisk,fsck,ifconfig,init,mkfs等等。

/srv

srv可以視爲service的縮寫,是一些網路服務啓動之後,這些服務所需要取用的資料目錄。常見的服務例如WWW,FTP等等。舉例來說,WWW伺服器需要的網頁資料就可以放置在/srv/www/裏面。呵呵,看來平時我們編寫的代碼應該放到這裏了。

/tmp

本意就是temp臨時的意思,這是讓一般使用者或者是正在執行的程序暫時放置檔案的地方。這個目錄是任何人都能夠存取的,所以你需要定期的清理一下。當然,重要資料不可放置在此目錄啊。 因爲FHS甚至建議在開機時,應該要將/tmp下的資料都刪除。

 事實上FHS針對根目錄所定義的標準就僅限於上表,不過FHS標準定義之外的一些目錄也需要我們瞭解一下,具體如下:

目錄

應放置文件內容

/lost+found

這個目錄是使用標準的ext2/ext3檔案系統格式纔會產生的一個目錄,目的在於當檔案系統發生錯誤時,將一些遺失的片段放置到這個目錄下。這個目錄通常會在分割槽的最頂層存在,例如你加裝一個硬盤於/disk中,那在這個系統下就會自動產生一個這樣的目錄/disk/lost+found

/proc

這個目錄本身是一個虛擬文件系統(virtual filesystem)喔。他放置的資料都是在內存當中,例如系統核心、行程資訊(process)(是進程嗎?)、周邊裝置的狀態及網絡狀態等等。因爲這個目錄下的資料都是在記憶體(內存)當中,所以本身不佔任何硬盤空間。比較重要的檔案(目錄)例如: /proc/cpuinfo,/proc/dma,/proc/interrupts,/proc/ioports,/proc/net/*等等。呵呵,是虛擬內存嗎[guest]?

/sys

這個目錄其實跟/proc非常類似,也是一個虛擬的檔案系統,主要也是記錄與核心相關的資訊。 包括目前已載入的核心模組與核心偵測到的硬體裝置資訊等等。 這個目錄同樣不佔硬盤容量。

除了這些目錄的內容之外,另外要注意的是,因爲根目錄與開機有關,開機過程中僅有根目錄會被掛載,其他分區則是在開機完成之後纔會持續的進行掛載的行爲。就是因爲如此,因此根目錄下與開機過程有關的目錄,就不能夠與根目錄放到不同的分區去。那哪些目錄不可與根目錄分開呢?有底下這些:

/etc:配置文件

/bin:重要執行檔

/dev:所需要的裝置文件

/lib:執行檔所需的函式庫與核心所需的模塊

/sbin:重要的系統執行文件

這五個目錄千萬不可與根目錄分開在不同的分區。請背下來啊。 

下面是詳細說明/etc目錄:

目錄

描述

/etc/rc /etc/rc.d

/etc/rc*.d

啓動、或改變運行級時運行的scriptsscripts的目錄.

/etc/hosts

本地域名解析文件

/etc/sysconfig/network/etc/network

注意:RedHatCentOS/etc/sysconfig這個配置目錄,但如Debian是沒有這個目錄的。

IP、掩碼、網關、主機名配置

/etc/resolv.conf

DNS服務器配置

/etc/fstab

開機自動掛載系統,所有分區開機都會自動掛載

/etc/inittab

設定系統啓動時Init進程將把系統設置成什麼樣的runlevel及加載相關的啓動文件配置

/etc/exports

設置NFS系統用的配置文件路徑

/etc/init.d

這個目錄來存放系統啓動腳本

/etc/profile,

/etc/csh.login, /etc/csh.cshrc

全局系統環境配置變量

/etc/issue

認證前的輸出信息,默認輸出版本內核信息

/etc/motd

設置認證後的輸出信息,

/etc/mtab

當前安裝的文件系統列表.scripts初始化,並由mount 命令自動更新.需要一個當前安裝的文件系統的列表時使用,例如df 命令

/etc/group

類似/etc/passwd ,但說明的不是用戶而是組.

/etc/passwd

用戶數據庫,其中的域給出了用戶名、真實姓名、家目錄、加密的口令和用戶的其他信息.

/etc/shadow

在安裝了影子口令軟件的系統上的影子口令文件.影子口令文件將/etc/passwd 文件中的加密口令移動到/etc/shadow 中,而後者只對root可讀.這使破譯口令更困難.

/etc/sudoers

可以sudo命令的配置文件

/etc/syslog.conf

系統日誌參數配置

/etc/login.defs

設置用戶帳號限制的文件

/etc/securetty

確認安全終端,即哪個終端允許root登錄.一般只列出虛擬控制檯,這樣就不可能(至少很困難)通過modem或網絡闖入系統並得到超級用戶特權.

/etc/printcap

類似/etc/termcap ,但針對打印機.語法不同.

/etc/shells

列出可信任的shell.chsh 命令允許用戶在本文件指定範圍內改變登錄shell.提供一臺機器FTP服務的服務進程ftpd 檢查用戶shell是否列在 /etc/shells 文件中,如果不是將不允許該用戶登錄.

/etc/xinetd.d

如果服務器是通過xinetd模式運行的,它的腳本要放在這個目錄下。有些系統沒有這個目錄,比如Slackware,有些老的版本也沒有。在Redhat Fedora中比較新的版本中存在。

/etc/opt/

/opt/的配置文件

/etc/X11/

X_Window系統(版本11)的配置文件

/etc/sgml/

SGML的配置文件

/etc/xml/

XML的配置文件

/etc/skel/

默認創建用戶時,把該目錄拷貝到家目錄下

二./usr的意義與內容:

依據FHS的基本定義,/usr裏面放置的數據屬於可分享的與不可變動的,如果你知道如何透過網絡進行分區的掛載(例如在服務器篇會談到的NFS服務器),那麼/usr確實可以分享給局域網絡內的其他主機來使用。

/usr不是user的縮寫,其實usr是Unix Software Resource的縮寫,也就是Unix操作系統軟件資源所放置的目錄,而不是用戶的數據,這點要注意。FHS建議所有軟件開發者,應該將他們的數據合理的分別放置到這個目錄下的次目錄,而不要自行建立該軟件自己獨立的目錄。

因爲是所有系統默認的軟件(distribution發佈者提供的軟件)都會放置到/usr底下,因此這個目錄有點類似Windows系統的C:\Windows\ + C:\Program files\這兩個目錄的綜合體,系統剛安裝完畢時,這個目錄會佔用最多的硬盤容量。一般來說,/usr的次目錄建議有底下這些:

目錄

應放置文件內容

/usr/X11R6/ 

爲X Window System重要數據所放置的目錄,之所以取名爲X11R6是因爲最後的X版本爲第11版,且該版的第6次釋出之意。 

/usr/bin/ 

絕大部分的用戶可使用指令都放在這裏。請注意到他與/bin的不同之處。(是否與開機過程有關) 

/usr/include/ 

c/c++等程序語言的檔頭(header)與包含檔(include)放置處,當我們以tarball方式 (*.tar.gz 的方式安裝軟件)安裝某些數據時,會使用到裏頭的許多包含檔。 

/usr/lib/ 

包含各應用軟件的函式庫、目標文件(object file),以及不被一般使用者慣用的執行檔或腳本(script)。 某些軟件會提供一些特殊的指令來進行服務器的設定,這些指令也不會經常被系統管理員操作, 那就會被擺放到這個目錄下啦。要注意的是,如果你使用的是X86_64的Linux系統, 那可能會有/usr/lib64/目錄產生 

/usr/local/ 

統管理員在本機自行安裝自己下載的軟件(非distribution默認提供者),建議安裝到此目錄, 這樣會比較便於管理。舉例來說,你的distribution提供的軟件較舊,你想安裝較新的軟件但又不想移除舊版, 此時你可以將新版軟件安裝於/usr/local/目錄下,可與原先的舊版軟件有分別啦。 你可以自行到/usr/local去看看,該目錄下也是具有bin,etc,include,lib...的次目錄 

/usr/sbin/ 

非系統正常運作所需要的系統指令。最常見的就是某些網絡服務器軟件的服務指令(daemon, ) 

/usr/share/ 

放置共享文件的地方,在這個目錄下放置的數據幾乎是不分硬件架構均可讀取的數據, 因爲幾乎都是文本文件。在此目錄下常見的還有這些次目錄:/usr/share/man:聯機幫助文件

/usr/share/doc:軟件雜項的文件說明

/usr/share/zoneinfo:與時區有關的時區文件

/usr/src/ 

src有source的意思。linux核心源碼放置到/usr/src/linux/目錄下。 

 

三./var的意義與內容:

如果/usr是安裝時會佔用較大硬盤容量的目錄,那麼/var就是在系統運作後纔會漸漸佔用硬盤容量的目錄。因爲/var目錄主要針對常態性變動的文件,包括緩存(cache)、登錄檔(log file)以及某些軟件運作所產生的文件,包括程序文件(lock file,run file),或者例如MySQL數據庫的文件等等。常見的次目錄有:

目錄

應放置文件內容

/var/cache/

應用程序本身運作過程中會產生的一些暫存檔

/var/lib/

程序本身執行的過程中,需要使用到的數據文件放置的目錄。在此目錄下各自的軟件應該要有各自的目錄。舉例來說,MySQL的數據庫放置到/var/lib/mysql/而rpm的數據庫則放到/var/lib/rpm去

/var/lock/

某些裝置或者是文件資源一次只能被一個應用程序所使用,如果同時有兩個程序使用該裝置時,就可能產生一些錯誤的狀況,因此就得要將該裝置上鎖(lock),以確保該裝置只會給單一軟件所使用。舉例來說,刻錄機正在刻錄一塊光盤,你想一下,會不會有兩個人同時在使用一個刻錄機燒片?如果兩個人同時刻錄,那片子寫入的是誰的數據?所以當第一個人在刻錄時該刻錄機就會被上鎖,第二個人就得要該裝置被解除鎖定(就是前一個人用完了)才能夠繼續使用

/var/log/

非常重要。這是登錄文件放置的目錄。裏面比較重要的文件如/var/log/messages,/var/log/wtmp(記錄登入者的信息)等。

/var/mail/

放置個人電子郵件信箱的目錄,不過這個目錄也被放置到/var/spool/mail/目錄中,通常這兩個目錄是互爲鏈接文件。

/var/run/

某些程序或者是服務啓動後,會將他們的PID放置在這個目錄下

/var/spool/

這個目錄通常放置一些隊列數據,所謂的“隊列”就是排隊等待其他程序使用的數據。這些數據被使用後通常都會被刪除。舉例來說,系統收到新信會放置到/var/spool/mail/中,但使用者收下該信件後該封信原則上就會被刪除。信件如果暫時寄不出去會被放到/var/spool/mqueue/中,等到被送出後就被刪除。如果是工作排程數據(crontab),就會被放置到/var/spool/cron/目錄中。

由於FHS僅是定義出最上層(/)及次層(/usr,/var)的目錄內容應該要放置的文件或目錄數據,因此,在其他次目錄層級內,就可以隨開發者自行來配置了。

四. 目錄樹(directory tree):

在Linux底下,所有的文件與目錄都是由根目錄開始的。那是所有目錄與文件的源頭,然後再一個一個的分支下來,因此,我們也稱這種目錄配置方式爲:目錄樹(directory tree),這個目錄樹的主要特性有:

① 目錄樹的啓始點爲根目錄(/,root);
② 每一個目錄不止能使用本地端的partition的文件系統,也可以使用網絡上的filesystem。舉例來說,可以利用Network File System (NFS)服務器掛載某特定目錄等。
③每一個文件在此目錄樹中的文件名(包含完整路徑)都是獨一無二的。

錄樹架構就如下圖所示:

五. 絕對路徑與相對路徑

絕對路徑:

由根目錄(/)開始寫起的文件名或目錄名稱,例如/home/dmtsai/.bashrc;

相對路徑:

相對路徑是以你當前所在路徑的相對位置來表示的。例如./home/dmtsai或http://www.cnblogs.com等等。反正開頭不是/就屬於相對路徑

特別注意這兩個特殊的目錄:

.  :代表當前的目錄,也可以使用 ./ 來表示;

.. :代表上一層目錄,也可以 ../ 來代表。

實例1:如何先進入/var/spool/mail/目錄,再進入到/var/spool/cron/目錄內?
cd /var/spool/mail
cd ../cron

說明:由於/var/spool/mail與/var/spool/cron是同樣在/var/spool/目錄中。如此就不需要在由根目錄開始寫起了。這個相對路徑是非常有幫助的,尤其對於某些軟件開發商來說。一般來說,軟件開發商會將數據放置到/usr/local/裏面的各相對目錄。但如果用戶想要安裝到不同目錄呢?就得要使用相對路徑。

實例2:比如網絡文件run.sh在/home/wang/下面,此時路徑已經處於home/wang/這裏了,爲什麼不能直接執行run.sh執行腳本,而是要執行指令./run.sh?
說明:若你的執行文件放置在本目錄,並且本目錄並非正規的執行文件目錄(/bin,/usr/bin等稱爲正規的執行文件目錄),此時要執行指令就得要嚴格指定該執行目錄。./代表本目錄的意思,所以./run.sh代表執行本目錄下, 名爲run.sh的文件。

參見:“https://m.jb51.net/LINUXjishu/151820.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章