Proxmox VE 離線更新環境建置測試(Offline Mirror + NFS)
實作 PVE Server 透過 Offline-Mirror 進行離線更新
Proxmox VE 離線更新環境建置測試(Offline Mirror + NFS)
實作 PVE Server 透過 Offline-Mirror 進行離線更新

環境架構
- Mirror Server ( Internet ): 負責下載與同步 Proxmox 及 Debian 套件。
- Storage: 獨立 400G 硬碟,使用 LVM 管理。
- Transfer Protocol: NFS
- Client PVE Node ( No Internet ): 透過掛載 NFS 讀取更新檔。
Mirror Server 設定
- 安裝 Offline Mirror 套件
apt update
apt install proxmox-offline-mirror
- 準備儲存空間 (LVM)
# 建立實體卷與群組
pvcreate /dev/sdb
vgcreate vg_mirror /dev/sdb
# 建立邏輯卷 (使用 100% 空間)
lvcreate -n lv_pom -l 100%FREE vg_mirror
# 格式化為 ext4
mkfs.ext4 /dev/vg_mirror/lv_pom
# 建立掛載點並掛載
mkdir -p /srv/pom-mirror
mount /dev/vg_mirror/lv_pom /srv/pom-mirror
# 設定開機自動掛載 (/etc/fstab)
echo '/dev/vg_mirror/lv_pom /srv/pom-mirror ext4 defaults 0 2' >> /etc/fstab
---
root@lab:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 300G 0 disk
├─sda1 8:1 0 1007K 0 part
├─sda2 8:2 0 1G 0 part /efi
└─sda3 8:3 0 299G 0 part
├─pve-swap 252:0 0 4G 0 lvm [SWAP]
├─pve-root 252:1 0 85.7G 0 lvm /
├─pve-data_tmeta 252:2 0 1.9G 0 lvm
│ └─pve-data 252:4 0 189.4G 0 lvm
└─pve-data_tdata 252:3 0 189.4G 0 lvm
└─pve-data 252:4 0 189.4G 0 lvm
sdb 8:16 0 400G 0 disk
sr0 11:0 1 1.5G 0 rom
root@lab:~#
root@lab:~# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
root@lab:~# vgcreate vg_mirror /dev/sdb
Volume group "vg_mirror" successfully created
root@lab:~# lvcreate -n lv_pom -l 100%FREE vg_mirror
Logical volume "lv_pom" created.
root@lab:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 300G 0 disk
├─sda1 8:1 0 1007K 0 part
├─sda2 8:2 0 1G 0 part
└─sda3 8:3 0 299G 0 part
├─pve-swap 252:0 0 4G 0 lvm [SWAP]
├─pve-root 252:1 0 85.7G 0 lvm /
├─pve-data_tmeta 252:2 0 1.9G 0 lvm
│ └─pve-data 252:4 0 189.4G 0 lvm
└─pve-data_tdata 252:3 0 189.4G 0 lvm
└─pve-data 252:4 0 189.4G 0 lvm
sdb 8:16 0 400G 0 disk
└─vg_mirror-lv_pom 252:5 0 400G 0 lvm
sr0 11:0 1 1.5G 0 rom
root@lab:~#
root@lab:~# lvdisplay /dev/vg_mirror/lv_pom
--- Logical volume ---
LV Path /dev/vg_mirror/lv_pom
LV Name lv_pom
VG Name vg_mirror
LV UUID XLc1zP-Ycig-h4t2-Hi1k-fnMb-ahWT-BbwidX
LV Write Access read/write
LV Creation host, time lab, 2026-02-03 15:13:44 +0800
LV Status available
# open 0
LV Size <400.00 GiB
Current LE 102399
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:5
root@lab:~# mkfs.ext4 /dev/vg_mirror/lv_pom
mke2fs 1.47.2 (1-Jan-2025)
Discarding device blocks: done
Creating filesystem with 104856576 4k blocks and 26214400 inodes
Filesystem UUID: c70815b0-6ba5-4f27-bd0f-cbde359787c8
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
root@lab:~# mount /dev/vg_mirror/lv_pom /srv/pom-mirror/
root@lab:~# df -h /srv/pom-mirror/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_mirror-lv_pom 393G 2.1M 373G 1% /srv/pom-mirror
root@lab:~#
root@lab:~# echo '/dev/vg_mirror/lv_pom /srv/pom-mirror ext4 defaults 0 2' >> /etc/fstab
root@lab:~# mount -a
root@lab:~#
- 初始化 Mirror 設定
- Base Dir:
/srv/pom-mirror/mirrors/
root@lab-jeff-mirror:~# proxmox-offline-mirror setup
Initializing new config.
Select Action:
0) Add new mirror entry
1) Add new subscription key
2) Quit
Choice ([0]): 0
Guided Setup ([yes]):
Select distro to mirror
0) Proxmox VE
1) Proxmox Backup Server
2) Proxmox Mail Gateway
3) Proxmox Ceph
4) Debian
Choice: 0
Select release
0) Trixie
1) Bookworm
2) Bullseye
Choice ([0]): 0
Select repository variant
0) Enterprise repository
1) No-Subscription repository
2) Test repository
Choice ([0]): 1
Should missing Debian mirrors for the selected product be auto-added ([yes]):
Configure filters for Debian mirror trixie / main:
Enter list of package sections to be skipped ('-' for None) ([debug,games]): -
Enter list of package names/name globs to be skipped ('-' for None):'-'-
Enter mirror ID ([pve_trixie_no-subscription]):
Enter (absolute) base path where mirrored repositories will be stored ([/var/lib/proxmox-offline-mirror/mirrors/]):
Should already mirrored files be re-verified when updating the mirror? (io-intensive!) ([yes]):
Should newly written files be written using FSYNC to ensure crash-consistency? (io-intensive!) ([yes]):
Config entry 'debian_trixie_main' added
Run "proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'debian_trixie_main'" to create a new mirror snapshot.
Config entry 'debian_trixie_updates' added
Run "proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'debian_trixie_updates'" to create a new mirror snapshot.
Config entry 'debian_trixie_security' added
Run "proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'debian_trixie_security'" to create a new mirror snapshot.
Config entry 'pve_trixie_no-subscription' added
Run "proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'pve_trixie_no-subscription'" to create a new mirror snapshot.
Existing config entries:
mirror 'debian_trixie_security'
mirror 'pve_trixie_no-subscription'
mirror 'debian_trixie_main'
mirror 'debian_trixie_updates'
- 建立 snapshot (實際下載套件)
proxmox-offline-mirror mirror snapshot create-all
root@lab:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 392M 1.5M 391M 1% /run
/dev/mapper/pve-root 84G 3.4G 77G 5% /
tmpfs 2.0G 46M 1.9G 3% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
tmpfs 2.0G 0 2.0G 0% /tmp
/dev/fuse 128M 16K 128M 1% /etc/pve
tmpfs 1.0M 0 1.0M 0% /run/credentials/getty@tty1.service
/dev/mapper/vg_mirror-lv_pom 393G 105G 268G 29% /srv/pom-mirror
tmpfs 392M 4.0K 392M 1% /run/user/0
root@lab:~#
- 設定 Medium 路徑、同步 Mirror 至 Medium
mkdir -p /srv/pom-mirror/medium-trixie
proxmox-offline-mirror setup
# 選擇 "Add new medium entry"
# Medium ID: trixie-nfs
# Path: /srv/pom-mirror/medium-trixie
# 選擇包含所有 Mirrors
proxmox-offline-mirror medium sync trixie-nfs
- 安裝 NFS Server
root@lab:/# apt install -y nfs-kernel-server
root@lab:~# vim /etc/exports
# 新增以下
/srv/pom-mirror/medium-trixie 192.168.30.0/24(ro,async,no_subtree_check,no_root_squash)
root@lab:~# exportfs -ra
root@lab:~# systemctl restart nfs-server.service
root@lab:~# exportfs -v
/srv/pom-mirror/medium-trixie
192.168.30.0/24(async,wdelay,hide,no_subtree_check,sec=sys,ro,secure,no_root_squash,no_all_squash)
root@lab:~#
Client 端 (PVE Node) 設定
- 在離線的 PVE 主機上,建立掛載點並連接 Mirror Server
mkdir -p /mnt/offline-mirror
# 編輯 /etc/fstab 實現持久化掛載 (建議加入 _netdev 參數防止開機卡住)
echo '192.168.30.34:/srv/pom-mirror/medium-trixie /mnt/offline-mirror nfs ro,_netdev 0 0' >> /etc/fstab
mount -a
- 設定 APT 來源
使用 proxmox-offline-mirror-helper 互動式工具來生成 sources.list
proxmox-offline-mirror-helper setup
# 1. Path to medium: /mnt/offline-mirror
# 2. Add mirror & snapshot: 依序加入所有需要的 Repo 與最新的 Snapshot 時間點
# 3. Generate 'sources.list.d' snippet
root@jeff3:~# proxmox-offline-mirror-helper setup
Path to medium mountpoint: /mnt/offline-mirror
Loading state from "/mnt/offline-mirror/.mirror-state"..
Last sync timestamp: 2026-02-04T03:03:46Z
No repositories selected so far.
Select action
0) Add mirror & snapshot to selected repositories.
1) Remove mirror & snapshot from selected repositories.
2) Generate 'sources.list.d' snippet for accessing selected repositories.
3) Update offline subscription key
4) Quit.
Choice ([0]): 0
Select mirror
0) debian_trixie_updates
1) pve_trixie_no-subscription
2) debian_trixie_main
3) debian_trixie_security
Choice: 0
Select snapshot
0) 2026-02-03T20:22:24Z
Choice ([0]):
Selected repositories:
- debian_trixie_updates/2026-02-03T20:22:24Z
Select action
0) Add mirror & snapshot to selected repositories.
1) Remove mirror & snapshot from selected repositories.
2) Generate 'sources.list.d' snippet for accessing selected repositories.
3) Update offline subscription key
4) Quit.
Choice ([0]): 0
Select mirror
0) pve_trixie_no-subscription
1) debian_trixie_main
2) debian_trixie_security
Choice: 1
Select snapshot
0) 2026-02-03T15:21:51Z
Choice ([0]):
Selected repositories:
- debian_trixie_updates/2026-02-03T20:22:24Z
- debian_trixie_main/2026-02-03T15:21:51Z
Select action
0) Add mirror & snapshot to selected repositories.
1) Remove mirror & snapshot from selected repositories.
2) Generate 'sources.list.d' snippet for accessing selected repositories.
3) Update offline subscription key
4) Quit.
Choice ([0]): 0
Select mirror
0) pve_trixie_no-subscription
1) debian_trixie_security
Choice: 1
Select snapshot
0) 2026-02-03T08:09:50Z
1) 2026-02-03T20:22:28Z
Choice ([1]):
Selected repositories:
- debian_trixie_updates/2026-02-03T20:22:24Z
- debian_trixie_security/2026-02-03T20:22:28Z
- debian_trixie_main/2026-02-03T15:21:51Z
Select action
0) Add mirror & snapshot to selected repositories.
1) Remove mirror & snapshot from selected repositories.
2) Generate 'sources.list.d' snippet for accessing selected repositories.
3) Update offline subscription key
4) Quit.
Choice ([0]): 0
Select mirror
0) pve_trixie_no-subscription
Choice: 0
Select snapshot
0) 2026-02-03T20:11:55Z
Choice ([0]):
Selected repositories:
- debian_trixie_security/2026-02-03T20:22:28Z
- debian_trixie_main/2026-02-03T15:21:51Z
- debian_trixie_updates/2026-02-03T20:22:24Z
- pve_trixie_no-subscription/2026-02-03T20:11:55Z
Select action
0) Add mirror & snapshot to selected repositories.
1) Remove mirror & snapshot from selected repositories.
2) Generate 'sources.list.d' snippet for accessing selected repositories.
3) Update offline subscription key
4) Quit.
Choice ([0]): 2
Generated sources.list.d snippet:
-----8<-----
deb [ check-valid-until=false ] file:///mnt/offline-mirror/debian_trixie_security/2026-02-03T20:22:28Z trixie-security main contrib
deb [ check-valid-until=false ] file:///mnt/offline-mirror/debian_trixie_main/2026-02-03T15:21:51Z trixie main contrib
deb [ check-valid-until=false ] file:///mnt/offline-mirror/debian_trixie_updates/2026-02-03T20:22:24Z trixie-updates main contrib
deb [ check-valid-until=false ] file:///mnt/offline-mirror/pve_trixie_no-subscription/2026-02-03T20:11:55Z trixie pve-no-subscription
----->8-----
Configure snippet as repository source ([yes]):
Enter filename under '/etc/apt/sources.list.d/' (will be overwritten) ([offline-mirror.list]):
Now run 'apt update && apt full-upgrade' to upgrade system.
Selected repositories:
- debian_trixie_security/2026-02-03T20:22:28Z
- debian_trixie_main/2026-02-03T15:21:51Z
- debian_trixie_updates/2026-02-03T20:22:24Z
- pve_trixie_no-subscription/2026-02-03T20:11:55Z
Select action
0) Add mirror & snapshot to selected repositories.
1) Remove mirror & snapshot from selected repositories.
2) Generate 'sources.list.d' snippet for accessing selected repositories.
3) Update offline subscription key
4) Quit.
Choice ([0]): 4
root@jeff3:~#
- Disable 其他更新路徑

Repositories
- 斷外網並測試是否可正常更新,成功!

apt update -y
메타데이터
- post_id
- b165673da2d4
- slug
- proxmox-ve-離線更新環境建置測試-offline-mirror-nfs-b165673da2d4
- url
- https://medium.com/@jeffsie180/proxmox-ve-%E9%9B%A2%E7%B7%9A%E6%9B%B4%E6%96%B0%E7%92%B0%E5%A2%83%E5%BB%BA%E7%BD%AE%E6%B8%AC%E8%A9%A6-offline-mirror-nfs-b165673da2d4
- canonical_url
- https://medium.com/@jeffsie180/proxmox-ve-%E9%9B%A2%E7%B7%9A%E6%9B%B4%E6%96%B0%E7%92%B0%E5%A2%83%E5%BB%BA%E7%BD%AE%E6%B8%AC%E8%A9%A6-offline-mirror-nfs-b165673da2d4
- author_url
- https://medium.com/@jeffsie180
- status
- ok
- fetched_at
- 2026-06-26 21:52:29