目錄
場景描述
- 一直用的是 Ubuntu 18.04,現在想裝 CentOS 8 作爲雙系統;
- 之前不瞭解 LVM 也不熟悉分區,Ubuntu 基本上是按照安裝引導程序的默認設置安裝的,一個分區獨佔了整塊硬盤(460 G 左右);
- 一開始以爲非常簡單,拿着 CentOS 的 live USB 打算直接安裝,但安裝引導程序提示沒有足夠的空間了;
- 大家都推薦用 GParted 來縮小分區,但是試了一下,沒成功。
摘要
經過前後兩三天的倒騰,終於成功裝好。各個步驟如下:
- 重新劃分硬盤分區。爲此,需要依次縮小現有的文件系統(file system)、邏輯卷(logical volume)、物理卷(physical volume)和分區(partition),實際只用了3步,因爲文件系統和邏輯卷是同時縮小的;
- 新建分區,在新分區上安裝 CentOS。此時開機會自動 boot 到 CentOS,Ubuntu 回不去了;
- 使用 live USB 爲 Ubuntu 重新安裝 grub 並修改參數,最終實現可以通過開機 grub 菜單選擇進入 Ubuntu 或者 CentOS 系統。
說明
- 我只有一塊硬盤
/dev/sda
,如果你的情況不同請自行替換
步驟1:縮小文件系統和邏輯卷(FS 和 LV)
使用 lsblk
命令可以清楚地看到硬盤的分區情況,並且也看到我的 Ubuntu 是建立在邏輯捲上的(TYPE
列爲 lvm
):
doudou@doudou-Aspire-E1-471G:~$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
(...)
sda 8:0 0 465.8G 0 disk
└─sda1 8:1 0 465.8G 0 part
├─ubuntu--vg-root 253:2 0 464.8G 0 lvm /
└─ubuntu--vg-swap_1 253:3 0 976M 0 lvm
使用 df
命令查看 Ubuntu 系統所佔空間大小和剩餘空間:
doudou@doudou-Aspire-E1-471G:~$ df -h
Filesystem Size Used Avail Use% Mounted on
(...)
/dev/mapper/ubuntu--vg-root 465G 9.8G 455G 3% /
可以看到 ubuntu--vg-root
邏輯卷實際只佔了 9.8 G 空間。下面縮小 ubuntu--vg-root
邏輯卷,爲安裝 CentOS騰出空間。
使用 lvreduce
命令縮小邏輯卷 ubuntu--vg-root
的大小,其中 --resizefs
標識是說,在縮小邏輯卷的同時也縮小文件系統,--size -350G
表示縮小 350 G。
doudou@doudou-Aspire-E1-471G:~$ sudo lvreduce --resizefs --size -350G /dev/ubuntu-vg/root
Do you want to unmount "/" ? [Y|n] n
fsadm: Cannot proceed with mounted filesystem "/".
/sbin/fsadm failed: 1
Filesystem resize failed.
shell 提示在文件系統掛載的情況下,是無法改變文件系統大小的(邏輯卷大小是可以改的),不過在系統運行時顯然是不能卸載 /
的(雖然我還沒試過在上面選 y
…)。
因此,這一步需要使用 live USB 進行,找一個 Ubuntu 的鏡像寫入 USB(如果是 mac,推薦 balenaEtcher 這個工具),然後使用 USB 引導系統,選擇 “Try Ubuntu”,然後打開命令行,重複上面的命令:
ubuntu@ubuntu:~$ sudo lvreduce --resizefs --size -350G /dev/ubuntu-vg/root
這一次應該就能順利完成了,檢查一下:
ubuntu@ubuntu:~$ sudo lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos-vg -wi-a----- 114.80g
swap centos-vg -wi-a----- 976.00m
附:本節參考資料
如果不太瞭解 LVM,推薦下面這兩篇文章,能夠快速理解 LVM 的概念:
這一步驟的相關命令來自 How do I shrink the root logical volume (LV) on LVM?
步驟2:縮小物理卷(PV)
上一步只是縮小了邏輯卷的大小,如果使用 vgs
命令展示邏輯卷組信息,會發現邏輯卷組的大小還是沒變:
ubuntu@ubuntu:~$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
ubuntu-vg 1 2 0 wz--n- <465.80g 350.24g
使用 pvs
展示物理卷信息:
ubuntu@ubuntu:~$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sda1 ubuntu-vg lvm2 a-- <465.80g 350.24g
這個時候如果直接縮小分區,還是會造成數據損失(事實上我就是在這一步直接縮小分區了,後來連 CentOS 都裝好了,但命令行只要涉及分區或者 LVM 的操作都在提示 Warning
信息,促使我發現了這個問題,縮小了物理卷之後就好了,並且我很僥倖地居然沒有造成數據損失)。
下面使用 pvresize
來縮小物理卷, --setphysicalvolumesize 128G
將物理卷大小設置爲 128 G:
ubuntu@ubuntu:~$ sudo pvresize --setphysicalvolumesize 128G /dev/sda1
但是這裏會遇到 /dev/sda1: cannot resize to xxxxx extents as later ones are allocated.
錯誤。通過 pvs
的 --segments
標識可以直觀地看到原因:
ubuntu@ubuntu:~$ sudo pvs -v --segments /dev/sda1
PV VG Fmt Attr PSize PFree Start SSize LV Start Type PE Ranges
/dev/sda1 ubuntu-vg lvm2 a-- <465.80g 350.24g 0 xxxx root 0 linear /dev/sda1:0-(xxxx-1)
/dev/sda1 ubuntu-vg lvm2 a-- <465.80g 350.24g xxxx yyyy 0 free
/dev/sda1 ubuntu-vg lvm2 a-- <465.80g 350.24g zzzz 244 swap_1 0 linear /dev/sda1:zzzz-jjjj
中間具體的數值我忘記了,用 xxxx
、yyyy
、zzzz
和 jjjj
替代。
總之,問題在於剛纔縮小 root
邏輯卷所空餘出來的空間在 swap_1
邏輯卷所佔空間之前,而縮小物理卷只能從後縮小,會發現後面的空間其實是被 swap_1
佔着呢,所以報錯了。
可以用 pvmove
命令來移動 PE,解決這個問題,其中的 /dev/sda1:zzzz-jjjj
對應的就是 swap_1
的區間:
sudo pvmove --alloc anywhere /dev/sda1:zzzz-jjjj
根據我找到的參考資料,這樣做應該能夠解決問題,但在我的情況下還是報錯。在嘗試了很久未果之後,無奈我只好索性刪除並重新創建了 swap_1
邏輯卷,反正交換空間裏也沒有數據。重新創建的 swap_1
邏輯卷(名字不能變,/etc/fstab
靠這個名字掛載)就自動接在 root
邏輯卷之後了。
(後來我第二次遇到了同樣的問題,使用上面的 pvmove
命令就成功解決了。)
這個問題解決之後,重新運行上面的 sudo pvresize --setphysicalvolumesize 128G /dev/sda1
命令,即可縮小物理卷。
現在使用 vgs
命令可以看到:
ubuntu@ubuntu:~$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
ubuntu-vg 1 2 0 wz--n- <128.00g 65.24g
附:本節參考資料
How to reduce Volume Group size in LVM?
步驟3:縮小分區(Partition)
這一步就比較簡單了,使用 Ubuntu live USB 裏自帶的 GParted 工具可以很直觀地改變分區大小。
在我的例子裏,上面已經提到,我在分區前忘了縮小物理卷,所以這一步使用 GParted 分區會報錯,而且我當時沒有找到問題。於是我使用 fdisk
命令強行進行了縮小分區,成功是成功了,但也導致了後面裝好 CentOS 之後的 Warning
提示。好在最後問題還是得到了解決。
步驟3:安裝 CentOS
這一步也沒什麼好說的,不過感覺 CentOS 的安裝引導程序比較難用。
還有,CentOS竟然要求 /boot
不能使用 LVM 分區,於是還得單獨爲 /boot
劃分一個分區。最後的分區變成了這樣:
ubuntu@ubuntu:~$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
(...)
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 128G 0 part
│ ├─ubuntu--vg-root 253:2 0 114.8G 0 lvm /
│ └─ubuntu--vg-swap_1 253:3 0 976M 0 lvm
├─sda2 8:2 0 300M 0 part
└─sda3 8:3 0 115.8G 0 part
├─centos--vg-root 253:0 0 114.8G 0 lvm
└─centos--vg-swap 253:1 0 976M 0 lvm
步驟4:安裝 grub 並設置啓動菜單
CentOS 是裝好了,但現在開機就自動引導到了 CentOS,Ubuntu 連影都見不着了。
下面還是需要藉助 Ubuntu 的 live USB,首先掛載 Ubuntu 的文件系統:
ubuntu@ubuntu:~$ sudo mount /dev/mapper/ubuntu--vg-root /mnt/
上面這個命令將 Ubuntu 的文件系統掛載到了 /mnt
,也就是說,現在的 /mnt/
目錄下就是之前在 Ubuntu 系統上的 /
下的內容了。
安裝 grub:
ubuntu@ubuntu:~$ sudo grub-install –-root-directory=/mnt/ /dev/sda
現在重啓計算機,從硬盤引導。但在我的例子中,開機時還是沒有出現 grub 菜單,直接跳到了 CentOS…
彆着急,下面還是藉助 Ubuntu 的 live USB,按照上面的方法掛載 Ubuntu 的文件系統到 /mnt
下,然後修改 /etc/default/grub
文件:
ubuntu@ubuntu:~$ sudo vi /mnt/etc/default/grub
將下面兩項:
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
修改爲:
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=10
再次重啓計算機,可以在 grub 菜單上選擇引導系統了,大功告成!
附:本節參考資料
Ubuntu Grub Recover after installing centos or windows
掛載硬盤,提示 mount: unknown filesystem type 'LVM2_member’的解決方案