先根據讀內核源碼一書的理解,做如下記錄:
1.內存緩沖區是用戶和硬盤文件進行交互的必經之地。當進行讀硬盤時,先依據dev、塊號等信息獲取緩沖塊(這是由bread-->getblk),然后調用ll_rw_block函數創造讀請求,然后調用hd_out函數讀取后放入緩沖區內,中斷返回。
2.超級塊(super_block)主要用于存放整個文件系統的信息,當創建新的硬盤邏輯塊時會調用new_block,該函數會先讀取超級塊(get_super(dev))的信息,看看是否滿足條件、設置位圖等等。
一:
什么是文件系統,詳見:http://zh.wikipedia.org/zh/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F
其實一句話就是管理這塊文件的機制(組織方式,數據結構之類...)
Linux系統中存在很多的文件系統,例如常見的ext2,ext3,ext4,sysfs,rootfs,proc...很多很多。。。我們知道每個文件系統是獨立的,有自己的組織方法,操作方法。那么對于用戶來說,不可能所有的文件系統都了解,那么怎么做到讓用戶透明的去處理文件呢?例如:我想寫文件,那就直接read就OK,不管你是什么文件系統,具體怎么去讀!OK,這里就需要引入虛擬文件系統。
所以虛擬文件系統就是:對于一個system,可以存在多個“實際的文件系統”,例如:ext2,ext3,fat32,ntfs...例如我現在有多個分區,對于每一個分區我們知道可以是不同的“實際文件系統”,例如現在三個磁盤分區分別是:ext2,ext3,fat32,那么每個“實際的文件系統”的操作和數據結構什么肯定不一樣,那么,用戶怎么能透明使用它們呢?那么這個時候就需要VFS作為中間一層!用戶直接和VFS打交道。例如read,write,那么映射到VFS中就是sys_read,sys_write,那么VFS可以根據你操作的是哪個“實際文件系統”(哪個分區)來進行不同的實際的操作!那么這個技術也是很熟悉的“鉤子結構”(此名稱不知道是否合理,自己一直這樣叫了)技術來處理的。其實就是VFS中提供一個抽象的struct結構體,然后對于每一個具體的文件系統要把自己的字段和函數填充進去,這樣就解決了異構問題。
如圖:
二:
Linux虛擬文件系統四大對象:
1)超級塊(super?block)
2)索引節點(inode)
3)目錄項(dentry)
4)文件對象(file)
=> 超級塊:一個超級塊對應一個文件系統(已經安裝的文件系統類型如ext2,此處是實際的文件系統哦,不是VFS)。之前我們已經說了文件系統用于管理這些文件的數據格式和操作之類的,系統文件有系統文件自己的文件系統,同時對于不同的磁盤分區也有可以是不同的文件系統。那么一個超級塊對于一個獨立的文件系統。保存文件系統的類型、大小、狀態等等。
(“文件系統”和“文件系統類型”不一樣!一個文件系統類型下可以包括很多文件系統即很多的super_block)
既然我們知道對于不同的文件系統有不同的super_block,那么對于不同的super_block的操作肯定也是不同的,所以我們在下面的super_block結構中可以看到上面說的抽象的struct結構(例如下面的:struct super_operations):
http://blog.csdn.net/sdulibh/article/details/50574595
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的定義,主要是根據裝機的分區來的:
#
proc/procprocdefaults00
#/dev/sda1被自動掛載到/
UUID=cb1934d0-4b72-4bbf-9fad-885d2a8eeeb1 /ext3relatime,errors=remount-ro 01
# /dev/sda5被自動掛載到分區/home
UUID=c40f813b-bb0e-463e-aa85-5092a17c9b94 /homeext3relatime02
#/dev/sda7被自動掛載到/work
UUID=0f918e7e-721a-41c6-af82-f92352a568af /workext3relatime02
#分區/dev/sda6被自動掛載到swap
UUID=2f8bdd05-6f8e-4a6b-b166-12bb52591a1f noneswapsw00
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文件系統也存在很大差別,如果要了解可以查看專門的文件系統介紹。
http://www.iteye.com/topic/816268
https://www.ibm.com/developerworks/cn/linux/l-linux-filesystem/
http://blog.csdn.net/younger_china/article/details/7068773
http://blog.csdn.net/hudan2714/article/details/14452981