前言:我的上一篇博文詳細介紹了磁盤、格式以及分區知識,里面也涉及了LVM,本文主要實踐下LVM和非LVM環境中Linux分區如何擴容和縮小。
分區調整原理:
Linux磁盤分區和磁盤格式緊密相連,想要調整分區大小,也必須調整磁盤格式大小。格式是建立在分區之上的,分區為我們提供空間,而我們真正能直接使用的是格式系統,例如windows下使用的ntfs文件系統一樣。而在linux下使用的是ext系列格式或xfs格式的格式系統,所以格式系統只能比分區小,不能比分區大。這就意味着在擴容的時候需要先擴容分區,再對格式進行划分;在縮小的時候需要先縮小格式系統,再對分區進行縮小。這個時候問題來了,ext4格式系統是支持后期擴容和縮小的,但xfs格式系統只支持后期擴容並不支持后期縮小,除非備份整個分區數據后重新刪除分區再格式化分配,這對於跟分區來說就不太現實了。另外說明下無論是lvm還是非LVM,如果是mbr磁盤則用fdisk分區工具,如果是gpt則用parted工具,當然無論哪種可以用圖形化Gparted更好,parted分區方法我另一篇博客
https://www.cnblogs.com/cyrus0w/p/13195187.html 有寫,本文案例均是mbr環境中使用fdisk,其他過程思路是一樣的。
分區調整中LVM相比非LVM有哪些不同之處?
??????LVM中不是根分區都可以在線擴容和縮小,根分區是可以在線擴容,但不可以在線縮小;
非LVM無論哪個分區都不能在線擴容或縮小,均需要先卸載分區。
非LVM只能操作同一塊磁盤,LVM可以操作多塊磁盤
非LVM:
非LVM中無論什么格式系統擴容或縮小分區均是按這個步驟來:卸載分區--->擴容或縮小分區和格式系統--->重新掛載分區。且在擴容的時候,需要滿足此分區相連后面有多余未分配磁盤空間,如果相連磁盤前面有多余空間(比如前一個分區縮小后多出來的未分配空間),這樣是無法直接擴容的,只能備份數據刪除此分區后調整,如果是LVM的話,則無需刪除分區重新分配了;在縮小的時候,只能從此分區最后磁盤區往前縮小,不能從此分區磁盤開始位置縮小,可以參考下Linux圖形化磁盤管理工具gparted中的分區結構:
①在xfs格式中:
xfs只支持擴容,我做過實驗一般/home分區可以在root用戶登錄時卸載,需要用fuser -mvki /dev/sd4 或losf查看並kill掉關聯此分區的進程再卸載,卸載后再對此分區進行擴容,擴容完了重新掛載到home分區即可,而對於/ /var /tmp則無法卸載,我嘗試過卸載后會自動重啟,不過可以用U盤進入救援模式(rescue)下不掛載此分區(選擇skip)進行擴容操作,用fdisk先擴容分區,再用xfs_growfs /dev/sda4自動調整格式系統和分區大小適應。參考案例(此案例沒有介紹進入救援模式,我在下面ext4格式介紹中有進入救援模式的詳細過程):https://www.jianshu.com/p/7d23e6d1f313
②在ext4格式中:
ext4支持擴容和縮小,home分區擴容或縮小均可以在root用戶登錄做卸載后調整,其他分區必須進救援模式進行擴容或縮小。ext4的擴容和xfs類似,擴容后需要用resize2fs -f /dev/sd3 進行強制自動調整格式系統大小來適配分區大小。這里只對ext4縮小根分區進行下案例講解(其他分區類似,案例是mbr+ext4用的fdisk,如果是gpt+ext4可以用parted,思路是一樣的):
1.先在當前系統中df -h看下根分區已用空間,並結合其他分區調整情況預估下根分區能縮小到多大。如圖所示我這里根分區已用3.9G,總容量15G,能縮減的空間還是蠻大的。
2.因為要先卸載分區才能操作,系統運行中無法卸載根分區,所以必須進救援模式操作(還可以進便攜式U盤系統操作,推薦Gparted live U盤系統,圖形化界面,詳情見我的另一篇博客:https://www.cnblogs.com/cyrus0w/p/13199027.html )。插入制作好的U盤啟動盤,重啟bios設置u盤啟動,如圖選擇rescue...進入救援模式,接着屏幕彈出選項,選擇skip...(這一項代表不掛載本地磁盤各個分區),這樣就進入了救援模式shell中。這時候可以df -h看下主機自己的根分區和其他分區是沒有掛載的。
![]()
![]()
3.fdisk-l看下要划分的根分區/信息,如圖紅框所示:(屏幕翻頁按鍵為shift+pageup/pagedown)
可以看到我的根分區當前總大小(Blocks)為15728640K,磁盤起始位置(Start)和結束位置(End)分別為2099200和33556479。
4.先縮小格式系統大小:
#先檢查格式系統
e2fsck –f /dev/sda2
#開啟journal,在系統事故,或者掉電的情況下, journal 可以幫助文件系統找回丟失的文件。
tune2fs -o has_journal /dev/sda2
#縮小該格式系統到所需大小,上面Blocks為15728640K,我想要縮小空間到10G,且目前系統占用根目錄空間為3.9G,這里就多縮小點到9000000k,為了遵從格式系統大小必須小於分區大小原則,后面分區划分好后,可以再用e2fsck –f /dev/sda2自適應調整到分區大小
resize2fs -f /dev/sda2 9000000k
5.再縮小分區大小:這里其實有點復雜,需要計算分區結尾所在磁盤位置,可以百度“Fdisk計算分區大小”查看相關計算方法,我這里提供一個自己原創的土公式。縮減后的結束位置(End)=結束位置(End)-{(結束位置(End)-起始位置(Start))/總大小(Blocks)}乘1024乘1024乘需要減少的空間G。我想要縮減5個G,則得到的縮減后的結束位置(End)為23070719=33556479-{(33556479-2099200)/15728640}* 1024* 1024*5。好了,可以fdisk /dev/sda進去給根分區划分空間了。如圖操作:
6.最后讓格式系統自動適應當前分區:
resize2fs -f /dev/sda2
7.至此,根分區大小已縮小完成,這時候會在sda2分區的磁盤結尾位置出現多出的5G大小未分配空間,這5G空間在下一個分區sda3前面,如果想要把這部分區域擴容給sda3,只能tar等工具備份sda3后刪除sda3,再重新擴容划分,這里不做過多介紹了。后面重啟設備拔掉U盤進入主系統即可。
延伸:針對非根分區,如:/var /home /tmp分區后期其實還有個辦法可以進行擴容,加一塊硬盤划分區,將它們中的內容同步過去,再將新磁盤這個分區重新掛載成/var /home /tmp。此方法參考:https://www.cnblogs.com/saszhuqing/p/8716644.html
LVM:
LVM在擴容的時候無需卸載分區,步驟為:
LVM在縮小的時候需要卸載lv分區再調整,步驟為: