前言#
- 硬碟縮減操作不當將有可能造成資料毀損,建議開始前先進行備份。
- 以下指令可能會需要 Root 權限。
硬碟空間的縮減操作需要較為注意,操作不當可能會毀損原有資料,甚至造成系統不穩定,因此特別分出一篇來解說如何操作。
重點注意#
為了避免資料遺失,請注意以下操作重點:
- [建議] 先進行備份
建議先備份重要資料,這類硬碟空間的操作往往伴隨著不可逆的風險。 - 確保空間尚未掛載使用
必須確保要縮減的分區沒有正在被使用。 - 先縮減 File System 再縮減 LV
應該先讓 File System 適應縮減後的硬碟空間,再縮減 LV。若順序反了,則可能會刪除到原有的資料,造成難以修復的損壞。
(但請特別注意,XFS 格式是無法被縮小的,只能先刪除再重新建立較小的分區。)
p.s. 以下操作將以 vg0-lv3 分區掛載到家目錄 /home 為例
請自行更改分區及掛載點至您的所屬情境。
檢查 File System 類型#
如同先前所說,當 File System 是XFS
格式時,則無法直接對分區空間進行縮減。
Unix 系統通常為ext4
格式,則可以透過以下指令查看:
1df -Th | grep /home
應該可以看到如下資訊,這表示該分區為vg0
的lv--3
,File System 格式為ext4
:
1/dev/mapper/vg0-lv--3 ext4 1.2T 65G 1.1T 6% /home
或者透過以下指令查看其他分區資訊:
1blkid
卸載分區#
透過指令mount
可以獲取掛載點清單,並加上grep
過濾,否則可能資料會很多。
舉例要查詢的 LV 名稱為lv--3
:
1mount | grep lv--3
如果有看到類似如下訊息,則表示該分區正在被使用:
1/dev/mapper/vg0-lv--3 on /home type ext4 (rw,relatime)
這時請手動將其卸載:
1# lazy umount
2umount -l /dev/mapper/vg0-lv--3
3# 或者強制關閉
4fuser -vk /home
如果顯示「device is busy
」,則表示還有程序正在使用它,可以執行如下指令查看程序:
1lsof +D /home
2# 或者
3fuser -vm /home
接著手動終止那些正在運行的程序後,再嘗試卸載動作。
救援模式#
如果已經終止了所有跟該分區相關的程序,卻還是無法成功卸載分區,則可以試試轉為救援模式再卸載:
1systemctl rescue
2umount /dev/mapper/vg0-lv--3
3e2fsck -f /dev/mapper/vg0-lv--3
停用 LV#
檢查 LV 狀態:
1lvdisplay /dev/mapper/vg0-lv--3
LV Status 若顯示「available」則表示正在使用,透過以下指令停用該 LV:
1# 停用
2lvchange -an /dev/mapper/vg0-lv--3
3# 檢查
4e2fsck -f /dev/mapper/vg0-lv--3
如果有程序正在使用 LV 空間,則可以透過下方指令查看使用的程序:
1lsof | grep /dev/mapper/vg0-lv--3
2# 或
3fuser -vm /dev/mapper/vg0-lv--3
手動終止這些程序,或讓下方指令自動刪除:
1# 強制關閉
2fuser -vk /dev/mapper/vg0-lv--3
最後再檢查一次狀態:
1e2fsck -f /dev/mapper/vg0-lv--3
LV 為 SWAP?#
如果 LV 被作為 SWAP 使用,則需要先停用 SWAP,確認 SWAP 分區:
1cat /proc/swaps
關閉 SWAP 分區:
1swapoff /dev/mapper/vg0-lv--3
必要時停用自動掛載#
做完上述的步驟後,執行lvdisplay
指令查看 LV Status:
1lvdisplay /dev/vg0/lv-3
若 LV Status 仍然顯示「available
」,則請嘗試編輯/etc/fstab
設定,將該分區自動掛載的設定註解,並重新啟動電腦:
1vim /etc/fstab
成功卸載#
確認分區狀態:
1lvdisplay /dev/vg0/lv-3
如果 LV Status 顯示NOT available
,代表該分區已經成功停用。
縮減分區大小#
首先先檢查並修復分區:
1e2fsck -f /dev/vg0/lv-3
如果是XFS
格式則需使用xfs_repair
:
1xfs_repair /dev/vg0/lv-3
接著縮減 File System,假設縮小至 1200 GB:
該操作會花一些時間,建議 SSH 或其他容易斷線的情況可以用
tmux
掛住 session。
(如果不知道怎麼使用 tmux,可以看我之前的介紹文章「"Tmux" 指令,建立多個終端 Sessions,登出也能保留背景運作」)
1resize2fs /dev/vg0/lv-3 1200G
如果顯示如下訊息,則表示分區正在被使用,無法在線縮小,需要先卸載:
1resize2fs 1.46.5 (30-Dec-2021)
2Filesystem at /dev/vg0/lv-3 is mounted on /home; on-line resizing required
3resize2fs: On-line shrinking not supported
正常會顯示如下訊息:
1resize2fs 1.46.5 (30-Dec-2021)
2Resizing the filesystem on /dev/vg0/lv-3 to 314572800 (4k) blocks.
直到出現該訊息則表示成功縮減 File System:
1The filesystem on /dev/vg0/lv-3 is now 314572800 (4k) blocks long.
可以先掛載檢查是否成功縮減分區:
1mount /dev/vg0/lv-3 /home
查看分區大小:
1df -h /home
確認分區大小無誤後,再卸載:
1umount /home
再進行一次分區檢查,若沒顯示錯誤則代表成功:
1sudo e2fsck -f /dev/vg0/lv-3
最後才是縮減 LV,使用lvreduce
指令:
1lvreduce -L 1200G /dev/vg0/lv-3
正常會顯示如下訊息,輸入y
確認繼續:
1WARNING: Reducing active logical volume to 1.17 TiB.
2 THIS MAY DESTROY YOUR DATA (filesystem etc.)
3Do you really want to reduce vg0/lv-3? [y/n]: y
4 Size of logical volume vg0/lv-3 changed from 1.70 TiB (445645 extents) to 1.17 TiB (307200 extents).
5 Logical volume vg0/lv-3 successfully resized.
這樣就完成了,透過lvs
指令確認 LV 大小是否正確:
1lvs
掛載使用:
1mount /dev/vg0/lv-3 /home
p.s. 如果剛剛有修改/etc/fstab
的話,別忘記改回來。