距離4月21日 Ubuntu 22.04 正式釋出越來越近,為了家裡的各種 Ubuntu 裝置能夠安心升級,我決定提前體驗接近完成的測試版。
本文提到的升級方式適用於 Desktop 桌面版和 Server 版。
升級前的準備
不論是 Desktop 桌面版,還是 Server 伺服器版本的 Ubuntu,在升級前,我們都需要做幾件事:
- 系統中的使用者資料備份。
- 將系統中的軟體包升級到最新,並根據實際需求情況,重啟系統,讓升級後的軟體包生效。
- 解鎖被
apt-mark
鎖定的軟體,允許軟體在系統發行版升級的過程中升級為和新系統相容的版本。 - 清理系統核心,留出足夠多的空間,安裝新的核心。
- 當然,因為現在新版系統還未正式釋出,所以我們還需要解鎖系統升級限制。
接下來,我們就來聊聊如何完成這些前置準備。
資料備份:打包和快速複製
資料備份的方式有很多種,不考慮商業軟體、安裝非系統自帶軟體的前提下,我推薦你使用 rsync
以及 tar
來完成快速的備份。
相比較使用各種壓縮引數,直接使用 tar cf
可以將目錄結構保持,並轉化為一個單一檔案,方便我們進行後續的檔案備份和轉移,而不必糾結目標分割槽的檔案格式、許可權歸屬等問題。而且,當我們的目錄中有比較多的小檔案的時候,這樣做,可以極大提升備份資料的速度。
比如下面的命令,我們就會把目錄中的檔案打包為一個字尾為 tar
的檔案,通常我們會叫這個過程為“打個tar包(tarball)”。
tar cf demo.soulteary.com.tar demo.soulteary.com
實際生產過程中,我們會有非常多類似下面的結構的目錄。
board.black.com
board.data.black.com
cache.black.com
carbon.black.com
certs.black.com
如果我們希望將上面的目錄分別打包為 tarball,一條一條命令執行顯然比較麻煩,有沒有偷懶的方式呢?顯然是有的。
find . -maxdepth 1 -type d -name '*.*' | xargs -I {} tar cf {}.tar {}
相比較使用 ls
,我們可能誤打包一些內容 ,直接使用 find
可以限制我們要打包內容的型別為目錄,目標名稱的命名方式要滿足 *.*
。
如果你的資料量非常少,當然也可以考慮放棄打包,直接進行資料拷貝操作。
相比較直接使用 scp
等命令,我更推薦使用 rsync
,將我們的檔案完整的從“出發地”快遞到“目的地”,rsync
除了支援不同分割槽目錄之間的資料備份外,也支援跨裝置的完整內容複製:
# 本地跨分割槽/目錄進行備份
rsync -rv --copy-links /data-need-backup /disk2/data-backup
# 將本地資料備份至其他裝置
rsync -rv --copy-links /data-need-backup soulteary@10.11.12.13:/data-backup
如果你使用 Docker,你可以選擇參考《提升 Docker Desktop For macOS 磁碟使用率》一文中提到的系統中的 Docker 映象批量儲存方案:
docker images | sed '1d' | grep -v '<none>' | awk '{print "docker save " $1 ":" $2 " -o " $3 ".tar"}' | bash
或者,你希望儲存的 Docker 映象檔名可讀性更高一些,可以選擇使用下面的指令碼:
#!/bin/bash
IMAGES_LIST=($(docker images | sed '1d' | awk '{print $1}'))
IMAGES_NM_LIST=($(docker images | sed '1d' | awk '{print $1"-"$2}'| awk -F/ '{print $NF}'))
IMAGES_NUM=${#IMAGES_LIST[*]}
for((i=0;i<$IMAGES_NUM;i++))
do
docker save "${IMAGES_LIST[$i]}" -o "${IMAGES_NM_LIST[$i]}".tar.gz
done
好啦,資料備份就聊到這裡。
升級系統中的軟體
為了升級到更新的系統版本,我們需要使用下面的命令,將系統中的軟體包升級到當前系統最新的版本:
apt update && apt upgrade -y
如果我們已經將軟體升級到新版,將會看到類似下面的日誌:
Hit:1 http://cache.black.com/cn.archive.ubuntu.com/ubuntu focal InRelease
Hit:2 http://cache.black.com/cn.archive.ubuntu.com/ubuntu focal-updates InRelease
Hit:3 http://cache.black.com/cn.archive.ubuntu.com/ubuntu focal-backports InRelease
Hit:4 http://cache.black.com/cn.archive.ubuntu.com/ubuntu focal-security InRelease
Hit:5 http://cache.black.com/mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu focal InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
eatmydata libeatmydata1 libfwupdplugin1 python3-importlib-metadata python3-jinja2
python3-json-pointer python3-jsonpatch python3-jsonschema python3-markupsafe
python3-more-itertools python3-pyrsistent python3-zipp
Use 'apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
如果你願意的話,你可以使用 apt autoremove
來解除安裝系統中不再使用的軟體。如果你現在懶得操作的話,問題也不大,因為在系統完成升級後,我們還需要清理一遍,所以可以稍後再做處理。
(系統升級過程中,也會詢問我們是否要清理,所以大可不必進行額外操作。)
解鎖被鎖定的軟體
有的時候,為了軟體長時間執行穩定,我們不得已會鎖定一些軟體包,比如 docker
等。但是在系統升級的過程中,一般建議將這些軟體包都“解鎖”,避免升級到新系統之後,發生不相容的問題。
apt-mark showhold
批量解鎖我們鎖定的軟體很簡單,只需要一條命令:
apt-mark showhold | xargs -I {} apt-mark unhold {}
命令執行完畢,你將能夠看到類似下面的日誌:
Canceled hold on docker-ce.
Canceled hold on software-name.
Canceled hold on software-name-2.
...
清理不再需要的核心
如果你有單獨劃分 /boot
分割槽的話,這裡推薦你在升級之前針對啟動分割槽進行清理,釋放一些空間,讓新核心能夠順利的進行安裝。下面的內容在 《AMD 4750u 及 5800u 筆記本安裝 Ubuntu 20.04》一文中曾提到過。
想要清理核心,我們首先要知道我們安裝過哪些核心:
dpkg --get-selections | grep linux-image
在命令執行完畢後,我們將能夠看到類似下面的結果:
linux-image-5.13.0-37-generic install
linux-image-5.13.0-39-generic install
linux-image-5.15.0-25-generic install
linux-image-generic install
linux-image-generic-hwe-22.04 install
linux-image-unsigned-5.11.10-051110-generic install
linux-image-5.13.0-35-generic deinstall
這裡我們可以將系統標記為 deinstall
和我們不再需要的老版本的核心一律刪除,只保留兩到三個我們認為會使用到核心即可。
apt-get purge linux-image-5.13.0-37 linux-image-5.13.0-35
當完成核心清理之後,記得使用 update-grub
重新生成 Grub 系統啟動核心列表:
update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-xxx-generic
Found initrd image: /boot/initrd.img-xxx-generic
...
done
解鎖系統升級限制
因為目前正式版的 Ubuntu 22.04 還未 Release,所以我們只能通過變更 /etc/update-manager/release-upgrades
升級版本鎖定,安裝還處於開發通道的 Ubuntu 22.04。
你可以使用下面的命令,一鍵完成 LTS 系統的“升級解鎖”。
sed -i -e "s/Prompt=lts/Prompt=normal/" /etc/update-manager/release-upgrades
當以上操作都完成之後,我們開始進行系統升級。
升級 Ubuntu 20.04
我這裡使用的是分步升級,先將系統升級到接近 Ubuntu 22.04 的 Ubuntu 21.10 ,再進行 Ubuntu 22.04 版本的升級。
將 Ubuntu 20.04 系統升級到 Ubuntu 21.10
相比較上面的一系列,看起來比較繁瑣的操作,升級系統的操作其實十分簡單。只需要執行 do-release-upgrade
,就可以開啟通往新版本的升級之路啦。
過程中,如果出現提示,可以一律使用下面的方式來解決:
- 在命令列中輸入
y
、yes
或者敲擊回車確認 - 在彈出的命令列 GUI 對話方塊中直接敲擊回車,保持預設選項
當一切就緒之後,命令列中會提示我們升級完畢,要不要重啟:
System upgrade is complete.
Restart required
To finish the upgrade, a restart is required.
If you select 'y' the system will be restarted.
Continue [yN] y
這個時候,繼續輸入 y
,讓系統進行重啟,第一階段的系統升級就完畢啦。
將 Ubuntu 21.10 升級為 Ubuntu 22.04
再次登陸系統後,會看到系統提示已經從 Ubuntu 20.04 變成了 Ubuntu 21.10:
Welcome to Ubuntu 21.10 (GNU/Linux 5.13.0-39-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
接下來我們來繼續聊聊,如何升級 Ubuntu 22.04。
這裡有一個小技巧,對於未完全開通 IPv6 的網路,強烈建議在升級之前,先禁用核心的 IPv6 功能,以防在升級過程中無法獲取 Ubuntu 22.04 版本的軟體包,導致升級過程死迴圈:
Failed to fetch
http://cn.archive.ubuntu.com/ubuntu/pool/universe/f/fuse/libfuse2_2.9.9-5ubuntu3_amd64.deb
Connection failed [IP: 91.189.91.38 80]
Restoring original system state
Aborting
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
=== Command detached from window (Sun Apr 10 05:41:24 2022) ===
=== Command terminated with exit status 1 (Sun Apr 10 05:41:34 2022) ===
如果你的網路不支援 IPv6 ,而你恰好進入了系統升級過程,也不必害怕,在升級沒有開始之前按下 x
,退出升級即可。
禁用 IPv6 功能,其實十分簡單,只需要修改 /etc/default/grub
檔案,在 GRUB_CMDLINE_LINUX_DEFAULT
中新增 ipv6.disable=1
即可。
舉個例子,系統中原始的檔案內容類似下面:
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity"
GRUB_CMDLINE_LINUX=""
我們只需要在原始配置中加入 ipv6.disable=1
即可:
GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity ipv6.disable=1"
在完成檔案內容修改之後,執行 update-grub && reboot
重新生成配置,並重啟系統讓配置生效。另外,因為海外伺服器不是特別穩定,如果不是在雲伺服器執行升級,可以考慮使用清華源替換預設的 cn.archive.ubuntu.com
等軟體源。
因為當前時間點 Ubuntu 22.04 還未正式釋出,所以我們需要在升級命令後新增 -d
來安裝還處於開發通道的系統。
do-release-upgrade -d
和上面升級系統一樣,一路選擇 y
和 ok
,不一會系統升級就完成啦,再次登入系統,可以看到我們已經處於 Ubuntu 22.04 環境下了:
Welcome to Ubuntu Jammy Jellyfish (development branch) (GNU/Linux 5.15.0-25-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
最後
在 Ubuntu 22.04 中,因為核心被預設升級到了 5.15,針對 AMD 處理器(包括 amdgpu
)的支援好了不少,推薦使用 AMD Ryzen R5/R7 的小夥伴進行升級體驗。
前一陣比較忙,2月份開始到現在又堆積了不少文章和草稿,希望在這個月,能夠把堆積的內容挨著釋出出來吧。
--EOF
本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 署名 4.0 國際 (CC BY 4.0)
本文作者: 蘇洋
建立時間: 2022年04月10日
統計字數: 2587字
閱讀時間: 6分鐘閱讀
本文連結: https://soulteary.com/2022/04...