天天看點

Linux檔案系統

檔案系統

一、檔案系統的概念

1、什麼是檔案系統

    廣義上來說,檔案系統是對儲存設備的資料和中繼資料的進行管理或者說組織的一種機制。檔案系統類型是這種機制的不同管理方式。

2、存儲空間的組成

    存儲空間一般是由資料區 和 中繼資料區組成的,一般中繼資料區存放檔案的中繼資料,每個檔案都有自己的中繼資料,這些中繼資料存放在inode(index node)中,為了友善查找檔案。

    inode用于存儲檔案的各種屬性:

檔案的大小

檔案名

屬主,屬組

時間戳

權限

以及對應在磁盤上的塊号(對應block的位置資訊)

    每個檔案中的資料,存放在資料區,由block管理。block用于存儲檔案内容。

    當建立一個目錄時,檔案系統會為該目錄配置設定一個inode和至少一個block。該inode記錄該目錄的屬性,并指向那塊block。該block記錄該目錄下相關聯的檔案或目錄的關聯性和名字。   

    當建立一個檔案時,檔案系統會為該檔案配置設定至少一個inode和與該檔案大小相對應的數量的block。該inode記錄該檔案的屬性,并指向block。   如果一個目錄中的檔案數太多,以至于1個block容納不下這麼多檔案時,Linux的檔案系統會為該目錄配置設定更多的block。

    Dentry 是将 Inode 和 檔案聯系在一起的”粘合劑”,它将 Inode number 和檔案名聯系起來。Dentry 也在目錄緩存中扮演了一定的角色,它緩存最常使用的檔案以便于更快速的通路。Dentry 還儲存了目錄及其子對象的關系,用于檔案系統的周遊。

二、檔案系統結構

1、檔案結構在存儲空間中的結構如下:

<a href="http://s3.51cto.com/wyfs02/M00/3C/B4/wKioL1PCFlPyXmDlAADIR8YN2KA552.jpg" target="_blank"></a>

superblock: 是記錄中繼資料的中繼資料。檢視超級塊資訊:tune2fs -l DEVICE;dumpe2fs -h DEVICE

GDT:塊組的描述資訊,記錄何處開始記錄資料

Block bitmap:記錄那些Block是空閑的

Inode bitmap:記錄那些Inode是空閑的

Inode table:存放Inode資料,裡面有好多的inode資料。

Data blocks:存放資料

2、連結檔案

1)連結檔案種類和定義

硬連結:多個檔案指向同一個inode(在dentry裡面),此時,一個檔案就稱為其他檔案的硬連結。沒建立一個硬連結檔案,Inode的引用數就會增加1。

軟連結:相當于windows裡面的快捷方式。具體多個檔案在Dentry裡面指向的是一個檔案名,而不是Inode。此時,這些檔案稱指向那個檔案的軟連結。

2)建立連結檔案

    使用 ln [-sv] SRC DEST建立。其中-s,-v是常用選項,分别表示顯示建立過程,建立軟連結檔案。

    但是在建立連結檔案時需注意:

硬連結:

        不能對目錄檔案建立硬連結

        硬連結不能跨分區

        建立硬連結會增加inode引用計數

符号連結:

        可以對目錄建立

        不受分區限制

        對檔案建立符号連結不會增加引用計數

3)檔案的删除、複制、移動的過程

檔案被删除:inode被标記為空閑(Inode bitmap),此inode指向的磁盤塊被标記為空閑;如果inode被引用了多次,且此次删除未使得其引用計數降低為的話,這意味着檔案被删除僅删除了一個通路路徑;

檔案複制:建立一個新檔案,并原檔案中資料在新檔案指向的磁盤塊中再寫一次的過程;

檔案移動:在同一個分區移到:移動檔案僅是改變了檔案通路路徑;跨分區移到:在新分區建立檔案,把資料複制過去,删除原分區資料。

3、檔案系統的類型以及表示方法

1)檔案系統的類型

    常見的有:ext2(不支援日志),ext3,ext4, xfs, ffs, ufs, reiserfs, jfs, vfat(fat32), ntfs

2)表示方法

a.磁盤裝置檔案

磁盤裝置類型

    /dev/hd:磁盤接口是IDE類型的用這種方法表示

        IDE: 并口, 133MB/s

    /dev/sd:磁盤接口是SATA類型的用這種方法表示

        USB: 串行

        SATA: 串行,6Gbps/8

        SCSI: 并行,(Small Computer System Interface)

        SAS:串行

    在centos6系列中,不管是IDE類還是SATA類都是以/dev/sd這種方式表示

表示磁盤類型下的不同裝置

    /dev/sd[a-z]:用字母a-z表示不同的裝置

 分區:數字表示不同的分區

    /dev/sda1 

    /dev/sda2

    分區編号:主分區、擴充分區編号1-4,邏輯分區是&gt;=5的

b.特殊裝置檔案

    特殊裝置檔案是隻有Inode,沒有Block資料的檔案(此時對應的就是真正的實體裝置檔案)。在Inode中關聯的是硬體的管道程式,通過驅動程式和硬體相關聯。

    特殊檔案通過裝置号來辨別這些檔案。主裝置号來辨別裝置類型,次裝置号來辨別相同裝置下的不同裝置。

    我們可以手動添加這樣的裝置檔案:

    mknod: make block or character special files(man 文檔的解釋)

       Usage:mknod [OPTION]... NAME TYPE [MAJOR MINOR]   

    例如:mknod /dev/deviceloop b 12 4

三、磁盤的分區,格式化,挂載,解除安裝,磁盤修複

分區

    在Linux中分區是針對柱面的。在Linux中主分區和擴充分區最多隻能有四個,可以再擴充分區上建立邏輯分區,最多隻能有64個邏輯分區。這是由MBR分區決定的。

    常用的分區工具有fdisk,partd等。這裡我們介紹fdisk工具。

        Usage: fdisk [option]... [DEVICE]...

    檢視一塊磁盤的分區資訊,例如:fdisk -l /dev/sda

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>[root@server ~]</code><code># fdisk -l /dev/sda</code>

<code>Disk </code><code>/dev/sda</code><code>: 107.4 GB, 107374182400 bytes</code>

<code>255 heads, 63 sectors</code><code>/track</code><code>, 13054 cylinders</code>

<code>Units = cylinders of 16065 * 512 = 8225280 bytes</code>

<code>Sector size (logical</code><code>/physical</code><code>): 512 bytes / 512 bytes</code>

<code>I</code><code>/O</code> <code>size (minimum</code><code>/optimal</code><code>): 512 bytes / 512 bytes</code>

<code>Disk identifier: 0x0001477f</code>

<code>   </code><code>Device Boot      Start         End      Blocks   Id  System</code>

<code>/dev/sda1</code>   <code>*           1          26      204800   83  Linux</code>

<code>Partition 1 does not end on cylinder boundary.</code>

<code>/dev/sda2</code>              <code>26        7859    62914560   8e  Linux LVM</code>

<code>[root@server ~]</code><code>#</code>

    給一塊磁盤分區,例如:fdisk /dev/sdb。下面是fdisk的菜單欄,對常用的做了解釋。

<a href="http://s3.51cto.com/wyfs02/M00/3C/B5/wKiom1PCLBWw59yrAAKYs9IH5XU923.jpg" target="_blank"></a>

    建立分區過程,例如建立一個主分區号位1的主分區,大小為500M。

<a href="http://s3.51cto.com/wyfs02/M00/3C/B5/wKiom1PCLmPg6dLzAAMCHYAVehs622.jpg" target="_blank"></a>

    最後使用fdisk中的子指令w儲存退出。分區過程完畢。但是對于剛分好的區核心不知道,是以我們要讓核心重讀分區表。

    在 CentOS5中:

        # partprobe [DEVICE] 

    在 CentOS6中:

        # partx -d [DEVICE]

        # partx -a [DEVICE]

下面簡單介紹一下parted分區工具: 

    有時我們在寫腳本時,需要非互動式的對磁盤進行分區。parted是一個不錯的分區工具。它是一個實時的分區工具,不像fdisk,需要w才能儲存。

    Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]    

    最常用的選項:-s | --script:( never prompts for user intervention),實作非互動方式

    常用的COMMAND:mkpart PART-TYPE [FS-TYPE] START END

        PART_TYPE的取值有primary,logical,extended

        START:1,1G 預設是M

        END:12G

    rm NUMBER delete partition NUMBER 删除一個分區

    print [devices|free|list,all|NUMBER]   顯示分區資訊

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

<code>####下面是一些常用的操作</code>

<code>[root@server scripts]</code><code># parted -s /dev/sdb print</code>

<code>Model: VMware, VMware Virtual S (scsi)</code>

<code>Disk </code><code>/dev/sdb</code><code>: 21.5GB</code>

<code>Sector size (logical</code><code>/physical</code><code>): 512B</code><code>/512B</code>

<code>Partition Table: msdos</code>

<code>Number  Start   End    Size   Type     File system  Flags</code>

<code>[root@server scripts]</code><code># parted -s /dev/sdb mkpart primary 1 512</code>

<code>[root@server scripts]</code><code># parted -s /dev/sdb mkpart extended 512  10G</code>

<code>[root@server scripts]</code><code># parted -s /dev/sdb mkpart logical 512 1G</code>

<code>Number  Start   End     Size    Type      File system  Flags</code>

<code> </code><code>1      1049kB  512MB   511MB   primary</code>

<code> </code><code>2      512MB   10.0GB  9489MB  extended               lba</code>

<code> </code><code>5      512MB   1000MB  488MB   logical</code>

<code>[root@server scripts]</code><code># parted -s /dev/sdb rm 1</code>

<code>Number  Start  End     Size    Type      File system  Flags</code>

<code> </code><code>2      512MB  10.0GB  9489MB  extended               lba</code>

<code> </code><code>5      512MB  1000MB  488MB   logical</code>

<code>[root@server scripts]</code><code># parted -s /dev/sdb rm 2</code>

<code>Number  Start  End  Size  Type  File system  Flags</code>

格式化

格式化就是在分好的區區上建立檔案系統。常見的格式化工具有mkfs,mke2fs工具。

mkfs工具使用起來簡單,而mke2fs工具可以進行比較詳細的設定。

1)mkfs

    mkfs : make file system,建立檔案系統

        Usage: mkfs -t FSTYPE [DEVICE] 等價 mkfs -t FSTYPE = mkfs.FSTYPE

        例如:mkfs -t ext4 = mkfs.ext4

    注意:有些檔案系統Linux核心是支援的,但是我們建立的時候卻沒有這種檔案系統。這是由于Linux的發行版沒有将這些功能編譯到核心中去。由于Linux核心是子產品化的,而且支援動态編譯。如果我們使用某一子產品的話,可以手動添加進去。

    使用lsmod可以檢視核心編譯進去的子產品。

    以CentOS6為例,發行版不支援xfs檔案系統,此時我們可以講安裝這個子產品的一個管理工具。

    # yum -y install xfsprogs 

2)mke2fs

    mke2fs是ext系列檔案系統的管理工具,但實際上也可以管理其他的檔案類型。

    mkfs的常用參數

常用參數

具體意義

-t

-t 指定檔案系統的類型

例如:mke2fs -t ext4 /dev/sdb1

-b

-b 指定Block的大小,一般是1024,2048,4096

例如:mke2fs -t ext4 -b 1024 /dev/sdb1

-L

-L 指定分區的卷标(别名)

例如:mke2fs -t ext4 -L DATA /dev/sdb1

相當于:e2label /dev/sdb1 DATA

-j

-j 支援日志,針對那些沒有日志的檔案系統

例如:mke2fs -t ext2 -j /dev/sdb1

-i

-i 定義多上個位元組建立一個Inode,次位元組數應大于Bock的位元組數

例如:mke2fs -t ext4 -b 1024 -i 2048 /dev/sdb1

-N

-N 指定可用的節點數

-m

-m 預留百分比,預設是5

為什麼要預留呢?這是為了友善管理者的一些操作。

-O

-O 指定分區特性

-U

-U 設定磁盤的UUID

這個資訊通過 blkid [-L LABEL] DEVICE檢視

<code>[root@server ~]</code><code># mke2fs -t ext4  -b 2048 -m 3 -L DATA /dev/sdb1</code>

<code>mke2fs 1.41.12 (17-May-2010)</code>

<code>Filesystem label=DATA</code>

<code>OS </code><code>type</code><code>: Linux</code>

<code>Block size=2048 (log=1)</code>

<code>Fragment size=2048 (log=1)</code>

<code>Stride=0 blocks, Stripe width=0 blocks</code>

<code>130560 inodes, 261040 blocks</code>

<code>7831 blocks (3.00%) reserved </code><code>for</code> <code>the super user</code>

<code>First data block=0</code>

<code>Maximum filesystem blocks=267386880</code>

<code>16 block </code><code>groups</code>

<code>16384 blocks per group, 16384 fragments per group</code>

<code>8160 inodes per group</code>

<code>Superblock backups stored on blocks: </code>

<code>    </code><code>16384, 49152, 81920, 114688, 147456</code>

<code>Writing inode tables: </code><code>done</code>                            

<code>Creating journal (4096 blocks): </code><code>done</code>

<code>Writing superblocks and filesystem accounting information: </code><code>done</code>

<code>This filesystem will be automatically checked every 20 mounts or</code>

<code>180 days, whichever comes first.  Use tune2fs -c or -i to override.</code>

<code>[root@server ~]</code><code># blkid /dev/sdb1</code>

<code>/dev/sdb1</code><code>: UUID=</code><code>"4a7da175-992f-4cd8-8327-96ec40c1d8f2"</code> <code>TYPE=</code><code>"ext4"</code> <code>LABEL=</code><code>"DATA"</code>

    至此格式化完畢。

    但是我們在格式化完畢後,發現某些屬性忘記添加了。可以使用tune2fs指令來修改。

        Usage:tune2fs [options].. [DEVICE]...

    常用參數:

        -j :添加日志

        -L LABEL修改卷标

        -m 修改預留百分比

        -O [^]FEATURE: 啟用指定特性,特性前加^,表示關閉此種特性

        -o [^]mount-options: 開啟或關閉指定的挂載選項

挂載

    挂載的目的是讓已經格式化好的分區和某個目錄相關聯,提供通路磁盤分區的入口。長使用的挂載指令式mount。

        Usage: mount [options]... DEVICE MOUNT_POINT

    這裡對挂載點的基本要求是:必須是目錄;一般使用空目錄作為挂載點。

示例

-t 指定挂載檔案系統類型

mount -t ext4 -w /dev/sdb1 /mnt

-r

-r 隻讀挂載

-w

-w 讀寫挂載

-L 卷标挂載(使用卷标來确定裝置)

mount -t ext4 -L DATA  /mnt

-L UUID挂載(使用UUID來确定裝置)

-a

-a 自動挂載,讀取/etc/fstab檔案

mount -a -n

-n

-no-mtab 不更新/etc/mtab檔案

-o 

-o optoin指定額外屬性,多個屬性用逗号隔開

,如果不指定,則使用預設屬性。

rw, suid, dev, exec, auto, nouser, async, and relatime

async:異步I/O,資料寫操作先于記憶體完成,而後再根據某種政策同步至持久裝置中

sync: 同步I/O,資料寫操作完成後立即同步到磁盤中

atime/noatime: 檔案和目錄被通路時是更新最近一次的通路時間戳

auto/noauto:裝置是否支援mount的-a選項自動挂載

diratime/nodiratime: 目錄被通路時是更新最近一次的通路時間戳

dev/nodev: 是否支援在此裝置上使用裝置

exec/noexec: 是否允許執行此裝置上的二進制程式檔案

suid/nosuid: 是否支援在此裝置的檔案上使用suid

remount: 重新挂載,通常用于不解除安裝的情況下重新指定挂載選項

ro: 隻讀

rw: 讀寫

user/nouser: 是否允許普通挂載此檔案裝置

acl: 在此裝置是支援使用facl,預設不支援

mount -t ext4 -o sync,acl,suid,noexec /dev/sdb1 /mnt

挂載情況:

    至此,挂載已完成。

    但是,這些挂載内容在下次重新開機之後,就不在了。是以,為了下次開機之後還能挂載到,我們要把這些資訊儲存到配置檔案/etc/fstab。

<a href="http://s3.51cto.com/wyfs02/M01/3C/B6/wKioL1PCS2TBuyJnAAHBXqLbrWw808.jpg" target="_blank"></a>

    注意:如果挂載點目錄不是空檔案時,它原先在裡面的檔案就會被隐藏起來。

解除安裝

    當不需要使用這個分區的時候,需要将這個磁盤分區解除安裝。使用 umonut DEVICE 或者 umont DEVICE_POINT 來解除安裝。

    但是,在解除安裝的時候我們剛好在通路這個目錄,那麼會提示裝置忙,拒絕退出。此時,有2種解決方案:1、退出此目錄。2、使用fuser指令強制退出。

<a href="http://s3.51cto.com/wyfs02/M01/3C/B6/wKioL1PCR63j-NV7AAHUZjo_gOU304.jpg" target="_blank"></a>

磁盤檢查

    什麼情況下會進行磁盤檢查呢?在出現意外情況下,比如說斷電,導緻了正在寫入磁盤的資料非正常退出。使用fsck 或者 e2fsck工具來檢查。

    fsck:check and repair a Linux file system

        -t fstype

        -a: 自動修複錯誤

        -r: 互動式修複錯誤

    e2fsck: 專用于檢測和修複ext系列檔案系統

        -y: 對問題自動回答為yes 

        -f: 強制進行檢測

swap分區

    swap是交換分區,一般情況下是在記憶體不夠的情況下,啟用的一種機制。是将外存作為在特殊情況下當做記憶體使用,一般情況下模式記憶體的2倍。

<code>########第一種情況:使用一個分區作為交換分區###########</code>

<code>#第一步:添加一個交換分區</code>

<code>[root@server ~]</code><code># fdisk -l /dev/sdb | grep "swap"</code>

<code>/dev/sdb2</code>              <code>66         197     1060290   82  Linux swap / Solaris </code>

<code>#第二步:将這個分區格式化為swap</code>

<code>[root@server ~]</code><code># mkswap /dev/sdb2</code>

<code>Setting up swapspace version 1, size = 1060284 KiB</code>

<code>no label, UUID=ccf2f05f-fcf8-46ca-a304-d759887785d1</code>

<code>#第三步:挂載使用</code>

<code>[root@server ~]</code><code># swapon /dev/sdb2</code>

<code>[root@server ~]</code><code># swapon -s</code>

<code>Filename                Type        Size    Used    Priority</code>

<code>/dev/dm-1</code>                               <code>partition    2097144 0   -1</code>

<code>/dev/sdb2</code>                               <code>partition    1060280 0   -2</code>

<code>########第二種情況:使用一個檔案作為交換分區###########</code>

<code>#第一步:添加一個作為交換分區的檔案</code>

<code>[root@server ~]</code><code># dd if=/dev/zero of=./myswap bs=1M count=1024</code>

<code>1024+0 records </code><code>in</code>

<code>1024+0 records out</code>

<code>1073741824 bytes (1.1 GB) copied, 50.1967 s, 21.4 MB</code><code>/s</code>

<code>#第二步:将這檔案區格式化為swap</code>

<code>[root@server ~]</code><code># mkswap -f ~/myswap </code>

<code>Setting up swapspace version 1, size = 1048572 KiB</code>

<code>no label, UUID=f818dd1c-395f-4da2-bf5e-1edb1483100e</code>

<code>[root@server ~]</code><code># swapon ./myswap </code>

<code>/root/myswap</code>                            <code>file</code>        <code>1048568 0   -2</code>

<code>###解除安裝使用 swapoff [DEVICE] 就可以。當然,要想在下次開機時加載,必須将這些寫入到/etc/fstab 檔案中去。</code>

本文轉自 羊木狼 51CTO部落格,原文連結:http://blog.51cto.com/guoting/1437607,如需轉載請自行聯系原作者

繼續閱讀