1. 程式人生 > >第八章:Linux磁碟與檔案系統管理

第八章:Linux磁碟與檔案系統管理

一、認識EXT2檔案系統

Linux最原始的檔案系統時EXT2,檔案系統是建立在硬碟上。
1.1、硬碟組成以及分割槽的簡單回顧

  1. 磁碟的組成:圓形碟片 + 機械手臂與磁頭 + 主軸馬達
  2. 碟片分為扇區,每個512byte,第一扇區很重要,包括的資訊:MBR(446byte) + 分割槽表(64);
  3. /dev/sd[a~p]:SCSI、SATA、USB、Flash等磁碟檔名 + dev/hd[a~d]:IDE 介面磁碟檔名
  4. 分割槽:
    1、分割槽表只有64byte而已,只能記錄4條分割槽記錄,稱之為主分割槽或者擴充套件分割槽
    2、擴充套件分割槽最多隻有1個,但是他能分出很多個邏輯分割槽

1.2、檔案系統的特性

  1. 分割槽之後一般要格式化。格式化的目的:成為作業系統能夠利用的檔案系統格式
  2. 每種作業系統能識別的檔案系統不同,例如Win98之前識別的是FAT,Win2000之後識別的是NTFS
  3. 作業系統中的檔案資料內容一般包括:檔案實際內容 + 很多檔案屬性(許可權啊、屬性啊這些)。檔案系統的組成通常又:
    1、super block:記錄檔案系統的整體資訊:包括inode、block的總量、使用量、剩餘量、以及檔案系統的格式等相關資訊;
    2、inode:一個檔案對應一個inode,記錄了檔案的屬性 + 該檔案資料所在的Blocck塊;
    3、block:記錄檔案的內容(內容太多會佔用多個block)
  4. 這種資料訪問的方法稱為:索引式檔案系統
  5. U盤的檔案系統一般是將block的資訊存在上一個block的資訊中,一個連著一個。所以經常要碎片整理。

1.3、Linux的Ext2檔案系統(inode)
錶針的Linux檔案系統Ext2就是使用這種inode為基礎的檔案系統。
這裡寫圖片描述

  1. 檔案系統一開始九講inode與block規劃好了,除非重新格式化,否則inode與block固定後就不在變化
  2. 檔案系統一般會分為多個塊組,而檔案系統的最前端,會有一個啟動扇區,用於安裝引導裝載程式
  3. data block資料塊
    1、Ext2檔案系統中所支援的block大小有1KB/2KB/4KB三種類型,對應的單一檔案限制分別為16GB/256GB/2TB
    2、block的大小與數量在格式化後就不能改變了;
    2、每個block中最多隻能放一個檔案的資料,會有浪費,但是放不下時,一個檔案也可佔用多個block塊
  4. inode表格
    1、inode記錄的檔案資訊有:訪問模式(rwx)、所有者所在組、檔案大小、時間資訊、真正內容的pointer
    2、此外,inode的資訊還包括:每個inode大小固定128byte,每個檔案佔用一個inode;檔案系統能夠建立的檔案數量有關;
    3、系統讀取檔案時先找到對應的inode,分析許可權後再訪問
    4、inode、block以及檔案三者之間的存放關係:
    1)假如一個檔案400M,每個block為4KB,至少也要10萬個block,怎麼存?
    2)這麼存block:分為直接、間接、雙間接、三間接加總==16G
  5. superblock(超級塊)
    1、超級快記錄的是整個檔案系統的基本資訊
    1) block與inodede 總量,已使用/未使用的量,大小
    2)檔案系統的關在時間/最近一次寫入資料的時間/最近一次檢驗磁碟(fsck)的時間
    3)檔案系統已被掛載,則valid bit置0,否則為1.
    2、一個檔案系統應該僅有一個superblock,而每個block group都有可能含有superblock,原因:備份
  6. File System Description檔案系統描述說明
    1、描述block group開始與結束的block塊;
    2、每個區段(supoerblock bitmap inodemap datablock)分別介於那個block塊之間;
  7. block bitmap(塊對照表):新增或者刪除檔案時定位到特定的bitmap
  8. inode bitmap:與block bitmap類似,記錄使用與未使用的iNode號碼
  9. 可以使用 dumpe2fs可以顯示superblock 與blockgroup資訊

1.4、與目錄樹的關係
目錄與檔案在Ext2檔案系統記錄資料的方式:

  1. 目錄
    1、在Ext2檔案系統新建目錄時,分配inode(目錄許可權以及屬性,可使用inode檢視) + block(記錄目錄的內容:檔名以及檔名所佔用的inode)
    2、目錄所佔的大小一般為:1K/2K/4K的整數倍
    3、如果目錄包含的檔案數量多,就會佔用多個block。
  2. 檔案
    1、新建檔案分配的是:一個inode + 與內容大小一致的block塊。
  3. 目錄樹讀取
    1、我們已經知道,inode本身不記錄檔名,目錄的block才會記錄檔名資訊;
    2、檔案讀取的方式為:一層一層目錄inode、block往下讀。

1.5、Ext3日誌檔案系統

  1. 新建一個檔案的行為:
    1、對新增檔案的目錄檢測其是否有許可權;
    2、找沒有使用的inode(inode bitmap),並寫入檔案許可權和屬性;
    3、找到沒有是定的block(block bitmap),寫入實際資料並inode指向block
    4、更新bitmap以及superblock
  2. 資料的不一致狀態
    1、例如斷點導致4沒有完成,造成資料不一致性
    2、以往檢查valid bit或者state的方式很費時,後來就引入了日誌檔案系統;
  3. 日誌檔案系統
    1、在檔案系統中規劃出一個塊,用於專門記錄或修訂檔案時的步驟;
    2、一邊對檔案操作時,一邊將這些步驟寫入日誌,如果出錯,只需檢測日誌檔案

1.6、檔案系統的操作

  1. CPU—記憶體—磁碟的資料不一致性解決方式
    1、記憶體中資料沒被改變過為clean,改變過為dirty,系統不定時將dirty資料寫入磁碟;
    2、也可用sync命令強制寫入。

1.7、掛載點的意義

  1. 掛載:將檔案系統與目錄樹結合的操作稱之為掛載
    1、掛載點一定是目錄,該目錄為進入該檔案系統的入口,也就是說,並不是你有任何檔案系統都能使用,要掛載到目錄樹的某個目錄後,才能使用該檔案系統。

1.8、Linux VFS
Linux的核心是通過VFS(Virtual Fileststem Switch、虛擬檔案系統)去讀取系統檔案的

二、檔案系統的簡單操作

2.1、磁碟與目錄的總容量:df/du

  1. du:列出檔案系統的整體磁碟使用量
    1、df不加引數則將所有檔案系統分割槽容量資訊顯示出來,其中包括的資訊由:
    1) 分割槽、裝置名稱
    2)總容量、使用了多少、剩餘多少
    3)掛載目錄
    2、 使用方式
    1)df [-h/i] [檔案或者目錄名稱]
    2)-h:將容量以GB、MB的形式顯示
    3)加上了檔案或者目錄的名稱表示顯示該目錄或者檔案所在分割槽的容量資訊
    3、-i:顯示的是inode資訊而不是硬碟容量資訊
    4、 有限掛載點顯示的容量大小為0,表示是掛載在記憶體當中
  2. du:評估當前目錄下各檔案與目錄所佔的容量(但是隻會顯示目錄)
    1、加入-a引數才會顯示目錄
    2、-s:列出該目錄所佔的容量,而不會列出每個目錄所佔的容量;

2.2、連線檔案(不是很明白)
Linux下連線檔案有兩種:

  1. hard link,硬連線或者實際連線
    1、可以簡單理解成:在某個目錄下新建一條檔名,連線到一個現有的inode號,即加入/root/crontab它是etc/crotab的實際連線,即這兩個檔案命連線到同一個inode,除了檔名字,其它資訊一模一樣。
    2、注意:不能連線到目錄,目錄下面還有檔案,複雜度高。
    3、連線舉例:inode1—目錄1—real inode—檔案的實際內容;
    inode2—目錄2—real inode—檔案的實際內容

  2. symbolic link(符號連結,有點類似於快捷方式,用得比較多)
    1、建立一個獨立的檔案,會指向他連線的那個檔案的檔名
    2、連線舉例:inode1—目錄1—inode2—目錄2—real inode—實際檔案內容

  3. 建立連結檔案
    1、命令:ln [-s] 原始檔 目標檔案,-s為建立一個符號連線,不加引數則為hard link

三、磁碟的分割槽、格式化、檢驗與掛載

如果增加一個硬碟,要做的事情有:
1、分割槽;——2、格式化成指定的檔案系統——3、檢驗——4、建立掛載點(目錄)
3.1、磁碟分割槽

  1. 命令:fdisk [-l] 裝置名稱(不是目錄,可使用df命令顯示目錄所在的磁碟)
    1、列出裝置名稱中所有的分割槽內容,接著就可能根據提示d、n、m、q、w進行磁碟的相關操作
    2、fdisk查閱的裝置的資訊,而不是分割槽的資訊,例如dev/hda1是分割槽,而dev/hda是磁碟裝置

3.2、格式化磁碟

  1. 命令:mkfs(make file system的縮寫) [-t 檔案系統格式] 裝置檔名
    1、例如,將分割槽hdc6格式華為Ext3的檔案系統:mkfs -t ext3 dev/hdc3
    2、mke2fs,mkfs命令的格式化可以理解成預設,mke2fs可以指定各種引數,例如每個block的大小、inode的容量等,沒有特殊要求,mkfs即可滿足要求。

3.3、磁碟檢驗

  1. 檔案系統絮亂,採用fsck(file system check)檢驗,是用於檢查與修正檔案系統錯誤的命令
  2. 這個命令本省對檔案系統就有損害,否則不用(一般系統出現大問題了採用)

磁碟的掛載與解除安裝

  1. 磁碟的掛載:掛載點=目錄=磁碟分割槽的入口
    1、對檔案系統(例如某一磁碟的分割槽、U盤、DVD/CD等檔案系統)進行掛載,即建立一個指定的掛載點用於訪問該檔案系統
    2、例如,將建立的dev/hdc6檔案系統掛載到mnt/hdc6上。
    3、顯示已掛載的檔案系統:mount -l
    4、還可以掛載軟盤、U盤
  2. 也可以對檔案系統進行重新掛載,例如單使用者模式下的根目錄掛載點為可讀,可以使用mount相關option進行重新掛載
  3. umount:將已掛載的檔案系統進行解除安裝。
  4. 可以使用卷標(label)對檔案系統進行掛載,使用dumpe2fs查詢卷標

3.5、磁碟引數修改

  1. 檔案如何表示裝置:通過檔案的major和minor來代替
  2. mknod可設定檔案或者裝置的型別
  3. 使用e2label修改卷標(Label:碟符的名稱,例如“學習、生活、軟體”)
  4. tune2fs:這個命令用的挺多的
    1、-l:類似dumpe2fs -h的功能,將super block內的資料讀取出來;
    2、-j:將ext2的檔案系統轉換成ext3的檔案系統;
    3、-L:類似於e2label的功能

四、設定開機掛載

4.1、開機掛載:etc/fstab以及etc/mtab

  1. mount屬於進入系統後手動掛載的,如果想要設定開機的時候就掛載的話就要修改etc/fstab的內容了。改檔案包含了如下6個欄位(很重要,需要記住)
    1、磁碟裝置檔名或者該裝置的Label
    2、掛載點(目錄)
    3、磁碟分割槽的檔案系統
    4、檔案系統引數
    5、是否需dump備份(0代表不要,1代表要,2代表不定期備份)
    6、是否以fsck檢驗扇區:開機系統預設以fsck檢驗檔案系統是否完整(clean)
  2. 特殊裝置掛載loop(映象檔案需要燒錄,也能通掛載的方式訪問)
    1、我們下載的映象檔案一般情況下要通過刻錄成光碟才能訪問其中的內容,現在也可以用loop掛載。
    2、建立一個大檔案,然後格式化後再掛載。(可以用於幫助我們解決分割槽不良的情況,譬如說只分出了一個根目錄,可以新建一個檔案,格式化,重新掛載,相當於多出了一個分割槽)

五、記憶體交換空間swap的構建

  1. Linux系統安裝時一定要有兩個分割槽:根分割槽和記憶體交換分割槽swap,實體記憶體空間不足時才會用到swap,譬如說CPU讀取的資料來自於記憶體,如果記憶體不足將一些用不到的資料儲存到swap中
  2. 使用物理分割槽構建swap
    1、分割槽:fdisk(接著不要忘記讓核心更新分割槽表)
    2、格式化為swap的檔案系統:mkswap
    3、使用:啟動swap:swapon 裝置檔名
    4、檢視:使用free命令產看記憶體的使用情況。
  3. 使用檔案構建swap(loop的方式)
    1、使用dd命令建立一個大檔案
    2、mkswap格式化
    3、swapon啟動

六、檔案系統的特殊檢視與操作

6.1、Boot Sector與super block的關係

  1. boot sector會佔用1024B的大小控制元件,兩者的關係與block的大小有關:
    1、如果block大小為1KB時:預留的0號block為Boot sector,1號為SuperBlock
    2、如果block大於1KB時,0號的內容分別有boot sector 與super block

6.2、磁碟控制元件的浪費

  1. ll命令中第一欄total顯示的是檔案實際佔用的block數量Xblock大小的值
  2. 使用du命令檢視目錄或檔案佔用的block大小以及實際小大

6.3、利用GNU的parted進行分割槽

  1. fdisk能夠很好地實現分割槽,但是不能處理高於2T以上的分割槽