計算機操作系統作為最重要的系統軟件,被用戶直接使用的部分就是它的文件管理。因為用戶使用計算機遇到的首要問題是如何保存程序和數據,然後如何查找、復制、刪改它們。文件管理就是為用戶的這些問題而設置的。
本次博文的主要內容:
1、文件系統基礎(文件的概念、分類及存儲機制)
2、從文件系統管理機制角度理解文件的復制、移動和刪除
3、ext文件系統的擴展屬性
4、硬鏈接和軟鏈接
一、文件系統基礎:
1、什麼是文件系統:
操作系統中負責管理和存取文件信息的軟件機構叫做文件系統。文件系統的目標是向用戶提供簡便、統一的使用文件的界面,實現文件按名存取。用戶使用界面中的命令,按照文件的邏輯結構,直觀、透明地對文件實施操作(所謂透明,是指用戶不必了解文件存放的物理結構、查找方法、I/O實現細節等與存儲介質有關的特性,就能完成對文件的有關操作)
2、文件系統的分類:
操作系統的文件系統按組成單位分為兩類:
(1)流式文件:構成流式文件的基本單位是字符,即流式文件是具有符號名且在邏輯意義上完整的有窮字符流序列。如Linux、UNIX、OS/2、windows等都采用流式文件形式。
(2)記錄式文件:構成記錄式文件的基本單位是記錄,所謂記錄,是一段有獨立意義的信息集合。如學生成績文件,是由全部學生的成績記錄組成的,每個記錄包括學生的姓名、學號、各科成績等多個字段。
3、Linux系統中的文件類型:
Linux系統中,文件被分為3類:
(1)目錄文件:全部由目錄組成的文件
(2)普通文件:由系統文件、用戶文件、實用程序文件、庫文件組成
(3)特別文件:所有的輸入/輸出設備被看作特別文件,系統指定專用的文件名,如:/dev/lp表示打印機設備。
4、虛擬文件系統:VFS(Virtual File System)
在前面的博文中已經提到,Linux系統支持眾多文件系統,那它是如何做到的呢?
【答】通過虛擬文件系統VFS,使得Linux系統可以支持眾多文件系統,這種機制有點類似java的虛擬機機制哈,通過虛擬機機制才使得java能夠跨平台!
5、Linux系統ext文件系統的管理機制:
【Linux中文件系統存取文件的過程說明】
(1)根據文件名,通過Directory裡的對應關系,找到文件對應的Inode number
(2)再根據Inode number讀取到文件的Inode table
(3)再根據Inode table中的Pointer讀取到相應的Blocks
Tips:
A、這裡有一個重要的內容,就是Directory(目錄),它並不是存放文件的容器,而是文件的路徑映射,記錄了一個文件/目錄名稱對應的Inode number;
B、每個Inode條目占用128個字節;
C、為了加速文件的查找速度,第一次需要查找,之後系統會把查找結果緩存到buffer中;事實上,系統啟動時會把大多數文件緩存到buffer中(這就是buffer的意義)
【文件存儲空間管理】
光盤、磁盤、磁帶等是保存文件內容的物理設備,它們被劃分成物理塊(block),全部的物理塊組成文件的存儲空間。文件存儲空間的管理就是塊空間的管理,包括空閒塊的分配、回收和組織幾個問題。
常見的文件存儲空間管理方法有:空閒塊表和空閒塊鏈、位圖、空閒塊成組鏈接法。Linux綜合位圖和空閒塊成組鏈接法來實現文件存儲空間的管理(如圖所示):
每個塊組所包含的Block數相同,它們是自我管理的,其組成說明如下:
(1)Super Block(超級塊)-->只有塊組0中有超級塊
【文件系統相關命令】
-s: summary,顯示某指定路徑下所有文件的大小之和;
-h:human-readale
#----tune2fs -l 命令查看超級塊信息-----# [root@CentOS ~]# tune2fs -l /dev/sda1 tune2fs 1.41.12 (17-May-2010) Filesystem volume name: <none> Last mounted on: /boot Filesystem UUID: 0a800a5e-6e0b-48f6-b935-1296b7438b64 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 #inode數目 Block count: 204800 #塊數目 Reserved block count: 10240 Free blocks: 149802 #空閒塊數 Free inodes: 51160 #空閒inode 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: Wed Jan 29 05:20:48 2014 Last mount time: Mon Sep 22 21:01:04 2014 Last write time: Mon Sep 22 21:01:04 2014 Mount count: 19 Maximum mount count: -1 Last checked: Wed Jan 29 05:20:48 2014 Check interval: 0 (<none>) Lifetime writes: 162 MB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 128 #inode大小 Journal inode: 8 Default directory hash: half_md4 Directory Hash Seed: 30a7a5f3-de5b-4d07-b512-ddb52100b427 Journal backup: inode blocks
#----dumpe2fs命令查看超級塊信息----# [root@Centos ~]# dumpe2fs /dev/sda1 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: <none> Last mounted on: /boot Filesystem UUID: 0a800a5e-6e0b-48f6-b935-1296b7438b64 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: 149802 Free inodes: 51160 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: Wed Jan 29 05:20:48 2014 Last mount time: Mon Sep 22 21:01:04 2014 Last write time: Mon Sep 22 21:01:04 2014 Mount count: 19 Maximum mount count: -1 Last checked: Wed Jan 29 05:20:48 2014 Check interval: 0 (<none>) Lifetime writes: 162 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: 30a7a5f3-de5b-4d07-b512-ddb52100b427 Journal backup: inode blocks Journal features: journal_incompat_revoke Journal size: 4096k Journal length: 4096 Journal sequence: 0x000000a8 Journal start: 0 Group 0: (Blocks 1-8192) [ITABLE_ZEROED] #塊組0的信息 Checksum 0xf7f8, unused inodes 2006 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) 3784 free blocks, 2008 free inodes, 6 directories, 2006 unused inodes Free blocks: 4409-8192 Free inodes: 40, 42-2048 Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED] Checksum 0x132c, unused inodes 2048 Backup superblock at 8193, Group descriptors at 8194-8194 #超級塊的備份 Reserved GDT blocks at 8195-8450 Block bitmap at 260 (+4294959363), Inode bitmap at 276 (+4294959379) Inode table at 547-802 (+4294959650) 844 free blocks, 2048 free inodes, 0 directories, 2048 unused inodes Free blocks: 11336, 11452-12288, 16379-16384 Free inodes: 2049-4096 Group 2: (Blocks 16385-24576) [INODE_UNINIT, ITABLE_ZEROED] Checksum 0x6de3, unused inodes 2048 Block bitmap at 261 (+4294951172), Inode bitmap at 277 (+4294951188) Inode table at 803-1058 (+4294951714) 0 free blocks, 2048 free inodes, 0 directories, 2048 unused inodes Free blocks: Free inodes: 4097-6144 Group 3: (Blocks 24577-32768) [INODE_UNINIT, ITABLE_ZEROED] Checksum 0xbade, unused inodes 2048 Backup superblock at 24577, Group descriptors at 24578-24578 #超級塊的備份 Reserved GDT blocks at 24579-24834 Block bitmap at 262 (+4294942981), Inode bitmap at 278 (+4294942997) Inode table at 1059-1314 (+4294943778) 1789 free blocks, 2048 free inodes, 0 directories, 2048 unused inodes Free blocks: 24835-25101, 25103-26624 Free inodes: 6145-8192 Group 4: (Blocks 32769-40960) [INODE_UNINIT, ITABLE_ZEROED] Checksum 0x3c6a, unused inodes 2048 Block bitmap at 263 (+4294934790), Inode bitmap at 279 (+4294934806) Inode table at 1315-1570 (+4294935842) 610 free blocks, 2048 free inodes, 0 directories, 2048 unused inodes Free blocks: 38303-38912 Free inodes: 8193-10240 Group 5: (Blocks 40961-49152) [INODE_UNINIT, ITABLE_ZEROED] Checksum 0xadda, unused inodes 2048 Backup superblock at 40961, Group descriptors at 40962-40962 Reserved GDT blocks at 40963-41218 Block bitmap at 264 (+4294926599), Inode bitmap at 280 (+4294926615) Inode table at 1571-1826 (+4294927906) 1790 free blocks, 2048 free inodes, 0 directories, 2048 unused inodes Free blocks: 41219-43008 Free inodes: 10241-12288
(2)GDT:Group Descriptor Table(塊組描述符表)
(3)bit map:位圖
分為快位圖(Block Bitmap)和結點位圖(Inode Bitmap),機制如下:
【Block Bitmap】:當申請空閒塊時,從位圖上找出bit=0的字位,將其改為1,返回對應的塊號;歸還空閒塊時,在位圖上把該塊所對應的字位改為0即可(如下圖所示)。
【Inode Bitmap】:和塊位圖類似,本身占一個塊,其中每個bit表示一個inode是否空閒可用。
(4)Inode Table:Inode表:
(5)Data Blocks:數據塊
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-11/108884p2.htm