linux 磁盤文件系統詳解

硬盤一般分爲機械硬盤和SSD硬盤:

    機械硬盤的速度相比SSD硬盤差一大截.但價格比後者便宜一個檔次,而服務器一般用的也是機械硬盤.我們以下講的知識都是機械硬盤相關


每塊硬盤可以分爲多個磁道或者多個扇區(512 bytes)或者多個柱面(分區的基本單位)。

MBR:Master Boot Record(主引導分區)

512bytes

446: bootloader

64: 文件系統分區表

16: 標識一個分區(最多隻能分4個主分區,一個主分區代表16bytes)

2:標識磁盤分區信息(是一主一擴展分區還是兩主一擴展等等)


磁盤接口類型:

IDE (ATA):133MB/s,/dev/hd

SCSI: 640MB/s

SATA:6Gbps

SAS:6Gbps

USB:480MB/s

    

識別硬盤設備:/dev/sd

        標記不同的硬盤設備:/dev/sd[a-z](centos 5以及以前版本 ide接口硬盤爲/dev/hd開頭)

     標記同一設備上的不同分區:/dev/sd[a-z][1-]

     1-4: 主或擴展分區標識

     5+:邏輯分區標識


設備文件:特殊文件

設備號:

major, minor

major: 設備類型(下面截圖第一個major爲10)

    minor: 同一類型下的不同設備(截圖第一minor爲175)

wKiom1XpthSDHux5AAYoWrYGybA497.jpg


“塊”:block,隨機設備

“字符”:character,線性設備


從截圖可看出普通文件第五項爲文件大小,設備文件(包括塊設備文件和字符設備文件)該項爲major,minior


問題:我們爲什麼要分多個分區?

解答:這個跟windows分C,D,E,F盤一樣,如果要重裝系統之類的整盤就格式化了.還有一點在linux下分多個分區每個分區可以單獨使用文件系統


分區工具:

fdisk,parted,sfdisk

下面我主要講解fdisk工具


fdisk詳解


選項參數:

    -l [device] 列出所有分區表,如果指定設備,就只列出該設備的分區表


wKiom1XpuP3B6PQHAAG5ZLkpag8040.jpg

從該截圖看我這隻有一個硬盤,磁盤大小爲21.5GB,分了3個主分區,顯示各分區start end是以柱面爲單位,該系統是centos 6.0系列,而在centos 7.0系列該單位就是扇區.


爲了整個fdisk實驗我特地在虛擬機上加了一塊新硬盤

wKiom1Xpu6igOFzxAAKbDYkerb4145.jpg


新硬盤爲/dev/sdb 該新硬盤大小爲10.7GB

現在我們給這塊新硬盤分區 fdisk /dev/sdb

    fdisk之後選項常用參數:

        m:幫助信息

        p:顯示分區表

        d:刪除一個分區表

        l:列出已知的分區類型

        n:新建一個分區表

        q:退出不保存

        w:保存並退出

        t:修改分區表系統id


創建完成之後,查看內核是否已經識別新的分區:

    cat /proc/partitions

    

有三個命令可以讓內核重讀磁盤分區表:

    CentOS 5: partprobe [DEVICE]

    CentOS 6,7: partx, kpartx

        partx命令:

            partx DEVICE

            partx -a DEVICE

            partx -a -n M:N DEVICE

            M

            M:

            :N

        

        kpartx命令:

            kpartx -af DEVICE


詳細實例操作可以參看後面習題解答


分區又可以分爲塊設備區域,索引節點區域

wKiom1Xpv7nzGeckAADLag3ar-0047.jpg

圖畫的有點醜...

索引區域就好比一本書的目錄通過索引可以快速的定位書中指定的章節.每一個索引節點被稱爲inode.每個inode也有自己的編號.inode存儲的是該文件的屬主,屬組,權限信息,文件大小,最新修改時間,文件訪問時間之類的相當於stat文件的詳細信息(這裏要除了文件名),還有一項很重要的信息:就是該inode使用對應的數據塊.

wKiom1XpwYfhvzpFAAFC8K83zHY441.jpg


而塊設備區域分爲多個塊,對於文件類型來說每個塊存儲的是實際數據,對於目錄來說該塊存儲的是該目錄下的所有文件或目錄的文件名以及該文件對應的inode編號,該索引編號剛好對應索引區域的inode


文件查看,增加,複製,移動, 刪除原理

查看實例:cat /etc/fstab

    解答:

    1.首先肯定先通過rootfs找到根/目錄(指定的分區以及塊),通過塊的內容可以得到根下所有文件或者目錄的文件名以及inode編號,從此找到了etc對應的inode編號

    2.通過inode編號就去索引區域查找inode,從此找到了指定的inode

    3.得到了inode就可以找到etc數據塊,也可以知道etc爲目錄,可以得到etc目錄下的文件或目錄以及對應的inode編號,由此可以找到fstab的inode編號

    4.通過inode編號可以找到inode,再通過inode找到對應的數據塊由此就得到/etc/fstab文件的信息


增加實例:touch /tmp/abc.txt

    解答:

    1.首先在索引區域找到一個沒有標識爲1的inode將他標識爲1

    2.首先通過根找到tmp目錄以及tmp目錄的數據塊

    3.將tmp數據塊內容增加一行abc.txt以及對應的inode編號(該編號就是第一步得到inode編號)

    4.找到幾個未使用的數據塊(默認爲8個數據塊),標識爲1,將這批數據塊指向到inode信息


複製實例:cp /etc/fstab /tmp/test.txt

    解答:

    1.先找個空閒的inode標識爲1,並記住該inode號

    2.通過第一個查看實例找到tmp對應的數據塊並在內容里加一行test.txt以及上一步得到的inode號

    3.從數據區域找到幾個空閒的數據塊,再將這些數據塊號信息寫到inode信息中去。

    4.將/etc/fstab中的內容寫到上面得到的數據塊中


移動實例:mv /etc/fstab /tmp/test.txt

    解答:

    1.找到/etc對應的數據塊內容,刪除fstab那項,並記住該fstab對應的inode編號

    2.在/tmp對應的數據塊內容增加一行test.txt以及對應inode編號(該編號即爲第一步得到的inode編號)


這裏很容易就可以明白爲什麼移動一個文件比複製一個文件快一個檔次了把,移動文件根本沒有在文件對應的數據塊寫入該文件的內容,而複製要寫入數據.

當然這個前提是/etc和/tmp一定要在同一個分區,如果沒在同一個分區,就跟複製一樣了.因爲不一樣的分區是不能使用別的分區的inode以及數據塊的。都得重新創建inode號以及數據塊並且要將數據寫入到新的數據塊內容中去



刪除實例:rm -f /tmp/test.txt

    解答:

    1.找到/tmp對應的數據塊內容,刪除test.txt以及對應inode編號那項

    2.將test.txt對應的inode編號的inode標記未使用狀態

    3.將inode對應的數據塊全部標記爲0(未使用狀態)


刪除文件實際上根本就沒刪除數據塊對應的數據,只是將那些數據塊標記爲0,所以再沒有新數據寫到那批數據塊覆蓋掉之前的數據,恢復指定文件還是挺容易的.


講了以上原理,順便講講硬鏈接和軟鏈接:

硬鏈接特性:

    1.inode一致的兩個文件。由於inode節點一致,如果改了任何一個文件,另外一個文件內容肯定會改變,包括權限信息之類。因爲inode是一致的,inode存的信息之前我就講的很詳細了

    2.指向同一個inode的多個不同路徑; 創建文件的硬鏈接會增加inode的引用計數;刪除硬鏈接僅是刪除其一個訪問路徑,只到最後一個路徑被刪除。

    3.不能對目錄進行。原因,假如兩個目錄同時指向到同一個inode。我如果查看其中一個目錄的一個文件。我通過該目錄的父級目錄可以得到該inode,但通過根本無法找到該目錄對應的數據塊(當然我提的這點只是冰山一角)

    4.不能跨分區。原因:很簡單,不一樣的分區是不能用別的分區的inode。


軟連接特性:

    1.不一樣的inode

    2.創建的軟連接文件對應的數據塊指向另一個文件路徑,該文件大小當然就是另一個文件路徑字符的大小.

    3.可以對目錄進行

    4.可以跨分區

    5.對文件創建符號鏈接不會增加其引用計數;刪除原文件,符號鏈接文件也將無法


創建(硬|軟)鏈接命令:

    ln

    創建硬鏈接: ln /etc/fstab /tmp/1.txt

    創建軟連接: ln -s /etc/fstab /tmp/2.txt


塊位圖和inode位圖

對應上面提到的查找空閒的inode或者空閒的數據塊,我們如果一個個去遍歷查詢有沒有被使用到,效率就太慢了,所以就引入了inode位圖以及數據塊位圖,通過位圖就可以快速得到空閒的inode以及塊.


超級塊

描述文件系統整體信息的數據結構,主要描述文件系統的目錄和文件的靜態分佈情況,以及描述文件系統的各種組成結構的尺寸、數量等。


塊組:

對於非常大的文件系統,就算有位圖,去遍歷整個位圖,也是很慢的。爲了進一步提高效率又將獨立文件系統分爲各個組,稱爲塊組,每個塊組都分爲塊位圖,inode位圖,inode區域,塊區域.對於個別組還會保存超級塊的信息,如果只有一個塊組保存超級塊信息肯定不靠譜.



創建文件系統

    在分區上執行格式化(高級格式化)

        要使用某種文件系統,滿足兩個條件:

            內核中:支持此種文件系統

            用戶空間:有文件系統管理工具


    mkfs, mkfs -t type = mkfs.type

    ext系列可以使用mke2fs

    

    blkid命令:

        blkid DEVICE

            顯示信息:LABEL, UUID, TYPE(三項)

wKioL1Xp3TjDUB8PAACGWzpWBzY603.jpg

    

mke2fs [OPTION]... DEVICE

-t {ext2|ext3|ext4}

-b {1024|2048|4096}

-L 'LABEL'

-j: mke2fs -t ext3

-i #:

-N #:

-m #: 預留磁盤空間佔據多大百分比的空間爲後期管理使用;

-O FEATURE[,...]

-O ^FEATURE:關閉此特性

has_journal


文件系統屬性查看及調整工具

e2label

    e2lable DEVICE [LABEL]

        1.不指定[LABEL]選項,顯示設備的卷標

        2.指定[LABEL]選項,設置該設備的卷標


tune2fs

    顯示ext系列文件系統的屬性,或調整其屬性;

    

     -l:顯示超級塊中的信息;顯示整個文件的屬性及佈局等相關信息;

     -L 'LABEL':修改卷標;

     -m #: 調整預留給管理員的管理空間百分比;

     -j: ext2 --> ext3

     -O:文件系統屬性的啓動或關閉 

     -o:文件系統默認掛載選項的啓用或關閉


dumpe2fs:

-h: 僅顯示超級塊信息;


文件系統檢測


fsck: Filesystem check

fsck -t type

fsck.type

-a: 自動修復錯誤

-r: 交互式修復錯誤

-f: 強制檢測


e2fsck:ext系列文件系統專用的檢測修復工具;

-y: 自動回答爲“yes”

-f:force



文件系統的掛載和使用

將額外文件系統與根文件系統某現存的目錄建立起關聯關係,進而使得此目錄做爲其它文件系統訪問入口的行爲,稱之爲掛載;

而解除此關聯關係的過程:叫卸載;

掛載點:mount point, 設備掛載至目錄;

注意:掛載點在掛載在之後,其內部原有的文件會被暫時隱藏;建立使用空目錄做爲掛載點;


掛載方法:    

    mount:通過讀取/etc/mtab文件來顯示當前系統所有已經掛載的設備;

    mount -a:掛載/etc/fstab文件中的所有支持自動掛載的文件系統;

    mount [options] [-o options] DEVICE MOUNT_POINT

        [options]:命令選項

[-o options]:掛載選項


        DEVICE: 要掛載的設備

            (1) 設備文件:/dev/sda5

            (2) 卷標:-L 'LABEL'

            (3) UUID:-U 'UUID'

            (4) 僞文件系統名稱

        我們一般掛載設備選得都是第一種方式


        MOUNT_POINT: 掛載點

        

    mount常用選項:

        -t type:文件系統類型

        -r: 以“只讀”方式掛載此文件系統

        -w: 以“讀寫”方式掛載此文件系統

        -n:每個文件系統在掛載時都會自動更新/etc/mtab文件,-n用於禁止此功能;

            此時,如果想查看掛載的所有文件系統:cat /proc/mounts

        -a: 自動掛載所有支持自動掛載的設備;一般去查看/etc/fstab文件的選項自動掛載

        -B:綁定目錄至另一個目錄上;


        -o 掛載選項:

            async:異步模式

            sync: 同步模式

            atime/noatime:是否更新訪問時間戳;

            diratime/nodiratime:是否更新目錄的訪問時間戳;

            auto/noauto: 是否允許此設備被自動掛載;

            exec/noexec:是否允許執行此文件系統上應用程序;

            dev/nodev:是否支持在此設備上使用設備文件;

            suid/nosuid:是否支持suid

            remount:重新掛載

            ro

            rw

            user/nouser: 是否允許普通掛載此設備;

            acl:是否支持此設備上使用facl;

            defaults:rw, suid, dev, exec, auto, nouser, and async

            

        感覺一般的掛載選項都是defaults


    umount:卸載命令

        umount DEVICE | umount MOUNT_POINT

        查看正在訪問指定掛載點的進程:

        fuser -v MOUNT_POINT

        補充:如果有進程正在訪問掛載點,是不允許卸載的,因此需要下面的命令

        終止所有正在訪問指定的掛載點的進程:

        fuser -km MOUNT_POINT

    

交換分區        

    free命令:

        查看memory和swap的使用狀態

        -m: 以MB爲單位

        -g: 以GB爲單位

    

    mkswap:創建交換分區

        mkswap [option] DEVICE

            -L 'LABEL'


    swapon:啓用交換分區

        swapon [option] [DEVICE]

            -a: 激活所有交換分區

            -p PRIORITY: 設定其優先級;


    swapoff:禁用交換分區

        swapoff [option] [DEVICE]


文件系統等空間佔用信息的查看

    df: disk free

        -h: human-readable

        -i: inode數量

        -P: 以Posix兼容的格式輸出

    du: disk usage

        -h: human-readable

        -s: summary


文件系統相關掛載配置文件:/etc/fstab

    每行定義一個文件系統;


wKioL1Xp2R2g1cEhAAIYZvptoF0375.jpg        


要掛載的設備或僞文件系統:設備文件、LABEL=、UUID=、僞文件系統名稱

掛載點:掛載指定的目錄

文件系統類型

掛載選項:defaults

轉儲頻率:0 => 不轉儲, 1 => 每天轉儲, 2 => 每隔一天轉儲(一般爲0即可)

自檢次序:0 => 不自檢, 1=> 首先自檢,通常只有/才爲1, 2 => ...(一般爲0即可)


一般修改了/etc/fstab文件增加幾項新的掛載點,它不會立馬生效,它只會在重啓之後纔會生效.如果要立馬生效,需要執行命令mount -a即可


實戰


  1. 創建一個10G文件系統,類型爲ext4,要求開機可自動掛載至/mydata目錄;        

解答步驟:

1.首先我這裏新加塊10G的硬盤展示爲/dev/sdb

2.fdisk /dev/sdb

3.敲n 新創建一個分區.

4.之後選擇p 創建一個主分區,因爲模擬的是一塊10G的新硬盤,無所謂. 

5.w保存分區表

wKiom1Xp2mLS9SglAAFSTU9lGVw472.jpg

6.partx -a /dev/sdb

7.cat /proc/partitions,由下圖可以看出/dev/sdb1已經加載到內核中

wKioL1Xp3oqD7X5TAAC1UTYVfCQ485.jpg

8.mke2fs -t ext4 /dev/sdb1

wKiom1Xp3O6CDywCAAKO6T82dNU509.jpg

9.mkdir /mydata

10.vim /etc/fstab(修改保存)

wKioL1Xp4A6B_toPAAHpsNbzlE8169.jpg

11.mount -a(讓該掛載即時生效,否則只能重啓才能生效)

12.df -h查看是否掛載成功

wKiom1Xp3kSTA4BGAADWovvhWgo436.jpg


由此整題解答完畢






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章