磁碟知識體系結構

  • 2020 年 9 月 15 日
  • 筆記

第1章           磁碟知識體系結構

1.1  磁碟知識體系結構

        1) 磁碟的外部結構和內部結構

        2) 磁碟陣列 RAID   LVM 邏輯卷管理

        3) 磁碟分區 主分區 擴展分區 邏輯分區

              fdisk

              parted

       4) 磁碟格式化

       5) 磁碟的使用 掛載

1.1.1  磁碟結構

1.1.1.1    外部結構

              機械磁碟

           固態磁碟

1.1.1.2    內部結構

1.1.1.2.1     磁碟的主軸

1.1.1.2.2     磁碟的轉速

       家用: 5.4K  7.2K

      企業: 10K   15K

1.1.1.2.3     磁碟碟片

                     作用:存儲數據

                  磁頭:

                    作用:

                     a)讀寫數據

                     b)盤面的數量等於磁碟磁頭的數量

                     c)磁碟介面

                       連接主板

                      介面類型

                      IDC      淘汰

                      SCSI    淘汰

                      SATA

                      SAS

                      SSD

                      PCI-E

1.1.1.2.4     磁碟(Disk)
1.1.1.2.5     磁頭(Head)

               作用說明:用來寫入和讀取數據的

               特點說明:盤面數量等於磁頭數量

              工作原理:採用徑向運動讀寫數據

1.1.1.2.6     磁軌(Track)

               作用說明:用來存儲用戶數據

               特點說明:由多個同心圓組成

               存儲計數:最外面同心圓為0磁軌

              工作原理:磁碟默認按照磁軌尋找數據

              重點原理:磁頭徑向運動為機械運動(尋道)  性能小於固態硬碟(晶片)

              原理特點:磁頭機械運動較慢

1.1.1.2.7     扇區(Sector)

              作用說明:用來存儲用戶數據

              特點說明:磁碟存儲最小單位

              存儲計數:默認磁碟扇區從1扇區開始,扇區大小為512位元組

              系統存儲最小單位是block

1.1.1.2.8      柱面(Cylinder)

            作用說明:用來存儲用戶數據

            特點說明:不同盤面上相同的磁軌組成(圓柱體)

            工作原理:磁碟默認按照柱面進行讀寫

            重點原理:磁頭之間的切換為電子切換

             原理特點:磁頭電子切換較快

1.1.1.2.9     單元塊(Units)

             作用說明:用來存儲用戶數據

             特點說明:表示單個柱面大小

1.2  磁碟陣列

              磁碟陣列如何配置

              配置LVM  L 邏輯  v 卷組  M 管理  邏輯卷管理 –> 實現可以隨意調整磁碟分區大小

              獲得更大的容量

              獲得更高的性能

              獲得更好的安全性

1.2.1   raid 0

             具有最高的存儲性能(磁碟容量不浪費,讀寫很快),這些磁碟的總和

            10*1TB raid 0

             要製作RAID 0至少要1塊物理磁碟,不做raid不能安裝系統

             安全:任何一塊硬碟損壞,所有的數據無法使用,安全性最低

             可用容量:所有硬碟容量的和

             性能:讀寫速度最快

             使用場景:不要求安全,只要求速度

             舉例:資料庫從庫/存儲從庫

1.2.2    raid 1

        鏡像:損失50%的數據容量。例如2塊1T的盤,做完RAID 1後容量為1T

         raid只能2塊硬碟

         Mirror不能提高存儲性能。理論上寫性能和單盤相差不大

         安全冗餘:100% 

         可用容量:一半(兩塊硬碟容量之和)

         性能:寫入速度慢,讀取速度OK

         使用場景:只追求安全性對於速度沒要求

         舉例:系統盤,監控伺服器

1.2.3   raid 5

             需要至少3塊,損失一塊硬碟

            6*600G

           安全:最多可以損壞一塊硬碟

           可用容量:損失一塊盤的容量

           性能:寫入速度不快,讀取Ok

          使用場景:對於數據安全,對於速度要求不高

          舉例:普遍資料庫 ,存儲訪問量不高

1.2.4    raid 10 成本最高

           最少4塊硬碟,增加硬碟必須是2的倍數;所有硬碟容量的一半

           安全:最多損壞一半硬碟

           可用容量:損失所有硬碟一半的容量      

           性能:寫入和讀取 都很快

            使用場景:對於安全和性能都要

            舉例:高並發或高訪問量     資料庫主庫   存儲

 

 

 

1.3  磁碟分區

          情況1:

           MBR格式

            4個主分區 sda1 sda2 sda3 sda4

           情況2:

            3個主分區 sda1 ada2 sda3 sda4(擴展分區) 無法直接使用 無法掛載

           sda4(200G)

           多個邏輯分區

            sda5 100G        可以直接使用      可以掛載

            sda6 100G        可以直接使用     可以掛載

            第1塊sas硬碟的第一個主分區

           /dev/sda1

            第2塊sata硬碟的第2個主分區

           /dev/sdb2

            第3塊sata硬碟的第1個邏輯分區

          /dev/sdc5

          伺服器的第一塊磁碟使用 sda

          第二快磁碟使用 sdb

          第一塊磁碟的第一個主分區 sda1

           第二個主分區 sda2

          第一個邏輯分區 sda5

         第二快磁碟的第一個主分區 sdb1

          第二個主分區 sdb2

          第一個邏輯分區 sdb5

1.4  磁碟格式化   fdisk

       fdisk  小於2T的磁碟進行分區 MBR

1.4.1  MBR格式 4個主分區

         Linux作業系統 RAID

         300G 600G 900G

         300*2快 RAID1 保護作業系統 600G–> MBR引導

1.4.2    parted 大於2T的磁碟進行分區 GPT

          GPT格式 128個主分區

1.5  磁碟分區: fdisk

        第一步: 準備一塊新的磁碟 100M

            虛擬機添加

            工作: 物理機 購買新的磁碟

                  雲服務 購買雲存儲

      第二步: 查看確認磁碟已在作業系統中顯示 fdisk

            雲服務新的磁碟 需要重啟

            物理機新的磁碟  支援熱插拔

            虛擬機vmware需要重啟

      第三步: fdisk 分區

[root@oldboyedu-lnb ~]# fdisk /dev/sdb    # 對第二快磁碟進行分區
Command (m for help): m                       # help 幫助
Command action
d   delete a partition                                # 刪除分區
g   create a new empty GPT partition table    # 創建GPT分區表
l   list known partition types                       # 顯示分區表類型
m   print this menu                                   # 列印幫助菜單
n   add a new partition                              # 創建新的分區
p   print the partition table                         # 顯示分區表
q   quit without saving changes                   # 退出不保存
t   change a partition's system id                # 改變分區類型
w   write table to disk and exit                    # 保存並退出                         
Command (m for help): n
Partition type:    # 分區類
p   primary (0 primary, 0 extended, 4 free)   #可用4個主分區
e   extended    # 擴展分區
Select (default p): # 選擇分區表類型 默認 p 主分區
Partition number (1-4, default 1):  選擇分區號碼默認1
First sector (2048-208895, default 2048): # 開始的扇區 默認
Using default value 2048         
Last sector, +sectors or +size{K,M,G} (2048-208895, default 208895): +20M  #結束的扇區 或者 K M G  +20M 第一個分區為20M
Partition 1 of type Linux and of size 20 MiB is set
查看當前的分區
Command (m for help): p
Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5bcfea06
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1         2048       43007       20480   83  Linux

第四步: 格式化

       xfs cenetos7默認的分區表類型

[root@oldboyedu-lnb ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=1, agsize=5120 blks
               =                           sectsz=512        attr=2, projid32bit=1
               =                                crc=1        finobt=0,     sparse=0
      data   =                             bsize=4096   blocks=5120,  imaxpct=25
               =                              sunit=0      swidth=0 blks
 naming   =version 2               bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=855, version=2
              =sectsz=512            sunit=0 blks, lazy-count=1
  realtime =none                   extsz=4096   blocks=0, rtextents=0

       第五步: 掛載使用

[root@oldboyedu-lnb ~]# mount /dev/sdb1 /mnt
[root@oldboyedu-lnb ~]# df -h
tmpfs            98M     0   98M   0% /run/user/0
/dev/sdb1        17M  1.1M   16M   7% /mnt

       第六步: 卸載磁碟

[root@oldboyedu-lnb ~]# umount /mnt

            作業練習:

            分區 3個主分區+1個擴展分區+2個邏輯分區

磁碟案例

注意:分區的時候,如果分三個主分區,把剩下的所有(默認)給第三個主分區,如果分三個主分區,1個擴展分區,把剩下的所有分給擴展分區.
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-208895, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-208895, default 208895): +16M
Partition 1 of type Linux and of size 16 MiB is set
Command (m for help): n 
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (2-4, default 2):
First sector (34816-208895, default 34816):
Using default value 34816
Last sector, +sectors or +size{K,M,G} (34816-208895, default 208895): +16M
Partition 2 of type Linux and of size 16 MiB is set
Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
Partition number (3,4, default 3): 3
First sector (67584-208895, default 67584):
Using default value 67584
Last sector, +sectors or +size{K,M,G} (67584-208895, default 208895): +16M
Partition 3 of type Linux and of size 16 MiB is set
Command (m for help): n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e
Selected partition 4
First sector (100352-208895, default 100352):
Using default value 100352
Last sector, +sectors or +size{K,M,G} (100352-208895, default 208895):
Using default value 208895
Partition 4 of type Extended and of size 53 MiB is set

 
Command (m for help): n
All primary partitions are in use
Adding logical partition 5
First sector (102400-208895, default 102400):
Using default value 102400
Last sector, +sectors or +size{K,M,G} (102400-208895, default 208895): +16M
Partition 5 of type Linux and of size 16 MiB is set
Command (m for help): n 
All primary partitions are in use
Adding logical partition 6
First sector (137216-208895, default 137216):
Using default value 137216
Last sector, +sectors or +size{K,M,G} (137216-208895, default 208895): +16M
Partition 6 of type Linux and of size 16 MiB is set

 

Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@oldboyedu-lnb~]# ll /dev/sdb
sdb   sdb1  sdb2  sdb3  sdb4  sdb5  sdb6 

第2章      磁碟分區方式

2.1 開機自動載入方案

2.1.1  寫入rc.local

 2.1.2  寫入/etc/fstab

UUID=d25e7543-.....   /          xfs                defaults     1               1
UUID或者設備名稱  掛載點  文件系統          掛載參數  是否備份 開機磁碟檢查

 2.1.3  查看UUID

  lsblk  查看

[root@oldboyedu-lnb~]# lsblk -f
NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
sda                                                                
├─sda1 xfs                     1af0c500-80df-4926-88aa-8e4419a636c9 /boot
├─sda2 swap                    35a4f6da-d8f3-4449-83d2-bef70f83bda0 [SWAP]
└─sda3 xfs                     32c0b660-ac0a-4b5c-b1c9-4f5209eba66a /
sdb                                                                
sr0    iso9660 CentOS 7 x86_64 2018-11-25-23-54-16-00     

blkid查看

[root@oldboyedu-lnb~]#  

/dev/sda1: UUID="1af0c500-80df-4926-88aa-8e4419a636c9" TYPE="xfs"

/dev/sda2: UUID="35a4f6da-d8f3-4449-83d2-bef70f83bda0" TYPE="swap"

/dev/sda3: UUID="32c0b660-ac0a-4b5c-b1c9-4f5209eba66a" TYPE="xfs"

/dev/sr0: UUID="2018-11-25-23-54-16-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"

2.2   磁碟分區fdisk

           fdisk適用於小於2TB磁碟 fdisk只支援mbr分區表

           開機自動掛載 /etc/fstab   掛載設備的配置文件 /etc/rc.local

[root@oldboyedu-lnb ~]# tail -2 /etc/fstab
/dev/sdb1          /mnt          xfs     defaults      0 0
UUID=fc550328-186c-408f-aa4f-daf78bf04281 /data           xfs     defaults     0 0

       PS: 在使用df -h過程中發現無法正常顯示磁碟資訊

           使用umount -f /data 強制卸載後正常使用

2.3  磁碟分區parted

parted一般用於大於2TB磁碟 gpt支援更大的硬碟且支援更多的分區 不寫入記憶體直接生效

常用參數 主分區可分128個
GPT 格式:parted 命令可以創建全局惟一的標識符分區表 GPT,而 fdisk 和 cfdisk 則僅限於 DOS 分區表。
mktable 創建磁碟分區表
mktable gpt 創建分區為GTP格式 設置分區表為GPT
p     print  顯示磁碟分區資訊
mkpart  make partition 創建分區
rm    刪除分區
q   quit 退出
創建分區並查看分區p  提示沒有找到分區 說明還沒有進行分區
    [root@oldboyedu-lnb ~]# parted -l    # 查看gpt格式分區資訊
    [root@oldboyedu-lnb ~]# parted /dev/sdb
    (parted) mktable gpt                                                     
    (parted) p                                                               
    Model: VMware, VMware Virtual S (scsi)
    Disk /dev/sdb: 3221GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags:
    Number  Start  End  Size  File system  Name  Flags
    (parted) mkpart primary
    File system type?  [ext2]? xfs    # 文件系統                                       
   Start? 0                            # 開始                                    
   End? 1000                           # 結束                                    
   Warning: The resulting partition is not properly aligned for best performance.
   Ignore/Cancel? I      
   [root@oldboyedu-lnb ~]# parted /dev/sdb
   GNU Parted 3.1
   Using /dev/sdb
   Welcome to GNU Parted! Type 'help' to view a list of commands.
   (parted) mkpart primary 1000 1500
    Warning: The resulting partition is not properly aligned for best performance.
   Ignore/Cancel? I                                                         
   (parted) print                                                            
    Model: VMware, VMware Virtual S (scsi)
   Disk /dev/sdb: 3221GB
    Sector size (logical/physical): 512B/512B
   Partition Table: gpt
    Disk Flags:
    Number  Start    End     Size       File system  Name     Flags
     1      17.4kB  1000MB   1000MB                primary
     2      1000MB  1500MB   500MB                  primary

2.4   刪除主分區

Number  Start   End     Size    File system  Name     Flags
1      17.4kB  1000MB  1000MB               primary
2      1000MB  1500MB  500MB                primary
(parted) rm 2  

2.5  非互動式parted分區

[root@oldboyedu-lnb ~]# parted /dev/sdb mkpart primary 1000 2000
[root@oldboyedu-lnb ~]# parted /dev/sdb mkpart primary 2000 2500
Information: You may need to update /etc/fstab.
[root@oldboyedu-lnb ~]# parted /dev/sdb  print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 3221GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number  Start      End        Size              File system    Name         Flags

  1      17.4kB    1000MB  1000MB                primary

  2      1000MB   2000MB   999MB                primary

 3      2000MB     2500MB  500MB                primary

2.6  非互動式刪除

[root@oldboyedu-lnb ~]# parted /dev/sdb  rm 2

格式化分區

[root@oldboyedu-lnb ~]# mkfs.xfs /dev/sdb1

下一步掛載使用

[root@oldboyedu-lnb ~]# mount /dev/sdb1 /mnt

2.7   企業場景

            磁碟空間不夠用

           雲主機 購買磁碟–>雲伺服器後台掛載到對應的伺服器(在光碟機中放入鏡像文件)

           物理機 直接插新的磁碟 支援熱插拔

2.7.1      格式化磁碟

[root@oldboyedu-lnb ~]# mkfs.xfs -f /dev/sdb

2.7.2    掛載使用磁碟

[root@oldboyedu-lnb ~]# mount /dev/sdb /data

2.7.3   查看磁碟掛載

[root@oldboyedu-lnb ~]# df -h
/dev/sdb        3.0T   33M  3.0T   1% /data

2.7.4    開機自動掛載  /etc/fstab

/dev/sdb         /data       xfs     defaults     0    0

2.8  磁碟案例

        企業案例:java環境記憶體不夠用,佔用大量的swap分區

        記憶體滿: 導致Linux系統的進程被殺 優先殺佔用記憶體最高的那個服務

        兩種情況:

        一種情況是流量達到了上線   記憶體8G 實際用到了7.xG 必須升級記憶體

        第二種情況流量沒有達到上線 網路波動引起的 某個時間點達到8G左右

        程式程式碼導致記憶體溢出(用戶量沒有達到8G值)

        swap 磁碟的空間臨時充當記憶體使用 速度較慢

        swap分區在安裝系統可以劃分

在進入作業系統後可以臨時擴充   

2.9  擴展swap分區大小

/dev/zero 白洞 不斷輸出內容
/dev/null 黑洞
/dev/urandom 隨機字元 

2.9.1  第一步: 生成一個200M的文件

dd if=/dev/zero of=/tmp/200m bs=1M      count=200
inputfile    outfile      block size    複製次數
數據來源   輸出文件 每次複製多大

2.9.2  第二步: 格式化swap分區

[root@oldboyedu-lnb ~]# mkswap /tmp/200m
Setting up swapspace version 1, size = 204796 KiB
no label, UUID=6ecfd552-d6f1-4769-b57b-39bb1a33d87d

2.9.3  第三步: 激活 掛載swap分區

[root@oldboyedu-lnb ~]# swapon /tmp/200m
swapon: /tmp/200m: insecure permissions 0644, 0600 suggested.
You have 5new mail in /var/spool/mail/root
[root@oldboyedu-lnb ~]# free -h
total        used          free      shared       buff/cache   available
Mem:      974M         97M        527M         13M           349M        698M
Swap:      1.2G          0B          1.2G

2.9.4  第四步: 卸載swap分區

[root@oldboyedu-lnb ~]# swapoff /tmp/200m
You have new mail in /var/spool/mail/root
[root@oldboyedu-lnb ~]# free -h
                          total         used        free      shared  buff/cache   available

       Mem:           974M         97M        527M         13M        349M        698M

       Swap:           1.0G          0B        1.0G

2.9.5  第五步:查看swap的組成

[root@oldboyedu-lnb ~]# swapon -s
Filename           Type        Size        Used   Priority
/dev/sda2        partition    1048572   0        -1
/tmp/200m         file         204796    0        -2

2.9.6  第六步: 開機自動掛載

  /tmp/200m          swap         swap    defaults      0    0

2.10  磁碟案例2:

1. du –sh 查看某個目錄佔用空間大小  確認後刪除
2. 通過磁碟掛載的方式解決磁碟不夠用的情況

2.10.1    第一步: 生成10G的文件

dd if=/dev/zero of=/var/log/10g bs=1M count=10000

2.10.2    第二步: 使用du命令查找該文件

du -h /*|grep G
du -h /var/log/*|grep G    

2.10.3    使用find查找大文件

[root@oldboyedu-lnb ~]# find / -type f -size +1G
/var/log/10g

2.11  通過磁碟掛載的方式解決磁碟不夠用的情況

         查找到的大文件 有用 增加磁碟的方式解決 源文件的路徑不能變

         /var/log/10g  持續不斷的往文件中輸出日誌

2.11.1   第一步:  增加一塊新的磁碟進行格式化掛載     

mkfs.xfs /dev/sdb
mount /dev/sdb /data 

2.11.2     第二步:  把/var/log/10g 文件移動到/data下 第二快磁碟          

2.11.3     第三步: 軟鏈接

[root@oldboyedu-lnb ~]# ln -s /data/10g /var/log/10g

2.12   磁碟案例3: 如何查找小文件多的目錄

              使用find命令查找目錄的大小      

2.13    磁碟案例4

              文件是否被真的刪除

              顯示 no space left on device ,df –h查看磁碟有剩餘

              inode和block的數量同時為0 文件沒有被進程調用 重啟服務生效

2.13.1    第一步: 模式文件被命令佔用

2.13.2    第二步: 使用lsof查看被進程調用的文件

安裝lsof命令 yum -y install lsof

[root@oldboyedu-lnb ~]# lsof|grep 10g
tail      2053         root    3r      REG     8,16 10485760000       67 /data/10g

2.13.3  第三步: 在文件被佔用的情況下刪除10g這個文件

[root@oldboyedu-lnb ~]# rm -f /data/10g
[root@oldboyedu-lnb ~]# ll /data/
total 0
[root@oldboyedu-lnb ~]# df -h
/dev/sdb        3.0T  9.8G  3.0T   1% /data

2.13.4  第四步: 重啟服務生效

httpd 服務—> /var/log/httpd/access.log

刪除access.log文件後重啟(文件過大但是還是沒有解決問題)

systemctl reload|restart httpd 重啟生效

[root@oldboyedu-lnb ~]# lsof |grep 10g
tail      2053         root    3r      REG      8,16 10485760000   67 /data/10g (deleted)
[root@oldboyedu-lnb ~]# kill -9 2053