大多數使用者發現使用標準流程升級從一個 Fedora 版本升級到下一個很簡單。但是,Fedora 升級也不可避免地會遇到許多特殊情況。本文介紹了使用 DNF 和邏輯卷管理(LVM)進行升級的一種方法,以便在出現問題時保留可引導備份。這個例子是將 Fedora 26 系統升級到 Fedora 28。
此處展示的過程比標準升級過程更複雜。在使用此過程之前,你應該充分掌握 LVM 的工作原理。如果沒有適當的技能和細心,你可能會丟失資料和/或被迫重新安裝系統!如果你不知道自己在做什麼,那麼強烈建議你堅持只使用得到支援的升級方法。
在開始之前,請確保你的現有系統已完全更新。
$ sudo dnf update$ sudo systemctl reboot # 或採用 GUI 方式
檢查你的根檔案系統是否是通過 LVM 掛載的。
$ df /Filesystem 1K-blocks Used Available Use% Mounted on/dev/mapper/vg_sdg-f26 20511312 14879816 4566536 77% /$ sudo lvsLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertf22 vg_sdg -wi-ao---- 15.00gf24_64 vg_sdg -wi-ao---- 20.00gf26 vg_sdg -wi-ao---- 20.00ghome vg_sdg -wi-ao---- 100.00gmockcache vg_sdg -wi-ao---- 10.00gswap vg_sdg -wi-ao---- 4.00gtest vg_sdg -wi-a----- 1.00gvg_vm vg_sdg -wi-ao---- 20.00g
如果你在安裝 Fedora 時使用了預設值,你可能會發現根檔案系統掛載在名為 root
的邏輯卷(LV)上。捲組(VG)的名稱可能會有所不同。看看根捲的總大小。在該範例中,根檔案系統名為 f26
,大小為 20G
。
接下來,確保 LVM 中有足夠的可用空間。
$ sudo vgsVG #PV #LV #SN Attr VSize VFreevg_sdg 1 8 0 wz--n- 232.39g 42.39g
該系統有足夠的可用空間,可以為升級後的 Fedora 28 的根捲分配 20G 的邏輯卷。如果你使用的是預設安裝,則你的 LVM 中將沒有可用空間。對 LVM 的一般性管理超出了本文的範圍,但這裡有一些情形下可能採取的方法:
1、/home
在自己的邏輯卷,而且 /home
中有大量空閒空間。
你可以從圖形介面中登出並切換到文字控制台,以 root
使用者身份登入。然後你可以解除安裝 /home
,並使用 lvreduce -r
調整大小並重新分配 /home
邏輯卷。你也可以從現場映象啟動(以便不使用 /home
)並使用 gparted GUI 實用程式進行分割區調整。
2、大多數 LVM 空間被分配給根捲,該檔案系統中有大量可用空間。
你可以從現場映象啟動並使用 gparted GUI 實用程式來減少根捲的大小。此時也可以考慮將 /home
移動到另外的檔案系統,但這超出了本文的範圍。
3、大多數檔案系統已滿,但你有個已經不再需要邏輯卷。
你可以刪除不需要的邏輯卷,釋放捲組中的空間以進行此操作。
首先,為升級後的系統分配新的邏輯卷。確保為系統的捲組(VG)使用正確的名稱。在這個例子中它是 vg_sdg
。
$ sudo lvcreate -L20G -n f28 vg_sdgLogical volume "f28" created.
接下來,建立當前根檔案系統的快照。此範例建立名為 f26_s
的快照卷。
$ sync$ sudo lvcreate -s -L1G -n f26_s vg_sdg/f26Using default stripesize 64.00 KiB.Logical volume "f26_s" created.
現在可以將快照複製到新邏輯卷。當你替換自己的捲名時,請確保目標正確。如果不小心,就會不可復原地刪除了資料。此外,請確保你從根捲的快照複製,而不是從你的現在的根捲。
$ sudo dd if=/dev/vg_sdg/f26_s of=/dev/vg_sdg/f28 bs=256k81920+0 records in81920+0 records out21474836480 bytes (21 GB, 20 GiB) copied, 149.179 s, 144 MB/s
給新檔案系統一個唯一的 UUID。這不是絕對必要的,但 UUID 應該是唯一的,因此這避免了未來的混淆。以下是在 ext4 根檔案系統上的方法:
$ sudo e2fsck -f /dev/vg_sdg/f28$ sudo tune2fs -U random /dev/vg_sdg/f28
然後刪除不再需要的快照卷:
$ sudo lvremove vg_sdg/f26_sDo you really want to remove active logical volume vg_sdg/f26_s? [y/n]: yLogical volume "f26_s" successfully removed
如果你單獨掛載了 /home
,你可能希望在此處製作 /home
的快照。有時,升級的應用程式會進行與舊版 Fedora 版本不相容的更改。如果需要,編輯舊根檔案系統上的 /etc/fstab
檔案以在 /home
上掛載快照。請記住,當快照已滿時,它將消失!另外,你可能還希望給 /home
做個正常備份。
首先,安裝新的邏輯卷並備份現有的 GRUB 設定:
$ sudo mkdir /mnt/f28$ sudo mount /dev/vg_sdg/f28 /mnt/f28$ sudo mkdir /mnt/f28/f26$ cd /boot/grub2$ sudo cp -p grub.cfg grub.cfg.old
編輯 grub.conf
並在第一個選單項 menuentry
之前新增這些,除非你已經有了:
menuentry 'Old boot menu' { configfile /grub2/grub.cfg.old}
編輯 grub.conf
並更改預設選單項以啟用並掛載新的根檔案系統。改變這一行:
linux16 /vmlinuz-4.16.11-100.fc26.x86_64 root=/dev/mapper/vg_sdg-f26 ro rd.lvm.lv=vg_sdg/f26 rd.lvm.lv=vg_sdg/swap rhgb quiet LANG=en_US.UTF-8
如你看到的這樣。請記住使用你系統上的正確的捲組和邏輯卷條目名稱!
linux16 /vmlinuz-4.16.11-100.fc26.x86_64 root=/dev/mapper/vg_sdg-f28 ro rd.lvm.lv=vg_sdg/f28 rd.lvm.lv=vg_sdg/swap rhgb quiet LANG=en_US.UTF-8
編輯 /mnt/f28/etc/default/grub
並改變在啟動時啟用的預設的根捲:
GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_sdg/f28 rd.lvm.lv=vg_sdg/swap rhgb quiet"
編輯 /mnt/f28/etc/fstab
,將掛載的根檔案系統從舊的邏輯卷:
/dev/mapper/vg_sdg-f26 / ext4 defaults 1 1
改為新的:
/dev/mapper/vg_sdg-f28 / ext4 defaults 1 1
然後,出於參考的用途,唯讀掛載舊的根捲:
/dev/mapper/vg_sdg-f26 /f26 ext4 ro,nodev,noexec 0 0
如果你的根檔案系統是通過 UUID 掛載的,你需要改變這個方式。如果你的根檔案系統是 ext4 你可以這樣做:
$ sudo e2label /dev/vg_sdg/f28 F28
現在編輯 /mnt/f28/etc/fstab
使用該卷標。改變該根檔案系統的掛載行,像這樣:
LABEL=F28 / ext4 defaults 1 1
重新啟動,你的系統將使用新的根檔案系統。它仍然是 Fedora 26,但是是帶有新的邏輯卷名稱的副本,並可以進行 dnf
系統升級!如果出現任何問題,請使用舊引導選單引導回到你的工作系統,此過程可避免觸及舊系統。
$ sudo systemctl reboot # or GUI equivalent...$ df / /f26Filesystem 1K-blocks Used Available Use% Mounted on/dev/mapper/vg_sdg-f28 20511312 14903196 4543156 77% //dev/mapper/vg_sdg-f26 20511312 14866412 4579940 77% /f26
你可能希望驗證使用舊的引導選單確實可以讓你回到掛載在舊的根檔案系統上的根。
現在按照此維基頁面中的說明進行操作。如果系統升級出現任何問題,你還會有一個可以重新啟動回去的工作系統。
建立新的邏輯卷並將根捲的快照複製到其中的步驟可以使用通用指令碼自動完成。它只需要新的邏輯卷的名稱,因為現有根的大小和裝置很容易確定。例如,可以輸入以下命令:
$ sudo copyfs / f28
提供掛載點以進行複製可以更清楚地了解發生了什麼,並且複製其他掛載點(例如 /home
)可能很有用。