1. 程式人生 > 其它 >10.Linux磁碟管理

10.Linux磁碟管理

目錄

10.Linux磁碟管理

1.磁碟概述

1.1 什麼是磁碟

大多數人對硬碟都不陌生,一塊小小的硬盤裡,就可以存
儲海量的照片音樂和電影,尤其是我們喜愛的各類動作
片。但如此小的空間,是如何儲存那麼多資訊的呢?

每個硬碟中心都是一摞高速運轉的圓盤,在圓盤上附著的
一圈金屬顆粒,每個金屬顆粒都有自己的磁化程度,主要
用於儲存0和1。

在資料寫入時,硬碟的磁頭開始通電,周圍會產生磁場,
資料在磁場的作用下轉變成電流,使磁碟的金屬顆粒磁
化,從而將資訊記錄在圓盤上。

由海量顆粒組成的資訊,就是我們存在硬盤裡的資料

1.2磁碟物理結構

1.2.1 什麼是碟片

硬碟一般有一個或多個碟片,每個碟片可以有兩面,即第
一個碟片的正面為0面,反面為1面然後依次類推。

1.2.2什麼是磁軌

每個碟片的盤面在出廠的時候被劃分出了多個同心圓環,
資料就儲存在這樣的同心圓環上面,我們將這樣的圓環稱
為磁軌 Track ,每個盤面可以劃分多個磁軌。但肉業不
可見.

1.2.3 什麼是扇區

在硬碟出廠時會對磁碟進行一次低格,其實就是再每個磁
道劃分為若干個弧段,每個弧段就是一個扇區 Sector 。
扇區是硬碟上儲存的物理單位,現在每個扇區可儲存512
位元組資料已經成了業界的約定。

1.2.4 什麼是柱面

柱面實際上就是我們抽象出來的一個邏輯概念,簡單來說
就是處於同一個垂直區域的磁軌稱為 柱面 ,即各盤面上
面相同位置磁軌的集合。這樣資料如果儲存到相同半徑磁
道上的同一扇區,這樣可以實現並行讀取,主要是減少磁
頭尋道時間

1.2.5 什麼是磁頭

讀取磁碟磁軌上面金屬塊,主要負責讀或寫入資料。

1.3 磁碟的介面型別

1.3.1 IDE-SCSI

  • IDE,Scsi (已經被淘汰)

1.3.2 SATA-SAS

  • SATA III 與 SAS
介面型別 介面速率 碟片轉速 寫入速度 應用場景
SATA III 6Gbps/s 7.5k/s 300MB/s 個人
SAS 8Gbps/s~12Gbps/s 15k/s 300~600MB/s 企業

1.3.3 MSATA-M2

  • MSATA 與 M.2

  • MSATA 介面是專門為超級筆記本而設計的,m.2介面
    參考文件

  • m.2 介面是 inter 推出的一種替代 MSATA 新的介面
    規範;

  • m.2 介面相比 MSATA 介面有兩方面的優勢

    • 1.速度優勢
    • 2.體積優勢
M.2介面型別 支援介面型別 相容性 讀取速度 寫入速度
socket2 SATA,PCI-E X2 幾乎主機板都支援 700MB/s 550MB/s
socket3 PCI-E x4 Nvme 需要檢查主機板是否支援 4Gb/s

2.磁碟命名

2.1 物理伺服器

  • 真是物理伺服器
裝置名稱 分割槽資訊 裝置型別
/dev/sda /dev/sda1 第一塊物理磁碟第一分割槽
/dev/sdb /dev/sdb2 第二塊物理磁碟第二個分割槽
/dev/sdd /dev/sdd4 第四塊物理磁碟的第四個分割槽

2.2 虛擬伺服器

  • 阿里雲主機或者KVM虛擬化主機的磁碟命名格式
裝置名稱 分割槽資訊 裝置型別
/dev/vda /dev/vda1 第一塊虛擬磁碟的第一個分割槽
/dev/vdb /dev/vdb2 第二塊虛擬磁碟的第二個分割槽
/dev/vdc /dev/vdc3 第三塊虛擬磁碟的第三個分割槽

3. 分割槽管理

3.1 為什麼要分割槽

  • 分割槽是為了便於資料分門別類的儲存;分割槽有 MBR、
    GPT 兩種方式;

  • 分割槽表:(記錄分割槽的編號、每個編號從哪個扇區開
    始,到哪個扇區結束)

    • MBR :主引導記錄,用來找到磁碟上的作業系統,
      並且引導啟動(0磁軌,1扇區,512位元組)
      • 446位元組: boot loader
      • 64位元組:儲存分割槽表,每16位元組表示一個分割槽,
        最多四個“主分割槽”(主分割槽+擴充套件分割槽)
      • 2位元組:結束位;
      • GPT :新型的分割槽表 GPT 支援分配128個主分割槽。

3.2 fdisk分割槽工具

  • 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)

3.3 gdisk分割槽工具

  • gdisk 支援分配大於 2TB 的磁碟
    • 檢視當前裝置 gdisk [-l] device
    • 對裝置進行分割槽 gdisk /dev/sdb
  • 分割槽命令
    • ?:顯示幫助
    • n:建立新分割槽
    • p:列印分割槽
    • w:儲存分割槽
    • q:退出
  • 分割槽案例:
    • 案例1:分配4個主分割槽(4P)
    • 案例2:分配5個主分割槽(5P)
    • 案例3:分配6個主分割槽(6P)

3.4 mkfs格式化系統

  • mkfs 命令用於格式化硬碟,類似於將房子裝修成3室
    一廳,還是2室一廳;
    • -b :設定資料區塊佔用空間大小,目前支援 1024、
      2048、4096 bytes 每個塊;
    • -t :用來指定什麼型別的檔案系統,可以是 ext4、
      xfs ;
  • 提示:
    • 1.分割槽工具,可以針對整塊磁碟,或者單個分割槽進
      行格式化操作
    • 2.一般情況下建議,不要直接格式化使用整磁碟,
      要分割槽後再格式化,頭部有預留空間;

1.使用 mkfs 命令,格式化整個硬碟

# ex2 ext3 ext4
[root@node~]# mkfs.ext4 /dev/sdb

2.使用 mkfs 命令,格式化磁碟的某個分割槽

[root@node ~]# mkfs.xfs /dev/sdb1

3.使用 mkfs 命令指定一個數據塊的大小 4096位元組=4k

[root@node ~]# mkfs.xfs -b size=1024
/dev/sdb2

4.掛載管理

  • 當需要使用磁碟空間的時,需要準備一個目錄作為掛
    載點,然後使用 mount 命令與該裝置進行關聯;

4.1 臨時掛載mount

  • 通過mount進行掛載,但重啟將會失效。我們稱為臨
    時生效。
    • -t :指定檔案系統掛載分割槽;
    • -a :檢查並且掛載 /etc/fstab 配置檔案中未掛載
      的裝置;
    • -o :指定掛載引數, ro、rw ;

1.掛載磁碟裝置;

[root@node ~]# mkdir /db1
[root@node ~]# mount -t xfs /dev/sdb1 /db1

2.掛載磁碟裝置,設定引數為僅可讀;

[root@node ~]# mkdir /db2
[root@node ~]# mount -t xfs -o ro /dev/sdb2 /db2
[root@node ~]# touch /db2/new_file

touch: cannot touch '/db2/new_file': Read-
only file system

4.2 臨時解除安裝umount

  • 如果不想使用可以使用 umount
    [device|directory] 進行臨時解除安裝。
    • -l :強制解除安裝;

1.解除安裝入口目錄示例;

[root@node ~]# umount /db1

2.解除安裝裝置方式示例;

[root@node ~]# umount /dev/sdb1

3.如碰到無法正常解除安裝情況處理;

[root@node 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@node db1]# umount -l /db1

4.3永久掛載fstab

  • 如果需要實現永久掛載,則需要將掛載相關資訊寫入
    /etc/fstab 配置檔案中實現。

4.3.1 永久掛載配置書寫

  • 配置檔案規範: 裝置名稱|掛載的入口目錄|檔案系統類
    型|掛載引數|是否備份|是否檢查

    • 1.獲取裝置名稱,或者獲取裝置 UUID
    • 2.手動臨時掛載測試;
    • 3.寫入 /etc/fstab 配置檔案;
    • 4.使用 mount -a 檢查是否存在錯誤;

    1.獲取裝置名稱,或裝置的 UUID

    [root@node ~]# blkid |grep "sdb1"
    /dev/sdb1: UUID="e271b5b2-b1ba-4b18-bde5-
    66e394fb02d9" TYPE="xfs"
    
    

    2.手動掛載測試

    [root@node ~]# mount UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" /db1
    
    

    3.寫入 /etc/fstab 測試

    # 手動編寫
    [root@node ~]# tail -1 /etc/fstab UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0
    # 自動實現
    [root@node ~]# blkid |grep /dev/sda1 | awk
    -F '[: ]+' '{print $2}' | \
    sed -r 's#(.*)#\1 /db1 xfs defaults 0 0#g'
    >> /etc/fstab
    
    

    4.載入 /etc/fstab 配置檔案, 同時檢測是否存在語法錯誤

    [root@node ~]# mount –a
    
    

4.3.2 配置檔案/etc/fstab

  • /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級別檢驗)

5. 虛擬磁碟SWAP

5.1 什麼是SWAP

  • Swap 分割槽在系統的實體記憶體不夠時,將硬碟中的一部
    分空間供當前執行的程式使用。

5.2 為什麼需要SWAP

  • 當實體記憶體不夠時會隨機 kill 佔用記憶體的程序,從
    而產生 oom ,臨時使用 swap 可以解決。
  • 案例:模擬伺服器 OOM ;
[root@node ~]# dd if=/dev/zero of=/dev/null
bs=800M
#故障日誌
[root@node ~]# 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

5.3 SWAP基本應用

1.建立分割槽,並格式化為 swap 分割槽。

[root@node ~]# fdisk /dev/sdb
# 格式化為swap
[root@node ~]# mkswap /dev/sdb1

2.檢視當前 swap 分割槽大小

[root@node ~]# free -m
total used free
shared buff/cache available
Mem: 1980 1475 80
10 424 242
Swap: 2047 4 2043

5.3.1 擴充套件swap分割槽

  • 擴充套件 swap 分割槽,使用 swapon 命令
    • swapon device :將某個磁碟大小新增到 swap 分
      區中
    • swapon -a :新增所有 swap 分割槽
[root@node ~]# swapon /dev/sdb1
[root@node ~]# free -m
total used free
shared buff/cache available
Mem: 1980 1475 80
10 424 242
Swap: 3047 4 2043

5.3.2 縮小swap分割槽

  • 縮小 swap 分割槽,使用 swapoff 命令
    • swapoff device :關閉某個磁碟的 swap 分割槽
    • swapoff -a :關閉所有 swap 分割槽
[root@node ~]# swapoff /dev/sdb1
[root@node ~]# free -m
total used free
shared buff/cache available
Mem: 1980 1475 80
10 424 242
Swap: 2047 4 2043

6.檔案系統

6.1 檔案系統的作用

  • 使用者無法直接與硬體進行互動,那如果需要申請 100G
    磁碟空間,怎麼辦?
  • 為了簡化磁碟使用的過程,作業系統提供了一個輔助
    系統 FS (檔案系統)

6.2 檔案系統的型別

  • Windows : FAT32、NTFS
  • Linux : EXT2、EXT3、EXT4、XFS、VFAT、NTFS-3g

6.3 檔案系統結構

  • 磁碟被劃分為兩大儲存區域,一類是儲存元資料
    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 ;

6.4 檔案系統故障修復

  • 在 Linux 系統中,為了增加系統性能,通常系統會將
    一些資料先寫入記憶體中,然後在重新整理至磁碟中;

  • 萬一公司伺服器突然斷電或者其他未知原因,再次啟
    動後,會造成檔案系統錯誤;

    1.新增磁碟,給磁碟分配 1G 空間;

    [root@node ~]# fdisk /dev/sdc # 分配1G分割槽
    [root@node ~]# mkfs.xfs /dev/sdc1
    [root@node ~]# mount /dev/sdc1 /mnt
    [root@node ~]# echo "Hello" > /mnt/new.txt
    
    

    2.使用 dd 模擬磁碟斷電損壞,然後取消掛載,會發現無
    法正常重新掛載;

    [root@node ~]# dd if=/dev/zero of=/dev/sdc
    bs=300M count=1
    [root@node ~]# umount /mnt
    [root@node ~]# mount /dev/sdb1 /mnt #無法
    掛載
    
    

    3.使用 xfs_repair 修復檔案系統;

    [root@node ~]# xfs_repair /dev/sdc1
    
    

    4.如出現修復失敗,可採用強制修復,但可能會造成部分
    資料丟失;

    [root@oldxu ~]# xfs_repair -L /dev/sdc1
    
    

7. 磁碟滿了.Inode滿了

磁碟滿了;會提示錯誤;無法寫入資料;
磁碟沒有滿,但還是提示磁碟空間不足---> 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/
touch {1..100000}
#########################錯誤
# 在檢視磁碟空間,和Inode 的空間;
df -i |grep new
df -h |grep new

本文來自部落格園,作者:GaoBeier,轉載請註明原文連結:https://www.cnblogs.com/gao0722/p/15086810.html