|
| 1 | +diff --git a/Makefile b/Makefile |
| 2 | +index 54601ee2..92fc0596 100644 |
| 3 | +--- a/Makefile |
| 4 | ++++ b/Makefile |
| 5 | +@@ -58,6 +58,8 @@ install: vzdump-hook-script.pl |
| 6 | + install -d $(DESTDIR)/var/lib/vz/template/iso |
| 7 | + install -m 0644 vzdump-hook-script.pl $(DOCDIR)/examples/vzdump-hook-script.pl |
| 8 | + install -m 0644 spice-example-sh $(DOCDIR)/examples/spice-example-sh |
| 9 | ++ install -d $(DESTDIR)/lib/udev/rules.d |
| 10 | ++ install -m 0644 udev/99-query-machine-info.rules $(DESTDIR)/lib/udev/rules.d/99-query-machine-info.rules |
| 11 | + set -e && for i in $(SUBDIRS); do $(MAKE) -C $$i $@; done |
| 12 | + |
| 13 | + .PHONY: distclean |
| 14 | +diff --git a/bin/Makefile b/bin/Makefile |
| 15 | +index 82d5c633..0b9bd9f6 100644 |
| 16 | +--- a/bin/Makefile |
| 17 | ++++ b/bin/Makefile |
| 18 | +@@ -23,7 +23,8 @@ SCRIPTS = \ |
| 19 | + pveupgrade \ |
| 20 | + pveupdate \ |
| 21 | + pveperf \ |
| 22 | +- pvereport |
| 23 | ++ pvereport \ |
| 24 | ++ query-machine-info |
| 25 | + |
| 26 | + HELPERS = \ |
| 27 | + pve-startall-delay \ |
| 28 | +diff --git a/bin/query-machine-info b/bin/query-machine-info |
| 29 | +new file mode 100755 |
| 30 | +index 00000000..f62fc797 |
| 31 | +--- /dev/null |
| 32 | ++++ b/bin/query-machine-info |
| 33 | +@@ -0,0 +1,10 @@ |
| 34 | ++#!/bin/bash |
| 35 | ++filename="/run/pve/query-machine-info" |
| 36 | ++cpuname=$(lscpu|grep "BIOS Model name"|cut -d ":" -f2|xargs) |
| 37 | ++if [ -z "$cpuname" ];then |
| 38 | ++ cpuname=$(lscpu|grep "Model name"|grep -v 'BIOS'|cut -d ":" -f2|xargs) |
| 39 | ++ if [ -z "$cpuname" ];then |
| 40 | ++ cpuname="unknow" |
| 41 | ++ fi |
| 42 | ++fi |
| 43 | ++dmidecode | jc --dmidecode | jq --arg cpu "$cpuname" '. += [{"cpu": $cpu}]' >$filename |
| 44 | +diff --git a/debian/control b/debian/control |
| 45 | +index 68333187..2a29d7ac 100644 |
| 46 | +--- a/debian/control |
| 47 | ++++ b/debian/control |
| 48 | +@@ -38,11 +38,14 @@ Architecture: any |
| 49 | + Depends: apt (>= 1.5~), |
| 50 | + ca-certificates, |
| 51 | + cstream, |
| 52 | ++ dmidecode, |
| 53 | + dtach, |
| 54 | + fonts-font-awesome, |
| 55 | + fonts-font-logos, |
| 56 | + gdisk, |
| 57 | + hdparm, |
| 58 | ++ jc, |
| 59 | ++ jq, |
| 60 | + libapt-pkg-perl, |
| 61 | + libcrypt-ssleay-perl, |
| 62 | + libfile-readbackwards-perl, |
| 63 | +diff --git a/debian/postinst b/debian/postinst |
| 64 | +index aba39904..e0d3c6ec 100755 |
| 65 | +--- a/debian/postinst |
| 66 | ++++ b/debian/postinst |
| 67 | +@@ -140,6 +140,7 @@ case "$1" in |
| 68 | + deb-systemd-invoke reload-or-try-restart pveproxy.service || true |
| 69 | + deb-systemd-invoke reload-or-try-restart spiceproxy.service || true |
| 70 | + deb-systemd-invoke reload-or-try-restart pvescheduler.service || true |
| 71 | ++ deb-systemd-invoke reload-or-try-restart pve-query-machine-info.service || true |
| 72 | + |
| 73 | + exit 0;; |
| 74 | + |
| 75 | +@@ -169,7 +170,7 @@ case "$1" in |
| 76 | + |
| 77 | + # same as dh_systemd_enable (code copied) |
| 78 | + |
| 79 | +- UNITS="pvedaemon.service pveproxy.service spiceproxy.service pvestatd.service pvebanner.service pvescheduler.service pve-daily-update.timer" |
| 80 | ++ UNITS="pvedaemon.service pveproxy.service spiceproxy.service pvestatd.service pvebanner.service pvescheduler.service pve-daily-update.timer pve-query-machine-info.service" |
| 81 | + NO_RESTART_UNITS="pvenetcommit.service pve-guests.service" |
| 82 | + |
| 83 | + for unit in ${UNITS} ${NO_RESTART_UNITS}; do |
| 84 | +diff --git a/services/Makefile b/services/Makefile |
| 85 | +index 8a60fa9b..31e91363 100644 |
| 86 | +--- a/services/Makefile |
| 87 | ++++ b/services/Makefile |
| 88 | +@@ -13,7 +13,8 @@ SERVICES= \ |
| 89 | + pve-storage.target \ |
| 90 | + pve-daily-update.service\ |
| 91 | + pve-daily-update.timer \ |
| 92 | +- pvescheduler.service |
| 93 | ++ pvescheduler.service \ |
| 94 | ++ pve-query-machine-info.service |
| 95 | + |
| 96 | + .PHONY: install |
| 97 | + install: $(SERVICES) |
| 98 | +diff --git a/services/pve-query-machine-info.service b/services/pve-query-machine-info.service |
| 99 | +new file mode 100644 |
| 100 | +index 00000000..fcdc693a |
| 101 | +--- /dev/null |
| 102 | ++++ b/services/pve-query-machine-info.service |
| 103 | +@@ -0,0 +1,13 @@ |
| 104 | ++[Unit] |
| 105 | ++Description=PVE Query Machine Info |
| 106 | ++RequiresMountsFor=/run |
| 107 | ++Before=pvedaemon.service |
| 108 | ++Before=pveproxy.service |
| 109 | ++ |
| 110 | ++[Service] |
| 111 | ++ExecStart=/usr/bin/query-machine-info |
| 112 | ++Type=oneshot |
| 113 | ++RemainAfterExit=yes |
| 114 | ++ |
| 115 | ++[Install] |
| 116 | ++WantedBy=multi-user.target |
| 117 | +diff --git a/udev/99-query-machine-info.rules b/udev/99-query-machine-info.rules |
| 118 | +new file mode 100644 |
| 119 | +index 00000000..dc28d11b |
| 120 | +--- /dev/null |
| 121 | ++++ b/udev/99-query-machine-info.rules |
| 122 | +@@ -0,0 +1,2 @@ |
| 123 | ++ACTION=="add", SUBSYSTEM=="*", RUN="/usr/bin/query-machine-info" |
| 124 | ++ACTION=="remove", SUBSYSTEM=="*", RUN="/usr/bin/query-machine-info" |
| 125 | +diff --git a/www/manager6/Makefile b/www/manager6/Makefile |
| 126 | +index c94a5cdf..9b47c34e 100644 |
| 127 | +--- a/www/manager6/Makefile |
| 128 | ++++ b/www/manager6/Makefile |
| 129 | +@@ -232,6 +232,7 @@ JSSRC= \ |
| 130 | + pool/StatusView.js \ |
| 131 | + pool/Summary.js \ |
| 132 | + qemu/AgentIPView.js \ |
| 133 | ++ qemu/ArchEdit.js \ |
| 134 | + qemu/AudioEdit.js \ |
| 135 | + qemu/BootOrderEdit.js \ |
| 136 | + qemu/CDEdit.js \ |
| 137 | +diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js |
| 138 | +index dde4d24e..4a7a5a9e 100644 |
| 139 | +--- a/www/manager6/Utils.js |
| 140 | ++++ b/www/manager6/Utils.js |
| 141 | +@@ -48,13 +48,23 @@ Ext.define('PVE.Utils', { |
| 142 | + kvm_ostypes: { |
| 143 | + 'Linux': [ |
| 144 | + { desc: '6.x - 2.6 Kernel', val: 'l26' }, |
| 145 | ++ { desc: '2.4 Kernel - x86', val: 'l24' }, |
| 146 | + ], |
| 147 | + 'Microsoft Windows': [ |
| 148 | + { desc: '11/2022', val: 'win11' }, |
| 149 | ++ { desc: '10/2016/2019 - x86', val: 'win10' }, |
| 150 | ++ { desc: '8.x/2012/2012r2 - x86', val: 'win8' }, |
| 151 | ++ { desc: '7/2008r2 - x86', val: 'win7' }, |
| 152 | ++ { desc: 'Vista/2008 - x86', val: 'w2k8' }, |
| 153 | ++ { desc: 'XP/2003 - x86', val: 'wxp' }, |
| 154 | ++ { desc: '2000 - x86', val: 'w2k' }, |
| 155 | + ], |
| 156 | + 'Other': [ |
| 157 | + { desc: '-', val: 'other' }, |
| 158 | + ], |
| 159 | ++ 'Solaris Kernel - x86': [ |
| 160 | ++ { desc: '-', val: 'solaris' }, |
| 161 | ++ ], |
| 162 | + }, |
| 163 | + |
| 164 | + is_windows: function(ostype) { |
| 165 | +@@ -486,7 +496,7 @@ Ext.define('PVE.Utils', { |
| 166 | + }, |
| 167 | + |
| 168 | + render_qemu_machine: function(value) { |
| 169 | +- return value || Proxmox.Utils.defaultText + ' (virt)'; |
| 170 | ++ return value || Proxmox.Utils.defaultText; |
| 171 | + }, |
| 172 | + |
| 173 | + render_qemu_bios: function(value) { |
| 174 | +@@ -1310,6 +1320,14 @@ Ext.define('PVE.Utils', { |
| 175 | + return retVal.length < 1 ? value : retVal; |
| 176 | + }, |
| 177 | + |
| 178 | ++ render_get_arch: function(value) { |
| 179 | ++ if (!value){ |
| 180 | ++ return Proxmox.Utils.defaultText; |
| 181 | ++ }else{ |
| 182 | ++ return value; |
| 183 | ++ } |
| 184 | ++ }, |
| 185 | ++ |
| 186 | + windowHostname: function() { |
| 187 | + return window.location.hostname.replace(Proxmox.Utils.IP6_bracket_match, |
| 188 | + function(m, addr, offset, original) { return addr; }); |
| 189 | +diff --git a/www/manager6/form/CPUModelSelector.js b/www/manager6/form/CPUModelSelector.js |
| 190 | +index f1c40a31..407a7178 100644 |
| 191 | +--- a/www/manager6/form/CPUModelSelector.js |
| 192 | ++++ b/www/manager6/form/CPUModelSelector.js |
| 193 | +@@ -15,7 +15,7 @@ Ext.define('PVE.form.CPUModelSelector', { |
| 194 | + valueField: 'name', |
| 195 | + displayField: 'displayname', |
| 196 | + |
| 197 | +- emptyText: Proxmox.Utils.defaultText + ' (host)', |
| 198 | ++ emptyText: Proxmox.Utils.defaultText, |
| 199 | + allowBlank: true, |
| 200 | + |
| 201 | + editable: true, |
| 202 | +diff --git a/www/manager6/qemu/ArchEdit.js b/www/manager6/qemu/ArchEdit.js |
| 203 | +new file mode 100644 |
| 204 | +index 00000000..c65ec7e9 |
| 205 | +--- /dev/null |
| 206 | ++++ b/www/manager6/qemu/ArchEdit.js |
| 207 | +@@ -0,0 +1,24 @@ |
| 208 | ++Ext.define('PVE.qemu.ArchEdit', { |
| 209 | ++ extend: 'Proxmox.window.Edit', |
| 210 | ++ alias: 'widget.pveQemuArchEdit', |
| 211 | ++ |
| 212 | ++ subject: 'ARCH', |
| 213 | ++ autoLoad: true, |
| 214 | ++ |
| 215 | ++ items: { |
| 216 | ++ xtype: 'proxmoxKVComboBox', |
| 217 | ++ name: 'arch', |
| 218 | ++ fieldLabel: gettext('Arch'), |
| 219 | ++ defaultValue: '', |
| 220 | ++ comboItems: [ |
| 221 | ++ ['__default__', Proxmox.Utils.defaultText], |
| 222 | ++ ['x86_64', 'x86_64'], |
| 223 | ++ ['riscv64', 'riscv64'], |
| 224 | ++ ['loongarch64', 'loongarch64'], |
| 225 | ++ ['aarch64', 'aarch64'], |
| 226 | ++ ], |
| 227 | ++ bind: { |
| 228 | ++ value: '{arch}', |
| 229 | ++ }, |
| 230 | ++ }, |
| 231 | ++}); |
| 232 | +diff --git a/www/manager6/qemu/CreateWizard.js b/www/manager6/qemu/CreateWizard.js |
| 233 | +index 226209cb..6a61eacb 100644 |
| 234 | +--- a/www/manager6/qemu/CreateWizard.js |
| 235 | ++++ b/www/manager6/qemu/CreateWizard.js |
| 236 | +@@ -97,6 +97,22 @@ Ext.define('PVE.qemu.CreateWizard', { |
| 237 | + fieldLabel: gettext('Name'), |
| 238 | + allowBlank: true, |
| 239 | + }, |
| 240 | ++ { |
| 241 | ++ xtype: 'proxmoxKVComboBox', |
| 242 | ++ name: 'arch', |
| 243 | ++ fieldLabel: gettext('Arch'), |
| 244 | ++ comboItems: [ |
| 245 | ++ ['__default__', PVE.Utils.render_get_arch()], |
| 246 | ++ ['x86_64', 'x86_64'], |
| 247 | ++ ['riscv64', 'riscv64'], |
| 248 | ++ ['loongarch64', 'loongarch64'], |
| 249 | ++ ['aarch64', 'aarch64'], |
| 250 | ++ ], |
| 251 | ++ bind: { |
| 252 | ++ arch: '{arch}', |
| 253 | ++ }, |
| 254 | ++ insideWizard: true, |
| 255 | ++ }, |
| 256 | + ], |
| 257 | + column2: [ |
| 258 | + { |
| 259 | +diff --git a/www/manager6/qemu/HDEfi.js b/www/manager6/qemu/HDEfi.js |
| 260 | +index a8ca8f56..fcee2e35 100644 |
| 261 | +--- a/www/manager6/qemu/HDEfi.js |
| 262 | ++++ b/www/manager6/qemu/HDEfi.js |
| 263 | +@@ -67,7 +67,7 @@ Ext.define('PVE.qemu.EFIDiskInputPanel', { |
| 264 | + { |
| 265 | + xtype: 'proxmoxcheckbox', |
| 266 | + name: 'preEnrolledKeys', |
| 267 | +- checked: true, |
| 268 | ++ checked: false, |
| 269 | + fieldLabel: gettext("Pre-Enroll keys"), |
| 270 | + disabled: me.disabled, |
| 271 | + //boxLabel: '(e.g., Microsoft secure-boot keys')', |
| 272 | +diff --git a/www/manager6/qemu/MachineEdit.js b/www/manager6/qemu/MachineEdit.js |
| 273 | +index 3e5a5981..f8b3cb6a 100644 |
| 274 | +--- a/www/manager6/qemu/MachineEdit.js |
| 275 | ++++ b/www/manager6/qemu/MachineEdit.js |
| 276 | +@@ -24,7 +24,7 @@ Ext.define('PVE.qemu.MachineInputPanel', { |
| 277 | + let version = me.lookup('version'); |
| 278 | + let store = version.getStore(); |
| 279 | + let oldRec = store.findRecord('id', version.getValue(), 0, false, false, true); |
| 280 | +- let type = value === 'q35' ? 'q35' : 'virt'; |
| 281 | ++ let type = value === 'q35' ? 'q35' : 'default'; |
| 282 | + store.clearFilter(); |
| 283 | + store.addFilter(val => val.data.id === 'latest' || val.data.type === type); |
| 284 | + if (!me.getView().isWindows) { |
| 285 | +@@ -102,6 +102,8 @@ Ext.define('PVE.qemu.MachineInputPanel', { |
| 286 | + comboItems: [ |
| 287 | + ['__default__', PVE.Utils.render_qemu_machine('')], |
| 288 | + ['q35', 'q35'], |
| 289 | ++ ['virt', 'virt'], |
| 290 | ++ ['pc', 'i440fx'], |
| 291 | + ], |
| 292 | + bind: { |
| 293 | + value: '{type}', |
| 294 | +diff --git a/www/manager6/qemu/OSDefaults.js b/www/manager6/qemu/OSDefaults.js |
| 295 | +index d3ee4946..89e568c4 100644 |
| 296 | +--- a/www/manager6/qemu/OSDefaults.js |
| 297 | ++++ b/www/manager6/qemu/OSDefaults.js |
| 298 | +@@ -34,16 +34,15 @@ Ext.define('PVE.qemu.OSDefaults', { |
| 299 | + |
| 300 | + // default values |
| 301 | + me.generic = { |
| 302 | +- busType: 'ide', |
| 303 | +- networkCard: 'e1000', |
| 304 | ++ busType: 'scsi', |
| 305 | ++ networkCard: 'virtio', |
| 306 | + busPriority: { |
| 307 | + ide: 4, |
| 308 | + sata: 3, |
| 309 | + scsi: 2, |
| 310 | + virtio: 1, |
| 311 | + }, |
| 312 | +- scsihw: 'virtio-scsi-single', |
| 313 | +- cputype: 'x86-64-v2-AES', |
| 314 | ++ scsihw: 'virtio-scsi-pci', |
| 315 | + }; |
| 316 | + |
| 317 | + // virtio-net is in kernel since 2.6.25 |
| 318 | +diff --git a/www/manager6/qemu/Options.js b/www/manager6/qemu/Options.js |
| 319 | +index cbe9e52b..ea5d500d 100644 |
| 320 | +--- a/www/manager6/qemu/Options.js |
| 321 | ++++ b/www/manager6/qemu/Options.js |
| 322 | +@@ -49,6 +49,12 @@ Ext.define('PVE.qemu.Options', { |
| 323 | + }, |
| 324 | + } : undefined, |
| 325 | + }, |
| 326 | ++ arch: { |
| 327 | ++ header: gettext('Arch'), |
| 328 | ++ editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.ArchEdit' : undefined, |
| 329 | ++ defaultValue: '', |
| 330 | ++ renderer: PVE.Utils.render_get_arch, |
| 331 | ++ }, |
| 332 | + onboot: { |
| 333 | + header: gettext('Start at boot'), |
| 334 | + defaultValue: '', |
| 335 | +@@ -272,7 +278,7 @@ Ext.define('PVE.qemu.Options', { |
| 336 | + }, |
| 337 | + agent: { |
| 338 | + header: 'QEMU Guest Agent', |
| 339 | +- defaultValue: false, |
| 340 | ++ defaultValue: true, |
| 341 | + renderer: PVE.Utils.render_qga_features, |
| 342 | + editor: caps.vms['VM.Config.Options'] ? { |
| 343 | + xtype: 'proxmoxWindowEdit', |
| 344 | +diff --git a/www/manager6/qemu/SystemEdit.js b/www/manager6/qemu/SystemEdit.js |
| 345 | +index 592c88ee..9feefe09 100644 |
| 346 | +--- a/www/manager6/qemu/SystemEdit.js |
| 347 | ++++ b/www/manager6/qemu/SystemEdit.js |
| 348 | +@@ -65,11 +65,15 @@ Ext.define('PVE.qemu.SystemInputPanel', { |
| 349 | + let me = this; |
| 350 | + let vm = this.getViewModel(); |
| 351 | + let ostype = vm.get('current.ostype'); |
| 352 | ++ me.lookup('bios').setValue('ovmf'); |
| 353 | + if (ostype === 'win11') { |
| 354 | + me.lookup('machine').setValue('q35'); |
| 355 | +- me.lookup('bios').setValue('ovmf'); |
| 356 | + me.lookup('addtpmbox').setValue(true); |
| 357 | + } |
| 358 | ++ let arch = vm.get('current.arch'); |
| 359 | ++ if (arch && arch !== 'x86_64') { |
| 360 | ++ me.lookup('machine').setValue('virt'); |
| 361 | ++ } |
| 362 | + }, |
| 363 | + }, |
| 364 | + |
| 365 | +@@ -91,6 +95,8 @@ Ext.define('PVE.qemu.SystemInputPanel', { |
| 366 | + comboItems: [ |
| 367 | + ['__default__', PVE.Utils.render_qemu_machine('')], |
| 368 | + ['q35', 'q35'], |
| 369 | ++ ['virt', 'virt'], |
| 370 | ++ ['pc', 'i440fx'], |
| 371 | + ], |
| 372 | + }, |
| 373 | + { |
| 374 | +@@ -147,9 +153,9 @@ Ext.define('PVE.qemu.SystemInputPanel', { |
| 375 | + xtype: 'proxmoxcheckbox', |
| 376 | + name: 'agent', |
| 377 | + uncheckedValue: 0, |
| 378 | +- defaultValue: 0, |
| 379 | +- deleteDefaultValue: true, |
| 380 | ++ defaultValue: 1, |
| 381 | + fieldLabel: gettext('Qemu Agent'), |
| 382 | ++ checked: true, |
| 383 | + }, |
| 384 | + { |
| 385 | + // fake for spacing |
0 commit comments