Linux—磁碟管理
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
- V8中的快慢屬性(圖文分解更易理解)
- EMAS Serverless到底有多便利?
- 時隔4個月我面試位元組又掛了|總結與展望
- EMAS Serverless系列~4步教你快速搭建小程式
- uni-app 從0 到 1 製作一個專案,收藏等於學會
- 聊聊客戶檔案模型的設計與管理
- Java NIO全面詳解(看這篇就夠了)
- 面試突擊74:properties和yml有什麼區別?
- 長篇圖解java反射機制及其應用場景
- 記一次 ClickHouse 效能測試
- Linux—磁碟管理
- luoguP3224 [HNOI2012]永無鄉【線段樹,並查集】
- 麻了,程式碼改成多執行緒,竟有9大問題
- 急如閃電快如風,彩虹女神躍長空,Go語言高效能Web框架Iris專案實戰-初始化專案ep00
- HC32L110 系列 M0 MCU 的介紹和Win10下DAP-Link, ST-Link, J-Link的燒錄
- 使用 Golang 程式碼生成圖表的開源庫對比
- MapReduce入門實戰
- selenium基本用法
- 紅黑樹以及JAVA實現(一)
- Docker常用命令