Linux 中,一切(或幾乎一切)都是文件。 一、Linux 磁碟分區與文件系統 1.1 磁碟分區 磁碟的分區主要分為主分區和擴展分區 1)主分區:總共最多只能有四個主分區; 2)擴展分區:只能有一個,也算是主分區的一種,即:主分區 + 擴展分區最多只能有四個。但是擴展分區不能存儲數據和格式化,必須 ...
Linux 中,一切(或幾乎一切)都是文件。
一、Linux 磁碟分區與文件系統
1.1 磁碟分區
磁碟的分區主要分為主分區和擴展分區
1)主分區:總共最多只能有四個主分區;
2)擴展分區:只能有一個,也算是主分區的一種,即:主分區 + 擴展分區最多只能有四個。但是擴展分區不能存儲數據和格式化,必須將其再劃分為邏輯分區才能使用;
3)邏輯分區 :邏輯分區是在擴展分區中劃分的,如果是 IDE 硬碟,Linux 最多支持 59 個邏輯分區,如果是 SCSI 硬碟,Linux 最多支持 11 個邏輯分區
1.2 設備文件名
Linux 中一切都是文件,包括硬碟、滑鼠、印表機等硬體設備也通常被表示(映射)為文件,用來表示這些硬體設備的文件的名字即為“設備文件名”。一般,設備文件名保存在 /dev/ 目錄下,Linux 中常見的硬體設備的設備文件名如下:
硬體設備 | 設備文件名 |
IDE硬碟 | /dev/hd[a-d] |
SCSI/SATA/USB硬碟 | /dev/sd[a-p] |
光碟機 | /dev/cdrom 或 /dev/hdc |
軟盤 | /dev/fd[0-1] |
印表機(25針) | /dev/lp[0-2] |
印表機(USB) | /dev/usb/lp[0-15] |
滑鼠 | /dev/mouse |
以 SATA 硬碟為例,sda 表示電腦的第一塊硬碟,sdb 表示電腦的第二塊硬碟,sdc 表示第三塊硬碟。如果對硬碟進行了分區,以 sda 為例,則,sda1、sda2、sda3 和 sda4 分別用來表示該硬碟的四個主分區,sda5、sda6、... 、sda15 則用來表示邏輯分區(SATA硬碟最多支持 11 個邏輯分區)。
用 ls 命令查看 /dev/ 目錄下的具體文件,如下:
在上圖中,黃色字體即為設備文件。可以看到有:sda、sda1、sda2,這裡,sda 表示電腦的第一塊硬碟、sda1、sda2 分別代表第一塊硬碟的兩個主分區。
1.3 Linux 文件系統的類型
1)EXT 文件系統:
EXT -- 擴展文件系統,是於 1992 年 4 月發表的一種文件系統,是為 Linux 核心所做的第一個文件系統,最大可支持 2GB 的文件系統。
EXT2:是 EXT文件系統的升級版,最大支持 16TB 的分區和最大 2TB 的文件;
EXT3:是 EXT2文件系統的升級版,最大的區別是帶有日誌功能,以在系統突然崩潰時提高文件系統的可靠性,最大支持 16TB 的分區和最大 2TB 的文件;
EXT4:是 EXT3文件系統的升級版,EXT4在性能、伸縮性、可靠性上進行了大量的改進。它向下相容 EXT3,最大支持 1EB(1024 * 1024TB) 的分區和 16TB 文件,更快,更安全。
2)XFS 文件系統:
XFS 是一種高性能的日誌文件系統 ,Centos 7 預設使用的就是 XFS 文件系統。
3)如何查看文件系統的類型:
可以使用 df -T 指令來查看文件系統的類型:
筆者所用的是 Centos 7 系統,可以看到 /dev/sda1 是 XFS 文件系統。
二、簡單瞭解一下 Linux 的 EXT2 文件系統
EXT2 -- 第二代擴展文件系統,是 Linux 內核使用的一種以 inode 為基礎的一種文件系統。在 EXT2 文件系統中,我們需要要瞭解幾個概念:
2.1、block
我們知道,文件是存儲在硬碟上的,硬碟的最小存儲單位是“扇區(sector)”,每個扇區可以存儲 512 個位元組(0.5KB)。但操作系統在讀取硬碟的時候,不是一個扇區一個扇區地讀取,這樣效率會很低,而是會一次性連續讀取多個扇區,即一個“塊(block)”,這種由多個扇區組成的“塊”是文件存取的最小單位。在 EXT2 文件系統中,使用 data block 來記錄文件的實際內容。
1)每個 block 都有編號,方便 inode 記錄查找;
2)一個文件可能占用多個 block,沒讀取一個 block 就會消耗一個磁碟 I/O;
3)如果 block 太大,則存放小文件時會造成磁碟空間的浪費;如果 block 太小,則存取文件的效率會變低(消耗更多的磁碟 I/O);
4)EXT2 文件系統支持的 block 有 1KB、2KB、4KB三種,預設一個 block 為 1KB;
5)block 的大小是在格式化時就已經確定了的,除非重新格式化(或者使用 resize2fs 等命令改變文件系統大小),否則 block 的大小固定後就不再改變;
6)block 大小的不同,會導致文件系統能夠支持的最大磁碟容量及最大單一文件容量不相同,在 EXT2 文件系統中:
block大小 | 1KB | 2KB | 4KB |
最大單一文件大小 | 16GB | 256GB | 2TB |
最大文件系統容量 | 2TB | 8TB | 16TB |
7)EXT2 文件系統在格式化時,會將磁碟分為多個塊組(block group),每個 block group 都有獨立的inode/block/super block 。
2.2、inode(索引節點)
既然我們已經知道文件數據存放在 block 中,那麼如何找到所需的 block 呢,這就需要用到 inode 了。 inode 是文件系統中的一個特殊的數據塊,存放了文件屬性相關的信息,包括文件的創建/修改日期、文件的創建者、文件的大小、文件在磁碟上的存放位置以及文件的訪問許可權等。在 Linux kernel 2.6.34 版本, /include/linux/fs.h 文件中有對 inode 結構體的定義,可以作為參考:
struct inode { struct hlist_node i_hash; struct list_head i_list; /* backing dev IO list */ struct list_head i_sb_list; struct list_head i_dentry; unsigned long i_ino; atomic_t i_count; unsigned int i_nlink; uid_t i_uid; gid_t i_gid; dev_t i_rdev; unsigned int i_blkbits; u64 i_version; loff_t i_size; #ifdef __NEED_I_SIZE_ORDERED seqcount_t i_size_seqcount; #endif struct timespec i_atime; struct timespec i_mtime; struct timespec i_ctime; blkcnt_t i_blocks; unsigned short i_bytes; umode_t i_mode; spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ struct mutex i_mutex; struct rw_semaphore i_alloc_sem; const struct inode_operations *i_op; const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ struct super_block *i_sb; struct file_lock *i_flock; struct address_space *i_mapping; struct address_space i_data; #ifdef CONFIG_QUOTA struct dquot *i_dquot[MAXQUOTAS]; #endif struct list_head i_devices; union { struct pipe_inode_info *i_pipe; struct block_device *i_bdev; struct cdev *i_cdev; }; __u32 i_generation; #ifdef CONFIG_FSNOTIFY __u32 i_fsnotify_mask; /* all events this inode cares about */ struct hlist_head i_fsnotify_mark_entries; /* fsnotify mark entries */ #endif #ifdef CONFIG_INOTIFY struct list_head inotify_watches; /* watches on this inode */ struct mutex inotify_mutex; /* protects the watches list */ #endif unsigned long i_state; unsigned long dirtied_when; /* jiffies of first dirtying */ unsigned int i_flags; atomic_t i_writecount; #ifdef CONFIG_SECURITY void *i_security; #endif #ifdef CONFIG_FS_POSIX_ACL struct posix_acl *i_acl; struct posix_acl *i_default_acl; #endif void *i_private; /* fs or device private pointer */ };
可以看到,inode 結構體中有許多文件屬性相關的變數,關於 inode,有:
1)inode 是一種用於存放文件屬性信息的特殊數據塊;
2)每個文件僅占有一個 inode,因此,文件系統所能夠創建的文件數量與 inode 的數量有關;
3)每個 inode 都有一個編號,實際上,操作系統就是使用這個 inode 編號來識別不同的文件的。對於操作系統來說,文件名只是 inode 編號的一個別稱,便於用戶識別;
4)inode 的數量與大小在格式化時就已經確定了,不能再做更改;
5)EXT2 中,inode 的大小預設為 128Byte;
6)系統在讀取文件時,先找到 inode 編號,然後獲取 inode 裡面的文件屬性和許可權,匹配正確後才能夠開始讀取 block 的內容。
可以使用 ls -i 命令來查看文件名對應的 inode 編號:
如圖,第一列即為文件名所對應的 inode 號。
2.3、super block(超級塊)
Super block 用於記錄文件系統的整體信息,其大小為 1024Byte,主要包括:
1)block/inode 的總量;
2)block/inode 的使用量;
3)block/inode 的剩餘量;
4)block/inode 的大小;
5)文件系統的掛載時間、最後一次寫入數據的時間等文件系統相關信息
2.4、File System Description(文件系統描述)
這個區段可以描述每個 block group 的開始與結束的 block 號碼,並說明每個區段分別介於哪個 block 號碼之間。
2.5、block bitmap(塊對照表)
由於一個 block 只能被一個文件使用,因此新添加一個文件時,就會用到新的 block 來記錄文件數據。可以使用 block bitmap 來確認哪些 block 是空的,哪些是被使用了的,這樣系統就可以快速的找到可使用的 block 來處理文件。同樣,當刪除某個文件時,該文件原本占用的 block 號碼就會被釋放,併在 block bitmap 中把該 block 號碼所對應的標誌更新為未使用狀態,然後釋放 block、
2.6、inode bitmap (inode 對照表)
功能與 block bitmap 類似,用於記錄 inode 號碼的使用與未使用。
寫的比較亂,還請見諒。
參考資料:
《鳥哥的 Linux 私房菜 第三版》
《Linux 程式設計 第四版》