天天看點

180天Linux小白到大神-Linux磁盤管理

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 檔案系統故障修複

  1. 磁盤滿了、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