安裝 Ubuntu 和 CentOS 雙系統

場景描述

  • 一直用的是 Ubuntu 18.04,現在想裝 CentOS 8 作爲雙系統;
  • 之前不瞭解 LVM 也不熟悉分區,Ubuntu 基本上是按照安裝引導程序的默認設置安裝的,一個分區獨佔了整塊硬盤(460 G 左右);
  • 一開始以爲非常簡單,拿着 CentOS 的 live USB 打算直接安裝,但安裝引導程序提示沒有足夠的空間了;
  • 大家都推薦用 GParted 來縮小分區,但是試了一下,沒成功。

摘要

經過前後兩三天的倒騰,終於成功裝好。各個步驟如下:

  1. 重新劃分硬盤分區。爲此,需要依次縮小現有的文件系統(file system)、邏輯卷(logical volume)、物理卷(physical volume)和分區(partition),實際只用了3步,因爲文件系統和邏輯卷是同時縮小的;
  2. 新建分區,在新分區上安裝 CentOS。此時開機會自動 boot 到 CentOS,Ubuntu 回不去了;
  3. 使用 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

中間具體的數值我忘記了,用 xxxxyyyyzzzzjjjj 替代。

總之,問題在於剛纔縮小 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 菜單上選擇引導系統了,大功告成!

使用 grub 菜單選擇引導系統

附:本節參考資料

Ubuntu Grub Recover after installing centos or windows
掛載硬盤,提示 mount: unknown filesystem type 'LVM2_member’的解決方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章