Wiki source code of proxmox
Last modified by Kevin Wiki on 2026/05/18 09:20
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | (% class="row" %) | ||
| 2 | ((( | ||
| 3 | (% class="col-xs-12 col-sm-8" %) | ||
| 4 | ((( | ||
| 5 | {{children/}} | ||
| 6 | |||
| 7 | |||
| 8 | = Getting Started with Proxmox VE LXC and VM Templates = | ||
| 9 | |||
| 10 | Proxmox VE (PVE) allows users to create and manage both LXC containers and KVM virtual machines (VMs). This guide walks you through the process of downloading, importing, and creating templates for both. | ||
| 11 | |||
| 12 | == LXC Templates == | ||
| 13 | |||
| 14 | LXC containers are lightweight and ideal for running Linux services with minimal overhead. | ||
| 15 | |||
| 16 | === List Available Templates === | ||
| 17 | |||
| 18 | To view the available LXC templates: | ||
| 19 | |||
| 20 | {{code language="bash"}} | ||
| 21 | pveam list | ||
| 22 | {{/code}} | ||
| 23 | |||
| 24 | === Download Templates === | ||
| 25 | |||
| 26 | Use the pveam download command to import templates to the local storage: | ||
| 27 | |||
| 28 | {{code language="bash"}} | ||
| 29 | pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.gz | ||
| 30 | pveam download local ubuntu-24.04-standard_24.04-1_amd64.tar.zst | ||
| 31 | pveam download local debian-12-standard_11.7-1_amd64.tar.zst | ||
| 32 | {{/code}} | ||
| 33 | |||
| 34 | Once downloaded, these templates can be used to create new LXC containers from the Proxmox web interface or via CLI. | ||
| 35 | |||
| 36 | == VM Template from Ubuntu Cloud Image == | ||
| 37 | |||
| 38 | KVM VMs are ideal when you need full virtualization, for instance, to run Windows or more complex Linux systems. | ||
| 39 | |||
| 40 | === Download Ubuntu Cloud Image === | ||
| 41 | |||
| 42 | Download the official Ubuntu 24.04 cloud [[image:]] | ||
| 43 | |||
| 44 | {{code language="bash"}} | ||
| 45 | wget http://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img | ||
| 46 | {{/code}} | ||
| 47 | |||
| 48 | === Create the Virtual Machine === | ||
| 49 | |||
| 50 | Create a new VM with ID 910 (you can pick any unused ID): | ||
| 51 | |||
| 52 | {{code language="bash"}} | ||
| 53 | qm create 910 -name template-ubuntu-jammy -memory 2048 -net0 virtio,bridge=vmbr0 -cores 2 -sockets 1 | ||
| 54 | {{/code}} | ||
| 55 | |||
| 56 | === Import and Attach the Disk === | ||
| 57 | |||
| 58 | Choose the correct storage (replace nvme if you use a different storage name): | ||
| 59 | |||
| 60 | {{code language="bash"}} | ||
| 61 | qm importdisk 910 ubuntu-24.04-server-cloudimg-amd64.img nvme | ||
| 62 | qm set 910 -scsihw virtio-scsi-pci -virtio0 nvme:vm-910-disk-0 | ||
| 63 | {{/code}} | ||
| 64 | |||
| 65 | === Configure the VM === | ||
| 66 | |||
| 67 | {{code language="bash"}} | ||
| 68 | qm set 910 -serial0 socket | ||
| 69 | qm set 910 -boot c -bootdisk virtio0 | ||
| 70 | qm set 910 -agent 1 | ||
| 71 | qm set 910 -hotplug disk,network,usb | ||
| 72 | qm set 910 -vcpus 1 | ||
| 73 | qm set 910 -vga qxl | ||
| 74 | qm set 910 -ide2 nvme:cloudinit | ||
| 75 | qm resize 910 virtio0 +8G | ||
| 76 | {{/code}} | ||
| 77 | |||
| 78 | |||
| 79 | If your disk is using SCSI instead of virtio, resize like this: | ||
| 80 | |||
| 81 | {{code language="bash"}} | ||
| 82 | qm resize 910 scsi0 +8G | ||
| 83 | {{/code}} | ||
| 84 | |||
| 85 | === Convert the VM into a Template === | ||
| 86 | |||
| 87 | {{code language="bash"}} | ||
| 88 | qm template 910 | ||
| 89 | {{/code}} | ||
| 90 | |||
| 91 | Now you can use this template to clone new VMs instantly. | ||
| 92 | |||
| 93 | == Bash Script to Automate Setup == | ||
| 94 | |||
| 95 | Install the above using bash script below | ||
| 96 | |||
| 97 | === setup_proxmox_templates.sh === | ||
| 98 | |||
| 99 | {{code language="bash"}} | ||
| 100 | #!/bin/bash | ||
| 101 | |||
| 102 | # Exit on errors | ||
| 103 | set -e | ||
| 104 | |||
| 105 | echo "Downloading LXC templates..." | ||
| 106 | pveam download nvme ubuntu-22.04-standard_22.04-1_amd64.tar.zst | ||
| 107 | pveam download nvme ubuntu-24.04-standard_24.04-2_amd64.tar.zst | ||
| 108 | pveam download nvme alpine-3.21-default_20241217_amd64.tar.xz | ||
| 109 | pveam download nvme debian-12-standard_12.7-1_amd64.tar.zst | ||
| 110 | |||
| 111 | echo "Downloading Ubuntu cloud image..." | ||
| 112 | wget -N http://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img | ||
| 113 | |||
| 114 | echo "Creating VM Template..." | ||
| 115 | qm create 910 -name template-ubuntu-jammy -memory 2048 -net0 virtio,bridge=vmbr0 -cores 2 -sockets 1 && 1 | ||
| 116 | |||
| 117 | # qm importdisk 910 ubuntu-24.04-server-cloudimg-amd64.img nvme | ||
| 118 | # qm set 910 -scsihw virtio-scsi-pci -scsi0-virtio0 nvme:910/vm-910-disk-0 | ||
| 119 | qm set 910 -scsihw virtio-scsi-pci -scsi0 nvme:0,import-from=/mnt/nvmestorage/template/iso/ubuntu-24.04-server-cloudimg-amd64.img | ||
| 120 | |||
| 121 | qm set 910 -serial0 socket | ||
| 122 | qm set 910 -boot c -bootdisk virtio0 | ||
| 123 | qm set 910 -agent 1 | ||
| 124 | qm set 910 -hotplug disk,network,usb | ||
| 125 | qm set 910 -vcpus 1 | ||
| 126 | qm set 910 -vga qxl | ||
| 127 | qm set 910 -ide2 nvme:cloudinit | ||
| 128 | # qm resize 910 scsi0 +8G | ||
| 129 | |||
| 130 | read -p "Confirm converting to template by pressing Enter" | ||
| 131 | qm template 910 | ||
| 132 | |||
| 133 | echo "Templates setup complete." | ||
| 134 | {{/code}} | ||
| 135 | |||
| 136 | |||
| 137 | = VM runtime setup = | ||
| 138 | |||
| 139 | After creating the VM and before making it into a template there are some programs and settings we want to ensure exists always. | ||
| 140 | |||
| 141 | (% id="cke_bm_721114S" style="display:none" %)** **(%%)**clear bash history** to not leave any configuration in history, clear and disable history file before proceeding: | ||
| 142 | |||
| 143 | {{code language="bash"}} | ||
| 144 | unset HISTFILE | ||
| 145 | export HISTSIZE=0 | ||
| 146 | export HISTFILESIZE=0 | ||
| 147 | |||
| 148 | sudo rm /.bash_history | ||
| 149 | rm ~/.bash_history | ||
| 150 | {{/code}} | ||
| 151 | |||
| 152 | **qemu-guest-agent** is for allowing proxmox to query information from the VM such as IP address, shutdown commands, etc | ||
| 153 | |||
| 154 | {{code language="bash"}} | ||
| 155 | sudo apt update | ||
| 156 | sudo apt upgrade -y | ||
| 157 | sudo apt install qemu-guest-agent -y | ||
| 158 | |||
| 159 | sudo systemctl enable qemu-guest-agent.service | ||
| 160 | sudo systemctl start qemu-guest-agent.service | ||
| 161 | {{/code}} | ||
| 162 | |||
| 163 | **reset machine-id** to not have overlapping ids from same template | ||
| 164 | |||
| 165 | {{code language="bash"}} | ||
| 166 | cat /dev/null > /etc/machine-id | ||
| 167 | cat /dev/null > /var/lib/dbus/machine-id | ||
| 168 | {{/code}} | ||
| 169 | |||
| 170 | **cloud-init** is a great hook for installing or configuring programs or receiving variables from cloudinit CDROM drive. Making it easier to change IP, hostname, DNS, username/password, etc between VMs | ||
| 171 | |||
| 172 | {{code language="bash"}} | ||
| 173 | cloud-init clean | ||
| 174 | {{/code}} | ||
| 175 | |||
| 176 | This is a debian example of what we are looking for: | ||
| 177 | |||
| 178 | {{code language="yaml"}} | ||
| 179 | # The top level settings are used as module | ||
| 180 | # and system configuration. | ||
| 181 | # A set of users which may be applied and/or used by various modules | ||
| 182 | # when a 'default' entry is found it will reference the 'default_user' | ||
| 183 | # from the distro configuration specified below | ||
| 184 | users: | ||
| 185 | - default | ||
| 186 | |||
| 187 | # If this is set, 'root' will not be able to ssh in and they | ||
| 188 | # will get a message to login instead as the default $user | ||
| 189 | disable_root: true | ||
| 190 | |||
| 191 | # This will cause the set+update hostname module to not operate (if true) | ||
| 192 | preserve_hostname: false | ||
| 193 | |||
| 194 | apt: | ||
| 195 | # This prevents cloud-init from rewriting apt's sources.list file, | ||
| 196 | # which has been a source of surprise. | ||
| 197 | preserve_sources_list: true | ||
| 198 | |||
| 199 | # The modules that run in the 'init' stage | ||
| 200 | cloud_init_modules: | ||
| 201 | - seed_random | ||
| 202 | - bootcmd | ||
| 203 | - write-files | ||
| 204 | - growpart | ||
| 205 | - resizefs | ||
| 206 | - disk_setup | ||
| 207 | - mounts | ||
| 208 | - set_hostname | ||
| 209 | - update_hostname | ||
| 210 | - update_etc_hosts | ||
| 211 | - ca-certs | ||
| 212 | - rsyslog | ||
| 213 | - users-groups | ||
| 214 | - ssh | ||
| 215 | |||
| 216 | # The modules that run in the 'config' stage | ||
| 217 | cloud_config_modules: | ||
| 218 | - locale | ||
| 219 | - set-passwords | ||
| 220 | - grub-dpkg | ||
| 221 | - apt-pipelining | ||
| 222 | - apt-configure | ||
| 223 | - ntp | ||
| 224 | - timezone | ||
| 225 | - disable-ec2-metadata | ||
| 226 | - runcmd | ||
| 227 | |||
| 228 | # The modules that run in the 'final' stage | ||
| 229 | cloud_final_modules: | ||
| 230 | - package-update-upgrade-install | ||
| 231 | - write-files-deferred | ||
| 232 | - scripts-vendor | ||
| 233 | - scripts-per-once | ||
| 234 | - scripts-per-boot | ||
| 235 | - scripts-per-instance | ||
| 236 | - scripts-user | ||
| 237 | - ssh-authkey-fingerprints | ||
| 238 | # - keys-to-console | ||
| 239 | - install-hotplug | ||
| 240 | # - phone-home | ||
| 241 | - final-message | ||
| 242 | - power-state-change | ||
| 243 | |||
| 244 | # System and/or distro specific settings | ||
| 245 | # (not accessible to handlers/transforms) | ||
| 246 | system_info: | ||
| 247 | # This will affect which distro class gets used | ||
| 248 | distro: debian | ||
| 249 | # Default user name + that default users groups (if added/used) | ||
| 250 | default_user: | ||
| 251 | name: debian | ||
| 252 | lock_passwd: True | ||
| 253 | gecos: Debian | ||
| 254 | groups: [sudo] | ||
| 255 | # Disables password-less sudo commands for default/debian user | ||
| 256 | sudo: ["ALL=(ALL) ALL"] | ||
| 257 | shell: /bin/bash | ||
| 258 | # Other config here will be given to the distro class and/or path classes | ||
| 259 | paths: | ||
| 260 | cloud_dir: /var/lib/cloud/ | ||
| 261 | templates_dir: /etc/cloud/templates/ | ||
| 262 | package_mirrors: | ||
| 263 | - arches: [default] | ||
| 264 | failsafe: | ||
| 265 | primary: https://deb.debian.org/debian | ||
| 266 | security: https://deb.debian.org/debian-security | ||
| 267 | ssh_svcname: ssh | ||
| 268 | {{/code}} | ||
| 269 | |||
| 270 | |||
| 271 | |||
| 272 | |||
| 273 | |||
| 274 | |||
| 275 | ))) | ||
| 276 | |||
| 277 | (% class="col-xs-12 col-sm-4" %) | ||
| 278 | ((( | ||
| 279 | (% class="box" %) | ||
| 280 | ((( | ||
| 281 | |=Site|[[Proxmox>>https://proxmox.com]] | ||
| 282 | |=Dashboard| | ||
| 283 | |=Servers|1200 € | ||
| 284 | |=Image|[[Credits>>https://commons.wikimedia.org/wiki/File:FalabellaFestivo.jpg]] | ||
| 285 | ))) | ||
| 286 | |||
| 287 | (% class="box" %) | ||
| 288 | ((( | ||
| 289 | **Contents** | ||
| 290 | |||
| 291 | {{toc/}} | ||
| 292 | ))) | ||
| 293 | ))) | ||
| 294 | ))) |