檔案系統是linux的一個十分基礎的知識,同時也是學習linux的必備知識。
本文將站在一個較高的視圖來瞭解linux的檔案系統,主要包括了linux磁碟分割和目錄、掛載基本原理、檔案儲存體結構、軟連結永久連結、和常見目錄的介紹。相信有了這些知識對於深入的學習linux會有一定的協助。文章例子主要是基於ubuntu發行版。
如有不對之處請大家多多指出。
1.Linux磁碟分割和目錄
Linux發行版本之間的差別很少,差別主要表現在系統管理的特色工具以及軟體包管理方式的不同。目錄結構基本上都是一樣的。 Windows的檔案結構是多個並列的樹狀結構,最頂部的是不同的磁碟(分區),如:C,D,E,F等。
Linux的檔案結構是單個的樹狀結構.可以用tree進行展示。 在Ubuntu下安裝tree(sudo apt-get install tree),並可通過命令來查看。
每次安裝系統的時候我們都會進行分區,Linux下磁碟分割和目錄的關係如下:
– 任何一個分區都必須掛載到某個目錄上。
– 目錄是邏輯上的區分。分區是物理上的區分。
– 磁碟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正統的檔案系統(如ext2、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
查看檔案的內容。全程式concatenate的意思,將檔案內容連續輸出到螢幕上。第一行到最後一行顯示。
tac:
tac
和cat剛好相反 是從最後一行到第一行的方式查看。
cat有個比較不好的地方時當檔案比較大時候沒辦法看清楚,這個時候可以用more或者Less命令。
more:
more
如果使用grep或者find等命令時,可以配合使用more一頁一頁的查看。如果看到一半想退出,則敲入’q’即可退出。
less:
less
less比more更有彈性,可以上下翻頁。
如果只想讀取檔案的頭幾行或者檔案的末尾幾行,可以用head或tail.
head –n :讀取檔案的前n行。
tail –n :讀取檔案末尾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、移動硬碟、隨身碟,系統預設會掛載到這裡來。 |
/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 |
該目錄存放一些服務啟動之後需要提取的資料 |