文件系統是linux的一個十分基礎的知識,同時也是學習linux的必備知識。node
本文將站在一個較高的視圖來了解linux的文件系統,主要包括了linux磁盤分區和目錄、掛載基本原理、文件存儲結構、軟連接硬連接、和常見目錄的介紹。相信有了這些知識對於深刻的學習linux會有必定的幫助。文章例子主要是基於ubuntu發行版。linux
若有不對之處請你們多多指出。數據庫
1.Linux磁盤分區和目錄 ubuntu
Linux發行版本之間的差異不多,差異主要表如今系統管理的特點工具以及軟件包管理方式的不一樣。目錄結構基本上都是同樣的。 Windows的文件結構是多個並列的樹狀結構,最頂部的是不一樣的磁盤(分區),如:C,D,E,F等。windows
Linux的文件結構是單個的樹狀結構.能夠用tree進行展現。 在Ubuntu下安裝tree(sudo apt-get install tree),並可經過命令來查看。服務器
每次安裝系統的時候咱們都會進行分區,Linux下磁盤分區和目錄的關係以下:網絡
– 任何一個分區都必須掛載到某個目錄上。 less
– 目錄是邏輯上的區分。分區是物理上的區分。 ssh
– 磁盤Linux分區都必須掛載到目錄樹中的某個具體的目錄上才能進行讀寫操做。 工具
– 根目錄是全部Linux的文件和目錄所在的地方,須要掛載上一個磁盤分區。
如下是咱們可能存在的一種目錄和分區關係:
圖1:目錄和分區關係
Q:如何查看分區和目錄及使用狀況?
– fdisk查看硬盤分區表
– df:查看分區使用狀況
– du: 查看文件佔用空間狀況
Q: 爲何要分區,如何分區?
– 能夠把不一樣資料,分別放入不一樣分區中管理,下降風險。
– 大硬盤搜索範圍大,效率低
– 磁盤配合只能對分區作設定
– /home /var /usr/local常常是單獨分區,由於常常會操做,容易產生碎片
2.Mount掛載和NFS簡介
掛載的概念 :當要使用某個設備時,例如要讀取硬盤中的一個格式化好的分區、光盤或軟件等設備時,必須先把這些設備對應到某個目錄上,而這個目錄就稱爲「掛載點(mount point)」,這樣才能夠讀取這些設備,而這些對應的動做就是「掛載」。 將物理分區細節屏蔽掉。用戶只有統一的邏輯概念。全部的東西都是文件。Mount命令能夠實現掛載:
mount [-fnrsvw] [-t vfstype] [-o options] device dir
Q:全部的磁盤分區都必須被掛載上才能使用,那麼咱們機器上的硬盤分區是如何被掛載的?
A:這主要是它利用了/etc/fstab文件。每次內核加載它知道從這裏開始mount文件系統。每次系統啓動會根據該文件定義自動掛載。若沒有被自動掛載,分區將不能使用。 以下是個人/etc/fstab的定義,主要是根據裝機的分區來的:
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
#/dev/sda1被自動掛載到 /
UUID=cb1934d0-4b72-4bbf-9fad-885d2a8eeeb1 / ext3 relatime,errors=remount-ro 0 1
# /dev/sda5 被自動掛載到分區/home
UUID=c40f813b-bb0e-463e-aa85-5092a17c9b94 /home ext3 relatime 0 2
#/dev/sda7 被自動掛載到/work
UUID=0f918e7e-721a-41c6-af82-f92352a568af /work ext3 relatime 0 2
#分區 /dev/sda6被自動掛載到swap
UUID=2f8bdd05-6f8e-4a6b-b166-12bb52591a1f none swap sw 0 0
Q:移動硬盤如何掛載?如何掛載一個新的分區?
移動硬盤有驅動模塊會自動掛載,若是有個新硬盤,要先進行分區,並經過mount命令掛載到某個文件夾。若是要自動掛載則能夠修改/etc/fstab文件.
NFS簡介:NFS相信在不少地方都有普遍使用,是一個很是好的文件共享方式。咱們公司所使用的上傳服務就是把文件上傳到某臺網絡服務器上,中間就是經過NFS實現。
使用NFS客戶端能夠透明的地訪問服務器端的文件。NFS也是經過mount來實現,底層是經過NFS通訊協議實現。基本原理:
圖2:NFS基本原理
Ubuntu下面Ubuntu下的例子
服務端:
$apt-get install nfs-kernel-server
vi /etc/exports 添加nfs目錄: /personal/nfs_share
10.1.60.34(rw,sync,no_root_squash)
$sudo exportfs -r
$sudo /etc/init.d/portmap start
$sudo /etc/init.d/nfs-kernel-server start
客戶端:
$sudo apt-get install nfs-common
$sudo mount 10.19.34.76:/personal/nfs_share ~/nfsshare例子:
3.文件類型
Linux下面的文件類型主要有:
a) 普通文件:C語言元代碼、SHELL腳本、二進制的可執行文件等。分爲純文本和二進制。
b) 目錄文件:目錄,存儲文件的惟一地方。
c) 連接文件:指向同一個文件或目錄的的文件。
d) 特殊文件:與系統外設相關的,一般在/dev下面。分爲塊設備和字符設備。
能夠經過ls –l, file, stat幾個命令來查看文件的類型等相關信息。
4.文件存儲結構
Linux正統的文件系統(如ext二、ext3)一個文件由目錄項、inode和數據塊組成。
目錄項:包括文件名和inode節點號。
Inode:又稱文件索引節點,是文件基本信息的存放地和數據塊指針存放地。
數據塊:文件的具體內容存放地。
Linux正統的文件系統(如ext2、3等)將硬盤分區時會劃分出目錄塊、inode Table區塊和data block數據區域。一個文件由一個目錄項、inode和數據區域塊組成。Inode包含文件的屬性(如讀寫屬性、owner等,以及指向數據塊的指針),數據區域塊則是文件內容。當查看某個文件時,會先從inode table中查出文件屬性及數據存放點,再從數據塊中讀取數據。
站在2w英尺視圖,文件存儲結構大概以下:
圖3:文件存儲結構2w英尺視圖
其中目錄項的結構以下(每一個文件的目錄項存儲在改文件所屬目錄的文件內容裏):
圖4:目錄項結構
其中文件的inode結構以下(inode裏所包含的文件信息能夠經過stat filename查看獲得):
圖5:inode結構
以上只反映大致的結構,linux文件系統自己在不斷髮展。可是以上概念基本是不變的。且如ext2、ext3、ext4文件系統也存在很大差異,若是要了解能夠查看專門的文件系統介紹。
5.軟鏈接、硬連接
軟連接和硬連接是咱們常見的兩種概念:
硬鏈接:是給文件一個副本,同時創建二者之間的鏈接關係。修改其中一個,與其鏈接的文件同時被修改。若是刪除其中[color=red]任意一個[/color]其他的文件將不受影響。
軟鏈接:也叫符號鏈接,他只是對源文件在新的位置創建一個「快捷(借用一下wondows經常使用詞)」,因此,當源文件刪除時,符號鏈接的文件將成爲無源之水->僅僅剩下個文件名了,固然刪除這個鏈接,也不會影響到源文件,但對鏈接文件的使用、引用都是直接調用源文件的。
具體關係能夠看下圖:
圖5:軟連接和硬連接
從圖上能夠看出硬連接和軟連接的區別:
1:硬連接原文件和新文件的inode編號一致。而軟連接不同。
2:對原文件刪除,會致使軟連接不可用,而硬連接不受影響。
3:對原文件的修改,軟、硬連接文件內容也同樣的修改,由於都是指向同一個文件內容的。
6.文件目錄管理命令
磁盤和文件空間
fdisk df du
文件目錄與管理
cd pwd mkdir rmdir ls cp rm mv
查看文件內容
cat:
cat [file]
查看文件的內容。全程式concatenate的意思,將文件內容連續輸出到屏幕上。第一行到最後一行顯示。
tac:
tac [file]
和cat恰好相反 是從最後一行到第一行的方式查看。
cat有個比較很差的地方時當文件比較大時候沒辦法看清楚,這個時候能夠用more或者Less命令。
more:
more [file]
若是使用grep或者find等命令時,能夠配合使用more一頁一頁的查看。若是看到一半想退出,則敲入’q’便可退出。
less:
less [file]
less比more更有彈性,能夠上下翻頁。
若是隻想讀取文件的頭幾行或者文件的末尾幾行,能夠用head或tail.
head –n [file]:讀取文件的前n行。
tail –n [file]:讀取文件末尾n行。
以上命令都是用於查看字符文件,二進制文件出來的都是亂碼,要看二進制文件的內容,能夠用od命令,如查看一個MP3文件裏面的內容:
od shijiemori.mp3
文件目錄與權限
chmod chown chgrp umask
文件查找
which:
which [filename]
該命令用於查詢經過PATH路徑到該路徑內查找可執行文件。
如:Which passwd:查找可執行文件passwd
whereis:
whereis [-bmsu] [keyword]
該命令用於把相關字的文件和目錄都列出來。(Linux 會將文件都記錄在一個文件數據庫裏面,該命令式從數據庫去查詢,因此速度比較快,Linux天天會更新該數據庫)
locate:
locate [filename]
該命令用於把相關字的文件和目錄都列出來。查找數據特別快,也是經過數據庫方式來查詢。可是數據庫一週更新一次,因此可能有些存在數據查不到。能夠去修改配置文件。
find:
find [path] [參數] [keyword]
該命令用於在指定路徑下查找文件。不是經過數據來查詢,因此速度會比較慢。
7.常見目錄解釋
Linux各類發行版的目錄結構基本一致,各個目錄簡單介紹以下:
目錄 |
描述 |
/ |
根目錄 |
/bin |
作爲基礎系統所須要的最基礎的命令就是放在這裏。好比 ls、cp、mkdir等命令;功能和/usr/bin相似,這個目錄中的文件都是可執行的,普通用戶均可以使用的命令。 |
/boot |
Linux的內核及引導系統程序所須要的文件,好比 vmlinuz initrd.img 文件都位於這個目錄中。在通常狀況下,GRUB或LILO系統引導管理器也位於這個目錄;啓動裝載文件存放位置,如kernels,initrd,grub。通常是一個獨立的分區。 |
/dev |
一些必要的設備,聲卡、磁盤等。還有如 /dev/null. /dev/console /dev/zero /dev/full 等。 |
/etc |
系統的配置文件存放地. 一些服務器的配置文件也在這裏;好比用戶賬號及密碼配置文件; /etc/opt:/opt對應的配置文件 /etc/X11:Xwindows系統配置文件 /etc/xml:XML配置文件 …… |
/home |
用戶工做目錄,和我的配置文件,如我的環境變量等,全部的帳號分配一個工做目錄。通常是一個獨立的分區。 |
/lib |
庫文件存放地。bin和sbin須要的庫文件。相似windows的DLL。 |
/media |
可拆卸的媒介掛載點,如CD-ROMs、移動硬盤、U盤,系統默認會掛載到這裏來。 |
/mnt |
臨時掛載文件系統。這個目錄通常是用於存放掛載儲存設備的掛載目錄的,好比有cdrom 等目錄。能夠參看/etc/fstab的定義。 |
/opt |
可選的應用程序包。 |
/proc |
操做系統運行時,進程(正在運行中的程序)信息及內核信息(好比cpu、硬盤分區、內存信息等)存放在這裏。/proc目錄假裝的文件系統proc的掛載目錄,proc並非真正的文件系統,它的定義能夠參見 /etc/fstab 。 |
/root |
Root用戶的工做目錄 |
/sbin |
和bin相似,是一些可執行文件,不過不是全部用戶都須要的,通常是系統管理所須要使用獲得的。 |
/tmp |
系統的臨時文件,通常系統重啓不會被保存。 |
/usr |
包含了系統用戶工具和程序。 /usr/bin:非必須的普通用戶可執行命令 /usr/include:標準頭文件 /usr/lib:/usr/bin/ 和 /usr/sbin/的庫文件 /usr/sbin:非必須的可執行文件 /usr/src:內核源碼 /usr/X11R6:X Window System, Version 11, Release 6. |
/srv |
該目錄存放一些服務啓動以後須要提取的數據 |