Linux 中,一切(或幾乎一切)都是文件。 node
1、Linux 磁盤分區與文件系統linux
1.1 磁盤分區安全
磁盤的分區主要分爲主分區和擴展分區app
1)主分區:總共最多隻能有四個主分區;性能
2)擴展分區:只能有一個,也算是主分區的一種,即:主分區 + 擴展分區最多隻能有四個。可是擴展分區不能存儲數據和格式化,必須將其再劃分爲邏輯分區才能使用;字體
3)邏輯分區 :邏輯分區是在擴展分區中劃分的,若是是 IDE 硬盤,Linux 最多支持 59 個邏輯分區,若是是 SCSI 硬盤,Linux 最多支持 11 個邏輯分區ui
1.2 設備文件名this
Linux 中一切都是文件,包括硬盤、鼠標、打印機等硬件設備也一般被表示(映射)爲文件,用來表示這些硬件設備的文件的名字即爲「設備文件名」。通常,設備文件名保存在 /dev/ 目錄下,Linux 中常見的硬件設備的設備文件名以下:atom
硬件設備 | 設備文件名 |
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 爲例,則,sda一、sda二、sda3 和 sda4 分別用來表示該硬盤的四個主分區,sda五、sda六、... 、sda15 則用來表示邏輯分區(SATA硬盤最多支持 11 個邏輯分區)。spa
用 ls 命令查看 /dev/ 目錄下的具體文件,以下:
在上圖中,黃色字體即爲設備文件。能夠看到有:sda、sda一、sda2,這裏,sda 表示計算機的第一塊硬盤、sda一、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 文件系統。
2、簡單瞭解一下 Linux 的 EXT2 文件系統
EXT2 -- 第二代擴展文件系統,是 Linux 內核使用的一種以 inode 爲基礎的一種文件系統。在 EXT2 文件系統中,咱們須要要了解幾個概念:
2.一、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.二、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.三、super block(超級塊)
Super block 用於記錄文件系統的總體信息,其大小爲 1024Byte,主要包括:
1)block/inode 的總量;
2)block/inode 的使用量;
3)block/inode 的剩餘量;
4)block/inode 的大小;
5)文件系統的掛載時間、最後一次寫入數據的時間等文件系統相關信息
2.四、File System Description(文件系統描述)
這個區段能夠描述每一個 block group 的開始與結束的 block 號碼,並說明每一個區段分別介於哪一個 block 號碼之間。
2.五、block bitmap(塊對照表)
因爲一個 block 只能被一個文件使用,所以新添加一個文件時,就會用到新的 block 來記錄文件數據。可使用 block bitmap 來確認哪些 block 是空的,哪些是被使用了的,這樣系統就能夠快速的找到可以使用的 block 來處理文件。一樣,當刪除某個文件時,該文件本來佔用的 block 號碼就會被釋放,並在 block bitmap 中把該 block 號碼所對應的標誌更新爲未使用狀態,而後釋放 block、
2.六、inode bitmap (inode 對照表)
功能與 block bitmap 相似,用於記錄 inode 號碼的使用與未使用。
寫的比較亂,還請見諒。
參考資料:
《鳥哥的 Linux 私房菜 第三版》
《Linux 程序設計 第四版》