磁盤的基本知識和基本命令

一、概述

目的:更加系統的熟悉磁盤和磁盤的基本操作

二、文件系統

2.1、硬盤的構成

​ 從存儲數據的介質上來區分,硬盤可分爲機械硬盤(Hard Disk Drive, HDD)和固態硬盤(Solid State Disk, SSD),機械硬盤採用磁性碟片來存儲數據,而固態硬盤通過閃存顆粒來存儲數據

機械硬盤主要由磁盤盤片、磁頭、主軸與傳動軸等組成,數據就存放在磁盤盤片中。

  • 什麼是磁道呢?每個盤片都在邏輯上有很多的同心圓,最外面的同心圓就是 0 磁道。我們將每個同心圓稱作磁道(注意,磁道只是邏輯結構,在盤面上並沒有真正的同心圓)。硬盤的磁道密度非常高,通常一面上就有上千個磁道。但是相鄰的磁道之間並不是緊挨着的,這是因爲磁化單元相隔太近會相互產生影響。
  • 那扇區又是什麼呢?扇區其實是很形象的,大家都見過摺疊的紙扇吧,紙扇打開後是半圓形或扇形的,不過這個扇形是由每個扇骨組合形成的。在磁盤上每個同心圓是磁道,從圓心向外呈放射狀地產生分割線(扇骨),將每個磁道等分爲若干弧段,每個弧段就是一個扇區。每個扇區的大小是固定的,爲 512Byte。扇區也是磁盤的最小存儲單位。硬盤的容量越來越大,爲了減少數據量的拆解,所以新的大容量硬盤已經有 4KByte 的扇區設計
  • 柱面又是什麼呢?如果硬盤是由多個盤片組成的,每個盤面都被劃分爲數目相等的磁道,那麼所有盤片都會從外向內進行磁道編號,最外側的就是 0 磁道。具有相同編號的磁道會形成一個圓柱,這個圓柱就被稱作磁盤的柱面

硬盤的大小是使用"磁頭數 x 柱面數 x 扇區數 x 每個扇區的大小"這樣的公式來計算的。其中,磁頭數(Heads)表示硬盤共有幾個磁頭,也可以理解爲硬盤有幾個盤面,然後乘以 2;柱面數(Cylinders)表示硬盤每面盤片有幾條磁道;扇區數(Sectors)表示每條磁道上有幾個扇區;每個扇區的大小一般是 512Byte。

外圈的扇區數量比較多,因此如果數據寫入在外圈,轉一圈能夠讀寫的數據量當然比內圈還要多! 因此通常數據的讀寫會由外圈開始往內寫的喔!這是默認值啊!

傳輸接口:SAS接口、SATA接口、USB接口、(IDE 與 SCSI ,這兩被前面的取代)

​ 固態硬盤和傳統的機械硬盤最大的區別就是不再採用盤片進行數據存儲,而採用存儲芯片進行數據存儲。固態硬盤的存儲芯片主要分爲兩種:一種是採用閃存作爲存儲介質的;另一種是採用DRAM作爲存儲介質的。目前使用較多的主要是採用閃存作爲存儲介質的固態硬盤

近年來在測試磁盤的性能時, 有個很特殊的單位,稱爲每秒讀寫操作次數 (Input/Output Operations PerSecond, IOPS)!這個數值越大,代表可操作次數較高,當然性能好的很!

  • 扇區(Sector)爲最小的物理儲存單位,且依據磁盤設計的不同,目前主要有 512Bytes 與 4K 兩種格式;
  • 將扇區組成一個圓,那就是柱面(Cylinder);
  • 早期的分區主要以柱面爲最小分區單位,現在的分區通常使用扇區爲最小分區單位(每個扇區都有其號碼喔,就好像座位一樣);
  • 磁盤分區表主要有兩種格式,一種是限制較多的 MBR 分區表,一種是較新且限制較少的 GPT 分區表。
  • MBR 分區表中,第一個扇區最重要,裏面有:(1)主要開機區(Master boot record, MBR)及分區表(partition table), 其中 MBR 佔有 446 Bytes,而 partition table 則佔有 64 Bytes。
  • GPT 分區表除了分區數量擴充較多之外,支持的磁盤容量也可以超過 2TB
  • /dev/sd[a-p][1-128]:爲實體磁盤的磁盤文件名;
  • /dev/vd[a-d][1-128]:爲虛擬磁盤的磁盤文件名

2.2、文件系統基礎知識

​ 因爲每種操作系統所設置的文件屬性/權限並不相同, 爲了存放這些文件所需的數據,因此就需要將分區進行格式化,以成爲操作系統能夠利用的“文件系統格式(filesystem),磁盤分區完畢後還需要進行格式化(format),之後操作系統才能夠使用這個文件系統

​ 傳統的磁盤與文件系統之應用中,一個分區就是隻能夠被格式化成爲一個文件系統,所以我們可以說一個 filesystem 就是一個 partition。但是由於新技術的利用,例如我們常聽到的LVM與軟件磁盤陣列(software raid), 這些技術可以將一個分區格式化爲多個文件系統(例如LVM),也能夠將多個分區合成一個文件系統(LVM, RAID),一個可被掛載的數據爲一個文件系統而不是一個分區

​ Linux 操作系統的文件權限(rwx)與文件屬性(擁有者、羣組、時間參數等)。 文件系統通常會將這兩部份的數據分別存放在不同的區塊,權限與屬性放置到 inode 中,至於實際數據則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的整體信息,包括 inode 與 block 的總量、使用量、剩餘量等。

  • superblock:記錄此 filesystem 的整體信息,包括inode/block的總量、使用量、剩餘量, 以及文件系統的格式與相關信息等;
  • inode:記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的 block 號碼;
  • block:實際記錄文件的內容,若文件太大時,會佔用多個 block 。

2.3、EXT2文件系統

​ 文件系統一開始就將 inode 與 block 規劃好了,除非重新格式化(或者利用 resize2fs 等指令變更文件系統大小),否則 inode 與block 固定後就不再變動。

​ Ext2 文件系統在格式化的時候基本上是區分爲多個區塊羣組 (block group) 的,每個區塊羣組都有獨立的 inode/block/superblock 系統。

​ 文件系統最前面有一個開機扇區(boot sector),這個開機扇區可以安裝開機管理程序,

1、data block (數據區塊)

​ 在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種而已。在格式化

時 block 的大小就固定了,且每個 block 都有編號,以方便 inode 的記錄啦

  • 原則上,block 的大小與數量在格式化完就不能夠再改變了(除非重新格式化);
  • 每個 block 內最多隻能夠放置一個文件的數據;
  • 承上,如果文件大於 block 的大小,則一個文件會佔用多個 block 數量;
  • 承上,若文件小於 block ,則該 block 的剩餘容量就不能夠再被使用了(磁盤空間會浪費)

2、inode table (inode 表格)

inode 記錄的文件數據至少有下面這些:

  • 該文件的存取模式(read/write/excute);
  • 該文件的擁有者與羣組(owner/group);
  • 該文件的容量;
  • 該文件創建或狀態改變的時間(ctime);
  • 最近一次的讀取時間(atime);
  • 最近修改的時間(mtime);
  • 定義文件特性的旗標(flag),如 SetUID...;
  • 該文件真正內容的指向 (pointer);
  • 每個 inode 大小均固定爲 128 Bytes (新的 ext4 與 xfs 可設置到 256 Bytes);
  • 每個文件都僅會佔用一個 inode 而已;
  • 承上,因此文件系統能夠創建的文件數量與 inode 的數量有關;
  • 系統讀取文件時需要先找到 inode,並分析 inode 所記錄的權限與使用者是否符合,若符合才能夠開始實際讀取 block 的內容

​ inode 記錄 block 號碼的區域定義爲12個直接,一個間接, 一個雙間接與一個三間接記錄區

  • 12 個直接指向: 12*1K=12K

由於是直接指向,所以總共可記錄 12 筆記錄,因此總額大小爲如上所示;

  • 間接: 256*1K=256K

每筆 block 號碼的記錄會花去 4Bytes,因此 1K 的大小能夠記錄 256 筆記錄,因此一個間接可以記錄的文件大小如上;

  • 雙間接: 2562561K=2562K

第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個號碼,因此總額大小如上;

  • 三間接: 256256256*1K=2563K

第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個第三層,每個第三層可以指定 256 個號碼,因此總額大小如

上;

總額:將直接、間接、雙間接、三間接加總,得到 12 + 256 + 256*256 + 256*256*256 (K) = 16GB

3、Superblock (超級區塊)

主要記錄如下信息:

  • block 與 inode 的總量;

  • 未使用與已使用的 inode / block 數量;

  • block 與 inode 的大小 (block 爲 1, 2, 4K,inode 爲 128Bytes 或 256Bytes);

  • filesystem 的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤 (fsck) 的時間等文件系統的相關信息;

  • 一個 valid bit 數值,若此文件系統已被掛載,則 valid bit 爲 0 ,若未被掛載,則 valid bit 爲 1 。

4、Filesystem Description (文件系統描述說明)

​ 描述每個 block group 的開始與結束的 block 號碼,以及說明每個區段 (superblock, bitmap, inodemap,data block) 分別介於哪一個 block 號碼之間

5、block bitmap (區塊對照表)

​ 從 block bitmap 當中可以知道哪些 block 是空的,因此我們的系統就能夠很快速的找到可使用的空間來處置文件,刪除block也是

6、inode bitmap (inode 對照表)

​ 與 block bitmap 是類似的功能,只是 block bitmap 記錄的是使用與未使用的 block 號碼, 至於 inode bitmap 則是記錄使用與未使用的 inode 號碼

2.4、與目錄樹的關係

​ 在 Linux 下的文件系統創建一個目錄時,文件系統會分配一個 inode 與至少一塊 block 給該目錄。其中,inode 記錄該目錄的相關權限與屬性,並可記錄分配到的那塊 block 號碼; 而 block 則是記錄在這個目錄下的文件名與該文件名佔用的 inode號碼數據

​ 由於目錄樹是由根目錄開始讀起,因此係統通過掛載的信息可以找到掛載點的 inode 號碼,此時就能夠得到根目錄的inode 內容,並依據該 inode 讀取根目錄的 block 內的文件名數據,再一層一層的往下讀到正確的文件名

2.5、EXT2、EXT3、EXT4文件的存取和日誌式文件系統

假設我們想要新增一個文件,此時文件系統的行爲是:

  • 先確定使用者對於欲新增文件的目錄是否具有 w 與 x 的權限,若有的話才能新增;

  • 根據 inode bitmap 找到沒有使用的 inode 號碼,並將新文件的權限/屬性寫入;

  • 根據 block bitmap 找到沒有使用中的 block 號碼,並將實際的數據寫入 block 中,且更新 inode 的 block 指向數據;

  • 將剛剛寫入的 inode 與 block 數據同步更新 inode bitmap 與 block bitmap,並更新 superblock 的內容。

​ 一般來說,我們將 inode table 與 data block 稱爲數據存放區域,至於其他例如 superblock、 block bitmap 與 inodebitmap 等區段就被稱爲 metadata (中介數據) ,因爲 superblock, inode bitmap 及 block bitmap 的數據是經常變動的,每次新增、移除、編輯時都可能會影響到這三個部分的數據,因此才被稱爲中介數據

日誌式文件系統 (Journaling filesystem)

避免的文件系統不一致的情況發生,所以提出了日誌是文件系統(有點類似事務)

  • 預備:當系統要寫入一個文件時,會先在日誌記錄區塊中紀錄某個文件準備要寫入的信息;

  • 實際寫入:開始寫入文件的權限與數據;開始更新 metadata 的數據;

  • 結束:完成數據與 metadata 的更新後,在日誌記錄區塊當中完成該文件的紀錄

這樣的日誌式文件系統在EXT3和EXT4中默認有

2.6、XFS文件系統

​ EXT 家族當前較傷腦筋的地方:支持度最廣,但格式化超慢

​ xfs 就是一個日誌式文件系統,幾乎所有 Ext4 文件系統有的功能, xfs 都可以具備!主要規劃爲三個部份,一個數據區 (data section)、一個文件系統活動登錄區 (log section)以及一個實時運行區 (realtime section)。

1、數據區 (data section)

​ 數據區就跟我們之前談到的 ext 家族一樣,包括 inode/data block/superblock 等數據,都放置在這個區塊。這個數據區與 ext 家族的 block group 類似,也是分爲多個儲存區羣組 (allocation groups) 來分別放置文件系統所需要的數據。 每個儲存區羣組都包含了

  • (1)整個文件系統的 superblock
  • (2)剩餘空間的管理機制
  • (3)inode的分配與追蹤。此

外,inode與 block 都是系統需要用到時, 這才動態配置產生,所以格式化動作超級快!另外,與 ext 家族不同的是, xfs 的 block 與 inode 有多種不同的容量可供設置,block 容量可由 512Bytes ~ 64K 調配,不過,Linux 的環境下, 由於內存控制的關係 (分頁檔 pagesize 的容量之故),因此最高可以使用的 block 大小爲 4K 而已!

2、文件系統活動登錄區 (log section)

​ 登錄區這個區域主要被用來紀錄文件系統的變化,其實有點像是日誌區啦!文件的變化會在這裏紀錄下來,直到該變化完整的寫入到數據區後, 該筆紀錄纔會被終結。

3、實時運行區 (realtime section)

​ 當有文件要被創建時,xfs 會在這個區段裏面找一個到數個的 extent 區塊,將文件放置在這個區塊內,等到分配完畢後,再寫入到 data section 的 inode 與 block 去! 這個 extent 區塊的大小得要在格式化的時候就先指定,最小值是 4K 最大可到 1G。一般非磁盤陣列的磁盤默認爲 64K 容量,而具有類似磁盤陣列的 stripe 情況下,則建議 extent 設置爲與 stripe 一樣大較佳。這個 extent 最好不要亂動,因爲可能會影響到實體磁盤的性能喔

2.7、文件系統的掛載和卸載

  • 單一文件系統不應該被重複掛載在不同的掛載點(目錄)中;

  • 單一目錄不應該重複掛載多個文件系統;

  • 要作爲掛載點的目錄,理論上應該都是空目錄纔是

/etc/filesystems:系統指定的測試掛載文件系統類型的優先順序;

/proc/filesystems:Linux系統已經載入的文件系統類型

可以使用mount和umount命令進行掛載和卸載,詳情見相關命令

開機掛載:/etc/fstab

  • 根目錄 / 是必須掛載的﹐而且一定要先於其它 mount point 被掛載進來。

  • 其它 mount point 必須爲已創建的目錄﹐可任意指定﹐但一定要遵守必須的系統目錄架構原則 (FHS)

  • 所有 mount point 在同一時間之內﹐只能掛載一次。

  • 所有 partition 在同一時間之內﹐只能掛載一次。

  • 如若進行卸載﹐您必須先將工作目錄移到 mount point(及其子目錄) 之外

[root@study ~]# cat /etc/fstab
# Device Mount point filesystem parameters dump fsck
/dev/mapper/centos-root / xfs defaults 0 0
UUID=94ac5f77-cb8a-495e-a65b-2ef7442b837c /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
【設備/UUID等】【掛載點】【文件系統】【文件系統參數】【dump】【fsck】

第一欄:磁盤設備文件名/UUID/LABEL name:

這個字段可以填寫的數據主要有三個項目:

  • 文件系統或磁盤的設備文件名,如 /dev/vda2 等(不推薦使用)

  • 文件系統的 UUID 名稱,如 UUID=xxx

  • 文件系統的 LABEL 名稱,例如 LABEL=xxx

第二欄:掛載點 (mount point):

就是掛載點啊!掛載點是什麼?一定是目錄啊~要知道啊!忘記的話,請回本章稍早之前的數據瞧瞧喔!

第三欄:磁盤分區的文件系統:

在手動掛載時可以讓系統自動測試掛載,但在這個文件當中我們必須要手動寫入文件系統纔行! 包括 xfs, ext4, vfat,reiserfs, nfs 等等。

第四欄:文件系統參數

第五欄:能否被 dump 備份指令作用:

dump 是一個用來做爲備份的指令,不過現在有太多的備份方案了,所以這個項目可以不要理會啦!直接輸入 0 就好了

第六欄:是否以 fsck 檢驗扇區:

早期開機的流程中,會有一段時間去檢驗本機的文件系統,看看文件系統是否完整 (clean)。 不過這個方式使用的主要是通過 fsck 去做的,我們現在用的 xfs 文件系統就沒有辦法適用,因爲 xfs 會自己進行檢驗,不需要額外進行這個動作!所以直接填 0 就好了

2.8、內存交換空間swap創建

  • 分區:先使用 gdisk 在你的磁盤中分區出一個分區給系統作爲 swap 。由於 Linux 的 gdisk 默認會將分區的 ID 設置爲 Linux 的

  • 文件系統,所以你可能還得要設置一下 system ID 就是了。

  • 格式化:利用創建 swap 格式的“mkswap 設備文件名”就能夠格式化該分區成爲 swap 格式囉

  • 使用:最後將該 swap 設備啓動,方法爲:“swapon 設備文件名”。

  • 觀察:最終通過 free 與 swapon -s 這個指令來觀察一下內存的用量吧!

2.9、RAID

RAID-0 (等量模式, stripe):性能最佳:越多顆磁盤組成的 RAID-0 性能會越好,因爲每顆負責的數據量就更低了,RAID-0 只要有任何一顆磁盤損毀,在 RAID 上面的所有數據都會遺失而無法讀取

RAID-1 (映射模式, mirror):完整備份:讓同一份數據,完整的保存在兩顆磁盤上頭,整體 RAID 的容量幾乎少了 50%

RAID 1+0,RAID 0+1:(1)先讓兩顆磁盤組成 RAID 1,並且這樣的設置共有兩組;(2)將這兩組 RAID 1 再組成一組 RAID 0。這就是 RAID 1+0 囉!反過來說,RAID 0+1 就是先組成 RAID-0 再組成 RAID-1 的意思

RAID 5:性能與數據備份的均衡考慮:RAID5 至少需要三顆以上的磁盤才能夠組成這種類型的磁盤陣列,RAID 5 默認僅能支持一顆磁盤的損毀情況

Spare Disk:預備磁盤的功能:當磁盤陣列的磁盤損毀時,就得要將壞掉的磁盤拔除,然後換一顆新的磁盤。換成新磁盤並且順利啓動磁盤陣列後, 磁盤陣列就會開始主動的重建 (rebuild) 原本壞掉的那顆磁盤數據到新的磁盤上!然後你磁盤陣列上面的數據就復原了! 這就是磁盤陣列的優點

spare disk 就是一顆或多顆沒有包含在原本磁盤陣列等級中的磁盤,這顆磁盤平時並不會被磁盤陣列所使用, 當磁盤陣列有任何磁盤損毀時,則這顆 spare disk 會被主動的拉進磁盤陣列中,並將壞掉的那顆硬盤移出磁盤陣列! 然後立即重建數據系統。如此你的系統則可以永保安康啊!若你的磁盤陣列有支持熱拔插那就更完美了

磁盤陣列的優點

  • 數據安全與可靠性:指的並非網絡信息安全,而是當硬件 (指磁盤) 損毀時,數據是否還能夠安全的救援或使用之意;

  • 讀寫性能:例如 RAID 0 可以加強讀寫性能,讓你的系統 I/O 部分得以改善;

  • 容量:可以讓多顆磁盤組合起來,故單一文件系統可以有相當大的容量。

關閉RAID

# 1. 先卸載且刪除配置文件內與這個 /dev/md0 有關的設置:
[root@study ~]# umount /srv/raid
[root@study ~]# vim /etc/fstab
UUID=494cb3e1-5659-4efc-873d-d0758baec523 /srv/raid xfs defaults 0 0
# 將這一行刪除掉!或者是註解掉也可以!
# 2. 先覆蓋掉 RAID 的 metadata 以及 XFS 的 superblock,才關閉 /dev/md0 的方法
[root@study ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50
[root@study ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0 <==不囉唆!這樣就關閉了!
[root@study ~]# dd if=/dev/zero of=/dev/vda5 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda6 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda7 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda8 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda9 bs=1M count=10
[root@study ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none> <==看吧!確實不存在任何陣列設備!
[root@study ~]# vim /etc/mdadm.conf
#ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6
# 一樣啦!刪除他或是註解他!

2.10、邏輯卷管理

Physical Volume, PV, 實體卷軸:我們實際的 partition (或 Disk) 需要調整系統識別碼 (system ID) 成爲 8e (LVM 的識別碼),然後再經過pvcreate 的指令將他轉成 LVM 最底層的實體卷軸 (PV) ,之後才能夠將這些 PV 加以利用! 調整 system ID 的方是就是通過 gdisk 啦!

Volume Group, VG, 卷軸羣組:所謂的 LVM 大磁盤就是將許多 PV 整合成這個 VG 的東西就是啦!所以 VG 就是 LVM 組合起來的大磁盤!

Physical Extent, PE, 實體範圍區塊:LVM 默認使用 4MB 的 PE 區塊,而 LVM 的 LV 在 32 位系統上最多僅能含有 65534 個 PE (lvm1 的格式)

Logical Volume, LV, 邏輯卷軸:最終的 VG 還會被切成 LV,這個 LV 就是最後可以被格式化使用的類似分區

數據寫入這個LV 時,到底他是怎麼寫入硬盤當中的? 呵呵!好問題~其實,依據寫入機制的不同,而有兩種方式:

  • 線性模式 (linear):假如我將 /dev/vda1, /dev/vdb1 這兩個 partition 加入到 VG 當中,並且整個 VG 只有一個 LV 時,那麼所謂的線性模式就是:當 /dev/vda1 的容量用完之後,/dev/vdb1 的硬盤纔會被使用到, 這也是我們所建議的模式。

  • 交錯模式 (triped):那什麼是交錯模式?很簡單啊,就是我將一筆數據拆成兩部分,分別寫入 /dev/vda1 與 /dev/vdb1 的意思,感覺上有點像 RAID 0 啦!如此一來,一份數據用兩顆硬盤來寫入,理論上,讀寫的性能會比較好。

三、磁盤相關命令

3.1、dumpe2fs

查詢 Ext 家族 superblock 信息的指令

[root@study ~]# dumpe2fs [-bh] 設備文件名
選項與參數:
-b :列出保留爲壞軌的部分(一般用不到吧!?)
-h :僅列出 superblock 的數據,不會列出其他的區段內容!
範例:鳥哥的一塊 1GB ext4 文件系統內容

[root@study ~]# blkid <==這個指令可以叫出目前系統有被格式化的設備
/dev/vda1: LABEL="myboot" UUID="ce4dbf1b-2b3d-4973-8234-73768e8fd659" TYPE="xfs"
/dev/vda2: LABEL="myroot" UUID="21ad8b9a-aaad-443c-b732-4e2522e95e23" TYPE="xfs"
/dev/vda3: UUID="12y99K-bv2A-y7RY-jhEW-rIWf-PcH5-SaiApN" TYPE="LVM2_member"
/dev/vda5: UUID="e20d65d9-20d4-472f-9f91-cdcfb30219d6" TYPE="ext4" <==看到 ext4 了!

[root@study ~]# dumpe2fs /dev/vda5
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none> # 文件系統的名稱(不一定會有)
Last mounted on: <not available> # 上一次掛載的目錄位置
Filesystem UUID: e20d65d9-20d4-472f-9f91-cdcfb30219d6
Filesystem magic number: 0xEF53 # 上方的 UUID 爲 Linux 對設備的定義碼
Filesystem revision #: 1 (dynamic) # 下方的 features 爲文件系統的特徵數據
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit
flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl # 默認在掛載時會主動加上的掛載參數
Filesystem state: clean # 這塊文件系統的狀態爲何,clean 是沒問題
Errors behavior: Continue
Filesystem OS type: LinuxInode count: 65536 # inode 的總數
Block count: 262144 # block 的總數
Reserved block count: 13107 # 保留的 block 總數
Free blocks: 249189 # 還有多少的 block 可用數量
Free inodes: 65525 # 還有多少的 inode 可用數量
First block: 0
Block size: 4096 # 單個 block 的容量大小
Fragment size: 4096
Group descriptor size: 64
....(中間省略)....
Inode size: 256 # inode 的容量大小!已經是 256 了喔!
....(中間省略)....
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: 3c2568b4-1a7e-44cf-95a2-c8867fb19fbc
Journal backup: inode blocks
Journal features: (none)
Journal size: 32M # Journal 日誌式數據的可供紀錄總容量
Journal length: 8192
Journal sequence: 0x00000001
Journal start: 0
Group 0: (Blocks 0-32767) # 第一塊 block group 位置
Checksum 0x13be, unused inodes 8181
Primary superblock at 0, Group descriptors at 1-1 # 主要 superblock 的所在喔!
Reserved GDT blocks at 2-128
Block bitmap at 129 (+129), Inode bitmap at 145 (+145)
Inode table at 161-672 (+161) # inode table 的所在喔!
28521 free blocks, 8181 free inodes, 2 directories, 8181 unused inodes
Free blocks: 142-144, 153-160, 4258-32767 # 下面兩行說明剩餘的容量有多少
Free inodes: 12-8192
Group 1: (Blocks 32768-65535) [INODE_UNINIT] # 後續爲更多其他的 block group 喔!

  • Group0 所佔用的 block 號碼由 0 到 32767 號,superblock 則在第 0 號的 block 區塊內!

  • 文件系統描述說明在第 1 號 block 中;

  • block bitmap 與 inode bitmap 則在 129 及 145 的 block 號碼上。

  • 至於 inode table 分佈於 161-672 的 block 號碼中!

  • 由於 (1)一個 inode 佔用 256 Bytes ,(2)總共有 672 - 161 + 1(161本身) = 512 個 block 花在 inode table 上, (3)每

  • 個 block 的大小爲 4096 Bytes(4K)。由這些數據可以算出 inode 的數量共有 512 * 4096 / 256 = 8192 個 inode 啦!

  • 這個 Group0 目前可用的 block 有 28521 個,可用的 inode 有 8181 個;

  • 剩餘的 inode 號碼爲 12 號到 8192 號

3.2、xfs_info

[root@study ~]# xfs_info 掛載點|設備文件名
範例一:找出系統 /boot 這個掛載點下面的文件系統的 superblock 紀錄
[root@study ~]# df -T /boot
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/vda2 xfs 1038336 133704 904632 13% /boot
# 沒錯!可以看得出來是 xfs 文件系統的!來觀察一下內容吧!

[root@study ~]# xfs_info /dev/vda2
1 meta-data=/dev/vda2 isize=256 agcount=4, agsize=65536 blks
2 = sectsz=512 attr=2, projid32bit=1
3 = crc=0 finobt=0
4 data = bsize=4096 blocks=262144, imaxpct=25
5 = sunit=0 swidth=0 blks
6 naming =version 2 bsize=4096 ascii-ci=0 ftype=0
7 log =internal bsize=4096 blocks=2560, version=2
8 = sectsz=512 sunit=0 blks, lazy-count=1
9 realtime =none extsz=4096 blocks=0, rtextents=0
  • 第 1 行裏面的 isize 指的是 inode 的容量,每個有 256Bytes 這麼大。至於 agcount 則是前面談到的儲存區羣組 (allocationgroup) 的個數,共有 4 個, agsize 則是指每個儲存區羣組具有 65536 個 block 。配合第 4 行的 block 設置爲 4K,因此整個文件系統的容量應該就是 4655364K 這麼大!

  • 第 2 行裏面 sectsz 指的是邏輯扇區 (sector) 的容量設置爲 512Bytes 這麼大的意思。

  • 第 4 行裏面的 bsize 指的是 block 的容量,每個 block 爲 4K 的意思,共有 262144 個 block 在這個文件系統內。

  • 第 5 行裏面的 sunit 與 swidth 與磁盤陣列的 stripe 相關性較高。這部份我們下面格式化的時候會舉一個例子來說明。

  • 第 7 行裏面的 internal 指的是這個登錄區的位置在文件系統內,而不是外部設備的意思。且佔用了 4K * 2560 個 block,總共約10M 的容量。

  • 第 9 行裏面的 realtime 區域,裏面的 extent 容量爲 4K。不過目前沒有使用

3.3、df

列出文件系統的整體磁盤使用量

[root@study ~]# df [-ahikHTm] [目錄或文件名]
選項與參數:
-a :列出所有的文件系統,包括系統特有的 /proc 等文件系統;
-k :以 KBytes 的容量顯示各文件系統;
-m :以 MBytes 的容量顯示各文件系統;
-h :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示;
-H :以 M=1000K 取代 M=1024K 的進位方式;
-T :連同該 partition 的 filesystem 名稱 (例如 xfs) 也列出;
-i :不用磁盤容量,而以 inode 的數量來顯示
範例一:將系統內所有的 filesystem 列出來!
[root@study ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/centos-root 10475520 3409408 7066112 33% /
devtmpfs 627700 0 627700 0% /dev
tmpfs 637568 80 637488 1% /dev/shm
tmpfs 637568 24684 612884 4% /run
tmpfs 637568 0 637568 0% /sys/fs/cgroup
/dev/mapper/centos-home 5232640 67720 5164920 2% /home
/dev/vda2 1038336 133704 904632 13% /boot
# 在 Linux 下面如果 df 沒有加任何選項,那麼默認會將系統內所有的
# (不含特殊內存內的文件系統與 swap) 都以 1 KBytes 的容量來列出來!
# 至於那個 /dev/shm 是與內存有關的掛載,大小爲內存的一半,重啓會丟失數據 
  • Filesystem:代表該文件系統是在哪個 partition ,所以列出設備名稱;

  • 1k-blocks:說明下面的數字單位是 1KB 呦!可利用 -h 或 -m 來改變容量;

  • Used:顧名思義,就是使用掉的磁盤空間啦!

  • Available:也就是剩下的磁盤空間大小;

  • Use%:就是磁盤的使用率啦!如果使用率高達 90% 以上時, 最好需要注意一下了,免得容量不足造成系統問題喔!(例如最容易被灌爆的 /var/spool/mail 這個放置郵件的磁盤)

  • Mounted on:就是磁盤掛載的目錄所在啦!(掛載點啦!)

​ 系統裏面其實還有很多特殊的文件系統存在的。那些比較特殊的文件系統幾乎都是在內存當中,例如 /proc 這個掛載點。因此,這些特殊的文件系統都不會佔據磁盤空間喔!

​ 由於 df 主要讀取的數據幾乎都是針對一整個文件系統,因此讀取的範圍主要是在 Superblock 內的信息, 所以這個指令顯示結果的速度非常的快速!

​ /dev/shm/ 目錄,其實是利用內存虛擬出來的磁盤空間,通常是總實體內存的一半! 由於是通過內存仿真出來的磁盤,因此你在這個目錄下面創建任何數據文件時,存取速度是非常快速的!(在內存內工作) 不過,也由於他是內存仿真出來的,因此這個文件系統的大小在每部主機上都不一樣,而且創建的東西在下次開機時就消失了! 因爲是在內存中嘛!

3.4、du

評估文件系統的磁盤使用量(常用在推估目錄所佔容量)

[root@study ~]# du [-ahskm] 文件或目錄名稱
選項與參數:
-a :列出所有的文件與目錄容量,因爲默認僅統計目錄下面的文件量而已。
-h :以人們較易讀的容量格式 (G/M) 顯示;
-s :列出總量而已,而不列出每個各別的目錄佔用容量;
-S :不包括子目錄下的總計,與 -s 有點差別。
-k :以 KBytes 列出容量顯示;
-m :以 MBytes 列出容量顯示;
範例一:列出目前目錄下的所有文件大小

[root@study ~]# du
4 ./.cache/dconf <==每個目錄都會列出來
4 ./.cache/abrt
8 ./.cache
....(中間省略)....
0 ./test4
4 ./.ssh <==包括隱藏文件的目錄
76 . <==這個目錄(.)所佔用的總量
# 直接輸入 du 沒有加任何選項時,則 du 會分析“目前所在目錄”
# 的文件與目錄所佔用的磁盤空間。但是,實際顯示時,僅會顯示目錄容量(不含文件),
# 因此 . 目錄有很多文件沒有被列出來,所以全部的目錄相加不會等於 . 的容量喔!
# 此外,輸出的數值數據爲 1K 大小的容量單位。

一般使用du -hs *統計當前目錄下第一級子目錄的大小

3.5、ln

​ Linux 下面的鏈接文件有兩種,一種是類似 Windows 的捷徑功能的文件,可以讓你快速的鏈接到目標文件(或目錄); 另一種則是通過文件系統的 inode 鏈接來產生新文件名,而不是產生新文件!這種稱爲實體鏈接 (hard link)

Hard Link (實體鏈接, 硬式鏈接或實際鏈接)

  • 每個文件都會佔用一個 inode ,文件內容由 inode 的記錄來指向;
  • 想要讀取該文件,必須要經過目錄記錄的文件名來指向到正確的 inode 號碼才能讀取
  • 如果你將任何一個“文件名”刪除,其實 inode 與 block 都還是存在的!
  • hard link 只是在某個目錄下的 block 多寫入一個關連數據而已,既不會增加 inode 也不會耗用 block 數量
  • 不能跨 Filesystem;
  • 不能 link 目錄

Symbolic Link (符號鏈接,亦即是捷徑)

ymbolic link 就是在創建一個獨立的文件,而這個文件會讓數據的讀取指向他 link 的那個文件的文件名

[root@study ~]# ln [-sf] 來源文件 目標文件
選項與參數:
-s :如果不加任何參數就進行鏈接,那就是hard link,至於 -s 就是symbolic link
-f :如果 目標文件存在時,就主動的將目標文件直接移除後再創建!
範例一:將 /etc/passwd 複製到 /tmp 下面,並且觀察 inode 與 block

[root@study ~]# cd /tmp
[root@study tmp]# cp -a /etc/passwd .
[root@study tmp]# du -sb ; df -i .
6602 . <==先注意一下這裏的容量是多少!
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 10485760 109748 10376012 2% /
# 利用 du 與 df 來檢查一下目前的參數~那個 du -sb 是計算整個 /tmp 下面有多少 Bytes 的容量啦!

3.6、lsblk

lsblk 列出系統上的所有磁盤列表

[root@study ~]# lsblk [-dfimpt] [device]
選項與參數:
-d :僅列出磁盤本身,並不會列出該磁盤的分區數據
-f :同時列出該磁盤內的文件系統名稱
-i :使用 ASCII 的線段輸出,不要使用複雜的編碼 (再某些環境下很有用)
-m :同時輸出該設備在 /dev 下面的權限數據 (rwx 的數據)
-p :列出該設備的完整文件名!而不是僅列出最後的名字而已。
-t :列出該磁盤設備的詳細數據,包括磁盤佇列機制、預讀寫的數據量大小等
範例一:列出本系統下的所有磁盤與磁盤內的分區信息
[root@study ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 40G 0 disk # 一整顆磁盤
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
`-vda3 252:3 0 30G 0 part
|-centos-root 253:0 0 10G 0 lvm / # 在 vda3 內的其他文件系統
|-centos-swap 253:1 0 1G 0 lvm [SWAP]
`-centos-home 253:2 0 5G 0 lvm /home
  • NAME:就是設備的文件名囉!會省略 /dev 等前導目錄!
  • MAJ:MIN:其實核心認識的設備都是通過這兩個代碼來熟悉的!分別是主要:次要設備代碼!
  • RM:是否爲可卸載設備 (removable device),如光盤、USB 磁盤等等
  • SIZE:當然就是容量囉!
  • RO:是否爲只讀設備的意思
  • TYPE:是磁盤 (disk)、分區 (partition) 還是隻讀存儲器 (rom) 等輸出
  • MOUTPOINT:就是前一章談到的掛載點

3.7、blkid

列出設備的 UUID 等參數,lsblk 已經可以使用 -f 來列出文件系統與設備的 UUID 數據

[root@study ~]# blkid
/dev/vda2: UUID="94ac5f77-cb8a-495e-a65b-2ef7442b837c" TYPE="xfs"
/dev/vda3: UUID="WStYq1-P93d-oShM-JNe3-KeDl-bBf6-RSmfae" TYPE="LVM2_member"
/dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
/dev/mapper/centos-root: UUID="299bdc5b-de6d-486a-a0d2-375402aaab27" TYPE="xfs"
/dev/mapper/centos-swap: UUID="905dc471-6c10-4108-b376-a802edbd862d" TYPE="swap"
/dev/mapper/centos-home: UUID="29979bf1-4a28-48e0-be4a-66329bf727d9" TYPE="xfs"

3.8、parted

磁盤的分區類型,還可以進行分區的相關操作

[root@study ~]# parted device_name print
範例一:列出 /dev/vda 磁盤的相關數據
[root@study ~]# parted /dev/vda print
Model: Virtio Block Device (virtblk) # 磁盤的模塊名稱(廠商)
Disk /dev/vda: 42.9GB # 磁盤的總容量
Sector size (logical/physical): 512B/512B # 磁盤的每個邏輯/物理扇區容量
Partition Table: gpt # 分區表的格式 (MBR/GPT)
Disk Flags: pmbr_boot
Number Start End Size File system Name Flags # 下面纔是分區數據
1 1049kB 3146kB 2097kB bios_grub
2 3146kB 1077MB 1074MB xfs
3 1077MB 33.3GB 32.2GB lvm
[root@study ~]# parted [設備] [指令 [參數]]
選項與參數:
指令功能:
新增分區:mkpart [primary|logical|extended] [ext4|vfat|xfs] 開始 結束
顯示分區:print
刪除分區:rm [partition]
範例一:以 parted 列出目前本機的分區表數據
[root@study ~]# parted /dev/vda print
Model: Virtio Block Device (virtblk) <==磁盤接口與型號
Disk /dev/vda: 42.9GB <==磁盤文件名與容量
Sector size (logical/physical): 512B/512B <==每個扇區的大小
Partition Table: gpt <==是 GPT 還是 MBR 分區
Disk Flags: pmbr_boot
Number Start End Size File system Name Flags
1 1049kB 3146kB 2097kB bios_grub
2 3146kB 1077MB 1074MB xfs
3 1077MB 33.3GB 32.2GB lvm
4 33.3GB 34.4GB 1074MB xfs Linux filesystem
5 34.4GB 35.4GB 1074MB ext4 Microsoft basic data
6 35.4GB 36.0GB 537MB linux-swap(v1) Linux swap
[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]
  • Number:這個就是分區的號碼啦!舉例來說,1號代表的是 /dev/vda1 的意思;

  • Start:分區的起始位置在這顆磁盤的多少 MB 處?有趣吧!他以容量作爲單位喔!

  • End:此分區的結束位置在這顆磁盤的多少 MB 處?

  • Size:由上述兩者的分析,得到這個分區有多少容量;

  • File system:分析可能的文件系統類型爲何的意思!

  • Name:就如同 gdisk 的 System ID 之意。

3.9、gdisk/fdisk

MBR 分區表請使用 fdisk 分區, GPT 分區表請使用 gdisk 分區

[root@study ~]# gdisk 設備名稱
範例:由前一小節的 lsblk 輸出,我們知道系統有個 /dev/vda,請觀察該磁盤的分區與相關數據
[root@study ~]# gdisk /dev/vda <==仔細看,不要加上數字喔!
GPT fdisk (gdisk) version 0.8.6
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT. <==找到了 GPT 的分區表!
Command (? for help): <==這裏可以讓你輸入指令動作,可以按問號 (?) 來查看可用指令
Command (? for help): ?
b back up GPT data to a file
c change a partition's name
d delete a partition # 刪除一個分區
i show detailed information on a partition
l list known partition types
n add a new partition # 增加一個分區
o create a new empty GUID partition table (GPT)
p print the partition table # 印出分區表 (常用)
q quit without saving changes # 不儲存分區就直接離開 gdisk
r recovery and transformation options (experts only)
s sort partitions
t change a partition's type code
v verify disk
w write table to disk and exit # 儲存分區操作後離開 gdisk
x extra functionality (experts only)
? print this menu
Command (? for help):

​ 應該要通過 lsblk 或 blkid 先找到磁盤,再用 parted /dev/xxx print 來找出內部的分區表類型,之後才用 gdisk 或 fdisk 來操作系統

​ fdisk 跟 gdisk 使用的方式幾乎一樣!只是一個使用 ? 作爲指令提示數據,一個使用 m 作爲提示這樣而已

3.10、partprobe

更新 Linux 核心的分區表信息,分區後可以使用該命令進行更新

[root@study ~]# partprobe [-s] # 你可以不要加 -s !那麼屏幕不會出現訊息!
[root@study ~]# partprobe -s # 不過還是建議加上 -s 比較清晰!
/dev/vda: gpt partitions 1 2 3 4 5 6
[root@study ~]# lsblk /dev/vda # 實際的磁盤分區狀態
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
|-vda3 252:3 0 30G 0 part
| |-centos-root 253:0 0 10G 0 lvm /
| |-centos-swap 253:1 0 1G 0 lvm [SWAP]
| `-centos-home 253:2 0 5G 0 lvm /home
|-vda4 252:4 0 1G 0 part
|-vda5 252:5 0 1G 0 part
`-vda6 252:6 0 500M 0 part
[root@study ~]# cat /proc/partitions # 核心的分區紀錄
major minor #blocks name
252 0 41943040 vda
252 1 2048 vda1
252 2 1048576 vda2
252 3 31461376 vda3
252 4 1048576 vda4
252 5 1048576 vda5
252 6 512000 vda6
# 現在覈心也正確的抓到了分區參數了!

3.11、mkfs.xfs

創建 xfs 文件系統, 因此使用的是 mkfs.xfs 這個指令

[root@study ~]# mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \
[-r parms] 設備名稱
選項與參數:
關於單位:下面只要談到“數值”時,沒有加單位則爲 Bytes 值,可以用 k,m,g,t,p (小寫)等來解釋
比較特殊的是 s 這個單位,它指的是 sector 的“個數”喔!
-b :後面接的是 block 容量,可由 512 到 64k,不過最大容量限制爲 Linux 的 4k 喔!
-d :後面接的是重要的 data section 的相關參數值,主要的值有:
agcount=數值 :設置需要幾個儲存羣組的意思(AG),通常與 CPU 有關
agsize=數值 :每個 AG 設置爲多少容量的意思,通常 agcount/agsize 只選一個設置即可
file :指的是“格式化的設備是個文件而不是個設備”的意思!(例如虛擬磁盤)
size=數值 :data section 的容量,亦即你可以不將全部的設備容量用完的意思
su=數值 :當有 RAID 時,那個 stripe 數值的意思,與下面的 sw 搭配使用
sw=數值 :當有 RAID 時,用於儲存數據的磁盤數量(須扣除備份碟與備用碟)
sunit=數值 :與 su 相當,不過單位使用的是“幾個 sector(512Bytes大小)”的意思
swidth=數值 :就是 su*sw 的數值,但是以“幾個 sector(512Bytes大小)”來設置
-f :如果設備內已經有文件系統,則需要使用這個 -f 來強制格式化纔行!
-i :與 inode 有較相關的設置,主要的設置值有:
size=數值 :最小是 256Bytes 最大是 2k,一般保留 256 就足夠使用了!
internal=[0|1]:log 設備是否爲內置?默認爲 1 內置,如果要用外部設備,使用下面設置
logdev=device :log 設備爲後面接的那個設備上頭的意思,需設置 internal=0 纔可!
size=數值 :指定這塊登錄區的容量,通常最小得要有 512 個 block,大約 2M 以上纔行!
-L :後面接這個文件系統的標頭名稱 Label name 的意思!
-r :指定 realtime section 的相關設置值,常見的有:
extsize=數值 :就是那個重要的 extent 數值,一般不須設置,但有 RAID 時,
最好設置與 swidth 的數值相同較佳!最小爲 4K 最大爲 1G 。
範例:將前一小節分區出來的 /dev/vda4 格式化爲 xfs 文件系統
[root@study ~]# mkfs.xfs /dev/vda4
meta-data=/dev/vda4 isize=256 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# 很快格是化完畢!都用默認值!較重要的是 inode 與 block 的數值
[root@study ~]# blkid /dev/vda4
/dev/vda4: UUID="39293f4f-627b-4dfd-a

3.12、mkfs.ext4

格式化爲ext4文件系統

[root@study ~]# mkfs.ext4 [-b size] [-L label] 設備名稱
選項與參數:
-b :設置 block 的大小,有 1K, 2K, 4K 的容量,
-L :後面接這個設備的標頭名稱。
範例:將 /dev/vda5 格式化爲 ext4 文件系統Tips
[root@study ~]# mkfs.ext4 /dev/vda5
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label= # 顯示 Label name
OS type: Linux
Block size=4096 (log=2) # 每一個 block 的大小
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks # 跟 RAID 相關性較高
65536 inodes, 262144 blocks # 總計 inode/block 的數量
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups # 共有 8 個 block groups 喔!
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
[root@study ~]# dumpe2fs -h /dev/vda5
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 3fd5cc6f-a47d-46c0-98c0-d43b072e0e12
....(中間省略)....
Inode count: 65536
Block count: 262144
Block size: 4096
Blocks per group: 32768
Inode size: 256
Journal size: 32M

3.13、xfs_repair

處理 XFS 文件系統,當有 xfs 文件系統錯亂才需要使用這個指令!所以,這個指令最好是不要用到啦

[root@study ~]# xfs_repair [-fnd] 設備名稱
選項與參數:
-f :後面的設備其實是個文件而不是實體設備
-n :單純檢查並不修改文件系統的任何數據 (檢查而已)
-d :通常用在單人維護模式下面,針對根目錄 (/) 進行檢查與修復的動作!很危險!不要隨便使用
範例:檢查一下剛剛創建的 /dev/vda4 文件系統
[root@study ~]# xfs_repair /dev/vda4
Phase 1 - find and verify superblock...
Phase 2 - using internal log
Phase 3 - for each AG...
Phase 4 - check for duplicate blocks...
Phase 5 - rebuild AG headers and trees...
Phase 6 - check inode connectivity...
Phase 7 - verify and correct link counts...
done
# 共有 7 個重要的檢查流程!詳細的流程介紹可以 man xfs_repair 即可!
範例:檢查一下系統原本就有的 /dev/centos/home 文件系統
[root@study ~]# xfs_repair /dev/centos/home
xfs_repair: /dev/centos/home contains a mounted filesystem
xfs_repair: /dev/centos/home contains a mounted and writable filesystem
fatal error -- couldn't initialize XFS library

3.14、fsck.ext4

​ 處理 EXT4 文件系統fsck 是個綜合指令,如果是針對 ext4 的話,建議直接使用 fsck.ext4 來檢測比較妥當

[root@study ~]# fsck.ext4 [-pf] [-b superblock] 設備名稱
選項與參數:
-p :當文件系統在修復時,若有需要回復 y 的動作時,自動回覆 y 來繼續進行修復動作。
-f :強制檢查!一般來說,如果 fsck 沒有發現任何 unclean 的旗標,不會主動進入
細部檢查的,如果您想要強制 fsck 進入細部檢查,就得加上 -f 旗標囉!
-D :針對文件系統下的目錄進行最優化配置。
-b :後面接 superblock 的位置!一般來說這個選項用不到。但是如果你的 superblock 因故損毀時,
通過這個參數即可利用文件系統內備份的 superblock 來嘗試救援。一般來說,superblock 備份在:
1K block 放在 8193, 2K block 放在 16384, 4K block 放在 32768
範例:找出剛剛創建的 /dev/vda5 的另一塊 superblock,並據以檢測系統
[root@study ~]# dumpe2fs -h /dev/vda5 | grep 'Blocks per group'
Blocks per group: 32768
# 看起來每個 block 羣組會有 32768 個 block,因此第二個 superblock 應該就在 32768 上!
# 因爲 block 號碼爲 0 號開始編的!
[root@study ~]# fsck.ext4 -b 32768 /dev/vda5
e2fsck 1.42.9 (28-Dec-2013)
/dev/vda5 was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Deleted inode 1577 has zero dtime. Fix<y>? yes
Pass 2: Checking directory structurePass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vda5: ***** FILE SYSTEM WAS MODIFIED ***** # 文件系統被改過,所以這裏會有警告!
/dev/vda5: 11/65536 files (0.0% non-contiguous), 12955/262144 blocks
# 好巧合!鳥哥使用這個方式來檢驗系統,恰好遇到文件系統出問題!於是可以有比較多的解釋方向!
# 當文件系統出問題,它就會要你選擇是否修復~如果修復如上所示,按下 y 即可!
# 最終系統會告訴你,文件系統已經被更改過,要注意該項目的意思!

3.15、mount

[root@study ~]# mount -a
[root@study ~]# mount [-l]
[root@study ~]# mount [-t 文件系統] LABEL='' 掛載點
[root@study ~]# mount [-t 文件系統] UUID='' 掛載點 # 鳥哥近期建議用這種方式喔!
[root@study ~]# mount [-t 文件系統] 設備文件名 掛載點
選項與參數:
-a :依照配置文件 /etc/fstab 的數據將所有未掛載的磁盤都掛載上來
-l :單純的輸入 mount 會顯示目前掛載的信息。加上 -l 可增列 Label 名稱!
-t :可以加上文件系統種類來指定欲掛載的類型。常見的 Linux 支持類型有:xfs, ext3, ext4,
reiserfs, vfat, iso9660(光盤格式), nfs, cifs, smbfs (後三種爲網絡文件系統類型)
-n :在默認的情況下,系統會將實際掛載的情況實時寫入 /etc/mtab 中,以利其他程序的運行。
但在某些情況下(例如單人維護模式)爲了避免問題會刻意不寫入。此時就得要使用 -n 選項。
-o :後面可以接一些掛載時額外加上的參數!比方說帳號、密碼、讀寫權限等:
async, sync: 此文件系統是否使用同步寫入 (sync) 或非同步 (async) 的
內存機制,請參考文件系統運行方式。默認爲 async。
atime,noatime: 是否修訂文件的讀取時間(atime)。爲了性能,某些時刻可使用 noatime
ro, rw: 掛載文件系統成爲只讀(ro) 或可讀寫(rw)
auto, noauto: 允許此 filesystem 被以 mount -a 自動掛載(auto)
dev, nodev: 是否允許此 filesystem 上,可創建設備文件? dev 爲可允許
suid, nosuid: 是否允許此 filesystem 含有 suid/sgid 的文件格式?
exec, noexec: 是否允許此 filesystem 上擁有可執行 binary 文件?
user, nouser: 是否允許此 filesystem 讓任何使用者執行 mount ?一般來說,
mount 僅有 root 可以進行,但下達 user 參數,則可讓
一般 user 也能夠對此 partition 進行 mount 。
defaults: 默認值爲:rw, suid, dev, exec, auto, nouser, and async
remount: 重新掛載,這在系統出錯,或重新更新參數時,很有用!

3.16、umount

[root@study ~]# umount [-fn] 設備文件名或掛載點
選項與參數:
-f :強制卸載!可用在類似網絡文件系統 (NFS) 無法讀取到的情況下;
-l :立刻卸載文件系統,比 -f 還強!
-n :不更新 /etc/mtab 情況下卸載。

3.17、mdadm

[root@study ~]# mdadm --detail /dev/md0
[root@study ~]# mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK \
> --raid-devices=N --spare-devices=N /dev/sdx /dev/hdx...
選項與參數:
--create :爲創建 RAID 的選項;
--auto=yes :決定創建後面接的軟件磁盤陣列設備,亦即 /dev/md0, /dev/md1...
--chunk=Nk :決定這個設備的 chunk 大小,也可以當成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N :使用幾個磁盤 (partition) 作爲磁盤陣列的設備
--spare-devices=N :使用幾個磁盤作爲備用 (spare) 設備
--level=[015] :設置這組磁盤陣列的等級。支持很多,不過建議只要用 0, 1, 5 即可
--detail :後面所接的那個磁盤陣列設備的詳細信息
[root@study ~]# mdadm --manage /dev/md[0-9] [--add 設備] [--remove 設備] [--fail 設備]
選項與參數:
--add :會將後面的設備加入到這個 md 中!
--remove :會將後面的設備由這個 md 中移除
--fail :會將後面的設備設置成爲出錯的狀態

3.18、邏輯卷相關命令

3.19、dd

https://www.cnblogs.com/yuanqiangfei/p/9138625.html

dd:用指定大小的塊拷貝一個文件,並在拷貝的同時進行指定的轉換。
注意:指定數字的地方若以下列字符結尾,則乘以相應的數字:b=512;c=1;k=1024;w=2
參數註釋:
1. if=文件名:輸入文件名,缺省爲標準輸入。即指定源文件。< if=input file >
2. of=文件名:輸出文件名,缺省爲標準輸出。即指定目的文件。< of=output file >
3. ibs=bytes:一次讀入bytes個字節,即指定一個塊大小爲bytes個字節。
    obs=bytes:一次輸出bytes個字節,即指定一個塊大小爲bytes個字節。
    bs=bytes:同時設置讀入/輸出的塊大小爲bytes個字節。
4. cbs=bytes:一次轉換bytes個字節,即指定轉換緩衝區大小。
5. skip=blocks:從輸入文件開頭跳過blocks個塊後再開始複製。
6. seek=blocks:從輸出文件開頭跳過blocks個塊後再開始複製。
注意:通常只用當輸出文件是磁盤或磁帶時纔有效,即備份到磁盤或磁帶時纔有效。
7. count=blocks:僅拷貝blocks個塊,塊大小等於ibs指定的字節數。
8. conv=conversion:用指定的參數轉換文件。
    ascii:轉換ebcdic爲ascii
     ebcdic:轉換ascii爲ebcdic
    ibm:轉換ascii爲alternate ebcdic
    block:把每一行轉換爲長度爲cbs,不足部分用空格填充
    unblock:使每一行的長度都爲cbs,不足部分用空格填充
    lcase:把大寫字符轉換爲小寫字符
    ucase:把小寫字符轉換爲大寫字符
    swab:交換輸入的每對字節
     noerror:出錯時不停止
     notrunc:不截短輸出文件
    sync:將每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊。

3.20、fio

https://www.cnblogs.com/raykuan/p/6914748.html

在fio官網下載fio-2.1.10.tar文件,解壓後./configure、make、make install之後就可以使用fio了(注意:該命令不要在已有數據的文件系統操作

filename=/dev/emcpowerb 支持文件系統或者裸設備,-filename=/dev/sda2或-filename=/dev/sdb
direct=1                 測試過程繞過機器自帶的buffer,使測試結果更真實
rw=randwread             測試隨機讀的I/O
rw=randwrite             測試隨機寫的I/O
rw=randrw                測試隨機混合寫和讀的I/O
rw=read                  測試順序讀的I/O
rw=write                 測試順序寫的I/O
rw=rw                    測試順序混合寫和讀的I/O
bs=4k                    單次io的塊文件大小爲4k
bsrange=512-2048         同上,提定數據塊的大小範圍
size=5g                  本次的測試文件大小爲5g,以每次4k的io進行測試
numjobs=30               本次的測試線程爲30
runtime=1000             測試時間爲1000秒,如果不寫則一直將5g文件分4k每次寫完爲止
ioengine=psync           io引擎使用pync方式,如果要使用libaio引擎,需要yum install libaio-devel包
rwmixwrite=30            在混合讀寫的模式下,寫佔30%
group_reporting          關於顯示結果的,彙總每個進程的信息此外
lockmem=1g               只使用1g內存進行測試
zero_buffers             用0初始化系統buffer
nrfiles=8                每個進程生成文件的數量

測試場景:

100%隨機,100%讀, 4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100read_4k

100%隨機,100%寫, 4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k

100%順序,100%讀 ,4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_4k
 
100%順序,100%寫 ,4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_4k

100%隨機,70%讀,30%寫 4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k
bw=平均IO帶寬
iops=IOPS
runt=線程運行時間
slat=提交延遲
clat=完成延遲
lat=響應時間
bw=帶寬
cpu=利用率
IO depths=io隊列
IO submit=單個IO提交要提交的IO數
IO complete=Like the above submit number, but for completions instead.
IO issued=The number of read/write requests issued, and how many of them were short.
IO latencies=IO完延遲的分佈

io=總共執行了多少size的IO
aggrb=group總帶寬
minb=最小.平均帶寬.
maxb=最大平均帶寬.
mint=group中線程的最短運行時間.
maxt=group中線程的最長運行時間.

ios=所有group總共執行的IO數.
merge=總共發生的IO合併數.
ticks=Number of ticks we kept the disk busy.
io_queue=花費在隊列上的總共時間.
util=磁盤利用率

3.21、iostat

https://blog.csdn.net/qq_20332637/article/details/82146753

yum install sysstat

cpu屬性值說明:
%user:CPU處在用戶模式下的時間百分比。
%nice:CPU處在帶NICE值的用戶模式下的時間百分比。
%system:CPU處在系統模式下的時間百分比。
%iowait:CPU等待輸入輸出完成時間的百分比。
%steal:管理程序維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。
%idle:CPU空閒時間百分比。

備註:

如果%iowait的值過高,表示硬盤存在I/O瓶頸

如果%idle值高,表示CPU較空閒

如果%idle值高但系統響應慢時,可能是CPU等待分配內存,應加大內存容量。

如果%idle值持續低於10,表明CPU處理能力相對較低,系統中最需要解決的資源是CPU。

cpu屬性值說明:

tps:該設備每秒的傳輸次數

kB_read/s:每秒從設備(drive expressed)讀取的數據量;

kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;

kB_read: 讀取的總數據量;

kB_wrtn:寫入的總數量數據量

[root@rac01-node01 /]# iostat -xd 3
Linux 3.8.13-16.2.1.el6uek.x86_64 (rac01-node01)     05/27/2017     _x86_64_    (40 CPU)
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.05     0.75    2.50    0.50    76.59    69.83    48.96     0.00    1.17   0.47   0.14
scd0              0.00     0.00    0.02    0.00     0.11     0.00     5.25     0.00   21.37  20.94   0.05
dm-0              0.00     0.00    2.40    1.24    75.88    69.83    40.00     0.01    1.38   0.38   0.14
dm-1              0.00     0.00    0.02    0.00     0.14     0.00     8.00     0.00    0.65   0.39   0.00
sdc               0.00     0.00    0.01    0.00     0.11     0.00    10.20     0.00    0.28   0.28   0.00
sdb               0.00     0.00    0.01    0.00     0.11     0.00    10.20     0.00    0.15   0.15   0.00
sdd               0.00     0.00    0.01    0.00     0.11     0.00    10.20     0.00    0.25   0.25   0.00
sde               0.00     0.00    0.01    0.00     0.11     0.00    10.20     0.00    0.14   0.14  0.00

  • rrqms:每秒這個設備相關的讀取請求有多少被Merge了(當系統調用需要讀取數據的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的數據,FS會將這個請求合併Merge)
  • wrqm/s:每秒這個設備相關的寫入請求有多少被Merge了。
  • rsec/s:The number of sectors read from the device per second.
  • wsec/s:The number of sectors written to the device per second.
  • rKB/s:The number of kilobytes read from the device per second.
  • wKB/s:The number of kilobytes written to the device per second.
  • avgrq-sz:平均請求扇區的大小,The average size (in sectors) of the requests that were issued to the device.
  • avgqu-sz:是平均請求隊列的長度。毫無疑問,隊列長度越短越好,The average queue length of the requests that were issued to the device.
  • await:每一個IO請求的處理的平均時間(單位是微秒毫秒)。這裏可以理解爲IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。這個時間包括了隊列時間和服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。
  • svctm:表示平均每次設備I/O操作的服務時間(以毫秒爲單位)。如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好。如果await的值遠高於svctm的值,則表示I/O隊列等待太長,系統上運行的應用程序將變慢。
  • %util: 在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該設備有0.8秒在處理IO,而0.2秒閒置,那麼該設備的%util = 0.8/1 = 80%,所以該參數暗示了設備的繁忙程度,一般地,如果該參數是100%表示磁盤設備已經接近滿負荷運行了(當然如果是多磁盤,即使%util是100%,因爲磁盤的併發能力,所以磁盤使用未必就到了瓶頸)。

3.22、iotop

https://www.cnblogs.com/yinzhengjie/p/9934260.html

yum -y install iotop

各個參數說明:

  -o, --only只顯示正在產生I/O的進程或線程。除了傳參,可以在運行過程中按o生效。
  -b, --batch非交互模式,一般用來記錄日誌。
  -n NUM, --iter=NUM設置監測的次數,默認無限。在非交互模式下很有用。
  -d SEC, --delay=SEC設置每次監測的間隔,默認1秒,接受非整形數據例如1.1。
  -p PID, --pid=PID指定監測的進程/線程。
  -u USER, --user=USER指定監測某個用戶產生的I/O。
  -P, --processes僅顯示進程,默認iotop顯示所有線程。
  -a, --accumulated顯示累積的I/O,而不是帶寬。
  -k, --kilobytes使用kB單位,而不是對人友好的單位。在非交互模式下,腳本編程有用。
  -t, --time 加上時間戳,非交互非模式。
  -q, --quiet 禁止頭幾行,非交互模式。有三種指定方式。
  -q 只在第一次監測時顯示列名
  -qq 永遠不顯示列名。
  -qqq 永遠不顯示I/O彙總。
交互按鍵:
  和top命令類似,iotop也支持以下幾個交互按鍵。
  left和right方向鍵:改變排序。  
  r:反向排序。
  o:切換至選項--only。
  p:切換至--processes選項。
  a:切換至--accumulated選項。
  q:退出。
  i:改變線程的優先級。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章