Linux系統通常有4個主要部分:內核、shell、文件系統和應用程序。內核、shell和文件系統一塊兒造成了基本的操做系統結構,它們使得用戶能夠運行程序、管理文件並使用系統。node
內核是操做系統的核心,具備不少最基本功能,它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定着系統的性能和穩定性。linux
Linux 內核由以下幾部分組成:內存管理、進程管理、設備驅動程序、文件系統和網絡管理等。如圖:算法
系統調用接口:SCI 層提供了某些機制執行從用戶空間到內核的函數調用。這個接口依賴於體系結構,甚至在相同的處理器家族內也是如此。SCI 其實是一個很是有用的函數調用多路複用和多路分解服務。在 ./linux/kernel 中您能夠找到 SCI 的實現,並在 ./linux/arch 中找到依賴於體系結構的部分。shell
對任何一臺計算機而言,其內存以及其它資源都是有限的。爲了讓有限的物理內存知足應用程序對內存的大需求量,Linux 採用了稱爲「虛擬內存」的內存管理方式。Linux 將內存劃分爲容易處理的「內存頁」(對於大部分體系結構來講都是 4KB)。Linux 包括了管理可用內存的方式,以及物理和虛擬映射所使用的硬件機制。數據庫
不過內存管理要管理的可不止 4KB 緩衝區。Linux 提供了對 4KB 緩衝區的抽象,例如 slab 分配器。這種內存管理模式使用 4KB 緩衝區爲基數,而後從中分配結構,並跟蹤內存頁使用狀況,好比哪些內存頁是滿的,哪些頁面沒有徹底使用,哪些頁面爲空。這樣就容許該模式根據系統須要來動態調整內存使用。編程
爲了支持多個用戶使用內存,有時會出現可用內存被消耗光的狀況。因爲這個緣由,頁面能夠移出內存並放入磁盤中。這個過程稱爲交換,由於頁面會被從內存交換到硬盤上。內存管理的源代碼能夠在 ./linux/mm 中找到。ubuntu
進程實際是某特定應用程序的一個運行實體。在 Linux 系統中,可以同時運行多個進程,Linux 經過在短的時間間隔內輪流運行這些進程而實現「多任務」。這一短的時間間隔稱爲「時間片」,讓進程輪流運行的方法稱爲「進程調度」 ,完成調度的程序稱爲調度程序。windows
進程調度控制進程對CPU的訪問。當須要選擇下一個進程運行時,由調度程序選擇最值得運行的進程。可運行進程其實是僅等待CPU資源的進程,若是某個進程在等待其它資源,則該進程是不可運行進程。Linux使用了比較簡單的基於優先級的進程調度算法選擇新的進程。數組
經過多任務機制,每一個進程可認爲只有本身獨佔計算機,從而簡化程序的編寫。每一個進程有本身單獨的地址空間,而且只能由這一進程訪問,這樣,操做系統避免了進程之間的互相干擾以及「壞」程序對系統可能形成的危害。 爲了完成某特定任務,有時須要綜合兩個程序的功能,例如一個程序輸出文本,而另外一個程序對文本進行排序。爲此,操做系統還提供進程間的通信機制來幫助完成這樣的任務。Linux 中常見的進程間通信機制有信號、管道、共享內存、信號量和套接字等。緩存
內核經過 SCI 提供了一個應用程序編程接口(API)來建立一個新進程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函數),中止進程(kill、exit),並在它們之間進行通訊和同步(signal 或者 POSⅨ 機制)。
和 DOS 等操做系統不一樣,Linux 操做系統中單獨的文件系統並非由驅動器號或驅動器名稱(如 A: 或 C: 等)來標識的。相反,和 UNIX 操做系統同樣,Linux 操做系統將獨立的文件系統組合成了一個層次化的樹形結構,而且由一個單獨的實體表明這一文件系統。Linux 將新的文件系統經過一個稱爲「掛裝」或「掛上」的操做將其掛裝到某個目錄上,從而讓不一樣的文件系統結合成爲一個總體。Linux 操做系統的一個重要特色是它支持許多不一樣類型的文件系統。Linux 中最廣泛使用的文件系統是 Ext2,它也是 Linux 土生土長的文件系統。但 Linux 也可以支持 FAT、VFAT、FAT3二、MINIX 等不一樣類型的文件系統,從而能夠方便地和其它操做系統交換數據。因爲 Linux 支持許多不一樣的文件系統,而且將它們組織成了一個統一的虛擬文件系統.
虛擬文件系統(VirtualFileSystem,VFS):隱藏了各類硬件的具體細節,把文件系統操做和不一樣文件系統的具體實現細節分離了開來,爲全部的設備提供了統一的接口,VFS提供了多達數十種不一樣的文件系統。虛擬文件系統能夠分爲邏輯文件系統和設備驅動程序。邏輯文件系統指Linux所支持的文件系統,如ext2,fat等,設備驅動程序指爲每一種硬件控制器所編寫的設備驅動程序模塊。
虛擬文件系統(VFS)是 Linux 內核中很是有用的一個方面,由於它爲文件系統提供了一個通用的接口抽象。VFS 在 SCI 和內核所支持的文件系統之間提供了一個交換層。即VFS在用戶和文件系統之間提供了一個交換層。
VFS在用戶和文件系統之間提供了一個交換層:
在 VFS 上面,是對諸如 open、close、read 和 write 之類的函數的一個通用 API 抽象。在 VFS 下面是文件系統抽象,它定義了上層函數的實現方式。它們是給定文件系統(超過 50 個)的插件。文件系統的源代碼能夠在 ./linux/fs 中找到。
文件系統層之下是緩衝區緩存,它爲文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層經過將數據保留一段時間(或者隨即預先讀取數據以便在須要是就可用)優化了對物理設備的訪問。緩衝區緩存之下是設備驅動程序,它實現了特定物理設備的接口。
所以,用戶和進程不須要知道文件所在的文件系統類型,而只須要象使用 Ext2 文件系統中的文件同樣使用它們。
設備驅動程序是 Linux 內核的主要部分。和操做系統的其它部分相似,設備驅動程序運行在高特權級的處理器環境中,從而能夠直接對硬件進行操做,但正由於如此,任何一個設備驅動程序的錯誤均可能致使操做系統的崩潰。設備驅動程序實際控制操做系統和硬件設備之間的交互。
設備驅動程序提供一組操做系統可理解的抽象接口完成和操做系統之間的交互,而與硬件相關的具體操做細節由設備驅動程序完成。通常而言,設備驅動程序和設備的控制芯片有關,例如,若是計算機硬盤是 SCSI 硬盤,則須要使用 SCSI 驅動程序,而不是 IDE 驅動程序。
提供了對各類網絡標準的存取和各類網絡硬件的支持。網絡接口可分爲網絡協議和網絡驅動程序。網絡協議部分負責實現每一種可能的網絡傳輸協議。衆所周知,TCP/IP 協議是 Internet 的標準協議,同時也是事實上的工業標準。
Linux 的網絡實現支持 BSD 套接字,支持所有的TCP/IP協議。Linux內核的網絡部分由BSD套接字、網絡協議層和網絡設備驅動程序組成。網絡設備驅動程序負責與硬件設備通信,每一種可能的硬件設備都有相應的設備驅動程序。
shell是系統的用戶界面,提供了用戶與內核進行交互操做的一種接口。它接收用戶輸入的命令並把它送入內核去執行,是一個命令解釋器。另外,shell編程語言具備普通編程語言的不少特色,用這種編程語言編寫的shell程序與其餘應用程序具備一樣的效果。
目前主要有下列版本的shell。
1.Bourne Shell:是貝爾實驗室開發的。
2.BASH:是GNU的Bourne Again Shell,是GNU操做系統上默認的shell,大部分linux的發行套件使用的都是這種shell。
3.Korn Shell:是對Bourne SHell的發展,在大部份內容上與Bourne Shell兼容。
4.C Shell:是SUN公司Shell的BSD版本。
文件系統是文件存放在磁盤等存儲設備上的組織方法。Linux系統能支持多種目前流行的文件系統,如EXT二、 EXT三、 FAT、 FAT3二、 VFAT和ISO9660。
Linux下面的文件類型主要有:
1) 普通文件:C語言元代碼、SHELL腳本、二進制的可執行文件等。分爲純文本和二進制。
2) 目錄文件:目錄,存儲文件的惟一地方。
3) 連接文件:指向同一個文件或目錄的的文件。
4) 設備文件:與系統外設相關的,一般在/dev下面。分爲塊設備和字符設備。
5) 管道(FIFO)文件: 提供進程之間通訊的一種方式
6) 套接字(socket) 文件: 該文件類型與網絡通訊有關
能夠經過ls –l, file, stat幾個命令來查看文件的類型等相關信息。
文件結構是文件存放在磁盤等存貯設備上的組織方法。主要體如今對文件和目錄的組織上;
目錄提供了管理文件的一個方便而有效的途徑。
Linux使用標準的目錄結構,在安裝的時候,安裝程序就已經爲用戶建立了文件系統和完整而固定的目錄組成形式,並指定了每一個目錄的做用和其中的文件類型。
完整的目錄樹可劃分爲小的部分,這些小部分又能夠單獨存放在本身的磁盤或分區上。這樣,相對穩定的部分和常常變化的部分可單獨存放在不一樣的分區中,從而方便備份或系統管理。目錄樹的主要部分有 root、/usr、/var、/home 等。這樣的佈局可方便在 Linux 計算機之間共享文件系統的某些部分。
Linux採用的是樹型結構。最上層是根目錄,其餘的全部目錄都是從根目錄出發而生成的。
微軟的DOS和windows也是採用樹型結構,可是在DOS和windows中這樣的樹型結構的根是磁盤分區的盤符,有幾個分區就有幾個樹型結構,他們之間的關係是並列的。最頂部的是不一樣的磁盤(分區),如:C,D,E,F等。
可是在linux中,不管操做系統管理幾個磁盤分區,這樣的目錄樹只有一個。從結構上講,各個磁盤分區上的樹型目錄不必定是並列的。
主分區,擴展分區和邏輯分區:
linux分區不一樣於windows,硬盤和硬盤分區在Linux都表示爲設備.
硬盤分區一共有三種:主分區,擴展分區和邏輯分區。
硬盤的分區主要分爲主分區(Primary Partion)和擴展分區(Extension Partion)兩種,主分區和擴展分區的數目之和不能大於四個。
主分區(Primary Partion):能夠立刻被使用但不能再分區。
擴展分區(Extension Partion):必須再進行分區後才能使用,也就是說它必須還要進行二次分區。
邏輯分區((Logical Partion)):由擴展分區創建起來的分區,邏輯分區沒有數量上限制。
擴展分區只不過是邏輯分區的「容器」,實際上只有主分區和邏輯分區進行數據存儲。
Linux下硬盤分區的標識
硬盤分區的標識通常使用/dev/hd[a-z]X或者/dev/sd[a-z]X來標識,其中[a-z]表明硬盤號,X表明硬盤內的分區號。
整塊硬盤分區的塊號標識:Linux下用hda、hdb、sda、sdb 等來標識不一樣的硬盤;
其中:
IDE接口硬盤:表示爲/dev/hda一、/dev/hdb …;
SCSI 接口的硬盤、SATA接口的硬盤表示爲/dev/sda、/dev/sdb … … ;
硬盤內的分區:若是X的值是1到4,表示硬盤的主分區(包含擴展分區);邏輯分區從是從5開始的,好比/dev/hda5確定是邏輯分區了;
例如:
用hda一、hda二、 hda五、hda6 來標識不一樣的分區。其中,字母a表明第一塊硬盤,b表明第二塊硬盤,依次類推。而數字1 表明一塊硬盤的第一個分區、2 表明第二個分區,依次類推。1 到4 對應的是主分區(Primary Partition)或擴展分區(Extension Partition)。從5開始,對應的都是硬盤的邏輯分區(Logical Partition)。一塊硬盤即便只有一個主分區,邏輯分區也是從5開始編號的,這點應特別注意。
總結:一個硬盤分區首先要確認在哪一個硬盤,而後再確認它所在硬盤內的哪一個分區。
對於/dev/hda 相似的表示方法,也並不寞生吧;咱們在Linux經過fdisk -l 就能夠查到硬盤是/dev/hda仍是/dev/hdb;
[root@localhost ~]# fdisk -l Disk /dev/hda: 80.0 GB, 80026361856 bytes 255 heads, 63 sectors/track, 9729 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 970 7791493+ 7 HPFS/NTFS /dev/hda2 971 9729 70356667+ 5 Extended /dev/hda5 971 2915 15623181 b W95 FAT32 /dev/hda6 2916 4131 9767488+ 83 linux /dev/hda7 4132 5590 11719386 83 linux /dev/hda8 5591 6806 9767488+ 83 linux /dev/hda9 6807 9657 22900626 83 linux /dev/hda10 9658 9729 578308+ 82 linux swap / Solaris
請注意第一行, Disk /dev/hda: 80.0 GB, 80026361856 bytes ,這個就是表示機器中只有一個硬盤設備/dev/hda ,體積大小爲 80.0G;下面的就是硬盤的分區,每一個分區都有詳細的信息,在這裏不詳細說了;
Linux下磁盤分區和目錄的關係以下:
– 任何一個分區都必須掛載到某個目錄上。
– 目錄是邏輯上的區分。分區是物理上的區分。
– 磁盤Linux分區都必須掛載到目錄樹中的某個具體的目錄上才能進行讀寫操做。
– 根目錄是全部Linux的文件和目錄所在的地方,須要掛載上一個磁盤分區。
/bin 二進制可執行命令
/dev 設備特殊文件
/etc 系統管理和配置文件
/etc/rc.d 啓動的配置文件和腳本
/home 用戶主目錄的基點,好比用戶user的主目錄就是/home/user,能夠用~user表示
/lib 標準程序設計庫,又叫動態連接共享庫,做用相似windows裏的.dll文件
/sbin 系統管理命令,這裏存放的是系統管理員使用的管理程序
/tmp 公用的臨時文件存儲點
/root 系統管理員的主目錄(呵呵,特權階級)
/mnt 系統提供這個目錄是讓用戶臨時掛載其餘的文件系統。
/lost+found 這個目錄平時是空的,系統非正常關機而留下「無家可歸」的文件(windows下叫什麼.chk)就在這裏
/proc 虛擬的目錄,是系統內存的映射。可直接訪問這個目錄來獲取系統信息。
/var 某些大文件的溢出區,比方說各類服務的日誌文件
/usr 最龐大的目錄,要用到的應用程序和文件幾乎都在這個目錄。其中包含:
/usr/X11R6 存放X window的目錄
/usr/bin 衆多的應用程序
/usr/sbin 超級用戶的一些管理程序
/usr/doc linux文檔
/usr/include linux下開發和編譯應用程序所須要的頭文件
/usr/lib 經常使用的動態連接庫和軟件包的配置文件
/usr/man 幫助文檔
/usr/src 源代碼,linux內核的源代碼就放在/usr/src/linux裏
/usr/local/bin 本地增長的命令
/usr/local/lib 本地增長的庫
文件系統指文件存在的物理空間,linux系統中每一個分區都是一個文件系統,都有本身的目錄層次結構。linux會將這些分屬不一樣分區的、單獨的文件系統按必定的方式造成一個系統的總的目錄層次結構。一個操做系統的運行離不開對文件的操做,所以必然要擁有並維護本身的文件系統。
1.文件系統類型:
ext2 : 早期linux中經常使用的文件系統 ext3 : ext2的升級版,帶日誌功能 RAMFS : 內存文件系統,速度很快 NFS : 網絡文件系統,由SUN發明,主要用於遠程文件共享 MS-DOS : MS-DOS文件系統 VFAT : Windows 95/98 操做系統採用的文件系統 FAT : Windows XP 操做系統採用的文件系統 NTFS: Windows NT/XP 操做系統採用的文件系統 HPFS : OS/2 操做系統採用的文件系統 PROC : 虛擬的進程文件系統 ISO9660 : 大部分光盤所採用的文件系統 ufsSun : OS 所採用的文件系統 NCPFS : Novell 服務器所採用的文件系統 SMBFS : Samba 的共享文件系統 XFS : 由SGI開發的先進的日誌文件系統,支持超大容量文件 JFS :IBM的AIX使用的日誌文件系統 ReiserFS : 基於平衡樹結構的文件系統 udf: 可擦寫的數據光盤文件系統
2.文件系統特性:
磁盤分區完畢後還須要進行格式化(format),以後操做系統纔可以使用這個分區。 格式化的目的是能使操做系統可使用的文件系統格式(即咱們上面提到文件系統類型).
每種操做系統可以使用的文件系統並不相同. 如windows 98 之前的微軟操做系統主要利用的文件系統是 FAT (或 FAT16),windows 2000 之後的版本有所謂的 NTFS 文件系統,至於 Linux 的正統文件系統則爲 Ext2 (Linux second extended file system, ext2fs)這一個。此外,在默認的狀況下,windows 操做系統是不會認識 Linux 的 Ext2 的。
傳統的磁盤與文件系統之應用中,一個分區就是隻可以被格式化成爲一個文件系統,因此咱們能夠說一個 filesystem 就是一個 partition。可是因爲新技術的利用,例如咱們常聽到的LVM與軟件磁盤陣列(software raid), 這些技術能夠將一個分區格式化爲多個文件系統(例如LVM),也可以將多個分區合成一個文件系統(LVM, RAID)! 因此說,目前咱們在格式化時已經再也不說成針對 partition 來格式化了, 一般咱們能夠稱呼一個可被掛載的數據爲一個文件系統而不是一個分區喔!
那麼文件系統是如何運行的呢?這與操做系統的文件數據有關。較新的操做系統的文件數據除了文件實際內容外, 一般含有很是多的屬性,例如 Linux 操做系統的文件權限(rwx)與文件屬性(擁有者、羣組、時間參數等)。 文件系統一般會將這兩部份的數據分別存放在不一樣的區塊,權限與屬性放置到 inode 中,至於實際數據則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的總體信息,包括 inode 與 block 的總量、使用量、剩餘量等。
對於一個磁盤分區來講,在被指定爲相應的文件系統後,整個分區被分爲 1024,2048 和 4096 字節大小的塊。根據塊使用的不一樣,可分爲:
超級塊(Superblock): 這是整個文件系統的第一塊空間。包括整個文件系統的基本信息,如塊大小,inode/block的總量、使用量、剩餘量,指向空間 inode 和數據塊的指針等相關信息。
inode塊(文件索引節點) : 文件系統索引,記錄文件的屬性。它是文件系統的最基本單元,是文件系統鏈接任何子目錄、任何文件的橋樑。每一個子目錄和文件只有惟一的一個 inode 塊。它包含了文件系統中文件的基本屬性(文件的長度、建立及修改時間、權限、所屬關係)、存放數據的位置等相關信息. 在 Linux 下能夠經過 「ls -li」 命令查看文件的 inode 信息。硬鏈接和源文件具備相同的 inode 。
數據塊(Block) :實際記錄文件的內容,若文件太大時,會佔用多個block。爲了提升目錄訪問效率,Linux還提供了表達路徑與inode對應關係的dentry結構。它描述了路徑信息並鏈接到節點inode,它包括各類目錄信息,還指向了inode和超級塊。
就像一本書有封面、目錄和正文同樣。在文件系統中,超級塊就至關於封面,從封面能夠得知這本書的基本信息; inode 塊至關於目錄,從目錄能夠得知各章節內容的位置;而數據塊則至關於書的正文,記錄着具體內容。
Linux正統的文件系統(如ext二、3等)將硬盤分區時會劃分出超級塊、inode Table區塊和data block數據區域。一個文件由一個超級塊、inode和數據區域塊組成。Inode包含文件的屬性(如讀寫屬性、owner等,以及指向數據塊的指針),數據區域塊則是文件內容。當查看某個文件時,會先從inode table中查出文件屬性及數據存放點,再從數據塊中讀取數據。
咱們將 inode與block區塊用圖解來講明一下,以下圖所示,文件系統先格式化出inode與block的區塊,假設某一個文件的屬性與權限數據是放置到 inode 4號(下圖較小方格內),而這個inode記錄了文件數據的實際放置點爲 2, 7, 13, 15 這四個 block 號碼,此時咱們的操做系統就可以據此來排列磁盤的閱讀順序,能夠一口氣將四個 block 內容讀出來! 那麼數據的讀取就如同下圖中的箭頭所指定的模樣了。
這種數據存取的方法咱們稱爲索引式文件系統(indexed allocation)。那有沒有其餘的慣用文件系統能夠比較一下啊? 有的,那就是咱們慣用的閃盤(閃存),閃盤使用的文件系統通常爲 FAT 格式。FAT 這種格式的文件系統並無 inode 存在,因此 FAT 沒有辦法將這個文件的全部 block 在一開始就讀取出來。每一個 block 號碼都記錄在前一個 block 當中, 其讀取方式有點像下圖所示:
上圖中咱們假設文件的數據依序寫入1->7->4->15號這四個 block 號碼中, 但這個文件系統沒有辦法一口氣就知道四個 block 的號碼,他得要一個一個的將 block 讀出後,纔會知道下一個 block 在何處。 若是同一個文件數據寫入的 block 分散的太過厲害時,則咱們的磁盤讀取頭將沒法在磁盤轉一圈就讀到全部的數據, 所以磁盤就會多轉好幾圈才能完整的讀取到這個文件的內容!
經常會聽到所謂的「碎片整理」吧? 須要碎片整理的緣由就是文件寫入的 block 太過於離散了,此時文件讀取的效能將會變的不好所致。 這個時候能夠透過碎片整理將同一個文件所屬的 blocks 彙整在一塊兒,這樣數據的讀取會比較容易啊! 想固然,FAT 的文件系統須要常常的碎片整理一下,那麼 Ext2 是否須要磁盤重整呢?
因爲 Ext2 是索引式文件系統,基本上不太須要經常進行碎片整理的。可是若是文件系統使用過久, 經常刪除/編輯/新增文件時,那麼仍是可能會形成文件數據太過於離散的問題,此時或許會須要進行重整一下的。 不過,老實說,鳥哥卻是沒有在 Linux 操做系統上面進行過 Ext2/Ext3 文件系統的碎片整理說!彷佛不太須要啦!
能夠用ln命令對一個已經存在的文件再創建一個新的鏈接,而不復制文件的內容。鏈接有軟鏈接和硬鏈接之分,軟鏈接又叫符號鏈接。它們各自的特色是:
硬鏈接:原文件名和鏈接文件名都指向相同的物理地址。目錄不能有硬鏈接;硬鏈接不能跨越文件系統(不能跨越不一樣的分區)文件在磁盤中只有一個拷貝,節省硬盤空間;
因爲刪除文件要在同一個索引節點屬於惟一的鏈接時才能成功,所以能夠防止沒必要要的誤刪除。
符號鏈接:用ln -s命令創建文件的符號鏈接符號鏈接是linux特殊文件的一種,做爲一個文件,它的數據是它所鏈接的文件的路徑名。相似windows下的快捷方式。
能夠刪除原有的文件而保存鏈接文件,沒有防止誤刪除功能。
這一段的的內容過於抽象,又是節點又是數組的,我已經儘可能通俗再通俗了,又很差加例子做演示。你們若是仍是雲裏霧裏的話,我也沒有什麼辦法了,只有先記住,往後在實際應用中慢慢體會、理解了。這也是我學習的一個方法吧。
內核數據結構
Linux內核的VFS子系統能夠圖示以下:
文件與IO: 每一個進程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是這個表的索引,每一個表項都有一個指向已打開文件的指針,如今咱們明確一下:已打開的文件在內核中用file結構體表示,文件描述符表中的指針指向file結構體。
在file結構體中維護File Status Flag(file結構體的成員f_flags)和當前讀寫位置(file結構體的成員f_pos)。在上圖中,進程1和進程2都打開同一文件,可是對應不一樣的file結構體,所以能夠有不一樣的File Status Flag和讀寫位置。file結構體中比較重要的成員還有f_count,表示引用計數(Reference Count),後面咱們會講到,dup、fork等系統調用會致使多個文件描述符指向同一個file結構體,例若有fd1和fd2都引用同一個file結構體,那麼它的引用計數就是2,當close(fd1)時並不會釋放file結構體,而只是把引用計數減到1,若是再close(fd2),引用計數就會減到0同時釋放file結構體,這才真的關閉了文件。
每一個file結構體都指向一個file_operations結構體,這個結構體的成員都是函數指針,指向實現各類文件操做的內核函數。好比在用戶程序中read一個文件描述符,read經過系統調用進入內核,而後找到這個文件描述符所指向的file結構體,找到file結構體所指向的file_operations結構體,調用它的read成員所指向的內核函數以完成用戶請求。在用戶程序中調用lseek、read、write、ioctl、open等函數,最終都由內核調用file_operations的各成員所指向的內核函數完成用戶請求。
file_operations結構體中的release成員用於完成用戶程序的close請求,之因此叫release而不叫close是由於它不必定真的關閉文件,而是減小引用計數,只有引用計數減到0才關閉文件。對於同一個文件系統上打開的常規文件來講,read、write等文件操做的步驟和方法應該是同樣的,調用的函數應該是相同的,因此圖中的三個打開文件的file結構體指向同一個file_operations結構體。若是打開一個字符設備文件,那麼它的read、write操做確定和常規文件不同,不是讀寫磁盤的數據塊而是讀寫硬件設備,因此file結構體應該指向不一樣的file_operations結構體,其中的各類文件操做函數由該設備的驅動程序實現。
每一個file結構體都有一個指向dentry結構體的指針,「dentry」是directory entry(目錄項)的縮寫。咱們傳給open、stat等函數的參數的是一個路徑,例如/home/akaedu/a,須要根據路徑找到文件的inode。爲了減小讀盤次數,內核緩存了目錄的樹狀結構,稱爲dentry cache,其中每一個節點是一個dentry結構體,只要沿着路徑各部分的dentry搜索便可,從根目錄/找到home目錄,而後找到akaedu目錄,而後找到文件a。dentry cache只保存最近訪問過的目錄項,若是要找的目錄項在cache中沒有,就要從磁盤讀到內存中。
每一個dentry結構體都有一個指針指向inode結構體。inode結構體保存着從磁盤inode讀上來的信息。在上圖的例子中,有兩個dentry,分別表示/home/akaedu/a和/home/akaedu/b,它們都指向同一個inode,說明這兩個文件互爲硬連接。inode結構體中保存着從磁盤分區的inode讀上來信息,例如全部者、文件大小、文件類型和權限位等。每一個inode結構體都有一個指向inode_operations結構體的指針,後者也是一組函數指針指向一些完成文件目錄操做的內核函數。
和file_operations不一樣,inode_operations所指向的不是針對某一個文件進行操做的函數,而是影響文件和目錄佈局的函數,例如添加刪除文件和目錄、跟蹤符號連接等等,屬於同一文件系統的各inode結構體能夠指向同一個inode_operations結構體。
inode結構體有一個指向super_block結構體的指針。super_block結構體保存着從磁盤分區的超級塊讀上來的信息,例如文件系統類型、塊大小等。super_block結構體的s_root成員是一個指向dentry的指針,表示這個文件系統的根目錄被mount到哪裏,在上圖的例子中這個分區被mount到/home目錄下。
file、dentry、inode、super_block這幾個結構體組成了VFS的核心概念。對於ext2文件系統來講,在磁盤存儲佈局上也有inode和超級塊的概念,因此很容易和VFS中的概念創建對應關係。而另一些文件系統格式來自非UNIX系統(例如Windows的FAT3二、NTFS),可能沒有inode或超級塊這樣的概念,但爲了能mount到Linux系統,也只好在驅動程序中硬湊一下,在Linux下看FAT32和NTFS分區會發現權限位是錯的,全部文件都是rwxrwxrwx,由於它們原本就沒有inode和權限位的概念,這是硬湊出來的。
linux系統中每一個分區都是一個文件系統,都有本身的目錄層次結構。linux會將這些分屬不一樣分區的、單獨的文件系統按必定的方式造成一個系統的總的目錄層次結構。這裏所說的「按必定方式」就是指的掛載。
將一個文件系統的頂層目錄掛到另外一個文件系統的子目錄上,使它們成爲一個總體,稱爲掛載。把該子目錄稱爲掛載點.
例如要讀取硬盤中的一個格式化好的分區、光盤或軟件等設備時,必須先把這些設備對應到某個目錄上,而這個目錄就稱爲「掛載點(mount point)」,這樣才能夠讀取這些設備。 掛載後將物理分區細節屏蔽掉,用戶只有統一的邏輯概念。全部的東西都是文件。
注意:
一、掛載點必須是一個目錄。
二、一個分區掛載在一個已存在的目錄上,這個目錄能夠不爲空,但掛載後這個目錄下之前的內容將不可用。
對於其餘操做系統創建的文件系統的掛載也是這樣。可是須要理解的是:光盤、軟盤、其餘操做系統使用的文件系統的格式與linux使用的文件系統格式是不同的。光盤是ISO9660;軟盤是fat16或ext2;windows NT是fat1六、NTFS;windows98是fat1六、fat32;windows2000和windowsXP是fat1六、fat3二、 NTFS。掛載前要了解linux是否支持所要掛載的文件系統格式。
掛載時使用mount命令,其格式:mount [-參數] [設備名稱] [掛載點]
其中經常使用的參數有:
-t 指定設備的文件系統類型(什麼提到的文件類型)
-o 指定掛載文件系統時的選項。有些也可用在/etc/fstab中。經常使用的有
codepage=XXX 代碼頁 iocharset=XXX 字符集 ro 以只讀方式掛載 rw 以讀寫方式掛載 nouser 使通常用戶沒法掛載 user 可讓通常用戶掛載設備
例如:
1)首先咱們使用sudo fdisk -l查看掛載的設備,例如最下面有:/dev/hda5
2)mkdir建立一個目錄,這裏的目錄是做爲掛在目錄,就是你要把E盤掛到這個目錄下:mk /mnt/winc
3)windows和linux使用的不是一個文件系統,通常狀況下linux不掛載windows文件系統,因此要你手動mount:
# mount -t vfat /dev/hda5 /mnt/winc ( -t vfat指出這裏的文件系統fat32)
如今就能夠進入/mnt/winc等目錄讀寫這些文件了。
2.掛載光盤:# mk /mnt/cdrom
# mount -t iso9660 /dev/cdrom /mnt/cdrom (關盤的名字通常都是cdrom,這條命令通常都通用)
3.虛擬機共享文件夾:例如在VirtualBox下,主機是Windows,Ubuntu是Guest。共分三步:
1). 首先要安裝虛擬電腦工具包:
在VirtualBox的菜單裏選擇」設備」->」安裝虛擬電腦工具包」,你會發如今Ubuntu桌面上多出一個光盤圖標,這張光盤默認被自動加載到了文件夾/media/cdom0,並且/cdrom自動指向這個文件夾。默認設置下文件管理器會自動打開這張光盤,能夠看到裏面有個」VBoxLinuxAdditions.run」文件。打開一個命令行終端,依次輸入」cd /cdrom」和」sudo sh ./VBoxLinuxAdditions.run」,不含雙引號,開始安裝工具包。安裝完畢,會用英文提示要重啓Ubuntu,建議馬上重啓。重啓後,比較明顯的變化是鼠標是共享模式,而且剪貼板也和Windows共享了。若是有這些變化,說明虛擬電腦工具包已經裝成功。
2). 下一步設置共享文件夾。
在共享文件夾設置窗口中,單擊右側的」添加一個共享文件夾」,路徑選擇你想要共享的Windows文件夾,共享名任取一個本身喜歡的,好比」myshare」,選項read-only是指是否只容許ubuntu讀這個文件夾,請根據須要選擇這個選項。
3). 在ubuntu下掛載這個共享文件夾:sudo mount -t vboxsf myshare /media/share
其中」myshare」是以前取的共享文件夾的名字,」/media/share」是要掛載到的目標文件.
每次開機訪問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。(若是你非要設成自動掛載,你要確保每次開機時你的光驅和軟驅裏都要有盤,呵呵。)
能夠用ln命令對一個已經存在的文件再創建一個新的鏈接,而不復制文件的內容。鏈接有軟鏈接和硬鏈接之分,軟鏈接又叫符號鏈接。它們各自的特色是:
硬鏈接:是給文件一個副本,原文件名和鏈接文件名都指向相同的物理地址。目錄不能有硬鏈接;硬鏈接不能跨越文件系統(不能跨越不一樣的分區)文件在磁盤中只有一個拷貝,節省硬盤空間;
修改其中一個,與其鏈接的文件同時被修改。若是刪除其中任意一個其他的文件將不受影響。
因爲刪除文件要在同一個索引節點屬於惟一的鏈接時才能成功,所以能夠防止沒必要要的誤刪除。
符號鏈接(軟鏈接):用ln -s命令創建文件的符號鏈接符號鏈接是linux特殊文件的一種,做爲一個文件,它的數據是它所鏈接的文件的路徑名。相似windows下的快捷方式。
固然刪除這個鏈接,也不會影響到源文件,但對鏈接文件的使用、引用都是直接調用源文件的。
具體關係能夠看下圖:
從圖上能夠看出硬連接和軟連接的區別:
1:硬連接原文件和新文件的inode編號一致。而軟連接不同。
2:對原文件刪除,會致使軟連接不可用,而硬連接不受影響。
3:對原文件的修改,軟、硬連接文件內容也同樣的修改,由於都是指向同一個文件內容的。
磁盤和文件空間 :fdisk df du
文件目錄與管理: cd pwd mkdir rmdir ls cp rm mv
查看文件內容 cat、tac、more、less、head 、tail
文件目錄與權限 :chmod chown chgrp umask
文件查找:which、whereis、locate、find、find
標準的Linux系統通常都有一套都有稱爲應用程序的程序集,它包括文本編輯器、編程語言、X Window、辦公套件、Internet工具和數據庫等。
內核參數是用戶和系統內核之間交互的一個接口,經過這個接口,用戶能夠在系統運行的同時動態更新內核配置,而這些內核參數是經過Linux Proc文件系統存在的。所以,能夠經過調整Proc文件系統達到優化Linux性能的目的。