CentOS 7 遷移 Debian 12 筆記
| | | 6 | |
七年前買的 N3150 迷你主機,除了速度慢了點,仍非常穩定可靠,擔任家用伺服器綽綽有餘,但跟手機平板一樣,常常硬體還沒壞,就先卡在軟體不支援。
主機上安裝的 CentOS 7 已 EOS,其實我在上面幾乎都是用 Docker 跑服務,照理跟作業系統依賴性不高,但最近接連遇到問題。因為 CentOS 7 停止支援沒法升級新版 docker, 不升級就沒法跑 ASP.NET Core 8+ Docker... 前幾天要裝 syslog-ng 遇到下載 Docker Image 404,原以為是連結有誤,同一行指令拿到 Ubuntu/Debian 跑一點問題都沒有,坐實了舊版 OS 百事哀...
所幸個人電腦不比手機,OS 可以一言不合就更換,而 Linux 也不像 Windows 11 限定只吃新版 CPU,古董主機照跑不誤。

手邊有顆閒置 240GB SATA SSD,決定不動原本的 M.2 64G SSD,在新的 SSD 上灌 Debian,萬一失敗頂多退回原本 CentOS 7 苟延殘喘一陣子另做打算。
這回我試了 Debian Live USB 碟安裝,用 USB 碟開機進入 Debian 桌面,操作體驗看看,確定硬體相容操作無礙,再點左下角的安裝程式開始安裝,整個安裝體驗又比當初玩 Debian 10 順暢不少。
七年老主機換上新版作業系統,像步履蹣跚老態龍鍾的老人,一開口竟是"Yo Man, What's up",有點違合,但不用擔心 OS 太舊跑不動就是讚!
原本沒多想,下載了最新穩定版 Debian 13,裝完才發現 Debian 13 Trixie 8/9 剛發佈,太熱騰騰了,一些軟體像 .NET 9 跟 PowerShell 7 還沒跟上來,只支援到 Debian 12。考慮了兩分鐘,毅然決定改裝 Debian 12 Bookworm,節省在全新版本拓荒的時間。
本次家用伺服器 OS 升級的重點是要將原本 CentOS 上的幾個 Docker 服務順利遷移到新裝 Debian 上執行。整理本次安裝設定的主要步驟如下:
- 使用 Live USB 碟安裝 Debian 12
- 用 GUI 介面設定無線網路,設成原本 CentOS 固定 IP,呼叫端可不用修改 URL
- 預設開機會進入 xfce 桌面,改為文字終端機模式
- 安裝 ssh 伺服器
- 安裝 Docker
- 安裝 dotnet 9
- 安裝 PowerShell 7.X
- 掛載 CentOS 的磁碟分割
- 複製 Docker 檔案、權限修改
3 - 7 是一般標準操作,只補充三點:
- 用 Live USB 碟安裝 Debian 預設並啟用桌面環境,我平日都用 ssh 登入操作,用
sudo systemctl set-default multi-user.target可改成開機後停在文字終端模式,迷你小主機只有 4G RAM,無謂浪費能省則省,但 SSD 有 240G 用不完,預先裝好 xfce GUI 環境備而不用也還好。 - 學到 Lag 兩年的知識:ocker-compose 已過時,建議改用 docker compose
- 身為 .NET 開發者,新裝好 Linux 後的 SOP 是安裝 PowerShell 及 dotnet,把 Linux 也變成我的場子,一言不合就 Coding。
以下記錄本次的安裝指令:
# Step 2 設定開機後不要啟動 xfce 桌面,改為文字終端機模式
sudo systemctl get-default # 預設為 graphical.target
sudo systemctl set-default multi-user.target
# Step 3 安裝 ssh 伺服器
sudo apt install openssh-server -y
sudo systemctl start ssh
sudo systemctl enable ssh
# Step 4 安裝 Docker
# https://docs.docker.com/engine/install/debian/
# 如果有舊版的話先移除
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# Install Docker packages
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 允許目前使用者不需 sudo 直接執行 docker
sudo usermod -aG docker $USER
# Step 5 安裝 dotnet 9
curl https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -o packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-9.0
# Step 6 安裝 PowerShell 7.X
sudo apt-get install -y powershell
第八步是掛載 CentOS 的磁碟分割,方便把 CentOS 上的檔案搬到 Debian,我是第一次在 Linux 掛其他作業系統的硬碟,又長了些見識。
用 lsblk -f 可看到 CentOS 的磁碟在 /dev/sdb,但 CentOS 有啟用 Logical Volume Manager, Version 2 (LVM2),真正放資料的分割被包在 /dev/sdb3 裡,因此我們需要先 sudo apt-get install lvm2 在 Debian 安裝 LVM2,執行 pvscan、vgchange -ay 啟甪 LVM2,之後 lvdisplay 會列出真正的分割分別為 /dev/centos/swap、/dev/centos/home 及 /dev/centos/root:

此時再執行 lsblk -f 可以看到 LVM2_member 的三個分割及其檔案系統型別,之後便可以 mount 到 /mnt/ 下,查看內容:

第九步是複製 Docker Image 檔案、docker-compose.yaml 到 Debain 下啟動 Docker 容器。過程還算順利沒啥狀況,唯一一個小問題是 Gitea 有成功啟動,但 git push 發佈時出現 Git, error: remote unpack failed: unable to create temporary object directory 錯誤,查了發現是 gitea 的 ./gitea-data/git/repositories 下的各 Repo 目錄的所有者及群組權限不對(變成 root:root),解決方式是執行 chown -R 1000:1000 ./gitea-data/git/repositories 將其重設 (我的 Gitea docker-compose.yaml 的 USER_UID/USER_GID 是設 1000,指向 Linux 安裝時第一個加入的使用者,此處比照),更新目錄所有權後,問題消失,Debain 12 也順利扛起 CentOS 7 的角色,短時間內不會再為「作業系統太舊沒法跑 XXX」困擾了。
Comments
# by Kevinst
在 Debian 13 需先安裝舊版的 libicu72 wget http://security.debian.org/debian-security/pool/updates/main/i/icu/libicu72_72.1-3+deb12u1_arm64.deb sudo dpkg -i libicu72_72.1-3+deb12u1_arm64.deb 這樣就可以在 debian 13 跑 net9 了
# by Jeffrey
to Kevinst, 感謝先鋒部隊分享情報~
# by yang
沒打算直接裝proxmox ve 嗎? 一勞永逸
# by Jackson12783
(1) 少拼了一個 "d" 學到 Lag 兩年的知識:ocker-compose 已過時,建議改用 docker compose (2) .NET Core 能開發什麼服務?
# by Jeffrey
to yang, 迷你主機資源超吃緊,CPU 是 N3150,RAM 只有 4GB,不太可能用 KVM 多跑 Windows,裝 Proxmox VE 只怕也幹不了大事...
# by Jeffrey
to Jackson12783, 1) 謝指正 2) .NET/C# 的功能很完整並持續在進化,加上生態圈也算豐富,所以可能要反過來問:有什麼服務不能用 .NET 開發? 當然,像是 AI (Python 之於深度學習) 或某些學術領域(Fortran 之於大氣科學)、特殊應用等普遍使用特定程式語言的情境,藉助其生態系統的資源會更省力。企業應用系統蠻多是用 .NET 寫的,若有就業考量,.NET 也是不錯的選擇。