LINUX檔案系統體系結構
使用者空間(User space)包含一些應用程式(例如,檔案系統的使用者)和 GNU C 庫(glibc),它們為檔案系統調用(打開、讀取、寫和關閉)提供使用者接口。系統調用接口(System call interface)的作用就像是交換器,它将系統調用從使用者空間發送到核心空間(Kernel space)中的适當端點。
VFS(Virutal file systems) 是底層檔案系統的主要接口。這個元件導出一組接口,然後将它們抽象到各個檔案系統,各個檔案系統的行為可能差異很大。有兩個針對檔案系統對象的緩存(inode 和 dentry)。它們緩存最近使用過的檔案系統對象。每個檔案系統實作(比如 ext2、JFS 等等)導出一組通用接口,供 VFS 使用。緩沖區緩存會緩存檔案系統和相關塊裝置之間的請求。
主要結構
Linux 以一組通用對象的角度看待所有檔案系統。這些對象是超級塊(superblock)、inode、dentry 和檔案。超級塊在每個檔案系統的根上,超級塊描述和維護檔案系統的狀态。檔案系統中管理的每個對象(檔案或目錄)在 Linux 中表示為一個 inode。inode 包含管理檔案系統中的對象所需的所有中繼資料(包括可以在對象上執行的操作)。另一組結構稱為 dentry,它們用來實作名稱和 inode 之間的映射,有一個目錄緩存用來儲存最近使用的 dentry。dentry 還維護目錄和檔案之間的關系,進而支援在檔案系統中移動。最後,VFS 檔案表示一個打開的檔案(儲存打開的檔案的狀态,比如寫偏移量等等)。
虛拟檔案系統層
VFS 作為檔案系統接口的根層。VFS 記錄目前支援的檔案系統以及目前挂裝的檔案系統。
超級塊
超級塊結構表示一個檔案系統。它包含管理檔案系統所需的資訊,包括檔案系統名稱(比如 ext2)、檔案系統的大小和狀态、塊裝置的引用和中繼資料資訊(比如空閑清單等等)。超級塊通常存儲在存儲媒體上,但是如果超級塊不存在,也可以實時建立它。
Linux系統下可使用的檔案系統有:
基本檔案系統:ext2, ext3, ext4, reiserfs, xfs, btrfs, swap
CD光牒:iso9660
Windows: fat32(vfat), ntfs
Unix: ffs, ufs, jfs, jfs2
網絡檔案系統:nfs, cifs
叢集檔案系統:ocfs2, gfs2
分布式檔案系統:ceph, moosefs, mogilefs, hdfs, gfs, glusterfs
(1)日志型檔案系統:非日志型檔案系統:ext2
日志型檔案系統:ext3
(2)swap:交換分區
建立檔案系統:
在分區上執行格式化(進階格式化)要使用某種檔案系統,滿足兩個條件:
(1)核心中:支援此種檔案系統
(2)使用者空間:有檔案系統管理工具
系統檔案一般的管理工具:
mkfs指令
使用格式: mkfs [-V] [-t fstype] [fs-options] filesys [blocks] [-L Lable]
作用:建立檔案系統
參數
-V : 詳細顯示模式
-t : 給定檔案系統的格式
-c : 在制做檔案系統前,檢查該partition 是否有壞軌
-l bad_blocks_file : 将有壞軌的block資料加到 bad_blocks_file 裡面
block : 給定 block 的大小
-L:建立lable
執行個體:
設定sda2分區的檔案格式為ext3,以下兩種方式同樣可以實作
[root@localhost ~]# mkfs.ext3 /dev/sda2
[root@localhost ~]# mkfs -t ext3 /dev/sda2
mke2fs指令
使用格式:mke2fs [OPTION]... DEVICE
常用參數
-t:{ext2|ext3|ext4} 指定需使用的檔案系統
-b: {1024|2048|4096} 指定塊大小
-L : 'LABEL' 設定标簽
-j: mke2fs -t ext3 建立使用ext3卷号的檔案系統
-i #: 指定每個inode的位元組數
-N #: 指定inode的數量
-m #: 預留磁盤空間占據多大百分比的空間為後期管理使用;
-O: FEATURE[,...] 指定分區特性
-O: ^FEATURE: 關閉此特性
執行個體:
(1) 使用fdisk建立分區
fdisk /dev/sda
(2)建立分區後,使用partx /dev/sda3 重新激活分區表
[root@localhost~]# partx /dev/sda
#1: 2048- 4098047 ( 4096000 sectors, 2097 MB)
# 2: 4098048-106498047 (102400000 sectors, 52428 MB)
# 3:106498048-110703914 ( 4205867sectors, 2153 MB)
(3)建立檔案系統為ext4,指定塊大小為1024,卷标為“test”
[root@localhost~]# mke2fs -t ext4 -b 1024 -L test /dev/sda3
(4)使用blkid指令檢視結果
[root@localhost~]# blkid /dev/sda3
/dev/sda3:LABEL="test" UUID="22c70ef3-9497-4b48-b5c9-5067c5b71710"TYPE="ext4"
檔案系統屬性檢視及調整工具
e2label指令
使用格式:e2lable DEVICE [LABEL]
作用: 檢視分區的卷标及設定
[root@localhost~]# e2label /dev/sda3
test
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
格式為:mount [-afFhnrvVw] [-L<标簽>] [-o<選項>] [-t<檔案系統類型>] [裝置名] [加載點]
作用: 加載指定的檔案系統。
常用參數和選項:
-a 加載檔案/etc/fstab中設定的所有裝置。
-f 不實際加載裝置。可與-v等參數同時使用以檢視mount的執行過程。
-F 需與-a參數同時使用。所有在/etc/fstab中設定的裝置會被同時加載,可加快執行速度。
-h 顯示線上幫助資訊。
-L<标簽> 加載檔案系統标簽為<标簽>的裝置。
-n 不将加載資訊記錄在/etc/mtab檔案中。
-o<選項> 指定加載檔案系統時的選項。有些選項也可在/etc/fstab中使用。這些選項包括:
async 以非同步的方式執行檔案系統的輸入輸出動作。
atime 每次存取都更新inode的存取時間,預設設定,取消選項為noatime。
auto 必須在/etc/fstab檔案中指定此選項。執行-a參數時,會加載設定為auto的裝置,取消選取為noauto。
defaults 使用預設的選項。預設選項為rw、suid、dev、exec、anto nouser與async。
dev 可讀檔案系統上的字元或塊裝置,取消選項為nodev。
exec 可執行二進制檔案,取消選項為noexec。
noatime 每次存取時不更新inode的存取時間。
noauto 無法使用-a參數來加載。
nodev 不讀檔案系統上的字元或塊裝置。
noexec 無法執行二進制檔案。
nosuid 關閉set-user-identifier(設定使用者ID)與set-group-identifer(設定組ID)設定位。
nouser 使一位使用者無法執行加載操作,預設設定。
remount 重新加載裝置。通常用于改變裝置的設定狀态。
ro 以隻讀模式加載。
rw 以可讀寫模式加載。
suid 啟動set-user-identifier(設定使用者ID)與set-group-identifer(設定組ID)設定位,取消選項為nosuid。
sync 以同步方式執行檔案系統的輸入輸出動作。
user 可以讓一般使用者加載裝置。
-r 以隻讀方式加載裝置。
-t<檔案系統類型> 指定裝置的檔案系統類型。常用的選項說明有:
minix Linux最早使用的檔案系統。
ext2 Linux目前的常用檔案系統。
msdos MS-DOS 的 FAT。
vfat Win85/98 的 VFAT。
nfs 網絡檔案系統。
iso9660 CD-ROMCD光牒的标準檔案系統。
ntfs Windows NT的檔案系統。
hpfs OS/2檔案系統。Windows NT 3.51之前版本的檔案系統。
auto 自動檢測檔案系統。
-v 執行時顯示詳細的資訊。
-V 顯示版本資訊。
-w 以可讀寫模式加載裝置,預設設定。
unmount:解除安裝指令
# umount DEVICE
# umount MOUNT_POINT
執行個體:
(1) 建立挂載點 /mnt/test
[root@localhost ~]# mkdir /mnt/test
(2)把/dev/sda3挂載到/mnt/test上
[root@localhost ~]# mount /dev/sda3 /mnt/test
(3)使用df –h 指令檢視
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/789-LogVol01
47G 3.5G 41G 8% /
tmpfs 491M 224K 491M 1% /dev/shm
/dev/sda1 1.9G 37M 1.8G 3% /boot
/dev/sr0 3.7G 3.7G 0 100% /mnt/iso
/dev/sda3 2.0G 3.1M 1.9G 1% /mnt/test
使用umount指令解除安裝
[root@localhost ~]# umount /mnt/test/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/789-LogVol01
47G 3.5G 41G 8% /
tmpfs 491M 224K 491M 1% /dev/shm
/dev/sda1 1.9G 37M 1.8G 3% /boot
/dev/sr0 3.7G 3.7G 0 100% /mnt/iso
交換分區
檢視記憶體(memory)及交換分區(swap)的指令
free
-m: 以MB為機關
-g: 以GB為機關
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 981 710 270 3 62 312
-/+ buffers/cache: 336 645
Swap: 1999 0 1999
建立交換分區
mkswap
格式:mkswap [option] DEVICE
-L 'LABEL' 指定卷标
swapon:啟用交換分區
格式:swapon [option] [DEVICE]
-a: 激活所有交換分區
-p PRIORITY: 設定其優先級
swapoff:禁用交換分區
格式:swapoff [option] [DEVICE]
建立一個交換分區
[root@localhost ~]# mkswap /dev/sda3
Setting up swapspace version 1, size = 2102928 KiB
no label, UUID=023db09a-ccd8-4714-ad69-337b744e2843
[root@localhost ~]# swapo
swapoff swapon
[root@localhost ~]# swapo
swapoff swapon
[root@localhost ~]# swapon /dev/sda3
[root@localhost ~]# swapon –s
Filename Type SizeUsed Priority
/dev/dm-1 partition 2047996 0 -1
/dev/sda3 partition 2102928 0 -2
檔案系統等空間占用資訊的檢視工具
df指令
作用:報告檔案系統磁盤空間的使用情況
格式:df [OPTION]... [FILE]... POSIX 選項: [-kP]
常用參數
df: disk free 顯示磁盤空間
-h: human-readable 用常見的格式顯示出大小
-i: inode數量 用資訊索引點代替塊表示使用狀況
-P: 以Posix相容的格式輸出
du: disk usage
-s: summary
檔案系統上的連結檔案:
硬連結:
特性:(1)兩個路徑指向同一個inode
(2)不能對目錄進行;
(3)不能跨分區進行
注意:指向同一個inode的多個不同路徑; 建立檔案的硬連結會增加inode的引用計數;删除硬連結僅是删除其一個通路路徑,隻到最後一個路徑被删除;
符号連結(軟連結):
特性:(1)連結檔案的資料指向另一個檔案路徑
(2)可以對目錄進行;
(3)可以跨分區;
注意:指向的是另一個檔案路徑,而非inode。對檔案建立符号連結不會增加其引用計數;删除原檔案,符号連結檔案也将無法;
ln [-s] SRC DEST
-s:symbolic link
-v:verbose
作業
建立一個10G檔案系統,類型為ext4,要求開機可自動挂載至/mydata目錄
(1) 建立分區
[root@localhost ~]# fdisk /dev/sda
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e 因隻能分四個主分區,之前已有3個在用,是以此處第4個分區分為
Selected partition 4 extended(擴充)
First cylinder (6892-15665, default 6892):
Using default value 6892
Last cylinder, +cylinders or +size{K,M,G} (6892-15665, default 15665):
Using default value 15665
Command (m for help): n
First cylinder (6892-15665, default 6892):
Using default value 6892
Last cylinder, +cylinders or +size{K,M,G} (6892-15665, default 15665): +10G
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sda1 * 1 256 2048000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 256 6630 51200000 8e Linux LVM
/dev/sda3 6630 6891 2102933+ 83 Linux
/dev/sda4 6892 15665 70477155 5 Extended
/dev/sda5 6892 8197 10490413+ 83 Linux
(2)使用kpatx指令重新整理分區表後,檢視/proc/partitions下的分區資訊
[root@localhost ~]# kpartx /dev/sda5
[root@localhost ~]# cat /proc/partitions
major minor #blocks name
7 0 3804160 loop0
8 0 125829120 sda
8 1 2048000 sda1
8 2 51200000 sda2
8 3 2102933 sda3
8 4 31 sda4
8 5 10490413 sda5
253 0 49147904 dm-0
253 1 2048000 dm-1
(3)使用mke2fs指令建立檔案系統ext4
[root@localhost ~]# mke2fs -t ext4 /dev/sda5
(4)使用blkid指令檢視
[root@localhost ~]# blkid /dev/sda5
/dev/sda5: UUID="b6d1d8c9-6496-4e85-9d0f-026b3756c11e" TYPE="ext4"
(4)建立挂載點并使用mount指令挂載上去;最後編輯/etc/fstab檔案
[root@localhost ~]# mkdir /dev/sda5 /mnt/test
[root@localhost ~]# mount /dev/sda5 /mnt/test/
[root@localhost ~]# vim /etc/fstab
[root@localhost~]# mount -a
[root@localhost~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/789-LogVol01
47G 3.5G 41G 8% /
tmpfs 491M 224K 491M 1% /dev/shm
/dev/sda1 1.9G 37M 1.8G 3% /boot
/dev/sr0 3.7G 3.7G 0 100% /mnt/iso
/dev/sda5 9.8G 23M 9.3G 1% /mnt/test