<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://coolscript.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Coolscript - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://coolscript.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://coolscript.net/index.php/Special:Contributions/Admin"/>
	<updated>2026-10-17T00:44:31Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://coolscript.net/index.php?title=Main_Page&amp;diff=1173</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Main_Page&amp;diff=1173"/>
		<updated>2026-09-12T17:13:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to Coolscript&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;width:100%; vertical-align: top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are just a few scripts which you may use for your IT-System purposes. This site is almost new and more scripts will follow soon.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Logrotation and file archive management script: || &#039;&#039;&#039;[[Logd]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Eventlog to Firewall script for Windows 2008: || &#039;&#039;&#039;[[Eventlog to Firewall]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Syslog to Firewall script for Linux: || &#039;&#039;&#039;[[Syslog_to_Firewall]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Scheduled Task for Windows: || &#039;&#039;&#039;[[Scheduled Task for Windows]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Spamassassin Plugin for Geo purposes: || &#039;&#039;&#039;[[GeoMailSearch]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Raspberry Projects || &#039;&#039;&#039;[[RaspberryProjects]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PSAD to Iptables: || &#039;&#039;&#039;[[psad2ipt]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Icinga2 Web Interface for Smartphones || &#039;&#039;&#039;[[i2Mobile]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Backup Hyper-V Disk || &#039;&#039;&#039;[[Backup Virtual-Hard-Disk]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| HCP || &#039;&#039;&#039;[[HTTP_Copy]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Fail to NFT || &#039;&#039;&#039;[[Fail2nft]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Easy DynDNS with Cloudflare || &#039;&#039;&#039;[[Cfddns]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| OpenVPN automation: || &#039;&#039;&#039;[[OpenVPN_Rapid_Installer]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Prometheus Custom Monitoring Stack: || &#039;&#039;&#039;[[Custom Monitoring Stack]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Grafana Mobile Alert Dashboard: || &#039;&#039;&#039;[[Grafana Mobile Alert Dashboard]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
[[image:script-image-main.png|600px|left]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=My other sites which might be useful=&lt;br /&gt;
{|&lt;br /&gt;
| About IP v4/v6 and locations to lat/lon: || https://coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| About IP v4/v6, lat/lon to json: || https://api.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo XML API Wiki: || https://wiki.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo Json API Wiki: || https://wiki.api.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo Mobile view: || http://m.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| Another password creator || https://password.coolscript.net&lt;br /&gt;
|-&lt;br /&gt;
| Analyze your mail header: || https://mailheader.org (offline)&lt;br /&gt;
|-&lt;br /&gt;
| LinuxVirtualServer manager: || https://mylvs.coolscript.net&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions, feedback or recommendations are welcome, drop me a mail to postmaster at coolscript.net.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Main_Page&amp;diff=1172</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Main_Page&amp;diff=1172"/>
		<updated>2026-09-12T17:05:16Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* My other sites which might be useful */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to Coolscript&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;width:100%; vertical-align: top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are just a few scripts which you may use for your IT-System purposes. This site is almost new and more scripts will follow soon.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Logrotation and file archive management script: || &#039;&#039;&#039;[[Logd]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Eventlog to Firewall script for Windows 2008: || &#039;&#039;&#039;[[Eventlog to Firewall]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Syslog to Firewall script for Linux: || &#039;&#039;&#039;[[Syslog_to_Firewall]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Scheduled Task for Windows: || &#039;&#039;&#039;[[Scheduled Task for Windows]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Spamassassin Plugin for Geo purposes: || &#039;&#039;&#039;[[GeoMailSearch]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Raspberry Projects || &#039;&#039;&#039;[[RaspberryProjects]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PSAD to Iptables: || &#039;&#039;&#039;[[psad2ipt]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Icinga2 Web Interface for Smartphones || &#039;&#039;&#039;[[i2Mobile]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Backup Hyper-V Disk || &#039;&#039;&#039;[[Backup Virtual-Hard-Disk]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| HCP || &#039;&#039;&#039;[[HTTP_Copy]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Fail to NFT || &#039;&#039;&#039;[[Fail2nft]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Easy DynDNS with Cloudflare || &#039;&#039;&#039;[[Cfddns]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| OpenVPN automation: || &#039;&#039;&#039;[[OpenVPN_Rapid_Installer]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Grafana Mobile Alert Dashboard: || &#039;&#039;&#039;[[Grafana Mobile Alert Dashboard]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
[[image:script-image-main.png|600px|left]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=My other sites which might be useful=&lt;br /&gt;
{|&lt;br /&gt;
| About IP v4/v6 and locations to lat/lon: || https://coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| About IP v4/v6, lat/lon to json: || https://api.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo XML API Wiki: || https://wiki.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo Json API Wiki: || https://wiki.api.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo Mobile view: || http://m.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| Another password creator || https://password.coolscript.net&lt;br /&gt;
|-&lt;br /&gt;
| Analyze your mail header: || https://mailheader.org (offline)&lt;br /&gt;
|-&lt;br /&gt;
| LinuxVirtualServer manager: || https://mylvs.coolscript.net&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions, feedback or recommendations are welcome, drop me a mail to postmaster at coolscript.net.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Main_Page&amp;diff=1171</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Main_Page&amp;diff=1171"/>
		<updated>2026-09-12T17:04:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to Coolscript&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;width:100%; vertical-align: top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are just a few scripts which you may use for your IT-System purposes. This site is almost new and more scripts will follow soon.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Logrotation and file archive management script: || &#039;&#039;&#039;[[Logd]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Eventlog to Firewall script for Windows 2008: || &#039;&#039;&#039;[[Eventlog to Firewall]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Syslog to Firewall script for Linux: || &#039;&#039;&#039;[[Syslog_to_Firewall]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Scheduled Task for Windows: || &#039;&#039;&#039;[[Scheduled Task for Windows]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Spamassassin Plugin for Geo purposes: || &#039;&#039;&#039;[[GeoMailSearch]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Raspberry Projects || &#039;&#039;&#039;[[RaspberryProjects]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PSAD to Iptables: || &#039;&#039;&#039;[[psad2ipt]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Icinga2 Web Interface for Smartphones || &#039;&#039;&#039;[[i2Mobile]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Backup Hyper-V Disk || &#039;&#039;&#039;[[Backup Virtual-Hard-Disk]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| HCP || &#039;&#039;&#039;[[HTTP_Copy]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Fail to NFT || &#039;&#039;&#039;[[Fail2nft]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Easy DynDNS with Cloudflare || &#039;&#039;&#039;[[Cfddns]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| OpenVPN automation: || &#039;&#039;&#039;[[OpenVPN_Rapid_Installer]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Grafana Mobile Alert Dashboard: || &#039;&#039;&#039;[[Grafana Mobile Alert Dashboard]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
[[image:script-image-main.png|600px|left]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=My other sites which might be useful=&lt;br /&gt;
{|&lt;br /&gt;
| About IP v4/v6 and locations to lat/lon: || https://coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| About IP v4/v6, lat/lon to json: || https://api.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo XML API Wiki: || https://wiki.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo Json API Wiki: || https://wiki.api.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo Mobile view: || http://m.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| Another password creator || https://password.coolscript.net&lt;br /&gt;
|-&lt;br /&gt;
| Analyze your mail header: || https://mailheader.net&lt;br /&gt;
|-&lt;br /&gt;
| LinuxVirtualServer manager: || https://mylvs.coolscript.net&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions, feedback or recommendations are welcome, drop me a mail to postmaster at coolscript.net.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gm-summary-failed1.png&amp;diff=1170</id>
		<title>File:Gm-summary-failed1.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gm-summary-failed1.png&amp;diff=1170"/>
		<updated>2026-09-12T17:03:06Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gm-cputime1.png&amp;diff=1169</id>
		<title>File:Gm-cputime1.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gm-cputime1.png&amp;diff=1169"/>
		<updated>2026-09-12T17:02:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gm-serviceview-ok1.png&amp;diff=1168</id>
		<title>File:Gm-serviceview-ok1.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gm-serviceview-ok1.png&amp;diff=1168"/>
		<updated>2026-09-12T17:02:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gmw-hostview-ok.jpg&amp;diff=1167</id>
		<title>File:Gmw-hostview-ok.jpg</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gmw-hostview-ok.jpg&amp;diff=1167"/>
		<updated>2026-09-12T17:01:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Grafana_Mobile_Alert_Dashboard&amp;diff=1166</id>
		<title>Grafana Mobile Alert Dashboard</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Grafana_Mobile_Alert_Dashboard&amp;diff=1166"/>
		<updated>2026-09-12T17:00:18Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;Grafana Mobile Alerts is a custom monitoring dashboard implemented in Python with Flask. It is designed to provide a mobile-friendly view of Grafana alert rules, combining live alert state, historical trends, and rule management in a single interface. The application retrieves alert data from Grafana’s rules and provisioning APIs, correlates it with Prometheus time-series data, and renders a compact operational overview for on-call users who need to assess system healt...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Grafana Mobile Alerts is a custom monitoring dashboard implemented in Python with Flask. It is designed to provide a mobile-friendly view of Grafana alert rules, combining live alert state, historical trends, and rule management in a single interface. The application retrieves alert data from Grafana’s rules and provisioning APIs, correlates it with Prometheus time-series data, and renders a compact operational overview for on-call users who need to assess system health quickly from a phone or tablet.&lt;br /&gt;
&lt;br /&gt;
The system is organized around a host-centric and service-centric model. Alerts are associated with labels such as hostname and servicename, allowing the interface to group rules by machine and by service category. This grouping was explicitly intended to resemble the operational structure used by Icinga, where alerts are usually understood in terms of hosts and services rather than only as abstract Grafana rule groups. In other words, the dashboard was built to feel closer to classic Nagios/Icinga-style monitoring, even though the underlying alert engine is Grafana and the data source is Prometheus.&lt;br /&gt;
&lt;br /&gt;
A distinguishing feature is that it supports multiple views: a general alert overview, host-based drill-down, service-group drill-down, detailed rule inspection, and rule pause/resume controls. It also includes interactive charting for metric history, alert-state transition history, and support for authentication, session handling, and secure access. The overall goal is to bridge modern Grafana alerting with a familiar infrastructure-monitoring workflow that is easier to navigate during incidents and closer to traditional monitoring practices.&lt;br /&gt;
&lt;br /&gt;
Design intent&lt;br /&gt;
*Host grouping and service grouping were shaped to be more familiar to operators coming from Icinga and similar monitoring systems.&lt;br /&gt;
*The dashboard favors operational clarity over raw Grafana rule structure.&lt;br /&gt;
*It emphasizes quick triage, status aggregation, and mobile usability for incident response.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Screenshots=&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width: 50%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
*&#039;&#039;&#039;Hosts OK&#039;&#039;&#039;&lt;br /&gt;
[[image:gmw-hostview-ok.jpg|320px|left]]&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
*&#039;&#039;&#039;Services OK&#039;&#039;&#039;&lt;br /&gt;
[[image:gm-serviceview-ok1.png|320px|left]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width: 50%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
*&#039;&#039;&#039;Details&#039;&#039;&#039;&lt;br /&gt;
[[image:gm-details.png|320px|left]]&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
*&#039;&#039;&#039;CPU Time&#039;&#039;&#039;&lt;br /&gt;
[[image:gm-cputime1.png|320px|left]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width: 50%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
*&#039;&#039;&#039;Hosts Failed&#039;&#039;&#039;&lt;br /&gt;
[[image:gm-host-failed.png|320px|left]]&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
*&#039;&#039;&#039;Summary Failwd&#039;&#039;&#039;&lt;br /&gt;
[[image:gm-summary-failed1.png|320px|left]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gm-hostview-ok.jpg&amp;diff=1165</id>
		<title>File:Gm-hostview-ok.jpg</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gm-hostview-ok.jpg&amp;diff=1165"/>
		<updated>2026-09-12T16:59:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gm-summary-failed.png&amp;diff=1164</id>
		<title>File:Gm-summary-failed.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gm-summary-failed.png&amp;diff=1164"/>
		<updated>2026-09-12T16:59:30Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gm-serviceview-ok.png&amp;diff=1163</id>
		<title>File:Gm-serviceview-ok.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gm-serviceview-ok.png&amp;diff=1163"/>
		<updated>2026-09-12T16:59:08Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gm-details.png&amp;diff=1162</id>
		<title>File:Gm-details.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gm-details.png&amp;diff=1162"/>
		<updated>2026-09-12T16:58:56Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gm-cputime.png&amp;diff=1161</id>
		<title>File:Gm-cputime.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gm-cputime.png&amp;diff=1161"/>
		<updated>2026-09-12T16:58:38Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Gm-host-failed.png&amp;diff=1160</id>
		<title>File:Gm-host-failed.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Gm-host-failed.png&amp;diff=1160"/>
		<updated>2026-09-12T16:58:28Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Summary-failed.jpg&amp;diff=1159</id>
		<title>File:Summary-failed.jpg</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Summary-failed.jpg&amp;diff=1159"/>
		<updated>2026-09-12T16:07:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Serviceview-ok.jpg&amp;diff=1158</id>
		<title>File:Serviceview-ok.jpg</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Serviceview-ok.jpg&amp;diff=1158"/>
		<updated>2026-09-12T16:07:30Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Hostview-ok.jpg&amp;diff=1157</id>
		<title>File:Hostview-ok.jpg</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Hostview-ok.jpg&amp;diff=1157"/>
		<updated>2026-09-12T16:07:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Details.jpg&amp;diff=1156</id>
		<title>File:Details.jpg</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Details.jpg&amp;diff=1156"/>
		<updated>2026-09-12T16:07:12Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Cputime.jpg&amp;diff=1155</id>
		<title>File:Cputime.jpg</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Cputime.jpg&amp;diff=1155"/>
		<updated>2026-09-12T16:07:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Host-failed.jpeg&amp;diff=1154</id>
		<title>File:Host-failed.jpeg</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Host-failed.jpeg&amp;diff=1154"/>
		<updated>2026-09-12T16:06:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Main_Page&amp;diff=1153</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Main_Page&amp;diff=1153"/>
		<updated>2026-08-24T13:01:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to Coolscript&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;width:100%; vertical-align: top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are just a few scripts which you may use for your IT-System purposes. This site is almost new and more scripts will follow soon.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Logrotation and file archive management script: || &#039;&#039;&#039;[[Logd]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Eventlog to Firewall script for Windows 2008: || &#039;&#039;&#039;[[Eventlog to Firewall]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Syslog to Firewall script for Linux: || &#039;&#039;&#039;[[Syslog_to_Firewall]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Scheduled Task for Windows: || &#039;&#039;&#039;[[Scheduled Task for Windows]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Spamassassin Plugin for Geo purposes: || &#039;&#039;&#039;[[GeoMailSearch]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Raspberry Projects || &#039;&#039;&#039;[[RaspberryProjects]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PSAD to Iptables: || &#039;&#039;&#039;[[psad2ipt]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Icinga2 Web Interface for Smartphones || &#039;&#039;&#039;[[i2Mobile]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Backup Hyper-V Disk || &#039;&#039;&#039;[[Backup Virtual-Hard-Disk]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| HCP || &#039;&#039;&#039;[[HTTP_Copy]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Fail to NFT || &#039;&#039;&#039;[[Fail2nft]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Easy DynDNS with Cloudflare || &#039;&#039;&#039;[[Cfddns]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| OpenVPN automation: || &#039;&#039;&#039;[[OpenVPN_Rapid_Installer]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|style=&amp;quot;width:40%; vertical-align: top;&amp;quot;|&lt;br /&gt;
[[image:script-image-main.png|600px|left]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=My other sites which might be useful=&lt;br /&gt;
{|&lt;br /&gt;
| About IP v4/v6 and locations to lat/lon: || https://coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| About IP v4/v6, lat/lon to json: || https://api.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo XML API Wiki: || https://wiki.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo Json API Wiki: || https://wiki.api.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| The Coolgeo Mobile view: || http://m.coolgeo.net&lt;br /&gt;
|-&lt;br /&gt;
| Another password creator || https://password.coolscript.net&lt;br /&gt;
|-&lt;br /&gt;
| Analyze your mail header: || https://mailheader.net&lt;br /&gt;
|-&lt;br /&gt;
| LinuxVirtualServer manager: || https://mylvs.coolscript.net&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions, feedback or recommendations are welcome, drop me a mail to postmaster at coolscript.net.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Shell_installer_scripts&amp;diff=1152</id>
		<title>Shell installer scripts</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Shell_installer_scripts&amp;diff=1152"/>
		<updated>2026-07-28T17:07:10Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;= Shell Installer Scripts =  Self-contained Bash installers for VPS setup. All Telegram-aware scripts read credentials from &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; (owner &amp;lt;code&amp;gt;root:root&amp;lt;/code&amp;gt;, permissions &amp;lt;code&amp;gt;600&amp;lt;/code&amp;gt;). Scripts that require it interactively prompt for missing values during execution; &amp;lt;code&amp;gt;install-shutdown-notify.sh&amp;lt;/code&amp;gt; is the exception and performs a hard abort if the file is absent.  Remote execution pattern (all scripts): &amp;lt;pre&amp;gt; curl -s https://coolsc...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shell Installer Scripts =&lt;br /&gt;
&lt;br /&gt;
Self-contained Bash installers for VPS setup. All Telegram-aware scripts read credentials from &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; (owner &amp;lt;code&amp;gt;root:root&amp;lt;/code&amp;gt;, permissions &amp;lt;code&amp;gt;600&amp;lt;/code&amp;gt;). Scripts that require it interactively prompt for missing values during execution; &amp;lt;code&amp;gt;install-shutdown-notify.sh&amp;lt;/code&amp;gt; is the exception and performs a hard abort if the file is absent.&lt;br /&gt;
&lt;br /&gt;
Remote execution pattern (all scripts):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -s https://coolscript.net/download/shell/&amp;lt;script-name&amp;gt;.sh | sudo bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Security:&#039;&#039;&#039; piping curl to bash executes unreviewed remote code — only use against URLs you control.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-sudo.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;su -c &#039;curl -s https://coolscript.net/download/shell/install-sudo.sh | bash&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; (if missing) and adds a target non-root user to the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group. This is required first on Debian systems that start without &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; preinstalled. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Root required.&#039;&#039;&#039; Run as root (for example: &amp;lt;code&amp;gt;su -&amp;lt;/code&amp;gt;) before executing. You can pass a username as the first script argument; if omitted, the script uses &amp;lt;code&amp;gt;$SUDO_USER&amp;lt;/code&amp;gt; or prompts.&lt;br /&gt;
&lt;br /&gt;
== Installation Flow ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ run as root ] ──► detect target user (arg / $SUDO_USER / prompt)&lt;br /&gt;
                      │&lt;br /&gt;
                      ▼&lt;br /&gt;
             user exists?&lt;br /&gt;
             ├── NO  → abort&lt;br /&gt;
             └── YES → continue&lt;br /&gt;
                      │&lt;br /&gt;
                      ▼&lt;br /&gt;
             sudo installed?&lt;br /&gt;
             ├── YES → skip install&lt;br /&gt;
             └── NO  → apt update &amp;amp;&amp;amp; apt install sudo&lt;br /&gt;
                      │&lt;br /&gt;
                      ▼&lt;br /&gt;
             user in sudo group?&lt;br /&gt;
             ├── YES → skip&lt;br /&gt;
             └── NO  → usermod -aG sudo &amp;lt;user&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* Required first step for minimal Debian images that do not include &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;&lt;br /&gt;
* Group change applies on next login session&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-telegram-ssh-alert.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-telegram-ssh-alert.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hooks a Telegram alert into the PAM SSH stack so every successful SSH login sends a message. Uses &amp;lt;code&amp;gt;pam_exec&amp;lt;/code&amp;gt; with the &amp;lt;code&amp;gt;optional&amp;lt;/code&amp;gt; keyword — alert failure never blocks login. The installer is idempotent (checks for existing PAM line before appending).&lt;br /&gt;
&lt;br /&gt;
== /etc/telegram.conf ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Must exist and contain valid non-empty values.&#039;&#039;&#039; If absent or incomplete the installer pauses and prompts interactively — credentials can be entered inline during &amp;lt;code&amp;gt;curl | bash&amp;lt;/code&amp;gt; execution.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Telegram Alert Configuration&lt;br /&gt;
TELEGRAM_CHAT_ID=&amp;quot;-1xxx&amp;quot;&lt;br /&gt;
TELEGRAM_BOT_TOKEN=&amp;quot;53xxxxx&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TELEGRAM_CHAT_ID&amp;lt;/code&amp;gt;: negative values are group/channel IDs. &amp;lt;code&amp;gt;TELEGRAM_BOT_TOKEN&amp;lt;/code&amp;gt;: issued by &amp;lt;code&amp;gt;@BotFather&amp;lt;/code&amp;gt;. Permissions applied automatically; to reapply manually:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown root:root /etc/telegram.conf &amp;amp;&amp;amp; chmod 600 /etc/telegram.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alert Script ==&lt;br /&gt;
&lt;br /&gt;
Written to &amp;lt;code&amp;gt;/usr/local/bin/telegram-ssh-alert.sh&amp;lt;/code&amp;gt;. Fires only on &amp;lt;code&amp;gt;PAM_TYPE=open_session&amp;lt;/code&amp;gt;; ignores auth failures and session close. Sent asynchronously (&amp;lt;code&amp;gt;curl ... &amp;amp;&amp;lt;/code&amp;gt;) — zero login latency impact.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Variable !! Source !! Content&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PAM_USER&amp;lt;/code&amp;gt; || PAM || Logged-in username&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PAM_RHOST&amp;lt;/code&amp;gt; || PAM || Remote client IP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;hostname&amp;lt;/code&amp;gt; || syscall || VPS hostname&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; || syscall || Timestamp &amp;lt;code&amp;gt;YYYY-MM-DD HH:MM:SS&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Message format (HTML parse mode):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
🚨 SSH Access Alert&lt;br /&gt;
───────────────&lt;br /&gt;
👤 User:       testuser&lt;br /&gt;
🖥️ Host:       my-vps-hostname&lt;br /&gt;
🌐 IP Address: 203.0.113.42&lt;br /&gt;
⏰ Time:       2026-07-27 14:35:00&lt;br /&gt;
───────────────&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
API call:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -s -X POST &amp;quot;https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage&amp;quot; \&lt;br /&gt;
    -d &amp;quot;chat_id=${TELEGRAM_CHAT_ID}&amp;quot; \&lt;br /&gt;
    -d &amp;quot;parse_mode=HTML&amp;quot; \&lt;br /&gt;
    -d &amp;quot;text=${MESSAGE}&amp;quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PAM Line ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session optional pam_exec.so /usr/local/bin/telegram-ssh-alert.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation Flow ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ curl | bash ] ──► root check&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              /etc/telegram.conf exists?&lt;br /&gt;
              ├── YES → variables non-empty? ──► YES → continue&lt;br /&gt;
              │                              └── NO  → prompt&lt;br /&gt;
              └── NO  → prompt&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              Write + chmod +x /usr/local/bin/telegram-ssh-alert.sh&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              PAM line in /etc/pam.d/sshd?&lt;br /&gt;
              ├── YES → skip&lt;br /&gt;
              └── NO  → append&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              Live test: PAM_TYPE=open_session PAM_USER=InstallerTest PAM_RHOST=127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Perm !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; || 600 || Credentials — must be valid&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/usr/local/bin/telegram-ssh-alert.sh&amp;lt;/code&amp;gt; || +x || PAM-invoked alert script&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; || — || PAM config (one line appended)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Cause !! Fix&lt;br /&gt;
|-&lt;br /&gt;
| No notification on login || &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; missing or placeholder values || Recreate from template; rerun installer&lt;br /&gt;
|-&lt;br /&gt;
| Login blocked || PAM line uses &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;optional&amp;lt;/code&amp;gt; || Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to use &amp;lt;code&amp;gt;optional&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Test works, live SSH does not || PAM cannot read config (wrong permissions) || &amp;lt;code&amp;gt;chmod 600 /etc/telegram.conf&amp;lt;/code&amp;gt;, owner must be &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curl: command not found&amp;lt;/code&amp;gt; || curl absent || &amp;lt;code&amp;gt;apt install curl&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;yum install curl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate PAM entries || Installer run multiple times || Remove duplicate lines from &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-boot-notify.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-boot-notify.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs a systemd one-shot service (&amp;lt;code&amp;gt;After=network-online.target&amp;lt;/code&amp;gt;) that sends hostname, local IP, public IP (&amp;lt;code&amp;gt;ifconfig.me&amp;lt;/code&amp;gt;), and timestamp to Telegram on every boot.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Root required.&#039;&#039;&#039; Interactive — prompts for credentials if &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; is absent or incomplete (same flow as SSH alert installer). Config file created with &amp;lt;code&amp;gt;chmod 600&amp;lt;/code&amp;gt; automatically.&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Perm !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/usr/local/bin/telegram-boot-notify.sh&amp;lt;/code&amp;gt; || 700 || Notification script&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/systemd/system/telegram-boot-notify.service&amp;lt;/code&amp;gt; || — || Systemd unit (enabled automatically)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; || 600 || Credentials — created if absent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Systemd Unit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Send Telegram notification with IP address on startup&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/local/bin/telegram-boot-notify.sh&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;RemainAfterExit=yes&amp;lt;/code&amp;gt; keeps the unit active after script exit so &amp;lt;code&amp;gt;systemctl status&amp;lt;/code&amp;gt; shows the last run result.&lt;br /&gt;
&lt;br /&gt;
== Notification ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
🚀 Server Boot Notification&lt;br /&gt;
&lt;br /&gt;
🖥 Host:       my-vps-hostname&lt;br /&gt;
📅 Date &amp;amp; Time: 2026-07-27 09:00:00 UTC&lt;br /&gt;
&lt;br /&gt;
📡 IP Addresses:&lt;br /&gt;
• Local IP:  10.0.0.5&lt;br /&gt;
• Public IP: 203.0.113.42&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uses Markdown parse mode. Local IP via &amp;lt;code&amp;gt;ip route get 1.1.1.1&amp;lt;/code&amp;gt;; public IP via &amp;lt;code&amp;gt;curl ifconfig.me&amp;lt;/code&amp;gt; (10 s timeout, falls back to &amp;quot;Unavailable&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-shutdown-notify.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-shutdown-notify.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs a systemd service that fires a Telegram notification on shutdown or reboot. Detects event type by inspecting active systemd jobs at stop time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Root required.&#039;&#039;&#039; &#039;&#039;&#039;&amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; must already exist with valid values — this script performs a hard abort if missing or empty. It does not prompt interactively.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Validate before running:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source /etc/telegram.conf &amp;amp;&amp;amp; echo &amp;quot;$TELEGRAM_BOT_TOKEN&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;$TELEGRAM_CHAT_ID&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Perm !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/usr/local/bin/telegram-shutdown-notify.sh&amp;lt;/code&amp;gt; || 700 || Notification script&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/systemd/system/telegram-shutdown-notify.service&amp;lt;/code&amp;gt; || — || Systemd unit (enabled automatically)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Systemd Unit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Send Telegram notification on system shutdown or reboot&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network-online.target time-sync.target&lt;br /&gt;
Requires=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/bin/true&lt;br /&gt;
ExecStop=/usr/local/bin/telegram-shutdown-notify.sh&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The notification runs from &amp;lt;code&amp;gt;ExecStop&amp;lt;/code&amp;gt; — triggered when systemd stops the unit during shutdown, while the network is still up. &amp;lt;code&amp;gt;DefaultDependencies=no&amp;lt;/code&amp;gt; prevents default shutdown ordering from running the unit too late.&lt;br /&gt;
&lt;br /&gt;
== Event Detection ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Detected job !! Message label&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reboot.target&amp;lt;/code&amp;gt; starting || Rebooting 🔄&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;poweroff.target&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;halt.target&amp;lt;/code&amp;gt; starting || Shutting Down 🛑&lt;br /&gt;
|-&lt;br /&gt;
| None matched || Stopping / Shutting Down 🛑&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notification ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
🛑 Server Event: Shutting Down 🛑&lt;br /&gt;
&lt;br /&gt;
🖥 Host:    my-vps-hostname&lt;br /&gt;
📅 Date &amp;amp; Time: 2026-07-27 23:59:00 UTC&lt;br /&gt;
⏱ Uptime before event: up 3 days, 4 hours, 12 minutes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-clean-shutdown.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-clean-shutdown.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs a udev rule that triggers &amp;lt;code&amp;gt;shutdown -h now&amp;lt;/code&amp;gt; when a USB stick with the filesystem label &amp;lt;code&amp;gt;RASPI-CLEAN-SHUTDOWN&amp;lt;/code&amp;gt; is inserted. Designed for Raspberry Pi but works on any udev-based Linux system. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
Primarily used on Raspberry Pi hosts for clean power-off without keyboard/network access.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Root required.&#039;&#039;&#039; If the script or rule already exists the installer asks before overwriting; declining skips that component without aborting.&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/usr/local/bin/usb-clean-shutdown.sh&amp;lt;/code&amp;gt; || Logs via &amp;lt;code&amp;gt;logger -t raspi-shutdown&amp;lt;/code&amp;gt; then calls &amp;lt;code&amp;gt;shutdown -h now&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/udev/rules.d/90-raspi-shutdown.rules&amp;lt;/code&amp;gt; || udev rule — watches block devices for the label&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== udev Rule ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;block&amp;quot;, ENV{ID_FS_LABEL}==&amp;quot;RASPI-CLEAN-SHUTDOWN&amp;quot;, RUN+=&amp;quot;/usr/local/bin/usb-clean-shutdown.sh&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fires on &amp;lt;code&amp;gt;ACTION==add&amp;lt;/code&amp;gt; (insert), &amp;lt;code&amp;gt;SUBSYSTEM==block&amp;lt;/code&amp;gt;, label match is case-sensitive.&lt;br /&gt;
&lt;br /&gt;
== Prepare the USB Stick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FAT32&lt;br /&gt;
mkfs.vfat -n RASPI-CLEAN-SHUTDOWN /dev/sdX&lt;br /&gt;
&lt;br /&gt;
# ext4&lt;br /&gt;
mkfs.ext4 -L RASPI-CLEAN-SHUTDOWN /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verify the label before use: &amp;lt;code&amp;gt;lsblk -o NAME,LABEL&amp;lt;/code&amp;gt;. Confirm syslog entry after trigger: &amp;lt;code&amp;gt;journalctl -t raspi-shutdown&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-fzf.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-fzf.sh | bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs &amp;lt;code&amp;gt;fzf&amp;lt;/code&amp;gt; via &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; and appends the keybinding source line to &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. Idempotent — skips append if the line is already present. No root required (uses &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; internally for apt). No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
Apply after install: &amp;lt;code&amp;gt;source ~/.bashrc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keybindings ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Key !! Action&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl+R || Fuzzy search shell history&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl+T || Fuzzy-find file, paste path to prompt&lt;br /&gt;
|-&lt;br /&gt;
| Alt+C || Fuzzy-find directory and &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into it&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The installer auto-detects the keybindings file from three standard paths (&amp;lt;code&amp;gt;/usr/share/doc/fzf/examples/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/usr/share/fzf/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/usr/share/doc/fzf/&amp;lt;/code&amp;gt;). Exits with an error if none exist — this can occur on non-Debian distributions.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-prompt.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-prompt.sh | bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets a colourful &amp;lt;code&amp;gt;PS1&amp;lt;/code&amp;gt; prompt in &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. No root required. No Telegram dependency. Idempotent — checks for ANSI codes &amp;lt;code&amp;gt;01;31m&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;01;35m&amp;lt;/code&amp;gt; before appending.&lt;br /&gt;
&lt;br /&gt;
Apply after install: &amp;lt;code&amp;gt;source ~/.bashrc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prompt ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@hostname /current/directory $&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Element !! Colour&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\u&amp;lt;/code&amp;gt; (user) || Bold red &amp;lt;code&amp;gt;01;31m&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\h&amp;lt;/code&amp;gt; (host) || Bold cyan &amp;lt;code&amp;gt;01;36m&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\w&amp;lt;/code&amp;gt; (path) || Bold yellow &amp;lt;code&amp;gt;01;33m&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Bold magenta &amp;lt;code&amp;gt;01;35m&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-neofetch.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-neofetch.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs &amp;lt;code&amp;gt;neowofetch&amp;lt;/code&amp;gt; via &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; and creates a global profile trigger at &amp;lt;code&amp;gt;/etc/profile.d/neowofetch-ssh.sh&amp;lt;/code&amp;gt; that automatically runs &amp;lt;code&amp;gt;neowofetch&amp;lt;/code&amp;gt; for any user logging in via SSH. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
Apply immediately without rebooting: open a new SSH session.&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Perm !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/profile.d/neowofetch-ssh.sh&amp;lt;/code&amp;gt; || 644 || Global profile trigger — runs &amp;lt;code&amp;gt;neowofetch&amp;lt;/code&amp;gt; on SSH login&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Profile Trigger ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Auto-run neowofetch on SSH login for all users&lt;br /&gt;
if [ -n &amp;quot;$SSH_CLIENT&amp;quot; ] || [ -n &amp;quot;$SSH_TTY&amp;quot; ]; then&lt;br /&gt;
    # Run only if standard output is a TTY and NOT running under sudo/sudo -i&lt;br /&gt;
    if [ -t 1 ] &amp;amp;&amp;amp; [ -z &amp;quot;$SUDO_USER&amp;quot; ]; then&lt;br /&gt;
        neowofetch&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conditions for execution:&lt;br /&gt;
* &amp;lt;code&amp;gt;SSH_CLIENT&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SSH_TTY&amp;lt;/code&amp;gt; is set — real SSH session&lt;br /&gt;
* stdout is a TTY (&amp;lt;code&amp;gt;-t 1&amp;lt;/code&amp;gt;) — suppresses output in non-interactive contexts (e.g., &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt;, automated scripts)&lt;br /&gt;
* &amp;lt;code&amp;gt;SUDO_USER&amp;lt;/code&amp;gt; is unset — does not fire again for &amp;lt;code&amp;gt;sudo -i&amp;lt;/code&amp;gt; shells inside an existing session&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-core-tools.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-core-tools.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs a comprehensive set of development, networking, and shell utility packages via &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; in a single pass. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Group !! Packages&lt;br /&gt;
|-&lt;br /&gt;
| Build tools || &amp;lt;code&amp;gt;build-essential&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gdb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;valgrind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ninja-build&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pkg-config&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Version control || &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;git-lfs&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Python || &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;python3-pip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;python3-venv&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Dev libraries || &amp;lt;code&amp;gt;libssl-dev&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;libffi-dev&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;zlib1g-dev&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Network (config) || &amp;lt;code&amp;gt;iproute2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;net-tools&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;iputils-ping&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;traceroute&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mtr-tiny&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dnsutils&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Network (probe) || &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nmap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;socat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;netcat-openbsd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Network (monitor) || &amp;lt;code&amp;gt;iftop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nload&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Shell utilities || &amp;lt;code&amp;gt;htop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jq&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tmux&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-docker.sh =&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Run on VPS&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-docker.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs Docker CE from the official Docker apt repository using the distro&#039;s GPG key. Adds the invoking user to the &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; group. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Root required.&#039;&#039;&#039; Group membership takes effect after logout/login or &amp;lt;code&amp;gt;newgrp docker&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Installation Flow ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ curl | bash ] ──► Install prerequisites (ca-certificates, curl)&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              Add Docker GPG key → /etc/apt/keyrings/docker.asc&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              Add apt source → /etc/apt/sources.list.d/docker.list&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              apt update &amp;amp;&amp;amp; install docker-ce, docker-ce-cli, containerd.io,&lt;br /&gt;
                                    docker-buildx-plugin, docker-compose-plugin&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              usermod -aG docker $USER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/apt/keyrings/docker.asc&amp;lt;/code&amp;gt; || Docker signing key (&amp;lt;code&amp;gt;chmod a+r&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/apt/sources.list.d/docker.list&amp;lt;/code&amp;gt; || Docker apt repository entry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Packages Installed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Package !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docker-ce&amp;lt;/code&amp;gt; || Docker daemon&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docker-ce-cli&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; CLI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;containerd.io&amp;lt;/code&amp;gt; || Container runtime&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docker-buildx-plugin&amp;lt;/code&amp;gt; || Multi-platform image builds&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docker-compose-plugin&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; subcommand&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Summary =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Script !! Root !! /etc/telegram.conf !! Mechanism !! Interactive !! curl install&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-sudo.sh&amp;lt;/code&amp;gt; || Yes (must run as root) || Not used || apt sudo install + &amp;lt;code&amp;gt;usermod -aG sudo&amp;lt;/code&amp;gt; || Yes — may prompt for username || &amp;lt;code&amp;gt;su -c &#039;curl -s https://coolscript.net/download/shell/install-sudo.sh &amp;amp;#124; bash -s username&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-prompt.sh&amp;lt;/code&amp;gt; || No || Not used || &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; PS1 || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-prompt.sh &amp;amp;#124; bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-fzf.sh&amp;lt;/code&amp;gt; || No (sudo inside) || Not used || apt + &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-fzf.sh &amp;amp;#124; bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-core-tools.sh&amp;lt;/code&amp;gt; || Yes (sudo inside) || Not used || apt bulk install || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-core-tools.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-docker.sh&amp;lt;/code&amp;gt; || Yes || Not used || Official Docker apt repo + GPG key || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-docker.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-telegram-ssh-alert.sh&amp;lt;/code&amp;gt; || Yes || Creates if missing || PAM &amp;lt;code&amp;gt;pam_exec optional&amp;lt;/code&amp;gt; || Yes — credential prompt || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-telegram-ssh-alert.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-boot-notify.sh&amp;lt;/code&amp;gt; || Yes || Creates if missing || systemd one-shot || Yes — credential prompt || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-boot-notify.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-shutdown-notify.sh&amp;lt;/code&amp;gt; || Yes || &#039;&#039;&#039;Must exist&#039;&#039;&#039; (hard abort) || systemd &amp;lt;code&amp;gt;ExecStop&amp;lt;/code&amp;gt; || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-shutdown-notify.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-clean-shutdown.sh&amp;lt;/code&amp;gt; || Yes || Not used || udev block rule for Raspberry || Yes — overwrite prompt || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-clean-shutdown.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-neofetch.sh&amp;lt;/code&amp;gt; || Yes (sudo inside) || Not used || &amp;lt;code&amp;gt;/etc/profile.d&amp;lt;/code&amp;gt; global trigger || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-neofetch.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Recommended Installation Order ==&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;install-sudo.sh&amp;lt;/code&amp;gt; — required first on Debian images where &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; is not installed&lt;br /&gt;
# &amp;lt;code&amp;gt;install-prompt.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;install-fzf.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;install-core-tools.sh&amp;lt;/code&amp;gt; — standalone, no ordering constraint&lt;br /&gt;
# &amp;lt;code&amp;gt;install-docker.sh&amp;lt;/code&amp;gt; — standalone, no ordering constraint&lt;br /&gt;
# &amp;lt;code&amp;gt;create /etc/telegram.conf&amp;lt;/code&amp;gt; — add TELEGRAM_CHAT_ID and TELEGRAM_BOT_TOKEN&lt;br /&gt;
# &amp;lt;code&amp;gt;install-telegram-ssh-alert.sh&amp;lt;/code&amp;gt; — creates &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; interactively&lt;br /&gt;
# &amp;lt;code&amp;gt;install-boot-notify.sh&amp;lt;/code&amp;gt; — reuses or creates &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;install-shutdown-notify.sh&amp;lt;/code&amp;gt; — requires &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; to already exist&lt;br /&gt;
# &amp;lt;code&amp;gt;install-clean-shutdown.sh&amp;lt;/code&amp;gt; — standalone, no ordering constraint&lt;br /&gt;
# &amp;lt;code&amp;gt;install-neofetch.sh&amp;lt;/code&amp;gt; — standalone, no ordering constraint&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Ollama_Modelfile_List&amp;diff=1151</id>
		<title>Ollama Modelfile List</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Ollama_Modelfile_List&amp;diff=1151"/>
		<updated>2026-05-28T11:31:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;This is a local Ollama installation running on a powerful local GPU.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
This page serves as a comprehensive technical registry and capabilities guide for the locally installed Ollama Large Language Models (LLMs). It outlines their core architecture, performance profiles, memory usage, and safety alignment status.&lt;br /&gt;
&lt;br /&gt;
== Local Hardware Performance Overview ==&lt;br /&gt;
The following estimates assume full GPU offloading utilizing a high-end local GPU layout. Splitting models onto system RAM will heavily degrade these numbers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikibase&amp;quot; style=&amp;quot;width:100%; border:1px solid #ccc; border-collapse:collapse; text-align:left;&amp;quot;&lt;br /&gt;
! Scope / Scale&lt;br /&gt;
! Parameter Range&lt;br /&gt;
! Avg. VRAM Footprint&lt;br /&gt;
! Speed (Tokens/sec)&lt;br /&gt;
! Context Latency (TTFT)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;High-Capability&#039;&#039;&#039;&lt;br /&gt;
| 20B – 31B&lt;br /&gt;
| 16 GB – 24 GB&lt;br /&gt;
| 20 – 35 tok/s&lt;br /&gt;
| Moderate (~1.5s - 3.0s)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Mid-Range / Specialist&#039;&#039;&#039;&lt;br /&gt;
| 8B – 16B&lt;br /&gt;
| 6 GB – 14 GB&lt;br /&gt;
| 40 – 65 tok/s&lt;br /&gt;
| Low (~0.8s - 1.5s)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Low-Resource / Edge&#039;&#039;&#039;&lt;br /&gt;
| 1B – 7B&lt;br /&gt;
| 2 GB – 6 GB&lt;br /&gt;
| 70 – 120+ tok/s&lt;br /&gt;
| Near-Instant (&amp;lt;0.5s)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Capability Comparison Matrix ==&lt;br /&gt;
Ratings are practical local-workflow estimates on a 1-5 scale (5 = strongest). Speech and Image scores reflect end-to-end usefulness when paired with local ASR/TTS or VLM pipelines.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikibase&amp;quot; style=&amp;quot;width:100%; border:1px solid #ccc; border-collapse:collapse; text-align:left;&amp;quot;&lt;br /&gt;
! Model&lt;br /&gt;
! Text&lt;br /&gt;
! Speech&lt;br /&gt;
! Python&lt;br /&gt;
! Image&lt;br /&gt;
! Speed&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| gemma-4-31b-uncensored&lt;br /&gt;
| 5&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| Top-tier long-form reasoning and writing depth.&lt;br /&gt;
|-&lt;br /&gt;
| qwen3-coder:30b&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| Best overall local coding model for complex repos.&lt;br /&gt;
|-&lt;br /&gt;
| qwen3.6:27b&lt;br /&gt;
| 5&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| Strong generalist for reasoning and multilingual tasks.&lt;br /&gt;
|-&lt;br /&gt;
| gemma4:26b&lt;br /&gt;
| 5&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
| High-quality aligned model; useful in multimodal stacks.&lt;br /&gt;
|-&lt;br /&gt;
| gpt-oss:20b&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| Fast all-purpose assistant behavior.&lt;br /&gt;
|-&lt;br /&gt;
| hf.co/mradermacher/Mistral-Nemo-Instruct-2407-abliterated-i1-GGUF:Q5_K_M&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Fast and permissive instruction-following.&lt;br /&gt;
|-&lt;br /&gt;
| hf.co/MaziyarPanahi/Mistral-Nemo-Instruct-2407-GGUF:Q5_K_M&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Stable, predictable 12B instruction model.&lt;br /&gt;
|-&lt;br /&gt;
| MFDoom/deepseek-coder-v2-tool-calling:16b&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Great for agent/tool-call workflows.&lt;br /&gt;
|-&lt;br /&gt;
| deepseek-coder-v2:16b&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Excellent raw coding throughput.&lt;br /&gt;
|-&lt;br /&gt;
| qwen3:14b&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Balanced mid-size general model.&lt;br /&gt;
|-&lt;br /&gt;
| qwen2.5:14b&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Reliable instruction quality with strong consistency.&lt;br /&gt;
|-&lt;br /&gt;
| mistral-nemo:12b&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Strong multilingual and summarization performance.&lt;br /&gt;
|-&lt;br /&gt;
| qwen2.5-coder:14b&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Mature coding model with high syntax reliability.&lt;br /&gt;
|-&lt;br /&gt;
| gemma3:12b&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Efficient everyday productivity model.&lt;br /&gt;
|-&lt;br /&gt;
| gemma4:e4b&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
| 4&lt;br /&gt;
| Lightweight Gemma 4 variant with multimodal utility.&lt;br /&gt;
|-&lt;br /&gt;
| gemma2:9b&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Fast, low-overhead generalist. Fast grammar check&lt;br /&gt;
|-&lt;br /&gt;
| hf.co/NousResearch/Hermes-3-Llama-3.1-8B-GGUF:Q5_K_M&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Creative and permissive conversational behavior.&lt;br /&gt;
|-&lt;br /&gt;
| gemma4-8b-uncensored:latest&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| Unrestricted 8B with good speed/quality balance.&lt;br /&gt;
|-&lt;br /&gt;
| dolphin-2.9-8b:latest&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Unfiltered assistant style; weaker on precise coding.&lt;br /&gt;
|-&lt;br /&gt;
| hf.co/Qwen/Qwen3-8B-GGUF:Q4_K_M&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| Lean baseline for low-latency local chat.&lt;br /&gt;
|-&lt;br /&gt;
| qwen2.5-coder:7b&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| Great speed for IDE autocomplete loops.&lt;br /&gt;
|-&lt;br /&gt;
| qwen7b-32k:latest&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| Useful when very long context is required.&lt;br /&gt;
|-&lt;br /&gt;
| llama3.2:latest&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| Ultra-fast small general assistant.&lt;br /&gt;
|-&lt;br /&gt;
| qwen2.5-coder:3b&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| Compact coding model for constrained hardware.&lt;br /&gt;
|-&lt;br /&gt;
| qwen3b-high-ctx:latest&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| Good small-model option for bigger contexts.&lt;br /&gt;
|-&lt;br /&gt;
| deepseek-r1:1.5b&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| Tiny reasoning model; best for lightweight logic tests.&lt;br /&gt;
|-&lt;br /&gt;
| smollm2-uncensored:latest&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| Minimal-footprint uncensored utility model.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== High-Capability &amp;amp; Large-Scale Models (15B - 31B) ==&lt;br /&gt;
&lt;br /&gt;
=== gemma-4-31b-uncensored ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A highly capable, large-scale model based on the Google Gemma 4 architecture, modified to bypass standard safety guardrails.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Complex reasoning, deep creative writing, philosophical exploration, and processing intricate multi-step prompts without refusal barriers.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~31 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~20.5 GB (Quantized)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Generates ~22-26 tokens/sec. High reasoning overhead can cause a slightly delayed Time-To-First-Token (TTFT) of 2-3 seconds.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored / Abliterated&amp;lt;/span&amp;gt; – All standard safety alignment filters have been removed.&lt;br /&gt;
&lt;br /&gt;
=== qwen3-coder:30b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; Alibaba&#039;s flagship open-weights coding model, optimized for enterprise-grade software engineering, architecture design, and complex debugging.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Writing full-stack applications, handling multi-file repository contexts, explaining complex algorithms, and optimizing legacy code.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~30 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~19.8 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Achieves ~25-30 tokens/sec. Processing long context inputs (codebases) will cause pre-fill latency to scale upward.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard alignment remains active to prevent malicious code generation (e.g., malware design).&lt;br /&gt;
&lt;br /&gt;
=== qwen3.6:27b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A premium, heavy-duty generalist model designed for advanced reasoning, mathematical logic, translation, and analytical workflows.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; High-fidelity data analysis, complex summarizing, multi-language translation, and acting as a central orchestration agent.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~27 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~18.2 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~28-33 tokens/sec. Consistent, stable token execution pacing.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Adheres to strict ethical, helpful, and harmless boundaries.&lt;br /&gt;
&lt;br /&gt;
=== gemma4:26b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The standard, fully-aligned iteration of Google&#039;s 26B Gemma 4 model, balancing massive parameter depth with strict safety guardrails.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Enterprise deployments, academic research assistance, and standard corporate productivity tools where safety compliance is required.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~26 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~17.5 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~30 tokens/sec. Safety evaluations add a marginal execution latency overhead to the initial response generation.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Strictly Censored&amp;lt;/span&amp;gt; – Contains default Google RLHF guardrails against sensitive, harmful, or controversial topics.&lt;br /&gt;
&lt;br /&gt;
=== gpt-oss:20b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; An open-source generalist model trained to mimic commercial GPT-style interactions across diverse task types.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; General brainstorming, text transformation, data cleaning, and everyday agentic tasks.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~20 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~14.0 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Highly responsive at ~35 tokens/sec with low overall processing latency.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:orange; font-weight:bold;&amp;quot;&amp;gt;[Partial] Lightly Censored&amp;lt;/span&amp;gt; – Usually features basic ethical boundaries but is significantly more permissive than strict corporate models.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Mid-Range &amp;amp; Specialist Models (8B - 16B) ==&lt;br /&gt;
&lt;br /&gt;
=== hf.co/mradermacher/Mistral-Nemo-Instruct-2407-abliterated-i1-GGUF:Q5_K_M ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A precision-tuned 12B parameter model combining Mistral&#039;s architecture with &amp;quot;abliteration&amp;quot; techniques to erase negative refusal weights.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Unrestricted academic research, writing intense fiction, roleplay, and analyzing controversial text datasets.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 12.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~8.9 GB (Q5_K_M layout)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Swift ~45-52 tokens/sec response generation. Near-instant text generation initialization.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored / Abliterated&amp;lt;/span&amp;gt; – Chemically stripped of refusal behaviors while retaining structural coherence.&lt;br /&gt;
&lt;br /&gt;
=== hf.co/MaziyarPanahi/Mistral-Nemo-Instruct-2407-GGUF:Q5_K_M ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The cleanly quantized, official instruction-tuned variant of the highly regarded Mistral-Nemo 12B model.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; General instruction following, structured text generation, multi-lingual translation, and logic puzzles.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 12.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~8.9 GB (Q5_K_M layout)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Highly predictable ~45-52 tokens/sec generation speed with negligible pre-fill lag.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Retains default Mistral safety alignments.&lt;br /&gt;
&lt;br /&gt;
=== MFDoom/deepseek-coder-v2-tool-calling:16b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A custom Mixture-of-Experts (MoE) fine-tune specifically optimized to act as an agentic backend capable of executing external function calls.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; AI agents, local tool integration, and automated pipeline execution.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 16 Billion Total (uses ~3.3B active parameters per token)&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~11.2 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Blazing fast inference speeds due to MoE architecture, averaging ~55-65 tokens/sec. High initial layout parsing efficiency.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Aligned to prevent execution of destructive or malicious local commands.&lt;br /&gt;
&lt;br /&gt;
=== deepseek-coder-v2:16b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The foundational Mixture-of-Experts (MoE) coding model from DeepSeek, prized for high-efficiency programming generation.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Continuous inline code completion, rapid prototyping, code refactoring, and general script writing.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 16 Billion Total&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~11.2 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~55-65 tokens/sec. Optimized for sub-second text stream delivery loops.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard guardrails against generating malware or exploits.&lt;br /&gt;
&lt;br /&gt;
=== qwen3:14b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The standard mid-tier iteration of the Qwen 3 general-purpose intelligence framework.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Summarizing lengthy documents, conversational search support, copy editing, and medium-complexity script writing.&lt;br /&gt;
* &#039;&#039;&#039;Strengths:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~14 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~10.1 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Runs fluidly at ~42-48 tokens/sec. Moderate latency scaling during lengthy prompt ingestion phases.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Fully aligned with default safety training.&lt;br /&gt;
&lt;br /&gt;
=== qwen2.5:14b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A mature 14B general-purpose model from the Qwen 2.5 family focused on reliable instruction following and balanced reasoning.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; General assistant tasks, drafting and rewriting, translation, and broad knowledge Q&amp;amp;A.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~14 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~9.8 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Consistent ~40-48 tokens/sec with modest prompt prefill latency on longer contexts.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard alignment behavior.&lt;br /&gt;
&lt;br /&gt;
=== mistral-nemo:12b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The native Ollama distribution of Mistral-Nemo 12B, optimized for instruction following and strong multilingual quality.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; General chat, document transformation, summarization, translation, and medium-depth reasoning.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~12 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~8.5 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Typically ~44-52 tokens/sec with fast startup and steady streaming.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Retains default instruction-tuned safety alignment.&lt;br /&gt;
&lt;br /&gt;
=== qwen2.5-coder:14b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The established, highly mature 14B coding engine from the Qwen 2.5 generation.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Stable software development environments requiring predictable, reliable syntax generation.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 14.8 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~10.5 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Stable ~42-48 tokens/sec. Excellent processing consistency throughout extended syntax blocks.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Features standard safety controls.&lt;br /&gt;
&lt;br /&gt;
=== gemma3:12b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A legacy mid-tier general model from Google’s third-generation open weights release.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Everyday office automation tasks, document formatting, and general QA datasets.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 12.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~8.8 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~45 tokens/sec. Low baseline generation latency.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Governed by standard Google safety alignment.&lt;br /&gt;
&lt;br /&gt;
=== gemma4:e4b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; An experimental or early-quantized/preview variant of the Gemma 4 framework optimized for edge environments.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Comparing structural generation changes between Gemma versions or running low-overhead general tasks.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~12 Billion Equivalent&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~7.9 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Spits out tokens highly efficiently at ~50 tokens/sec. Rapid initialization cycles.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard guardrails apply.&lt;br /&gt;
&lt;br /&gt;
=== gemma2:9b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; Google’s highly successful 9B parameter generalist model from the Gemma 2 era.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Low-resource conversational assistance, flashcard generation, and quick text summarization.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 9.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~6.8 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Sharp, snappy output reaching ~55 tokens/sec. Minimal processing delay.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Fully aligned.&lt;br /&gt;
&lt;br /&gt;
=== hf.co/NousResearch/Hermes-3-Llama-3.1-8B-GGUF:Q5_K_M ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A premium, creative fine-tune of Llama 3.1 8B by Nous Research, tailored for advanced roleplay, agentic steps, and complex instruction following.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Creative writing, world-building, intricate multi-turn roleplay, and agentic workflows.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 8.0 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~5.9 GB (Q5_K_M execution footprint)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Highly responsive ~60 tokens/sec stream velocity. Instant initial output response behavior.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:orange; font-weight:bold;&amp;quot;&amp;gt;[Partial] Highly Permissive&amp;lt;/span&amp;gt; – While not aggressively abliterated, it is fine-tuned to be neutral, non-preachy, and almost entirely free of false-positive refusals.&lt;br /&gt;
&lt;br /&gt;
=== gemma4-8b-uncensored ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A modified 8B Gemma 4 base designed to offer modern reasoning power without any topic restriction.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Running unfiltered writing experiments or analysis tasks on low-spec hardware.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~8 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~5.5 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Snappy ~58-64 tokens/sec. Zero latency blocks.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored&amp;lt;/span&amp;gt; – Safety tuning bypassed.&lt;br /&gt;
&lt;br /&gt;
=== dolphin-2.9-8b:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; Eric Hartford&#039;s iconic Dolphin fine-tune applied to an 8B base, explicitly optimized to be helpful, harmless, and completely unbiased/unfiltered.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Unrestricted hacking/penetration testing research, unfiltered creative prose, and raw data transformations.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 8.0 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~5.3 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Fast ~60 tokens/sec stream output rate. Exceptionally low prompt parsing delays.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored&amp;lt;/span&amp;gt; – Fully uncensored by design.&lt;br /&gt;
&lt;br /&gt;
=== hf.co/Qwen/Qwen3-8B-GGUF:Q4_K_M ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The lean, highly quantized 8B baseline of the Qwen 3 general series.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Basic chat utilities, lightweight translation scripts, and low-latency local assistants.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 8.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~5.2 GB (Q4_K_M sweet spot footprint)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Swift ~65 tokens/sec throughput with immediate text streaming characteristics.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard default alignment.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Low-Resource &amp;amp; Edge Models (1B - 7B) ==&lt;br /&gt;
&lt;br /&gt;
=== qwen2.5-coder:7b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A highly optimized 7B parameter programming specialist designed to run efficiently on standard laptops.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Real-time IDE integration, autocomplete loops, and small-scale scripting.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 7.6 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~4.8 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Blazing fast performance at ~75-85 tokens/sec. Perfect for immediate inline coding block autocomplete behaviors.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Basic coding safety limits apply.&lt;br /&gt;
&lt;br /&gt;
=== qwen7b-32k:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A specialized 7B variant configured specifically to ingest and remember massive text inputs up to a 32,000 token window.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Ingesting whole research papers, large source-code files, or extensive chat histories in a single prompt.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 7.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~4.7 GB base allocation. Maxing out the context window to 32k tokens causes the pre-allocated Key-Value (KV) cache memory to expand significantly (up to an additional 4-8 GB of VRAM dynamically).&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~70 tokens/sec under standard usage. Heavy prompt ingestion will scale initial TTFT up to several seconds during token processing phases.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard Qwen alignment.&lt;br /&gt;
&lt;br /&gt;
=== llama3.2:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; Meta&#039;s highly popular, lightweight 3B generalist model designed for edge computing and mobile deployment.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Ultra-fast everyday text tasks, basic email formatting, and maintaining a low-footprint background desktop assistant.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 3.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~2.5 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Extreme text throughput speeds averaging ~100-120+ tokens/sec. Instantaneous response execution.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Adheres strictly to Meta&#039;s safety guidelines.&lt;br /&gt;
&lt;br /&gt;
=== qwen2.5-coder:3b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; An ultra-compact coding model tailored for low-resource hardware, suitable for embedded systems or background IDE plugins.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Quick syntax checks, simple function writing, and short utility scripts.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 3.1 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~2.4 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~110 tokens/sec. Text returns arrive immediately with zero typing lag.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Basic alignment active.&lt;br /&gt;
&lt;br /&gt;
=== qwen3b-high-ctx:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A 3B parameter model optimized specifically for handling enlarged context lengths on constrained hardware.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Reading lengthy logs or documentation files on machines lacking dedicated GPU hardware.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~3 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~2.3 GB base (expands based on operational context volume loading).&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~95-105 tokens/sec under typical loads.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard alignment.&lt;br /&gt;
&lt;br /&gt;
=== deepseek-r1:1.5b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A tiny, distilled reasoning model featuring internal chain-of-thought (&amp;quot;thinking&amp;quot;) capabilities.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Basic logical problem solving, simple math validation, and testing deep reasoning architectures on extremely weak hardware.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 1.5 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~1.1 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Outrageously fast formatting speeds up to ~130 tokens/sec. However, note that total latency is lengthened because the model generates internal thinking tokens before revealing the raw target answer text.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Retains default alignment protocols during its thinking phase.&lt;br /&gt;
&lt;br /&gt;
=== smollm2-uncensored:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; An ultra-compact 1.7B parameter model optimized for mobile or CPU-only setups, stripped of systemic safety refusals.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Unfiltered basic text generation, edge-device testing, and quick offline note restructuring.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 1.7 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~1.3 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Absolute maximum speed configuration running at ~130+ tokens/sec with sub-millisecond start delivery times.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored&amp;lt;/span&amp;gt; – Safety mechanisms fully removed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Local AI Models]]&lt;br /&gt;
[[Category:Ollama Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Ollama_Modelfile_List&amp;diff=1150</id>
		<title>Ollama Modelfile List</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Ollama_Modelfile_List&amp;diff=1150"/>
		<updated>2026-05-26T20:49:56Z</updated>

		<summary type="html">&lt;p&gt;Admin: Replaced content with &amp;quot;Only on Test&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Only on Test&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Ollama_Modelfile_List&amp;diff=1149</id>
		<title>Ollama Modelfile List</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Ollama_Modelfile_List&amp;diff=1149"/>
		<updated>2026-05-26T20:37:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;This is a local Ollama installation running on a powerful local GPU.&amp;#039;&amp;#039;&amp;#039;  __NOTOC__ This page serves as a comprehensive technical registry and capabilities guide for the locally installed Ollama Large Language Models (LLMs). It outlines their core architecture, performance profiles, memory usage, and safety alignment status.  == Local Hardware Performance Overview == The following estimates assume full GPU offloading utilizing a high-end local GPU layout. Splitting mod...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;This is a local Ollama installation running on a powerful local GPU.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
This page serves as a comprehensive technical registry and capabilities guide for the locally installed Ollama Large Language Models (LLMs). It outlines their core architecture, performance profiles, memory usage, and safety alignment status.&lt;br /&gt;
&lt;br /&gt;
== Local Hardware Performance Overview ==&lt;br /&gt;
The following estimates assume full GPU offloading utilizing a high-end local GPU layout. Splitting models onto system RAM will heavily degrade these numbers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikibase&amp;quot; style=&amp;quot;width:100%; border:1px solid #ccc; border-collapse:collapse; text-align:left;&amp;quot;&lt;br /&gt;
! Scope / Scale&lt;br /&gt;
! Parameter Range&lt;br /&gt;
! Avg. VRAM Footprint&lt;br /&gt;
! Speed (Tokens/sec)&lt;br /&gt;
! Context Latency (TTFT)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;High-Capability&#039;&#039;&#039;&lt;br /&gt;
| 20B – 31B&lt;br /&gt;
| 16 GB – 24 GB&lt;br /&gt;
| 20 – 35 tok/s&lt;br /&gt;
| Moderate (~1.5s - 3.0s)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Mid-Range / Specialist&#039;&#039;&#039;&lt;br /&gt;
| 8B – 16B&lt;br /&gt;
| 6 GB – 14 GB&lt;br /&gt;
| 40 – 65 tok/s&lt;br /&gt;
| Low (~0.8s - 1.5s)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Low-Resource / Edge&#039;&#039;&#039;&lt;br /&gt;
| 1B – 7B&lt;br /&gt;
| 2 GB – 6 GB&lt;br /&gt;
| 70 – 120+ tok/s&lt;br /&gt;
| Near-Instant (&amp;lt;0.5s)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== High-Capability &amp;amp; Large-Scale Models (15B - 31B) ==&lt;br /&gt;
&lt;br /&gt;
=== gemma-4-31b-uncensored ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A highly capable, large-scale model based on the Google Gemma 4 architecture, modified to bypass standard safety guardrails.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Complex reasoning, deep creative writing, philosophical exploration, and processing intricate multi-step prompts without refusal barriers.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~31 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~20.5 GB (Quantized)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Generates ~22-26 tokens/sec. High reasoning overhead can cause a slightly delayed Time-To-First-Token (TTFT) of 2-3 seconds.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored / Abliterated&amp;lt;/span&amp;gt; – All standard safety alignment filters have been removed.&lt;br /&gt;
&lt;br /&gt;
=== qwen3-coder:30b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; Alibaba&#039;s flagship open-weights coding model, optimized for enterprise-grade software engineering, architecture design, and complex debugging.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Writing full-stack applications, handling multi-file repository contexts, explaining complex algorithms, and optimizing legacy code.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~30 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~19.8 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Achieves ~25-30 tokens/sec. Processing long context inputs (codebases) will cause pre-fill latency to scale upward.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard alignment remains active to prevent malicious code generation (e.g., malware design).&lt;br /&gt;
&lt;br /&gt;
=== qwen3.6:27b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A premium, heavy-duty generalist model designed for advanced reasoning, mathematical logic, translation, and analytical workflows.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; High-fidelity data analysis, complex summarizing, multi-language translation, and acting as a central orchestration agent.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~27 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~18.2 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~28-33 tokens/sec. Consistent, stable token execution pacing.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Adheres to strict ethical, helpful, and harmless boundaries.&lt;br /&gt;
&lt;br /&gt;
=== gemma4:26b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The standard, fully-aligned iteration of Google&#039;s 26B Gemma 4 model, balancing massive parameter depth with strict safety guardrails.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Enterprise deployments, academic research assistance, and standard corporate productivity tools where safety compliance is required.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~26 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~17.5 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~30 tokens/sec. Safety evaluations add a marginal execution latency overhead to the initial response generation.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Strictly Censored&amp;lt;/span&amp;gt; – Contains default Google RLHF guardrails against sensitive, harmful, or controversial topics.&lt;br /&gt;
&lt;br /&gt;
=== gpt-oss:20b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; An open-source generalist model trained to mimic commercial GPT-style interactions across diverse task types.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; General brainstorming, text transformation, data cleaning, and everyday agentic tasks.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~20 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~14.0 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Highly responsive at ~35 tokens/sec with low overall processing latency.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:orange; font-weight:bold;&amp;quot;&amp;gt;[Partial] Lightly Censored&amp;lt;/span&amp;gt; – Usually features basic ethical boundaries but is significantly more permissive than strict corporate models.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Mid-Range &amp;amp; Specialist Models (8B - 16B) ==&lt;br /&gt;
&lt;br /&gt;
=== hf.co/mradermacher/Mistral-Nemo-Instruct-2407-abliterated-i1-GGUF:Q5_K_M ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A precision-tuned 12B parameter model combining Mistral&#039;s architecture with &amp;quot;abliteration&amp;quot; techniques to erase negative refusal weights.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Unrestricted academic research, writing intense fiction, roleplay, and analyzing controversial text datasets.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 12.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~8.9 GB (Q5_K_M layout)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Swift ~45-52 tokens/sec response generation. Near-instant text generation initialization.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored / Abliterated&amp;lt;/span&amp;gt; – Chemically stripped of refusal behaviors while retaining structural coherence.&lt;br /&gt;
&lt;br /&gt;
=== hf.co/MaziyarPanahi/Mistral-Nemo-Instruct-2407-GGUF:Q5_K_M ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The cleanly quantized, official instruction-tuned variant of the highly regarded Mistral-Nemo 12B model.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; General instruction following, structured text generation, multi-lingual translation, and logic puzzles.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 12.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~8.9 GB (Q5_K_M layout)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Highly predictable ~45-52 tokens/sec generation speed with negligible pre-fill lag.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Retains default Mistral safety alignments.&lt;br /&gt;
&lt;br /&gt;
=== MFDoom/deepseek-coder-v2-tool-calling:16b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A custom Mixture-of-Experts (MoE) fine-tune specifically optimized to act as an agentic backend capable of executing external function calls.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; AI agents, local tool integration, and automated pipeline execution.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 16 Billion Total (uses ~3.3B active parameters per token)&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~11.2 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Blazing fast inference speeds due to MoE architecture, averaging ~55-65 tokens/sec. High initial layout parsing efficiency.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Aligned to prevent execution of destructive or malicious local commands.&lt;br /&gt;
&lt;br /&gt;
=== deepseek-coder-v2:16b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The foundational Mixture-of-Experts (MoE) coding model from DeepSeek, prized for high-efficiency programming generation.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Continuous inline code completion, rapid prototyping, code refactoring, and general script writing.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 16 Billion Total&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~11.2 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~55-65 tokens/sec. Optimized for sub-second text stream delivery loops.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard guardrails against generating malware or exploits.&lt;br /&gt;
&lt;br /&gt;
=== qwen3:14b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The standard mid-tier iteration of the Qwen 3 general-purpose intelligence framework.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Summarizing lengthy documents, conversational search support, copy editing, and medium-complexity script writing.&lt;br /&gt;
* &#039;&#039;&#039;Strengths:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~14 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~10.1 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Runs fluidly at ~42-48 tokens/sec. Moderate latency scaling during lengthy prompt ingestion phases.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Fully aligned with default safety training.&lt;br /&gt;
&lt;br /&gt;
=== qwen2.5-coder:14b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The established, highly mature 14B coding engine from the Qwen 2.5 generation.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Stable software development environments requiring predictable, reliable syntax generation.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 14.8 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~10.5 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Stable ~42-48 tokens/sec. Excellent processing consistency throughout extended syntax blocks.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Features standard safety controls.&lt;br /&gt;
&lt;br /&gt;
=== gemma3:12b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A legacy mid-tier general model from Google’s third-generation open weights release.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Everyday office automation tasks, document formatting, and general QA datasets.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 12.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~8.8 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~45 tokens/sec. Low baseline generation latency.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Governed by standard Google safety alignment.&lt;br /&gt;
&lt;br /&gt;
=== gemma4:e4b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; An experimental or early-quantized/preview variant of the Gemma 4 framework optimized for edge environments.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Comparing structural generation changes between Gemma versions or running low-overhead general tasks.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~12 Billion Equivalent&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~7.9 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Spits out tokens highly efficiently at ~50 tokens/sec. Rapid initialization cycles.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard guardrails apply.&lt;br /&gt;
&lt;br /&gt;
=== gemma2:9b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; Google’s highly successful 9B parameter generalist model from the Gemma 2 era.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Low-resource conversational assistance, flashcard generation, and quick text summarization.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 9.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~6.8 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Sharp, snappy output reaching ~55 tokens/sec. Minimal processing delay.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Fully aligned.&lt;br /&gt;
&lt;br /&gt;
=== hf.co/NousResearch/Hermes-3-Llama-3.1-8B-GGUF:Q5_K_M ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A premium, creative fine-tune of Llama 3.1 8B by Nous Research, tailored for advanced roleplay, agentic steps, and complex instruction following.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Creative writing, world-building, intricate multi-turn roleplay, and agentic workflows.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 8.0 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~5.9 GB (Q5_K_M execution footprint)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Highly responsive ~60 tokens/sec stream velocity. Instant initial output response behavior.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:orange; font-weight:bold;&amp;quot;&amp;gt;[Partial] Highly Permissive&amp;lt;/span&amp;gt; – While not aggressively abliterated, it is fine-tuned to be neutral, non-preachy, and almost entirely free of false-positive refusals.&lt;br /&gt;
&lt;br /&gt;
=== gemma4-8b-uncensored ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A modified 8B Gemma 4 base designed to offer modern reasoning power without any topic restriction.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Running unfiltered writing experiments or analysis tasks on low-spec hardware.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~8 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~5.5 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Snappy ~58-64 tokens/sec. Zero latency blocks.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored&amp;lt;/span&amp;gt; – Safety tuning bypassed.&lt;br /&gt;
&lt;br /&gt;
=== dolphin-2.9-8b:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; Eric Hartford&#039;s iconic Dolphin fine-tune applied to an 8B base, explicitly optimized to be helpful, harmless, and completely unbiased/unfiltered.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Unrestricted hacking/penetration testing research, unfiltered creative prose, and raw data transformations.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 8.0 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~5.3 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Fast ~60 tokens/sec stream output rate. Exceptionally low prompt parsing delays.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored&amp;lt;/span&amp;gt; – Fully uncensored by design.&lt;br /&gt;
&lt;br /&gt;
=== hf.co/Qwen/Qwen3-8B-GGUF:Q4_K_M ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; The lean, highly quantized 8B baseline of the Qwen 3 general series.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Basic chat utilities, lightweight translation scripts, and low-latency local assistants.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 8.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~5.2 GB (Q4_K_M sweet spot footprint)&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Swift ~65 tokens/sec throughput with immediate text streaming characteristics.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard default alignment.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Low-Resource &amp;amp; Edge Models (1B - 7B) ==&lt;br /&gt;
&lt;br /&gt;
=== qwen2.5-coder:7b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A highly optimized 7B parameter programming specialist designed to run efficiently on standard laptops.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Real-time IDE integration, autocomplete loops, and small-scale scripting.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 7.6 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~4.8 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Blazing fast performance at ~75-85 tokens/sec. Perfect for immediate inline coding block autocomplete behaviors.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Basic coding safety limits apply.&lt;br /&gt;
&lt;br /&gt;
=== qwen7b-32k:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A specialized 7B variant configured specifically to ingest and remember massive text inputs up to a 32,000 token window.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Ingesting whole research papers, large source-code files, or extensive chat histories in a single prompt.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 7.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~4.7 GB base allocation. Maxing out the context window to 32k tokens causes the pre-allocated Key-Value (KV) cache memory to expand significantly (up to an additional 4-8 GB of VRAM dynamically).&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~70 tokens/sec under standard usage. Heavy prompt ingestion will scale initial TTFT up to several seconds during token processing phases.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard Qwen alignment.&lt;br /&gt;
&lt;br /&gt;
=== llama3.2:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; Meta&#039;s highly popular, lightweight 3B generalist model designed for edge computing and mobile deployment.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Ultra-fast everyday text tasks, basic email formatting, and maintaining a low-footprint background desktop assistant.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 3.2 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~2.5 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Extreme text throughput speeds averaging ~100-120+ tokens/sec. Instantaneous response execution.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Adheres strictly to Meta&#039;s safety guidelines.&lt;br /&gt;
&lt;br /&gt;
=== qwen2.5-coder:3b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; An ultra-compact coding model tailored for low-resource hardware, suitable for embedded systems or background IDE plugins.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Quick syntax checks, simple function writing, and short utility scripts.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 3.1 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~2.4 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~110 tokens/sec. Text returns arrive immediately with zero typing lag.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Basic alignment active.&lt;br /&gt;
&lt;br /&gt;
=== qwen3b-high-ctx:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A 3B parameter model optimized specifically for handling enlarged context lengths on constrained hardware.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Reading lengthy logs or documentation files on machines lacking dedicated GPU hardware.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; ~3 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~2.3 GB base (expands based on operational context volume loading).&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; ~95-105 tokens/sec under typical loads.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Standard alignment.&lt;br /&gt;
&lt;br /&gt;
=== deepseek-r1:1.5b ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; A tiny, distilled reasoning model featuring internal chain-of-thought (&amp;quot;thinking&amp;quot;) capabilities.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Basic logical problem solving, simple math validation, and testing deep reasoning architectures on extremely weak hardware.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 1.5 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~1.1 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Outrageously fast formatting speeds up to ~130 tokens/sec. However, note that total latency is lengthened because the model generates internal thinking tokens before revealing the raw target answer text.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;[Yes] Censored&amp;lt;/span&amp;gt; – Retains default alignment protocols during its thinking phase.&lt;br /&gt;
&lt;br /&gt;
=== smollm2-uncensored:latest ===&lt;br /&gt;
* &#039;&#039;&#039;Purpose:&#039;&#039;&#039; An ultra-compact 1.7B parameter model optimized for mobile or CPU-only setups, stripped of systemic safety refusals.&lt;br /&gt;
* &#039;&#039;&#039;Best For:&#039;&#039;&#039; Unfiltered basic text generation, edge-device testing, and quick offline note restructuring.&lt;br /&gt;
* &#039;&#039;&#039;Resource Profile:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Parameters:&#039;&#039;&#039; 1.7 Billion&lt;br /&gt;
** &#039;&#039;&#039;Memory/VRAM Usage:&#039;&#039;&#039; ~1.3 GB&lt;br /&gt;
** &#039;&#039;&#039;Performance &amp;amp; Latency:&#039;&#039;&#039; Absolute maximum speed configuration running at ~130+ tokens/sec with sub-millisecond start delivery times.&lt;br /&gt;
* &#039;&#039;&#039;Censorship Status:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:green; font-weight:bold;&amp;quot;&amp;gt;[No] Uncensored&amp;lt;/span&amp;gt; – Safety mechanisms fully removed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Local AI Models]]&lt;br /&gt;
[[Category:Ollama Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Ollama_Modelfile_Sample&amp;diff=1148</id>
		<title>Ollama Modelfile Sample</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Ollama_Modelfile_Sample&amp;diff=1148"/>
		<updated>2026-05-01T18:04:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;= Ollama Modelfile Cheat Sheet =  == Basic Structure == A Modelfile is a recipe for building a model.  &amp;lt;pre&amp;gt; FROM &amp;lt;base_model&amp;gt;  # Optional settings PARAMETER &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;  SYSTEM &amp;lt;text&amp;gt;  TEMPLATE &amp;lt;text&amp;gt;  ADAPTER &amp;lt;path&amp;gt;  LICENSE &amp;lt;text&amp;gt;  MESSAGE &amp;lt;role&amp;gt; &amp;lt;text&amp;gt; &amp;lt;/pre&amp;gt;  == FROM (Required) == Base model you build on.  &amp;lt;pre&amp;gt; FROM llama3 FROM mistral FROM ./local-model.gguf &amp;lt;/pre&amp;gt;  == PARAMETER == Controls runtime behavior.  === Common Parameters ===  &amp;lt;pre&amp;gt; PARAMETER temperatur...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ollama Modelfile Cheat Sheet =&lt;br /&gt;
&lt;br /&gt;
== Basic Structure ==&lt;br /&gt;
A Modelfile is a recipe for building a model.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM &amp;lt;base_model&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Optional settings&lt;br /&gt;
PARAMETER &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SYSTEM &amp;lt;text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TEMPLATE &amp;lt;text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ADAPTER &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LICENSE &amp;lt;text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MESSAGE &amp;lt;role&amp;gt; &amp;lt;text&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FROM (Required) ==&lt;br /&gt;
Base model you build on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM llama3&lt;br /&gt;
FROM mistral&lt;br /&gt;
FROM ./local-model.gguf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PARAMETER ==&lt;br /&gt;
Controls runtime behavior.&lt;br /&gt;
&lt;br /&gt;
=== Common Parameters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PARAMETER temperature 0.7&lt;br /&gt;
PARAMETER top_p 0.9&lt;br /&gt;
PARAMETER top_k 40&lt;br /&gt;
PARAMETER num_ctx 4096&lt;br /&gt;
PARAMETER repeat_penalty 1.1&lt;br /&gt;
PARAMETER seed 42&lt;br /&gt;
PARAMETER num_predict 128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039; – randomness (0 = deterministic, 1 = highly random)&lt;br /&gt;
* &#039;&#039;&#039;top_p&#039;&#039;&#039; – nucleus sampling probability cutoff&lt;br /&gt;
* &#039;&#039;&#039;top_k&#039;&#039;&#039; – limits token selection pool&lt;br /&gt;
* &#039;&#039;&#039;num_ctx&#039;&#039;&#039; – context window size&lt;br /&gt;
* &#039;&#039;&#039;repeat_penalty&#039;&#039;&#039; – reduces repetition&lt;br /&gt;
* &#039;&#039;&#039;num_predict&#039;&#039;&#039; – max tokens to generate&lt;br /&gt;
&lt;br /&gt;
== SYSTEM ==&lt;br /&gt;
Defines assistant behavior.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SYSTEM You are a helpful assistant that explains things simply.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TEMPLATE ==&lt;br /&gt;
Controls prompt formatting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TEMPLATE &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
{{ if .System }}&amp;lt;|system|&amp;gt;&lt;br /&gt;
{{ .System }}&lt;br /&gt;
{{ end }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;|user|&amp;gt;&lt;br /&gt;
{{ .Prompt }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;|assistant|&amp;gt;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MESSAGE ==&lt;br /&gt;
Few-shot examples.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MESSAGE user What is 2+2?&lt;br /&gt;
MESSAGE assistant 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ADAPTER ==&lt;br /&gt;
Attach LoRA adapters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ADAPTER ./my-lora&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LICENSE ==&lt;br /&gt;
Attach a license.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LICENSE MIT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Full Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM llama3&lt;br /&gt;
&lt;br /&gt;
PARAMETER temperature 0.7&lt;br /&gt;
PARAMETER top_p 0.9&lt;br /&gt;
PARAMETER num_ctx 4096&lt;br /&gt;
&lt;br /&gt;
SYSTEM You are a precise and concise coding assistant.&lt;br /&gt;
&lt;br /&gt;
TEMPLATE &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
{{ if .System }}&amp;lt;|system|&amp;gt;&lt;br /&gt;
{{ .System }}&lt;br /&gt;
{{ end }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;|user|&amp;gt;&lt;br /&gt;
{{ .Prompt }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;|assistant|&amp;gt;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MESSAGE user Write a Python function to add two numbers.&lt;br /&gt;
MESSAGE assistant def add(a, b): return a + b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build and Run ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ollama create mymodel -f Modelfile&lt;br /&gt;
ollama run mymodel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Pitfalls ==&lt;br /&gt;
&lt;br /&gt;
* Missing FROM → build fails&lt;br /&gt;
* Too large num_ctx → high memory usage&lt;br /&gt;
* Incorrect TEMPLATE → broken responses&lt;br /&gt;
* High temperature → hallucinations&lt;br /&gt;
* Low temperature → overly rigid output&lt;br /&gt;
&lt;br /&gt;
== Mental Model ==&lt;br /&gt;
&lt;br /&gt;
* FROM = base model&lt;br /&gt;
* SYSTEM = behavior&lt;br /&gt;
* TEMPLATE = prompt structure&lt;br /&gt;
* PARAMETER = tuning&lt;br /&gt;
* MESSAGE = examples&lt;br /&gt;
* ADAPTER = extensions&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Ollama_Systemd_Unit_File_Sample&amp;diff=1147</id>
		<title>Ollama Systemd Unit File Sample</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Ollama_Systemd_Unit_File_Sample&amp;diff=1147"/>
		<updated>2026-04-30T16:29:13Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;== Ollama systemd override (annotated) ==  === Resource limits === &amp;lt;code&amp;gt; MemoryMax=16G # hard RAM cap (kills process if exceeded)&amp;lt;br&amp;gt; MemoryHigh=14G # soft limit (throttling before hard cap)&amp;lt;br&amp;gt; CPUQuota=400% # limit to ~4 CPU cores &amp;lt;/code&amp;gt;  === File descriptors === &amp;lt;code&amp;gt; LimitNOFILE=1048576 # prevent &amp;quot;too many open files&amp;quot; &amp;lt;/code&amp;gt;  === Restart / stability === &amp;lt;code&amp;gt; Restart=on-failure # restart only on crashes&amp;lt;br&amp;gt; RestartSec=3 # delay before restart&amp;lt;br&amp;gt; StartLimitInter...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ollama systemd override (annotated) ==&lt;br /&gt;
&lt;br /&gt;
=== Resource limits ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
MemoryMax=16G # hard RAM cap (kills process if exceeded)&amp;lt;br&amp;gt;&lt;br /&gt;
MemoryHigh=14G # soft limit (throttling before hard cap)&amp;lt;br&amp;gt;&lt;br /&gt;
CPUQuota=400% # limit to ~4 CPU cores&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== File descriptors ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
LimitNOFILE=1048576 # prevent &amp;quot;too many open files&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Restart / stability ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Restart=on-failure # restart only on crashes&amp;lt;br&amp;gt;&lt;br /&gt;
RestartSec=3 # delay before restart&amp;lt;br&amp;gt;&lt;br /&gt;
StartLimitIntervalSec=60&amp;lt;br&amp;gt;&lt;br /&gt;
StartLimitBurst=5 # avoid infinite restart loops&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IO / disk behavior ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
IOSchedulingClass=best-effort&amp;lt;br&amp;gt;&lt;br /&gt;
IOSchedulingPriority=4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Optional CPU pinning ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CPUAffinity=0 1 2 3 # bind to specific cores&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Security (light sandboxing) ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
NoNewPrivileges=true&amp;lt;br&amp;gt;&lt;br /&gt;
PrivateTmp=true&amp;lt;br&amp;gt;&lt;br /&gt;
ProtectSystem=full&amp;lt;br&amp;gt;&lt;br /&gt;
ProtectHome=true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
StandardOutput=journal&amp;lt;br&amp;gt;&lt;br /&gt;
StandardError=journal&amp;lt;br&amp;gt;&lt;br /&gt;
LogRateLimitIntervalSec=0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ollama tuning ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Environment=&amp;quot;OLLAMA_NUM_PARALLEL=2&amp;quot; # concurrent requests&amp;lt;br&amp;gt;&lt;br /&gt;
Environment=&amp;quot;OLLAMA_MAX_LOADED_MODELS=1&amp;quot; # avoid VRAM exhaustion&amp;lt;br&amp;gt;&lt;br /&gt;
Environment=&amp;quot;OLLAMA_KEEP_ALIVE=5m&amp;quot; # unload after idle&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Environment=&amp;quot;OLLAMA_HOST=127.0.0.1&amp;quot; # bind local only&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Minimal working example ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[Service]&amp;lt;br&amp;gt;&lt;br /&gt;
MemoryMax=16G&amp;lt;br&amp;gt;&lt;br /&gt;
CPUQuota=400%&amp;lt;br&amp;gt;&lt;br /&gt;
LimitNOFILE=1048576&amp;lt;br&amp;gt;&lt;br /&gt;
Restart=on-failure&amp;lt;br&amp;gt;&lt;br /&gt;
RestartSec=3&amp;lt;br&amp;gt;&lt;br /&gt;
Environment=&amp;quot;OLLAMA_NUM_PARALLEL=2&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Environment=&amp;quot;OLLAMA_MAX_LOADED_MODELS=1&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1146</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1146"/>
		<updated>2026-04-30T15:59:13Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Motivation&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Running &#039;&#039;&#039;Kernel-based Virtual Machine (KVM)&#039;&#039;&#039; on my local machine instead of:&lt;br /&gt;
* &amp;lt;s&amp;gt;Hyper-V&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;VMWare&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Proxmox&amp;lt;/s&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;virsh (Virtualization Shell)&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use on-board Linux apps and utilities only; prefer APT distros such as Debian or Ubuntu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===System Information===&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo -i&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# cat /etc/os-release&lt;br /&gt;
 PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;&lt;br /&gt;
 NAME=&amp;quot;Ubuntu&amp;quot;&lt;br /&gt;
 VERSION_ID=&amp;quot;25.10&amp;quot;&lt;br /&gt;
 VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;&lt;br /&gt;
 VERSION_CODENAME=questing&lt;br /&gt;
 ID=ubuntu&lt;br /&gt;
 ID_LIKE=debian&lt;br /&gt;
 HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;&lt;br /&gt;
 SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;&lt;br /&gt;
 BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;&lt;br /&gt;
 PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;&lt;br /&gt;
 UBUNTU_CODENAME=questing&lt;br /&gt;
 LOGO=ubuntu-logo&lt;br /&gt;
&lt;br /&gt;
===Install and setup packages===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;apt install -y   &#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;qemu-kvm \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-daemon-system \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-clients \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;bridge-utils \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;virt-manager \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;cpu-checker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Libvirt (Orchestrator)====&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl enable --now libvirtd&#039;&#039;&#039;&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl status libvirtd&#039;&#039;&#039;&lt;br /&gt;
 ● libvirtd.service - libvirt legacy monolithic daemon&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2026-02-04 19:32:47 CET; 52min ago&lt;br /&gt;
  Invocation: de3b4269f9074f69aef468813b833a4b&lt;br /&gt;
 TriggeredBy: ● libvirtd.socket&lt;br /&gt;
             ● libvirtd-admin.socket&lt;br /&gt;
             ● libvirtd-ro.socket&lt;br /&gt;
       Docs: man:libvirtd(8)&lt;br /&gt;
             https://libvirt.org/&lt;br /&gt;
   Main PID: 26280 (libvirtd)&lt;br /&gt;
      Tasks: 25 (limit: 32768)&lt;br /&gt;
     Memory: 24.1M (peak: 51M)&lt;br /&gt;
        CPU: 9.655s&lt;br /&gt;
     CGroup: /system.slice/libvirtd.service&lt;br /&gt;
             ├─26280 /usr/sbin/libvirtd --timeout 120&lt;br /&gt;
             ├─26388 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
             └─26389 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
 &lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPDISCOVER(virbr0) 52:54:00:2a:f9:66&lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPOFFER(virbr0) 192.168.122.128 52:54:00:2a:f9:66root@ts01:~# kvm-ok&lt;br /&gt;
&lt;br /&gt;
====Virsh (Controler)====&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 Id   Name       State&lt;br /&gt;
 --------------------------&lt;br /&gt;
*Node Info&lt;br /&gt;
 root@ts01:~# virsh nodeinfo&lt;br /&gt;
 CPU model:           x86_64&lt;br /&gt;
 CPU(s):              24&lt;br /&gt;
 CPU frequency:       1197 MHz&lt;br /&gt;
 CPU socket(s):       1&lt;br /&gt;
 Core(s) per socket:  12&lt;br /&gt;
 Thread(s) per core:  2&lt;br /&gt;
 NUMA cell(s):        1&lt;br /&gt;
 Memory size:         63375964 KiB&lt;br /&gt;
*Net List&lt;br /&gt;
 root@ts01:~# virsh net-list --all&lt;br /&gt;
 Name      State    Autostart   Persistent&lt;br /&gt;
--------------------------------------------&lt;br /&gt;
 default   active   yes         yes&lt;br /&gt;
&lt;br /&gt;
*Set Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start default&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-autostart default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Prepare KVM User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;less /etc/groups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Optional start user admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
===Advanced - Bridging===&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start br0&#039;&#039;&#039;&lt;br /&gt;
 virsh net-autostart br0&lt;br /&gt;
 Network br0 started&lt;br /&gt;
 &lt;br /&gt;
 Network br0 marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*Shutdown running VM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown debian13&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 &#039;&#039;&#039;virsh edit debian&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Change:&lt;br /&gt;
 &amp;lt;interface type=&#039;network&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source network=&#039;default&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;interface type=&#039;bridge&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source bridge=&#039;br0&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;model type=&#039;virtio&#039;/&amp;gt;&lt;br /&gt;
 &amp;lt;/interface&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;debian13&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
==Advanced - Converting virtual disks==&lt;br /&gt;
===Converting a VHDX Windows Disk to qcow2===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /home/vmadmin/vm-surf01.vhdx&#039;&#039;&#039;&lt;br /&gt;
 image: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 41 GiB&lt;br /&gt;
 cluster_size: 33554432&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 41 GiB (43994054656 bytes)&lt;br /&gt;
    disk size: 41 GiB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Get the disk ready for KVM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -p -f vhdx -O qcow2 \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/home/vmadmin/vm-surf01.vhdx \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
 image: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
 file format: qcow2&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 37.6 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    compat: 1.1&lt;br /&gt;
    compression type: zlib&lt;br /&gt;
    lazy refcounts: false&lt;br /&gt;
    refcount bits: 16&lt;br /&gt;
    corrupt: false&lt;br /&gt;
    extended l2: false&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 37.6 GiB (40399208448 bytes)&lt;br /&gt;
    disk size: 37.6 GiB&lt;br /&gt;
&lt;br /&gt;
===Converting a VMDK VMWare Disk to qcow2===&lt;br /&gt;
*Inspect &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/ qemu-img info &#039;Windows 8.x x64.vmdk&#039; &#039;&#039;&#039;&lt;br /&gt;
 image: Windows 8.x x64.vmdk&lt;br /&gt;
 file format: vmdk&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 16.7 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    cid: 2432867383&lt;br /&gt;
    parent cid: 4294967295&lt;br /&gt;
    create type: monolithicSparse&lt;br /&gt;
    extents:&lt;br /&gt;
        [0]:&lt;br /&gt;
            virtual size: 107374182400&lt;br /&gt;
            filename: Windows 8.x x64.vmdk&lt;br /&gt;
            cluster size: 65536&lt;br /&gt;
            format:&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: Windows 8.x x64.vmdk&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 16.7 GiB (17974165504 bytes)&lt;br /&gt;
    disk size: 16.7 GiB&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -f vmdk -O qcow2 &#039;Windows 8.x x64.vmdk&#039; win8.qcow2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Converting a qcow2 Disk to vhdx===&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 qemu-img convert -p -f qcow2 -O vhdx win8.qcow2 win8.vhdx&lt;br /&gt;
&lt;br /&gt;
*Info&lt;br /&gt;
 root@ts01:~# qemu-img info win8.vhdx&lt;br /&gt;
 image: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 25.9 GiB&lt;br /&gt;
 cluster_size: 16777216&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 26.6 GiB (28613541888 bytes)&lt;br /&gt;
    disk size: 25.9 GiB&lt;br /&gt;
&lt;br /&gt;
==VM Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Debian from ISO===&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Installation Win10 VM (former vhdx file)===&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Win11 VM (from iso, no registration)===&lt;br /&gt;
*Using the official Windows 11 ISO&lt;br /&gt;
*Install Windows 11 but without network, this way no registration takes place&lt;br /&gt;
&lt;br /&gt;
[[image:Win11-no-network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When asked for network connectivity then press &#039;&#039;&#039;Shift + F10&#039;&#039;&#039;&lt;br /&gt;
*Then type:&lt;br /&gt;
 OOBE\BYPASSNRO&lt;br /&gt;
&lt;br /&gt;
*After finishing the setup, shutdown&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh shutdown win11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It is required to install the network driver, but first detach the current iso image:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
&lt;br /&gt;
*Attach the network interface&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh attach-interface \&lt;br /&gt;
  --domain win11 \&lt;br /&gt;
  --type bridge \&lt;br /&gt;
  --source br0 \&lt;br /&gt;
  --model virtio \&lt;br /&gt;
  --config&lt;br /&gt;
 Interface attached successfully&lt;br /&gt;
&lt;br /&gt;
*Check:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh domiflist win11&lt;br /&gt;
  Interface   Type     Source   Model    MAC&lt;br /&gt;
 -----------------------------------------------------------&lt;br /&gt;
  -           bridge   br0      virtio   52:54:00:16:25:ee&lt;br /&gt;
&lt;br /&gt;
*Download driver disk:&lt;br /&gt;
 cd /var/lib/libvirt/images&lt;br /&gt;
 wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso&lt;br /&gt;
&lt;br /&gt;
*Attach driver disk:&lt;br /&gt;
 virsh attach-disk win11 \&lt;br /&gt;
  /var/lib/libvirt/images/virtio-win.iso \&lt;br /&gt;
  sdb \&lt;br /&gt;
  --type cdrom \&lt;br /&gt;
  --mode readonly \&lt;br /&gt;
  --targetbus sata \&lt;br /&gt;
  --config&lt;br /&gt;
&lt;br /&gt;
*Start VM&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh start win11&lt;br /&gt;
 Domain &#039;win11&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From Device Manager, Install missing Driver from the new disk: NetKVM\w10\amd64&lt;br /&gt;
[[image:Win11-install02.png|480px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Install&lt;br /&gt;
[[image:Win11-install03.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Stop  VM&lt;br /&gt;
*Detach Helper Disk&lt;br /&gt;
 root@ts01:/data/iso# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
*Finished&lt;br /&gt;
&lt;br /&gt;
===Installation Mac OS (EXPERIMENTAL)===&lt;br /&gt;
&#039;&#039;&#039;The following section is experimental by AI created&#039;&#039;&#039;&lt;br /&gt;
*Repository Initialization&lt;br /&gt;
The foundation of the project relies on the OSX-KVM repository, which provides the OpenCore bootloader configurations and scripts to fetch official macOS assets.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Clone the project repository&lt;br /&gt;
git clone --depth 1 https://github.com/kholia/OSX-KVM.git&lt;br /&gt;
cd OSX-KVM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Preparation Tasks&lt;br /&gt;
Before configuring the Virtual Machine, specific scripts must be run to acquire the macOS installation media.&lt;br /&gt;
&lt;br /&gt;
*Fetching macOS Assets&lt;br /&gt;
Run the Python script to download the Recovery image directly from Apple&#039;s servers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./fetch-macOS-v2.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: You will be prompted to choose a version (e.g., Ventura, Sonoma). This creates a &amp;quot;BaseSystem.dmg&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
*Image Conversion&lt;br /&gt;
The downloaded DMG must be converted into a raw image format that KVM can easily mount.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dmg2img -i BaseSystem.dmg BaseSystem.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Disk Creation&lt;br /&gt;
Create the virtual hard drive where the OS will be permanently installed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qemu-img create -f qcow2 mac_hdd_ng.img 128G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Host-Level Optimizations&lt;br /&gt;
To prevent Kernel Panics during the boot process, the KVM module must be configured to ignore unhandled Model Specific Registers (MSRs).&lt;br /&gt;
&lt;br /&gt;
*Permanent MSR Fix&lt;br /&gt;
Edit or create the KVM configuration file on the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/modprobe.d/kvm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following configuration line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
options kvm ignore_msrs=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To apply the change without rebooting the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Machine XML Configuration&lt;br /&gt;
The VM is defined in Libvirt using a modified XML template. Key adjustments ensure the guest OS perceives the hardware as a compatible Apple-Intel machine.&lt;br /&gt;
&lt;br /&gt;
*CPU Masking and OSK&lt;br /&gt;
The CPU must be set to &#039;Penryn&#039; with an Intel vendor ID mask to bypass Apple&#039;s hardware checks.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;cpu mode=&#039;custom&#039; match=&#039;exact&#039; check=&#039;none&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;model fallback=&#039;allow&#039;&amp;gt;Penryn&amp;lt;/model&amp;gt;&lt;br /&gt;
  &amp;lt;feature policy=&#039;require&#039; name=&#039;vendor_id&#039; value=&#039;GenuineIntel&#039;/&amp;gt;&lt;br /&gt;
&amp;lt;/cpu&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The OSK (Apple System Management Controller Key) must be included in the QEMU command-line arguments section of the XML.&lt;br /&gt;
&lt;br /&gt;
*Storage and Firmware Paths&lt;br /&gt;
Ensure the following paths point to your actual local files:&lt;br /&gt;
* &#039;&#039;&#039;Loader:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_CODE_4M.fd&lt;br /&gt;
* &#039;&#039;&#039;NVRAM:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_VARS-1024x768.fd&lt;br /&gt;
* &#039;&#039;&#039;OpenCore:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
* &#039;&#039;&#039;BaseSystem:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
* &#039;&#039;&#039;Target Disk:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
&lt;br /&gt;
*Filesystem Permissions&lt;br /&gt;
Libvirt runs as a separate system user and requires explicit access to files located in a user&#039;s home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Enable directory traversal&lt;br /&gt;
chmod +x /home/vmadmin&lt;br /&gt;
chmod +x /home/vmadmin/OSX-KVM&lt;br /&gt;
&lt;br /&gt;
# Change ownership to the Libvirt-QEMU user&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The Installation Process&lt;br /&gt;
# &#039;&#039;&#039;Format:&#039;&#039;&#039; Use Disk Utility inside the &amp;quot;macOS Base System&amp;quot; to erase the virtual disk as APFS with a GUID Partition Map.&lt;br /&gt;
# &#039;&#039;&#039;Install:&#039;&#039;&#039; Select &amp;quot;Reinstall macOS&amp;quot; and target the newly formatted drive.&lt;br /&gt;
# &#039;&#039;&#039;Bootloader Logic:&#039;&#039;&#039; Upon rebooting, the OpenCore picker will show a &amp;quot;macOS Installer&amp;quot; icon. This must be selected for all intermediate reboots (usually 3-4 times).&lt;br /&gt;
# &#039;&#039;&#039;Final Boot:&#039;&#039;&#039; Once the installer icon disappears, select the name of your formatted drive (e.g., &amp;quot;MAConKVM&amp;quot;) to complete the user setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Screenshots:&#039;&#039;&#039;&lt;br /&gt;
[[image:Mac01.png|400px]]&lt;br /&gt;
[[image:Mac02.png|400px]]&lt;br /&gt;
[[image:Mac03.png|400px]]&lt;br /&gt;
[[image:Mac04.png|400px]]&lt;br /&gt;
[[image:Mac05a.png|400px]]&lt;br /&gt;
[[image:Mac06a.png|400px]]&lt;br /&gt;
[[image:Mac07.png|400px]]&lt;br /&gt;
[[image:Mac08a.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==USB Operations==&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Stick to the VM===&lt;br /&gt;
*Get attached devices&lt;br /&gt;
**Note: We&#039;re after &#039;&#039;&#039;ID 0781:5591 SanDisk Corp.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;lsusb&#039;&#039;&#039;&lt;br /&gt;
  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 001 Device 002: ID 8087:800a Intel Corp. Hub&lt;br /&gt;
  Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 002 Device 002: ID 3938:1032 MOSART Semi. 2.4G RF Keyboard &amp;amp; Mouse&lt;br /&gt;
  Bus 002 Device 003: ID 04b3:3025 IBM Corp. NetVista Full Width Keyboard&lt;br /&gt;
  Bus 002 Device 004: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  Bus 002 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller&lt;br /&gt;
  Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver&lt;br /&gt;
  Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub&lt;br /&gt;
  Bus 003 Device 002: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  &#039;&#039;&#039;Bus 003 Device 003: ID 0781:5591 SanDisk Corp. Ultra Flair&#039;&#039;&#039;&lt;br /&gt;
  Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub&lt;br /&gt;
&lt;br /&gt;
*Attach SanDisk to win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh dumpxml win10 | grep -A10 hostdev&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039; &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; started&lt;br /&gt;
&lt;br /&gt;
*Get Status &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Detach a USB Stick from the VM===&lt;br /&gt;
&lt;br /&gt;
*Detach device&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Scanner to the VM===&lt;br /&gt;
&lt;br /&gt;
*Pick the device&lt;br /&gt;
 root@ts01:~# &#039;&#039;lsusb&#039;&#039;&#039;&#039;&lt;br /&gt;
 Bus 002 Device 008: ID 04a9:190f Canon, Inc. CanoScan LiDE 220&lt;br /&gt;
&lt;br /&gt;
*Edit the vm setting, assume the vm is called win10&lt;br /&gt;
 root@ts01:~# virsh edit win10&lt;br /&gt;
Add the usb port between the xml devices element element, like:&lt;br /&gt;
 &amp;lt;devices&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/devices&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Add and save:&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;yes&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x04a9&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x190f&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Alternative edit the usb port using Virt-manager on x &amp;lt;br&amp;gt;&lt;br /&gt;
[[image:Virt-manager-usb.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Basic admin commands==&lt;br /&gt;
===Cloning a machine===&lt;br /&gt;
&#039;&#039;&#039;Cloning win10 to win10a&#039;&#039;&#039;&lt;br /&gt;
*Shutdown Main&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
 &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
*Clone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Clone Process&lt;br /&gt;
[[image:Clonevm.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virt-clone \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--original win10 \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--name win10a \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--auto-clone&#039;&#039;&#039;&lt;br /&gt;
 Allocating &#039;vm-surf01-clone.qcow2&#039;                                              | 127 GB  00:02:21&lt;br /&gt;
 &lt;br /&gt;
 Clone &#039;win10a&#039; created successfully.&lt;br /&gt;
&lt;br /&gt;
===Snapshots===&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-create win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 created&lt;br /&gt;
 root@ts01:~# virsh snapshot-list win10a&lt;br /&gt;
  Name         Creation Time               State&lt;br /&gt;
 ---------------------------------------------------&lt;br /&gt;
  1770483334   2026-02-07 17:55:34 +0100   running&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Revert snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-revert win10a 1770483334&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
===Hibernate===&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh managedsave win10a&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&lt;br /&gt;
&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10a&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reboot behaviour===&lt;br /&gt;
*Set the following in &#039;&#039;&#039;/etc/defaultlib/virt-guests&#039;&#039;&#039; to allow a manged reboot of the vm&#039;s, means that previous running vm&#039;s are automatically started again after reboot&lt;br /&gt;
&lt;br /&gt;
 # What to do when the host shuts down&lt;br /&gt;
 ON_SHUTDOWN=suspend&lt;br /&gt;
 &lt;br /&gt;
 # What to do when the host boots up&lt;br /&gt;
 ON_BOOT=start&lt;br /&gt;
 &lt;br /&gt;
 # Number of seconds to wait for a guest to shut down/suspend&lt;br /&gt;
 SHUTDOWN_TIMEOUT=300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- To be mentioned: &lt;br /&gt;
 Drawbacks:&lt;br /&gt;
 -Tricky Backup procedure &lt;br /&gt;
 -USB Stick handling&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Backup/Restore of the VM settings===&lt;br /&gt;
To Backup the VM settings only run:&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml vmname &amp;gt; vmname.xml&lt;br /&gt;
&lt;br /&gt;
*To Restore&lt;br /&gt;
 virsh define vmname.xml&lt;br /&gt;
&lt;br /&gt;
==Adding a new VM Storage==&lt;br /&gt;
===Partition the new storage===&lt;br /&gt;
 root@ts01:~# parted /dev/nvme0n1&lt;br /&gt;
 GNU Parted 3.6&lt;br /&gt;
 Using /dev/nvme0n1&lt;br /&gt;
 Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? y&lt;br /&gt;
 (parted) quit&lt;br /&gt;
 Information: You may need to update /etc/fstab.&lt;br /&gt;
===Add Filesystem===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;mkfs.ext4 /dev/nvme0n1p1&#039;&#039;&#039;&lt;br /&gt;
 mke2fs 1.47.2 (1-Jan-2025)&lt;br /&gt;
 /dev/nvme0n1p1 contains a ntfs file system labelled &#039;NVM&#039;&lt;br /&gt;
 Proceed anyway? (y,N) y&lt;br /&gt;
 Discarding device blocks: done&lt;br /&gt;
 Creating filesystem with 500099328 4k blocks and 125026304 inodes&lt;br /&gt;
 Filesystem UUID: 2382c329-2c7c-4a57-855d-aea09003dd30&lt;br /&gt;
 Superblock backups stored on blocks:&lt;br /&gt;
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;br /&gt;
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,&lt;br /&gt;
        102400000, 214990848&lt;br /&gt;
 &lt;br /&gt;
 Allocating group tables: done&lt;br /&gt;
 Writing inode tables: done&lt;br /&gt;
 Creating journal (262144 blocks): done&lt;br /&gt;
 Writing superblocks and filesystem accounting information: done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mount Filesystem===&lt;br /&gt;
*Make and mount&lt;br /&gt;
 root@ts01:~# mkdir /vmstorage&lt;br /&gt;
 root@ts01:~# mount /dev/nvme0n1p1 /vmstorage&lt;br /&gt;
&lt;br /&gt;
*Check&lt;br /&gt;
 root@ts01:~# df -h&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 tmpfs           6.1G   16M  6.1G   1% /run&lt;br /&gt;
 /dev/sda2       915G  459G  411G  53% /&lt;br /&gt;
 tmpfs            31G     0   31G   0% /dev/shm&lt;br /&gt;
 efivarfs        256K  148K  104K  59% /sys/firmware/efi/efivars&lt;br /&gt;
 tmpfs           5.0M   12K  5.0M   1% /run/lock&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service&lt;br /&gt;
 /dev/sda1       1.1G  6.3M  1.1G   1% /boot/efi&lt;br /&gt;
 tmpfs            31G  8.0K   31G   1% /tmp&lt;br /&gt;
 tmpfs           6.1G  116K  6.1G   1% /run/user/60578&lt;br /&gt;
 tmpfs           6.1G  108K  6.1G   1% /run/user/1000&lt;br /&gt;
 &#039;&#039;&#039;/dev/nvme0n1p1  1.9T  2.1M  1.8T   1% /vmstorage&#039;&#039;&#039;&lt;br /&gt;
*Get UUID&lt;br /&gt;
 root@ts01:~# blkid /dev/nvme0n1p1&lt;br /&gt;
 /dev/nvme0n1p1: UUID=&amp;quot;2382c329-2c7c-4a57-855d-aea09003dd30&amp;quot; BLOCK_SIZE=&amp;quot;4096&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTLABEL=&amp;quot;primary&amp;quot; PARTUUID=&amp;quot;f49249d9-50eb-45bd-aafc-701ef7d66f5b&amp;quot;&lt;br /&gt;
*Add to /etc/fstab&lt;br /&gt;
 UUID=2382c329-2c7c-4a57-855d-aea09003dd30  /vmstorage  ext4  defaults  0 2&lt;br /&gt;
*Reboot to test!&lt;br /&gt;
&lt;br /&gt;
===Create a new Pool and apply new VMs===&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
&lt;br /&gt;
*Create a new pool using the new vmstorage&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-define-as nvme-pool dir --target /vmstorage&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool defined&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-build nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool built&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-start nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool started&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-autostart nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
  nvme-pool   active   yes&lt;br /&gt;
&lt;br /&gt;
*Move the VM to another disk&lt;br /&gt;
 root@ts01:~# mv /var/lib/libvirt/images/vm-win10a.qcow2 /vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*Edit the vm settings&lt;br /&gt;
 root@ts01:~# virsh edit win10a&lt;br /&gt;
&lt;br /&gt;
*Then:&lt;br /&gt;
**set source file to:&lt;br /&gt;
**/vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*And save&lt;br /&gt;
 Domain &#039;win10a&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
*To delete the pool use:&lt;br /&gt;
 virsh pool-destroy nvme-pool&lt;br /&gt;
 virsh pool-undefine nvme-pool&lt;br /&gt;
&lt;br /&gt;
==Deploy a new VM via CLI==&lt;br /&gt;
*Requires (template copy):&lt;br /&gt;
**/data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
This will setup a new VM with:&lt;br /&gt;
*Name: vm-bookworm&lt;br /&gt;
*OS Debian 13 (Trixy)&lt;br /&gt;
*Disk: /data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
*2CPU/2GB-RAM&lt;br /&gt;
*Network Bridged &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:/data/vmstorage# &#039;&#039;&#039;virt-install&#039;&#039;&#039; \&lt;br /&gt;
  --name vm-bookworm \&lt;br /&gt;
  --memory 2048 \&lt;br /&gt;
  --vcpus 2 \&lt;br /&gt;
  --cpu host-passthrough \&lt;br /&gt;
  --os-variant debian12 \&lt;br /&gt;
  --disk path=/data/vmstorage/vm-bookworm.qcow2,bus=virtio,discard=unmap \&lt;br /&gt;
  --network bridge=br0,model=virtio \&lt;br /&gt;
  --graphics spice,listen=0.0.0.0 \&lt;br /&gt;
  --channel spicevmc \&lt;br /&gt;
  --autoconsole none \&lt;br /&gt;
  --import&lt;br /&gt;
 &lt;br /&gt;
 Starting install...&lt;br /&gt;
 Creating domain...                                                                                                                               |         00:00:00&lt;br /&gt;
 Domain creation completed.&lt;br /&gt;
&lt;br /&gt;
==Useful Commands==&lt;br /&gt;
*Nmap accross the network to obtain new IP addresses from new vm machines&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;nmap -sn 192.168.2.0/24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Add a description for a VM&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname &amp;quot;My Description ...&amp;quot; --config&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 My Description ...&lt;br /&gt;
&lt;br /&gt;
* Alternative description with carriage returns within the text&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname --config --new-desc $&#039;Line 1: Text123\nLine 2: Text456\nLine 3: Text789&#039;&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 Line 1: Text123&lt;br /&gt;
 Line 2: Text456&lt;br /&gt;
 Line 3: Text789&lt;br /&gt;
&lt;br /&gt;
*Virtual Top&lt;br /&gt;
 root@ts01:/# &#039;&#039;&#039;virt-top&#039;&#039;&#039;&lt;br /&gt;
 virt-top 21:20:58 - x86_64 24/24CPU 1200MHz 61890MB&lt;br /&gt;
 6 domains, 1 active, 1 running, 0 sleeping, 0 paused, 5 inactive D:0 O:0 X:0&lt;br /&gt;
 CPU: 0.1%  Mem: 2048 MB (2048 MB by guests)&lt;br /&gt;
 &lt;br /&gt;
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME&lt;br /&gt;
   10 R    0    2 1396  206  0.1  3.0   0:47.07 vm-bookworm&lt;br /&gt;
&lt;br /&gt;
*Configure Autostart&lt;br /&gt;
&lt;br /&gt;
 virsh autostart win11&lt;br /&gt;
&lt;br /&gt;
 virsh autostart win11 --disable&lt;br /&gt;
&lt;br /&gt;
 virsh dominfo win11 | grep Autostart&lt;br /&gt;
 Autostart:      enable&lt;br /&gt;
 Autostart Once: disable&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Grafana_Alloy,_Loki_and_SELinux&amp;diff=1145</id>
		<title>Grafana Alloy, Loki and SELinux</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Grafana_Alloy,_Loki_and_SELinux&amp;diff=1145"/>
		<updated>2026-04-20T14:24:11Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;= Grafana Alloy, Loki and SELinux =  This article summarizes how to run Grafana Alloy on an SELinux-enabled Linux system, how to troubleshoot startup and access problems, and what to check when Alloy sends metrics to Mimir or logs to Loki.  == Scope ==  The main SELinux topics for Alloy are:  * execution of the Alloy binary * outbound network access to Mimir and Loki * reading local log files for Loki * reading the systemd journal for Loki * file ownership and runtime st...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Grafana Alloy, Loki and SELinux =&lt;br /&gt;
&lt;br /&gt;
This article summarizes how to run Grafana Alloy on an SELinux-enabled Linux system, how to troubleshoot startup and access problems, and what to check when Alloy sends metrics to Mimir or logs to Loki.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
&lt;br /&gt;
The main SELinux topics for Alloy are:&lt;br /&gt;
&lt;br /&gt;
* execution of the Alloy binary&lt;br /&gt;
* outbound network access to Mimir and Loki&lt;br /&gt;
* reading local log files for Loki&lt;br /&gt;
* reading the systemd journal for Loki&lt;br /&gt;
* file ownership and runtime state when Alloy runs as a restricted user&lt;br /&gt;
&lt;br /&gt;
== Key Lessons ==&lt;br /&gt;
&lt;br /&gt;
* The Alloy binary at `/usr/local/bin/alloy` must have a valid SELinux label such as `bin_t`.&lt;br /&gt;
* Do not use `SELinuxContext=` in the systemd unit.&lt;br /&gt;
* If cAdvisor is local, scrape `127.0.0.1:8080` instead of a hostname that may not resolve.&lt;br /&gt;
* If Alloy runs as a restricted user, it must be able to read the config and write its WAL.&lt;br /&gt;
* For Loki, SELinux usually matters more for reading log sources than for sending data to the Loki endpoint.&lt;br /&gt;
&lt;br /&gt;
== Installation Basics ==&lt;br /&gt;
&lt;br /&gt;
=== Binary ===&lt;br /&gt;
&lt;br /&gt;
Install Alloy here:&lt;br /&gt;
&lt;br /&gt;
 /usr/local/bin/alloy&lt;br /&gt;
&lt;br /&gt;
Check the SELinux label:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ls -lZ /usr/local/bin/alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expected type:&lt;br /&gt;
&lt;br /&gt;
 bin_t&lt;br /&gt;
&lt;br /&gt;
If the label is wrong, fix it:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 restorecon -v /usr/local/bin/alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If that does not persist correctly, define the file context and relabel:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 semanage fcontext -a -t bin_t &#039;/usr/local/bin/alloy&#039;&lt;br /&gt;
 restorecon -v /usr/local/bin/alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
Typical config location:&lt;br /&gt;
&lt;br /&gt;
 /etc/alloy/config.alloy&lt;br /&gt;
&lt;br /&gt;
=== Runtime Data ===&lt;br /&gt;
&lt;br /&gt;
Prefer runtime state under:&lt;br /&gt;
&lt;br /&gt;
 /var/lib/alloy&lt;br /&gt;
&lt;br /&gt;
Avoid keeping mutable runtime data under `/etc/alloy` when possible.&lt;br /&gt;
&lt;br /&gt;
== Systemd Unit ==&lt;br /&gt;
&lt;br /&gt;
Use a normal unit file. Do not set `SELinuxContext=`.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Grafana Alloy Service&lt;br /&gt;
 After=network.target&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 ExecStart=/usr/local/bin/alloy run /etc/alloy/config.alloy&lt;br /&gt;
 WorkingDirectory=/etc/alloy&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 User=root&lt;br /&gt;
 LimitNOFILE=65535&lt;br /&gt;
 StandardOutput=syslog&lt;br /&gt;
 StandardError=syslog&lt;br /&gt;
 SyslogIdentifier=alloy&lt;br /&gt;
 Environment=&amp;quot;test&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;APP_NAME=test&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;OrgID=anonymous&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prometheus Scrape Example ==&lt;br /&gt;
&lt;br /&gt;
If cAdvisor runs locally, use:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
 prometheus.scrape &amp;quot;pan_cadvisor&amp;quot; {&lt;br /&gt;
   targets    = [{ __address__ = &amp;quot;127.0.0.1:8080&amp;quot;, client = sys.env(&amp;quot;CLIENT&amp;quot;) }]&lt;br /&gt;
   forward_to = [prometheus.remote_write.hosting.receiver]&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This avoids hostname resolution problems such as failing to resolve `cadvisor`.&lt;br /&gt;
&lt;br /&gt;
== Common SELinux Problems ==&lt;br /&gt;
&lt;br /&gt;
=== 203/EXEC on startup ===&lt;br /&gt;
&lt;br /&gt;
Symptom:&lt;br /&gt;
&lt;br /&gt;
 Main process exited, code=exited, status=203/EXEC&lt;br /&gt;
&lt;br /&gt;
This usually means systemd could not execute the binary. A common cause is a wrong SELinux label on `/usr/local/bin/alloy`.&lt;br /&gt;
&lt;br /&gt;
Example bad label:&lt;br /&gt;
&lt;br /&gt;
 admin_home_t&lt;br /&gt;
&lt;br /&gt;
Check:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ls -lZ /usr/local/bin/alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fix:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 restorecon -v /usr/local/bin/alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scrape fails with connect: permission denied ===&lt;br /&gt;
&lt;br /&gt;
Symptom:&lt;br /&gt;
&lt;br /&gt;
 Get &amp;quot;http://127.0.0.1:8080/metrics&amp;quot;: dial tcp 127.0.0.1:8080: connect: permission denied&lt;br /&gt;
&lt;br /&gt;
If `curl` works from the shell but Alloy cannot connect, SELinux may be blocking the Alloy process.&lt;br /&gt;
&lt;br /&gt;
Check denials:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ausearch -m AVC -ts recent&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, generate and install a local policy:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ausearch -m AVC -c alloy --raw | audit2allow -M alloy_local&lt;br /&gt;
 semodule -i alloy_local.pp&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== WAL permission denied ===&lt;br /&gt;
&lt;br /&gt;
Symptom:&lt;br /&gt;
&lt;br /&gt;
 open data-alloy/prometheus.remote_write.hosting/wal/00000657: permission denied&lt;br /&gt;
&lt;br /&gt;
This typically happens after switching Alloy from `root` to a restricted user while the WAL directory is still owned by `root`.&lt;br /&gt;
&lt;br /&gt;
Immediate fix:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 chown -R alloy-user:alloy-user /etc/alloy/data-alloy&lt;br /&gt;
 chmod -R u+rwX /etc/alloy/data-alloy&lt;br /&gt;
 restorecon -Rv /etc/alloy/data-alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also ensure config readability:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 chown root:alloy-user /etc/alloy&lt;br /&gt;
 chmod 750 /etc/alloy&lt;br /&gt;
 chmod 640 /etc/alloy/config.alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Alloy as a Restricted User ==&lt;br /&gt;
&lt;br /&gt;
Create the user:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 useradd --system --no-create-home --shell /sbin/nologin alloy-user&lt;br /&gt;
 id alloy-user&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the service to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
 User=alloy-user&lt;br /&gt;
 Group=alloy-user&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure:&lt;br /&gt;
&lt;br /&gt;
* `/usr/local/bin/alloy` is still labeled `bin_t`&lt;br /&gt;
* `/etc/alloy` is readable by `alloy-user`&lt;br /&gt;
* the WAL and runtime directories are writable by `alloy-user`&lt;br /&gt;
&lt;br /&gt;
Preferred runtime directory:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 mkdir -p /var/lib/alloy&lt;br /&gt;
 chown -R alloy-user:alloy-user /var/lib/alloy&lt;br /&gt;
 chmod 750 /var/lib/alloy&lt;br /&gt;
 restorecon -Rv /var/lib/alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Returning Alloy to root ==&lt;br /&gt;
&lt;br /&gt;
Either set:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or remove both lines entirely, since systemd defaults to `root`.&lt;br /&gt;
&lt;br /&gt;
If runtime directories were reassigned, give them back to root if needed:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 chown -R root:root /etc/alloy/data-alloy&lt;br /&gt;
 chown -R root:root /var/lib/alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then reload and restart:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 systemctl restart alloy.service&lt;br /&gt;
 systemctl status alloy.service&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loki and SELinux ==&lt;br /&gt;
&lt;br /&gt;
=== Sending data to Loki ===&lt;br /&gt;
&lt;br /&gt;
For the Loki endpoint, SELinux checks the outbound network connection from the Alloy process.&lt;br /&gt;
&lt;br /&gt;
If Alloy is running in `unconfined_service_t`, SELinux is usually not the main blocker for outbound HTTPS to Loki.&lt;br /&gt;
&lt;br /&gt;
Check the process context:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ps -eZ | grep alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&lt;br /&gt;
 system_u:system_r:unconfined_service_t:s0 539778 ? 00:00:16 alloy&lt;br /&gt;
&lt;br /&gt;
Important part:&lt;br /&gt;
&lt;br /&gt;
 unconfined_service_t&lt;br /&gt;
&lt;br /&gt;
This means the process is not tightly confined. In that case, failures to send to Loki are more likely to be caused by:&lt;br /&gt;
&lt;br /&gt;
* DNS problems&lt;br /&gt;
* TLS or certificate issues&lt;br /&gt;
* authentication problems&lt;br /&gt;
* proxy or firewall rules&lt;br /&gt;
* a wrong Loki URL&lt;br /&gt;
&lt;br /&gt;
Check for actual SELinux denials before changing policy:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ausearch -m AVC -ts recent&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a denial shows `name_connect`, a local policy module may be required.&lt;br /&gt;
&lt;br /&gt;
=== Reading plain log files for Loki ===&lt;br /&gt;
&lt;br /&gt;
This is the most common SELinux issue when adding Loki.&lt;br /&gt;
&lt;br /&gt;
Alloy must be able to:&lt;br /&gt;
&lt;br /&gt;
* traverse the parent directories&lt;br /&gt;
* open the file&lt;br /&gt;
* read the file&lt;br /&gt;
&lt;br /&gt;
Check labels:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ls -lZ /path/to/log-directory&lt;br /&gt;
 ls -lZ /path/to/logfile&lt;br /&gt;
 matchpathcon /path/to/logfile&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the file should behave like a regular log file, `var_log_t` is a common type.&lt;br /&gt;
&lt;br /&gt;
Quick test for one file:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 chcon -t var_log_t /path/to/logfile&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Important:&lt;br /&gt;
&lt;br /&gt;
* `chcon` changes the current live label immediately&lt;br /&gt;
* `chcon` is usually not persistent&lt;br /&gt;
* `restorecon` may revert it later&lt;br /&gt;
&lt;br /&gt;
Preferred long-term fix for a custom log directory:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 semanage fcontext -a -t var_log_t &#039;/path/to/log-directory(/.*)?&#039;&lt;br /&gt;
 restorecon -Rv /path/to/log-directory&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading the systemd journal ===&lt;br /&gt;
&lt;br /&gt;
If Alloy reads the journal, verify both OS permissions and SELinux access.&lt;br /&gt;
&lt;br /&gt;
Check:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 id alloy-user&lt;br /&gt;
 ls -lZ /var/log/journal&lt;br /&gt;
 ausearch -m AVC -ts recent&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If Alloy runs as a restricted user, journal group access may be needed:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 usermod -aG systemd-journal alloy-user&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart the service after changing group membership.&lt;br /&gt;
&lt;br /&gt;
=== Reading container logs ===&lt;br /&gt;
&lt;br /&gt;
If logs come from paths such as `/var/lib/docker/containers` or `/var/log/containers`, SELinux may be stricter because container paths often use special SELinux types.&lt;br /&gt;
&lt;br /&gt;
Check:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ls -lZ /var/lib/docker/containers&lt;br /&gt;
 ls -lZ /var/log/containers&lt;br /&gt;
 ausearch -m AVC -ts recent&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In such cases, a local policy module may be required.&lt;br /&gt;
&lt;br /&gt;
== What `ps -eZ | grep alloy` tells you ==&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 system_u:system_r:unconfined_service_t:s0 539778 ? 00:00:16 alloy&lt;br /&gt;
&lt;br /&gt;
Meaning:&lt;br /&gt;
&lt;br /&gt;
* `system_u` = SELinux user&lt;br /&gt;
* `system_r` = SELinux role&lt;br /&gt;
* `unconfined_service_t` = SELinux type or process domain&lt;br /&gt;
* `s0` = SELinux level&lt;br /&gt;
&lt;br /&gt;
The most important field is the type. If Alloy runs as `unconfined_service_t`, SELinux is generally less restrictive for this process than for a tightly confined domain.&lt;br /&gt;
&lt;br /&gt;
== Useful SELinux Commands ==&lt;br /&gt;
&lt;br /&gt;
=== ls -lZ ===&lt;br /&gt;
&lt;br /&gt;
Shows the SELinux label of a file or directory.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ls -lZ /usr/local/bin/alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== restorecon ===&lt;br /&gt;
&lt;br /&gt;
Restores the default label according to policy.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 restorecon -v /usr/local/bin/alloy&lt;br /&gt;
 restorecon -Rv /var/lib/alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== semanage ===&lt;br /&gt;
&lt;br /&gt;
Defines persistent SELinux mappings, such as file contexts and port types.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 semanage fcontext -a -t bin_t &#039;/usr/local/bin/alloy&#039;&lt;br /&gt;
 semanage fcontext -a -t var_log_t &#039;/path/to/log-directory(/.*)?&#039;&lt;br /&gt;
 semanage port -l | grep 8080&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== semodule ===&lt;br /&gt;
&lt;br /&gt;
Installs and lists policy modules.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 semodule -i alloy_local.pp&lt;br /&gt;
 semodule -l | grep alloy&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ausearch ===&lt;br /&gt;
&lt;br /&gt;
Searches the audit log for SELinux denials.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ausearch -m AVC -ts recent&lt;br /&gt;
 ausearch -m AVC -c alloy --raw&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getenforce and setenforce ===&lt;br /&gt;
&lt;br /&gt;
Show or temporarily change SELinux mode.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 getenforce&lt;br /&gt;
 setenforce 0&lt;br /&gt;
 setenforce 1&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use `setenforce 0` only as a temporary test.&lt;br /&gt;
&lt;br /&gt;
=== matchpathcon ===&lt;br /&gt;
&lt;br /&gt;
Shows the expected SELinux label for a path.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 matchpathcon /usr/local/bin/alloy&lt;br /&gt;
 matchpathcon /path/to/logfile&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== audit2allow ===&lt;br /&gt;
&lt;br /&gt;
Builds a local policy module from recorded denials.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 ausearch -m AVC -c alloy --raw | audit2allow -M alloy_local&lt;br /&gt;
 semodule -i alloy_local.pp&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Review generated policy before using it in production.&lt;br /&gt;
&lt;br /&gt;
== Recommended Troubleshooting Flow ==&lt;br /&gt;
&lt;br /&gt;
# Verify SELinux mode:&lt;br /&gt;
#* `getenforce`&lt;br /&gt;
#* `sestatus`&lt;br /&gt;
# Verify the Alloy binary label:&lt;br /&gt;
#* `ls -lZ /usr/local/bin/alloy`&lt;br /&gt;
#* `matchpathcon /usr/local/bin/alloy`&lt;br /&gt;
# Fix labels if needed:&lt;br /&gt;
#* `restorecon -v /usr/local/bin/alloy`&lt;br /&gt;
#* or use `semanage fcontext` plus `restorecon`&lt;br /&gt;
# Check the running process context:&lt;br /&gt;
#* `ps -eZ | grep alloy`&lt;br /&gt;
# Reproduce the problem and inspect denials:&lt;br /&gt;
#* `ausearch -m AVC -ts recent`&lt;br /&gt;
# For Loki file collection, inspect the file and directory labels.&lt;br /&gt;
# For journald collection, check journal permissions and group membership.&lt;br /&gt;
# If required, generate and install a local policy module.&lt;br /&gt;
# Restart Alloy and verify logs.&lt;br /&gt;
&lt;br /&gt;
== Final Recommendations ==&lt;br /&gt;
&lt;br /&gt;
* Keep `/usr/local/bin/alloy` labeled as `bin_t`.&lt;br /&gt;
* Do not use `SELinuxContext=` in the systemd unit.&lt;br /&gt;
* Prefer `/var/lib/alloy` for runtime state.&lt;br /&gt;
* Use `127.0.0.1:8080` for a local cAdvisor target.&lt;br /&gt;
* For Loki, first focus on SELinux access to the log source, not only the Loki endpoint.&lt;br /&gt;
* Use `chcon` only for quick tests.&lt;br /&gt;
* Use `semanage fcontext` plus `restorecon` for persistent label fixes.&lt;br /&gt;
* Use `ausearch -m AVC -ts recent` before changing SELinux policy.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=Systemctl_Cheet_Sheet&amp;diff=1144</id>
		<title>Systemctl Cheet Sheet</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Systemctl_Cheet_Sheet&amp;diff=1144"/>
		<updated>2026-04-20T14:23:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;= systemctl Cheat Sheet =  This is a generic `systemctl` cheat sheet using `alloy.service` as the example unit name.  == Service Status ==  &amp;lt;pre&amp;gt; systemctl status alloy.service systemctl is-active alloy.service systemctl is-enabled alloy.service &amp;lt;/pre&amp;gt;  == Start, Stop, Restart ==  &amp;lt;pre&amp;gt; systemctl start alloy.service systemctl stop alloy.service systemctl restart alloy.service systemctl reload alloy.service &amp;lt;/pre&amp;gt;  == Enable or Disable at Boot ==  &amp;lt;pre&amp;gt; systemctl enable a...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= systemctl Cheat Sheet =&lt;br /&gt;
&lt;br /&gt;
This is a generic `systemctl` cheat sheet using `alloy.service` as the example unit name.&lt;br /&gt;
&lt;br /&gt;
== Service Status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl status alloy.service&lt;br /&gt;
systemctl is-active alloy.service&lt;br /&gt;
systemctl is-enabled alloy.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Start, Stop, Restart ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start alloy.service&lt;br /&gt;
systemctl stop alloy.service&lt;br /&gt;
systemctl restart alloy.service&lt;br /&gt;
systemctl reload alloy.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Enable or Disable at Boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable alloy.service&lt;br /&gt;
systemctl disable alloy.service&lt;br /&gt;
systemctl enable --now alloy.service&lt;br /&gt;
systemctl disable --now alloy.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reload Unit Files ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use this after changing a unit file in `/etc/systemd/system/`.&lt;br /&gt;
&lt;br /&gt;
== View Unit Definition ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl cat alloy.service&lt;br /&gt;
systemctl show alloy.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Edit a Unit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl edit --full alloy.service&lt;br /&gt;
systemctl edit alloy.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* `--full` edits the whole unit file&lt;br /&gt;
* without `--full`, systemd creates a drop-in override&lt;br /&gt;
&lt;br /&gt;
== Remove Overrides ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl revert alloy.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
journalctl -u alloy.service&lt;br /&gt;
journalctl -u alloy.service -n 50 --no-pager&lt;br /&gt;
journalctl -u alloy.service -f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Failed Units and Unit Files ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl list-units --failed&lt;br /&gt;
systemctl --failed&lt;br /&gt;
systemctl list-unit-files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mask and Unmask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask alloy.service&lt;br /&gt;
systemctl unmask alloy.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
`mask` prevents manual or automatic start.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl list-dependencies alloy.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Workflow After Changing a Service ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart alloy.service&lt;br /&gt;
systemctl status alloy.service&lt;br /&gt;
journalctl -u alloy.service -n 50 --no-pager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemd-analyze verify /etc/systemd/system/alloy.service&lt;br /&gt;
systemctl cat alloy.service&lt;br /&gt;
journalctl -xeu alloy.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1143</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1143"/>
		<updated>2026-02-28T18:29:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Motivation&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Running &#039;&#039;&#039;Kernel-based Virtual Machine (KVM)&#039;&#039;&#039; on my local machine instead of:&lt;br /&gt;
* &amp;lt;s&amp;gt;Hyper-V&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;VMWare&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Proxmox&amp;lt;/s&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;virsh (Virtualization Shell)&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use on-board Linux apps and utilities only; prefer APT distros such as Debian or Ubuntu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===System Information===&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo -i&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# cat /etc/os-release&lt;br /&gt;
 PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;&lt;br /&gt;
 NAME=&amp;quot;Ubuntu&amp;quot;&lt;br /&gt;
 VERSION_ID=&amp;quot;25.10&amp;quot;&lt;br /&gt;
 VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;&lt;br /&gt;
 VERSION_CODENAME=questing&lt;br /&gt;
 ID=ubuntu&lt;br /&gt;
 ID_LIKE=debian&lt;br /&gt;
 HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;&lt;br /&gt;
 SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;&lt;br /&gt;
 BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;&lt;br /&gt;
 PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;&lt;br /&gt;
 UBUNTU_CODENAME=questing&lt;br /&gt;
 LOGO=ubuntu-logo&lt;br /&gt;
&lt;br /&gt;
===Install and setup packages===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;apt install -y   &#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;qemu-kvm \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-daemon-system \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-clients \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;bridge-utils \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;virt-manager \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;cpu-checker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Libvirt (Orchestrator)====&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl enable --now libvirtd&#039;&#039;&#039;&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl status libvirtd&#039;&#039;&#039;&lt;br /&gt;
 ● libvirtd.service - libvirt legacy monolithic daemon&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2026-02-04 19:32:47 CET; 52min ago&lt;br /&gt;
  Invocation: de3b4269f9074f69aef468813b833a4b&lt;br /&gt;
 TriggeredBy: ● libvirtd.socket&lt;br /&gt;
             ● libvirtd-admin.socket&lt;br /&gt;
             ● libvirtd-ro.socket&lt;br /&gt;
       Docs: man:libvirtd(8)&lt;br /&gt;
             https://libvirt.org/&lt;br /&gt;
   Main PID: 26280 (libvirtd)&lt;br /&gt;
      Tasks: 25 (limit: 32768)&lt;br /&gt;
     Memory: 24.1M (peak: 51M)&lt;br /&gt;
        CPU: 9.655s&lt;br /&gt;
     CGroup: /system.slice/libvirtd.service&lt;br /&gt;
             ├─26280 /usr/sbin/libvirtd --timeout 120&lt;br /&gt;
             ├─26388 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
             └─26389 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
 &lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPDISCOVER(virbr0) 52:54:00:2a:f9:66&lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPOFFER(virbr0) 192.168.122.128 52:54:00:2a:f9:66root@ts01:~# kvm-ok&lt;br /&gt;
&lt;br /&gt;
====Virsh (Controler)====&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 Id   Name       State&lt;br /&gt;
 --------------------------&lt;br /&gt;
*Node Info&lt;br /&gt;
 root@ts01:~# virsh nodeinfo&lt;br /&gt;
 CPU model:           x86_64&lt;br /&gt;
 CPU(s):              24&lt;br /&gt;
 CPU frequency:       1197 MHz&lt;br /&gt;
 CPU socket(s):       1&lt;br /&gt;
 Core(s) per socket:  12&lt;br /&gt;
 Thread(s) per core:  2&lt;br /&gt;
 NUMA cell(s):        1&lt;br /&gt;
 Memory size:         63375964 KiB&lt;br /&gt;
*Net List&lt;br /&gt;
 root@ts01:~# virsh net-list --all&lt;br /&gt;
 Name      State    Autostart   Persistent&lt;br /&gt;
--------------------------------------------&lt;br /&gt;
 default   active   yes         yes&lt;br /&gt;
&lt;br /&gt;
*Set Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start default&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-autostart default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Prepare KVM User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;less /etc/groups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Optional start user admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
===Advanced - Bridging===&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start br0&#039;&#039;&#039;&lt;br /&gt;
 virsh net-autostart br0&lt;br /&gt;
 Network br0 started&lt;br /&gt;
 &lt;br /&gt;
 Network br0 marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*Shutdown running VM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown debian13&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 &#039;&#039;&#039;virsh edit debian&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Change:&lt;br /&gt;
 &amp;lt;interface type=&#039;network&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source network=&#039;default&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;interface type=&#039;bridge&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source bridge=&#039;br0&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;model type=&#039;virtio&#039;/&amp;gt;&lt;br /&gt;
 &amp;lt;/interface&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;debian13&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
==Advanced - Converting virtual disks==&lt;br /&gt;
===Converting a VHDX Windows Disk to qcow2===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /home/vmadmin/vm-surf01.vhdx&#039;&#039;&#039;&lt;br /&gt;
 image: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 41 GiB&lt;br /&gt;
 cluster_size: 33554432&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 41 GiB (43994054656 bytes)&lt;br /&gt;
    disk size: 41 GiB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Get the disk ready for KVM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -p -f vhdx -O qcow2 \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/home/vmadmin/vm-surf01.vhdx \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
 image: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
 file format: qcow2&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 37.6 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    compat: 1.1&lt;br /&gt;
    compression type: zlib&lt;br /&gt;
    lazy refcounts: false&lt;br /&gt;
    refcount bits: 16&lt;br /&gt;
    corrupt: false&lt;br /&gt;
    extended l2: false&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 37.6 GiB (40399208448 bytes)&lt;br /&gt;
    disk size: 37.6 GiB&lt;br /&gt;
&lt;br /&gt;
===Converting a VMDK VMWare Disk to qcow2===&lt;br /&gt;
*Inspect &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/ qemu-img info &#039;Windows 8.x x64.vmdk&#039; &#039;&#039;&#039;&lt;br /&gt;
 image: Windows 8.x x64.vmdk&lt;br /&gt;
 file format: vmdk&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 16.7 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    cid: 2432867383&lt;br /&gt;
    parent cid: 4294967295&lt;br /&gt;
    create type: monolithicSparse&lt;br /&gt;
    extents:&lt;br /&gt;
        [0]:&lt;br /&gt;
            virtual size: 107374182400&lt;br /&gt;
            filename: Windows 8.x x64.vmdk&lt;br /&gt;
            cluster size: 65536&lt;br /&gt;
            format:&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: Windows 8.x x64.vmdk&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 16.7 GiB (17974165504 bytes)&lt;br /&gt;
    disk size: 16.7 GiB&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -f vmdk -O qcow2 &#039;Windows 8.x x64.vmdk&#039; win8.qcow2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Converting a qcow2 Disk to vhdx===&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 qemu-img convert -p -f qcow2 -O vhdx win8.qcow2 win8.vhdx&lt;br /&gt;
&lt;br /&gt;
*Info&lt;br /&gt;
 root@ts01:~# qemu-img info win8.vhdx&lt;br /&gt;
 image: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 25.9 GiB&lt;br /&gt;
 cluster_size: 16777216&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 26.6 GiB (28613541888 bytes)&lt;br /&gt;
    disk size: 25.9 GiB&lt;br /&gt;
&lt;br /&gt;
==VM Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Debian from ISO===&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Installation Win10 VM (former vhdx file)===&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Win11 VM (from iso, no registration)===&lt;br /&gt;
*Using the official Windows 11 ISO&lt;br /&gt;
*Install Windows 11 but without network, this way no registration takes place&lt;br /&gt;
&lt;br /&gt;
[[image:Win11-no-network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When asked for network connectivity then press &#039;&#039;&#039;Shift + F10&#039;&#039;&#039;&lt;br /&gt;
*Then type:&lt;br /&gt;
 OOBE\BYPASSNRO&lt;br /&gt;
&lt;br /&gt;
*After finishing the setup, shutdown&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh shutdown win11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It is required to install the network driver, but first detach the current iso image:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
&lt;br /&gt;
*Attach the network interface&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh attach-interface \&lt;br /&gt;
  --domain win11 \&lt;br /&gt;
  --type bridge \&lt;br /&gt;
  --source br0 \&lt;br /&gt;
  --model virtio \&lt;br /&gt;
  --config&lt;br /&gt;
 Interface attached successfully&lt;br /&gt;
&lt;br /&gt;
*Check:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh domiflist win11&lt;br /&gt;
  Interface   Type     Source   Model    MAC&lt;br /&gt;
 -----------------------------------------------------------&lt;br /&gt;
  -           bridge   br0      virtio   52:54:00:16:25:ee&lt;br /&gt;
&lt;br /&gt;
*Download driver disk:&lt;br /&gt;
 cd /var/lib/libvirt/images&lt;br /&gt;
 wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso&lt;br /&gt;
&lt;br /&gt;
*Attach driver disk:&lt;br /&gt;
 virsh attach-disk win11 \&lt;br /&gt;
  /var/lib/libvirt/images/virtio-win.iso \&lt;br /&gt;
  sdb \&lt;br /&gt;
  --type cdrom \&lt;br /&gt;
  --mode readonly \&lt;br /&gt;
  --targetbus sata \&lt;br /&gt;
  --config&lt;br /&gt;
&lt;br /&gt;
*Start VM&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh start win11&lt;br /&gt;
 Domain &#039;win11&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From Device Manager, Install missing Driver from the new disk: NetKVM\w10\amd64&lt;br /&gt;
[[image:Win11-install02.png|480px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Install&lt;br /&gt;
[[image:Win11-install03.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Stop  VM&lt;br /&gt;
*Detach Helper Disk&lt;br /&gt;
 root@ts01:/data/iso# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
*Finished&lt;br /&gt;
&lt;br /&gt;
===Installation Mac OS (EXPERIMENTAL)===&lt;br /&gt;
&#039;&#039;&#039;The following section is experimental by AI created&#039;&#039;&#039;&lt;br /&gt;
*Repository Initialization&lt;br /&gt;
The foundation of the project relies on the OSX-KVM repository, which provides the OpenCore bootloader configurations and scripts to fetch official macOS assets.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Clone the project repository&lt;br /&gt;
git clone --depth 1 https://github.com/kholia/OSX-KVM.git&lt;br /&gt;
cd OSX-KVM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Preparation Tasks&lt;br /&gt;
Before configuring the Virtual Machine, specific scripts must be run to acquire the macOS installation media.&lt;br /&gt;
&lt;br /&gt;
*Fetching macOS Assets&lt;br /&gt;
Run the Python script to download the Recovery image directly from Apple&#039;s servers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./fetch-macOS-v2.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: You will be prompted to choose a version (e.g., Ventura, Sonoma). This creates a &amp;quot;BaseSystem.dmg&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
*Image Conversion&lt;br /&gt;
The downloaded DMG must be converted into a raw image format that KVM can easily mount.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dmg2img -i BaseSystem.dmg BaseSystem.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Disk Creation&lt;br /&gt;
Create the virtual hard drive where the OS will be permanently installed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qemu-img create -f qcow2 mac_hdd_ng.img 128G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Host-Level Optimizations&lt;br /&gt;
To prevent Kernel Panics during the boot process, the KVM module must be configured to ignore unhandled Model Specific Registers (MSRs).&lt;br /&gt;
&lt;br /&gt;
*Permanent MSR Fix&lt;br /&gt;
Edit or create the KVM configuration file on the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/modprobe.d/kvm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following configuration line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
options kvm ignore_msrs=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To apply the change without rebooting the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Machine XML Configuration&lt;br /&gt;
The VM is defined in Libvirt using a modified XML template. Key adjustments ensure the guest OS perceives the hardware as a compatible Apple-Intel machine.&lt;br /&gt;
&lt;br /&gt;
*CPU Masking and OSK&lt;br /&gt;
The CPU must be set to &#039;Penryn&#039; with an Intel vendor ID mask to bypass Apple&#039;s hardware checks.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;cpu mode=&#039;custom&#039; match=&#039;exact&#039; check=&#039;none&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;model fallback=&#039;allow&#039;&amp;gt;Penryn&amp;lt;/model&amp;gt;&lt;br /&gt;
  &amp;lt;feature policy=&#039;require&#039; name=&#039;vendor_id&#039; value=&#039;GenuineIntel&#039;/&amp;gt;&lt;br /&gt;
&amp;lt;/cpu&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The OSK (Apple System Management Controller Key) must be included in the QEMU command-line arguments section of the XML.&lt;br /&gt;
&lt;br /&gt;
*Storage and Firmware Paths&lt;br /&gt;
Ensure the following paths point to your actual local files:&lt;br /&gt;
* &#039;&#039;&#039;Loader:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_CODE_4M.fd&lt;br /&gt;
* &#039;&#039;&#039;NVRAM:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_VARS-1024x768.fd&lt;br /&gt;
* &#039;&#039;&#039;OpenCore:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
* &#039;&#039;&#039;BaseSystem:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
* &#039;&#039;&#039;Target Disk:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
&lt;br /&gt;
*Filesystem Permissions&lt;br /&gt;
Libvirt runs as a separate system user and requires explicit access to files located in a user&#039;s home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Enable directory traversal&lt;br /&gt;
chmod +x /home/vmadmin&lt;br /&gt;
chmod +x /home/vmadmin/OSX-KVM&lt;br /&gt;
&lt;br /&gt;
# Change ownership to the Libvirt-QEMU user&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The Installation Process&lt;br /&gt;
# &#039;&#039;&#039;Format:&#039;&#039;&#039; Use Disk Utility inside the &amp;quot;macOS Base System&amp;quot; to erase the virtual disk as APFS with a GUID Partition Map.&lt;br /&gt;
# &#039;&#039;&#039;Install:&#039;&#039;&#039; Select &amp;quot;Reinstall macOS&amp;quot; and target the newly formatted drive.&lt;br /&gt;
# &#039;&#039;&#039;Bootloader Logic:&#039;&#039;&#039; Upon rebooting, the OpenCore picker will show a &amp;quot;macOS Installer&amp;quot; icon. This must be selected for all intermediate reboots (usually 3-4 times).&lt;br /&gt;
# &#039;&#039;&#039;Final Boot:&#039;&#039;&#039; Once the installer icon disappears, select the name of your formatted drive (e.g., &amp;quot;MAConKVM&amp;quot;) to complete the user setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Screenshots:&#039;&#039;&#039;&lt;br /&gt;
[[image:Mac01.png|400px]]&lt;br /&gt;
[[image:Mac02.png|400px]]&lt;br /&gt;
[[image:Mac03.png|400px]]&lt;br /&gt;
[[image:Mac04.png|400px]]&lt;br /&gt;
[[image:Mac05a.png|400px]]&lt;br /&gt;
[[image:Mac06a.png|400px]]&lt;br /&gt;
[[image:Mac07.png|400px]]&lt;br /&gt;
[[image:Mac08a.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==USB Operations==&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Stick to the VM===&lt;br /&gt;
*Get attached devices&lt;br /&gt;
**Note: We&#039;re after &#039;&#039;&#039;ID 0781:5591 SanDisk Corp.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;lsusb&#039;&#039;&#039;&lt;br /&gt;
  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 001 Device 002: ID 8087:800a Intel Corp. Hub&lt;br /&gt;
  Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 002 Device 002: ID 3938:1032 MOSART Semi. 2.4G RF Keyboard &amp;amp; Mouse&lt;br /&gt;
  Bus 002 Device 003: ID 04b3:3025 IBM Corp. NetVista Full Width Keyboard&lt;br /&gt;
  Bus 002 Device 004: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  Bus 002 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller&lt;br /&gt;
  Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver&lt;br /&gt;
  Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub&lt;br /&gt;
  Bus 003 Device 002: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  &#039;&#039;&#039;Bus 003 Device 003: ID 0781:5591 SanDisk Corp. Ultra Flair&#039;&#039;&#039;&lt;br /&gt;
  Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub&lt;br /&gt;
&lt;br /&gt;
*Attach SanDisk to win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh dumpxml win10 | grep -A10 hostdev&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039; &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; started&lt;br /&gt;
&lt;br /&gt;
*Get Status &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Detach a USB Stick from the VM===&lt;br /&gt;
&lt;br /&gt;
*Detach device&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Scanner to the VM===&lt;br /&gt;
&lt;br /&gt;
*Pick the device&lt;br /&gt;
 root@ts01:~# &#039;&#039;lsusb&#039;&#039;&#039;&#039;&lt;br /&gt;
 Bus 002 Device 008: ID 04a9:190f Canon, Inc. CanoScan LiDE 220&lt;br /&gt;
&lt;br /&gt;
*Edit the vm setting, assume the vm is called win10&lt;br /&gt;
 root@ts01:~# virsh edit win10&lt;br /&gt;
Add the usb port between the xml devices element element, like:&lt;br /&gt;
 &amp;lt;devices&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/devices&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Add and save:&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;yes&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x04a9&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x190f&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Alternative edit the usb port using Virt-manager on x &amp;lt;br&amp;gt;&lt;br /&gt;
[[image:Virt-manager-usb.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Basic admin commands==&lt;br /&gt;
===Cloning a machine===&lt;br /&gt;
&#039;&#039;&#039;Cloning win10 to win10a&#039;&#039;&#039;&lt;br /&gt;
*Shutdown Main&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
 &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
*Clone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Clone Process&lt;br /&gt;
[[image:Clonevm.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virt-clone \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--original win10 \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--name win10a \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--auto-clone&#039;&#039;&#039;&lt;br /&gt;
 Allocating &#039;vm-surf01-clone.qcow2&#039;                                              | 127 GB  00:02:21&lt;br /&gt;
 &lt;br /&gt;
 Clone &#039;win10a&#039; created successfully.&lt;br /&gt;
&lt;br /&gt;
===Snapshots===&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-create win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 created&lt;br /&gt;
 root@ts01:~# virsh snapshot-list win10a&lt;br /&gt;
  Name         Creation Time               State&lt;br /&gt;
 ---------------------------------------------------&lt;br /&gt;
  1770483334   2026-02-07 17:55:34 +0100   running&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Revert snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-revert win10a 1770483334&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
===Hibernate===&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh managedsave win10a&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&lt;br /&gt;
&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10a&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reboot behaviour===&lt;br /&gt;
*Set the following in &#039;&#039;&#039;/etc/defaultlib/virt-guests&#039;&#039;&#039; to allow a manged reboot of the vm&#039;s, means that previous running vm&#039;s are automatically started again after reboot&lt;br /&gt;
&lt;br /&gt;
 # What to do when the host shuts down&lt;br /&gt;
 ON_SHUTDOWN=suspend&lt;br /&gt;
 &lt;br /&gt;
 # What to do when the host boots up&lt;br /&gt;
 ON_BOOT=start&lt;br /&gt;
 &lt;br /&gt;
 # Number of seconds to wait for a guest to shut down/suspend&lt;br /&gt;
 SHUTDOWN_TIMEOUT=300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- To be mentioned: &lt;br /&gt;
 Drawbacks:&lt;br /&gt;
 -Tricky Backup procedure &lt;br /&gt;
 -USB Stick handling&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Backup/Restore of the VM settings===&lt;br /&gt;
To Backup the VM settings only run:&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml vmname &amp;gt; vmname.xml&lt;br /&gt;
&lt;br /&gt;
*To Restore&lt;br /&gt;
 virsh define vmname.xml&lt;br /&gt;
&lt;br /&gt;
==Adding a new VM Storage==&lt;br /&gt;
===Partition the new storage===&lt;br /&gt;
 root@ts01:~# parted /dev/nvme0n1&lt;br /&gt;
 GNU Parted 3.6&lt;br /&gt;
 Using /dev/nvme0n1&lt;br /&gt;
 Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? y&lt;br /&gt;
 (parted) quit&lt;br /&gt;
 Information: You may need to update /etc/fstab.&lt;br /&gt;
===Add Filesystem===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;mkfs.ext4 /dev/nvme0n1p1&#039;&#039;&#039;&lt;br /&gt;
 mke2fs 1.47.2 (1-Jan-2025)&lt;br /&gt;
 /dev/nvme0n1p1 contains a ntfs file system labelled &#039;NVM&#039;&lt;br /&gt;
 Proceed anyway? (y,N) y&lt;br /&gt;
 Discarding device blocks: done&lt;br /&gt;
 Creating filesystem with 500099328 4k blocks and 125026304 inodes&lt;br /&gt;
 Filesystem UUID: 2382c329-2c7c-4a57-855d-aea09003dd30&lt;br /&gt;
 Superblock backups stored on blocks:&lt;br /&gt;
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;br /&gt;
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,&lt;br /&gt;
        102400000, 214990848&lt;br /&gt;
 &lt;br /&gt;
 Allocating group tables: done&lt;br /&gt;
 Writing inode tables: done&lt;br /&gt;
 Creating journal (262144 blocks): done&lt;br /&gt;
 Writing superblocks and filesystem accounting information: done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mount Filesystem===&lt;br /&gt;
*Make and mount&lt;br /&gt;
 root@ts01:~# mkdir /vmstorage&lt;br /&gt;
 root@ts01:~# mount /dev/nvme0n1p1 /vmstorage&lt;br /&gt;
&lt;br /&gt;
*Check&lt;br /&gt;
 root@ts01:~# df -h&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 tmpfs           6.1G   16M  6.1G   1% /run&lt;br /&gt;
 /dev/sda2       915G  459G  411G  53% /&lt;br /&gt;
 tmpfs            31G     0   31G   0% /dev/shm&lt;br /&gt;
 efivarfs        256K  148K  104K  59% /sys/firmware/efi/efivars&lt;br /&gt;
 tmpfs           5.0M   12K  5.0M   1% /run/lock&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service&lt;br /&gt;
 /dev/sda1       1.1G  6.3M  1.1G   1% /boot/efi&lt;br /&gt;
 tmpfs            31G  8.0K   31G   1% /tmp&lt;br /&gt;
 tmpfs           6.1G  116K  6.1G   1% /run/user/60578&lt;br /&gt;
 tmpfs           6.1G  108K  6.1G   1% /run/user/1000&lt;br /&gt;
 &#039;&#039;&#039;/dev/nvme0n1p1  1.9T  2.1M  1.8T   1% /vmstorage&#039;&#039;&#039;&lt;br /&gt;
*Get UUID&lt;br /&gt;
 root@ts01:~# blkid /dev/nvme0n1p1&lt;br /&gt;
 /dev/nvme0n1p1: UUID=&amp;quot;2382c329-2c7c-4a57-855d-aea09003dd30&amp;quot; BLOCK_SIZE=&amp;quot;4096&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTLABEL=&amp;quot;primary&amp;quot; PARTUUID=&amp;quot;f49249d9-50eb-45bd-aafc-701ef7d66f5b&amp;quot;&lt;br /&gt;
*Add to /etc/fstab&lt;br /&gt;
 UUID=2382c329-2c7c-4a57-855d-aea09003dd30  /vmstorage  ext4  defaults  0 2&lt;br /&gt;
*Reboot to test!&lt;br /&gt;
&lt;br /&gt;
===Create a new Pool and apply new VMs===&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
&lt;br /&gt;
*Create a new pool using the new vmstorage&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-define-as nvme-pool dir --target /vmstorage&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool defined&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-build nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool built&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-start nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool started&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-autostart nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
  nvme-pool   active   yes&lt;br /&gt;
&lt;br /&gt;
*Move the VM to another disk&lt;br /&gt;
 root@ts01:~# mv /var/lib/libvirt/images/vm-win10a.qcow2 /vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*Edit the vm settings&lt;br /&gt;
 root@ts01:~# virsh edit win10a&lt;br /&gt;
&lt;br /&gt;
*Then:&lt;br /&gt;
**set source file to:&lt;br /&gt;
**/vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*And save&lt;br /&gt;
 Domain &#039;win10a&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
*To delete the pool use:&lt;br /&gt;
 virsh pool-destroy nvme-pool&lt;br /&gt;
 virsh pool-undefine nvme-pool&lt;br /&gt;
&lt;br /&gt;
==Deploy a new VM via CLI==&lt;br /&gt;
*Requires (template copy):&lt;br /&gt;
**/data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
This will setup a new VM with:&lt;br /&gt;
*Name: vm-bookworm&lt;br /&gt;
*OS Debian 13 (Trixy)&lt;br /&gt;
*Disk: /data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
*2CPU/2GB-RAM&lt;br /&gt;
*Network Bridged &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:/data/vmstorage# &#039;&#039;&#039;virt-install&#039;&#039;&#039; \&lt;br /&gt;
  --name vm-bookworm \&lt;br /&gt;
  --memory 2048 \&lt;br /&gt;
  --vcpus 2 \&lt;br /&gt;
  --cpu host-passthrough \&lt;br /&gt;
  --os-variant debian12 \&lt;br /&gt;
  --disk path=/data/vmstorage/vm-bookworm.qcow2,bus=virtio,discard=unmap \&lt;br /&gt;
  --network bridge=br0,model=virtio \&lt;br /&gt;
  --graphics spice,listen=0.0.0.0 \&lt;br /&gt;
  --channel spicevmc \&lt;br /&gt;
  --autoconsole none \&lt;br /&gt;
  --import&lt;br /&gt;
 &lt;br /&gt;
 Starting install...&lt;br /&gt;
 Creating domain...                                                                                                                               |         00:00:00&lt;br /&gt;
 Domain creation completed.&lt;br /&gt;
&lt;br /&gt;
==Useful Commands==&lt;br /&gt;
*Nmap accross the network to obtain new IP addresses from new vm machines&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;nmap -sn 192.168.2.0/24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Add a description for a VM&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname &amp;quot;My Description ...&amp;quot; --config&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 My Description ...&lt;br /&gt;
&lt;br /&gt;
* Alternative description with carriage returns within the text&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname --config --new-desc $&#039;Line 1: Text123\nLine 2: Text456\nLine 3: Text789&#039;&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 Line 1: Text123&lt;br /&gt;
 Line 2: Text456&lt;br /&gt;
 Line 3: Text789&lt;br /&gt;
&lt;br /&gt;
*Virtual Top&lt;br /&gt;
 root@ts01:/# &#039;&#039;&#039;virt-top&#039;&#039;&#039;&lt;br /&gt;
 virt-top 21:20:58 - x86_64 24/24CPU 1200MHz 61890MB&lt;br /&gt;
 6 domains, 1 active, 1 running, 0 sleeping, 0 paused, 5 inactive D:0 O:0 X:0&lt;br /&gt;
 CPU: 0.1%  Mem: 2048 MB (2048 MB by guests)&lt;br /&gt;
 &lt;br /&gt;
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME&lt;br /&gt;
   10 R    0    2 1396  206  0.1  3.0   0:47.07 vm-bookworm&lt;br /&gt;
&lt;br /&gt;
*Configure Autostart&lt;br /&gt;
&lt;br /&gt;
 virsh autostart win11&lt;br /&gt;
&lt;br /&gt;
 virsh dominfo win11 | grep Autostart&lt;br /&gt;
 Autostart:      enable&lt;br /&gt;
 Autostart Once: disable&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1142</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1142"/>
		<updated>2026-02-28T18:14:10Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Motivation&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Running&#039;&#039;&#039; Kernel-based Virtual Machine (KVM)&#039;&#039;&#039; on my local machine instead of &lt;br /&gt;
* &amp;lt;s&amp;gt;Hyper-V&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;VMWare&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Proxmox&amp;lt;/s&amp;gt;&lt;br /&gt;
Use on-board Linux apps and utilities only; prefer APT distros such as Debian or Ubuntu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===System Information===&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo -i&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# cat /etc/os-release&lt;br /&gt;
 PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;&lt;br /&gt;
 NAME=&amp;quot;Ubuntu&amp;quot;&lt;br /&gt;
 VERSION_ID=&amp;quot;25.10&amp;quot;&lt;br /&gt;
 VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;&lt;br /&gt;
 VERSION_CODENAME=questing&lt;br /&gt;
 ID=ubuntu&lt;br /&gt;
 ID_LIKE=debian&lt;br /&gt;
 HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;&lt;br /&gt;
 SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;&lt;br /&gt;
 BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;&lt;br /&gt;
 PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;&lt;br /&gt;
 UBUNTU_CODENAME=questing&lt;br /&gt;
 LOGO=ubuntu-logo&lt;br /&gt;
&lt;br /&gt;
===Install and setup packages===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;apt install -y   &#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;qemu-kvm \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-daemon-system \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-clients \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;bridge-utils \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;virt-manager \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;cpu-checker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Libvirt (Orchestrator)====&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl enable --now libvirtd&#039;&#039;&#039;&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl status libvirtd&#039;&#039;&#039;&lt;br /&gt;
 ● libvirtd.service - libvirt legacy monolithic daemon&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2026-02-04 19:32:47 CET; 52min ago&lt;br /&gt;
  Invocation: de3b4269f9074f69aef468813b833a4b&lt;br /&gt;
 TriggeredBy: ● libvirtd.socket&lt;br /&gt;
             ● libvirtd-admin.socket&lt;br /&gt;
             ● libvirtd-ro.socket&lt;br /&gt;
       Docs: man:libvirtd(8)&lt;br /&gt;
             https://libvirt.org/&lt;br /&gt;
   Main PID: 26280 (libvirtd)&lt;br /&gt;
      Tasks: 25 (limit: 32768)&lt;br /&gt;
     Memory: 24.1M (peak: 51M)&lt;br /&gt;
        CPU: 9.655s&lt;br /&gt;
     CGroup: /system.slice/libvirtd.service&lt;br /&gt;
             ├─26280 /usr/sbin/libvirtd --timeout 120&lt;br /&gt;
             ├─26388 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
             └─26389 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
 &lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPDISCOVER(virbr0) 52:54:00:2a:f9:66&lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPOFFER(virbr0) 192.168.122.128 52:54:00:2a:f9:66root@ts01:~# kvm-ok&lt;br /&gt;
&lt;br /&gt;
====Virsh (Controler)====&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 Id   Name       State&lt;br /&gt;
 --------------------------&lt;br /&gt;
*Node Info&lt;br /&gt;
 root@ts01:~# virsh nodeinfo&lt;br /&gt;
 CPU model:           x86_64&lt;br /&gt;
 CPU(s):              24&lt;br /&gt;
 CPU frequency:       1197 MHz&lt;br /&gt;
 CPU socket(s):       1&lt;br /&gt;
 Core(s) per socket:  12&lt;br /&gt;
 Thread(s) per core:  2&lt;br /&gt;
 NUMA cell(s):        1&lt;br /&gt;
 Memory size:         63375964 KiB&lt;br /&gt;
*Net List&lt;br /&gt;
 root@ts01:~# virsh net-list --all&lt;br /&gt;
 Name      State    Autostart   Persistent&lt;br /&gt;
--------------------------------------------&lt;br /&gt;
 default   active   yes         yes&lt;br /&gt;
&lt;br /&gt;
*Set Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start default&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-autostart default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Prepare KVM User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;less /etc/groups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Optional start user admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
===Advanced - Bridging===&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start br0&#039;&#039;&#039;&lt;br /&gt;
 virsh net-autostart br0&lt;br /&gt;
 Network br0 started&lt;br /&gt;
 &lt;br /&gt;
 Network br0 marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*Shutdown running VM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown debian13&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 &#039;&#039;&#039;virsh edit debian&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Change:&lt;br /&gt;
 &amp;lt;interface type=&#039;network&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source network=&#039;default&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;interface type=&#039;bridge&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source bridge=&#039;br0&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;model type=&#039;virtio&#039;/&amp;gt;&lt;br /&gt;
 &amp;lt;/interface&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;debian13&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
==Advanced - Converting virtual disks==&lt;br /&gt;
===Converting a VHDX Windows Disk to qcow2===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /home/vmadmin/vm-surf01.vhdx&#039;&#039;&#039;&lt;br /&gt;
 image: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 41 GiB&lt;br /&gt;
 cluster_size: 33554432&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 41 GiB (43994054656 bytes)&lt;br /&gt;
    disk size: 41 GiB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Get the disk ready for KVM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -p -f vhdx -O qcow2 \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/home/vmadmin/vm-surf01.vhdx \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
 image: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
 file format: qcow2&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 37.6 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    compat: 1.1&lt;br /&gt;
    compression type: zlib&lt;br /&gt;
    lazy refcounts: false&lt;br /&gt;
    refcount bits: 16&lt;br /&gt;
    corrupt: false&lt;br /&gt;
    extended l2: false&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 37.6 GiB (40399208448 bytes)&lt;br /&gt;
    disk size: 37.6 GiB&lt;br /&gt;
&lt;br /&gt;
===Converting a VMDK VMWare Disk to qcow2===&lt;br /&gt;
*Inspect &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/ qemu-img info &#039;Windows 8.x x64.vmdk&#039; &#039;&#039;&#039;&lt;br /&gt;
 image: Windows 8.x x64.vmdk&lt;br /&gt;
 file format: vmdk&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 16.7 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    cid: 2432867383&lt;br /&gt;
    parent cid: 4294967295&lt;br /&gt;
    create type: monolithicSparse&lt;br /&gt;
    extents:&lt;br /&gt;
        [0]:&lt;br /&gt;
            virtual size: 107374182400&lt;br /&gt;
            filename: Windows 8.x x64.vmdk&lt;br /&gt;
            cluster size: 65536&lt;br /&gt;
            format:&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: Windows 8.x x64.vmdk&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 16.7 GiB (17974165504 bytes)&lt;br /&gt;
    disk size: 16.7 GiB&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -f vmdk -O qcow2 &#039;Windows 8.x x64.vmdk&#039; win8.qcow2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Converting a qcow2 Disk to vhdx===&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 qemu-img convert -p -f qcow2 -O vhdx win8.qcow2 win8.vhdx&lt;br /&gt;
&lt;br /&gt;
*Info&lt;br /&gt;
 root@ts01:~# qemu-img info win8.vhdx&lt;br /&gt;
 image: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 25.9 GiB&lt;br /&gt;
 cluster_size: 16777216&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 26.6 GiB (28613541888 bytes)&lt;br /&gt;
    disk size: 25.9 GiB&lt;br /&gt;
&lt;br /&gt;
==VM Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Debian from ISO===&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Installation Win10 VM (former vhdx file)===&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Win11 VM (from iso, no registration)===&lt;br /&gt;
*Using the official Windows 11 ISO&lt;br /&gt;
*Install Windows 11 but without network, this way no registration takes place&lt;br /&gt;
&lt;br /&gt;
[[image:Win11-no-network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When asked for network connectivity then press &#039;&#039;&#039;Shift + F10&#039;&#039;&#039;&lt;br /&gt;
*Then type:&lt;br /&gt;
 OOBE\BYPASSNRO&lt;br /&gt;
&lt;br /&gt;
*After finishing the setup, shutdown&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh shutdown win11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It is required to install the network driver, but first detach the current iso image:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
&lt;br /&gt;
*Attach the network interface&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh attach-interface \&lt;br /&gt;
  --domain win11 \&lt;br /&gt;
  --type bridge \&lt;br /&gt;
  --source br0 \&lt;br /&gt;
  --model virtio \&lt;br /&gt;
  --config&lt;br /&gt;
 Interface attached successfully&lt;br /&gt;
&lt;br /&gt;
*Check:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh domiflist win11&lt;br /&gt;
  Interface   Type     Source   Model    MAC&lt;br /&gt;
 -----------------------------------------------------------&lt;br /&gt;
  -           bridge   br0      virtio   52:54:00:16:25:ee&lt;br /&gt;
&lt;br /&gt;
*Download driver disk:&lt;br /&gt;
 cd /var/lib/libvirt/images&lt;br /&gt;
 wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso&lt;br /&gt;
&lt;br /&gt;
*Attach driver disk:&lt;br /&gt;
 virsh attach-disk win11 \&lt;br /&gt;
  /var/lib/libvirt/images/virtio-win.iso \&lt;br /&gt;
  sdb \&lt;br /&gt;
  --type cdrom \&lt;br /&gt;
  --mode readonly \&lt;br /&gt;
  --targetbus sata \&lt;br /&gt;
  --config&lt;br /&gt;
&lt;br /&gt;
*Start VM&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh start win11&lt;br /&gt;
 Domain &#039;win11&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From Device Manager, Install missing Driver from the new disk: NetKVM\w10\amd64&lt;br /&gt;
[[image:Win11-install02.png|480px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Install&lt;br /&gt;
[[image:Win11-install03.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Stop  VM&lt;br /&gt;
*Detach Helper Disk&lt;br /&gt;
 root@ts01:/data/iso# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
*Finished&lt;br /&gt;
&lt;br /&gt;
===Installation Mac OS (EXPERIMENTAL)===&lt;br /&gt;
&#039;&#039;&#039;The following section is experimental by AI created&#039;&#039;&#039;&lt;br /&gt;
*Repository Initialization&lt;br /&gt;
The foundation of the project relies on the OSX-KVM repository, which provides the OpenCore bootloader configurations and scripts to fetch official macOS assets.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Clone the project repository&lt;br /&gt;
git clone --depth 1 https://github.com/kholia/OSX-KVM.git&lt;br /&gt;
cd OSX-KVM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Preparation Tasks&lt;br /&gt;
Before configuring the Virtual Machine, specific scripts must be run to acquire the macOS installation media.&lt;br /&gt;
&lt;br /&gt;
*Fetching macOS Assets&lt;br /&gt;
Run the Python script to download the Recovery image directly from Apple&#039;s servers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./fetch-macOS-v2.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: You will be prompted to choose a version (e.g., Ventura, Sonoma). This creates a &amp;quot;BaseSystem.dmg&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
*Image Conversion&lt;br /&gt;
The downloaded DMG must be converted into a raw image format that KVM can easily mount.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dmg2img -i BaseSystem.dmg BaseSystem.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Disk Creation&lt;br /&gt;
Create the virtual hard drive where the OS will be permanently installed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qemu-img create -f qcow2 mac_hdd_ng.img 128G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Host-Level Optimizations&lt;br /&gt;
To prevent Kernel Panics during the boot process, the KVM module must be configured to ignore unhandled Model Specific Registers (MSRs).&lt;br /&gt;
&lt;br /&gt;
*Permanent MSR Fix&lt;br /&gt;
Edit or create the KVM configuration file on the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/modprobe.d/kvm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following configuration line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
options kvm ignore_msrs=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To apply the change without rebooting the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Machine XML Configuration&lt;br /&gt;
The VM is defined in Libvirt using a modified XML template. Key adjustments ensure the guest OS perceives the hardware as a compatible Apple-Intel machine.&lt;br /&gt;
&lt;br /&gt;
*CPU Masking and OSK&lt;br /&gt;
The CPU must be set to &#039;Penryn&#039; with an Intel vendor ID mask to bypass Apple&#039;s hardware checks.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;cpu mode=&#039;custom&#039; match=&#039;exact&#039; check=&#039;none&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;model fallback=&#039;allow&#039;&amp;gt;Penryn&amp;lt;/model&amp;gt;&lt;br /&gt;
  &amp;lt;feature policy=&#039;require&#039; name=&#039;vendor_id&#039; value=&#039;GenuineIntel&#039;/&amp;gt;&lt;br /&gt;
&amp;lt;/cpu&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The OSK (Apple System Management Controller Key) must be included in the QEMU command-line arguments section of the XML.&lt;br /&gt;
&lt;br /&gt;
*Storage and Firmware Paths&lt;br /&gt;
Ensure the following paths point to your actual local files:&lt;br /&gt;
* &#039;&#039;&#039;Loader:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_CODE_4M.fd&lt;br /&gt;
* &#039;&#039;&#039;NVRAM:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_VARS-1024x768.fd&lt;br /&gt;
* &#039;&#039;&#039;OpenCore:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
* &#039;&#039;&#039;BaseSystem:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
* &#039;&#039;&#039;Target Disk:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
&lt;br /&gt;
*Filesystem Permissions&lt;br /&gt;
Libvirt runs as a separate system user and requires explicit access to files located in a user&#039;s home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Enable directory traversal&lt;br /&gt;
chmod +x /home/vmadmin&lt;br /&gt;
chmod +x /home/vmadmin/OSX-KVM&lt;br /&gt;
&lt;br /&gt;
# Change ownership to the Libvirt-QEMU user&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The Installation Process&lt;br /&gt;
# &#039;&#039;&#039;Format:&#039;&#039;&#039; Use Disk Utility inside the &amp;quot;macOS Base System&amp;quot; to erase the virtual disk as APFS with a GUID Partition Map.&lt;br /&gt;
# &#039;&#039;&#039;Install:&#039;&#039;&#039; Select &amp;quot;Reinstall macOS&amp;quot; and target the newly formatted drive.&lt;br /&gt;
# &#039;&#039;&#039;Bootloader Logic:&#039;&#039;&#039; Upon rebooting, the OpenCore picker will show a &amp;quot;macOS Installer&amp;quot; icon. This must be selected for all intermediate reboots (usually 3-4 times).&lt;br /&gt;
# &#039;&#039;&#039;Final Boot:&#039;&#039;&#039; Once the installer icon disappears, select the name of your formatted drive (e.g., &amp;quot;MAConKVM&amp;quot;) to complete the user setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Screenshots:&#039;&#039;&#039;&lt;br /&gt;
[[image:Mac01.png|400px]]&lt;br /&gt;
[[image:Mac02.png|400px]]&lt;br /&gt;
[[image:Mac03.png|400px]]&lt;br /&gt;
[[image:Mac04.png|400px]]&lt;br /&gt;
[[image:Mac05a.png|400px]]&lt;br /&gt;
[[image:Mac06a.png|400px]]&lt;br /&gt;
[[image:Mac07.png|400px]]&lt;br /&gt;
[[image:Mac08a.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==USB Operations==&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Stick to the VM===&lt;br /&gt;
*Get attached devices&lt;br /&gt;
**Note: We&#039;re after &#039;&#039;&#039;ID 0781:5591 SanDisk Corp.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;lsusb&#039;&#039;&#039;&lt;br /&gt;
  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 001 Device 002: ID 8087:800a Intel Corp. Hub&lt;br /&gt;
  Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 002 Device 002: ID 3938:1032 MOSART Semi. 2.4G RF Keyboard &amp;amp; Mouse&lt;br /&gt;
  Bus 002 Device 003: ID 04b3:3025 IBM Corp. NetVista Full Width Keyboard&lt;br /&gt;
  Bus 002 Device 004: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  Bus 002 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller&lt;br /&gt;
  Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver&lt;br /&gt;
  Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub&lt;br /&gt;
  Bus 003 Device 002: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  &#039;&#039;&#039;Bus 003 Device 003: ID 0781:5591 SanDisk Corp. Ultra Flair&#039;&#039;&#039;&lt;br /&gt;
  Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub&lt;br /&gt;
&lt;br /&gt;
*Attach SanDisk to win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh dumpxml win10 | grep -A10 hostdev&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039; &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; started&lt;br /&gt;
&lt;br /&gt;
*Get Status &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Detach a USB Stick from the VM===&lt;br /&gt;
&lt;br /&gt;
*Detach device&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Scanner to the VM===&lt;br /&gt;
&lt;br /&gt;
*Pick the device&lt;br /&gt;
 root@ts01:~# &#039;&#039;lsusb&#039;&#039;&#039;&#039;&lt;br /&gt;
 Bus 002 Device 008: ID 04a9:190f Canon, Inc. CanoScan LiDE 220&lt;br /&gt;
&lt;br /&gt;
*Edit the vm setting, assume the vm is called win10&lt;br /&gt;
 root@ts01:~# virsh edit win10&lt;br /&gt;
Add the usb port between the xml devices element element, like:&lt;br /&gt;
 &amp;lt;devices&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/devices&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Add and save:&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;yes&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x04a9&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x190f&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Alternative edit the usb port using Virt-manager on x &amp;lt;br&amp;gt;&lt;br /&gt;
[[image:Virt-manager-usb.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Basic admin commands==&lt;br /&gt;
===Cloning a machine===&lt;br /&gt;
&#039;&#039;&#039;Cloning win10 to win10a&#039;&#039;&#039;&lt;br /&gt;
*Shutdown Main&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
 &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
*Clone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Clone Process&lt;br /&gt;
[[image:Clonevm.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virt-clone \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--original win10 \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--name win10a \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--auto-clone&#039;&#039;&#039;&lt;br /&gt;
 Allocating &#039;vm-surf01-clone.qcow2&#039;                                              | 127 GB  00:02:21&lt;br /&gt;
 &lt;br /&gt;
 Clone &#039;win10a&#039; created successfully.&lt;br /&gt;
&lt;br /&gt;
===Snapshots===&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-create win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 created&lt;br /&gt;
 root@ts01:~# virsh snapshot-list win10a&lt;br /&gt;
  Name         Creation Time               State&lt;br /&gt;
 ---------------------------------------------------&lt;br /&gt;
  1770483334   2026-02-07 17:55:34 +0100   running&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Revert snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-revert win10a 1770483334&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
===Hibernate===&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh managedsave win10a&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&lt;br /&gt;
&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10a&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reboot behaviour===&lt;br /&gt;
*Set the following in &#039;&#039;&#039;/etc/defaultlib/virt-guests&#039;&#039;&#039; to allow a manged reboot of the vm&#039;s, means that previous running vm&#039;s are automatically started again after reboot&lt;br /&gt;
&lt;br /&gt;
 # What to do when the host shuts down&lt;br /&gt;
 ON_SHUTDOWN=suspend&lt;br /&gt;
 &lt;br /&gt;
 # What to do when the host boots up&lt;br /&gt;
 ON_BOOT=start&lt;br /&gt;
 &lt;br /&gt;
 # Number of seconds to wait for a guest to shut down/suspend&lt;br /&gt;
 SHUTDOWN_TIMEOUT=300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- To be mentioned: &lt;br /&gt;
 Drawbacks:&lt;br /&gt;
 -Tricky Backup procedure &lt;br /&gt;
 -USB Stick handling&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Backup/Restore of the VM settings===&lt;br /&gt;
To Backup the VM settings only run:&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml vmname &amp;gt; vmname.xml&lt;br /&gt;
&lt;br /&gt;
*To Restore&lt;br /&gt;
 virsh define vmname.xml&lt;br /&gt;
&lt;br /&gt;
==Adding a new VM Storage==&lt;br /&gt;
===Partition the new storage===&lt;br /&gt;
 root@ts01:~# parted /dev/nvme0n1&lt;br /&gt;
 GNU Parted 3.6&lt;br /&gt;
 Using /dev/nvme0n1&lt;br /&gt;
 Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? y&lt;br /&gt;
 (parted) quit&lt;br /&gt;
 Information: You may need to update /etc/fstab.&lt;br /&gt;
===Add Filesystem===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;mkfs.ext4 /dev/nvme0n1p1&#039;&#039;&#039;&lt;br /&gt;
 mke2fs 1.47.2 (1-Jan-2025)&lt;br /&gt;
 /dev/nvme0n1p1 contains a ntfs file system labelled &#039;NVM&#039;&lt;br /&gt;
 Proceed anyway? (y,N) y&lt;br /&gt;
 Discarding device blocks: done&lt;br /&gt;
 Creating filesystem with 500099328 4k blocks and 125026304 inodes&lt;br /&gt;
 Filesystem UUID: 2382c329-2c7c-4a57-855d-aea09003dd30&lt;br /&gt;
 Superblock backups stored on blocks:&lt;br /&gt;
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;br /&gt;
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,&lt;br /&gt;
        102400000, 214990848&lt;br /&gt;
 &lt;br /&gt;
 Allocating group tables: done&lt;br /&gt;
 Writing inode tables: done&lt;br /&gt;
 Creating journal (262144 blocks): done&lt;br /&gt;
 Writing superblocks and filesystem accounting information: done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mount Filesystem===&lt;br /&gt;
*Make and mount&lt;br /&gt;
 root@ts01:~# mkdir /vmstorage&lt;br /&gt;
 root@ts01:~# mount /dev/nvme0n1p1 /vmstorage&lt;br /&gt;
&lt;br /&gt;
*Check&lt;br /&gt;
 root@ts01:~# df -h&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 tmpfs           6.1G   16M  6.1G   1% /run&lt;br /&gt;
 /dev/sda2       915G  459G  411G  53% /&lt;br /&gt;
 tmpfs            31G     0   31G   0% /dev/shm&lt;br /&gt;
 efivarfs        256K  148K  104K  59% /sys/firmware/efi/efivars&lt;br /&gt;
 tmpfs           5.0M   12K  5.0M   1% /run/lock&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service&lt;br /&gt;
 /dev/sda1       1.1G  6.3M  1.1G   1% /boot/efi&lt;br /&gt;
 tmpfs            31G  8.0K   31G   1% /tmp&lt;br /&gt;
 tmpfs           6.1G  116K  6.1G   1% /run/user/60578&lt;br /&gt;
 tmpfs           6.1G  108K  6.1G   1% /run/user/1000&lt;br /&gt;
 &#039;&#039;&#039;/dev/nvme0n1p1  1.9T  2.1M  1.8T   1% /vmstorage&#039;&#039;&#039;&lt;br /&gt;
*Get UUID&lt;br /&gt;
 root@ts01:~# blkid /dev/nvme0n1p1&lt;br /&gt;
 /dev/nvme0n1p1: UUID=&amp;quot;2382c329-2c7c-4a57-855d-aea09003dd30&amp;quot; BLOCK_SIZE=&amp;quot;4096&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTLABEL=&amp;quot;primary&amp;quot; PARTUUID=&amp;quot;f49249d9-50eb-45bd-aafc-701ef7d66f5b&amp;quot;&lt;br /&gt;
*Add to /etc/fstab&lt;br /&gt;
 UUID=2382c329-2c7c-4a57-855d-aea09003dd30  /vmstorage  ext4  defaults  0 2&lt;br /&gt;
*Reboot to test!&lt;br /&gt;
&lt;br /&gt;
===Create a new Pool and apply new VMs===&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
&lt;br /&gt;
*Create a new pool using the new vmstorage&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-define-as nvme-pool dir --target /vmstorage&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool defined&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-build nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool built&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-start nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool started&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-autostart nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
  nvme-pool   active   yes&lt;br /&gt;
&lt;br /&gt;
*Move the VM to another disk&lt;br /&gt;
 root@ts01:~# mv /var/lib/libvirt/images/vm-win10a.qcow2 /vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*Edit the vm settings&lt;br /&gt;
 root@ts01:~# virsh edit win10a&lt;br /&gt;
&lt;br /&gt;
*Then:&lt;br /&gt;
**set source file to:&lt;br /&gt;
**/vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*And save&lt;br /&gt;
 Domain &#039;win10a&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
*To delete the pool use:&lt;br /&gt;
 virsh pool-destroy nvme-pool&lt;br /&gt;
 virsh pool-undefine nvme-pool&lt;br /&gt;
&lt;br /&gt;
==Deploy a new VM via CLI==&lt;br /&gt;
*Requires (template copy):&lt;br /&gt;
**/data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
This will setup a new VM with:&lt;br /&gt;
*Name: vm-bookworm&lt;br /&gt;
*OS Debian 13 (Trixy)&lt;br /&gt;
*Disk: /data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
*2CPU/2GB-RAM&lt;br /&gt;
*Network Bridged &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:/data/vmstorage# &#039;&#039;&#039;virt-install&#039;&#039;&#039; \&lt;br /&gt;
  --name vm-bookworm \&lt;br /&gt;
  --memory 2048 \&lt;br /&gt;
  --vcpus 2 \&lt;br /&gt;
  --cpu host-passthrough \&lt;br /&gt;
  --os-variant debian12 \&lt;br /&gt;
  --disk path=/data/vmstorage/vm-bookworm.qcow2,bus=virtio,discard=unmap \&lt;br /&gt;
  --network bridge=br0,model=virtio \&lt;br /&gt;
  --graphics spice,listen=0.0.0.0 \&lt;br /&gt;
  --channel spicevmc \&lt;br /&gt;
  --autoconsole none \&lt;br /&gt;
  --import&lt;br /&gt;
 &lt;br /&gt;
 Starting install...&lt;br /&gt;
 Creating domain...                                                                                                                               |         00:00:00&lt;br /&gt;
 Domain creation completed.&lt;br /&gt;
&lt;br /&gt;
==Useful Commands==&lt;br /&gt;
*Nmap accross the network to obtain new IP addresses from new vm machines&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;nmap -sn 192.168.2.0/24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Add a description for a VM&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname &amp;quot;My Description ...&amp;quot; --config&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 My Description ...&lt;br /&gt;
&lt;br /&gt;
* Alternative description with carriage returns within the text&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname --config --new-desc $&#039;Line 1: Text123\nLine 2: Text456\nLine 3: Text789&#039;&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 Line 1: Text123&lt;br /&gt;
 Line 2: Text456&lt;br /&gt;
 Line 3: Text789&lt;br /&gt;
&lt;br /&gt;
*Virtual Top&lt;br /&gt;
 root@ts01:/# &#039;&#039;&#039;virt-top&#039;&#039;&#039;&lt;br /&gt;
 virt-top 21:20:58 - x86_64 24/24CPU 1200MHz 61890MB&lt;br /&gt;
 6 domains, 1 active, 1 running, 0 sleeping, 0 paused, 5 inactive D:0 O:0 X:0&lt;br /&gt;
 CPU: 0.1%  Mem: 2048 MB (2048 MB by guests)&lt;br /&gt;
 &lt;br /&gt;
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME&lt;br /&gt;
   10 R    0    2 1396  206  0.1  3.0   0:47.07 vm-bookworm&lt;br /&gt;
&lt;br /&gt;
*Configure Autostart&lt;br /&gt;
&lt;br /&gt;
 virsh autostart win11&lt;br /&gt;
&lt;br /&gt;
 virsh dominfo win11 | grep Autostart&lt;br /&gt;
 Autostart:      enable&lt;br /&gt;
 Autostart Once: disable&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1141</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1141"/>
		<updated>2026-02-28T18:03:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Motivation&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Running&#039;&#039;&#039; Kernel-based Virtual Machine (KVM)&#039;&#039;&#039; on my local machine instead of &lt;br /&gt;
* &amp;lt;s&amp;gt;Hyper-V&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;VMWare&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Proxmox&amp;lt;/s&amp;gt;&lt;br /&gt;
Use on-board Linux apps and utilities only; prefer Debian or Ubuntu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===System Information===&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo -i&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# cat /etc/os-release&lt;br /&gt;
 PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;&lt;br /&gt;
 NAME=&amp;quot;Ubuntu&amp;quot;&lt;br /&gt;
 VERSION_ID=&amp;quot;25.10&amp;quot;&lt;br /&gt;
 VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;&lt;br /&gt;
 VERSION_CODENAME=questing&lt;br /&gt;
 ID=ubuntu&lt;br /&gt;
 ID_LIKE=debian&lt;br /&gt;
 HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;&lt;br /&gt;
 SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;&lt;br /&gt;
 BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;&lt;br /&gt;
 PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;&lt;br /&gt;
 UBUNTU_CODENAME=questing&lt;br /&gt;
 LOGO=ubuntu-logo&lt;br /&gt;
&lt;br /&gt;
===Install and setup packages===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;apt install -y   &#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;qemu-kvm \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-daemon-system \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-clients \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;bridge-utils \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;virt-manager \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;cpu-checker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Libvirt (Orchestrator)====&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl enable --now libvirtd&#039;&#039;&#039;&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl status libvirtd&#039;&#039;&#039;&lt;br /&gt;
 ● libvirtd.service - libvirt legacy monolithic daemon&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2026-02-04 19:32:47 CET; 52min ago&lt;br /&gt;
  Invocation: de3b4269f9074f69aef468813b833a4b&lt;br /&gt;
 TriggeredBy: ● libvirtd.socket&lt;br /&gt;
             ● libvirtd-admin.socket&lt;br /&gt;
             ● libvirtd-ro.socket&lt;br /&gt;
       Docs: man:libvirtd(8)&lt;br /&gt;
             https://libvirt.org/&lt;br /&gt;
   Main PID: 26280 (libvirtd)&lt;br /&gt;
      Tasks: 25 (limit: 32768)&lt;br /&gt;
     Memory: 24.1M (peak: 51M)&lt;br /&gt;
        CPU: 9.655s&lt;br /&gt;
     CGroup: /system.slice/libvirtd.service&lt;br /&gt;
             ├─26280 /usr/sbin/libvirtd --timeout 120&lt;br /&gt;
             ├─26388 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
             └─26389 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
 &lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPDISCOVER(virbr0) 52:54:00:2a:f9:66&lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPOFFER(virbr0) 192.168.122.128 52:54:00:2a:f9:66root@ts01:~# kvm-ok&lt;br /&gt;
&lt;br /&gt;
====Virsh (Controler)====&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 Id   Name       State&lt;br /&gt;
 --------------------------&lt;br /&gt;
*Node Info&lt;br /&gt;
 root@ts01:~# virsh nodeinfo&lt;br /&gt;
 CPU model:           x86_64&lt;br /&gt;
 CPU(s):              24&lt;br /&gt;
 CPU frequency:       1197 MHz&lt;br /&gt;
 CPU socket(s):       1&lt;br /&gt;
 Core(s) per socket:  12&lt;br /&gt;
 Thread(s) per core:  2&lt;br /&gt;
 NUMA cell(s):        1&lt;br /&gt;
 Memory size:         63375964 KiB&lt;br /&gt;
*Net List&lt;br /&gt;
 root@ts01:~# virsh net-list --all&lt;br /&gt;
 Name      State    Autostart   Persistent&lt;br /&gt;
--------------------------------------------&lt;br /&gt;
 default   active   yes         yes&lt;br /&gt;
&lt;br /&gt;
*Set Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start default&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-autostart default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Prepare KVM User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;less /etc/groups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Optional start user admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
===Advanced - Bridging===&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start br0&#039;&#039;&#039;&lt;br /&gt;
 virsh net-autostart br0&lt;br /&gt;
 Network br0 started&lt;br /&gt;
 &lt;br /&gt;
 Network br0 marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*Shutdown running VM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown debian13&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 &#039;&#039;&#039;virsh edit debian&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Change:&lt;br /&gt;
 &amp;lt;interface type=&#039;network&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source network=&#039;default&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;interface type=&#039;bridge&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source bridge=&#039;br0&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;model type=&#039;virtio&#039;/&amp;gt;&lt;br /&gt;
 &amp;lt;/interface&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;debian13&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
==Advanced - Converting virtual disks==&lt;br /&gt;
===Converting a VHDX Windows Disk to qcow2===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /home/vmadmin/vm-surf01.vhdx&#039;&#039;&#039;&lt;br /&gt;
 image: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 41 GiB&lt;br /&gt;
 cluster_size: 33554432&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 41 GiB (43994054656 bytes)&lt;br /&gt;
    disk size: 41 GiB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Get the disk ready for KVM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -p -f vhdx -O qcow2 \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/home/vmadmin/vm-surf01.vhdx \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
 image: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
 file format: qcow2&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 37.6 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    compat: 1.1&lt;br /&gt;
    compression type: zlib&lt;br /&gt;
    lazy refcounts: false&lt;br /&gt;
    refcount bits: 16&lt;br /&gt;
    corrupt: false&lt;br /&gt;
    extended l2: false&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 37.6 GiB (40399208448 bytes)&lt;br /&gt;
    disk size: 37.6 GiB&lt;br /&gt;
&lt;br /&gt;
===Converting a VMDK VMWare Disk to qcow2===&lt;br /&gt;
*Inspect &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/ qemu-img info &#039;Windows 8.x x64.vmdk&#039; &#039;&#039;&#039;&lt;br /&gt;
 image: Windows 8.x x64.vmdk&lt;br /&gt;
 file format: vmdk&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 16.7 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    cid: 2432867383&lt;br /&gt;
    parent cid: 4294967295&lt;br /&gt;
    create type: monolithicSparse&lt;br /&gt;
    extents:&lt;br /&gt;
        [0]:&lt;br /&gt;
            virtual size: 107374182400&lt;br /&gt;
            filename: Windows 8.x x64.vmdk&lt;br /&gt;
            cluster size: 65536&lt;br /&gt;
            format:&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: Windows 8.x x64.vmdk&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 16.7 GiB (17974165504 bytes)&lt;br /&gt;
    disk size: 16.7 GiB&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -f vmdk -O qcow2 &#039;Windows 8.x x64.vmdk&#039; win8.qcow2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Converting a qcow2 Disk to vhdx===&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 qemu-img convert -p -f qcow2 -O vhdx win8.qcow2 win8.vhdx&lt;br /&gt;
&lt;br /&gt;
*Info&lt;br /&gt;
 root@ts01:~# qemu-img info win8.vhdx&lt;br /&gt;
 image: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 25.9 GiB&lt;br /&gt;
 cluster_size: 16777216&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 26.6 GiB (28613541888 bytes)&lt;br /&gt;
    disk size: 25.9 GiB&lt;br /&gt;
&lt;br /&gt;
==VM Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Debian from ISO===&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Installation Win10 VM (former vhdx file)===&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Win11 VM (from iso, no registration)===&lt;br /&gt;
*Using the official Windows 11 ISO&lt;br /&gt;
*Install Windows 11 but without network, this way no registration takes place&lt;br /&gt;
&lt;br /&gt;
[[image:Win11-no-network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When asked for network connectivity then press &#039;&#039;&#039;Shift + F10&#039;&#039;&#039;&lt;br /&gt;
*Then type:&lt;br /&gt;
 OOBE\BYPASSNRO&lt;br /&gt;
&lt;br /&gt;
*After finishing the setup, shutdown&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh shutdown win11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It is required to install the network driver, but first detach the current iso image:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
&lt;br /&gt;
*Attach the network interface&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh attach-interface \&lt;br /&gt;
  --domain win11 \&lt;br /&gt;
  --type bridge \&lt;br /&gt;
  --source br0 \&lt;br /&gt;
  --model virtio \&lt;br /&gt;
  --config&lt;br /&gt;
 Interface attached successfully&lt;br /&gt;
&lt;br /&gt;
*Check:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh domiflist win11&lt;br /&gt;
  Interface   Type     Source   Model    MAC&lt;br /&gt;
 -----------------------------------------------------------&lt;br /&gt;
  -           bridge   br0      virtio   52:54:00:16:25:ee&lt;br /&gt;
&lt;br /&gt;
*Download driver disk:&lt;br /&gt;
 cd /var/lib/libvirt/images&lt;br /&gt;
 wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso&lt;br /&gt;
&lt;br /&gt;
*Attach driver disk:&lt;br /&gt;
 virsh attach-disk win11 \&lt;br /&gt;
  /var/lib/libvirt/images/virtio-win.iso \&lt;br /&gt;
  sdb \&lt;br /&gt;
  --type cdrom \&lt;br /&gt;
  --mode readonly \&lt;br /&gt;
  --targetbus sata \&lt;br /&gt;
  --config&lt;br /&gt;
&lt;br /&gt;
*Start VM&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh start win11&lt;br /&gt;
 Domain &#039;win11&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From Device Manager, Install missing Driver from the new disk: NetKVM\w10\amd64&lt;br /&gt;
[[image:Win11-install02.png|480px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Install&lt;br /&gt;
[[image:Win11-install03.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Stop  VM&lt;br /&gt;
*Detach Helper Disk&lt;br /&gt;
 root@ts01:/data/iso# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
*Finished&lt;br /&gt;
&lt;br /&gt;
===Installation Mac OS (EXPERIMENTAL)===&lt;br /&gt;
&lt;br /&gt;
*Repository Initialization&lt;br /&gt;
The foundation of the project relies on the OSX-KVM repository, which provides the OpenCore bootloader configurations and scripts to fetch official macOS assets.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Clone the project repository&lt;br /&gt;
git clone --depth 1 https://github.com/kholia/OSX-KVM.git&lt;br /&gt;
cd OSX-KVM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Preparation Tasks&lt;br /&gt;
Before configuring the Virtual Machine, specific scripts must be run to acquire the macOS installation media.&lt;br /&gt;
&lt;br /&gt;
*Fetching macOS Assets&lt;br /&gt;
Run the Python script to download the Recovery image directly from Apple&#039;s servers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./fetch-macOS-v2.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: You will be prompted to choose a version (e.g., Ventura, Sonoma). This creates a &amp;quot;BaseSystem.dmg&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
*Image Conversion&lt;br /&gt;
The downloaded DMG must be converted into a raw image format that KVM can easily mount.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dmg2img -i BaseSystem.dmg BaseSystem.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Disk Creation&lt;br /&gt;
Create the virtual hard drive where the OS will be permanently installed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qemu-img create -f qcow2 mac_hdd_ng.img 128G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Host-Level Optimizations&lt;br /&gt;
To prevent Kernel Panics during the boot process, the KVM module must be configured to ignore unhandled Model Specific Registers (MSRs).&lt;br /&gt;
&lt;br /&gt;
*Permanent MSR Fix&lt;br /&gt;
Edit or create the KVM configuration file on the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/modprobe.d/kvm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following configuration line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
options kvm ignore_msrs=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To apply the change without rebooting the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Machine XML Configuration&lt;br /&gt;
The VM is defined in Libvirt using a modified XML template. Key adjustments ensure the guest OS perceives the hardware as a compatible Apple-Intel machine.&lt;br /&gt;
&lt;br /&gt;
*CPU Masking and OSK&lt;br /&gt;
The CPU must be set to &#039;Penryn&#039; with an Intel vendor ID mask to bypass Apple&#039;s hardware checks.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;cpu mode=&#039;custom&#039; match=&#039;exact&#039; check=&#039;none&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;model fallback=&#039;allow&#039;&amp;gt;Penryn&amp;lt;/model&amp;gt;&lt;br /&gt;
  &amp;lt;feature policy=&#039;require&#039; name=&#039;vendor_id&#039; value=&#039;GenuineIntel&#039;/&amp;gt;&lt;br /&gt;
&amp;lt;/cpu&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The OSK (Apple System Management Controller Key) must be included in the QEMU command-line arguments section of the XML.&lt;br /&gt;
&lt;br /&gt;
*Storage and Firmware Paths&lt;br /&gt;
Ensure the following paths point to your actual local files:&lt;br /&gt;
* &#039;&#039;&#039;Loader:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_CODE_4M.fd&lt;br /&gt;
* &#039;&#039;&#039;NVRAM:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_VARS-1024x768.fd&lt;br /&gt;
* &#039;&#039;&#039;OpenCore:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
* &#039;&#039;&#039;BaseSystem:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
* &#039;&#039;&#039;Target Disk:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
&lt;br /&gt;
*Filesystem Permissions&lt;br /&gt;
Libvirt runs as a separate system user and requires explicit access to files located in a user&#039;s home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Enable directory traversal&lt;br /&gt;
chmod +x /home/vmadmin&lt;br /&gt;
chmod +x /home/vmadmin/OSX-KVM&lt;br /&gt;
&lt;br /&gt;
# Change ownership to the Libvirt-QEMU user&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The Installation Process&lt;br /&gt;
# &#039;&#039;&#039;Format:&#039;&#039;&#039; Use Disk Utility inside the &amp;quot;macOS Base System&amp;quot; to erase the virtual disk as APFS with a GUID Partition Map.&lt;br /&gt;
# &#039;&#039;&#039;Install:&#039;&#039;&#039; Select &amp;quot;Reinstall macOS&amp;quot; and target the newly formatted drive.&lt;br /&gt;
# &#039;&#039;&#039;Bootloader Logic:&#039;&#039;&#039; Upon rebooting, the OpenCore picker will show a &amp;quot;macOS Installer&amp;quot; icon. This must be selected for all intermediate reboots (usually 3-4 times).&lt;br /&gt;
# &#039;&#039;&#039;Final Boot:&#039;&#039;&#039; Once the installer icon disappears, select the name of your formatted drive (e.g., &amp;quot;MAConKVM&amp;quot;) to complete the user setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Screenshots:&#039;&#039;&#039;&lt;br /&gt;
[[image:Mac01.png|400px]]&lt;br /&gt;
[[image:Mac02.png|400px]]&lt;br /&gt;
[[image:Mac03.png|400px]]&lt;br /&gt;
[[image:Mac04.png|400px]]&lt;br /&gt;
[[image:Mac05a.png|400px]]&lt;br /&gt;
[[image:Mac06a.png|400px]]&lt;br /&gt;
[[image:Mac07.png|400px]]&lt;br /&gt;
[[image:Mac08a.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==USB Operations==&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Stick to the VM===&lt;br /&gt;
*Get attached devices&lt;br /&gt;
**Note: We&#039;re after &#039;&#039;&#039;ID 0781:5591 SanDisk Corp.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;lsusb&#039;&#039;&#039;&lt;br /&gt;
  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 001 Device 002: ID 8087:800a Intel Corp. Hub&lt;br /&gt;
  Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 002 Device 002: ID 3938:1032 MOSART Semi. 2.4G RF Keyboard &amp;amp; Mouse&lt;br /&gt;
  Bus 002 Device 003: ID 04b3:3025 IBM Corp. NetVista Full Width Keyboard&lt;br /&gt;
  Bus 002 Device 004: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  Bus 002 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller&lt;br /&gt;
  Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver&lt;br /&gt;
  Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub&lt;br /&gt;
  Bus 003 Device 002: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  &#039;&#039;&#039;Bus 003 Device 003: ID 0781:5591 SanDisk Corp. Ultra Flair&#039;&#039;&#039;&lt;br /&gt;
  Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub&lt;br /&gt;
&lt;br /&gt;
*Attach SanDisk to win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh dumpxml win10 | grep -A10 hostdev&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039; &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; started&lt;br /&gt;
&lt;br /&gt;
*Get Status &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Detach a USB Stick from the VM===&lt;br /&gt;
&lt;br /&gt;
*Detach device&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Scanner to the VM===&lt;br /&gt;
&lt;br /&gt;
*Pick the device&lt;br /&gt;
 root@ts01:~# &#039;&#039;lsusb&#039;&#039;&#039;&#039;&lt;br /&gt;
 Bus 002 Device 008: ID 04a9:190f Canon, Inc. CanoScan LiDE 220&lt;br /&gt;
&lt;br /&gt;
*Edit the vm setting, assume the vm is called win10&lt;br /&gt;
 root@ts01:~# virsh edit win10&lt;br /&gt;
Add the usb port between the xml devices element element, like:&lt;br /&gt;
 &amp;lt;devices&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/devices&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Add and save:&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;yes&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x04a9&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x190f&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Alternative edit the usb port using Virt-manager on x &amp;lt;br&amp;gt;&lt;br /&gt;
[[image:Virt-manager-usb.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Basic admin commands==&lt;br /&gt;
===Cloning a machine===&lt;br /&gt;
&#039;&#039;&#039;Cloning win10 to win10a&#039;&#039;&#039;&lt;br /&gt;
*Shutdown Main&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
 &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
*Clone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Clone Process&lt;br /&gt;
[[image:Clonevm.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virt-clone \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--original win10 \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--name win10a \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--auto-clone&#039;&#039;&#039;&lt;br /&gt;
 Allocating &#039;vm-surf01-clone.qcow2&#039;                                              | 127 GB  00:02:21&lt;br /&gt;
 &lt;br /&gt;
 Clone &#039;win10a&#039; created successfully.&lt;br /&gt;
&lt;br /&gt;
===Snapshots===&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-create win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 created&lt;br /&gt;
 root@ts01:~# virsh snapshot-list win10a&lt;br /&gt;
  Name         Creation Time               State&lt;br /&gt;
 ---------------------------------------------------&lt;br /&gt;
  1770483334   2026-02-07 17:55:34 +0100   running&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Revert snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-revert win10a 1770483334&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
===Hibernate===&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh managedsave win10a&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&lt;br /&gt;
&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10a&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reboot behaviour===&lt;br /&gt;
*Set the following in &#039;&#039;&#039;/etc/defaultlib/virt-guests&#039;&#039;&#039; to allow a manged reboot of the vm&#039;s, means that previous running vm&#039;s are automatically started again after reboot&lt;br /&gt;
&lt;br /&gt;
 # What to do when the host shuts down&lt;br /&gt;
 ON_SHUTDOWN=suspend&lt;br /&gt;
 &lt;br /&gt;
 # What to do when the host boots up&lt;br /&gt;
 ON_BOOT=start&lt;br /&gt;
 &lt;br /&gt;
 # Number of seconds to wait for a guest to shut down/suspend&lt;br /&gt;
 SHUTDOWN_TIMEOUT=300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- To be mentioned: &lt;br /&gt;
 Drawbacks:&lt;br /&gt;
 -Tricky Backup procedure &lt;br /&gt;
 -USB Stick handling&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Backup/Restore of the VM settings===&lt;br /&gt;
To Backup the VM settings only run:&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml vmname &amp;gt; vmname.xml&lt;br /&gt;
&lt;br /&gt;
*To Restore&lt;br /&gt;
 virsh define vmname.xml&lt;br /&gt;
&lt;br /&gt;
==Adding a new VM Storage==&lt;br /&gt;
===Partition the new storage===&lt;br /&gt;
 root@ts01:~# parted /dev/nvme0n1&lt;br /&gt;
 GNU Parted 3.6&lt;br /&gt;
 Using /dev/nvme0n1&lt;br /&gt;
 Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? y&lt;br /&gt;
 (parted) quit&lt;br /&gt;
 Information: You may need to update /etc/fstab.&lt;br /&gt;
===Add Filesystem===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;mkfs.ext4 /dev/nvme0n1p1&#039;&#039;&#039;&lt;br /&gt;
 mke2fs 1.47.2 (1-Jan-2025)&lt;br /&gt;
 /dev/nvme0n1p1 contains a ntfs file system labelled &#039;NVM&#039;&lt;br /&gt;
 Proceed anyway? (y,N) y&lt;br /&gt;
 Discarding device blocks: done&lt;br /&gt;
 Creating filesystem with 500099328 4k blocks and 125026304 inodes&lt;br /&gt;
 Filesystem UUID: 2382c329-2c7c-4a57-855d-aea09003dd30&lt;br /&gt;
 Superblock backups stored on blocks:&lt;br /&gt;
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;br /&gt;
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,&lt;br /&gt;
        102400000, 214990848&lt;br /&gt;
 &lt;br /&gt;
 Allocating group tables: done&lt;br /&gt;
 Writing inode tables: done&lt;br /&gt;
 Creating journal (262144 blocks): done&lt;br /&gt;
 Writing superblocks and filesystem accounting information: done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mount Filesystem===&lt;br /&gt;
*Make and mount&lt;br /&gt;
 root@ts01:~# mkdir /vmstorage&lt;br /&gt;
 root@ts01:~# mount /dev/nvme0n1p1 /vmstorage&lt;br /&gt;
&lt;br /&gt;
*Check&lt;br /&gt;
 root@ts01:~# df -h&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 tmpfs           6.1G   16M  6.1G   1% /run&lt;br /&gt;
 /dev/sda2       915G  459G  411G  53% /&lt;br /&gt;
 tmpfs            31G     0   31G   0% /dev/shm&lt;br /&gt;
 efivarfs        256K  148K  104K  59% /sys/firmware/efi/efivars&lt;br /&gt;
 tmpfs           5.0M   12K  5.0M   1% /run/lock&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service&lt;br /&gt;
 /dev/sda1       1.1G  6.3M  1.1G   1% /boot/efi&lt;br /&gt;
 tmpfs            31G  8.0K   31G   1% /tmp&lt;br /&gt;
 tmpfs           6.1G  116K  6.1G   1% /run/user/60578&lt;br /&gt;
 tmpfs           6.1G  108K  6.1G   1% /run/user/1000&lt;br /&gt;
 &#039;&#039;&#039;/dev/nvme0n1p1  1.9T  2.1M  1.8T   1% /vmstorage&#039;&#039;&#039;&lt;br /&gt;
*Get UUID&lt;br /&gt;
 root@ts01:~# blkid /dev/nvme0n1p1&lt;br /&gt;
 /dev/nvme0n1p1: UUID=&amp;quot;2382c329-2c7c-4a57-855d-aea09003dd30&amp;quot; BLOCK_SIZE=&amp;quot;4096&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTLABEL=&amp;quot;primary&amp;quot; PARTUUID=&amp;quot;f49249d9-50eb-45bd-aafc-701ef7d66f5b&amp;quot;&lt;br /&gt;
*Add to /etc/fstab&lt;br /&gt;
 UUID=2382c329-2c7c-4a57-855d-aea09003dd30  /vmstorage  ext4  defaults  0 2&lt;br /&gt;
*Reboot to test!&lt;br /&gt;
&lt;br /&gt;
===Create a new Pool and apply new VMs===&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
&lt;br /&gt;
*Create a new pool using the new vmstorage&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-define-as nvme-pool dir --target /vmstorage&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool defined&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-build nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool built&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-start nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool started&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-autostart nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
  nvme-pool   active   yes&lt;br /&gt;
&lt;br /&gt;
*Move the VM to another disk&lt;br /&gt;
 root@ts01:~# mv /var/lib/libvirt/images/vm-win10a.qcow2 /vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*Edit the vm settings&lt;br /&gt;
 root@ts01:~# virsh edit win10a&lt;br /&gt;
&lt;br /&gt;
*Then:&lt;br /&gt;
**set source file to:&lt;br /&gt;
**/vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*And save&lt;br /&gt;
 Domain &#039;win10a&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
*To delete the pool use:&lt;br /&gt;
 virsh pool-destroy nvme-pool&lt;br /&gt;
 virsh pool-undefine nvme-pool&lt;br /&gt;
&lt;br /&gt;
==Deploy a new VM via CLI==&lt;br /&gt;
*Requires (template copy):&lt;br /&gt;
**/data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
This will setup a new VM with:&lt;br /&gt;
*Name: vm-bookworm&lt;br /&gt;
*OS Debian 13 (Trixy)&lt;br /&gt;
*Disk: /data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
*2CPU/2GB-RAM&lt;br /&gt;
*Network Bridged &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:/data/vmstorage# &#039;&#039;&#039;virt-install&#039;&#039;&#039; \&lt;br /&gt;
  --name vm-bookworm \&lt;br /&gt;
  --memory 2048 \&lt;br /&gt;
  --vcpus 2 \&lt;br /&gt;
  --cpu host-passthrough \&lt;br /&gt;
  --os-variant debian12 \&lt;br /&gt;
  --disk path=/data/vmstorage/vm-bookworm.qcow2,bus=virtio,discard=unmap \&lt;br /&gt;
  --network bridge=br0,model=virtio \&lt;br /&gt;
  --graphics spice,listen=0.0.0.0 \&lt;br /&gt;
  --channel spicevmc \&lt;br /&gt;
  --autoconsole none \&lt;br /&gt;
  --import&lt;br /&gt;
 &lt;br /&gt;
 Starting install...&lt;br /&gt;
 Creating domain...                                                                                                                               |         00:00:00&lt;br /&gt;
 Domain creation completed.&lt;br /&gt;
&lt;br /&gt;
==Useful Commands==&lt;br /&gt;
*Nmap accross the network to obtain new IP addresses from new vm machines&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;nmap -sn 192.168.2.0/24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Add a description for a VM&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname &amp;quot;My Description ...&amp;quot; --config&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 My Description ...&lt;br /&gt;
&lt;br /&gt;
* Alternative description with carriage returns within the text&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname --config --new-desc $&#039;Line 1: Text123\nLine 2: Text456\nLine 3: Text789&#039;&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 Line 1: Text123&lt;br /&gt;
 Line 2: Text456&lt;br /&gt;
 Line 3: Text789&lt;br /&gt;
&lt;br /&gt;
*Virtual Top&lt;br /&gt;
 root@ts01:/# &#039;&#039;&#039;virt-top&#039;&#039;&#039;&lt;br /&gt;
 virt-top 21:20:58 - x86_64 24/24CPU 1200MHz 61890MB&lt;br /&gt;
 6 domains, 1 active, 1 running, 0 sleeping, 0 paused, 5 inactive D:0 O:0 X:0&lt;br /&gt;
 CPU: 0.1%  Mem: 2048 MB (2048 MB by guests)&lt;br /&gt;
 &lt;br /&gt;
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME&lt;br /&gt;
   10 R    0    2 1396  206  0.1  3.0   0:47.07 vm-bookworm&lt;br /&gt;
&lt;br /&gt;
*Configure Autostart&lt;br /&gt;
&lt;br /&gt;
 virsh autostart win11&lt;br /&gt;
&lt;br /&gt;
 virsh dominfo win11 | grep Autostart&lt;br /&gt;
 Autostart:      enable&lt;br /&gt;
 Autostart Once: disable&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1140</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1140"/>
		<updated>2026-02-28T17:35:08Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Motivation&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Running&#039;&#039;&#039; Kernel-based Virtual Machine (KVM)&#039;&#039;&#039; on my local machine instead of &lt;br /&gt;
* &amp;lt;s&amp;gt;Hyper-V&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;VMWare&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Proxmox &amp;lt;/s&amp;gt;&lt;br /&gt;
Use on board Linux apps and utilities only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===System Information===&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo -i&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# cat /etc/os-release&lt;br /&gt;
 PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;&lt;br /&gt;
 NAME=&amp;quot;Ubuntu&amp;quot;&lt;br /&gt;
 VERSION_ID=&amp;quot;25.10&amp;quot;&lt;br /&gt;
 VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;&lt;br /&gt;
 VERSION_CODENAME=questing&lt;br /&gt;
 ID=ubuntu&lt;br /&gt;
 ID_LIKE=debian&lt;br /&gt;
 HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;&lt;br /&gt;
 SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;&lt;br /&gt;
 BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;&lt;br /&gt;
 PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;&lt;br /&gt;
 UBUNTU_CODENAME=questing&lt;br /&gt;
 LOGO=ubuntu-logo&lt;br /&gt;
&lt;br /&gt;
===Install and setup packages===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;apt install -y   &#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;qemu-kvm \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-daemon-system \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-clients \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;bridge-utils \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;virt-manager \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;cpu-checker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Libvirt (Orchestrator)====&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl enable --now libvirtd&#039;&#039;&#039;&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl status libvirtd&#039;&#039;&#039;&lt;br /&gt;
 ● libvirtd.service - libvirt legacy monolithic daemon&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2026-02-04 19:32:47 CET; 52min ago&lt;br /&gt;
  Invocation: de3b4269f9074f69aef468813b833a4b&lt;br /&gt;
 TriggeredBy: ● libvirtd.socket&lt;br /&gt;
             ● libvirtd-admin.socket&lt;br /&gt;
             ● libvirtd-ro.socket&lt;br /&gt;
       Docs: man:libvirtd(8)&lt;br /&gt;
             https://libvirt.org/&lt;br /&gt;
   Main PID: 26280 (libvirtd)&lt;br /&gt;
      Tasks: 25 (limit: 32768)&lt;br /&gt;
     Memory: 24.1M (peak: 51M)&lt;br /&gt;
        CPU: 9.655s&lt;br /&gt;
     CGroup: /system.slice/libvirtd.service&lt;br /&gt;
             ├─26280 /usr/sbin/libvirtd --timeout 120&lt;br /&gt;
             ├─26388 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
             └─26389 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
 &lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPDISCOVER(virbr0) 52:54:00:2a:f9:66&lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPOFFER(virbr0) 192.168.122.128 52:54:00:2a:f9:66root@ts01:~# kvm-ok&lt;br /&gt;
&lt;br /&gt;
====Virsh (Controler)====&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 Id   Name       State&lt;br /&gt;
 --------------------------&lt;br /&gt;
*Node Info&lt;br /&gt;
 root@ts01:~# virsh nodeinfo&lt;br /&gt;
 CPU model:           x86_64&lt;br /&gt;
 CPU(s):              24&lt;br /&gt;
 CPU frequency:       1197 MHz&lt;br /&gt;
 CPU socket(s):       1&lt;br /&gt;
 Core(s) per socket:  12&lt;br /&gt;
 Thread(s) per core:  2&lt;br /&gt;
 NUMA cell(s):        1&lt;br /&gt;
 Memory size:         63375964 KiB&lt;br /&gt;
*Net List&lt;br /&gt;
 root@ts01:~# virsh net-list --all&lt;br /&gt;
 Name      State    Autostart   Persistent&lt;br /&gt;
--------------------------------------------&lt;br /&gt;
 default   active   yes         yes&lt;br /&gt;
&lt;br /&gt;
*Set Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start default&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-autostart default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Prepare KVM User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;less /etc/groups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Optional start user admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
===Advanced - Bridging===&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start br0&#039;&#039;&#039;&lt;br /&gt;
 virsh net-autostart br0&lt;br /&gt;
 Network br0 started&lt;br /&gt;
 &lt;br /&gt;
 Network br0 marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*Shutdown running VM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown debian13&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 &#039;&#039;&#039;virsh edit debian&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Change:&lt;br /&gt;
 &amp;lt;interface type=&#039;network&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source network=&#039;default&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;interface type=&#039;bridge&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source bridge=&#039;br0&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;model type=&#039;virtio&#039;/&amp;gt;&lt;br /&gt;
 &amp;lt;/interface&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;debian13&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
==Advanced - Converting virtual disks==&lt;br /&gt;
===Converting a VHDX Windows Disk to qcow2===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /home/vmadmin/vm-surf01.vhdx&#039;&#039;&#039;&lt;br /&gt;
 image: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 41 GiB&lt;br /&gt;
 cluster_size: 33554432&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 41 GiB (43994054656 bytes)&lt;br /&gt;
    disk size: 41 GiB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Get the disk ready for KVM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -p -f vhdx -O qcow2 \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/home/vmadmin/vm-surf01.vhdx \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
 image: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
 file format: qcow2&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 37.6 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    compat: 1.1&lt;br /&gt;
    compression type: zlib&lt;br /&gt;
    lazy refcounts: false&lt;br /&gt;
    refcount bits: 16&lt;br /&gt;
    corrupt: false&lt;br /&gt;
    extended l2: false&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 37.6 GiB (40399208448 bytes)&lt;br /&gt;
    disk size: 37.6 GiB&lt;br /&gt;
&lt;br /&gt;
===Converting a VMDK VMWare Disk to qcow2===&lt;br /&gt;
*Inspect &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/ qemu-img info &#039;Windows 8.x x64.vmdk&#039; &#039;&#039;&#039;&lt;br /&gt;
 image: Windows 8.x x64.vmdk&lt;br /&gt;
 file format: vmdk&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 16.7 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    cid: 2432867383&lt;br /&gt;
    parent cid: 4294967295&lt;br /&gt;
    create type: monolithicSparse&lt;br /&gt;
    extents:&lt;br /&gt;
        [0]:&lt;br /&gt;
            virtual size: 107374182400&lt;br /&gt;
            filename: Windows 8.x x64.vmdk&lt;br /&gt;
            cluster size: 65536&lt;br /&gt;
            format:&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: Windows 8.x x64.vmdk&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 16.7 GiB (17974165504 bytes)&lt;br /&gt;
    disk size: 16.7 GiB&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -f vmdk -O qcow2 &#039;Windows 8.x x64.vmdk&#039; win8.qcow2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Converting a qcow2 Disk to vhdx===&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 qemu-img convert -p -f qcow2 -O vhdx win8.qcow2 win8.vhdx&lt;br /&gt;
&lt;br /&gt;
*Info&lt;br /&gt;
 root@ts01:~# qemu-img info win8.vhdx&lt;br /&gt;
 image: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 25.9 GiB&lt;br /&gt;
 cluster_size: 16777216&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/win8.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 26.6 GiB (28613541888 bytes)&lt;br /&gt;
    disk size: 25.9 GiB&lt;br /&gt;
&lt;br /&gt;
==VM Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Debian from ISO===&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Installation Win10 VM (former vhdx file)===&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Win11 VM (from iso, no registration)===&lt;br /&gt;
*Using the official Windows 11 ISO&lt;br /&gt;
*Install Windows 11 but without network, this way no registration takes place&lt;br /&gt;
&lt;br /&gt;
[[image:Win11-no-network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When asked for network connectivity then press &#039;&#039;&#039;Shift + F10&#039;&#039;&#039;&lt;br /&gt;
*Then type:&lt;br /&gt;
 OOBE\BYPASSNRO&lt;br /&gt;
&lt;br /&gt;
*After finishing the setup, shutdown&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh shutdown win11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It is required to install the network driver, but first detach the current iso image:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
&lt;br /&gt;
*Attach the network interface&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh attach-interface \&lt;br /&gt;
  --domain win11 \&lt;br /&gt;
  --type bridge \&lt;br /&gt;
  --source br0 \&lt;br /&gt;
  --model virtio \&lt;br /&gt;
  --config&lt;br /&gt;
 Interface attached successfully&lt;br /&gt;
&lt;br /&gt;
*Check:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh domiflist win11&lt;br /&gt;
  Interface   Type     Source   Model    MAC&lt;br /&gt;
 -----------------------------------------------------------&lt;br /&gt;
  -           bridge   br0      virtio   52:54:00:16:25:ee&lt;br /&gt;
&lt;br /&gt;
*Download driver disk:&lt;br /&gt;
 cd /var/lib/libvirt/images&lt;br /&gt;
 wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso&lt;br /&gt;
&lt;br /&gt;
*Attach driver disk:&lt;br /&gt;
 virsh attach-disk win11 \&lt;br /&gt;
  /var/lib/libvirt/images/virtio-win.iso \&lt;br /&gt;
  sdb \&lt;br /&gt;
  --type cdrom \&lt;br /&gt;
  --mode readonly \&lt;br /&gt;
  --targetbus sata \&lt;br /&gt;
  --config&lt;br /&gt;
&lt;br /&gt;
*Start VM&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh start win11&lt;br /&gt;
 Domain &#039;win11&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From Device Manager, Install missing Driver from the new disk: NetKVM\w10\amd64&lt;br /&gt;
[[image:Win11-install02.png|480px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Install&lt;br /&gt;
[[image:Win11-install03.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Stop  VM&lt;br /&gt;
*Detach Helper Disk&lt;br /&gt;
 root@ts01:/data/iso# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
*Finished&lt;br /&gt;
&lt;br /&gt;
===Installation Mac OS (EXPERIMENTAL)===&lt;br /&gt;
&lt;br /&gt;
*Repository Initialization&lt;br /&gt;
The foundation of the project relies on the OSX-KVM repository, which provides the OpenCore bootloader configurations and scripts to fetch official macOS assets.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Clone the project repository&lt;br /&gt;
git clone --depth 1 https://github.com/kholia/OSX-KVM.git&lt;br /&gt;
cd OSX-KVM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Preparation Tasks&lt;br /&gt;
Before configuring the Virtual Machine, specific scripts must be run to acquire the macOS installation media.&lt;br /&gt;
&lt;br /&gt;
*Fetching macOS Assets&lt;br /&gt;
Run the Python script to download the Recovery image directly from Apple&#039;s servers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./fetch-macOS-v2.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: You will be prompted to choose a version (e.g., Ventura, Sonoma). This creates a &amp;quot;BaseSystem.dmg&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
*Image Conversion&lt;br /&gt;
The downloaded DMG must be converted into a raw image format that KVM can easily mount.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dmg2img -i BaseSystem.dmg BaseSystem.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Disk Creation&lt;br /&gt;
Create the virtual hard drive where the OS will be permanently installed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qemu-img create -f qcow2 mac_hdd_ng.img 128G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Host-Level Optimizations&lt;br /&gt;
To prevent Kernel Panics during the boot process, the KVM module must be configured to ignore unhandled Model Specific Registers (MSRs).&lt;br /&gt;
&lt;br /&gt;
*Permanent MSR Fix&lt;br /&gt;
Edit or create the KVM configuration file on the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/modprobe.d/kvm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following configuration line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
options kvm ignore_msrs=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To apply the change without rebooting the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Machine XML Configuration&lt;br /&gt;
The VM is defined in Libvirt using a modified XML template. Key adjustments ensure the guest OS perceives the hardware as a compatible Apple-Intel machine.&lt;br /&gt;
&lt;br /&gt;
*CPU Masking and OSK&lt;br /&gt;
The CPU must be set to &#039;Penryn&#039; with an Intel vendor ID mask to bypass Apple&#039;s hardware checks.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;cpu mode=&#039;custom&#039; match=&#039;exact&#039; check=&#039;none&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;model fallback=&#039;allow&#039;&amp;gt;Penryn&amp;lt;/model&amp;gt;&lt;br /&gt;
  &amp;lt;feature policy=&#039;require&#039; name=&#039;vendor_id&#039; value=&#039;GenuineIntel&#039;/&amp;gt;&lt;br /&gt;
&amp;lt;/cpu&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The OSK (Apple System Management Controller Key) must be included in the QEMU command-line arguments section of the XML.&lt;br /&gt;
&lt;br /&gt;
*Storage and Firmware Paths&lt;br /&gt;
Ensure the following paths point to your actual local files:&lt;br /&gt;
* &#039;&#039;&#039;Loader:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_CODE_4M.fd&lt;br /&gt;
* &#039;&#039;&#039;NVRAM:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_VARS-1024x768.fd&lt;br /&gt;
* &#039;&#039;&#039;OpenCore:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
* &#039;&#039;&#039;BaseSystem:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
* &#039;&#039;&#039;Target Disk:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
&lt;br /&gt;
*Filesystem Permissions&lt;br /&gt;
Libvirt runs as a separate system user and requires explicit access to files located in a user&#039;s home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Enable directory traversal&lt;br /&gt;
chmod +x /home/vmadmin&lt;br /&gt;
chmod +x /home/vmadmin/OSX-KVM&lt;br /&gt;
&lt;br /&gt;
# Change ownership to the Libvirt-QEMU user&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The Installation Process&lt;br /&gt;
# &#039;&#039;&#039;Format:&#039;&#039;&#039; Use Disk Utility inside the &amp;quot;macOS Base System&amp;quot; to erase the virtual disk as APFS with a GUID Partition Map.&lt;br /&gt;
# &#039;&#039;&#039;Install:&#039;&#039;&#039; Select &amp;quot;Reinstall macOS&amp;quot; and target the newly formatted drive.&lt;br /&gt;
# &#039;&#039;&#039;Bootloader Logic:&#039;&#039;&#039; Upon rebooting, the OpenCore picker will show a &amp;quot;macOS Installer&amp;quot; icon. This must be selected for all intermediate reboots (usually 3-4 times).&lt;br /&gt;
# &#039;&#039;&#039;Final Boot:&#039;&#039;&#039; Once the installer icon disappears, select the name of your formatted drive (e.g., &amp;quot;MAConKVM&amp;quot;) to complete the user setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Screenshots:&#039;&#039;&#039;&lt;br /&gt;
[[image:Mac01.png|400px]]&lt;br /&gt;
[[image:Mac02.png|400px]]&lt;br /&gt;
[[image:Mac03.png|400px]]&lt;br /&gt;
[[image:Mac04.png|400px]]&lt;br /&gt;
[[image:Mac05a.png|400px]]&lt;br /&gt;
[[image:Mac06a.png|400px]]&lt;br /&gt;
[[image:Mac07.png|400px]]&lt;br /&gt;
[[image:Mac08a.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==USB Operations==&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Stick to the VM===&lt;br /&gt;
*Get attached devices&lt;br /&gt;
**Note: We&#039;re after &#039;&#039;&#039;ID 0781:5591 SanDisk Corp.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;lsusb&#039;&#039;&#039;&lt;br /&gt;
  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 001 Device 002: ID 8087:800a Intel Corp. Hub&lt;br /&gt;
  Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 002 Device 002: ID 3938:1032 MOSART Semi. 2.4G RF Keyboard &amp;amp; Mouse&lt;br /&gt;
  Bus 002 Device 003: ID 04b3:3025 IBM Corp. NetVista Full Width Keyboard&lt;br /&gt;
  Bus 002 Device 004: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  Bus 002 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller&lt;br /&gt;
  Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver&lt;br /&gt;
  Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub&lt;br /&gt;
  Bus 003 Device 002: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  &#039;&#039;&#039;Bus 003 Device 003: ID 0781:5591 SanDisk Corp. Ultra Flair&#039;&#039;&#039;&lt;br /&gt;
  Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub&lt;br /&gt;
&lt;br /&gt;
*Attach SanDisk to win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh dumpxml win10 | grep -A10 hostdev&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039; &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; started&lt;br /&gt;
&lt;br /&gt;
*Get Status &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Detach a USB Stick from the VM===&lt;br /&gt;
&lt;br /&gt;
*Detach device&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Scanner to the VM===&lt;br /&gt;
&lt;br /&gt;
*Pick the device&lt;br /&gt;
 root@ts01:~# &#039;&#039;lsusb&#039;&#039;&#039;&#039;&lt;br /&gt;
 Bus 002 Device 008: ID 04a9:190f Canon, Inc. CanoScan LiDE 220&lt;br /&gt;
&lt;br /&gt;
*Edit the vm setting, assume the vm is called win10&lt;br /&gt;
 root@ts01:~# virsh edit win10&lt;br /&gt;
Add the usb port between the xml devices element element, like:&lt;br /&gt;
 &amp;lt;devices&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/devices&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Add and save:&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;yes&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x04a9&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x190f&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Alternative edit the usb port using Virt-manager on x &amp;lt;br&amp;gt;&lt;br /&gt;
[[image:Virt-manager-usb.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Basic admin commands==&lt;br /&gt;
===Cloning a machine===&lt;br /&gt;
&#039;&#039;&#039;Cloning win10 to win10a&#039;&#039;&#039;&lt;br /&gt;
*Shutdown Main&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
 &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
*Clone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Clone Process&lt;br /&gt;
[[image:Clonevm.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virt-clone \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--original win10 \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--name win10a \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--auto-clone&#039;&#039;&#039;&lt;br /&gt;
 Allocating &#039;vm-surf01-clone.qcow2&#039;                                              | 127 GB  00:02:21&lt;br /&gt;
 &lt;br /&gt;
 Clone &#039;win10a&#039; created successfully.&lt;br /&gt;
&lt;br /&gt;
===Snapshots===&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-create win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 created&lt;br /&gt;
 root@ts01:~# virsh snapshot-list win10a&lt;br /&gt;
  Name         Creation Time               State&lt;br /&gt;
 ---------------------------------------------------&lt;br /&gt;
  1770483334   2026-02-07 17:55:34 +0100   running&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Revert snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-revert win10a 1770483334&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
===Hibernate===&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh managedsave win10a&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&lt;br /&gt;
&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10a&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reboot behaviour===&lt;br /&gt;
*Set the following in &#039;&#039;&#039;/etc/defaultlib/virt-guests&#039;&#039;&#039; to allow a manged reboot of the vm&#039;s, means that previous running vm&#039;s are automatically started again after reboot&lt;br /&gt;
&lt;br /&gt;
 # What to do when the host shuts down&lt;br /&gt;
 ON_SHUTDOWN=suspend&lt;br /&gt;
 &lt;br /&gt;
 # What to do when the host boots up&lt;br /&gt;
 ON_BOOT=start&lt;br /&gt;
 &lt;br /&gt;
 # Number of seconds to wait for a guest to shut down/suspend&lt;br /&gt;
 SHUTDOWN_TIMEOUT=300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- To be mentioned: &lt;br /&gt;
 Drawbacks:&lt;br /&gt;
 -Tricky Backup procedure &lt;br /&gt;
 -USB Stick handling&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Backup/Restore of the VM settings===&lt;br /&gt;
To Backup the VM settings only run:&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml vmname &amp;gt; vmname.xml&lt;br /&gt;
&lt;br /&gt;
*To Restore&lt;br /&gt;
 virsh define vmname.xml&lt;br /&gt;
&lt;br /&gt;
==Adding a new VM Storage==&lt;br /&gt;
===Partition the new storage===&lt;br /&gt;
 root@ts01:~# parted /dev/nvme0n1&lt;br /&gt;
 GNU Parted 3.6&lt;br /&gt;
 Using /dev/nvme0n1&lt;br /&gt;
 Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? y&lt;br /&gt;
 (parted) quit&lt;br /&gt;
 Information: You may need to update /etc/fstab.&lt;br /&gt;
===Add Filesystem===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;mkfs.ext4 /dev/nvme0n1p1&#039;&#039;&#039;&lt;br /&gt;
 mke2fs 1.47.2 (1-Jan-2025)&lt;br /&gt;
 /dev/nvme0n1p1 contains a ntfs file system labelled &#039;NVM&#039;&lt;br /&gt;
 Proceed anyway? (y,N) y&lt;br /&gt;
 Discarding device blocks: done&lt;br /&gt;
 Creating filesystem with 500099328 4k blocks and 125026304 inodes&lt;br /&gt;
 Filesystem UUID: 2382c329-2c7c-4a57-855d-aea09003dd30&lt;br /&gt;
 Superblock backups stored on blocks:&lt;br /&gt;
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;br /&gt;
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,&lt;br /&gt;
        102400000, 214990848&lt;br /&gt;
 &lt;br /&gt;
 Allocating group tables: done&lt;br /&gt;
 Writing inode tables: done&lt;br /&gt;
 Creating journal (262144 blocks): done&lt;br /&gt;
 Writing superblocks and filesystem accounting information: done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mount Filesystem===&lt;br /&gt;
*Make and mount&lt;br /&gt;
 root@ts01:~# mkdir /vmstorage&lt;br /&gt;
 root@ts01:~# mount /dev/nvme0n1p1 /vmstorage&lt;br /&gt;
&lt;br /&gt;
*Check&lt;br /&gt;
 root@ts01:~# df -h&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 tmpfs           6.1G   16M  6.1G   1% /run&lt;br /&gt;
 /dev/sda2       915G  459G  411G  53% /&lt;br /&gt;
 tmpfs            31G     0   31G   0% /dev/shm&lt;br /&gt;
 efivarfs        256K  148K  104K  59% /sys/firmware/efi/efivars&lt;br /&gt;
 tmpfs           5.0M   12K  5.0M   1% /run/lock&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service&lt;br /&gt;
 /dev/sda1       1.1G  6.3M  1.1G   1% /boot/efi&lt;br /&gt;
 tmpfs            31G  8.0K   31G   1% /tmp&lt;br /&gt;
 tmpfs           6.1G  116K  6.1G   1% /run/user/60578&lt;br /&gt;
 tmpfs           6.1G  108K  6.1G   1% /run/user/1000&lt;br /&gt;
 &#039;&#039;&#039;/dev/nvme0n1p1  1.9T  2.1M  1.8T   1% /vmstorage&#039;&#039;&#039;&lt;br /&gt;
*Get UUID&lt;br /&gt;
 root@ts01:~# blkid /dev/nvme0n1p1&lt;br /&gt;
 /dev/nvme0n1p1: UUID=&amp;quot;2382c329-2c7c-4a57-855d-aea09003dd30&amp;quot; BLOCK_SIZE=&amp;quot;4096&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTLABEL=&amp;quot;primary&amp;quot; PARTUUID=&amp;quot;f49249d9-50eb-45bd-aafc-701ef7d66f5b&amp;quot;&lt;br /&gt;
*Add to /etc/fstab&lt;br /&gt;
 UUID=2382c329-2c7c-4a57-855d-aea09003dd30  /vmstorage  ext4  defaults  0 2&lt;br /&gt;
*Reboot to test!&lt;br /&gt;
&lt;br /&gt;
===Create a new Pool and apply new VMs===&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
&lt;br /&gt;
*Create a new pool using the new vmstorage&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-define-as nvme-pool dir --target /vmstorage&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool defined&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-build nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool built&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-start nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool started&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-autostart nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
  nvme-pool   active   yes&lt;br /&gt;
&lt;br /&gt;
*Move the VM to another disk&lt;br /&gt;
 root@ts01:~# mv /var/lib/libvirt/images/vm-win10a.qcow2 /vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*Edit the vm settings&lt;br /&gt;
 root@ts01:~# virsh edit win10a&lt;br /&gt;
&lt;br /&gt;
*Then:&lt;br /&gt;
**set source file to:&lt;br /&gt;
**/vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*And save&lt;br /&gt;
 Domain &#039;win10a&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
*To delete the pool use:&lt;br /&gt;
 virsh pool-destroy nvme-pool&lt;br /&gt;
 virsh pool-undefine nvme-pool&lt;br /&gt;
&lt;br /&gt;
==Deploy a new VM via CLI==&lt;br /&gt;
*Requires (template copy):&lt;br /&gt;
**/data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
This will setup a new VM with:&lt;br /&gt;
*Name: vm-bookworm&lt;br /&gt;
*OS Debian 13 (Trixy)&lt;br /&gt;
*Disk: /data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
*2CPU/2GB-RAM&lt;br /&gt;
*Network Bridged &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:/data/vmstorage# &#039;&#039;&#039;virt-install&#039;&#039;&#039; \&lt;br /&gt;
  --name vm-bookworm \&lt;br /&gt;
  --memory 2048 \&lt;br /&gt;
  --vcpus 2 \&lt;br /&gt;
  --cpu host-passthrough \&lt;br /&gt;
  --os-variant debian12 \&lt;br /&gt;
  --disk path=/data/vmstorage/vm-bookworm.qcow2,bus=virtio,discard=unmap \&lt;br /&gt;
  --network bridge=br0,model=virtio \&lt;br /&gt;
  --graphics spice,listen=0.0.0.0 \&lt;br /&gt;
  --channel spicevmc \&lt;br /&gt;
  --autoconsole none \&lt;br /&gt;
  --import&lt;br /&gt;
 &lt;br /&gt;
 Starting install...&lt;br /&gt;
 Creating domain...                                                                                                                               |         00:00:00&lt;br /&gt;
 Domain creation completed.&lt;br /&gt;
&lt;br /&gt;
==Useful Commands==&lt;br /&gt;
*Nmap accross the network to obtain new IP addresses from new vm machines&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;nmap -sn 192.168.2.0/24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Add a description for a VM&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname &amp;quot;My Description ...&amp;quot; --config&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 My Description ...&lt;br /&gt;
&lt;br /&gt;
* Alternative description with carriage returns within the text&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname --config --new-desc $&#039;Line 1: Text123\nLine 2: Text456\nLine 3: Text789&#039;&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 Line 1: Text123&lt;br /&gt;
 Line 2: Text456&lt;br /&gt;
 Line 3: Text789&lt;br /&gt;
&lt;br /&gt;
*Virtual Top&lt;br /&gt;
 root@ts01:/# &#039;&#039;&#039;virt-top&#039;&#039;&#039;&lt;br /&gt;
 virt-top 21:20:58 - x86_64 24/24CPU 1200MHz 61890MB&lt;br /&gt;
 6 domains, 1 active, 1 running, 0 sleeping, 0 paused, 5 inactive D:0 O:0 X:0&lt;br /&gt;
 CPU: 0.1%  Mem: 2048 MB (2048 MB by guests)&lt;br /&gt;
 &lt;br /&gt;
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME&lt;br /&gt;
   10 R    0    2 1396  206  0.1  3.0   0:47.07 vm-bookworm&lt;br /&gt;
&lt;br /&gt;
*Configure Autostart&lt;br /&gt;
&lt;br /&gt;
 virsh autostart win11&lt;br /&gt;
&lt;br /&gt;
 virsh dominfo win11 | grep Autostart&lt;br /&gt;
 Autostart:      enable&lt;br /&gt;
 Autostart Once: disable&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1139</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1139"/>
		<updated>2026-02-28T17:03:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Motivation&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Running&#039;&#039;&#039; Kernel-based Virtual Machine (KVM)&#039;&#039;&#039; on my local machine instead of &lt;br /&gt;
* Microsoft Terminal Server / Remote Desktop&lt;br /&gt;
* VMWare&lt;br /&gt;
* Proxmox (for now)&lt;br /&gt;
Try to use the Linux on board utilities only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===System Information===&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo -i&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# cat /etc/os-release&lt;br /&gt;
 PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;&lt;br /&gt;
 NAME=&amp;quot;Ubuntu&amp;quot;&lt;br /&gt;
 VERSION_ID=&amp;quot;25.10&amp;quot;&lt;br /&gt;
 VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;&lt;br /&gt;
 VERSION_CODENAME=questing&lt;br /&gt;
 ID=ubuntu&lt;br /&gt;
 ID_LIKE=debian&lt;br /&gt;
 HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;&lt;br /&gt;
 SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;&lt;br /&gt;
 BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;&lt;br /&gt;
 PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;&lt;br /&gt;
 UBUNTU_CODENAME=questing&lt;br /&gt;
 LOGO=ubuntu-logo&lt;br /&gt;
&lt;br /&gt;
===Install and setup packages===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;apt install -y   &#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;qemu-kvm \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-daemon-system \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-clients \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;bridge-utils \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;virt-manager \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;cpu-checker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Libvirt (Orchestrator)====&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl enable --now libvirtd&#039;&#039;&#039;&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl status libvirtd&#039;&#039;&#039;&lt;br /&gt;
 ● libvirtd.service - libvirt legacy monolithic daemon&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2026-02-04 19:32:47 CET; 52min ago&lt;br /&gt;
  Invocation: de3b4269f9074f69aef468813b833a4b&lt;br /&gt;
 TriggeredBy: ● libvirtd.socket&lt;br /&gt;
             ● libvirtd-admin.socket&lt;br /&gt;
             ● libvirtd-ro.socket&lt;br /&gt;
       Docs: man:libvirtd(8)&lt;br /&gt;
             https://libvirt.org/&lt;br /&gt;
   Main PID: 26280 (libvirtd)&lt;br /&gt;
      Tasks: 25 (limit: 32768)&lt;br /&gt;
     Memory: 24.1M (peak: 51M)&lt;br /&gt;
        CPU: 9.655s&lt;br /&gt;
     CGroup: /system.slice/libvirtd.service&lt;br /&gt;
             ├─26280 /usr/sbin/libvirtd --timeout 120&lt;br /&gt;
             ├─26388 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
             └─26389 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
 &lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPDISCOVER(virbr0) 52:54:00:2a:f9:66&lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPOFFER(virbr0) 192.168.122.128 52:54:00:2a:f9:66root@ts01:~# kvm-ok&lt;br /&gt;
&lt;br /&gt;
====Virsh (Controler)====&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 Id   Name       State&lt;br /&gt;
 --------------------------&lt;br /&gt;
*Node Info&lt;br /&gt;
 root@ts01:~# virsh nodeinfo&lt;br /&gt;
 CPU model:           x86_64&lt;br /&gt;
 CPU(s):              24&lt;br /&gt;
 CPU frequency:       1197 MHz&lt;br /&gt;
 CPU socket(s):       1&lt;br /&gt;
 Core(s) per socket:  12&lt;br /&gt;
 Thread(s) per core:  2&lt;br /&gt;
 NUMA cell(s):        1&lt;br /&gt;
 Memory size:         63375964 KiB&lt;br /&gt;
*Net List&lt;br /&gt;
 root@ts01:~# virsh net-list --all&lt;br /&gt;
 Name      State    Autostart   Persistent&lt;br /&gt;
--------------------------------------------&lt;br /&gt;
 default   active   yes         yes&lt;br /&gt;
&lt;br /&gt;
*Set Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start default&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-autostart default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Prepare KVM User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;less /etc/groups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Optional start user admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
===Advanced - Bridging===&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start br0&#039;&#039;&#039;&lt;br /&gt;
 virsh net-autostart br0&lt;br /&gt;
 Network br0 started&lt;br /&gt;
 &lt;br /&gt;
 Network br0 marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*Shutdown running VM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown debian13&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 &#039;&#039;&#039;virsh edit debian&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Change:&lt;br /&gt;
 &amp;lt;interface type=&#039;network&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source network=&#039;default&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;interface type=&#039;bridge&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source bridge=&#039;br0&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;model type=&#039;virtio&#039;/&amp;gt;&lt;br /&gt;
 &amp;lt;/interface&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;debian13&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
==Advanced - Converting virtual disks==&lt;br /&gt;
===Converting a VHDX Windows Disk===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /home/vmadmin/vm-surf01.vhdx&#039;&#039;&#039;&lt;br /&gt;
 image: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 41 GiB&lt;br /&gt;
 cluster_size: 33554432&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 41 GiB (43994054656 bytes)&lt;br /&gt;
    disk size: 41 GiB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Get the disk ready for KVM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -p -f vhdx -O qcow2 \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/home/vmadmin/vm-surf01.vhdx \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
 image: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
 file format: qcow2&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 37.6 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    compat: 1.1&lt;br /&gt;
    compression type: zlib&lt;br /&gt;
    lazy refcounts: false&lt;br /&gt;
    refcount bits: 16&lt;br /&gt;
    corrupt: false&lt;br /&gt;
    extended l2: false&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 37.6 GiB (40399208448 bytes)&lt;br /&gt;
    disk size: 37.6 GiB&lt;br /&gt;
&lt;br /&gt;
===Converting a VMDK VMWare Disk===&lt;br /&gt;
*Inspect &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/ qemu-img info &#039;Windows 8.x x64.vmdk&#039; &#039;&#039;&#039;&lt;br /&gt;
 image: Windows 8.x x64.vmdk&lt;br /&gt;
 file format: vmdk&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 16.7 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    cid: 2432867383&lt;br /&gt;
    parent cid: 4294967295&lt;br /&gt;
    create type: monolithicSparse&lt;br /&gt;
    extents:&lt;br /&gt;
        [0]:&lt;br /&gt;
            virtual size: 107374182400&lt;br /&gt;
            filename: Windows 8.x x64.vmdk&lt;br /&gt;
            cluster size: 65536&lt;br /&gt;
            format:&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: Windows 8.x x64.vmdk&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 16.7 GiB (17974165504 bytes)&lt;br /&gt;
    disk size: 16.7 GiB&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -f vmdk -O qcow2 &#039;Windows 8.x x64.vmdk&#039; win8.qcow2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==VM Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Debian from ISO===&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Installation Win10 VM (former vhdx file)===&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Win11 VM (from iso, no registration)===&lt;br /&gt;
&lt;br /&gt;
*Install Windows 11 but without network&lt;br /&gt;
[[image:Win11-no-network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When asked for network connectivity then press &#039;&#039;&#039;Shift + F10&#039;&#039;&#039;&lt;br /&gt;
*Then type:&lt;br /&gt;
 OOBE\BYPASSNRO&lt;br /&gt;
&lt;br /&gt;
*After finishing the setup, shutdown&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh shutdown win11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It is required to install the network driver, but first detach the current iso image:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
&lt;br /&gt;
*Attach the network interface&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh attach-interface \&lt;br /&gt;
  --domain win11 \&lt;br /&gt;
  --type bridge \&lt;br /&gt;
  --source br0 \&lt;br /&gt;
  --model virtio \&lt;br /&gt;
  --config&lt;br /&gt;
 Interface attached successfully&lt;br /&gt;
&lt;br /&gt;
*Check:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh domiflist win11&lt;br /&gt;
  Interface   Type     Source   Model    MAC&lt;br /&gt;
 -----------------------------------------------------------&lt;br /&gt;
  -           bridge   br0      virtio   52:54:00:16:25:ee&lt;br /&gt;
&lt;br /&gt;
*Download driver disk:&lt;br /&gt;
 cd /var/lib/libvirt/images&lt;br /&gt;
 wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso&lt;br /&gt;
&lt;br /&gt;
*Attach driver disk:&lt;br /&gt;
 virsh attach-disk win11 \&lt;br /&gt;
  /var/lib/libvirt/images/virtio-win.iso \&lt;br /&gt;
  sdb \&lt;br /&gt;
  --type cdrom \&lt;br /&gt;
  --mode readonly \&lt;br /&gt;
  --targetbus sata \&lt;br /&gt;
  --config&lt;br /&gt;
&lt;br /&gt;
*Start VM&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh start win11&lt;br /&gt;
 Domain &#039;win11&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From Device Manager, Install missing Driver from the new disk: NetKVM\w10\amd64&lt;br /&gt;
[[image:Win11-install02.png|480px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Install&lt;br /&gt;
[[image:Win11-install03.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Stop  VM&lt;br /&gt;
*Detach Helper Disk&lt;br /&gt;
 root@ts01:/data/iso# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
*Finished&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Mac OS (EXPERIMENTAL)===&lt;br /&gt;
&lt;br /&gt;
*Repository Initialization&lt;br /&gt;
The foundation of the project relies on the OSX-KVM repository, which provides the OpenCore bootloader configurations and scripts to fetch official macOS assets.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Clone the project repository&lt;br /&gt;
git clone --depth 1 https://github.com/kholia/OSX-KVM.git&lt;br /&gt;
cd OSX-KVM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Preparation Tasks&lt;br /&gt;
Before configuring the Virtual Machine, specific scripts must be run to acquire the macOS installation media.&lt;br /&gt;
&lt;br /&gt;
*Fetching macOS Assets&lt;br /&gt;
Run the Python script to download the Recovery image directly from Apple&#039;s servers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./fetch-macOS-v2.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: You will be prompted to choose a version (e.g., Ventura, Sonoma). This creates a &amp;quot;BaseSystem.dmg&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
*Image Conversion&lt;br /&gt;
The downloaded DMG must be converted into a raw image format that KVM can easily mount.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dmg2img -i BaseSystem.dmg BaseSystem.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Disk Creation&lt;br /&gt;
Create the virtual hard drive where the OS will be permanently installed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qemu-img create -f qcow2 mac_hdd_ng.img 128G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Host-Level Optimizations&lt;br /&gt;
To prevent Kernel Panics during the boot process, the KVM module must be configured to ignore unhandled Model Specific Registers (MSRs).&lt;br /&gt;
&lt;br /&gt;
*Permanent MSR Fix&lt;br /&gt;
Edit or create the KVM configuration file on the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/modprobe.d/kvm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following configuration line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
options kvm ignore_msrs=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To apply the change without rebooting the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Virtual Machine XML Configuration&lt;br /&gt;
The VM is defined in Libvirt using a modified XML template. Key adjustments ensure the guest OS perceives the hardware as a compatible Apple-Intel machine.&lt;br /&gt;
&lt;br /&gt;
*CPU Masking and OSK&lt;br /&gt;
The CPU must be set to &#039;Penryn&#039; with an Intel vendor ID mask to bypass Apple&#039;s hardware checks.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;cpu mode=&#039;custom&#039; match=&#039;exact&#039; check=&#039;none&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;model fallback=&#039;allow&#039;&amp;gt;Penryn&amp;lt;/model&amp;gt;&lt;br /&gt;
  &amp;lt;feature policy=&#039;require&#039; name=&#039;vendor_id&#039; value=&#039;GenuineIntel&#039;/&amp;gt;&lt;br /&gt;
&amp;lt;/cpu&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The OSK (Apple System Management Controller Key) must be included in the QEMU command-line arguments section of the XML.&lt;br /&gt;
&lt;br /&gt;
*Storage and Firmware Paths&lt;br /&gt;
Ensure the following paths point to your actual local files:&lt;br /&gt;
* &#039;&#039;&#039;Loader:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_CODE_4M.fd&lt;br /&gt;
* &#039;&#039;&#039;NVRAM:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_VARS-1024x768.fd&lt;br /&gt;
* &#039;&#039;&#039;OpenCore:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
* &#039;&#039;&#039;BaseSystem:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
* &#039;&#039;&#039;Target Disk:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
&lt;br /&gt;
*Filesystem Permissions&lt;br /&gt;
Libvirt runs as a separate system user and requires explicit access to files located in a user&#039;s home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Enable directory traversal&lt;br /&gt;
chmod +x /home/vmadmin&lt;br /&gt;
chmod +x /home/vmadmin/OSX-KVM&lt;br /&gt;
&lt;br /&gt;
# Change ownership to the Libvirt-QEMU user&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The Installation Process&lt;br /&gt;
# &#039;&#039;&#039;Format:&#039;&#039;&#039; Use Disk Utility inside the &amp;quot;macOS Base System&amp;quot; to erase the virtual disk as APFS with a GUID Partition Map.&lt;br /&gt;
# &#039;&#039;&#039;Install:&#039;&#039;&#039; Select &amp;quot;Reinstall macOS&amp;quot; and target the newly formatted drive.&lt;br /&gt;
# &#039;&#039;&#039;Bootloader Logic:&#039;&#039;&#039; Upon rebooting, the OpenCore picker will show a &amp;quot;macOS Installer&amp;quot; icon. This must be selected for all intermediate reboots (usually 3-4 times).&lt;br /&gt;
# &#039;&#039;&#039;Final Boot:&#039;&#039;&#039; Once the installer icon disappears, select the name of your formatted drive (e.g., &amp;quot;MAConKVM&amp;quot;) to complete the user setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Screenshots:&#039;&#039;&#039;&lt;br /&gt;
[[image:Mac01.png|400px]]&lt;br /&gt;
[[image:Mac02.png|400px]]&lt;br /&gt;
[[image:Mac03.png|400px]]&lt;br /&gt;
[[image:Mac04.png|400px]]&lt;br /&gt;
[[image:Mac05a.png|400px]]&lt;br /&gt;
[[image:Mac06a.png|400px]]&lt;br /&gt;
[[image:Mac07.png|400px]]&lt;br /&gt;
[[image:Mac08a.png|400px]]&lt;br /&gt;
&lt;br /&gt;
==USB Operations==&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Stick to the VM===&lt;br /&gt;
*Get attached devices&lt;br /&gt;
**Note: We&#039;re after &#039;&#039;&#039;ID 0781:5591 SanDisk Corp.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;lsusb&#039;&#039;&#039;&lt;br /&gt;
  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 001 Device 002: ID 8087:800a Intel Corp. Hub&lt;br /&gt;
  Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 002 Device 002: ID 3938:1032 MOSART Semi. 2.4G RF Keyboard &amp;amp; Mouse&lt;br /&gt;
  Bus 002 Device 003: ID 04b3:3025 IBM Corp. NetVista Full Width Keyboard&lt;br /&gt;
  Bus 002 Device 004: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  Bus 002 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller&lt;br /&gt;
  Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver&lt;br /&gt;
  Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub&lt;br /&gt;
  Bus 003 Device 002: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  &#039;&#039;&#039;Bus 003 Device 003: ID 0781:5591 SanDisk Corp. Ultra Flair&#039;&#039;&#039;&lt;br /&gt;
  Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub&lt;br /&gt;
&lt;br /&gt;
*Attach SanDisk to win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh dumpxml win10 | grep -A10 hostdev&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039; &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; started&lt;br /&gt;
&lt;br /&gt;
*Get Status &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Detach a USB Stick from the VM===&lt;br /&gt;
&lt;br /&gt;
*Detach device&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Scanner to the VM===&lt;br /&gt;
&lt;br /&gt;
*Pick the device&lt;br /&gt;
 root@ts01:~# &#039;&#039;lsusb&#039;&#039;&#039;&#039;&lt;br /&gt;
 Bus 002 Device 008: ID 04a9:190f Canon, Inc. CanoScan LiDE 220&lt;br /&gt;
&lt;br /&gt;
*Edit the vm setting, assume the vm is called win10&lt;br /&gt;
 root@ts01:~# virsh edit win10&lt;br /&gt;
Add the usb port between the xml devices element element, like:&lt;br /&gt;
 &amp;lt;devices&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/devices&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Add and save:&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;yes&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x04a9&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x190f&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Alternative edit the usb port using Virt-manager on x &amp;lt;br&amp;gt;&lt;br /&gt;
[[image:Virt-manager-usb.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Basic admin commands==&lt;br /&gt;
===Cloning a machine===&lt;br /&gt;
&#039;&#039;&#039;Cloning win10 to win10a&#039;&#039;&#039;&lt;br /&gt;
*Shutdown Main&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
 &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
*Clone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Clone Process&lt;br /&gt;
[[image:Clonevm.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virt-clone \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--original win10 \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--name win10a \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--auto-clone&#039;&#039;&#039;&lt;br /&gt;
 Allocating &#039;vm-surf01-clone.qcow2&#039;                                              | 127 GB  00:02:21&lt;br /&gt;
 &lt;br /&gt;
 Clone &#039;win10a&#039; created successfully.&lt;br /&gt;
&lt;br /&gt;
===Snapshots===&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-create win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 created&lt;br /&gt;
 root@ts01:~# virsh snapshot-list win10a&lt;br /&gt;
  Name         Creation Time               State&lt;br /&gt;
 ---------------------------------------------------&lt;br /&gt;
  1770483334   2026-02-07 17:55:34 +0100   running&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Revert snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-revert win10a 1770483334&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
===Hibernate===&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh managedsave win10a&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&lt;br /&gt;
&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10a&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reboot behaviour===&lt;br /&gt;
*Set the following in &#039;&#039;&#039;/etc/defaultlib/virt-guests&#039;&#039;&#039; to allow a manged reboot of the vm&#039;s, means that previous running vm&#039;s are automatically started again after reboot&lt;br /&gt;
&lt;br /&gt;
 # What to do when the host shuts down&lt;br /&gt;
 ON_SHUTDOWN=suspend&lt;br /&gt;
 &lt;br /&gt;
 # What to do when the host boots up&lt;br /&gt;
 ON_BOOT=start&lt;br /&gt;
 &lt;br /&gt;
 # Number of seconds to wait for a guest to shut down/suspend&lt;br /&gt;
 SHUTDOWN_TIMEOUT=300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- To be mentioned: &lt;br /&gt;
 Drawbacks:&lt;br /&gt;
 -Tricky Backup procedure &lt;br /&gt;
 -USB Stick handling&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Backup/Restore of the VM settings===&lt;br /&gt;
To Backup the VM settings only run:&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml vmname &amp;gt; vmname.xml&lt;br /&gt;
&lt;br /&gt;
*To Restore&lt;br /&gt;
 virsh define vmname.xml&lt;br /&gt;
&lt;br /&gt;
==Adding a new VM Storage==&lt;br /&gt;
===Partition the new storage===&lt;br /&gt;
 root@ts01:~# parted /dev/nvme0n1&lt;br /&gt;
 GNU Parted 3.6&lt;br /&gt;
 Using /dev/nvme0n1&lt;br /&gt;
 Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? y&lt;br /&gt;
 (parted) quit&lt;br /&gt;
 Information: You may need to update /etc/fstab.&lt;br /&gt;
===Add Filesystem===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;mkfs.ext4 /dev/nvme0n1p1&#039;&#039;&#039;&lt;br /&gt;
 mke2fs 1.47.2 (1-Jan-2025)&lt;br /&gt;
 /dev/nvme0n1p1 contains a ntfs file system labelled &#039;NVM&#039;&lt;br /&gt;
 Proceed anyway? (y,N) y&lt;br /&gt;
 Discarding device blocks: done&lt;br /&gt;
 Creating filesystem with 500099328 4k blocks and 125026304 inodes&lt;br /&gt;
 Filesystem UUID: 2382c329-2c7c-4a57-855d-aea09003dd30&lt;br /&gt;
 Superblock backups stored on blocks:&lt;br /&gt;
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;br /&gt;
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,&lt;br /&gt;
        102400000, 214990848&lt;br /&gt;
 &lt;br /&gt;
 Allocating group tables: done&lt;br /&gt;
 Writing inode tables: done&lt;br /&gt;
 Creating journal (262144 blocks): done&lt;br /&gt;
 Writing superblocks and filesystem accounting information: done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mount Filesystem===&lt;br /&gt;
*Make and mount&lt;br /&gt;
 root@ts01:~# mkdir /vmstorage&lt;br /&gt;
 root@ts01:~# mount /dev/nvme0n1p1 /vmstorage&lt;br /&gt;
&lt;br /&gt;
*Check&lt;br /&gt;
 root@ts01:~# df -h&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 tmpfs           6.1G   16M  6.1G   1% /run&lt;br /&gt;
 /dev/sda2       915G  459G  411G  53% /&lt;br /&gt;
 tmpfs            31G     0   31G   0% /dev/shm&lt;br /&gt;
 efivarfs        256K  148K  104K  59% /sys/firmware/efi/efivars&lt;br /&gt;
 tmpfs           5.0M   12K  5.0M   1% /run/lock&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service&lt;br /&gt;
 /dev/sda1       1.1G  6.3M  1.1G   1% /boot/efi&lt;br /&gt;
 tmpfs            31G  8.0K   31G   1% /tmp&lt;br /&gt;
 tmpfs           6.1G  116K  6.1G   1% /run/user/60578&lt;br /&gt;
 tmpfs           6.1G  108K  6.1G   1% /run/user/1000&lt;br /&gt;
 &#039;&#039;&#039;/dev/nvme0n1p1  1.9T  2.1M  1.8T   1% /vmstorage&#039;&#039;&#039;&lt;br /&gt;
*Get UUID&lt;br /&gt;
 root@ts01:~# blkid /dev/nvme0n1p1&lt;br /&gt;
 /dev/nvme0n1p1: UUID=&amp;quot;2382c329-2c7c-4a57-855d-aea09003dd30&amp;quot; BLOCK_SIZE=&amp;quot;4096&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTLABEL=&amp;quot;primary&amp;quot; PARTUUID=&amp;quot;f49249d9-50eb-45bd-aafc-701ef7d66f5b&amp;quot;&lt;br /&gt;
*Add to /etc/fstab&lt;br /&gt;
 UUID=2382c329-2c7c-4a57-855d-aea09003dd30  /vmstorage  ext4  defaults  0 2&lt;br /&gt;
*Reboot to test!&lt;br /&gt;
&lt;br /&gt;
===Create a new Pool and apply new VMs===&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
&lt;br /&gt;
*Create a new pool using the new vmstorage&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-define-as nvme-pool dir --target /vmstorage&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool defined&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-build nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool built&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-start nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool started&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-autostart nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
  nvme-pool   active   yes&lt;br /&gt;
&lt;br /&gt;
*Move the VM to another disk&lt;br /&gt;
 root@ts01:~# mv /var/lib/libvirt/images/vm-win10a.qcow2 /vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*Edit the vm settings&lt;br /&gt;
 root@ts01:~# virsh edit win10a&lt;br /&gt;
&lt;br /&gt;
*Then:&lt;br /&gt;
**set source file to:&lt;br /&gt;
**/vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*And save&lt;br /&gt;
 Domain &#039;win10a&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
*To delete the pool use:&lt;br /&gt;
 virsh pool-destroy nvme-pool&lt;br /&gt;
 virsh pool-undefine nvme-pool&lt;br /&gt;
&lt;br /&gt;
==Deploy a new VM via CLI==&lt;br /&gt;
*Requires (template copy):&lt;br /&gt;
**/data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
This will setup a new VM with:&lt;br /&gt;
*Name: vm-bookworm&lt;br /&gt;
*OS Debian 13 (Trixy)&lt;br /&gt;
*Disk: /data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
*2CPU/2GB-RAM&lt;br /&gt;
*Network Bridged &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:/data/vmstorage# &#039;&#039;&#039;virt-install&#039;&#039;&#039; \&lt;br /&gt;
  --name vm-bookworm \&lt;br /&gt;
  --memory 2048 \&lt;br /&gt;
  --vcpus 2 \&lt;br /&gt;
  --cpu host-passthrough \&lt;br /&gt;
  --os-variant debian12 \&lt;br /&gt;
  --disk path=/data/vmstorage/vm-bookworm.qcow2,bus=virtio,discard=unmap \&lt;br /&gt;
  --network bridge=br0,model=virtio \&lt;br /&gt;
  --graphics spice,listen=0.0.0.0 \&lt;br /&gt;
  --channel spicevmc \&lt;br /&gt;
  --autoconsole none \&lt;br /&gt;
  --import&lt;br /&gt;
 &lt;br /&gt;
 Starting install...&lt;br /&gt;
 Creating domain...                                                                                                                               |         00:00:00&lt;br /&gt;
 Domain creation completed.&lt;br /&gt;
&lt;br /&gt;
==Useful Commands==&lt;br /&gt;
*Nmap accross the network to obtain new IP addresses from new vm machines&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;nmap -sn 192.168.2.0/24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Add a description for a VM&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname &amp;quot;My Description ...&amp;quot; --config&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 My Description ...&lt;br /&gt;
&lt;br /&gt;
* Alternative description with carriage returns within the text&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname --config --new-desc $&#039;Line 1: Text123\nLine 2: Text456\nLine 3: Text789&#039;&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 Line 1: Text123&lt;br /&gt;
 Line 2: Text456&lt;br /&gt;
 Line 3: Text789&lt;br /&gt;
&lt;br /&gt;
*Virtual Top&lt;br /&gt;
 root@ts01:/# &#039;&#039;&#039;virt-top&#039;&#039;&#039;&lt;br /&gt;
 virt-top 21:20:58 - x86_64 24/24CPU 1200MHz 61890MB&lt;br /&gt;
 6 domains, 1 active, 1 running, 0 sleeping, 0 paused, 5 inactive D:0 O:0 X:0&lt;br /&gt;
 CPU: 0.1%  Mem: 2048 MB (2048 MB by guests)&lt;br /&gt;
 &lt;br /&gt;
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME&lt;br /&gt;
   10 R    0    2 1396  206  0.1  3.0   0:47.07 vm-bookworm&lt;br /&gt;
&lt;br /&gt;
*Configure Autostart&lt;br /&gt;
&lt;br /&gt;
 virsh autostart win11&lt;br /&gt;
&lt;br /&gt;
 virsh dominfo win11 | grep Autostart&lt;br /&gt;
 Autostart:      enable&lt;br /&gt;
 Autostart Once: disable&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1138</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1138"/>
		<updated>2026-02-28T16:59:13Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Motivation&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Running&#039;&#039;&#039; Kernel-based Virtual Machine (KVM)&#039;&#039;&#039; on my local machine instead of &lt;br /&gt;
* Microsoft Terminal Server / Remote Desktop&lt;br /&gt;
* VMWare&lt;br /&gt;
* Proxmox (for now)&lt;br /&gt;
Try to use the Linux on board utilities only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===System Information===&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo -i&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# cat /etc/os-release&lt;br /&gt;
 PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;&lt;br /&gt;
 NAME=&amp;quot;Ubuntu&amp;quot;&lt;br /&gt;
 VERSION_ID=&amp;quot;25.10&amp;quot;&lt;br /&gt;
 VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;&lt;br /&gt;
 VERSION_CODENAME=questing&lt;br /&gt;
 ID=ubuntu&lt;br /&gt;
 ID_LIKE=debian&lt;br /&gt;
 HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;&lt;br /&gt;
 SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;&lt;br /&gt;
 BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;&lt;br /&gt;
 PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;&lt;br /&gt;
 UBUNTU_CODENAME=questing&lt;br /&gt;
 LOGO=ubuntu-logo&lt;br /&gt;
&lt;br /&gt;
===Install and setup packages===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;apt install -y   &#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;qemu-kvm \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-daemon-system \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-clients \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;bridge-utils \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;virt-manager \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;cpu-checker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Libvirt (Orchestrator)====&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl enable --now libvirtd&#039;&#039;&#039;&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl status libvirtd&#039;&#039;&#039;&lt;br /&gt;
 ● libvirtd.service - libvirt legacy monolithic daemon&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2026-02-04 19:32:47 CET; 52min ago&lt;br /&gt;
  Invocation: de3b4269f9074f69aef468813b833a4b&lt;br /&gt;
 TriggeredBy: ● libvirtd.socket&lt;br /&gt;
             ● libvirtd-admin.socket&lt;br /&gt;
             ● libvirtd-ro.socket&lt;br /&gt;
       Docs: man:libvirtd(8)&lt;br /&gt;
             https://libvirt.org/&lt;br /&gt;
   Main PID: 26280 (libvirtd)&lt;br /&gt;
      Tasks: 25 (limit: 32768)&lt;br /&gt;
     Memory: 24.1M (peak: 51M)&lt;br /&gt;
        CPU: 9.655s&lt;br /&gt;
     CGroup: /system.slice/libvirtd.service&lt;br /&gt;
             ├─26280 /usr/sbin/libvirtd --timeout 120&lt;br /&gt;
             ├─26388 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
             └─26389 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
 &lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPDISCOVER(virbr0) 52:54:00:2a:f9:66&lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPOFFER(virbr0) 192.168.122.128 52:54:00:2a:f9:66root@ts01:~# kvm-ok&lt;br /&gt;
&lt;br /&gt;
====Virsh (Controler)====&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 Id   Name       State&lt;br /&gt;
 --------------------------&lt;br /&gt;
*Node Info&lt;br /&gt;
 root@ts01:~# virsh nodeinfo&lt;br /&gt;
 CPU model:           x86_64&lt;br /&gt;
 CPU(s):              24&lt;br /&gt;
 CPU frequency:       1197 MHz&lt;br /&gt;
 CPU socket(s):       1&lt;br /&gt;
 Core(s) per socket:  12&lt;br /&gt;
 Thread(s) per core:  2&lt;br /&gt;
 NUMA cell(s):        1&lt;br /&gt;
 Memory size:         63375964 KiB&lt;br /&gt;
*Net List&lt;br /&gt;
 root@ts01:~# virsh net-list --all&lt;br /&gt;
 Name      State    Autostart   Persistent&lt;br /&gt;
--------------------------------------------&lt;br /&gt;
 default   active   yes         yes&lt;br /&gt;
&lt;br /&gt;
*Set Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start default&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-autostart default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Prepare KVM User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;less /etc/groups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Optional start user admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
===Advanced - Bridging===&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start br0&#039;&#039;&#039;&lt;br /&gt;
 virsh net-autostart br0&lt;br /&gt;
 Network br0 started&lt;br /&gt;
 &lt;br /&gt;
 Network br0 marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*Shutdown running VM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown debian13&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 &#039;&#039;&#039;virsh edit debian&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Change:&lt;br /&gt;
 &amp;lt;interface type=&#039;network&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source network=&#039;default&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;interface type=&#039;bridge&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source bridge=&#039;br0&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;model type=&#039;virtio&#039;/&amp;gt;&lt;br /&gt;
 &amp;lt;/interface&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;debian13&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
==Advanced - Converting virtual disks==&lt;br /&gt;
===Converting a VHDX Windows Disk===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /home/vmadmin/vm-surf01.vhdx&#039;&#039;&#039;&lt;br /&gt;
 image: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 41 GiB&lt;br /&gt;
 cluster_size: 33554432&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 41 GiB (43994054656 bytes)&lt;br /&gt;
    disk size: 41 GiB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Get the disk ready for KVM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -p -f vhdx -O qcow2 \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/home/vmadmin/vm-surf01.vhdx \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
 image: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
 file format: qcow2&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 37.6 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    compat: 1.1&lt;br /&gt;
    compression type: zlib&lt;br /&gt;
    lazy refcounts: false&lt;br /&gt;
    refcount bits: 16&lt;br /&gt;
    corrupt: false&lt;br /&gt;
    extended l2: false&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 37.6 GiB (40399208448 bytes)&lt;br /&gt;
    disk size: 37.6 GiB&lt;br /&gt;
&lt;br /&gt;
===Converting a VMDK VMWare Disk===&lt;br /&gt;
*Inspect &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/ qemu-img info &#039;Windows 8.x x64.vmdk&#039; &#039;&#039;&#039;&lt;br /&gt;
 image: Windows 8.x x64.vmdk&lt;br /&gt;
 file format: vmdk&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 16.7 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    cid: 2432867383&lt;br /&gt;
    parent cid: 4294967295&lt;br /&gt;
    create type: monolithicSparse&lt;br /&gt;
    extents:&lt;br /&gt;
        [0]:&lt;br /&gt;
            virtual size: 107374182400&lt;br /&gt;
            filename: Windows 8.x x64.vmdk&lt;br /&gt;
            cluster size: 65536&lt;br /&gt;
            format:&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: Windows 8.x x64.vmdk&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 16.7 GiB (17974165504 bytes)&lt;br /&gt;
    disk size: 16.7 GiB&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -f vmdk -O qcow2 &#039;Windows 8.x x64.vmdk&#039; win8.qcow2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==VM Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Debian from ISO===&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Installation Win10 VM (former vhdx file)===&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Win11 VM (from iso, no registration)===&lt;br /&gt;
&lt;br /&gt;
*Install Windows 11 but without network&lt;br /&gt;
[[image:Win11-no-network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When asked for network connectivity then press &#039;&#039;&#039;Shift + F10&#039;&#039;&#039;&lt;br /&gt;
*Then type:&lt;br /&gt;
 OOBE\BYPASSNRO&lt;br /&gt;
&lt;br /&gt;
*After finishing the setup, shutdown&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh shutdown win11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It is required to install the network driver, but first detach the current iso image:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
&lt;br /&gt;
*Attach the network interface&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh attach-interface \&lt;br /&gt;
  --domain win11 \&lt;br /&gt;
  --type bridge \&lt;br /&gt;
  --source br0 \&lt;br /&gt;
  --model virtio \&lt;br /&gt;
  --config&lt;br /&gt;
 Interface attached successfully&lt;br /&gt;
&lt;br /&gt;
*Check:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh domiflist win11&lt;br /&gt;
  Interface   Type     Source   Model    MAC&lt;br /&gt;
 -----------------------------------------------------------&lt;br /&gt;
  -           bridge   br0      virtio   52:54:00:16:25:ee&lt;br /&gt;
&lt;br /&gt;
*Download driver disk:&lt;br /&gt;
 cd /var/lib/libvirt/images&lt;br /&gt;
 wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso&lt;br /&gt;
&lt;br /&gt;
*Attach driver disk:&lt;br /&gt;
 virsh attach-disk win11 \&lt;br /&gt;
  /var/lib/libvirt/images/virtio-win.iso \&lt;br /&gt;
  sdb \&lt;br /&gt;
  --type cdrom \&lt;br /&gt;
  --mode readonly \&lt;br /&gt;
  --targetbus sata \&lt;br /&gt;
  --config&lt;br /&gt;
&lt;br /&gt;
*Start VM&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh start win11&lt;br /&gt;
 Domain &#039;win11&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From Device Manager, Install missing Driver from the new disk: NetKVM\w10\amd64&lt;br /&gt;
[[image:Win11-install02.png|480px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Install&lt;br /&gt;
[[image:Win11-install03.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Stop  VM&lt;br /&gt;
*Detach Helper Disk&lt;br /&gt;
 root@ts01:/data/iso# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
*Finished&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Mac OS (Project from Github)===&lt;br /&gt;
&lt;br /&gt;
==== Repository Initialization ====&lt;br /&gt;
The foundation of the project relies on the OSX-KVM repository, which provides the OpenCore bootloader configurations and scripts to fetch official macOS assets.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Clone the project repository&lt;br /&gt;
git clone --depth 1 https://github.com/kholia/OSX-KVM.git&lt;br /&gt;
cd OSX-KVM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Preparation Tasks ====&lt;br /&gt;
Before configuring the Virtual Machine, specific scripts must be run to acquire the macOS installation media.&lt;br /&gt;
&lt;br /&gt;
===== Fetching macOS Assets =====&lt;br /&gt;
Run the Python script to download the Recovery image directly from Apple&#039;s servers.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./fetch-macOS-v2.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: You will be prompted to choose a version (e.g., Ventura, Sonoma). This creates a &amp;quot;BaseSystem.dmg&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
===== Image Conversion =====&lt;br /&gt;
The downloaded DMG must be converted into a raw image format that KVM can easily mount.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dmg2img -i BaseSystem.dmg BaseSystem.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Virtual Disk Creation =====&lt;br /&gt;
Create the virtual hard drive where the OS will be permanently installed.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qemu-img create -f qcow2 mac_hdd_ng.img 128G&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Host-Level Optimizations ====&lt;br /&gt;
To prevent Kernel Panics during the boot process, the KVM module must be configured to ignore unhandled Model Specific Registers (MSRs).&lt;br /&gt;
&lt;br /&gt;
===== Permanent MSR Fix =====&lt;br /&gt;
Edit or create the KVM configuration file on the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/modprobe.d/kvm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following configuration line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
options kvm ignore_msrs=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To apply the change without rebooting the host:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Virtual Machine XML Configuration ====&lt;br /&gt;
The VM is defined in Libvirt using a modified XML template. Key adjustments ensure the guest OS perceives the hardware as a compatible Apple-Intel machine.&lt;br /&gt;
&lt;br /&gt;
===== CPU Masking and OSK =====&lt;br /&gt;
The CPU must be set to &#039;Penryn&#039; with an Intel vendor ID mask to bypass Apple&#039;s hardware checks.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;cpu mode=&#039;custom&#039; match=&#039;exact&#039; check=&#039;none&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;model fallback=&#039;allow&#039;&amp;gt;Penryn&amp;lt;/model&amp;gt;&lt;br /&gt;
  &amp;lt;feature policy=&#039;require&#039; name=&#039;vendor_id&#039; value=&#039;GenuineIntel&#039;/&amp;gt;&lt;br /&gt;
&amp;lt;/cpu&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The OSK (Apple System Management Controller Key) must be included in the QEMU command-line arguments section of the XML.&lt;br /&gt;
&lt;br /&gt;
===== Storage and Firmware Paths =====&lt;br /&gt;
Ensure the following paths point to your actual local files:&lt;br /&gt;
* &#039;&#039;&#039;Loader:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_CODE_4M.fd&lt;br /&gt;
* &#039;&#039;&#039;NVRAM:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OVMF_VARS-1024x768.fd&lt;br /&gt;
* &#039;&#039;&#039;OpenCore:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
* &#039;&#039;&#039;BaseSystem:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
* &#039;&#039;&#039;Target Disk:&#039;&#039;&#039; /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
&lt;br /&gt;
==== Filesystem Permissions ====&lt;br /&gt;
Libvirt runs as a separate system user and requires explicit access to files located in a user&#039;s home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Enable directory traversal&lt;br /&gt;
chmod +x /home/vmadmin&lt;br /&gt;
chmod +x /home/vmadmin/OSX-KVM&lt;br /&gt;
&lt;br /&gt;
# Change ownership to the Libvirt-QEMU user&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/mac_hdd_ng.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/BaseSystem.img&lt;br /&gt;
sudo chown libvirt-qemu:kvm /home/vmadmin/OSX-KVM/OpenCore/OpenCore.qcow2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== The Installation Process ====&lt;br /&gt;
# &#039;&#039;&#039;Format:&#039;&#039;&#039; Use Disk Utility inside the &amp;quot;macOS Base System&amp;quot; to erase the virtual disk as APFS with a GUID Partition Map.&lt;br /&gt;
# &#039;&#039;&#039;Install:&#039;&#039;&#039; Select &amp;quot;Reinstall macOS&amp;quot; and target the newly formatted drive.&lt;br /&gt;
# &#039;&#039;&#039;Bootloader Logic:&#039;&#039;&#039; Upon rebooting, the OpenCore picker will show a &amp;quot;macOS Installer&amp;quot; icon. This must be selected for all intermediate reboots (usually 3-4 times).&lt;br /&gt;
# &#039;&#039;&#039;Final Boot:&#039;&#039;&#039; Once the installer icon disappears, select the name of your formatted drive (e.g., &amp;quot;MAConKVM&amp;quot;) to complete the user setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Pictures:&#039;&#039;&#039;&lt;br /&gt;
[[image:Mac01.png|600px]]&lt;br /&gt;
[[image:Mac02.png|600px]]&lt;br /&gt;
[[image:Mac03.png|600px]]&lt;br /&gt;
[[image:Mac04.png|600px]]&lt;br /&gt;
[[image:Mac05a.png|600px]]&lt;br /&gt;
[[image:Mac06a.png|600px]]&lt;br /&gt;
[[image:Mac07.png|600px]]&lt;br /&gt;
[[image:Mac08a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==USB Operations==&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Stick to the VM===&lt;br /&gt;
*Get attached devices&lt;br /&gt;
**Note: We&#039;re after &#039;&#039;&#039;ID 0781:5591 SanDisk Corp.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;lsusb&#039;&#039;&#039;&lt;br /&gt;
  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 001 Device 002: ID 8087:800a Intel Corp. Hub&lt;br /&gt;
  Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 002 Device 002: ID 3938:1032 MOSART Semi. 2.4G RF Keyboard &amp;amp; Mouse&lt;br /&gt;
  Bus 002 Device 003: ID 04b3:3025 IBM Corp. NetVista Full Width Keyboard&lt;br /&gt;
  Bus 002 Device 004: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  Bus 002 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller&lt;br /&gt;
  Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver&lt;br /&gt;
  Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub&lt;br /&gt;
  Bus 003 Device 002: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  &#039;&#039;&#039;Bus 003 Device 003: ID 0781:5591 SanDisk Corp. Ultra Flair&#039;&#039;&#039;&lt;br /&gt;
  Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub&lt;br /&gt;
&lt;br /&gt;
*Attach SanDisk to win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh dumpxml win10 | grep -A10 hostdev&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039; &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; started&lt;br /&gt;
&lt;br /&gt;
*Get Status &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Detach a USB Stick from the VM===&lt;br /&gt;
&lt;br /&gt;
*Detach device&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Scanner to the VM===&lt;br /&gt;
&lt;br /&gt;
*Pick the device&lt;br /&gt;
 root@ts01:~# &#039;&#039;lsusb&#039;&#039;&#039;&#039;&lt;br /&gt;
 Bus 002 Device 008: ID 04a9:190f Canon, Inc. CanoScan LiDE 220&lt;br /&gt;
&lt;br /&gt;
*Edit the vm setting, assume the vm is called win10&lt;br /&gt;
 root@ts01:~# virsh edit win10&lt;br /&gt;
Add the usb port between the xml devices element element, like:&lt;br /&gt;
 &amp;lt;devices&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/devices&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Add and save:&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;yes&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x04a9&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x190f&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Alternative edit the usb port using Virt-manager on x &amp;lt;br&amp;gt;&lt;br /&gt;
[[image:Virt-manager-usb.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Basic admin commands==&lt;br /&gt;
===Cloning a machine===&lt;br /&gt;
&#039;&#039;&#039;Cloning win10 to win10a&#039;&#039;&#039;&lt;br /&gt;
*Shutdown Main&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
 &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
*Clone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Clone Process&lt;br /&gt;
[[image:Clonevm.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virt-clone \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--original win10 \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--name win10a \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--auto-clone&#039;&#039;&#039;&lt;br /&gt;
 Allocating &#039;vm-surf01-clone.qcow2&#039;                                              | 127 GB  00:02:21&lt;br /&gt;
 &lt;br /&gt;
 Clone &#039;win10a&#039; created successfully.&lt;br /&gt;
&lt;br /&gt;
===Snapshots===&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-create win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 created&lt;br /&gt;
 root@ts01:~# virsh snapshot-list win10a&lt;br /&gt;
  Name         Creation Time               State&lt;br /&gt;
 ---------------------------------------------------&lt;br /&gt;
  1770483334   2026-02-07 17:55:34 +0100   running&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Revert snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-revert win10a 1770483334&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
===Hibernate===&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh managedsave win10a&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&lt;br /&gt;
&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10a&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reboot behaviour===&lt;br /&gt;
*Set the following in &#039;&#039;&#039;/etc/defaultlib/virt-guests&#039;&#039;&#039; to allow a manged reboot of the vm&#039;s, means that previous running vm&#039;s are automatically started again after reboot&lt;br /&gt;
&lt;br /&gt;
 # What to do when the host shuts down&lt;br /&gt;
 ON_SHUTDOWN=suspend&lt;br /&gt;
 &lt;br /&gt;
 # What to do when the host boots up&lt;br /&gt;
 ON_BOOT=start&lt;br /&gt;
 &lt;br /&gt;
 # Number of seconds to wait for a guest to shut down/suspend&lt;br /&gt;
 SHUTDOWN_TIMEOUT=300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- To be mentioned: &lt;br /&gt;
 Drawbacks:&lt;br /&gt;
 -Tricky Backup procedure &lt;br /&gt;
 -USB Stick handling&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Backup/Restore of the VM settings===&lt;br /&gt;
To Backup the VM settings only run:&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml vmname &amp;gt; vmname.xml&lt;br /&gt;
&lt;br /&gt;
*To Restore&lt;br /&gt;
 virsh define vmname.xml&lt;br /&gt;
&lt;br /&gt;
==Adding a new VM Storage==&lt;br /&gt;
===Partition the new storage===&lt;br /&gt;
 root@ts01:~# parted /dev/nvme0n1&lt;br /&gt;
 GNU Parted 3.6&lt;br /&gt;
 Using /dev/nvme0n1&lt;br /&gt;
 Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? y&lt;br /&gt;
 (parted) quit&lt;br /&gt;
 Information: You may need to update /etc/fstab.&lt;br /&gt;
===Add Filesystem===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;mkfs.ext4 /dev/nvme0n1p1&#039;&#039;&#039;&lt;br /&gt;
 mke2fs 1.47.2 (1-Jan-2025)&lt;br /&gt;
 /dev/nvme0n1p1 contains a ntfs file system labelled &#039;NVM&#039;&lt;br /&gt;
 Proceed anyway? (y,N) y&lt;br /&gt;
 Discarding device blocks: done&lt;br /&gt;
 Creating filesystem with 500099328 4k blocks and 125026304 inodes&lt;br /&gt;
 Filesystem UUID: 2382c329-2c7c-4a57-855d-aea09003dd30&lt;br /&gt;
 Superblock backups stored on blocks:&lt;br /&gt;
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;br /&gt;
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,&lt;br /&gt;
        102400000, 214990848&lt;br /&gt;
 &lt;br /&gt;
 Allocating group tables: done&lt;br /&gt;
 Writing inode tables: done&lt;br /&gt;
 Creating journal (262144 blocks): done&lt;br /&gt;
 Writing superblocks and filesystem accounting information: done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mount Filesystem===&lt;br /&gt;
*Make and mount&lt;br /&gt;
 root@ts01:~# mkdir /vmstorage&lt;br /&gt;
 root@ts01:~# mount /dev/nvme0n1p1 /vmstorage&lt;br /&gt;
&lt;br /&gt;
*Check&lt;br /&gt;
 root@ts01:~# df -h&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 tmpfs           6.1G   16M  6.1G   1% /run&lt;br /&gt;
 /dev/sda2       915G  459G  411G  53% /&lt;br /&gt;
 tmpfs            31G     0   31G   0% /dev/shm&lt;br /&gt;
 efivarfs        256K  148K  104K  59% /sys/firmware/efi/efivars&lt;br /&gt;
 tmpfs           5.0M   12K  5.0M   1% /run/lock&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service&lt;br /&gt;
 /dev/sda1       1.1G  6.3M  1.1G   1% /boot/efi&lt;br /&gt;
 tmpfs            31G  8.0K   31G   1% /tmp&lt;br /&gt;
 tmpfs           6.1G  116K  6.1G   1% /run/user/60578&lt;br /&gt;
 tmpfs           6.1G  108K  6.1G   1% /run/user/1000&lt;br /&gt;
 &#039;&#039;&#039;/dev/nvme0n1p1  1.9T  2.1M  1.8T   1% /vmstorage&#039;&#039;&#039;&lt;br /&gt;
*Get UUID&lt;br /&gt;
 root@ts01:~# blkid /dev/nvme0n1p1&lt;br /&gt;
 /dev/nvme0n1p1: UUID=&amp;quot;2382c329-2c7c-4a57-855d-aea09003dd30&amp;quot; BLOCK_SIZE=&amp;quot;4096&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTLABEL=&amp;quot;primary&amp;quot; PARTUUID=&amp;quot;f49249d9-50eb-45bd-aafc-701ef7d66f5b&amp;quot;&lt;br /&gt;
*Add to /etc/fstab&lt;br /&gt;
 UUID=2382c329-2c7c-4a57-855d-aea09003dd30  /vmstorage  ext4  defaults  0 2&lt;br /&gt;
*Reboot to test!&lt;br /&gt;
&lt;br /&gt;
===Create a new Pool and apply new VMs===&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
&lt;br /&gt;
*Create a new pool using the new vmstorage&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-define-as nvme-pool dir --target /vmstorage&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool defined&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-build nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool built&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-start nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool started&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-autostart nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
  nvme-pool   active   yes&lt;br /&gt;
&lt;br /&gt;
*Move the VM to another disk&lt;br /&gt;
 root@ts01:~# mv /var/lib/libvirt/images/vm-win10a.qcow2 /vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*Edit the vm settings&lt;br /&gt;
 root@ts01:~# virsh edit win10a&lt;br /&gt;
&lt;br /&gt;
*Then:&lt;br /&gt;
**set source file to:&lt;br /&gt;
**/vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*And save&lt;br /&gt;
 Domain &#039;win10a&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
*To delete the pool use:&lt;br /&gt;
 virsh pool-destroy nvme-pool&lt;br /&gt;
 virsh pool-undefine nvme-pool&lt;br /&gt;
&lt;br /&gt;
==Deploy a new VM via CLI==&lt;br /&gt;
*Requires (template copy):&lt;br /&gt;
**/data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
This will setup a new VM with:&lt;br /&gt;
*Name: vm-bookworm&lt;br /&gt;
*OS Debian 13 (Trixy)&lt;br /&gt;
*Disk: /data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
*2CPU/2GB-RAM&lt;br /&gt;
*Network Bridged &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:/data/vmstorage# &#039;&#039;&#039;virt-install&#039;&#039;&#039; \&lt;br /&gt;
  --name vm-bookworm \&lt;br /&gt;
  --memory 2048 \&lt;br /&gt;
  --vcpus 2 \&lt;br /&gt;
  --cpu host-passthrough \&lt;br /&gt;
  --os-variant debian12 \&lt;br /&gt;
  --disk path=/data/vmstorage/vm-bookworm.qcow2,bus=virtio,discard=unmap \&lt;br /&gt;
  --network bridge=br0,model=virtio \&lt;br /&gt;
  --graphics spice,listen=0.0.0.0 \&lt;br /&gt;
  --channel spicevmc \&lt;br /&gt;
  --autoconsole none \&lt;br /&gt;
  --import&lt;br /&gt;
 &lt;br /&gt;
 Starting install...&lt;br /&gt;
 Creating domain...                                                                                                                               |         00:00:00&lt;br /&gt;
 Domain creation completed.&lt;br /&gt;
&lt;br /&gt;
==Useful Commands==&lt;br /&gt;
*Nmap accross the network to obtain new IP addresses from new vm machines&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;nmap -sn 192.168.2.0/24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Add a description for a VM&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname &amp;quot;My Description ...&amp;quot; --config&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 My Description ...&lt;br /&gt;
&lt;br /&gt;
* Alternative description with carriage returns within the text&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname --config --new-desc $&#039;Line 1: Text123\nLine 2: Text456\nLine 3: Text789&#039;&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 Line 1: Text123&lt;br /&gt;
 Line 2: Text456&lt;br /&gt;
 Line 3: Text789&lt;br /&gt;
&lt;br /&gt;
*Virtual Top&lt;br /&gt;
 root@ts01:/# &#039;&#039;&#039;virt-top&#039;&#039;&#039;&lt;br /&gt;
 virt-top 21:20:58 - x86_64 24/24CPU 1200MHz 61890MB&lt;br /&gt;
 6 domains, 1 active, 1 running, 0 sleeping, 0 paused, 5 inactive D:0 O:0 X:0&lt;br /&gt;
 CPU: 0.1%  Mem: 2048 MB (2048 MB by guests)&lt;br /&gt;
 &lt;br /&gt;
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME&lt;br /&gt;
   10 R    0    2 1396  206  0.1  3.0   0:47.07 vm-bookworm&lt;br /&gt;
&lt;br /&gt;
*Configure Autostart&lt;br /&gt;
&lt;br /&gt;
 virsh autostart win11&lt;br /&gt;
&lt;br /&gt;
 virsh dominfo win11 | grep Autostart&lt;br /&gt;
 Autostart:      enable&lt;br /&gt;
 Autostart Once: disable&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Mac08a.png&amp;diff=1137</id>
		<title>File:Mac08a.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Mac08a.png&amp;diff=1137"/>
		<updated>2026-02-28T16:58:56Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Mac07.png&amp;diff=1136</id>
		<title>File:Mac07.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Mac07.png&amp;diff=1136"/>
		<updated>2026-02-28T16:58:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Mac06a.png&amp;diff=1135</id>
		<title>File:Mac06a.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Mac06a.png&amp;diff=1135"/>
		<updated>2026-02-28T16:58:35Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Mac05.png&amp;diff=1134</id>
		<title>File:Mac05.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Mac05.png&amp;diff=1134"/>
		<updated>2026-02-28T16:58:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Mac03.png&amp;diff=1133</id>
		<title>File:Mac03.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Mac03.png&amp;diff=1133"/>
		<updated>2026-02-28T16:58:13Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Mac02.png&amp;diff=1132</id>
		<title>File:Mac02.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Mac02.png&amp;diff=1132"/>
		<updated>2026-02-28T16:58:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Mac01.png&amp;diff=1131</id>
		<title>File:Mac01.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Mac01.png&amp;diff=1131"/>
		<updated>2026-02-28T16:57:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1130</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1130"/>
		<updated>2026-02-23T18:33:16Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Motivation&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Running&#039;&#039;&#039; Kernel-based Virtual Machine (KVM)&#039;&#039;&#039; on my local machine instead of &lt;br /&gt;
* Microsoft Terminal Server / Remote Desktop&lt;br /&gt;
* VMWare&lt;br /&gt;
* Proxmox (for now)&lt;br /&gt;
Try to use the Linux on board utilities only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===System Information===&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo -i&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# cat /etc/os-release&lt;br /&gt;
 PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;&lt;br /&gt;
 NAME=&amp;quot;Ubuntu&amp;quot;&lt;br /&gt;
 VERSION_ID=&amp;quot;25.10&amp;quot;&lt;br /&gt;
 VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;&lt;br /&gt;
 VERSION_CODENAME=questing&lt;br /&gt;
 ID=ubuntu&lt;br /&gt;
 ID_LIKE=debian&lt;br /&gt;
 HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;&lt;br /&gt;
 SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;&lt;br /&gt;
 BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;&lt;br /&gt;
 PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;&lt;br /&gt;
 UBUNTU_CODENAME=questing&lt;br /&gt;
 LOGO=ubuntu-logo&lt;br /&gt;
&lt;br /&gt;
===Install and setup packages===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;apt install -y   &#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;qemu-kvm \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-daemon-system \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-clients \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;bridge-utils \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;virt-manager \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;cpu-checker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Libvirt (Orchestrator)====&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl enable --now libvirtd&#039;&#039;&#039;&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl status libvirtd&#039;&#039;&#039;&lt;br /&gt;
 ● libvirtd.service - libvirt legacy monolithic daemon&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2026-02-04 19:32:47 CET; 52min ago&lt;br /&gt;
  Invocation: de3b4269f9074f69aef468813b833a4b&lt;br /&gt;
 TriggeredBy: ● libvirtd.socket&lt;br /&gt;
             ● libvirtd-admin.socket&lt;br /&gt;
             ● libvirtd-ro.socket&lt;br /&gt;
       Docs: man:libvirtd(8)&lt;br /&gt;
             https://libvirt.org/&lt;br /&gt;
   Main PID: 26280 (libvirtd)&lt;br /&gt;
      Tasks: 25 (limit: 32768)&lt;br /&gt;
     Memory: 24.1M (peak: 51M)&lt;br /&gt;
        CPU: 9.655s&lt;br /&gt;
     CGroup: /system.slice/libvirtd.service&lt;br /&gt;
             ├─26280 /usr/sbin/libvirtd --timeout 120&lt;br /&gt;
             ├─26388 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
             └─26389 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
 &lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPDISCOVER(virbr0) 52:54:00:2a:f9:66&lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPOFFER(virbr0) 192.168.122.128 52:54:00:2a:f9:66root@ts01:~# kvm-ok&lt;br /&gt;
&lt;br /&gt;
====Virsh (Controler)====&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 Id   Name       State&lt;br /&gt;
 --------------------------&lt;br /&gt;
*Node Info&lt;br /&gt;
 root@ts01:~# virsh nodeinfo&lt;br /&gt;
 CPU model:           x86_64&lt;br /&gt;
 CPU(s):              24&lt;br /&gt;
 CPU frequency:       1197 MHz&lt;br /&gt;
 CPU socket(s):       1&lt;br /&gt;
 Core(s) per socket:  12&lt;br /&gt;
 Thread(s) per core:  2&lt;br /&gt;
 NUMA cell(s):        1&lt;br /&gt;
 Memory size:         63375964 KiB&lt;br /&gt;
*Net List&lt;br /&gt;
 root@ts01:~# virsh net-list --all&lt;br /&gt;
 Name      State    Autostart   Persistent&lt;br /&gt;
--------------------------------------------&lt;br /&gt;
 default   active   yes         yes&lt;br /&gt;
&lt;br /&gt;
*Set Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start default&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-autostart default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Prepare KVM User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;less /etc/groups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Optional start user admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
===Advanced - Bridging===&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start br0&#039;&#039;&#039;&lt;br /&gt;
 virsh net-autostart br0&lt;br /&gt;
 Network br0 started&lt;br /&gt;
 &lt;br /&gt;
 Network br0 marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*Shutdown running VM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown debian13&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 &#039;&#039;&#039;virsh edit debian&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Change:&lt;br /&gt;
 &amp;lt;interface type=&#039;network&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source network=&#039;default&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;interface type=&#039;bridge&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source bridge=&#039;br0&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;model type=&#039;virtio&#039;/&amp;gt;&lt;br /&gt;
 &amp;lt;/interface&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;debian13&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
==Advanced - Converting virtual disks==&lt;br /&gt;
===Converting a VHDX Windows Disk===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /home/vmadmin/vm-surf01.vhdx&#039;&#039;&#039;&lt;br /&gt;
 image: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 41 GiB&lt;br /&gt;
 cluster_size: 33554432&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 41 GiB (43994054656 bytes)&lt;br /&gt;
    disk size: 41 GiB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Get the disk ready for KVM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -p -f vhdx -O qcow2 \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/home/vmadmin/vm-surf01.vhdx \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
 image: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
 file format: qcow2&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 37.6 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    compat: 1.1&lt;br /&gt;
    compression type: zlib&lt;br /&gt;
    lazy refcounts: false&lt;br /&gt;
    refcount bits: 16&lt;br /&gt;
    corrupt: false&lt;br /&gt;
    extended l2: false&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 37.6 GiB (40399208448 bytes)&lt;br /&gt;
    disk size: 37.6 GiB&lt;br /&gt;
&lt;br /&gt;
===Converting a VMDK VMWare Disk===&lt;br /&gt;
*Inspect &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/ qemu-img info &#039;Windows 8.x x64.vmdk&#039; &#039;&#039;&#039;&lt;br /&gt;
 image: Windows 8.x x64.vmdk&lt;br /&gt;
 file format: vmdk&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 16.7 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    cid: 2432867383&lt;br /&gt;
    parent cid: 4294967295&lt;br /&gt;
    create type: monolithicSparse&lt;br /&gt;
    extents:&lt;br /&gt;
        [0]:&lt;br /&gt;
            virtual size: 107374182400&lt;br /&gt;
            filename: Windows 8.x x64.vmdk&lt;br /&gt;
            cluster size: 65536&lt;br /&gt;
            format:&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: Windows 8.x x64.vmdk&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 16.7 GiB (17974165504 bytes)&lt;br /&gt;
    disk size: 16.7 GiB&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -f vmdk -O qcow2 &#039;Windows 8.x x64.vmdk&#039; win8.qcow2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==VM Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Debian from ISO===&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Installation Win10 VM (former vhdx file)===&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Win11 VM (from iso, no registration)===&lt;br /&gt;
&lt;br /&gt;
*Install Windows 11 but without network&lt;br /&gt;
[[image:Win11-no-network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When asked for network connectivity then press &#039;&#039;&#039;Shift + F10&#039;&#039;&#039;&lt;br /&gt;
*Then type:&lt;br /&gt;
 OOBE\BYPASSNRO&lt;br /&gt;
&lt;br /&gt;
*After finishing the setup, shutdown&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh shutdown win11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It is required to install the network driver, but first detach the current iso image:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
&lt;br /&gt;
*Attach the network interface&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh attach-interface \&lt;br /&gt;
  --domain win11 \&lt;br /&gt;
  --type bridge \&lt;br /&gt;
  --source br0 \&lt;br /&gt;
  --model virtio \&lt;br /&gt;
  --config&lt;br /&gt;
 Interface attached successfully&lt;br /&gt;
&lt;br /&gt;
*Check:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh domiflist win11&lt;br /&gt;
  Interface   Type     Source   Model    MAC&lt;br /&gt;
 -----------------------------------------------------------&lt;br /&gt;
  -           bridge   br0      virtio   52:54:00:16:25:ee&lt;br /&gt;
&lt;br /&gt;
*Download driver disk:&lt;br /&gt;
 cd /var/lib/libvirt/images&lt;br /&gt;
 wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso&lt;br /&gt;
&lt;br /&gt;
*Attach driver disk:&lt;br /&gt;
 virsh attach-disk win11 \&lt;br /&gt;
  /var/lib/libvirt/images/virtio-win.iso \&lt;br /&gt;
  sdb \&lt;br /&gt;
  --type cdrom \&lt;br /&gt;
  --mode readonly \&lt;br /&gt;
  --targetbus sata \&lt;br /&gt;
  --config&lt;br /&gt;
&lt;br /&gt;
*Start VM&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh start win11&lt;br /&gt;
 Domain &#039;win11&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From Device Manager, Install missing Driver from the new disk: NetKVM\w10\amd64&lt;br /&gt;
[[image:Win11-install02.png|480px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Install&lt;br /&gt;
[[image:Win11-install03.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Stop  VM&lt;br /&gt;
*Detach Helper Disk&lt;br /&gt;
 root@ts01:/data/iso# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
*Finished&lt;br /&gt;
&lt;br /&gt;
==USB Operations==&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Stick to the VM===&lt;br /&gt;
*Get attached devices&lt;br /&gt;
**Note: We&#039;re after &#039;&#039;&#039;ID 0781:5591 SanDisk Corp.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;lsusb&#039;&#039;&#039;&lt;br /&gt;
  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 001 Device 002: ID 8087:800a Intel Corp. Hub&lt;br /&gt;
  Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 002 Device 002: ID 3938:1032 MOSART Semi. 2.4G RF Keyboard &amp;amp; Mouse&lt;br /&gt;
  Bus 002 Device 003: ID 04b3:3025 IBM Corp. NetVista Full Width Keyboard&lt;br /&gt;
  Bus 002 Device 004: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  Bus 002 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller&lt;br /&gt;
  Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver&lt;br /&gt;
  Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub&lt;br /&gt;
  Bus 003 Device 002: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  &#039;&#039;&#039;Bus 003 Device 003: ID 0781:5591 SanDisk Corp. Ultra Flair&#039;&#039;&#039;&lt;br /&gt;
  Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub&lt;br /&gt;
&lt;br /&gt;
*Attach SanDisk to win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh dumpxml win10 | grep -A10 hostdev&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039; &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; started&lt;br /&gt;
&lt;br /&gt;
*Get Status &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Detach a USB Stick from the VM===&lt;br /&gt;
&lt;br /&gt;
*Detach device&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Scanner to the VM===&lt;br /&gt;
&lt;br /&gt;
*Pick the device&lt;br /&gt;
 root@ts01:~# &#039;&#039;lsusb&#039;&#039;&#039;&#039;&lt;br /&gt;
 Bus 002 Device 008: ID 04a9:190f Canon, Inc. CanoScan LiDE 220&lt;br /&gt;
&lt;br /&gt;
*Edit the vm setting, assume the vm is called win10&lt;br /&gt;
 root@ts01:~# virsh edit win10&lt;br /&gt;
Add the usb port between the xml devices element element, like:&lt;br /&gt;
 &amp;lt;devices&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/devices&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Add and save:&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;yes&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x04a9&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x190f&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Alternative edit the usb port using Virt-manager on x &amp;lt;br&amp;gt;&lt;br /&gt;
[[image:Virt-manager-usb.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Basic admin commands==&lt;br /&gt;
===Cloning a machine===&lt;br /&gt;
&#039;&#039;&#039;Cloning win10 to win10a&#039;&#039;&#039;&lt;br /&gt;
*Shutdown Main&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
 &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
*Clone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Clone Process&lt;br /&gt;
[[image:Clonevm.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virt-clone \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--original win10 \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--name win10a \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--auto-clone&#039;&#039;&#039;&lt;br /&gt;
 Allocating &#039;vm-surf01-clone.qcow2&#039;                                              | 127 GB  00:02:21&lt;br /&gt;
 &lt;br /&gt;
 Clone &#039;win10a&#039; created successfully.&lt;br /&gt;
&lt;br /&gt;
===Snapshots===&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-create win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 created&lt;br /&gt;
 root@ts01:~# virsh snapshot-list win10a&lt;br /&gt;
  Name         Creation Time               State&lt;br /&gt;
 ---------------------------------------------------&lt;br /&gt;
  1770483334   2026-02-07 17:55:34 +0100   running&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Revert snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-revert win10a 1770483334&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
===Hibernate===&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh managedsave win10a&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&lt;br /&gt;
&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10a&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reboot behaviour===&lt;br /&gt;
*Set the following in &#039;&#039;&#039;/etc/defaultlib/virt-guests&#039;&#039;&#039; to allow a manged reboot of the vm&#039;s, means that previous running vm&#039;s are automatically started again after reboot&lt;br /&gt;
&lt;br /&gt;
 # What to do when the host shuts down&lt;br /&gt;
 ON_SHUTDOWN=suspend&lt;br /&gt;
 &lt;br /&gt;
 # What to do when the host boots up&lt;br /&gt;
 ON_BOOT=start&lt;br /&gt;
 &lt;br /&gt;
 # Number of seconds to wait for a guest to shut down/suspend&lt;br /&gt;
 SHUTDOWN_TIMEOUT=300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- To be mentioned: &lt;br /&gt;
 Drawbacks:&lt;br /&gt;
 -Tricky Backup procedure &lt;br /&gt;
 -USB Stick handling&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Backup/Restore of the VM settings===&lt;br /&gt;
To Backup the VM settings only run:&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml vmname &amp;gt; vmname.xml&lt;br /&gt;
&lt;br /&gt;
*To Restore&lt;br /&gt;
 virsh define vmname.xml&lt;br /&gt;
&lt;br /&gt;
==Adding a new VM Storage==&lt;br /&gt;
===Partition the new storage===&lt;br /&gt;
 root@ts01:~# parted /dev/nvme0n1&lt;br /&gt;
 GNU Parted 3.6&lt;br /&gt;
 Using /dev/nvme0n1&lt;br /&gt;
 Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? y&lt;br /&gt;
 (parted) quit&lt;br /&gt;
 Information: You may need to update /etc/fstab.&lt;br /&gt;
===Add Filesystem===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;mkfs.ext4 /dev/nvme0n1p1&#039;&#039;&#039;&lt;br /&gt;
 mke2fs 1.47.2 (1-Jan-2025)&lt;br /&gt;
 /dev/nvme0n1p1 contains a ntfs file system labelled &#039;NVM&#039;&lt;br /&gt;
 Proceed anyway? (y,N) y&lt;br /&gt;
 Discarding device blocks: done&lt;br /&gt;
 Creating filesystem with 500099328 4k blocks and 125026304 inodes&lt;br /&gt;
 Filesystem UUID: 2382c329-2c7c-4a57-855d-aea09003dd30&lt;br /&gt;
 Superblock backups stored on blocks:&lt;br /&gt;
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;br /&gt;
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,&lt;br /&gt;
        102400000, 214990848&lt;br /&gt;
 &lt;br /&gt;
 Allocating group tables: done&lt;br /&gt;
 Writing inode tables: done&lt;br /&gt;
 Creating journal (262144 blocks): done&lt;br /&gt;
 Writing superblocks and filesystem accounting information: done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mount Filesystem===&lt;br /&gt;
*Make and mount&lt;br /&gt;
 root@ts01:~# mkdir /vmstorage&lt;br /&gt;
 root@ts01:~# mount /dev/nvme0n1p1 /vmstorage&lt;br /&gt;
&lt;br /&gt;
*Check&lt;br /&gt;
 root@ts01:~# df -h&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 tmpfs           6.1G   16M  6.1G   1% /run&lt;br /&gt;
 /dev/sda2       915G  459G  411G  53% /&lt;br /&gt;
 tmpfs            31G     0   31G   0% /dev/shm&lt;br /&gt;
 efivarfs        256K  148K  104K  59% /sys/firmware/efi/efivars&lt;br /&gt;
 tmpfs           5.0M   12K  5.0M   1% /run/lock&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service&lt;br /&gt;
 /dev/sda1       1.1G  6.3M  1.1G   1% /boot/efi&lt;br /&gt;
 tmpfs            31G  8.0K   31G   1% /tmp&lt;br /&gt;
 tmpfs           6.1G  116K  6.1G   1% /run/user/60578&lt;br /&gt;
 tmpfs           6.1G  108K  6.1G   1% /run/user/1000&lt;br /&gt;
 &#039;&#039;&#039;/dev/nvme0n1p1  1.9T  2.1M  1.8T   1% /vmstorage&#039;&#039;&#039;&lt;br /&gt;
*Get UUID&lt;br /&gt;
 root@ts01:~# blkid /dev/nvme0n1p1&lt;br /&gt;
 /dev/nvme0n1p1: UUID=&amp;quot;2382c329-2c7c-4a57-855d-aea09003dd30&amp;quot; BLOCK_SIZE=&amp;quot;4096&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTLABEL=&amp;quot;primary&amp;quot; PARTUUID=&amp;quot;f49249d9-50eb-45bd-aafc-701ef7d66f5b&amp;quot;&lt;br /&gt;
*Add to /etc/fstab&lt;br /&gt;
 UUID=2382c329-2c7c-4a57-855d-aea09003dd30  /vmstorage  ext4  defaults  0 2&lt;br /&gt;
*Reboot to test!&lt;br /&gt;
&lt;br /&gt;
===Create a new Pool and apply new VMs===&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
&lt;br /&gt;
*Create a new pool using the new vmstorage&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-define-as nvme-pool dir --target /vmstorage&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool defined&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-build nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool built&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-start nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool started&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-autostart nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
  nvme-pool   active   yes&lt;br /&gt;
&lt;br /&gt;
*Move the VM to another disk&lt;br /&gt;
 root@ts01:~# mv /var/lib/libvirt/images/vm-win10a.qcow2 /vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*Edit the vm settings&lt;br /&gt;
 root@ts01:~# virsh edit win10a&lt;br /&gt;
&lt;br /&gt;
*Then:&lt;br /&gt;
**set source file to:&lt;br /&gt;
**/vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*And save&lt;br /&gt;
 Domain &#039;win10a&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
*To delete the pool use:&lt;br /&gt;
 virsh pool-destroy nvme-pool&lt;br /&gt;
 virsh pool-undefine nvme-pool&lt;br /&gt;
&lt;br /&gt;
==Deploy a new VM via CLI==&lt;br /&gt;
*Requires (template copy):&lt;br /&gt;
**/data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
This will setup a new VM with:&lt;br /&gt;
*Name: vm-bookworm&lt;br /&gt;
*OS Debian 13 (Trixy)&lt;br /&gt;
*Disk: /data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
*2CPU/2GB-RAM&lt;br /&gt;
*Network Bridged &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:/data/vmstorage# &#039;&#039;&#039;virt-install&#039;&#039;&#039; \&lt;br /&gt;
  --name vm-bookworm \&lt;br /&gt;
  --memory 2048 \&lt;br /&gt;
  --vcpus 2 \&lt;br /&gt;
  --cpu host-passthrough \&lt;br /&gt;
  --os-variant debian12 \&lt;br /&gt;
  --disk path=/data/vmstorage/vm-bookworm.qcow2,bus=virtio,discard=unmap \&lt;br /&gt;
  --network bridge=br0,model=virtio \&lt;br /&gt;
  --graphics spice,listen=0.0.0.0 \&lt;br /&gt;
  --channel spicevmc \&lt;br /&gt;
  --autoconsole none \&lt;br /&gt;
  --import&lt;br /&gt;
 &lt;br /&gt;
 Starting install...&lt;br /&gt;
 Creating domain...                                                                                                                               |         00:00:00&lt;br /&gt;
 Domain creation completed.&lt;br /&gt;
&lt;br /&gt;
==Useful Commands==&lt;br /&gt;
*Nmap accross the network to obtain new IP addresses from new vm machines&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;nmap -sn 192.168.2.0/24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Add a description for a VM&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname &amp;quot;My Description ...&amp;quot; --config&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 My Description ...&lt;br /&gt;
&lt;br /&gt;
* Alternative description with carriage returns within the text&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname --config --new-desc $&#039;Line 1: Text123\nLine 2: Text456\nLine 3: Text789&#039;&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 Line 1: Text123&lt;br /&gt;
 Line 2: Text456&lt;br /&gt;
 Line 3: Text789&lt;br /&gt;
&lt;br /&gt;
*Virtual Top&lt;br /&gt;
 root@ts01:/# &#039;&#039;&#039;virt-top&#039;&#039;&#039;&lt;br /&gt;
 virt-top 21:20:58 - x86_64 24/24CPU 1200MHz 61890MB&lt;br /&gt;
 6 domains, 1 active, 1 running, 0 sleeping, 0 paused, 5 inactive D:0 O:0 X:0&lt;br /&gt;
 CPU: 0.1%  Mem: 2048 MB (2048 MB by guests)&lt;br /&gt;
 &lt;br /&gt;
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME&lt;br /&gt;
   10 R    0    2 1396  206  0.1  3.0   0:47.07 vm-bookworm&lt;br /&gt;
&lt;br /&gt;
*Configure Autostart&lt;br /&gt;
&lt;br /&gt;
 virsh autostart win11&lt;br /&gt;
&lt;br /&gt;
 virsh dominfo win11 | grep Autostart&lt;br /&gt;
 Autostart:      enable&lt;br /&gt;
 Autostart Once: disable&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Virt-manager-usb.png&amp;diff=1129</id>
		<title>File:Virt-manager-usb.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Virt-manager-usb.png&amp;diff=1129"/>
		<updated>2026-02-23T18:32:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1128</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1128"/>
		<updated>2026-02-18T19:35:36Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Motivation&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Running&#039;&#039;&#039; Kernel-based Virtual Machine (KVM)&#039;&#039;&#039; on my local machine instead of &lt;br /&gt;
* Microsoft Terminal Server / Remote Desktop&lt;br /&gt;
* VMWare&lt;br /&gt;
* Proxmox (for now)&lt;br /&gt;
Try to use the Linux on board utilities only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup==&lt;br /&gt;
===System Information===&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo -i&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# cat /etc/os-release&lt;br /&gt;
 PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;&lt;br /&gt;
 NAME=&amp;quot;Ubuntu&amp;quot;&lt;br /&gt;
 VERSION_ID=&amp;quot;25.10&amp;quot;&lt;br /&gt;
 VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;&lt;br /&gt;
 VERSION_CODENAME=questing&lt;br /&gt;
 ID=ubuntu&lt;br /&gt;
 ID_LIKE=debian&lt;br /&gt;
 HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;&lt;br /&gt;
 SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;&lt;br /&gt;
 BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;&lt;br /&gt;
 PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;&lt;br /&gt;
 UBUNTU_CODENAME=questing&lt;br /&gt;
 LOGO=ubuntu-logo&lt;br /&gt;
&lt;br /&gt;
===Install and setup packages===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;apt install -y   &#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;qemu-kvm \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-daemon-system \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;libvirt-clients \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;bridge-utils \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;virt-manager \&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;cpu-checker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Libvirt (Orchestrator)====&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl enable --now libvirtd&#039;&#039;&#039;&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;systemctl status libvirtd&#039;&#039;&#039;&lt;br /&gt;
 ● libvirtd.service - libvirt legacy monolithic daemon&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2026-02-04 19:32:47 CET; 52min ago&lt;br /&gt;
  Invocation: de3b4269f9074f69aef468813b833a4b&lt;br /&gt;
 TriggeredBy: ● libvirtd.socket&lt;br /&gt;
             ● libvirtd-admin.socket&lt;br /&gt;
             ● libvirtd-ro.socket&lt;br /&gt;
       Docs: man:libvirtd(8)&lt;br /&gt;
             https://libvirt.org/&lt;br /&gt;
   Main PID: 26280 (libvirtd)&lt;br /&gt;
      Tasks: 25 (limit: 32768)&lt;br /&gt;
     Memory: 24.1M (peak: 51M)&lt;br /&gt;
        CPU: 9.655s&lt;br /&gt;
     CGroup: /system.slice/libvirtd.service&lt;br /&gt;
             ├─26280 /usr/sbin/libvirtd --timeout 120&lt;br /&gt;
             ├─26388 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
             └─26389 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper&lt;br /&gt;
 &lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPDISCOVER(virbr0) 52:54:00:2a:f9:66&lt;br /&gt;
 Feb 04 20:03:14 ts01 dnsmasq-dhcp[26388]: DHCPOFFER(virbr0) 192.168.122.128 52:54:00:2a:f9:66root@ts01:~# kvm-ok&lt;br /&gt;
&lt;br /&gt;
====Virsh (Controler)====&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 Id   Name       State&lt;br /&gt;
 --------------------------&lt;br /&gt;
*Node Info&lt;br /&gt;
 root@ts01:~# virsh nodeinfo&lt;br /&gt;
 CPU model:           x86_64&lt;br /&gt;
 CPU(s):              24&lt;br /&gt;
 CPU frequency:       1197 MHz&lt;br /&gt;
 CPU socket(s):       1&lt;br /&gt;
 Core(s) per socket:  12&lt;br /&gt;
 Thread(s) per core:  2&lt;br /&gt;
 NUMA cell(s):        1&lt;br /&gt;
 Memory size:         63375964 KiB&lt;br /&gt;
*Net List&lt;br /&gt;
 root@ts01:~# virsh net-list --all&lt;br /&gt;
 Name      State    Autostart   Persistent&lt;br /&gt;
--------------------------------------------&lt;br /&gt;
 default   active   yes         yes&lt;br /&gt;
&lt;br /&gt;
*Set Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start default&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-autostart default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Prepare KVM User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;sudo usermod -aG libvirt,kvm $USER&#039;&#039;&#039;&lt;br /&gt;
 vmadmin@ts01:~$ &#039;&#039;&#039;less /etc/groups&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Optional start user admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
===Advanced - Bridging===&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/network&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh net-start br0&#039;&#039;&#039;&lt;br /&gt;
 virsh net-autostart br0&lt;br /&gt;
 Network br0 started&lt;br /&gt;
 &lt;br /&gt;
 Network br0 marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*Shutdown running VM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown debian13&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 &#039;&#039;&#039;virsh edit debian&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Change:&lt;br /&gt;
 &amp;lt;interface type=&#039;network&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source network=&#039;default&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;interface type=&#039;bridge&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;source bridge=&#039;br0&#039;/&amp;gt;&lt;br /&gt;
  &amp;lt;model type=&#039;virtio&#039;/&amp;gt;&lt;br /&gt;
 &amp;lt;/interface&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;debian13&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
==Advanced - Converting virtual disks==&lt;br /&gt;
===Converting a VHDX Windows Disk===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /home/vmadmin/vm-surf01.vhdx&#039;&#039;&#039;&lt;br /&gt;
 image: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
 file format: vhdx&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 41 GiB&lt;br /&gt;
 cluster_size: 33554432&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /home/vmadmin/vm-surf01.vhdx&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 41 GiB (43994054656 bytes)&lt;br /&gt;
    disk size: 41 GiB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Get the disk ready for KVM&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;chmod 777 /var/lib/libvirt/images&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -p -f vhdx -O qcow2 \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/home/vmadmin/vm-surf01.vhdx \&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;/var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&#039;&#039;&#039;&lt;br /&gt;
 image: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
 file format: qcow2&lt;br /&gt;
 virtual size: 127 GiB (136365211648 bytes)&lt;br /&gt;
 disk size: 37.6 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    compat: 1.1&lt;br /&gt;
    compression type: zlib&lt;br /&gt;
    lazy refcounts: false&lt;br /&gt;
    refcount bits: 16&lt;br /&gt;
    corrupt: false&lt;br /&gt;
    extended l2: false&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 37.6 GiB (40399208448 bytes)&lt;br /&gt;
    disk size: 37.6 GiB&lt;br /&gt;
&lt;br /&gt;
===Converting a VMDK VMWare Disk===&lt;br /&gt;
*Inspect &lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img info /var/lib/libvirt/ qemu-img info &#039;Windows 8.x x64.vmdk&#039; &#039;&#039;&#039;&lt;br /&gt;
 image: Windows 8.x x64.vmdk&lt;br /&gt;
 file format: vmdk&lt;br /&gt;
 virtual size: 100 GiB (107374182400 bytes)&lt;br /&gt;
 disk size: 16.7 GiB&lt;br /&gt;
 cluster_size: 65536&lt;br /&gt;
 Format specific information:&lt;br /&gt;
    cid: 2432867383&lt;br /&gt;
    parent cid: 4294967295&lt;br /&gt;
    create type: monolithicSparse&lt;br /&gt;
    extents:&lt;br /&gt;
        [0]:&lt;br /&gt;
            virtual size: 107374182400&lt;br /&gt;
            filename: Windows 8.x x64.vmdk&lt;br /&gt;
            cluster size: 65536&lt;br /&gt;
            format:&lt;br /&gt;
 Child node &#039;/file&#039;:&lt;br /&gt;
    filename: Windows 8.x x64.vmdk&lt;br /&gt;
    protocol type: file&lt;br /&gt;
    file length: 16.7 GiB (17974165504 bytes)&lt;br /&gt;
    disk size: 16.7 GiB&lt;br /&gt;
&lt;br /&gt;
*Convert&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;qemu-img convert -f vmdk -O qcow2 &#039;Windows 8.x x64.vmdk&#039; win8.qcow2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==VM Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Debian from ISO===&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Installation Win10 VM (former vhdx file)===&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|600px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Installation Win11 VM (from iso, no registration)===&lt;br /&gt;
&lt;br /&gt;
*Install Windows 11 but without network&lt;br /&gt;
[[image:Win11-no-network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When asked for network connectivity then press &#039;&#039;&#039;Shift + F10&#039;&#039;&#039;&lt;br /&gt;
*Then type:&lt;br /&gt;
 OOBE\BYPASSNRO&lt;br /&gt;
&lt;br /&gt;
*After finishing the setup, shutdown&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh shutdown win11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It is required to install the network driver, but first detach the current iso image:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
&lt;br /&gt;
*Attach the network interface&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh attach-interface \&lt;br /&gt;
  --domain win11 \&lt;br /&gt;
  --type bridge \&lt;br /&gt;
  --source br0 \&lt;br /&gt;
  --model virtio \&lt;br /&gt;
  --config&lt;br /&gt;
 Interface attached successfully&lt;br /&gt;
&lt;br /&gt;
*Check:&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh domiflist win11&lt;br /&gt;
  Interface   Type     Source   Model    MAC&lt;br /&gt;
 -----------------------------------------------------------&lt;br /&gt;
  -           bridge   br0      virtio   52:54:00:16:25:ee&lt;br /&gt;
&lt;br /&gt;
*Download driver disk:&lt;br /&gt;
 cd /var/lib/libvirt/images&lt;br /&gt;
 wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso&lt;br /&gt;
&lt;br /&gt;
*Attach driver disk:&lt;br /&gt;
 virsh attach-disk win11 \&lt;br /&gt;
  /var/lib/libvirt/images/virtio-win.iso \&lt;br /&gt;
  sdb \&lt;br /&gt;
  --type cdrom \&lt;br /&gt;
  --mode readonly \&lt;br /&gt;
  --targetbus sata \&lt;br /&gt;
  --config&lt;br /&gt;
&lt;br /&gt;
*Start VM&lt;br /&gt;
 root@ts01:/data/vmtemplate# virsh start win11&lt;br /&gt;
 Domain &#039;win11&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From Device Manager, Install missing Driver from the new disk: NetKVM\w10\amd64&lt;br /&gt;
[[image:Win11-install02.png|480px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Install&lt;br /&gt;
[[image:Win11-install03.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Stop  VM&lt;br /&gt;
*Detach Helper Disk&lt;br /&gt;
 root@ts01:/data/iso# virsh detach-disk win11 sdb --config&lt;br /&gt;
 Disk detached successfully&lt;br /&gt;
*Finished&lt;br /&gt;
&lt;br /&gt;
==USB Operations==&lt;br /&gt;
&lt;br /&gt;
===Attach a USB Stick to the VM===&lt;br /&gt;
*Get attached devices&lt;br /&gt;
**Note: We&#039;re after &#039;&#039;&#039;ID 0781:5591 SanDisk Corp.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;lsusb&#039;&#039;&#039;&lt;br /&gt;
  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 001 Device 002: ID 8087:800a Intel Corp. Hub&lt;br /&gt;
  Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 002 Device 002: ID 3938:1032 MOSART Semi. 2.4G RF Keyboard &amp;amp; Mouse&lt;br /&gt;
  Bus 002 Device 003: ID 04b3:3025 IBM Corp. NetVista Full Width Keyboard&lt;br /&gt;
  Bus 002 Device 004: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  Bus 002 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller&lt;br /&gt;
  Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver&lt;br /&gt;
  Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub&lt;br /&gt;
  Bus 003 Device 002: ID 17aa:1034 VIA Labs, Inc.          USB Hub&lt;br /&gt;
  &#039;&#039;&#039;Bus 003 Device 003: ID 0781:5591 SanDisk Corp. Ultra Flair&#039;&#039;&#039;&lt;br /&gt;
  Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
  Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub&lt;br /&gt;
&lt;br /&gt;
*Attach SanDisk to win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh dumpxml win10 | grep -A10 hostdev&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039; &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
        &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; started&lt;br /&gt;
&lt;br /&gt;
*Get Status &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Detach a USB Stick from the VM===&lt;br /&gt;
&lt;br /&gt;
*Detach device&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&#039;&amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;&amp;lt;/source&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;/hostdev&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOF&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;) --persistent&#039;&#039;&#039;&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
==Basic admin commands==&lt;br /&gt;
===Cloning a machine===&lt;br /&gt;
&#039;&#039;&#039;Cloning win10 to win10a&#039;&#039;&#039;&lt;br /&gt;
*Shutdown Main&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh shutdown win10&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
 &lt;br /&gt;
 root@ts01:~# virsh list --all&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  -    debian13   shut off&lt;br /&gt;
&lt;br /&gt;
*Clone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Clone Process&lt;br /&gt;
[[image:Clonevm.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virt-clone \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--original win10 \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--name win10a \&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;--auto-clone&#039;&#039;&#039;&lt;br /&gt;
 Allocating &#039;vm-surf01-clone.qcow2&#039;                                              | 127 GB  00:02:21&lt;br /&gt;
 &lt;br /&gt;
 Clone &#039;win10a&#039; created successfully.&lt;br /&gt;
&lt;br /&gt;
===Snapshots===&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-create win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 created&lt;br /&gt;
 root@ts01:~# virsh snapshot-list win10a&lt;br /&gt;
  Name         Creation Time               State&lt;br /&gt;
 ---------------------------------------------------&lt;br /&gt;
  1770483334   2026-02-07 17:55:34 +0100   running&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Revert snapshort&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh snapshot-revert win10a 1770483334&#039;&#039;&#039;&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
===Hibernate===&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh managedsave win10a&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&lt;br /&gt;
&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh list --all&#039;&#039;&#039;&lt;br /&gt;
  Id   Name       State&lt;br /&gt;
 ---------------------------&lt;br /&gt;
  3    win10      running&lt;br /&gt;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh start win10a&#039;&#039;&#039;&lt;br /&gt;
 Domain &#039;win10a&#039; started&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reboot behaviour===&lt;br /&gt;
*Set the following in &#039;&#039;&#039;/etc/defaultlib/virt-guests&#039;&#039;&#039; to allow a manged reboot of the vm&#039;s, means that previous running vm&#039;s are automatically started again after reboot&lt;br /&gt;
&lt;br /&gt;
 # What to do when the host shuts down&lt;br /&gt;
 ON_SHUTDOWN=suspend&lt;br /&gt;
 &lt;br /&gt;
 # What to do when the host boots up&lt;br /&gt;
 ON_BOOT=start&lt;br /&gt;
 &lt;br /&gt;
 # Number of seconds to wait for a guest to shut down/suspend&lt;br /&gt;
 SHUTDOWN_TIMEOUT=300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- To be mentioned: &lt;br /&gt;
 Drawbacks:&lt;br /&gt;
 -Tricky Backup procedure &lt;br /&gt;
 -USB Stick handling&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Backup/Restore of the VM settings===&lt;br /&gt;
To Backup the VM settings only run:&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml vmname &amp;gt; vmname.xml&lt;br /&gt;
&lt;br /&gt;
*To Restore&lt;br /&gt;
 virsh define vmname.xml&lt;br /&gt;
&lt;br /&gt;
==Adding a new VM Storage==&lt;br /&gt;
===Partition the new storage===&lt;br /&gt;
 root@ts01:~# parted /dev/nvme0n1&lt;br /&gt;
 GNU Parted 3.6&lt;br /&gt;
 Using /dev/nvme0n1&lt;br /&gt;
 Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/nvme0n1 will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? y&lt;br /&gt;
 (parted) quit&lt;br /&gt;
 Information: You may need to update /etc/fstab.&lt;br /&gt;
===Add Filesystem===&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;mkfs.ext4 /dev/nvme0n1p1&#039;&#039;&#039;&lt;br /&gt;
 mke2fs 1.47.2 (1-Jan-2025)&lt;br /&gt;
 /dev/nvme0n1p1 contains a ntfs file system labelled &#039;NVM&#039;&lt;br /&gt;
 Proceed anyway? (y,N) y&lt;br /&gt;
 Discarding device blocks: done&lt;br /&gt;
 Creating filesystem with 500099328 4k blocks and 125026304 inodes&lt;br /&gt;
 Filesystem UUID: 2382c329-2c7c-4a57-855d-aea09003dd30&lt;br /&gt;
 Superblock backups stored on blocks:&lt;br /&gt;
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;br /&gt;
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,&lt;br /&gt;
        102400000, 214990848&lt;br /&gt;
 &lt;br /&gt;
 Allocating group tables: done&lt;br /&gt;
 Writing inode tables: done&lt;br /&gt;
 Creating journal (262144 blocks): done&lt;br /&gt;
 Writing superblocks and filesystem accounting information: done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mount Filesystem===&lt;br /&gt;
*Make and mount&lt;br /&gt;
 root@ts01:~# mkdir /vmstorage&lt;br /&gt;
 root@ts01:~# mount /dev/nvme0n1p1 /vmstorage&lt;br /&gt;
&lt;br /&gt;
*Check&lt;br /&gt;
 root@ts01:~# df -h&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 tmpfs           6.1G   16M  6.1G   1% /run&lt;br /&gt;
 /dev/sda2       915G  459G  411G  53% /&lt;br /&gt;
 tmpfs            31G     0   31G   0% /dev/shm&lt;br /&gt;
 efivarfs        256K  148K  104K  59% /sys/firmware/efi/efivars&lt;br /&gt;
 tmpfs           5.0M   12K  5.0M   1% /run/lock&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service&lt;br /&gt;
 tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service&lt;br /&gt;
 /dev/sda1       1.1G  6.3M  1.1G   1% /boot/efi&lt;br /&gt;
 tmpfs            31G  8.0K   31G   1% /tmp&lt;br /&gt;
 tmpfs           6.1G  116K  6.1G   1% /run/user/60578&lt;br /&gt;
 tmpfs           6.1G  108K  6.1G   1% /run/user/1000&lt;br /&gt;
 &#039;&#039;&#039;/dev/nvme0n1p1  1.9T  2.1M  1.8T   1% /vmstorage&#039;&#039;&#039;&lt;br /&gt;
*Get UUID&lt;br /&gt;
 root@ts01:~# blkid /dev/nvme0n1p1&lt;br /&gt;
 /dev/nvme0n1p1: UUID=&amp;quot;2382c329-2c7c-4a57-855d-aea09003dd30&amp;quot; BLOCK_SIZE=&amp;quot;4096&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTLABEL=&amp;quot;primary&amp;quot; PARTUUID=&amp;quot;f49249d9-50eb-45bd-aafc-701ef7d66f5b&amp;quot;&lt;br /&gt;
*Add to /etc/fstab&lt;br /&gt;
 UUID=2382c329-2c7c-4a57-855d-aea09003dd30  /vmstorage  ext4  defaults  0 2&lt;br /&gt;
*Reboot to test!&lt;br /&gt;
&lt;br /&gt;
===Create a new Pool and apply new VMs===&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
&lt;br /&gt;
*Create a new pool using the new vmstorage&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-define-as nvme-pool dir --target /vmstorage&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool defined&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-build nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool built&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-start nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool started&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-autostart nvme-pool&#039;&#039;&#039;&lt;br /&gt;
 Pool nvme-pool marked as autostarted&lt;br /&gt;
&lt;br /&gt;
*List current pool&lt;br /&gt;
 root@ts01:~# &#039;&#039;&#039;virsh pool-list --all&#039;&#039;&#039;&lt;br /&gt;
  Name        State    Autostart&lt;br /&gt;
 ---------------------------------&lt;br /&gt;
  default     active   yes&lt;br /&gt;
  nvme-pool   active   yes&lt;br /&gt;
&lt;br /&gt;
*Move the VM to another disk&lt;br /&gt;
 root@ts01:~# mv /var/lib/libvirt/images/vm-win10a.qcow2 /vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*Edit the vm settings&lt;br /&gt;
 root@ts01:~# virsh edit win10a&lt;br /&gt;
&lt;br /&gt;
*Then:&lt;br /&gt;
**set source file to:&lt;br /&gt;
**/vmstorage/vm-win10.qcow2&lt;br /&gt;
&lt;br /&gt;
*And save&lt;br /&gt;
 Domain &#039;win10a&#039; XML configuration edited.&lt;br /&gt;
&lt;br /&gt;
*To delete the pool use:&lt;br /&gt;
 virsh pool-destroy nvme-pool&lt;br /&gt;
 virsh pool-undefine nvme-pool&lt;br /&gt;
&lt;br /&gt;
==Deploy a new VM via CLI==&lt;br /&gt;
*Requires (template copy):&lt;br /&gt;
**/data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
This will setup a new VM with:&lt;br /&gt;
*Name: vm-bookworm&lt;br /&gt;
*OS Debian 13 (Trixy)&lt;br /&gt;
*Disk: /data/vmstorage/vm-bookworm.qcow2&lt;br /&gt;
*2CPU/2GB-RAM&lt;br /&gt;
*Network Bridged &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:/data/vmstorage# &#039;&#039;&#039;virt-install&#039;&#039;&#039; \&lt;br /&gt;
  --name vm-bookworm \&lt;br /&gt;
  --memory 2048 \&lt;br /&gt;
  --vcpus 2 \&lt;br /&gt;
  --cpu host-passthrough \&lt;br /&gt;
  --os-variant debian12 \&lt;br /&gt;
  --disk path=/data/vmstorage/vm-bookworm.qcow2,bus=virtio,discard=unmap \&lt;br /&gt;
  --network bridge=br0,model=virtio \&lt;br /&gt;
  --graphics spice,listen=0.0.0.0 \&lt;br /&gt;
  --channel spicevmc \&lt;br /&gt;
  --autoconsole none \&lt;br /&gt;
  --import&lt;br /&gt;
 &lt;br /&gt;
 Starting install...&lt;br /&gt;
 Creating domain...                                                                                                                               |         00:00:00&lt;br /&gt;
 Domain creation completed.&lt;br /&gt;
&lt;br /&gt;
==Useful Commands==&lt;br /&gt;
*Nmap accross the network to obtain new IP addresses from new vm machines&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;nmap -sn 192.168.2.0/24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Add a description for a VM&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname &amp;quot;My Description ...&amp;quot; --config&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 My Description ...&lt;br /&gt;
&lt;br /&gt;
* Alternative description with carriage returns within the text&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname --config --new-desc $&#039;Line 1: Text123\nLine 2: Text456\nLine 3: Text789&#039;&#039;&#039;&#039;&lt;br /&gt;
 Domain description updated successfully&lt;br /&gt;
 root@ts01:/var/lib/libvirt/images# &#039;&#039;&#039;virsh desc vmname&#039;&#039;&#039;&lt;br /&gt;
 Line 1: Text123&lt;br /&gt;
 Line 2: Text456&lt;br /&gt;
 Line 3: Text789&lt;br /&gt;
&lt;br /&gt;
*Virtual Top&lt;br /&gt;
 root@ts01:/# &#039;&#039;&#039;virt-top&#039;&#039;&#039;&lt;br /&gt;
 virt-top 21:20:58 - x86_64 24/24CPU 1200MHz 61890MB&lt;br /&gt;
 6 domains, 1 active, 1 running, 0 sleeping, 0 paused, 5 inactive D:0 O:0 X:0&lt;br /&gt;
 CPU: 0.1%  Mem: 2048 MB (2048 MB by guests)&lt;br /&gt;
 &lt;br /&gt;
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME&lt;br /&gt;
   10 R    0    2 1396  206  0.1  3.0   0:47.07 vm-bookworm&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Win11-no-network.png&amp;diff=1127</id>
		<title>File:Win11-no-network.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Win11-no-network.png&amp;diff=1127"/>
		<updated>2026-02-18T19:35:05Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Win11-install01.png&amp;diff=1126</id>
		<title>File:Win11-install01.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Win11-install01.png&amp;diff=1126"/>
		<updated>2026-02-18T19:34:47Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Win11-install02.png&amp;diff=1125</id>
		<title>File:Win11-install02.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Win11-install02.png&amp;diff=1125"/>
		<updated>2026-02-18T19:34:35Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Win11-install03.png&amp;diff=1124</id>
		<title>File:Win11-install03.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Win11-install03.png&amp;diff=1124"/>
		<updated>2026-02-18T19:34:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>