對於每個Linux學習者來講,瞭解Linux文件系統的目錄結構,是學好Linux的相當重要的一步.,深刻了解linux文件目錄結構的標準和每一個目錄的詳細功能,對於咱們用好linux系統相當只要,下面咱們就開始瞭解一下linux目錄結構的相關知識。php
當在使用Linux的時候,若是您經過ls –l / 就會發現,在/下包涵不少的目錄,好比etc、usr、var、bin ... ... 等目錄,而在這些目錄中,咱們進去看看,發現也有不少的目錄或文件。文件系統在Linux下看上去就象樹形結構,因此咱們能夠把文件系統的結構形象的稱爲 樹形結構。html
文件系統的是用來組織和排列文件存取的,因此她是可見的,在Linux中,咱們能夠經過ls等工具來查看其結構,在Linux系統中,咱們見到的都是樹形結構;好比操做系統安裝在一個文件系統中,他表現爲由/ 起始的樹形結構。linux文件系統的最頂端是/,咱們稱/爲Linux的root,也就是 Linux操做系統的文件系統。Linux的文件系統的入口就是/,全部的目錄、文件、設備都在/之下,/就是Linux文件系統的組織者,也是最上級的領導者。java
因爲linux是開放源代碼,各大公司和團體根據linux的核心代碼作各自的操做,編程。這樣就形成在根下的目錄的不一樣。這樣就形成我的不能使用他人的linux系統的PC。由於你根本不知道一些基本的配置,文件在哪裏。。。這就形成了混亂。這就是FHS(Filesystem Hierarchy Standard )機構誕生的緣由。該機構是linux愛好者自發的組成的一個團體,主要是是對linux作一些基本的要求,不至因而操做者換一臺主機就成了linux的‘文盲’。mysql
根據FHS(http://www.pathname.com/fhs/)的官方文件指出, 他們的主要目的是但願讓使用者能夠了解到已安裝軟件一般放置於那個目錄下, 因此他們但願獨立的軟件開發商、操做系統製做者、以及想要維護系統的用戶,都可以遵循FHS的標準。 也就是說,FHS的重點在於規範每一個特定的目錄下應該要放置什麼樣子的數據而已。 這樣作好處很是多,由於Linux操做系統就可以在既有的面貌下(目錄架構不變)發展出開發者想要的獨特風格。linux
事實上,FHS是根據過去的經驗一直再持續的改版的,FHS依據文件系統使用的頻繁與否與是否容許使用者隨意更動, 而將目錄定義成爲四種交互做用的形態,用表格來講有點像底下這樣:c++
可分享的(shareable)sql |
不可分享的(unshareable)數據庫 |
|
不變的(static)編程 |
/usr (軟件放置處)緩存 |
/etc (配置文件) |
/opt (第三方合力軟件) |
/boot (開機與核心檔) |
|
可變更的(variable) |
/var/mail (使用者郵件信箱) |
/var/run (程序相關) |
/var/spool/news (新聞組) |
/var/lock (程序相關) |
四中類型:
1. 可分享的:
能夠分享給其餘系統掛載使用的目錄,因此包括執行文件與用戶的郵件等數據, 是可以分享給網絡上其餘主機掛載用的目錄;
2. 不可分享的:
本身機器上面運做的裝置文件或者是與程序有關的socket文件等, 因爲僅與自身機器有關,因此固然就不適合分享給其餘主機了。
3. 不變的:
有些數據是不會常常變更的,跟隨着distribution而不變更。 例如函式庫、文件說明文件、系統管理員所管理的主機服務配置文件等等;
4. 可變更的:
常常改變的數據,例如登陸文件、通常用戶可自行收受的新聞組等。
事實上,FHS針對目錄樹架構僅定義出三層目錄底下應該放置什麼數據而已,分別是底下這三個目錄的定義:
/ (root, 根目錄):與開機系統有關;
/usr (unix software resource):與軟件安裝/執行有關;
/var (variable):與系統運做過程有關。
一. 根目錄 (/) 的意義與內容:
根目錄是整個系統最重要的一個目錄,由於不但全部的目錄都是由根目錄衍生出來的, 同時根目錄也與開機/還原/系統修復等動做有關。 因爲系統開機時須要特定的開機軟件、核心文件、開機所需程序、 函式庫等等文件數據,若系統出現錯誤時,根目錄也必需要包含有可以修復文件系統的程序才行。 由於根目錄是這麼的重要,因此在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 |
系統主要的設定檔幾乎都放置在這個目錄內,例如人員的賬號密碼檔、各類服務的啓始檔等等。 通常來講,這個目錄下的各檔案屬性是可讓通常使用者查閱的,可是隻有root有權力修改。 FHS建議不要放置可執行檔(binary)在這個目錄中。 比較重要的檔案有:/etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等等。 另外,其下重要的目錄有:/etc/init.d/ :全部服務的預設啓動script都是放在這裏的,例如要啓動或者關閉iptables的話: /etc/init.d/iptables start、/etc/init.d/ iptables stop /etc/xinetd.d/ :這就是所謂的super daemon管理的各項服務的設定檔目錄。 /etc/X11/ :與X Window有關的各類設定檔都在這裏,尤爲是xorg.conf或XF86Config這兩個X Server的設定檔。 |
/home |
這是系統預設的使用者家目錄(home directory)。 在你新增一個通常使用者賬號時,預設的使用者家目錄都會規範到這裏來。比較重要的是,家目錄有兩種代號: ~ :表明當前使用者的家目錄,而 ~guest:則表明用戶名爲guest的家目錄。 |
/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 |
Linux有很是多指令是用來設定系統環境的,這些指令只有root纔可以利用來設定系統,其餘使用者最多隻能用來查詢而已。放在/sbin底下的爲開機過程當中所須要的,裏面包括了開機、修復、還原系統所須要的指令。至於某些伺服器軟體程式,通常則放置到/usr/sbin/當中。至於本機自行安裝的軟體所產生的系統執行檔(system binary),則放置到/usr/local/sbin/當中了。常見的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。 |
/srv |
srv能夠視爲service的縮寫,是一些網路服務啓動以後,這些服務所須要取用的資料目錄。 常見的服務例如WWW, FTP等等。 舉例來講,WWW伺服器須要的網頁資料就能夠放置在/srv/www/裏面。呵呵,看來平時咱們編寫的代碼應該放到這裏了。 |
/tmp |
這是讓通常使用者或者是正在執行的程序暫時放置檔案的地方。這個目錄是任何人都可以存取的,因此你須要按期的清理一下。固然,重要資料不可放置在此目錄啊。 由於FHS甚至建議在開機時,應該要將/tmp下的資料都刪除。 |
事實上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:重要的系統執行文件
這五個目錄千萬不可與根目錄分開在不一樣的分區。請背下來啊。
二. /usr 的意義與內容:
依據FHS的基本定義,/usr裏面放置的數據屬於可分享的與不可變更的(shareable, static), 若是你知道如何透過網絡進行分區的掛載(例如在服務器篇會談到的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的意思。至於核心原始碼則建議放置到/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) 服務器掛載某特定目錄等。
每個文件在此目錄樹中的文件名(包含完整路徑)都是獨一無二的。
若是咱們將整個目錄樹以圖的方法來顯示,而且將較爲重要的文件數據列出來的話,那麼目錄樹架構就以下圖所示:
五. 絕對路徑與相對路徑
除了須要特別注意的FHS目錄配置外,在文件名部分咱們也要特別注意。由於根據檔名寫法的不一樣,也可將所謂的路徑(path)定義爲絕對路徑(absolute)與相對路徑(relative)。 這兩種文件名/路徑的寫法依據是這樣的:
絕對路徑:
由根目錄(/)開始寫起的文件名或目錄名稱, 例如 /home/dmtsai/.bashrc;
相對路徑:
相對於目前路徑的文件名寫法。 例如 ./home/dmtsai 或 http://www.cnblogs.com/home/dmtsai/ 等等。反正開頭不是 / 就屬於相對路徑的寫法
而你必需要了解,相對路徑是以你當前所在路徑的相對位置來表示的。舉例來講,你目前在 /home 這個目錄下, 若是想要進入 /var/log 這個目錄時,能夠怎麼寫呢?
cd /var/log (absolute)
cd ../var/log (relative)
由於你在 /home 底下,因此要回到上一層 (../) 以後,才能繼續往 /var 來移動的,特別注意這兩個特殊的目錄:
. :表明當前的目錄,也可使用 ./ 來表示;
.. :表明上一層目錄,也能夠 ../ 來表明。
這個 . 與 .. 目錄概念是很重要的,你經常會看到 cd .. 或 ./command 之類的指令下達方式, 就是表明上一層與目前所在目錄的工做狀態。
實例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之類的數據,這個指令的意義爲什麼?
說明:
因爲指令的執行須要變量的支持,若你的執行文件放置在本目錄,而且本目錄並不是正規的執行文件目錄(/bin, /usr/bin等爲正規),此時要執行指令就得要嚴格指定該執行檔。./表明本目錄的意思,因此./run.sh表明執行本目錄下, 名爲run.sh的文件。
參考資料:《鳥哥的linux私房菜》