原文地址:http://www.cnblogs.com/irisrain/p/4201947.html
一 、linux文件結構
文件結構是文件存放在磁盤等存貯設備上的組織方法。主要體現在對文件和目錄的組織上。目錄提供了管理文件的一個方便而有效的途徑。
linux使用標准的目錄結構,在安裝的時候,安裝程序就已經為用戶創建了文件系統和完整而固定的目錄組成形式,並指定了每個目錄的作用和其中的文件類型。
linux采用的是樹型結構。最上層是根目錄,其他的所有目錄都是從根目錄出發而生成的。微軟的DOS和windows也是采用樹型結構,但是在DOS 和windows中這樣的樹型結構的根是磁盤分區的盤符,有幾個分區就有幾個樹型結構,他們之間的關系是並列的。但是在linux中,無論操作系統管理幾個磁盤分區,這樣的目錄樹只有一個。從結構上講,各個磁盤分區上的樹型目錄不一定是並列的。
如果這樣講不好理解的話,我來舉個例子:
有一塊硬盤,分成了4個分區,分別是/;/boot;/usr和windows下的fat對於/和/boot或者/和/usr,它們是從屬關系;對於/boot和/usr,它們是並列關系。
如果我把windows下的fat分區掛載到/mnt/winc下,那么對於/mnt/winc和 /usr或/mnt/winc和/boot來說,它們是從屬於目錄樹上沒有任何關系的兩個分支。
因為linux是一個多用戶系統,制定一個固定的目錄規划有助於對系統文件和不同的用戶文件進行統一管理。但就是這一點讓很多從windows轉到linux的初學者感到頭疼。下面列出了linux下一些主要目錄的功用。
├── bin (你在終端運行的大多數程序,比如cp、mv...)
├── boot (內核放在這里,這個目錄也經常被作為某個獨立分區的掛載點)
│ └── grub (grub引導程序和引導菜單就放在這里)
├── cdrom
├── dev (存放設備文件,這里相當於一個設備管理器,由系統自動生成。視硬件環境不同變化很大)
│ ├── block
│ ├── bsg
│ ├── bus
│ ├── char
│ ├── disk (磁盤信息,要掛載硬盤分區就要注意這里的信息嘍)
│ │ ├── by-id (硬盤分區的永久性符號鏈接)
│ │ ├── by-label (按卷標識別的硬盤分區,常用於掛載)
│ │ ├── by-path (硬盤分區的節點鏈接)
│ │ └── by-uuid (按UUID識別的硬盤分區,常用於掛載)
│ ├── dri
│ ├── fd
│ ├── input
│ ├── net
│ ├── pts
│ ├── shm
│ └── snd
├── etc (存放所有程序和系統的配制文件和全局變量,對所有用戶生效,非常值得備份)
├── home (這就是著名的home目錄了,注意不是”家目錄”,強烈建議把一個獨立分區掛載到這里!)
│ ├── adagio (這才是我真正的家!一般來說目錄名就是帳號名,當然也可以不是,隨便。命令行中用波浪線~代表這里)
│ ├── MNT (這是我掛載其它硬盤分區的地方,你可以看到用硬盤品牌、容量或用途區分的目錄名)
│ │ ├── MAX40NT1 (邁拓40G)
│ │ ├── ST160NT1 (希捷160G第一分區,下面兩個類似)
│ │ ├── ST160NT2
│ │ ├── ST160SYS
│ │ ├── ST320G (希捷320G)
│ │ │ ├── MOVIE
│ │ │ ├── MUSIC
│ │ │ └── P2P (電驢、BT的緩沖區)
│ │ ├── ST80G (希捷80G)
│ │ │ ├── PROGRAM
│ │ │ ├── ST80PE
│ │ │ └── YEAR
│ │ └── WD1000 (西數1T)
│ │ ├── WD2
│ │ ├── WD3
│ │ ├── WD5
│ │ ├── WD6.Lib
│ │ └── WD7
│ └── test (我建立的另一個帳號的家目錄,專門用於測試,一旦搞到無法收拾的地步,只需簡單的
│ 把里面的所有文件刪除,就可以恢復默認。實際上你可以擁有無數個帳號)
├── lib (所有程序共享的庫文件)
├── lost+found (磁盤掃描出現的丟失的數據)
├── media (你在文件管理器里點擊后自動掛載的分區就在這里,按卷標命名,沒有卷標則按大小命名)
├── mnt (同樣用於掛載磁盤,這是最傳統的位置,喜歡掛哪里隨便)
├── opt (某些特殊的程序喜歡把數據放在這里,比如JAVA)
├── proc (當前系統所有的詳細信息,這里的”文件”並不存在於硬盤中,而是在內存或緩存里,每次啟動后都不一樣)
├── root (這是系統最高權威root用戶的家!他是老大,所以不住在/home里,那里是草民住的)
├── sbin (類似/bin,存放常用程序,但這里的程序都是要命的啊,比如格式化,所以只有root用戶或sudo程序有權使用)
├── srv (一些服務所要訪問的文件)
├── sys (系統的核心文件,類似/proc,不必管它)
├── tmp (存放臨時文件,所有用戶均可使用,不過你要小心啊,這里的所有文件一旦重啟就全沒了,自動清空的)
├── usr (你在X下使用的所有程序數據都在這里了,包括圖標、manual等。所有用戶都可以使用。也是最龐大的目錄)
└── var (variation,顧名思義就是變量,這里存放系統中經常變化的數據。和/tmp不同啊,很有用的地方)
├── backups
├── cache
│ └── apt
│ └── archives (存放你安裝的所有程序的deb包!重裝系統時太有用了,一定要備份好,到時候放回來。
│ 我建議把整兒/var單獨掛載到一個獨立分區,像/home一樣。這樣你重裝好系統后,只
│ 需要簡單的把整兒分區掛載到/var就行了,省去了備份-還原的時間。要知道這些deb包
│ 可不是幾十M而已,而是有可能幾百M、幾個G,一來一回可夠嗆的。你也可以單獨掛載
│ 一個分區到/var/cache/apt/archives,其他的都不要。
│ 當然,這樣又增加了一點系統構造的復雜度,喜歡怎樣請自己斟酌。)
├── crash
├── games
├── lib
├── local
├── lock
├── log (呵呵,這里的文件是系統運行的完整記錄,出了問題一定要來這里看看)
├── mail (這里是存放所有用戶email的地方)
├── opt
├── run
├── spool
└── tmp
40616 directories (根目錄下共有40616個子目錄,你不會都想瀏覽一遍吧?)
文件系統指文件存在的物理空間,linux系統中每個分區都是一個文件系統,都有自己的目錄層次結構。linux會將這些分屬不同分區的、單獨的文件系統按一定的方式形成一個系統的總的目錄層次結構。一個操作系統的運行離不開對文件的操作,因此必然要擁有並維護自己的文件系統。
linux文件系統使用索引節點來記錄文件信息,作用像windows的文件分配表。索引節點是一個結構,它包含了一個文件的長度、創建及修改時間、權限、所屬關系、磁盤中的位置等信息。一個文件系統維護了一個索引節點的數組,每個文件或目錄都與索引節點數組中的唯一一個元素對應。系統給每個索引節點分配了一個號碼,也就是該節點在數組中的索引號,稱為索引節點號。
linux文件系統將文件索引節點號和文件名同時保存在目錄中。所以,目錄只是將文件的名稱和它的索引節點號結合在一起的一張表,目錄中每一對文件名稱和索引節點號稱為一個連接。
對於一個文件來說有唯一的索引節點號與之對應,對於一個索引節點號,卻可以有多個文件名與之對應。因此,在磁盤上的同一個文件可以通過不同的路徑去訪問它。可以用ln命令對一個已經存在的文件再建立一個新的連接,而不復制文件的內容。
連接有軟連接和硬連接之分,軟連接又叫符號連接。它們各自的特點是:
硬連接:原文件名和連接文件名都指向相同的物理地址。目錄不能有硬連接;
硬連接不能跨越文件系統(不能跨越不同的分區)文件在磁盤中只有一個拷貝,節省硬盤空間;
由於刪除文件要在同一個索引節點屬於唯一的連接時才能成功,因此可以防止不必要的誤刪除。
符號連接:用ln -s命令建立文件的符號連接符號連接是linux特殊文件的一種,作為一個文件,它的數據是它所連接的文件的路徑名。類似windows下的快捷方式。可以刪除原有的文件而保存連接文件,沒有防止誤刪除功能。
這一段的的內容過於抽象,又是節點又是數組的,我已經盡量通俗再通俗了,又不好加例子作演示。大家如果還是雲里霧里的話,我也沒有什么辦法了,只有先記住,日后在實際應用中慢慢體會、理解了。這也是我學習的一個方法吧。
三 、掛載文件系統
由上一節知道,linux系統中每個分區都是一個文件系統,都有自己的目錄層次結構。linux會將這些分屬不同分區的、單獨的文件系統按一定的方式形成一個系統的總的目錄層次結構。這里所說的“按一定方式”就是指的掛載。
將一個文件系統的頂層目錄掛到另一個文件系統的子目錄上,使它們成為一個整體,稱為掛載。把該子目錄稱為掛載點。
注意:1、掛載點必須是一個目錄。
2、一個分區掛載在一個已存在的目錄上,這個目錄可以不為空,但掛載后這個目錄下以前的內容將不可用。對於其他操作系統建立的文件系統的掛載也是這樣。但是需要理解的是:光盤、軟盤、其他操作系統使用的文件系統的格式與linux使用的文件系統格式是不一樣的。光盤是ISO9660;軟盤是fat16或ext2;windows NT是fat16、NTFS;windows98是fat16、fat32;windows2000和windowsXP是fat16、fat32、NTFS。
掛載前要了解linux是否支持所要掛載的文件系統格式。
掛載時使用mount命令:
格式:mount [-參數] [設備名稱] [掛載點]
其中常用的參數有
-t<文件系統類型> 指定設備的文件系統類型,常見的有:
minix linux最早使用的文件系統
ext2 linux目前常用的文件系統
msdos MS-DOS的fat,就是fat16
vfat windows98常用的fat32
nfs 網絡文件系統
iso9660 CD-ROM光盤標准文件系統
ntfs windows NT 2000的文件系統
hpfs OS/2文件系統
auto 自動檢測文件系統
-o<選項> 指定掛載文件系統時的選項。有些也可用在/etc/fstab中。常用的有
codepage=XXX 代碼頁
iocharset=XXX 字符集
ro 以只讀方式掛載
rw 以讀寫方式掛載
nouser 使一般用戶無法掛載
user 可以讓一般用戶掛載設備
提醒一下,mount命令沒有建立掛載點的功能,因此你應該確保執行mount命令時,掛載點已經存在。(不懂?說白了點就是你要把文件系統掛載到哪,首先要先建上個目錄。這樣OK?)
例子:windows98裝在hda1分區,同時計算機上還有軟盤和光盤需要掛載。
# mk /mnt/winc
# mk /mnt/floppy
# mk /mnt/cdrom
# mount -t vfat /dev/hda1 /mnt/winc
# mount -t msdos /dev/fd0 /mnt/floppy
# mount -t iso9660 /dev/cdrom /mnt/cdrom
現在就可以進入/mnt/winc等目錄讀寫這些文件系統了。
要保證最后兩行的命令不出錯,要確保軟驅和光驅里有盤。(要是硬盤的磁盤片也可以經常隨時更換的話,我想就不會犯這樣的錯誤了 :-> )
如果你的windows98目錄里有中文文件名,使用上面的命令掛載后,顯示的是一堆亂碼。這就要用到 -o 參數里的codepage iocharset選項。codepage指定文件系統的代碼頁,簡體中文中文代碼是936;iocharset指定字符集,簡體中文一般用cp936或gb2312。
當掛載的文件系統linux不支持時,mount一定報錯,如windows2000的ntfs文件系統。可以重新編譯linux內核以獲得對該文件系統的支持。關於重新編譯linux內核,就不在這里說了。
四 、自動掛載
每次開機訪問windows分區都要運行mount命令顯然太煩瑣,為什么訪問其他的linux分區不用使用mount命令呢?
其實,每次開機時,linux自動將需要掛載的linux分區掛載上了。那么我們是不是可以設定讓linux在啟動的時候也掛載我們希望掛載的分區,如windows分區,以實現文件系統的自動掛載呢?這是完全可以的。在/etc目錄下有個fstab文件,它里面列出了linux開機時自動掛載的文件系統的列表。
我的/etc/fstab文件如下:
/dev/hda2 / ext3 defaults 1 1
/dev/hda1 /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda3 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
/dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0
/dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0
在/etc/fstab文件里,第一列是掛載的文件系統的設備名,第二列是掛載點,第三列是掛載的文件系統類型,第四列是掛載的選項,選項間用逗號分隔。第五六列不知道是什么意思,還望高手指點。
在最后兩行是我手工添加的windows下的C;D盤,加了codepage=936和iocharset=cp936參數以支持中文文件名。參數defaults實際上包含了一組默認參數:
rw 以可讀寫模式掛載
suid 開啟用戶ID和群組ID設置位
dev 可解讀文件系統上的字符或區塊設備
exec 可執行二進制文件
auto 自動掛載
nouser 使一般用戶無法掛載
async 以非同步方式執行文件系統的輸入輸出操作
大家可以看到在這個列表里,光驅和軟驅是不自動掛載的,參數設置為noauto。(如果你非要設成自動掛載,你要確保每次開機時你的光驅和軟驅里都要有盤。)