Systems & Networks

Turning an Old Laptop into a Bare-Metal Hypervisor: Proxmox VE Setup (Part 1)

mgokmen

For a while, I had been wanting to dive deeper into server architectures, get my hands dirty with computer networking, and gain practical experience to back up what I study in Computer Science at BFH. At the same time, I needed a dedicated machine at home to host a few personal services. Instead of spending money on expensive enterprise gear, I decided to repurpose an old laptop sitting idle on my desk.

Once I started digging in—watching dozens of YouTube breakdowns, reading documentation, and browsing homelab forums—I realized there were two main paths: take the easy route by running VirtualBox on top of a desktop OS, or wipe the machine clean and install a bare-metal hypervisor directly on the hardware. I chose the latter. It is less forgiving, but far more educational.

In this series, I document how I turned an old laptop into an isolated homelab server. First step: Proxmox Virtual Environment (PVE).

1. Why Proxmox VE? (Architectural Choice)

Virtualization generally falls into two categories:

  • Type-2 Hypervisors (VirtualBox, VMware Workstation): Run as software on top of an existing host OS (Windows/Linux). They are convenient for quick tests, but the host operating system adds overhead and prevents you from experiencing true bare-metal hardware control.
  • Type-1 Hypervisors (Proxmox VE, ESXi): Sit directly on the physical hardware. There is no middleman operating system; Proxmox itself is the operating system.

I went with Proxmox VE because it is open-source, built on Debian, and natively combines two virtualization models:

  1. KVM: Full hardware virtualization for running independent OS images.
  2. LXC (Linux Containers): OS-level virtualization sharing the host kernel, consuming minimal RAM and CPU.

This dual approach allows me to run resource-heavy workloads in isolated VMs while spinning up microservices in lightweight containers side by side without choking a 16GB RAM limit.

+-------------------------------------------------------+
|                    Hardware (Laptop)                  |
|             (CPU, 16GB RAM, SSD, Ethernet NIC)        |
+-------------------------------------------------------+
                           |
+-------------------------------------------------------+
|              Proxmox VE (Debian Kernel)               |
|   - KVM (Full Hardware Isolation)                     |
|   - LXC (Lightweight Containers)                      |
|   - Linux Bridge (Kernel-Level Virtual Switching)     |
+-------------------------------------------------------+
        |                                       |
+-----------------------+               +-----------------------+
|       LXC Container   |               |        KVM VM         |
|  (Web Services, etc.) |               |  (Isolated Workloads) |
+-----------------------+               +-----------------------+

2. Hardware Preparation & BIOS Tweaks

Before installing anything on laptop hardware, a few firmware settings must be adjusted:

  1. Virtualization Flags: Boot into BIOS/UEFI and make sure Intel Virtualization Technology (Intel VT-x) and VT-d (Direct I/O Virtualization) are enabled. Without these flags, the KVM kernel module cannot offload instructions to the CPU.
  2. Dedicated Wired Network: Do not attempt to run your hypervisor bridge over Wi-Fi. Linux bridge interfaces (vmbr0) require Layer-2 promiscuous mode, which most consumer Wi-Fi chipsets drop or handle poorly. Use a reliable Cat6 Ethernet cable straight to the router.

3. Installation Steps

Step 1: Boot Media

Download the official Proxmox VE ISO. Flash it to a USB drive using BalenaEtcher or dd in raw block-writing mode:

Bash

# Example raw write command on Linux/macOS:
sudo dd if=proxmox-ve_8.x.iso of=/dev/sdX bs=4M status=progress conv=fsync

Step 2: Filesystem Selection

The installer will prompt you to select the target drive and filesystem. The two main choices are:

  • ZFS: Offers snapshots, self-healing, and RAID features, but its ARC (Adaptive Replacement Cache) consumes significant RAM out of the box.
  • ext4 (LVM-Thin): Lightweight, stable, and leaves nearly all RAM available for containers and VMs.

Because this node runs on a single internal 512GB SSD and 16GB of total RAM, I chose ext4 with an LVM-Thin provision pool.

Step 3: Network Parameters

A server cannot rely on dynamic DHCP leases. It needs a predictable static IP outside your router’s default DHCP scope:

  • FQDN: pve.home.lab
  • IP Address: 192.168.1.100 (Assigned static IP)
  • Netmask: 255.255.255.0 (/24)
  • Gateway: 192.168.1.1 (Router IP)
  • DNS Server: 1.1.1.1

Once the installation finishes, remove the flash drive and reboot.

4. Post-Install Base Tweaks

Once the machine boots, the terminal display provides the web GUI address: [https://192.168.1.100:8006](https://192.168.1.100:8006). Log in as root using the password configured during installation.

Before spinning up any workloads, run these two fundamental tweaks in the Proxmox shell (PVE Node > Shell):

1. Enable the Community (No-Subscription) Repository

Proxmox points to the enterprise repo by default, which throws errors on apt update without an enterprise license key. Switch to the community repository:

Bash

# Disable the enterprise repo
sed -i 's/^deb/#deb/' /etc/apt/sources.list.d/pve-enterprise.list

# Add the free no-subscription repository
cat <<EOF > /etc/apt/sources.list.d/pve-no-subscription.list
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
EOF

# Update package lists and upgrade system components
apt update && apt dist-upgrade -y

2. Disable Laptop Lid Sleep Mode

By default, closing a laptop lid triggers an ACPI suspend signal. To keep the server running headless with the lid closed:

Bash

nano /etc/systemd/logind.conf

Find the following parameters, uncomment them, and set their values to ignore:

Ini, TOML

HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore

Save the file (CTRL+O, Enter, CTRL+X) and reload the service:

Bash

systemctl restart systemd-logind

The system now runs quietly in the corner as a dedicated, low-power bare-metal hypervisor node.