Writing

Building Enterprise Virtualization from Retired Hardware

Original writing, AI-assisted editing.

There are a number of reasons one may want to create a homelab — perhaps to learn new skills or to reduce dependency on third party services. Whatever the motivation, the goals of the homelab should help drive its design. And of course, there will be constraints which may force compromises in the design. There is no best one-size-fits-all solution.

My Motivation

In my case, I’ve inherited physical photo albums of multiple generations of my family. I also have a deep interest in genealogy so preserving these images for future generations is very important to me. The sheer volume of photographs alone demands automation be used. Scanning the photos is just the first step. Then I need to determine who or what is in the photos, sort them, classify them, label them so that they are searchable. I need a multistep automated pipeline. I can’t be the human in the loop reviewing and documenting each photo. The pipeline requires a Vision Language Model (VLM). My constraint is cost. I’m not going to pay a frontier AI provider for all the tokens required for this processing, nor do I want to spend thousands on a new AI rig. I’ll start by assessing what spare computing resources I already have.

Background

I’ve been working in Information Technology for decades, primarily as a Java software engineer. Early on, I would build my own PCs, but the complexities of building a system from scratch were less than they are now. As manufacturers began building machines with more options and for specific purposes, I lost interest in building my systems from the ground up. It became easier to select a PC with my desired specifications and still take advantage of commodity pricing for an off-the-shelf machine. During that time, I became the defacto IT help desk for family and friends. If their PC became slow or even died, I could generally make it usable again with more memory or a new hard drive. If they were ready to retire it, I’d take it off their hands for spare parts or some yet-to-be-determined personal project. It was not uncommon for me to have the oldest computer in the house — I’d milk it for any remaining performance while most would have tired of maintaining it.

Scrounging through cabinets and basement corners, I collected a variety of hardware with the potential to play a role in a homelab. The Windows 10 operating system on them had reached end of support, and even if they could have been upgraded to Windows 11, they could only have run it minimally. It was time to explore other options. To repurpose them as a homelab, I needed a lightweight OS, that would leave their computing resources available for other work. Proxmox was the solution. As an open-source, enterprise-grade virtualization platform, it allows the resources of these machines to be federated, or shared, across multiple containers creating a flexible environment for a variety of workloads.

I dusted them off and began to build my homelab.

Hardware Inventory

Host Model Era CPU (Architecture) TDP Cores/Threads RAM Peak FP32 GFLOPS Role
vaio Sony Vaio Laptop Q3 2010 i5-M460 (Arrandale 1st Gen) 35W 2/4 8 GB 41.6 Backup Server
inspiron Dell Inspiron Laptop Q3 2012 i7-3632QM (Ivy Bridge 3rd Gen) 35W 4/8 16 GB 185.6 Cluster Member
ideapadflex Lenovo Idea Pad Flex Laptop Q2 2013 i7-4500U (Haswell 4th Gen) 15W 2/4 8 GB 172.8 Datacenter Manager
flex2 Lenovo Flex2 Laptop Q2 2014 i3-4030U (Haswell 4th Gen) 15W 2/4 16 GB 243.2 Cluster Member
allinone ASUS All-in-One Q1 2011 i5-2400S (Sandy Bridge 2nd Gen) 65W 4/4 16 GB 166.4 Cluster Member
g11cd ASUS G11CD Tower Q3 2015 i5-6400 (Skylake 6th Gen) 65W 4/4 32 GB 422.4 Standalone w/ GPU
Total 6 nodes 18/28 96 GB 1232.0

The oldest laptop I had was a Sony Vaio laptop from 2010. Initially it had only 4GB (2x2GB) of RAM, but documentation indicated it supported up to 8GB (2x4GB). Additional research turned up anecdotal reports of some users successfully upgrading to 16GB, so I ordered a pair of 8GB DDR3 SODIMM chips. The BIOS recognized the full 16GB, but software installations repeatedly failed with memory errors. I backed off to a pair of 4GB DDR3 SODIMM chips which allowed installations to proceed as expected.

The next oldest laptop I had was a Dell Inspiron from 2012. Initially equipped with 8GB RAM (2x4GB), I was able to upgrade it to 16GB DDR3 SODIMM (2x8GB). Having 8 threads makes this machine a bit of an outlier and may prove beneficial for handling bursty parallel workloads.

I also had a couple of Lenovo laptops, an Idea Pad Flex from 2013 and a Flex2 from 2014. Unfortunately, the Idea Pad Flex has only a single memory slot so it was already topped out at 8GB DDR3 SODIMM (1x8GB), but the Flex2 had 2 memory slots and so could be upgraded from 8GB (2x4GB) to 16GB DDR3 SODIMM (2x8GB).

Besides the laptops, I also had an Asus All-In-One from 2011. For some time, this had been my daily driver, but after a certain Windows update, it began to regularly experience the Blue Screen of Death. I am pretty good about maxing out the hardware in my PCs before I retire them, so I was a little surprised to find it only had 8GB (2x4GB) DDR3 SODIMM. Fortunately, the 16GB DDR3 SODIMM (2x8GB) I bought for the Vaio, but couldn’t use, fit perfectly.

The final piece was an Asus G11CD tower, my son’s old gaming PC, from 2015. I doubled its memory from 16GB (2x8GB) to 32GB DDR4 DIMM (2x16GB) and replaced its original Nvidia GTX 960 2GB VRAM GPU with a used Nvidia RTX 3060 12GB VRAM. (Note: this was before Nvidia’s reissue of the RTX 3060.) This is obviously a huge architectural jump, and with 6 times the VRAM, it can capably run local LLMs. Even though it’s paired with an older CPU and motherboard, the CPU is sufficient to keep the GPU reasonably busy, and the motherboard’s PCIe 3.0 still provides ample bandwidth for the GPU’s PCIe 4.0 to negotiate with and not suffer substantial performance degradation. The additional power required by the RTX 3060 did also force me to upgrade the original 550W PSU to a refurbished Corsair RM750e PSU.

Fitting the Pieces Together

With the hardware now reasonably upgraded, it’s easy to divide these machines into 3 groups — the two with 8GB of total memory (Vaio and Idea Pad Flex) having the least capacity; the three with 16GB of total memory (Inspiron, Flex2, and All-in-One) having the most typical capacity of the lot, and the lone machine with 32GB of memory and a respectable GPU (G11CD).

With nothing else comparable to the G11CD, I configured it as a standalone Proxmox Virtual Environment. It will be reserved for those workloads that most benefit from a capable GPU — like running local VLMs and LLMs.

The three 16GB machines, I decided to place in a Proxmox Virtual Environment cluster despite them being CPU-asymmetric. They lack the capacity to run much work in a high-availability (HA) capacity, but I don’t have a need for HA at this time. What the cluster really offers me is the ability to quickly and easily shift containers between cluster members. Additionally the CPU-asymmetry also helps me distribute work according to Thermal Design Power (TDP). Though this really represents the amount of heat a computer component is expected to generate under a sustained, full load, it can also serve as a general guide for positioning light workloads on machines that generally draw less power so that the total energy consumption of the lab is minimized. The Flex2 with a TDP of 15W is the ideal candidate for small tasks that are triggered around the clock. Fortunately, my reliance on laptops, and configuring them to run with lid closed and screen off, helps keep the energy consumption relatively low.

With the most capable machines configured for containerized workloads, there are still two machines to leverage. One important consideration when managing a compute environment is backups. When something goes wrong a good backup can be critical to get a system up and running again. Fortunately, Proxmox Backup Server is purpose designed to do just that. The Vaio, oldest of the machines, is still more than capable of filling that role. Another challenge when managing a compute environment is visibility. The Idea Pad Flex running Proxmox Datacenter Manager can provide a single pane of glass for observing and managing my homelab.

It’s no longer e-waste. It’s a data center!

graph TD
subgraph Cluster["Proxmox VE Cluster"]
  inspiron["inspiron<br/>i7-3632QM · 16GB<br/>Cluster Member"]
  allinone["allinone<br/>i5-2400S · 16GB<br/>Cluster Member"]
  flex2["flex2<br/>i3-4030U · 16GB<br/>Cluster Member"]
end

g11cd["Proxmox Virtual Environment<br/>g11cd<br/>i5-6400 · 32GB<br/>RTX 3060 12GB<br/>GPU workloads"]
vaio["Proxmox Backup Server<br/>vaio<br/>i5-M460 · 8GB"]
ideapadflex["Proxmox Datacenter Manager<br/>ideapadflex<br/>i7-4500U · 8GB"]

vaio -. backs up .-> Cluster
vaio -. backs up .-> g11cd
vaio -. backs up .-> ideapadflex
ideapadflex -. manages/observes .-> vaio
ideapadflex -. manages/observes .-> Cluster
ideapadflex -. manages/observes .-> g11cd

style Cluster fill:#f7f8fa,stroke:#e2e5e9
classDef pve fill:#eef2fb,stroke:#1f4b8f,color:#1a1d21
classDef pbs fill:#eafaf1,stroke:#1a7a4c,color:#1a1d21
classDef pdm fill:#f3eefc,stroke:#6b46c1,color:#1a1d21
classDef gpu fill:#fdf0e1,stroke:#c2410c,color:#1a1d21

class inspiron,allinone,flex2 pve
class g11cd gpu
class vaio pbs
class ideapadflex pdm

Cost Breakdown

I spent $205 on memory for 4 machines, $240 on the used GPU, and $69 on the PSU to build my homelab. All together these 6 nodes have 18 cores with 28 threads and 96 GB memory capable of nearly 14 TFLOPS FP32 (1.23 CPU + 12.74 GPU). This is not an AMAZING amount of compute resources. This could be replaced by a single modern machine for roughly $2500-$3500 — but that is 5 to 7 times what I spent on my setup.

Resilience Philosophy

My small spend means I’m working with slower memory, slower drives, no unified memory pool, higher energy consumption, and old hardware that has already lived a long life. However, a single machine is a single point of failure. By not relying on a single machine, my workload can be more resilient. If a single node has a hardware fault (e.g., a CPU, disk, or PSU failure), I can use my backups to restore a container to another available node rather than suffering a complete outage. Additionally, I can perform rolling maintenance, starting with a less critical node to ensure any updates or patches proceed smoothly before committing the entire lab. Inevitably, I may need to replace some of this legacy hardware or expand my capabilities through the addition of another machine, but having a multi-node lab in place makes adding more nodes somewhat routine. With this foundation in place and the flexibility that it provides, I can start building out the detailed pipeline that I need to process my collection of historic family photos.