歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 文件系統入門知識

文件系統入門知識

日期:2017/2/28 13:43:49   编辑:Linux教程

一、文件系統類型

  • Linux文件系統: ext2, ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap

  • 光盤:iso9660

  • Windows:fat32, ntfs

  • Unix: FFS(fast), UFS(unix), JFS2

  • 網絡文件系統:NFS, CIFS

  • 集群文件系統:GFS2, OCFS2(oracle)

  • 分布式文件系統:ceph, moosefs, mogilefs, fastdfs,glusterfs, Lustre

  • RAW:未經處理或者未經格式化產生的文件系統

文件根據其是否支持“日志(journal)”功能可分為兩類:

  • 有日志:ext3, ext4, xfs

  • 無日志:ext2

小貼士:日志文件系統:

一種文件系統,指在文件系統發生變化時,先把相關的信息寫入一個被稱為日志的區域,然後再把變化寫入主文件系統的文件系統。在文件系統發生故障(如內核崩潰或突然停電)時,日志文件系統更容易保持一致性,並且可以較快恢復。

二、虛擬文件系統

虛擬文件系統也成為VFS。

VFS存在的意義:

  • 1.向上,對應用層提供一個標准的文件操作接口;

  • 2.對下,對文件系統提供一個標准的接口,以便其他操作系統的文件系統可以方便的移植到Linux上;

  • 3.VFS內部則通過一系列高效的管理機制,比如inode cache, dentry cache 以及文件系統的預讀等技術,使得底層文件系統不需沉溺到復雜的內核操作,即可獲得高性能;

  • 4.此外VFS把一些復雜的操作盡量抽象到VFS內部,使得底層文件系統實現更簡單。

VFS架構圖

三、文件系統的組成

文件系統管理分兩部分組成:

  • 文件系統內核模塊:如 ext4, xfs, vfat...

  • 文件系統管理工具:如 mkfs.ext4, mkfs.xfs,mkfs.vfat...

查看當前系統支持的文件系統類型

[root@CentOS6 ~]# cat /proc/filesystems 
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
...

四、文件系統選擇

1、大量小文件(LOSF, Lost of small files)I/O應用(如小圖片)

Reiserfs(首選), Ext4文件系統適合這類負載特征,IO調度算法選擇deadline,block size = 4096, ext4關閉日志功能。

2、大文件I/O應用(如視頻下載、流媒體)

EXT4文件系統適合此類負載特征,IO調度算法選擇anticipatory, block size = 4096, 關閉日志功能,啟用extent(default)。

3、SSD文件系統選擇

EXT4/Reiserfs可以作為SSD文件系統,但未對SSD做優化,不能充分發揮SSD性能,並影響SSD使用時間。 Btrfs對SSD作了優化,mount通過參數啟用。但Btrfs仍處於實驗階段,生產環境謹慎使用。

五、創建與管理文件系統

1.mkfs命令

格式:

mkfs -t <ext4|xfs|btrfs|vfat> /dev/DEVICE

常用選項:

-t FS_TYPE:指定文件系統類型
-L LABEL:指定卷標名稱

實例:

[root@bash ~]# mkfs -t ext4 -L "YOUNG" /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=YOUNG
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5242880 blocks
262144 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2153775104
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

2.mkfs.FS_TYPE命令

格式:

mkfs.FS_TYPE /dev/DEVICE

實例:

[root@bash ~]# mkfs.ext4 /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
...

3.mke2fs命令

mke2fs專用於ext系列文件系統的創建於管理。

常用選項:

-t {ext2|ext3|ext4}:指定文件系統
-b {1024|2048|4096}: 指定塊大小
-L LABEL:卷標,即分區名稱
-j: 相當於“mke2fs -t ext3”
    mkfs -t ext3 = mke2fs -t ext3 = mke2fs -j = mke2fs -O has_journal
-i #: 為數據空間中的每多少字節創建一個inode;此字節數不應該小於塊大小;比例關系;
-I: 一個inode記錄大小128---4096
-N #:直接指定元數據區有多少個inode;
-m #: 指定為管理預留管理空間占據總空間的百分比;默認為5%
-O FEATURE[,...]:指定啟用分區的某特殊特性
-O ^FEATURE:關閉指定特性
    -O has_journal:啟用日志
    -O ^has_journal:關閉關閉

實例:

[root@bash ~]# mke2fs -t ext4 -b 4096 -L 'young'\
-i 4096 -N 100000 -I 128 -m 6 -O has_journal /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=young
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
102400 inodes, 5242880 blocks
314572 blocks (6.00%) reserved for the super user
...

4.e2lablel命令

e2lablel命令用於卷標查看及管理。

格式:

e2label DEVICE [LABEL]

實例:

[root@bash ~]# e2label /dev/sdb
young
[root@bash ~]# e2label /dev/sdb "GEEK"
[root@bash ~]# e2label /dev/sdb
GEEK

5.blkid命令

blkid命令用於塊設備屬性信息顯示。

格式:

blkid [OPTIONS] [DEVICE]

常用選項:

-U UUID: 列出某UUID對應的設備
-L LABEL: 列出使用此LABEL設備

實例:

[root@bash ~]# blkid 
/dev/sdb: LABEL="GEEK" UUID="2e564b3f-e542-4bef-aa88-d70935c5c5fb" TYPE="ext4" 
/dev/sr0: UUID="2015-12-09-22-36-30-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" 
/dev/sda1: UUID="812a29ec-11dd-4fa6-b373-c4b42fb80162" TYPE="xfs" 
/dev/sda2: UUID="3b67c557-763b-41f2-aff0-4810b0324128" TYPE="xfs" 
/dev/sda3: UUID="86e06c71-0806-4463-bf6d-490a28cb12b6" TYPE="xfs" 
/dev/sda5: UUID="431c5b57-a52d-4fcc-8845-f984c463b78f" TYPE="swap" 
[root@bash ~]# ^C
[root@bash ~]# blkid -U 2e564b3f-e542-4bef-aa88-d70935c5c5fb
/dev/sdb
[root@bash ~]# blkid /dev/sdb
/dev/sdb: LABEL="GEEK" UUID="2e564b3f-e542-4bef-aa88-d70935c5c5fb" TYPE="ext4" 
[root@bash ~]# blkid -L "GEEK" 
/dev/sdb

6.dumpe2fs命令

dumpe2fs用於ext系列文件系統的超級塊信息查看。

格式:

dumpe2fs [OPTIONS] DEVICE

常用選項:

-h: 僅顯示超級塊信息

實例:

[root@CentOS6 ~]# dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   <none>
Last mounted on:          /boot
Filesystem UUID:          23048871-a3fd-4d25-92da-5c39459bf7c6
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              51200
Block count:              204800
Reserved block count:     10240
Free blocks:              64456
Free inodes:              49329
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         2048
Inode blocks per group:   256
Flex block group size:    16
Filesystem created:       Tue Jul 19 19:11:41 2016
Last mount time:          Tue Jan 31 02:35:52 2017
Last write time:          Tue Jan 31 02:35:52 2017
Mount count:              143
Maximum mount count:      -1
Last checked:             Tue Jul 19 19:11:41 2016
Check interval:           0 (<none>)
Lifetime writes:          332 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      ac8bb143-702c-4f17-80fd-afda06b8763e
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
Journal size:             4096k
Journal length:           4096
Journal sequence:         0x000002a7
Journal start:            1


Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
  Checksum 0x70bd, unused inodes 214
  Primary superblock at 1, Group descriptors at 2-2
  Reserved GDT blocks at 3-258
  Block bitmap at 259 (+258), Inode bitmap at 275 (+274)
  Inode table at 291-546 (+290)
  3545 free blocks, 216 free inodes, 229 directories, 214 unused inodes
  Free blocks: 4648-8192
  Free inodes: 34, 1834-2048
...

innode與超級塊關系圖:

超級塊:超級塊(superblock)的作用是存儲文件系統的大小、有多少是空的和已經填滿的占多少,以及他們各自的總數和其他諸如此類的信息。要使用一個分區來進行數據訪問,那麼第一個要訪問的就是超級塊。所以,超級塊壞了,那磁盤也就基本沒救了。

超級塊占用1號物理塊,就是文件系統的控制塊,超級塊包括:文件系統的大小、空閒塊數目、空閒塊索引表、空閒i節點數目、空閒i節點索引表、封鎖標記等。超級塊是系統為文件分配存儲空間、回收存儲空間的依據。

所以為了防止超級塊數據損壞,就需要對超級塊數據進行備份,以便於損壞時可以修復。

  • indoe bitmap (indoe對照表): 用來記錄當前文件系統的indoe哪些是已經使用的,哪些又是未使用的。

  • block bitmap (塊對照表): 用來記錄當前文件系統哪些block已經使用,哪些又是未使用的。

  • inode table (inode 表格):inode是用來記錄文件的屬性以及該文件實際數據所在的block的號碼。

  • GDT(Global Descriptor Table):用來描述每個block group開始和結束的block號碼以及每個區段位於哪一個block號碼之間。相當於文件系統描述的是每個block group的信息。

  • data blocks:數據塊,用於存放數據

7.tune2fs命令

tune2fs用於重新設定可ext系統文件系統中的可調整參數。

格式:

tune2fs [OPTIONS] DEVICE

常用選項:

-l: 查看指定文件系統的超級塊信息
-L LABEL:設定卷標
-m #: 調整為管理員預留空間的百分比
-j: 用於為ext2文件系統 添加ext3格式的日志,提升ext2為ext3
-O: 文件系統屬性的打開或關閉,–O ^has_journal
-o: 調整文件系統掛載的默認屬性(文件系統掛載屬性的開啟或關閉),–o ^acl
-U UUID:設定指定文件系統的UUID;

實例:

[root@bash ~]# tune2fs -l /dev/sdb #列出超級塊信息,相當於dumpe2fs -h
tune2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   GEEK
Last mounted on:          <not available>
Filesystem UUID:          2e564b3f-e542-4bef-aa88-d70935c5c5fb
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              102400
...

[root@bash ~]# tune2fs -L "H" /dev/sdb #設定卷標
tune2fs 1.42.9 (28-Dec-2013)
[root@bash ~]# e2label /dev/sdb  
H

[root@bash ~]# blkid /dev/sdb
/dev/sdb: UUID="6ce61834-a56c-4367-bce3-953d05f5f4bc" TYPE="ext2" 
[root@bash ~]# tune2fs -j /dev/sdb   #增加日志,提升為ext3
tune2fs 1.42.9 (28-Dec-2013)
Creating journal inode: done
[root@bash ~]# blkid /dev/sdb     
/dev/sdb: UUID="6ce61834-a56c-4367-bce3-953d05f5f4bc" SEC_TYPE="ext2" TYPE="ext3" 

[root@bash ~]# tune2fs -o ^acl /dev/sdb

[root@bash ~]# uuidgen
5272519a-039a-4bf0-817a-6014daec5e15
[root@bash ~]# tune2fs -U 5272519a-039a-4bf0-817a-6014daec5e15 /dev/sdb #修改uuid
tune2fs 1.42.9 (28-Dec-2013)
[root@bash ~]# blkid -U 5272519a-039a-4bf0-817a-6014daec5e15
/dev/sdb

8.findfs命令

findfs命令用於根據卷標或者UUID查找設備

格式:

findfs [OPTIONS] UUID=<uuid>
findfs [OPTIONS] LABEL=<label>

實例:

[root@bash ~]# e2label /dev/sdb "YOUNG"
[root@bash ~]# e2label /dev/sdb
YOUNG
[root@bash ~]# blkid /dev/sdb
/dev/sdb: LABEL="YOUNG" UUID="5272519a-039a-4bf0-817a-6014daec5e15" SEC_TYPE="ext2" TYPE="ext3" 
[root@bash ~]# findfs UUID="5272519a-039a-4bf0-817a-6014daec5e15"
/dev/sdb
[root@bash ~]# findfs LABEL="YOUNG"
/dev/sdb
Copyright © Linux教程網 All Rights Reserved