All posts

Install Proxmox VE 9 on bare metal

ISO 9.2-1, ext4 on one disk, then pve-manager 9.2.24. The enterprise repositories return 401 until the no-subscription source is enabled.

Written by NodeRings Inc.

NodeRings Inc. writes these notes. The company runs the marketplace and the agent that stays on the provider’s side of the hypervisor.

The amd64 image is proxmox-ve_9.2-1.iso. SHA256 4e88fe416df9b527624a175f24c9aa07c714d3332afb1ee3dbf3879573ef2c6c. The graphical installer defaults to ext4 on LVM. One disk stays on that default. Two disks are the case for a ZFS mirror.

This install used a 40 GiB disk, the hostname pve.example-hosting.com, and one IPv4 address. The first boot was pve-manager 9.2.2 on kernel 7.0.2-6-pve. apt-get update then exited 100, with 401 Unauthorized from both enterprise repositories. Enabled: no on those two files, plus a pve-no-subscription source for trixie, let apt-get dist-upgrade install pve-manager 9.2.24 and kernel 7.0.14-26-pve. The reboot is what made that kernel the running one. The UI is https://<address>:8006, user root, realm Linux PAM. The certificate warning and the "No valid subscription" dialog both show up on a node that has no subscription key.

WhatThis install
ISOproxmox-ve_9.2-1.iso, 1,706,178,560 bytes
pveversion on the ISOproxmox-ve: 9.2.0, manager 9.2.2, kernel 7.0.2-6-pve
Filesystemext4, LVM, one disk
After dist-upgrade and a rebootmanager 9.2.24, kernel 7.0.14-26-pve
UIhttps://<address>:8006, root, Linux PAM
First VMUbuntu 26.04.1, 2 cores, 2 GiB, virtio, status: running

The screenshots are a nested QEMU guest: 4 vCPU, 8 GiB RAM, one 40 GiB disk. 10.0.2.15/24 is QEMU user-mode networking, gateway 10.0.2.2, DNS 10.0.2.3. On the machine in the rack, those three fields are the management NIC.

Six steps from the Proxmox VE 9.2-1 ISO through a graphical ext4 install, port 8006, a 401 from the enterprise repositories, the no-subscription source, and a virtual machine whose status is running.
One disk stays on ext4. The 401 is the enterprise repositories answering without a subscription key.

Check the Proxmox VE 9.2 ISO

The download page publishes the SHA256. The file used here came from https://enterprise.proxmox.com/iso/proxmox-ve_9.2-1.iso. A request to download.proxmox.com presented a certificate whose names are enterprise.proxmox.com and the CDN hosts, so the hostname check failed. The bytes from the enterprise host matched the published hash. Compare the file you downloaded with that hash, and keep the TLS check on.

The trixie release key is https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg. Fingerprint 24B30F06ECC1836A4E5EFECBA7BCD1420BFE778E.

wget https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg
wget https://enterprise.proxmox.com/iso/proxmox-ve_9.2-1.iso.asc
wget https://enterprise.proxmox.com/iso/proxmox-ve_9.2-1.iso
sha256sum proxmox-ve_9.2-1.iso
gpgv --keyring ./proxmox-release-trixie.gpg proxmox-ve_9.2-1.iso.asc proxmox-ve_9.2-1.iso

sha256sum printed 4e88fe416df9b527624a175f24c9aa07c714d3332afb1ee3dbf3879573ef2c6c. gpgv reported a good signature from the Proxmox Trixie Release Key, then a second signature from F4E136C67CDCE41AE6DE6FC81140AF8F639E0C39. That second key is not in the trixie keyring, so gpgv exits 2. The trixie signature is the one that matched.

Terminal output of sha256sum and gpgv on proxmox-ve_9.2-1.iso. The hash matches, the trixie signature is good, and gpgv exits 2 because a second signature has no public key in this keyring.
The trixie signature is good. Exit 2 is the older key, which this keyring does not hold.

Start the graphical installer

The system requirements ask for Intel VT or AMD-V on x86. The recommended memory line is 2 GB for the OS and the Proxmox services, plus whatever the guests need. Ceph and ZFS want about 1 GB more per TB of used storage. The evaluation minimum on the same page is 1 GB plus the guests. This nested node had 8 GB so the installer and one small guest would both fit.

The boot menu has Graphical, Terminal UI, and a serial Terminal UI. Graphical is the selected entry. The screen stayed black while the ramdisk loaded, then the installer opened. If it stays black, the next entry is Terminal UI. The installation page says to add nomodeset when the boot hangs, and it says a failed install leaves its errors on the second TTY, Ctrl+Alt+F2.

Proxmox VE 9.2 ISO boot menu with Install Proxmox VE (Graphical) selected, plus Terminal UI and Advanced Options.
Graphical is the entry to take. Terminal UI is the fallback when the framebuffer never comes up.

The first installer page is the EULA. I agree, then the target disk.

Proxmox VE installer showing the end user license agreement, with Abort, Previous, and I agree along the bottom.
The EULA is the first page after the menu. I agree is the button on the right.

Choose the disk and the filesystem

The target line showed /dev/vda (40.00GiB). On bare metal that line is the real disk, and the installer erases it. Options defaults to ext4, hdsize equal to the whole disk, and blank fields for swapsize, maxroot, minfree, and maxvz. Those blanks mean the defaults. ext4 and XFS both land on LVM. The volume group is pve, with logical volumes root, data, and swap.

Harddisk options dialog with filesystem ext4, hdsize 40.0 GB, and empty swapsize, maxroot, minfree, and maxvz fields. The target disk is /dev/vda at 40.00GiB.
ext4 and a blank options dialog. That is the default on one disk.

The installation page sets the swap default to the installed RAM, at least 4 GB and at most 8 GB, and never more than one eighth of the disk. This node had 8 GB of RAM on a 40 GiB disk, so the cap is one eighth. lvs afterwards showed swap at <4.88g, root at <17.31g, and a thin pool data at 10.43g. The same page creates that data pool only when the leftover is bigger than 4 GB. maxvz set to 0 skips it, and then local-lvm is absent. ZFS on a hardware RAID card is the combination that page calls unsupported.

Two disks are where the Options dialog grows a ZFS mirror. The filesystem choice after that, including what a dead disk takes with it, is what survives a dead disk.

Set the country, the timezone, and the keyboard

Next refused to continue while Country was empty. The message was "Please select a country first." Time zone was already Europe/Vienna. Typing Austria filled the country and switched Keyboard Layout to German. The keyboard on this machine is U.S. English, so the layout went back to that. Pick the country you are in, and the layout you are actually typing on. The country also chooses a nearby download server for later updates.

Location and time zone page with country Austria, time zone Europe/Vienna, and keyboard layout U.S. English.
Austria filled the country. The layout was set back to U.S. English, which is the keyboard in front of the machine.

Set the root password and the email

The password field wants at least 8 characters. The installation page recommends 12, with mixed case, numbers, and a symbol. The field is masked. The email is where the node sends update notices and cron errors. This run used [email protected].

Administration password page with both password fields masked and the email set to root@example.com.
Both password fields are masked. The email is the address the node will write to.

Set the hostname and the address

The management NIC had a filled circle and the name nic0, a virtio device. Interfaces that are up get that circle. The hostname field wants the FQDN. This one is pve.example-hosting.com. The address row was 10.0.2.15/24, gateway 10.0.2.2, DNS 10.0.2.3, because that is what QEMU user-mode networking hands out. On the bare-metal box, type the management address, its gateway, and a DNS resolver that the NIC can reach. "Pin network interface names" was already checked, and it stayed checked.

The installation page takes one address family in this step. This page only had the IPv4 fields. Add the other family after the node is up.

Management network page with nic0 up, hostname pve.example-hosting.com, address 10.0.2.15/24, gateway 10.0.2.2, and DNS 10.0.2.3.
10.0.2.15 is the QEMU user-mode address. The bare-metal row is the management NIC.

The summary is the last page before Install. Filesystem ext4, disk /dev/vda, country Austria, timezone Europe/Vienna, keymap en-us, email [email protected], interface nic0, address 10.0.2.15/24. The Hostname row printed pve, the short name, while the field on the previous page held the FQDN.

Installer summary table: ext4, /dev/vda, Austria, Europe/Vienna, keymap en-us, root@example.com, nic0, hostname pve, 10.0.2.15/24.
The summary prints the short hostname. The field on the previous page held the FQDN.

From the Install button until port 8006 returned a page was 151 seconds on this qcow2. A USB stick or a slower disk takes longer. The installation page says the copy usually takes several minutes and depends on the disk. Take the ISO out before the reboot. Left in the drive, the machine comes back to the installer menu.

Installation successful page telling you to open https://10.0.2.15:8006 after the reboot.
The installer prints the URL it will serve. Remove the ISO before that reboot.

Open https://the-address:8006

After the reboot the console banner is the same URL, and the login prompt is pve login. hostname -f printed pve.example-hosting.com. /etc/hosts contained:

10.0.2.15 pve.example-hosting.com pve

The certificate subject was CN = pve.example-hosting.com, issued by PVE Cluster Manager CA. hostname -f, that CN, and /etc/hosts all carried the FQDN.

Console banner telling you to connect to https://10.0.2.15:8006/ and a pve login prompt.
The getty after the reboot. The ISO was no longer the boot device.

Chrome stops on NET::ERR_CERT_AUTHORITY_INVALID. The issuer is the Proxmox CA, which the browser has never seen. Advanced, then proceed. A replacement certificate can wait until after the login.

Chrome warning Your connection is not private, NET::ERR_CERT_AUTHORITY_INVALID, for pve.example-hosting.com.
The first connection warns because the certificate is signed by the node's own CA.

The login box wants root and the password from the installer. Realm stays on Linux PAM.

Proxmox VE login dialog with an empty user name, Linux PAM standard authentication, and English selected.
User root, the installer password, realm Linux PAM.

The first screen after login says "No valid subscription". That is the missing key, and the node behind the dialog is up. A login before dist-upgrade showed Virtual Environment 9.2.2. The frame here is a later login, so the header reads 9.2.24 and VM 900 is already in the tree. The dialog text is the same.

No valid subscription dialog over the datacenter view. Node pve is up, and virtual machine 900 is listed.
The dialog is the missing subscription key. The node behind it is already running.

Stop the enterprise repository 401

A fresh install enables the enterprise repository and the Ceph enterprise repository. Neither accepts an anonymous apt-get update. This node had no sources.list. The definitions are deb822 files under /etc/apt/sources.list.d/.

pve-enterprise.sources pointed at https://enterprise.proxmox.com/debian/pve, suite trixie, component pve-enterprise. ceph.sources pointed at https://enterprise.proxmox.com/debian/ceph-squid, component enterprise. Both returned 401, and apt said the repositories were not signed, which is what a 401 looks like when the file never arrives. Exit code 100.

apt-get update failing with 401 Unauthorized for the Ceph squid enterprise repository and the Proxmox VE enterprise repository on trixie.
Both enterprise files 401 on a node with no subscription key. Ceph is in that list even when the node is not running Ceph.

The repository page disables an enterprise entry with Enabled: no, and it puts the no-subscription repository in proxmox.sources. Proxmox calls that repository the testing and non-production one. The Ceph file got the same Enabled: no. Nothing on this node uses Ceph, so that file stayed disabled and no Ceph no-subscription source was added.

# /etc/apt/sources.list.d/pve-enterprise.sources
Types: deb
URIs: https://enterprise.proxmox.com/debian/pve
Suites: trixie
Components: pve-enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Enabled: no
# /etc/apt/sources.list.d/ceph.sources
Types: deb
URIs: https://enterprise.proxmox.com/debian/ceph-squid
Suites: trixie
Components: enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Enabled: no
# /etc/apt/sources.list.d/proxmox.sources
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg

apt-get update then fetched the trixie InRelease and 407 kB of pve-no-subscription packages, 411 kB in all, and exited 0.

The two enterprise source files with Enabled set to no, the pve-no-subscription source for trixie, and a clean apt-get update.
Enabled: no stops the 401. The no-subscription source is what apt reads instead.

apt-get dist-upgrade is the step the download page asks for on a fresh ISO. It moved the manager from 9.2.2 to 9.2.24 and installed kernel 7.0.14-26-pve beside the ISO kernel 7.0.2-6-pve. pveversion kept printing proxmox-ve: 9.2.0 and the old running kernel until the reboot. After the reboot the running kernel was 7.0.14-26-pve. That is the build covered in the Proxmox kernel to boot. The ISO kernel is older than that line, so the reboot is the step that leaves the 401 behind and lands on the kernel you meant to run.

apt-get update
apt-get dist-upgrade
reboot
pveversion
pveversion showing proxmox-ve 9.2.0 and running kernel 7.0.14-26-pve, pve-manager 9.2.24, hostname pve.example-hosting.com, the hosts line, and qm status running.
The running kernel changes at the reboot. hostname -f is the FQDN the summary had shortened.

Create the first virtual machine

The guest ISO was ubuntu-26.04.1-live-server-amd64.iso. SHA256 cc8a95cde20f6ced61a322420de00f10cc3c90ced545daa46cb9c1a117f1d927. It went in /var/lib/vz/template/iso/, which is the local storage. The disk is an 8 GiB virtio volume on local-lvm. Two cores, CPU type host, 2 GiB of RAM, a virtio NIC on vmbr0.

qm create 900 --name ubuntu --memory 2048 --cores 2 --cpu host \
  --net0 virtio,bridge=vmbr0 \
  --virtio0 local-lvm:8 \
  --ostype l26 \
  --ide2 local:iso/ubuntu-26.04.1-live-server-amd64.iso,media=cdrom \
  --boot order=ide2
qm start 900
qm status 900

qm status 900 printed status: running. Inside the node, /dev/kvm existed and the CPU flag was vmx, which is what a nested guest needs before qm start can do anything. A task that dies with /usr/bin/kvm failing is a machine whose VT-x or AMD-V is off, or a hypervisor that did not pass the flag through.

Hardware page for VM 900: 2.00 GiB memory, 2 host cores, a virtio disk of 8G on local-lvm, a virtio NIC on vmbr0, and the Ubuntu 26.04.1 ISO on ide2.
CPU type host, virtio disk, virtio NIC on vmbr0. The ISO stays attached until the guest install is finished.

The console opened on the Ubuntu language list, English highlighted. That is as far as this node needed to go. The guest is running, and the installer is on the screen.

Ubuntu installer language list inside the Proxmox console, with English highlighted.
The first screen of the Ubuntu 26.04.1 live server installer, on the VM console.

A node that is going to be added to a fleet uses the Proxmox provider guide after this. The guide starts from a node that already answers on port 8006.

Questions that come up on the first boot

Does Proxmox VE 9 require a subscription?

The node installs and boots without one. The "No valid subscription" dialog and the 401 are the same missing key. Updates on this node came from pve-no-subscription after the enterprise files were disabled. Proxmox describes that repository as the testing and non-production one.

Should the installer use ZFS?

On one disk, ext4 is the default and it is what this install kept. A ZFS mirror needs the disks selected in Options. ZFS on a hardware RAID card is unsupported. The RAM note for ZFS and Ceph is about 1 GB per TB, on top of the 2 GB the OS wants.

Why is apt update returning 401?

pve-enterprise.sources and ceph.sources are enabled on a fresh install, and both want a subscription. Add Enabled: no to each, write proxmox.sources with component pve-no-subscription and suite trixie, then run apt-get update again.

The screen is black after the menu. What now?

Give the ramdisk a moment. This run was black, then the EULA appeared. If the picture never comes, boot Terminal UI from the same menu. A hang during boot is the case for nomodeset on the installation page. Installer errors also land on TTY2.

The summary shows a short hostname. Did the FQDN get dropped?

The summary printed pve. hostname -f printed pve.example-hosting.com, the certificate CN was that name, and /etc/hosts mapped the address to the FQDN and the short name. Tasks that look up the node name need that hosts line. The installer wrote it.