有時候會需要讓 VM 開機時處在某個指定的日期時間,例如測試軟體授權到期的行為、重現某個只在跨年或月底才發生的問題,或是讓舊系統在特定日期下執行。Proxmox VE 有現成的設定可以指定 VM 的 RTC(Real Time Clock)開始時間。
但實際設定之後,常會發現 VM 開起來的時間根本沒有變。這篇整理正確的設定方式,以及時間沒有生效時要檢查的地方。
設定 RTC 開始時間
網頁介面
「VM → 選項 → RTC 開始日期」,填入要的時間,格式是:
2020-12-31T23:59:59
也可以只填日期(2020-12-31),或填 now 恢復預設(以目前時間開機)。
指令列
官方的做法是用 startdate 選項:
qm set 194 --startdate 2020-12-31T23:59:59
# 恢復成目前時間
qm set 194 --startdate now
網路上常看到的另一種寫法是直接在 VM 設定檔加 QEMU 參數:
args: -rtc base=2024-12-31T23:59:50
效果類似,但 args 會繞過 PVE 的設定管理,也不會顯示在網頁介面上,能用 startdate 就不要用 args。
另一個相關選項:localtime
| 選項 | 說明 | 預設 |
|---|---|---|
startdate | RTC 的開始日期時間 | now |
localtime | RTC 使用當地時間而不是 UTC | 作業系統類型為 Windows 時自動開啟 |
Windows 習慣 RTC 存當地時間,Linux 習慣存 UTC,所以 VM 的「作業系統類型」要設對,否則時間會差 8 小時。
設定了卻沒有生效
這是最常遇到的狀況:改了 RTC 開始日期,VM 開起來還是原本的時間。依序檢查以下幾點。
要完整關機再開機
RTC 開始時間是啟動 QEMU 程序時帶入的參數。在 VM 裡面按「重新開機」,或在網頁上按「重新開機」,QEMU 程序都還是同一個,RTC 會接著原本的時間繼續走。
正確的做法是先關機(或停止),再啟動:
qm shutdown 194
qm start 194
改完設定後,網頁介面上該選項會以橘色顯示「待套用」,要完整關機再開機才會生效。
另外,如果 VM 是從休眠(hibernate)或暫停狀態恢復,記憶體內容整個被還原,時間也會接續休眠前的狀態,同樣不會讀取新的 RTC。
確認參數有帶進去
qm showcmd 194 --pretty | grep -i rtc
看得到 -rtc base=2020-12-31T23:59:59 之類的參數,代表 PVE 這邊設定正確。
客體作業系統自己把時間校正回來
這是最常見的原因。RTC 只是開機時的「起點」,作業系統開機後只要能連網,就會自動校時,把時間拉回正確的日期:
| 作業系統 | 校時來源 |
|---|---|
| Linux | systemd-timesyncd、chronyd、ntpd |
| Windows | Windows Time 服務(w32time),加入網域時會跟網域控制站同步 |
要讓 VM 停在指定的日期,就要關掉客體裡的校時,必要時斷開網路。
Linux:
timedatectl set-ntp false
timedatectl status
Windows(以系統管理員身分執行):
net stop w32time
sc config w32time start= disabled
注意:網域成員的 Windows 只停用 Windows Time 服務還不一定夠,群組原則可能會再把它啟用;測試用的 VM 建議先退出網域,或放在隔離的網路裡。
Linux 的 kvm-clock
Linux 客體在 KVM 上預設使用 kvm-clock 作為時鐘來源,開機時的系統時間可能直接取自虛擬化平台提供的時鐘,而不是 RTC。可以分別看 RTC 和系統時間來判斷:
# RTC 的時間
hwclock -r
# 系統時間
date
# 目前使用的時鐘來源
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
如果 hwclock -r 顯示的是你設定的時間,date 卻是目前時間,代表 RTC 有設定成功,只是系統時間沒有採用它。可以在開機後手動以 RTC 設定系統時間:
hwclock --hctosys
要每次開機都自動套用,可以做成開機時執行的 systemd 服務。
驗證流程整理
- 設定
startdate,作業系統類型設對 - 完整關機再開機,不是重新開機
qm showcmd確認有-rtc base=...- VM 裡用
hwclock -r(Linux)確認 RTC 是指定的時間 - 關閉客體的校時服務,必要時斷網
- 測試完記得把
startdate改回now,並恢復校時
使用時的注意事項
- 時間錯誤會影響很多東西:TLS 憑證驗證會失敗、Kerberos/AD 登入會失敗、記錄的時間戳記全部錯亂、排程任務可能被觸發。請只在隔離的測試環境使用
- 不要對正式 VM 設定:正式環境的 VM 應該維持
now並開啟校時 - 快照與備份:在錯誤時間下建立的檔案、資料,還原到正式環境時要特別注意時間戳記
- 軟體授權:用來測試授權到期行為沒問題,但請遵守軟體的授權條款
結論
PVE 設定 RTC 開始時間只要一個選項,真正會卡住的是兩件事:改完要完整關機再開機,以及客體作業系統的自動校時會把時間拉回來。照上面的驗證流程一步一步確認,就能讓 VM 停在你要的日期。
參考資料
- Proxmox VE 文件:qm(1)(startdate、localtime)
https://pve.proxmox.com/pve-docs/qm.1.html - Proxmox VE 文件:Qemu/KVM Virtual Machines
https://pve.proxmox.com/pve-docs/chapter-qm.html - QEMU 文件:Invocation(-rtc)
https://www.qemu.org/docs/master/system/invocation.html - Linux kernel 文件:KVM pvclock
https://docs.kernel.org/virt/kvm/x86/msr.html



