基礎設施

拔碟搬家實戰

PVE 實體硬碟直通、分區整理、跨平台格式決策,與 Docker 專案遷移要點 — 把 Hachimi Music Studio 從 Windows 測試機搬進 Linux VM 的完整實錄。

使用的技術

Proxmox VEqm 磁碟直通sfdiskNTFSfstabDocker Composepg_dump

一、加硬碟的經歷

專案原本跑在 Windows 測試機(同機模式)。要搬到 Linux 虛擬機(Proxmox VE 上的 Ubuntu), 第一步是把一顆 240GB 實體硬碟掛進 VM 當資料碟。整個過程分兩端:

PVE 宿主機端:實體硬碟直通

PVE 網頁介面的「增加硬碟」只能建立虛擬磁碟(存放在 local-lvm 儲存池),選不到實體硬碟。實體碟要透過 CLI 直通給 VM:

# PVE 宿主機上:把 /dev/sda 直通給 VM 100
qm set 100 --scsi1 /dev/sda

# 驗證已寫入設定
qm config 100 | grep scsi1
# → scsi1: /dev/sda,size=234431064K

直通後 VM 內看到的就是整顆實體硬碟(/dev/sdb),碟上原有的檔案系統與資料原樣保留 — 這正是「拔硬碟搬資料」方案的基礎。

VM 內部:分區整理與持久掛載

這顆碟的「前世」是某 Windows 時代的隨身工具碟:一個 100MB 的 2016 年網頁小遊戲啟動器殘骸分區 + 一個無標籤大分區。 VM 的桌面環境(udisks2)把它自動掛在 /media/<user>/<UUID>。整理步驟:

# 1. 備份唯一有價值的檔案後,合併兩個分區為單一 223.6G
wipefs -a /dev/sdb                    # 清除舊分割表
sfdisk /dev/sdb <<EOF                 # 建立單一大分區
label: dos
type=7
EOF
mkfs.ntfs --fast --label Data240G /dev/sdb1   # 格式化 + 命名

# 2. 寫進 /etc/fstab,開機自動掛載(不需要登入桌面)
# UUID=xxxx /mnt/data ntfs3 defaults,nofail,x-systemd.device-timeout=5s,uid=1000,gid=1000 0 0
mount /mnt/data
💡 三個關鍵決策
  • 格式選 NTFS:Linux 可讀寫(核心 ntfs3 驅動)、Windows 原生支援、macOS 可讀 — 碟隨時能拔去任何機器,不被單一平台鎖死
  • fstab 掛 /mnt/data 而非依賴 /media 自動掛載:/media 靠桌面 session(沒登入就不掛);fstab 開機必掛、路徑固定,SSH/系統服務隨時可用
  • nofail + 5 秒超時:碟哪天被拔走,開機也只等 5 秒就跳過,不會卡緊急模式

二、項目轉移要點

硬碟就位後,把整個專案資料夾複製到 /mnt/data/,在 Linux 端重新起 Docker 栈。 以下是這次遷移驗證過的要點清單:

1
資料先行:先 pg_dump 再搬家
用戶、積分、任務類型、歷史紀錄全在 PostgreSQL 裡。docker exec scheduler_postgres pg_dump -U scheduler scheduler_db > backup.sql 導出,到新機起棧後 psql 導回。output/ 資料夾(用戶文件)也要一起帶走。
2
環境變量要改三個
docker-compose.yml 中:EXECUTOR_URL 與 PANDOCR_BASE_URL 改指向 GPU 機 IP;HOST_OUTPUT_DIR 改成新路徑(路徑翻譯用)。資料庫 task_types 表的 project_path/python_path 指向 GPU 機執行路徑,不要動。
3
雙機分工:兩份資料夾、不同角色
常開機跑 Docker 栈(app + postgres,大腦);GPU 機留 executor + conda/pandocr 環境(工人,npm run executor)。兩邊各一份專案資料夾,各取所需。
4
Docker Compose 是 V2 語法
Linux 新機上沒有舊版 docker-compose 指令,要用 docker compose(空格,plugin 版)。功能完全一樣,舊教學裡的連字號寫法會報 not found。
5
檔案系統選跨平台格式
資料碟用 NTFS:這次從 Windows 測試機直接拔碟到 Linux VM 兩邊都能讀寫。若資料只在 Linux 間搬,ext4 效能與權限語意更好;要跨 Windows/macOS 就選 NTFS/exFAT。
6
原機資料留 1–2 週當免費備份
新機驗證穩定前,不要急著刪原機的數據庫與 output。確認無誤後再清理,並在新機加定時 pg_dump 備份。

起棧與驗證

# 新機上起棧(V2 語法)
docker compose up -d --build

# 驗證
docker compose ps          # postgres / app 都要 healthy/running
docker compose logs -f app # init-db 跑完後 app 自動啟動

三、現狀

遷移後的服務已在 Linux VM 上穩定運行:排程器(用戶端 / 管理端)、 PostgreSQL 資料庫、pgAdmin 管理介面。資料碟 Data240G 掛在 /mnt/data, 開機自動掛載、不依賴桌面登入,碟上自帶一份說明檔記錄完整的磁碟履歷 — 插到任何電腦都能讀懂這顆碟的來龍去脈。

📦 相關文章
這顆碟上跑的項目本身(任務排程器架構、七種任務類型、GPU 離線容忍設計)介紹在:《Hachimi Music Studio — 分佈式音樂任務排程平台》