11.Linux磁盤管理
1.磁盤概述
1.1 什麼是磁盤
1.2 磁盤實體結構
1.2.1 什麼是盤片
1.2.2 什麼是磁道
1.2.3 什麼是扇區
1.2.4 什麼是柱面
1.2.5 什麼是磁頭
1.3 磁盤的接口類型
1.3.1 IDE-SCSI
1.3.2 SATA-SAS
1.3.3 MSATA-M2
2.磁盤命名
2.1 實體伺服器
2.2 虛拟伺服器
3.分區管理
3.1 為什麼要分區
3.2 fdisk分區工具
3.3 gdisk分區工具
3.4 mkfs格式化系統
4.挂載管理
4.1 臨時挂載mount
4.2 臨時解除安裝umount
4.3 永久挂載fstab
4.3.1 永久挂載配置抒寫
4.3.2 配置檔案/etc/fstab
5.虛拟磁盤SWAP
5.1 什麼是SWAP
5.2 為什麼需要SWAP
5.3 SWAP基本應用
5.3.1 擴充swap分區
5.3.2 縮小swap分區
6.檔案系統
6.1 檔案系統的作用
6.2 檔案系統的類型
6.3 檔案系統結構
6.4 檔案系統故障修複
- 磁盤滿了、Inode滿了
大多數人對硬碟都不陌生,一塊小小的硬碟裡,就可以存儲海量的照片音樂和電影,尤其是我們喜愛的各類動作片。但如此小的空間,是如何儲存那麼多資訊的呢?
每個硬碟中心都是一摞高速運轉的圓盤,在圓盤上附着的一圈金屬顆粒,每個金屬顆粒都有自己的磁化程度,主要用于儲存0和1。
在資料寫入時,硬碟的磁頭開始通電,周圍會産生磁場,資料在磁場的作用下轉變成電流,使磁盤的金屬顆粒磁化,進而将資訊記錄在圓盤上。
由海量顆粒組成的資訊,就是我們存在硬碟裡的資料。
磁盤實體結構-1點選此按鈕 磁盤實體結構-2點選此按鈕
硬碟一般有一個或多個盤片,每個盤片可以有兩面,即第一個盤片的正面為0面,反面為1面然後依次類推。
每個盤片的盤面在出廠的時候被劃分出了多個同心圓環,資料就存儲在這樣的同心圓環上面,我們将這樣的圓環稱為磁道 Track ,每個盤面可以劃分多個磁道。但肉業不可見。
在硬碟出廠時會對磁盤進行一次低格,其實就是再每個磁道劃分為若幹個弧段,每個弧段就是一個扇區 Sector 。扇區是硬碟上存儲的實體機關,現在每個扇區可存儲512位元組資料已經成了業界的約定。
柱面實際上就是我們抽象出來的一個邏輯概念,簡單來說就是處于同一個垂直區域的磁道稱為 柱面 ,即各盤面上面相同位置磁道的集合。這樣資料如果存儲到相同半徑磁道上的同一扇區,這樣可以實作并行讀取,主要是減少磁頭尋道時間。
讀取磁盤磁道上面金屬塊,主要負責讀或寫入資料。
IDE,Scsi (已經被淘汰)
SATA III 與 SAS
應
接口類型 接口速率 盤片 寫入速度 用
轉速 場
景
SATA III
(1T 6Gbps/s 7.5k/s 300MB/s 個
300- 人
400)
SAS 企
(300Gb 8Gbps/s~12Gbps/s 15k/s 300MB/s~600MB/s
業
3000)
百度雲盤:
1.SATA盤;
阿裡雲:
伺服器,虛拟機–>高效雲盤(300MB/s)-- >SSD(300-400/MB)
資料庫SAS(300-400MB/s)–> 阿裡雲 ( 100MB/s 配置一樣;)
MSATA 與 M.2
MSATA 接口是專門為超級筆記本而設計的,m.2接口
參考文檔
m.2 接口是 inter 推出的一種替代 MSATA 新的接口
規範;
m.2 接口相比 MSATA 接口有兩方面的優勢
1.速度優勢
2.體積優勢
M.2接 支援接 相容性 讀取速度 寫入速度
口類型 口類型
Socket SATA、 幾乎主
闆都支 700MB/s 550MB/s
2 PCI-E X2
持
需要檢
Socket PCI-E ×4 查主機闆 4GB/s
3 Nvme 是否支
持
真實實體伺服器
裝置名稱 分區資訊 裝置類型
/dev/sda /dev/sda1 第一塊實體磁盤第一分區
/dev/sdb /dev/sdb2 第二塊實體磁盤第二個分區
/dev/sdd /dev/sdd4 第四塊實體磁盤的第四個分
區
阿裡雲主機或者KVM虛拟化主機的磁盤命名格式;
/dev/vda /dev/vda1 第一塊虛拟磁盤的第一個分
/dev/vdb /dev/vdb2 第二塊虛拟磁盤的第二個分
/dev/vdc /dev/vdc3 第三塊虛拟磁盤的第三個分
分區是為了便于資料分門别類的存儲;分區有 MBR、 GPT 兩種方式;
分區表:(記錄分區的編号、每個編号從哪個扇區開始,到哪個扇區結束)
MBR :主引導記錄,用來找到磁盤上的作業系統,并且引導啟動(0磁道,1扇區,512位元組)
446位元組:boot loader
64位元組:存儲分區表,每16位元組表示一個分區,
最多四個“主分區”(主分區+擴充分區)
2位元組:結束位;
GPT :新型的分區表 GPT 支援配置設定128個主分區。
MBR 與GPT 的差別,傳送門
注意 MBR 與 GPT 之間不能互轉,會導緻資料丢失。
fdisk 僅支援配置設定小于 2TB 的磁盤(MBR)
檢視目前裝置 fdisk -l
對裝置進行分區 fdisk /dev/sdb
分區指令
m:顯示幫助
n:建立新分區
d:删除分區
p:檢視分區
w:儲存分區
q:退出
分區案例:
案例1:配置設定4個分區(4P)
案例2:配置設定5個分區(1P+1E+4L)
案例3:配置設定6個分區(3P+1E+3L)
gdisk 支援配置設定大于 2TB 的磁盤
檢視目前裝置 gdisk [-l] device 對裝置進行分區 gdisk /dev/sdb
?:顯示幫助
p:列印分區
案例1:配置設定4個主分區(4P)
案例2:配置設定5個主分區(5P)
案例3:配置設定6個主分區(6P)
mkfs 指令用于格式化硬碟,類似于将房子裝修成3室一廳,還是2室一廳;
-b :設定資料區塊占用空間大小,目前支援 1024、2048、4096 bytes 每個塊;
-t :用來指定什麼類型的檔案系統,可以是 ext4、 xfs ;
提示:
1.分區工具,可以針對整塊磁盤,或者單個分區進
行格式化操作
2.一般情況下建議,不要直接格式化使用整磁盤,要分區後再格式化,頭部有預留白間;
1.使用 mkfs 指令,格式化整個硬碟
ex2 ext3 ext4
[root@oldxu ~]# mkfs.ext4 /dev/sdb
2.使用 mkfs 指令,格式化磁盤的某個分區
[root@oldxu ~]# mkfs.xfs /dev/sdb1
3.使用 mkfs 指令指定一個資料塊的大小 4096位元組=4k
[root@dns-master ~]# mkfs.xfs -b size=1024 /dev/sdb2
當需要使用磁盤空間的時,需要準備一個目錄作為挂載點,然後使用 mount 指令與該裝置進行關聯;
通過mount進行挂載,但重新開機将會失效。我們稱為臨時生效。
-t :指定檔案系統挂載分區;
-a :檢查并且挂載 /etc/fstab 配置檔案中未挂載的裝置;
-o :指定挂載參數,ro、rw ;
1.挂載磁盤裝置;
[root@oldxu ~]# mkdir /db1
[root@oldxu ~]# mount -t xfs /dev/sdb1 /db1
2.挂載磁盤裝置,設定參數為僅可讀;
[root@oldxu ~]# mkdir /db2 [root@dns-master ~]# mount -t xfs -o ro /dev/sdb2 /db2
[root@dns-master ~]# touch /db2/new_file touch: cannot touch ‘/db2/new_file’: Read-only file system
如果不想使用可以使用 umount
[device|directory] 進行臨時解除安裝。
-l :強制解除安裝;
1.解除安裝入口目錄示例;
[root@oldxu ~]# umount /db1
2.解除安裝裝置方式示例;
[root@oldxu ~]# umount /dev/sdb1
3.如碰到無法正常解除安裝情況處理;
[root@xuliangwei db1]# umount /db1 umount: /db1: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or
fuser(1)
#如上情況解決辦法有兩種,1.切換至其他目錄 2.強制解除安裝
[root@student db1]# umount -l /db1
如果需要實作永久挂載,則需要将挂載相關資訊寫入 /etc/fstab 配置檔案中實作。
配置檔案規範: 裝置名稱|挂載的入口目錄|檔案系統類型|挂載參數|是否備份|是否檢查
1.擷取裝置名稱,或者擷取裝置 UUID
2.手動臨時挂載測試;
3.寫入 /etc/fstab 配置檔案;
4.使用 mount -a 檢查是否存在錯誤;
1.擷取裝置名稱,或裝置的UUID
[root@oldxu ~]# blkid |grep “sdb1” /dev/sdb1: UUID=“e271b5b2-b1ba-4b18-bde5-66e394fb02d9” TYPE=“xfs”
2.手動挂載測試
[root@oldxu ~]# mount UUID=“e271b5b2-b1ba-4b18-bde5-66e394fb02d9” /db1
3.寫入 /etc/fstab 測試
手動編寫
[root@oldxu ~]# tail -1 /etc/fstab
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0
自動實作
[root@oldxu ~]# blkid |grep /dev/sda1 | awk -F ‘[: ]+’ ‘{print $2}’ | \
sed -r ‘s#(.*)#\1 /db1 xfs defaults 0 0#g’ >> /etc/fstab
4.加載 /etc/fstab 配置檔案, 同時檢測是否存在文法錯誤
[root@oldxu ~]# mount –a
/etc/fstab 配置檔案格式
第一列:指定需要挂載的裝置
裝置名稱:/dev/sdb1
裝置ID:UUID
第二列:挂載的入口目錄
第三列:檔案系統類型
xfs 類型
ext4 類型
第四列:挂載參數
async/sync :使用同步或異步方式存儲資料;
預設 async
user/nouser :是否允許普通使用者使用mount
指令挂載。預設nouser
exec/noexe :是否允許可執行檔案執行。預設
exec
suid/nosuid :是否允許存在suid 屬性的文
件。預設suid
auto/noauto :執行 mount -a 指令時,此檔案
系統是否被主動挂載。預設auto
rw/ro :是否以隻讀或者讀寫模式進行挂載。默
認rw
defaults :具有
rw,suid,dev,exec,auto,nouser,async 等參
數;
第五列:是否要備份磁盤
0:不做備份
1:每天進行備份操作
2:不定日期的進行備份操作
第六列: 開機是否檢驗扇區
0:不要檢驗磁盤是否有壞道
1:檢驗
2:校驗 (當1級别檢驗完成之後進行2級别檢驗)
Swap 分區在系統的實體記憶體不夠時,将硬碟中的一部分空間供目前運作的程式使用。
當實體記憶體不夠時會随機 kill 占用記憶體的程序,進而産生oom ,臨時使用 swap 可以解決。
案例:模拟伺服器OOM ;
[root@oldxu ~]# dd if=/dev/zero of=/dev/null bs=800M
#故障日志
[root@oldxu ~]# tail -f /var/log/messages Out of memory: Kill process 2227 (dd) score 778 or sacrifice child
Killed process 2227 (dd) total-vm:906724kB, anon-rss:798820kB, file-rss:0kB
1.建立分區,并格式化為 swap 分區。
[root@oldxu ~]# fdisk /dev/sdb
格式化為swap
[root@oldxu ~]# mkswap /dev/sdb1
2.檢視目前 swap 分區大小
[root@oldxu ~]# free -m
total used free
shared buff/cache available
Mem: 1980 1475 80
10 424 242
Swap: 2047 4 2043
擴充swap 分區,使用 swapon 指令
swapon device :将某個磁盤大小添加到 swap 分
區中
swapon -a :添加所有 swap 分區
[root@oldxu ~]# swapon /dev/sdb1
[root@oldxu ~]# free -m
Swap: 3047 4 2043
縮小 swap 分區,使用 swapoff 指令
swapoff device :關閉某個磁盤的 swap 分區 swapoff -a :關閉所有 swap 分區
[root@oldxu ~]# swapoff /dev/sdb1
使用者無法直接與硬體進行互動,那如果需要申請100G磁盤空間,怎麼辦?
為了簡化磁盤使用的過程,作業系統提供了一個輔助系統FS (檔案系統)
Windows :FAT32、NTFS
Linux :EXT2、EXT3、EXT4、XFS、VFAT、NTFS-3g
磁盤被劃分為兩大存儲區域,一類是存儲中繼資料 inode ,一類是存儲真實資料data block
inode 劃分了很多inode block ,每個block 塊為
128B
data 劃分了很多data block ,每個block 塊為4k
如下圖所示:磁盤在存儲檔案時,至少占用一個 inode 、與一個block
目前有個1T的磁盤裝置,那麼它被格式化後會被劃分幾千萬個4k 的block 塊,那如何從這麼多block 塊中定位到哪個是可用的,哪個是不可用的呢;
如果進行全盤掃描,一次要掃描幾千萬個block 塊,需要花費很長的時間,有什麼辦法可以解決?
inode bitmap :inde 位圖
block bitmap :block 位圖
檔案删除原理
首先删除目錄下的檔案名稱,然後将 inode、 block 的bitmap 狀态修改為可用狀态,但檔案并沒
有真正的被删除,還有恢複的可能性,而一旦有新的資料寫入,将其覆寫,資料才算真正的删除
檔案移動原理
僅僅将檔案名稱從一個目錄移動到另一個目錄下面,并不會修改其inode 和block ;
在 Linux 系統中,為了增加系統性能,通常系統會将
一些資料先寫入記憶體中,然後在重新整理至磁盤中;
萬一公司伺服器突然斷電或者其他未知原因,再次啟
動後,會造成檔案系統錯誤;
1.添加磁盤,給磁盤配置設定1G 空間;
[root@oldxu ~]# fdisk /dev/sdc # 配置設定1G分區 [root@oldxu ~]# mkfs.xfs /dev/sdc1 [root@oldxu ~]# mount /dev/sdc1 /mnt [root@oldxu ~]# echo “Hello” > /mnt/new.txt
2.使用 dd 模拟磁盤斷電損壞,然後取消挂載,會發現無法正常重新挂載;
[root@oldxu ~]# dd if=/dev/zero of=/dev/sdc bs=300M count=1
[root@oldxu ~]# umount /mnt
[root@oldxu ~]# mount /dev/sdb1 /mnt #無法挂載
3.使用 xfs_repair 修複檔案系統;
[root@oldxu ~]# xfs_repair /dev/sdc1
4.如出現修複失敗,可采用強制修複,但可能會造成部分資料丢失;
[root@oldxu ~]# xfs_repair -L /dev/sdc1
磁盤滿了;會提示錯誤;無法寫入資料;
磁盤沒有滿,但還是提示磁盤空間不足—> Inode滿了造成的問題:
一個檔案,至少占用1個inode、1個block塊;1TB;
存儲大量的小檔案; 500G
建立一個虛拟裝置檔案,大約100M,格式化為xfs
dd if=/dev/zero of=/opt/big bs=100M count=1
mkfs.xfs /opt/big
建立目錄,挂載
mkdir /new
mount /opt/big /new/
檢視目錄的空間、Inode的空間 df -h |grep new
df -i |grep new
進入目錄。,建立10w個檔案; cd /new/
在檢視磁盤空間,和Inode 的空間; df -i |grep new