Linux—磁盤管理

語言: CN / TW / HK

Linux 磁盤管理

1、磁盤簡介

1.1 認識磁盤

磁盤是一種計算機的外部存儲器設備,由一個或多個覆蓋有磁性材料的鋁製或玻璃制的碟片組成,用來存儲用户的信息,這種信息可以反覆地被讀取和改寫;絕大多數磁盤被永久封存在一個密封的盒子裏。

1.2 磁盤運行機理

簡單來説就是多個盤片之間靠主軸連接,電機帶動主軸做旋轉運動,通過多個磁頭臂的搖擺和磁盤的旋轉,磁頭就可以在磁盤旋轉的過程中就讀取到磁盤中存儲的各種數據。

1.3 磁盤的扇區、磁道、柱面

磁道:磁盤的每個盤面被劃分為許多同心圓,這些同心圓的軌道叫做磁道。

扇區:一個盤面劃分為若干個內角相同的扇形,這樣盤面上的每個磁道就被分為若干段圓弧,每段圓弧叫做一個扇區。每個扇區中的數據作為一個單元同時被讀入或寫入。每一個扇區是512字節,其中有64個字節存儲的是分區表,一條分區信息佔16個字節。

柱面:每一個盤片同一大小的同心圓可以看成連在一起的柱面,磁盤在分區的時候最小單位是柱面,每一個盤片的上下面都可以讀取數據,每一個磁頭,不可以跨盤面讀取數據。

1.4 磁盤的分類

IDE接口磁盤:特點價格低廉,兼容性強,性價比高,數據傳輸較慢,不支持熱插拔等。

SCSI接口磁盤:傳輸速率高,讀寫性能好,運行穩定,可連接多個設備;可支持熱插拔,佔用CPU低,但是價格相對來説比較貴,一般用於工作站或服務器上。

SATA接口磁盤:結構簡單、支持熱插拔。

USB接口磁盤:移動硬盤,隨身攜帶,性能較低。

IDE接口的磁盤在Linux系統中命名為:/dev/hd[a-z]

SCSI、SATA、USB接口的磁盤在Linux系統中命名為:/dev/sd[a-z]

虛擬化磁盤在Linux系統中命名為:/dev/vd[a-z]

打印機設備在Linux系統中命名為:/dev/lp[0-15]

2、磁盤分區

2.1 為什麼要分區?

易於管理和使用:

比如説我們把磁盤分成多個盤(分區)sda1、sda2、sda3、sda4,假設sda1盤為系統盤,其他的比如説遊戲、辦公、軟件盤,這樣我們想管理哪個盤直接選中操作即可不會影響其他盤;而且根據用途我們也能較快的去使用相應的磁盤。

有利於數據的安全:

通過分區可以降低數據損失的風險;出現硬盤壞道、錯誤操作、重裝系統都有可能造成數據損失,如果分區了,那麼我們就可以將損失最小化。

節約尋找文件的時間:

尋找文件的時間是指電腦搜索文件的時間;分區以後,電腦搜索文件時只需要在相對應的分區搜索就可以了,沒必要進行全盤搜索,大大節省了尋找文件的時間。

磁盤分區圖示:

2.2 分區類型

MBR(Master Boot Record)和GPT(GUID Partition Table)是在磁盤上存儲分區信息的兩種不同方式;這些分區信息包含了分區從哪裏開始的信息,這樣操作系統才知道哪個扇區是屬於哪個分區的,以及哪個分區是可以啟動的。在磁盤上創建分區時,你必須在MBR和GPT之間做出選擇。

MBR是Master Boot Record的簡稱,也就是主引導記錄,是位於磁盤最前邊的一段引導(Loader)代碼,主要用來引導操作系統的加載與啟動。

特點:

  • MBR支持最大2TB磁盤,它無法處理大於2TB容量的磁盤
  • 只支持最多4個主分區。若想要更多分區,需要創建擴展分區,並在其中創建邏輯分區

GPT磁盤是指使用GUID分區表的磁盤,GUID磁盤分區表(GUID Partition Table,縮寫:GPT)其含義為“全局唯一標識磁盤分區表”,是一個實體硬盤的分區表的結構佈局的標準。

特點:

  • GPT對磁盤大小沒有限制
  • 最多可以創建128個分區

3、分區工具使用

3.1 查看分區使用情況

df	//命令查看已掛載磁盤或分區使用情況,默認K為單位
-h	//以G或者T或者M人性化方式顯示
-i	//查看inode使用情況
-T	//查看文件系統類型

[[email protected] ~]# df -h
設備名稱      	  磁盤大小 已用大小 可用大小 使用百分比 掛載點
Filesystem             Size  Used  Avail   Use%      Mounted on
devtmpfs               1.9G     0   1.9G     0%      /dev
tmpfs                  1.9G     0   1.9G     0%      /dev/shm
tmpfs                  1.9G  9.7M   1.9G     1%      /run
tmpfs                  1.9G     0   1.9G     0%     
 /sys/fs/cgroup
/dev/mapper/rhel-root   55G   14G    42G    26%      /
/dev/sr0               7.9G  7.9G      0   100%      /mnt/cdrom
/dev/nvme0n1p1        1014M  229M   786M    23%      /boot
tmpfs                  376M  4.0K   376M     1%      /run/user/0
tmpfs                  376M  1.2M   375M     1%      /run/user/42

lsblk	//查看所有磁盤和分區使用情況
[[email protected] ~]# lsblk 
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0            11:0    1  7.9G  0 rom  /mnt/cdrom
nvme0n1       259:0    0   60G  0 disk 
|-nvme0n1p1   259:1    0    1G  0 part /boot
|-nvme0n1p2   259:2    0   19G  0 part 
| |-rhel-root 253:0    0   55G  0 lvm  /
| `-rhel-swap 253:1    0    2G  0 lvm  [SWAP]
`-nvme0n1p3   259:3    0   40G  0 part 
  `-rhel-root 253:0    0   55G  0 lvm  /

du	//統計文件佔用磁盤大小
-s	//列出總和
-h	//人性化顯示容量信息

[[email protected] ~]# du -sh /etc/
30M     /etc/

3.2 磁盤分區工具

分區工具有fdisk和gdisk,當硬盤小於2T的時候我們應該用fdisk來分區,而當硬盤大於2T的時候則應用gdisk來進行分區;fdisk默認使用MBR分區表,gdisk默認使用GPT分區表。

//生產分區建議: 如無特殊需求, 直接使用整個磁盤即可, 無需分區
//學習分區建議: 1P+1E(3L) 2P+1E(2L) 3P+1E(1L) (僅適用於練習)      

fdisk	//磁盤分區工具,默認採用MBR分區表
-l	//列出系統中所有磁盤

[[email protected] ~]# fdisk -l			//查看系統中磁盤信息

[[email protected] ~]# fdisk  /dev/sdb		//對/dev/sdb進行分區
Command (m for help): m 			//獲取幫助
Command action
   a   toggle a bootable flag   		//切換分區啟動標記
   d   delete a partition     			//刪除分區
   l   list known partition types   		//顯示分區類型
   m   print this menu      			//顯示幫助菜單
   n   add a new partition  			//新建分區
   o   create a new empty DOS partition table   //創建新的空白分區表
   p   print the partition table       		//顯示分區表的信息
   q   quit without saving changes  		//不保存退出
   t   change a partition's system id   	//修改分區ID類型,可以通過l查看id
   w   write table to disk and exit     	//保存退出

//創建主分區
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-2097151, default 2048): 	//起始扇區位置,回車默認即可
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +50M //結束扇區位置,+50M表示此分區大小為50MB

//創建擴展分區
Command (m for help): n 			//新建分區
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e   			//創建擴展分區
Partition number (2-4, default 2):
First sector (104448-2097151, default 104448):
Using default value 104448
Last sector, +sectors or +size{K,M,G} (104448-2097151, default 2097151):  //回車默認劃分所有空間給擴展分區

//創建邏輯分區
Command (m for help): n 			//新建分區
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l   			//創建邏輯分區
Adding logical partition 5
First sector (106496-2097151, default 106496):
Using default value 106496
Last sector, +sectors or +size{K,M,G} (106496-2097151, default 2097151): +100M  //分配100MB空間

//查看分區創建
Command (m for help): p
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      104447       51200   83  Linux
/dev/sdb2          104448     2097151      996352    5  Extended
/dev/sdb5          106496      311295      102400   83  Linux

//保存分區
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

//安裝parted, 刷新內核立即生效分區配置,無需重啟
[[email protected] ~]# dnf -y install parted
[[email protected] ~]# partprobe /dev/sdb

//檢查磁盤是否是MBR分區方式
[[email protected] ~]# fdisk -l /dev/sdb | grep type
Disk label type: dos
gdisk	//磁盤分區工具,默認採用GPT分區表

[[email protected] ~]# gdisk /dev/sdb
Command (? for help): n     			//創建新分區
Partition number (1-128, default 1):
First sector (34-2097118, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-2097118, default = 2097118) or {+-}size{KMGTP}: +500M //分配500M大小

Command (? for help): p 			//查看分區情況
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1026047   500.0 MiB   8300  Linux filesystem

Command (? for help): w 			//保存分區
Do you want to proceed? (Y/N): y    		//確認
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

//檢查磁盤是否是gpt格式
[[email protected] /]# fdisk /dev/sdb -l | grep type
Disk label type: gpt

//安裝parted, 刷新內核立即生效分區配置,無需重啟
[[email protected] ~]# yum -y install parted
[[email protected] ~]# partprobe /dev/sdb

3.2 磁盤格式化

mkfs命令用來格式化磁盤或分區,創建文件系統;磁盤分區後必須格式化創建文件系統才能正常使用。

mkfs	//格式化磁盤或分區
-b	//設定數據區塊佔用空間大小,目前支持1024、2048、4096 bytes每個塊。
-t	//用來指定什麼類型的文件系統,可以是ext3,ext4, xfs
-i	//設定inode的大小
-N	//設定inode數量,防止Inode數量不夠導致磁盤不足
-L	//預設該分區的標籤label

//使用-t指定方式創建xfs文件系統
[[email protected] ~]# mkfs -t xfs  /dev/sdb1

//也可以使用另一種方式格式化sdb1分區為ext4文件系統
[[email protected] ~]# mkfs.ext4  /dev/sdb1

3.3 磁盤掛載

磁盤分區格式化之後, 在Linux中必須進行掛載才能進行使用;掛載分區前需要創建掛載點, 掛載點就是一個目錄,如果往掛載點目錄寫入數據, 實際上會寫入到掛載的分區當中;掛載點建議是空目錄, 如果不是也不影響掛載分區的使用,但是原有的文件會被隱藏。

掛載分為兩種臨時掛載和永久掛載;臨時掛載即重啟之後失效,永久掛載即開機自動掛載。

臨時掛載磁盤:

mount		//磁盤掛載命令,實質為文件系統指定訪問入口
-t		//指定掛載分區的文件系統類型,如ext3,ext4, xfs
-o		//指定掛載參數
-a		//重新讀取/etc/fstab配置文件的所有掛載

//掛載/dev/sdb1至db1目錄
[[email protected] ~]# mkdir /mnt/disk1
[[email protected] ~]# mount -t xfs /dev/sdb1  /mnt/disk1

//fstab被損壞情況下,讓只讀文件系統可寫(正常情況下不使用)
[[email protected] ~]# mount -o rw,remount /

永久掛載磁盤:

blkid		//獲取所有分區的UUID

//blkid命令獲取sdb1分區的UUID
[[email protected] ~]# blkid | grep "sdb1"
/dev/sdb1: UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" TYPE="xfs"

//使用UUID臨時掛載磁盤sdb1分區至於db1
[[email protected] ~]# mount UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" /mnt/disk1

//將掛載寫入到/etc/fstab中,實現永久掛載, 開機自動掛載
[[email protected] ~]# vim /etc/fstab    
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /mnt/disk1 xfs  defaults 0  0

//加載fstab配置文件, 同時檢測語法是否有錯誤
[[email protected] ~]# mount –a

fstab配置文件介紹:

[[email protected] ~]# vim /etc/fstab
分區標識(UUID或設備名)                      掛載點     文件類型  掛載參數    不檢查 不備份
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /mnt/disk1        xfs  defaults    0     0

//掛載參數, 可寫fstab配置文件, 也可以mount時使用-o參數指定
參數             參數意義                                  系統默認值
async            系統每隔一段時間把內存數據寫入磁盤中
sync             時時同步內存和磁盤中數據;
suid,nosuid     允許/不允許分區有suid屬性                  suid
rw,ro           可以指定文件系統是隻讀(ro)或可寫(rw)        rw
exec,noexec     允許/不允許可執行文件執行,不要掛載根分區    exec
user,nouser     允許/不允許root外的其他用户掛載分區         nouser
auto,noauto     開機自動掛載/不自動掛載                    auto
defaults         默認文件系統掛載設置			  rw, suid, dev, exec, auto, nouser, async

//加載fstab配置文件中所有配置
[[email protected] ~]# mount -a

卸載掛載磁盤:

umount		//取消掛載
-lf		//強制取消掛載

//使用站點目錄卸載
[[email protected] ~]# umount /mnt/disk1

//使用設備名卸載/dev/sdb1
[[email protected] ~]# umount /dev/sdb1

//umount不能卸載的情況
[[email protected] 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)
       
//如上情況解決辦法有兩種, 切換至其他目錄或使用'-l'選項強制卸載    
[[email protected] db1]# umount -lf /db1

4、SWAP交換分區

交換分區SWAP就是LINUX下的虛擬內存分區,它的作用是在物理內存使用完之後,將磁盤空間(也就是SWAP分區)虛擬成內存來使用。交換分區一般指定虛擬內存的大小為實際內存的1~1.5倍。如果實際內存超過8GB,可以直接劃分16GB給虛擬內存即可。

//為系統添加SWAP分區

//查看內存和SWAP交換分區的使用情況
[[email protected] ~]# free -mh
              total        used        free      shared  buff/cache   available
Mem:           1.8G        258M        103M         61M        1.4G        1.3G
Swap:             0           0           0 <--- 沒有交換分區

//使用磁盤創建一個分區作為SWAP交換分區,並且把分區類型更改為82
[[email protected] ~]# fdisk  /dev/sdb

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-2097151, default 2048): 	//起始扇區位置,回車默認即可
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +2G //結束扇區位置,+2G表示此分區大小為2G

Select (default p): t				//修改分區id
Partition number (default 1)			//選擇要成為SWAP的分區
Hex code (type L to list all codes):82  	//修改成id為82
Changed type of partition 'Linux LVM' to 'Linux swap / Solaris'.

Command (m for help): p

   設備 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     6293503     2097152   82  Linux swap / Solaris <---修改成功

Command (m for help): w

//強烈建議對分區做了修改後都刷新一下
[[email protected] ~]# partprobe  /dev/sdb

//把sdb1格式化為交換分區
[[email protected] ~]# mkswap  /dev/sdb1
正在設置交換空間版本 1,大小 = 2097148 KiB
無標籤,UUID=ba08eb90-2003-44e6-9769-9a9351aebb05

//啟動交換分區
[[email protected] ~]# swapon /dev/sdb1
或者
[[email protected] ~]# swanon -a  //啟動所有交換分區

//查看交換分區
[[email protected] ~]# free -mh
              total        used        free      shared  buff/cache   available
Mem:           1.8G        258M        103M         61M        1.4G        1.3G
Swap:            2G           0          2G

//永久掛載交換分區
[[email protected] ~]# blkid /dev/sdb1
/dev/sdb1: UUID="ba08eb90-2003-44e6-9769-9a9351aebb05" TYPE="swap" 

[[email protected] ~]# vim /etc/fstab 
UUID=ba08eb90-2003-44e6-9769-9a9351aebb05  swap	swap	defaults  0 0

5、生產磁盤故障案例

//Inode被佔滿,導致磁盤有可用的剩餘空間也無法繼續使用

[[email protected] ~]# dd if=/dev/zero of=/opt/newdisk bs=1k count=1024
[[email protected] ~]# mkfs.ext4 -i 1024 /opt/newdisk
[[email protected] ~]# mkdir /mnt/data
[[email protected] ~]# mount -t ext4 -o loop /opt/newdisk /mnt/data/

//inode被佔滿
[[email protected] ~]# cd /mnt/data/
[[email protected] data]# touch {1..20000}
touch: cannot touch `19997': No space left on device
touch: cannot touch `19998': No space left on device
touch: cannot touch `19999': No space left on device
touch: cannot touch `20000': No space left on device

//inode被佔滿,剩餘block也是無法繼續使用
[[email protected] ~]# df -h|grep data
/opt/newdisk    891K   34K  806K   5% /mnt/data/

[[email protected] ~]# df -i | grep data
/opt/newdisk      1024  1024       0  100% /mnt/data/

//假設現在線上正在運行Nginx服務, Nginx產生的日誌已經達到了20個G, 磁盤眼看就看沾滿了, 請問不重啟Nginx的方式如何處理

//刪除文件, 但雖然文件被刪除但是Nginx持續佔用着文件, 所以空間並不會被釋放
rm -f access.log

//正確做法如下, 使用重定向清空該文件即可釋放文件內容
> access.log