← Back to list

Proxmox VE 離線更新環境建置測試(Offline Mirror + NFS)

實作 PVE Server 透過 Offline-Mirror 進行離線更新

JeffSie · 2026-02-04 07:00 · 0 claps · 20.5 min read
#pve #proxmox
Open on Medium ↗

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 設定

  1. 安裝 Offline Mirror 套件
apt update
apt install proxmox-offline-mirror
  1. 準備儲存空間 (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:~#
  1. 初始化 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'
  1. 建立 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:~#
  1. 設定 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
  1. 安裝 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) 設定

  1. 在離線的 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
  1. 設定 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:~#
  1. Disable 其他更新路徑

Repositories

Repositories

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

apt update -y

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