For our Blog Visitor only Get Additional 3 Month Free + 10% OFF on TriAnnual Plan YSBLOG10
Grab the Deal

How to Create VPS Hosting on Linux Server

To create VPS hosting on a Linux server, install a hypervisor like KVM with libvirt, configure networking (NAT or a public bridge), set up storage pools (qcow2 or LVM-thin), then provision VMs using virt-install or cloud-init templates. Harden SSH, enable a firewall, and add monitoring and backups for production reliability.

If you’re wondering how to create VPS hosting on a Linux server, this step-by-step guide shows you exactly how to turn bare-metal Linux into a reliable virtualization host. We’ll use KVM, QEMU, and libvirt—the industry-standard, open-source stack—for performance, isolation, and long-term stability.

Search Intent and What You’ll Learn

The goal is to deploy and manage multiple VPS instances on one Linux server. You’ll learn hardware and network planning, installing KVM, setting up NAT and bridge networking, storage pools (qcow2/LVM), provisioning with cloud images, hardening security, automating at scale, and troubleshooting common pitfalls.

Prerequisites and Planning

Hardware and OS Requirements

Use a 64-bit CPU with virtualization extensions (Intel VT‑x or AMD‑V), at least 16–32 GB RAM for multiple VMs, and SSD/NVMe for fast I/O. Ubuntu Server LTS or Rocky/AlmaLinux are popular choices for stability and long-term support.

# Verify virtualization support
lscpu | grep -i virtualization
# or
egrep -c '(vmx|svm)' /proc/cpuinfo

Network and IP Addressing

Decide between NAT (simple, private addressing) and a bridge (public IPs to each VPS). For public-facing workloads, request a routed /29 or larger subnet from your provider. Plan IPv6 early to avoid rework later.

When to Choose Managed Instead

If you need production-grade uptime, DDoS protection, snapshots, and 24×7 support without managing the host yourself, consider a managed VPS. At YouStable, we offer optimized KVM VPS with NVMe storage, auto backups, and expert support so you can focus on apps, not infrastructure.

Install KVM, QEMU, and Libvirt

Enable Virtualization and Secure BIOS/UEFI

Enable VT‑x/AMD‑V in BIOS/UEFI. While you’re there, disable unused boot devices, set BIOS passwords, and enable Secure Boot if supported. Keep firmware updated for stability and security.

Install on Ubuntu/Debian

sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients \
virtinst bridge-utils cloud-image-utils genisoimage

Add your user to the libvirt group and enable services:

sudo usermod -aG libvirt $USER
sudo systemctl enable --now libvirtd
newgrp libvirt
virsh list --all

Install on RHEL/CentOS/Rocky/AlmaLinux

sudo dnf install -y @virtualization libvirt virt-install qemu-img \
bridge-utils cloud-utils-genisoimage
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $USER
newgrp libvirt
virsh list --all

Configure Networking for Your VPS

NAT (Default virbr0) – Easiest for Private Networks

Libvirt creates a NATed virtual network (virbr0) by default. VMs get private IPs (e.g., 192.168.122.0/24) and share the host’s outbound connectivity. Use port forwarding or a reverse proxy if you need inbound access.

# List and start the default NAT network
virsh net-list --all
virsh net-start default
virsh net-autostart default

Bridge Networking – Public IPs for Each VPS

Bridge networking (br0) connects VMs directly to your physical NIC, letting each VPS use a real public IP. This requires at least one spare public IP and support from your datacenter or provider.

Example on Ubuntu with Netplan (replace ens18 and addressing as needed):

sudo nano /etc/netplan/01-br0.yaml
# Example
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: no
  bridges:
    br0:
      interfaces: [ens18]
      addresses: [203.0.113.10/24]
      gateway4: 203.0.113.1
      nameservers:
        addresses: [1.1.1.1,8.8.8.8]
sudo netplan apply

Create a libvirt network tied to br0:

cat > br0.xml <<'EOF'
<network>
  <name>br0</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>
EOF
virsh net-define br0.xml
virsh net-start br0
virsh net-autostart br0

On RHEL-family systems, configure a bridge using NetworkManager (nmcli) or ifcfg files, then bind the physical interface as a slave to br0.

Prepare Storage Pools (qcow2 or LVM-Thin)

Directory/Image Pool (Simple)

For simplicity, use qcow2 images in a directory pool. qcow2 supports snapshots and thin provisioning.

sudo mkdir -p /var/lib/libvirt/images
sudo virsh pool-define-as imgpool dir - - - - "/var/lib/libvirt/images"
sudo virsh pool-start imgpool
sudo virsh pool-autostart imgpool

LVM Thin Pool (Performance)

LVM thin pools provide near-raw performance with thin provisioning. Use a dedicated disk or VG:

# Example: create VG and thin pool
sudo pvcreate /dev/nvme0n1
sudo vgcreate vps-vg /dev/nvme0n1
sudo lvcreate -L 500G -T vps-vg/vps-thin
# Define libvirt pool
cat > lvm.xml <<'EOF'
<pool type='logical'>
  <name>lvmthin</name>
  <source><name>vps-vg</name></source>
  <target><path>/dev/vps-vg</path></target>
</pool>
EOF
virsh pool-define lvm.xml
virsh pool-start lvmthin
virsh pool-autostart lvmthin

Create Your First VPS (KVM Guest)

Option A: Fast Provision with Cloud Images + cloud-init

Cloud images boot quickly and auto-configure users, SSH keys, and networking via cloud-init.

# Download an Ubuntu cloud image
cd /var/lib/libvirt/images
sudo wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
# Create cloud-init seed ISO with your SSH key and user
mkdir -p /tmp/seed
cat > /tmp/seed/user-data <<'EOF'
#cloud-config
users:
  - name: devops
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo
    shell: /bin/bash
    ssh-authorized-keys:
      - ssh-rsa AAAA...yourkey...
chpasswd:
  list: |
    devops:changeme
  expire: false
packages: [qemu-guest-agent]
ssh_pwauth: false
runcmd:
  - systemctl enable --now qemu-guest-agent
EOF
cat > /tmp/seed/meta-data <<'EOF'
instance-id: vps-01
local-hostname: vps-01
EOF
genisoimage -output seed-vps01.iso -volid cidata -joliet -rock /tmp/seed/user-data /tmp/seed/meta-data

# Create the VM
sudo virt-install \
  --name vps-01 \
  --memory 2048 --vcpus 2 \
  --disk path=/var/lib/libvirt/images/vps-01.qcow2,size=20,format=qcow2 \
  --disk path=/var/lib/libvirt/images/seed-vps01.iso,device=cdrom \
  --import --os-variant ubuntu22.04 \
  --network network=default \
  --noautoconsole

If using public IPs, replace network=default with network=br0 and configure the static IP in user-data.

Option B: Install from ISO with virt-install

For custom partitioning or OSes without cloud images, boot from an ISO.

# Place ISO under /var/lib/libvirt/images
sudo virt-install \
  --name vps-02 \
  --memory 4096 --vcpus 2 \
  --disk path=/var/lib/libvirt/images/vps-02.qcow2,size=40,format=qcow2 \
  --cdrom /var/lib/libvirt/images/ubuntu-22.04.4-live-server-amd64.iso \
  --os-variant ubuntu22.04 \
  --network network=br0 \
  --graphics none

Connect via console during install:

virsh console vps-02

Firewall, Security, and Access

Harden SSH and Restrict Ports

# UFW (Ubuntu)
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable

# firewalld (RHEL)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload

Disable password SSH, use SSH keys, and change the default SSH port if needed. Install fail2ban, and ensure qemu-guest-agent is running for clean shutdowns and IP reporting.

NAT Port Forwards (If Needed)

Expose services from a NATed VM with iptables or firewalld port forwarding.

# Example: forward host port 2222 to VM 192.168.122.50:22
sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to 192.168.122.50:22
sudo iptables -A FORWARD -p tcp -d 192.168.122.50 --dport 22 -j ACCEPT
# Persist rules via your distro's firewall tooling

Backups, Snapshots, and Recovery

Schedule off-host backups. For qcow2 disks, take snapshots during maintenance windows; for LVM-thin, use LVM snapshots. Always test restores to a staging VM.

# Basic qcow2 snapshot example
virsh snapshot-create-as vps-01 pre-update --disk-only --atomic

Store backups on a separate storage tier or object storage. Consider incremental rsync, BorgBackup, or restic for file-level backups inside VMs.

Scaling and Automation

Templates and cloud-init

Create a “golden image” VM with required packages, then sysprep it or convert to a cloud-image style template. Use cloud-init user-data to standardize users, SSH keys, packages, and network configs across VMs.

Infrastructure as Code

Use Ansible to configure hosts, and Terraform plus the libvirt provider to declare and provision VMs. This makes your VPS hosting reproducible and version-controlled.

Monitoring and Resource Controls

Enable Prometheus node_exporter on the host, and track CPU steal time, disk latency, and memory pressure. Apply vCPU pinning or shares if you mix latency-sensitive and bursty workloads. Avoid CPU overcommit for databases.

Troubleshooting Common Issues

VM Doesn’t Get an IP

Check the VM’s network interface name and that the correct network is attached (virsh domiflist). For NAT, confirm the default network is active. For bridges, verify br0 is up and the provider routes your subnet to the host.

Poor Disk Performance

Use virtio drivers, place images on NVMe, and avoid deep snapshot chains. For heavy I/O, prefer LVM-thin with writeback cache or pass-through disks. Verify no RAID controller cache is disabled.

Can’t Connect via SSH

Confirm the VM is running (virsh list), SSH is listening inside the VM, and firewall rules allow the port. On NAT, verify DNAT rules. On bridges, ensure correct gateway and rDNS if email deliverability is required.

Alternatives and Control Panels

Proxmox VE (All-in-One Web UI)

Proxmox VE layers a robust web UI, clustering, and backups on top of KVM and LXC. Great for multi-node labs and SMBs. If you want a polished UI without building from scratch, Proxmox is an excellent option.

Commercial Panels and Billing

Tools like Virtualizor, SolusVM, or Fleio add self-service, billing, and multi-tenant isolation. They’re useful if you plan to resell VPS instances.

Prefer Managed VPS?

If you want the performance of KVM without the operational overhead, YouStable’s managed VPS delivers tuned kernels, NVMe storage, snapshots, and proactive monitoring—all backed by hosting experts. Migrate when you’re ready; we’ll help you size, secure, and scale.

Best Practices Checklist

  • Keep host OS minimal, updated, and dedicated to virtualization.
  • Use KVM with virtio drivers, qemu-guest-agent, and cloud-init.
  • Choose NAT for simplicity; bridge networking when you need public IPs.
  • Prefer NVMe and LVM-thin for performance; monitor I/O saturation.
  • Automate provisioning (Ansible/Terraform) and maintain golden images.
  • Secure SSH, enforce firewalls, and enable fail2ban.
  • Implement off-host backups and test restores regularly.
  • Monitor CPU, RAM, disk latency, and network errors; alert on thresholds.
  • Document IP allocations, DNS, and rDNS for each VPS.

FAQs

Which Linux distro is best for creating a VPS host?

Ubuntu Server LTS and Rocky/AlmaLinux are top choices thanks to stability and strong KVM support. Ubuntu offers great cloud-init tooling; Rocky/AlmaLinux align with RHEL. Choose the ecosystem you’re most comfortable automating.

KVM vs. VirtualBox vs. VMware: which should I use?

KVM is the native Linux hypervisor with excellent performance and OSS tooling (libvirt/virt-install). VirtualBox targets desktops, not servers. VMware ESXi is enterprise-grade but proprietary. For Linux servers, KVM is the standard.

Do I need a bridge to give each VPS a public IP?

Yes. Use bridge networking (br0) tied to your physical NIC and ensure your provider routes the public subnet to your host. NAT works without a bridge but gives private IPs; you’ll need port forwards for inbound access.

How much RAM and CPU should I allocate per VPS?

Match resources to workload. For a small web stack, start with 1–2 vCPU and 2–4 GB RAM. Databases or Elasticsearch need more. Avoid overcommitting CPU for latency-sensitive services; use monitoring to right-size over time.

What’s the quickest way to spin up multiple VPS instances?

Use cloud images with cloud-init and automate with Terraform (libvirt provider) and Ansible. Maintain a golden image, inject SSH keys and packages via user-data, and declare networks/storage in code for repeatability.

Deepika Verma

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top