跳到主要內容
節省工具箱Jason Tools
經驗分享

PVE 指定 VM 的 RTC 開始時間

Jason Cheng 發布 瀏覽 1 次
PVE 指定 VM 的 RTC 開始時間
本文目錄
  1. 設定 RTC 開始時間
  2. 設定了卻沒有生效
  3. 驗證流程整理
  4. 使用時的注意事項
  5. 結論
  6. 參考資料

有時候會需要讓 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

選項說明預設
startdateRTC 的開始日期時間now
localtimeRTC 使用當地時間而不是 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 只是開機時的「起點」,作業系統開機後只要能連網,就會自動校時,把時間拉回正確的日期:

作業系統校時來源
Linuxsystemd-timesyncd、chronyd、ntpd
WindowsWindows 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 服務。

驗證流程整理

  1. 設定 startdate,作業系統類型設對
  2. 完整關機再開機,不是重新開機
  3. qm showcmd 確認有 -rtc base=...
  4. VM 裡用 hwclock -r(Linux)確認 RTC 是指定的時間
  5. 關閉客體的校時服務,必要時斷網
  6. 測試完記得把 startdate 改回 now,並恢復校時

使用時的注意事項

  • 時間錯誤會影響很多東西:TLS 憑證驗證會失敗、Kerberos/AD 登入會失敗、記錄的時間戳記全部錯亂、排程任務可能被觸發。請只在隔離的測試環境使用
  • 不要對正式 VM 設定:正式環境的 VM 應該維持 now 並開啟校時
  • 快照與備份:在錯誤時間下建立的檔案、資料,還原到正式環境時要特別注意時間戳記
  • 軟體授權:用來測試授權到期行為沒問題,但請遵守軟體的授權條款

結論

PVE 設定 RTC 開始時間只要一個選項,真正會卡住的是兩件事:改完要完整關機再開機,以及客體作業系統的自動校時會把時間拉回來。照上面的驗證流程一步一步確認,就能讓 VM 停在你要的日期。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀