如何使用LVM升級Fedora
大多數(shù)用戶發(fā)現(xiàn)使用標(biāo)準(zhǔn)流程升級從一個(gè) Fedora 版本升級到下一個(gè)很簡單。但是,F(xiàn)edora 升級也不可避免地會(huì)遇到許多特殊情況。本文介紹了使用 DNF 和邏輯卷管理(LVM)進(jìn)行升級的一種方法,以便在出現(xiàn)問題時(shí)保留可引導(dǎo)備份。這個(gè)例子是將 Fedora 26 系統(tǒng)升級到 Fedora 28。
此處展示的過程比標(biāo)準(zhǔn)升級過程更復(fù)雜。在使用此過程之前,你應(yīng)該充分掌握 LVM 的工作原理。如果沒有適當(dāng)?shù)募寄芎图?xì)心,你可能會(huì)丟失數(shù)據(jù)和/或被迫重新安裝系統(tǒng)!如果你不知道自己在做什么,那么強(qiáng)烈建議你堅(jiān)持只使用得到支持的升級方法。
準(zhǔn)備系統(tǒng)
在開始之前,請確保你的現(xiàn)有系統(tǒng)已完全更新。
$ sudo dnf update
$ sudo systemctl reboot # 或采用 GUI 方式
檢查你的根文件系統(tǒng)是否是通過 LVM 掛載的。
$ df /
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg_sdg-f26 20511312 14879816 4566536 77% /
$ sudo lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
f22 vg_sdg -wi-ao---- 15.00g
f24_64 vg_sdg -wi-ao---- 20.00g
f26 vg_sdg -wi-ao---- 20.00g
home vg_sdg -wi-ao---- 100.00g
mockcache vg_sdg -wi-ao---- 10.00g
swap vg_sdg -wi-ao---- 4.00g
test vg_sdg -wi-a----- 1.00g
vg_vm vg_sdg -wi-ao---- 20.00g
如果你在安裝 Fedora 時(shí)使用了默認(rèn)值,你可能會(huì)發(fā)現(xiàn)根文件系統(tǒng)掛載在名為 root
的邏輯卷(LV)上。卷組(VG)的名稱可能會(huì)有所不同。看看根卷的總大小。在該示例中,根文件系統(tǒng)名為 f26
,大小為 20G
。
接下來,確保 LVM 中有足夠的可用空間。
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
vg_sdg 1 8 0 wz--n- 232.39g 42.39g
該系統(tǒng)有足夠的可用空間,可以為升級后的 Fedora 28 的根卷分配 20G 的邏輯卷。如果你使用的是默認(rèn)安裝,則你的 LVM 中將沒有可用空間。對 LVM 的一般性管理超出了本文的范圍,但這里有一些情形下可能采取的方法:
1、/home
在自己的邏輯卷,而且 /home
中有大量空閑空間。
你可以從圖形界面中注銷并切換到文本控制臺,以 root
用戶身份登錄。然后你可以卸載 /home
,并使用 lvreduce -r
調(diào)整大小并重新分配 /home
邏輯卷。你也可以從現(xiàn)場鏡像啟動(dòng)(以便不使用 /home
)并使用 gparted GUI 實(shí)用程序進(jìn)行分區(qū)調(diào)整。
2、大多數(shù) LVM 空間被分配給根卷,該文件系統(tǒng)中有大量可用空間。
你可以從現(xiàn)場鏡像啟動(dòng)并使用 gparted GUI 實(shí)用程序來減少根卷的大小。此時(shí)也可以考慮將 /home
移動(dòng)到另外的文件系統(tǒng),但這超出了本文的范圍。
3、大多數(shù)文件系統(tǒng)已滿,但你有個(gè)已經(jīng)不再需要邏輯卷。
你可以刪除不需要的邏輯卷,釋放卷組中的空間以進(jìn)行此操作。
創(chuàng)建備份
首先,為升級后的系統(tǒng)分配新的邏輯卷。確保為系統(tǒng)的卷組(VG)使用正確的名稱。在這個(gè)例子中它是 vg_sdg
。
$ sudo lvcreate -L20G -n f28 vg_sdg
Logical volume "f28" created.
接下來,創(chuàng)建當(dāng)前根文件系統(tǒng)的快照。此示例創(chuàng)建名為 f26_s
的快照卷。
$ sync
$ sudo lvcreate -s -L1G -n f26_s vg_sdg/f26
Using default stripesize 64.00 KiB.
Logical volume "f26_s" created.
現(xiàn)在可以將快照復(fù)制到新邏輯卷。當(dāng)你替換自己的卷名時(shí),請確保目標(biāo)正確。如果不小心,就會(huì)不可撤銷地刪除了數(shù)據(jù)。此外,請確保你從根卷的快照復(fù)制,而不是從你的現(xiàn)在的根卷。
$ sudo dd if=/dev/vg_sdg/f26_s of=/dev/vg_sdg/f28 bs=256k
81920+0 records in
81920+0 records out
21474836480 bytes (21 GB, 20 GiB) copied, 149.179 s, 144 MB/s
給新文件系統(tǒng)一個(gè)唯一的 UUID。這不是絕對必要的,但 UUID 應(yīng)該是唯一的,因此這避免了未來的混淆。以下是在 ext4 根文件系統(tǒng)上的方法:
$ sudo e2fsck -f /dev/vg_sdg/f28
$ sudo tune2fs -U random /dev/vg_sdg/f28
然后刪除不再需要的快照卷:
$ sudo lvremove vg_sdg/f26_s
Do you really want to remove active logical volume vg_sdg/f26_s? [y/n]: y
Logical volume "f26_s" successfully removed
如果你單獨(dú)掛載了 /home
,你可能希望在此處制作 /home
的快照。有時(shí),升級的應(yīng)用程序會(huì)進(jìn)行與舊版 Fedora 版本不兼容的更改。如果需要,編輯舊根文件系統(tǒng)上的 /etc/fstab
文件以在 /home
上掛載快照。請記住,當(dāng)快照已滿時(shí),它將消失!另外,你可能還希望給 /home
做個(gè)正常備份。
配置以使用新的根
首先,安裝新的邏輯卷并備份現(xiàn)有的 GRUB 設(shè)置:
$ 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
并在第一個(gè)菜單項(xiàng) menuentry
之前添加這些,除非你已經(jīng)有了:
menuentry 'Old boot menu' {
configfile /grub2/grub.cfg.old
}
編輯 grub.conf
并更改默認(rèn)菜單項(xiàng)以激活并掛載新的根文件系統(tǒng)。改變這一行:
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
如你看到的這樣。請記住使用你系統(tǒng)上的正確的卷組和邏輯卷?xiàng)l目名稱!
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
并改變在啟動(dòng)時(shí)激活的默認(rèn)的根卷:
GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_sdg/f28 rd.lvm.lv=vg_sdg/swap rhgb quiet"
編輯 /mnt/f28/etc/fstab
,將掛載的根文件系統(tǒng)從舊的邏輯卷:
/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
如果你的根文件系統(tǒng)是通過 UUID 掛載的,你需要改變這個(gè)方式。如果你的根文件系統(tǒng)是 ext4 你可以這樣做:
$ sudo e2label /dev/vg_sdg/f28 F28
現(xiàn)在編輯 /mnt/f28/etc/fstab
使用該卷標(biāo)。改變該根文件系統(tǒng)的掛載行,像這樣:
LABEL=F28 / ext4 defaults 1 1
重啟與升級
重新啟動(dòng),你的系統(tǒng)將使用新的根文件系統(tǒng)。它仍然是 Fedora 26,但是是帶有新的邏輯卷名稱的副本,并可以進(jìn)行 dnf
系統(tǒng)升級!如果出現(xiàn)任何問題,請使用舊引導(dǎo)菜單引導(dǎo)回到你的工作系統(tǒng),此過程可避免觸及舊系統(tǒng)。
$ sudo systemctl reboot # or GUI equivalent
...
$ df / /f26
Filesystem 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
你可能希望驗(yàn)證使用舊的引導(dǎo)菜單確實(shí)可以讓你回到掛載在舊的根文件系統(tǒng)上的根。
現(xiàn)在按照此維基頁面中的說明進(jìn)行操作。如果系統(tǒng)升級出現(xiàn)任何問題,你還會(huì)有一個(gè)可以重啟回去的工作系統(tǒng)。
進(jìn)一步的考慮
創(chuàng)建新的邏輯卷并將根卷的快照復(fù)制到其中的步驟可以使用通用腳本自動(dòng)完成。它只需要新的邏輯卷的名稱,因?yàn)楝F(xiàn)有根的大小和設(shè)備很容易確定。例如,可以輸入以下命令:
$ sudo copyfs / f28
提供掛載點(diǎn)以進(jìn)行復(fù)制可以更清楚地了解發(fā)生了什么,并且復(fù)制其他掛載點(diǎn)(例如 /home
)可能很有用。