<?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-06-02T15:03:32Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<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>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1123</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1123"/>
		<updated>2026-02-14T18:27:23Z</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;
==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=PoC:_KVM&amp;diff=1122</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1122"/>
		<updated>2026-02-13T17:37:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Create a new Pool and apply new VMs */&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;
&#039;&#039;&#039;WARNING&#039;&#039;&#039; Using a cloned windows vm may lead into a SID conflict in your network if the machine becomes a domain member&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;
==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;
&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;
*&#039;&#039;&#039;Hint: To the delete the above pool use:&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# virsh pool-destroy nvme-pool&lt;br /&gt;
 Pool nvme-pool destroyed&lt;br /&gt;
 root@ts01:~# virsh pool-undefine nvme-pool&lt;br /&gt;
 Pool nvme-pool has been undefined&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# nmap -sn 192.168.2.0/24&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1121</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1121"/>
		<updated>2026-02-13T17:19:32Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Installation Win10 VM (former vhdx file) */&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;
&#039;&#039;&#039;WARNING&#039;&#039;&#039; Using a cloned windows vm may lead into a SID conflict in your network if the machine becomes a domain member&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;
==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;
&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;
*&#039;&#039;&#039;Hint: To the delete the above pool use:&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# virsh pool-destroy nvme-pool&lt;br /&gt;
 Pool nvme-pool destroyed&lt;br /&gt;
 root@ts01:~# virsh pool-undefine nvme-pool&lt;br /&gt;
 Pool nvme-pool has been undefined&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1120</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1120"/>
		<updated>2026-02-13T16:46:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Create a new Pool and apply new VMs */&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;
==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;
&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;
*&#039;&#039;&#039;Hint: To the delete the above pool use:&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# virsh pool-destroy nvme-pool&lt;br /&gt;
 Pool nvme-pool destroyed&lt;br /&gt;
 root@ts01:~# virsh pool-undefine nvme-pool&lt;br /&gt;
 Pool nvme-pool has been undefined&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1119</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1119"/>
		<updated>2026-02-13T16:42:49Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Create a new Pool and apply new VMs */&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;
==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;
&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;
*Hint: To the deleete the above pool use:&lt;br /&gt;
 root@ts01:~# virsh pool-destroy nvme-pool&lt;br /&gt;
 Pool nvme-pool destroyed&lt;br /&gt;
 root@ts01:~# virsh pool-undefine nvme-pool&lt;br /&gt;
 Pool nvme-pool has been undefined&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1118</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1118"/>
		<updated>2026-02-12T20:20:49Z</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;
==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;
&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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1117</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1117"/>
		<updated>2026-02-08T18:24:39Z</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;
* No Microsoft Terminal Server / Remote Desktop&lt;br /&gt;
* No VMWare&lt;br /&gt;
* No Proxmox&lt;br /&gt;
&#039;&#039;&#039;Use of Linux on board utilities only!&#039;&#039;&#039;&lt;br /&gt;
* ToDo&lt;br /&gt;
**Wipe Windows&lt;br /&gt;
**Install Linux&lt;br /&gt;
***Install Debian Gnome&lt;br /&gt;
***Or Install Ubuntu&lt;br /&gt;
***Install KVM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==System==&lt;br /&gt;
 vmadmin@ts01:~$ sudo -i&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 Packages==&lt;br /&gt;
 root@ts01:~# apt install -y   &lt;br /&gt;
 qemu-kvm \&lt;br /&gt;
 libvirt-daemon-system \&lt;br /&gt;
 libvirt-clients \&lt;br /&gt;
 bridge-utils \&lt;br /&gt;
 virt-manager \&lt;br /&gt;
 cpu-checker&lt;br /&gt;
&lt;br /&gt;
===Libvirt===&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# systemctl enable --now libvirtd&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# systemctl status libvirtd&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Virsh===&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# virsh list --all&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:~# virsh net-start default&lt;br /&gt;
 root@ts01:~# virsh net-autostart default&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
===Prepare User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ sudo usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ less /etc/groups&lt;br /&gt;
&lt;br /&gt;
*User admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
==Installation Screenshots==&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;
==Advanced - Bridging==&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;network&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/network&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# sudo virsh net-start br0&lt;br /&gt;
 sudo 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:~# virsh shutdown debian13&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 virsh edit debian&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;
==Converting a VHDX Windows Disk==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# qemu-img info /home/vmadmin/vm-surf01.vhdx&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:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# qemu-img convert -p -f vhdx -O qcow2 \&lt;br /&gt;
  /home/vmadmin/vm-surf01.vhdx \&lt;br /&gt;
  /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&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;
&lt;br /&gt;
==Install a Win10 VM from a previous disk==&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;
==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:~# lsusb&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:~# virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&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;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&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:~# virsh dumpxml win10 | grep -A10 hostdev&lt;br /&gt;
    &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&lt;br /&gt;
      &amp;lt;source&amp;gt;&lt;br /&gt;
        &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
        &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
      &amp;lt;/source&amp;gt;&lt;br /&gt;
      &amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# virsh shutdown win10&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# virsh start win10&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:~# virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&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:~# virsh shutdown win10&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:~# virt-clone \&lt;br /&gt;
   --original win10 \&lt;br /&gt;
   --name win10a \&lt;br /&gt;
   --auto-clone&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;
&lt;br /&gt;
==Snapshots==&lt;br /&gt;
*Create a snapshort&lt;br /&gt;
 root@ts01:~# virsh snapshot-create win10a&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:~# virsh snapshot-revert win10a 1770483334&lt;br /&gt;
 Domain snapshot 1770483334 reverted&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hibernate==&lt;br /&gt;
*Hibernate with &#039;&#039;&#039;managedsave&#039;&#039;&#039;&lt;br /&gt;
 root@ts01:~# virsh managedsave win10a&lt;br /&gt;
 &lt;br /&gt;
 Domain &#039;win10a&#039; state saved by libvirt&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;
  4    debian13   running&lt;br /&gt;
  -    win10a     shut off&lt;br /&gt;
&lt;br /&gt;
*Start back&lt;br /&gt;
 root@ts01:~# virsh start win10a&lt;br /&gt;
 Domain &#039;win10a&#039; started&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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1116</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1116"/>
		<updated>2026-02-06T19:22:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Cloning a machine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kvm testsetup at home&lt;br /&gt;
&lt;br /&gt;
==System==&lt;br /&gt;
 vmadmin@ts01:~$ sudo -i&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 Packages==&lt;br /&gt;
 root@ts01:~# apt install -y   qemu-kvm \&lt;br /&gt;
 libvirt-daemon-system \&lt;br /&gt;
 libvirt-clients \&lt;br /&gt;
 bridge-utils \&lt;br /&gt;
 virt-manager \&lt;br /&gt;
 cpu-checker&lt;br /&gt;
&lt;br /&gt;
===Libvirt===&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# systemctl enable --now libvirtd&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# systemctl status libvirtd&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Virsh===&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# virsh list --all&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:~# virsh net-start default&lt;br /&gt;
 root@ts01:~# virsh net-autostart default&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
===Prepare User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ sudo usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ less /etc/groups&lt;br /&gt;
&lt;br /&gt;
*User admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
==Installation Screenshots==&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;
==Advanced - Bridging==&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;network&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/network&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# sudo virsh net-start br0&lt;br /&gt;
 sudo 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:~# virsh shutdown debian13&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 virsh edit debian&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;
==Converting a VHDX Windows Disk==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# qemu-img info /home/vmadmin/vm-surf01.vhdx&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:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# qemu-img convert -p -f vhdx -O qcow2 \&lt;br /&gt;
  /home/vmadmin/vm-surf01.vhdx \&lt;br /&gt;
  /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&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;
&lt;br /&gt;
==Install a Win10 VM from a previous disk==&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|1200px]]&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:~# lsusb&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:~# virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&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;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&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:~# virsh dumpxml win10 | grep -A10 hostdev&lt;br /&gt;
    &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&lt;br /&gt;
      &amp;lt;source&amp;gt;&lt;br /&gt;
        &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
        &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
      &amp;lt;/source&amp;gt;&lt;br /&gt;
      &amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# virsh shutdown win10&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# virsh start win10&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:~# virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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:~# virsh shutdown win10&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:~# virt-clone \&lt;br /&gt;
   --original win10 \&lt;br /&gt;
   --name win10a \&lt;br /&gt;
   --auto-clone&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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Clonevm.png&amp;diff=1115</id>
		<title>File:Clonevm.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Clonevm.png&amp;diff=1115"/>
		<updated>2026-02-06T19:22: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=PoC:_KVM&amp;diff=1114</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1114"/>
		<updated>2026-02-06T19:21:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Cloning a machine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kvm testsetup at home&lt;br /&gt;
&lt;br /&gt;
==System==&lt;br /&gt;
 vmadmin@ts01:~$ sudo -i&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 Packages==&lt;br /&gt;
 root@ts01:~# apt install -y   qemu-kvm \&lt;br /&gt;
 libvirt-daemon-system \&lt;br /&gt;
 libvirt-clients \&lt;br /&gt;
 bridge-utils \&lt;br /&gt;
 virt-manager \&lt;br /&gt;
 cpu-checker&lt;br /&gt;
&lt;br /&gt;
===Libvirt===&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# systemctl enable --now libvirtd&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# systemctl status libvirtd&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Virsh===&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# virsh list --all&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:~# virsh net-start default&lt;br /&gt;
 root@ts01:~# virsh net-autostart default&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
===Prepare User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ sudo usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ less /etc/groups&lt;br /&gt;
&lt;br /&gt;
*User admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
==Installation Screenshots==&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;
==Advanced - Bridging==&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;network&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/network&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# sudo virsh net-start br0&lt;br /&gt;
 sudo 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:~# virsh shutdown debian13&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 virsh edit debian&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;
==Converting a VHDX Windows Disk==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# qemu-img info /home/vmadmin/vm-surf01.vhdx&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:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# qemu-img convert -p -f vhdx -O qcow2 \&lt;br /&gt;
  /home/vmadmin/vm-surf01.vhdx \&lt;br /&gt;
  /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&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;
&lt;br /&gt;
==Install a Win10 VM from a previous disk==&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|1200px]]&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:~# lsusb&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:~# virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&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;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&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:~# virsh dumpxml win10 | grep -A10 hostdev&lt;br /&gt;
    &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&lt;br /&gt;
      &amp;lt;source&amp;gt;&lt;br /&gt;
        &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
        &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
      &amp;lt;/source&amp;gt;&lt;br /&gt;
      &amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# virsh shutdown win10&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# virsh start win10&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:~# virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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:~# virsh shutdown win10&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;
*Attached USB Stick to Win10&lt;br /&gt;
[[image:Winusbb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 root@ts01:~# virt-clone \&lt;br /&gt;
   --original win10 \&lt;br /&gt;
   --name win10a \&lt;br /&gt;
   --auto-clone&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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1113</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1113"/>
		<updated>2026-02-06T19:20:32Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Detach a USB Stick from the VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kvm testsetup at home&lt;br /&gt;
&lt;br /&gt;
==System==&lt;br /&gt;
 vmadmin@ts01:~$ sudo -i&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 Packages==&lt;br /&gt;
 root@ts01:~# apt install -y   qemu-kvm \&lt;br /&gt;
 libvirt-daemon-system \&lt;br /&gt;
 libvirt-clients \&lt;br /&gt;
 bridge-utils \&lt;br /&gt;
 virt-manager \&lt;br /&gt;
 cpu-checker&lt;br /&gt;
&lt;br /&gt;
===Libvirt===&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# systemctl enable --now libvirtd&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# systemctl status libvirtd&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Virsh===&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# virsh list --all&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:~# virsh net-start default&lt;br /&gt;
 root@ts01:~# virsh net-autostart default&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
===Prepare User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ sudo usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ less /etc/groups&lt;br /&gt;
&lt;br /&gt;
*User admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
==Installation Screenshots==&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;
==Advanced - Bridging==&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;network&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/network&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# sudo virsh net-start br0&lt;br /&gt;
 sudo 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:~# virsh shutdown debian13&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 virsh edit debian&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;
==Converting a VHDX Windows Disk==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# qemu-img info /home/vmadmin/vm-surf01.vhdx&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:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# qemu-img convert -p -f vhdx -O qcow2 \&lt;br /&gt;
  /home/vmadmin/vm-surf01.vhdx \&lt;br /&gt;
  /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&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;
&lt;br /&gt;
==Install a Win10 VM from a previous disk==&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|1200px]]&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:~# lsusb&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:~# virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&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;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&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:~# virsh dumpxml win10 | grep -A10 hostdev&lt;br /&gt;
    &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&lt;br /&gt;
      &amp;lt;source&amp;gt;&lt;br /&gt;
        &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
        &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
      &amp;lt;/source&amp;gt;&lt;br /&gt;
      &amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# virsh shutdown win10&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# virsh start win10&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:~# virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&lt;br /&gt;
 Device detached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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:~# virsh shutdown win10&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;
 root@ts01:~# virt-clone \&lt;br /&gt;
   --original win10 \&lt;br /&gt;
   --name win10a \&lt;br /&gt;
   --auto-clone&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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1112</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1112"/>
		<updated>2026-02-06T18:36:32Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Attach a USB Stick to the VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kvm testsetup at home&lt;br /&gt;
&lt;br /&gt;
==System==&lt;br /&gt;
 vmadmin@ts01:~$ sudo -i&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 Packages==&lt;br /&gt;
 root@ts01:~# apt install -y   qemu-kvm \&lt;br /&gt;
 libvirt-daemon-system \&lt;br /&gt;
 libvirt-clients \&lt;br /&gt;
 bridge-utils \&lt;br /&gt;
 virt-manager \&lt;br /&gt;
 cpu-checker&lt;br /&gt;
&lt;br /&gt;
===Libvirt===&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# systemctl enable --now libvirtd&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# systemctl status libvirtd&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Virsh===&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# virsh list --all&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:~# virsh net-start default&lt;br /&gt;
 root@ts01:~# virsh net-autostart default&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
===Prepare User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ sudo usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ less /etc/groups&lt;br /&gt;
&lt;br /&gt;
*User admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
==Installation Screenshots==&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;
==Advanced - Bridging==&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;network&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/network&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# sudo virsh net-start br0&lt;br /&gt;
 sudo 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:~# virsh shutdown debian13&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 virsh edit debian&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;
==Converting a VHDX Windows Disk==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# qemu-img info /home/vmadmin/vm-surf01.vhdx&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:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# qemu-img convert -p -f vhdx -O qcow2 \&lt;br /&gt;
  /home/vmadmin/vm-surf01.vhdx \&lt;br /&gt;
  /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&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;
&lt;br /&gt;
==Install a Win10 VM from a previous disk==&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|1200px]]&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:~# lsusb&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:~# virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&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;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&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:~# virsh dumpxml win10 | grep -A10 hostdev&lt;br /&gt;
    &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&lt;br /&gt;
      &amp;lt;source&amp;gt;&lt;br /&gt;
        &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
        &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
      &amp;lt;/source&amp;gt;&lt;br /&gt;
      &amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# virsh shutdown win10&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# virsh start win10&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:~# virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&lt;br /&gt;
 Device detached successfully&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1111</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1111"/>
		<updated>2026-02-06T18:33:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Attach a USB Stick to the VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kvm testsetup at home&lt;br /&gt;
&lt;br /&gt;
==System==&lt;br /&gt;
 vmadmin@ts01:~$ sudo -i&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 Packages==&lt;br /&gt;
 root@ts01:~# apt install -y   qemu-kvm \&lt;br /&gt;
 libvirt-daemon-system \&lt;br /&gt;
 libvirt-clients \&lt;br /&gt;
 bridge-utils \&lt;br /&gt;
 virt-manager \&lt;br /&gt;
 cpu-checker&lt;br /&gt;
&lt;br /&gt;
===Libvirt===&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# systemctl enable --now libvirtd&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# systemctl status libvirtd&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Virsh===&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# virsh list --all&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:~# virsh net-start default&lt;br /&gt;
 root@ts01:~# virsh net-autostart default&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
===Prepare User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ sudo usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ less /etc/groups&lt;br /&gt;
&lt;br /&gt;
*User admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
==Installation Screenshots==&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;
==Advanced - Bridging==&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;network&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/network&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# sudo virsh net-start br0&lt;br /&gt;
 sudo 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:~# virsh shutdown debian13&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 virsh edit debian&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;
==Converting a VHDX Windows Disk==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# qemu-img info /home/vmadmin/vm-surf01.vhdx&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:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# qemu-img convert -p -f vhdx -O qcow2 \&lt;br /&gt;
  /home/vmadmin/vm-surf01.vhdx \&lt;br /&gt;
  /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&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;
&lt;br /&gt;
==Install a Win10 VM from a previous disk==&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|1200px]]&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:~# lsusb&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:~# virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&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;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# virsh shutdown win10&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# virsh dumpxml win10 | grep -A10 hostdev&lt;br /&gt;
    &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&lt;br /&gt;
      &amp;lt;source&amp;gt;&lt;br /&gt;
        &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
        &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
      &amp;lt;/source&amp;gt;&lt;br /&gt;
      &amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# virsh start win10&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:~# virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&lt;br /&gt;
 Device detached successfully&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1110</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1110"/>
		<updated>2026-02-06T18:33:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kvm testsetup at home&lt;br /&gt;
&lt;br /&gt;
==System==&lt;br /&gt;
 vmadmin@ts01:~$ sudo -i&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 Packages==&lt;br /&gt;
 root@ts01:~# apt install -y   qemu-kvm \&lt;br /&gt;
 libvirt-daemon-system \&lt;br /&gt;
 libvirt-clients \&lt;br /&gt;
 bridge-utils \&lt;br /&gt;
 virt-manager \&lt;br /&gt;
 cpu-checker&lt;br /&gt;
&lt;br /&gt;
===Libvirt===&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# systemctl enable --now libvirtd&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# systemctl status libvirtd&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Virsh===&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# virsh list --all&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:~# virsh net-start default&lt;br /&gt;
 root@ts01:~# virsh net-autostart default&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
===Prepare User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ sudo usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ less /etc/groups&lt;br /&gt;
&lt;br /&gt;
*User admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
==Installation Screenshots==&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;
==Advanced - Bridging==&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;network&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/network&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# sudo virsh net-start br0&lt;br /&gt;
 sudo 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:~# virsh shutdown debian13&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 virsh edit debian&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;
==Converting a VHDX Windows Disk==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the disk:&lt;br /&gt;
 root@ts01:~# qemu-img info /home/vmadmin/vm-surf01.vhdx&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:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
*Convert the disk&lt;br /&gt;
 root@ts01:~# qemu-img convert -p -f vhdx -O qcow2 \&lt;br /&gt;
  /home/vmadmin/vm-surf01.vhdx \&lt;br /&gt;
  /var/lib/libvirt/images/vm-surf01.qcow2&lt;br /&gt;
    (100.00/100%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Inspect the converting results&lt;br /&gt;
 root@ts01:~# qemu-img info /var/lib/libvirt/images/vm-surf01.qcow2&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;
&lt;br /&gt;
==Install a Win10 VM from a previous disk==&lt;br /&gt;
&lt;br /&gt;
*Install01&lt;br /&gt;
[[image:wininst01a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install02&lt;br /&gt;
[[image:wininst02.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*Install03&lt;br /&gt;
[[image:wininst03.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Install04&lt;br /&gt;
[[image:wininst04a.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Win10 in running state&lt;br /&gt;
[[image:Windows10afterclone.png|1200px]]&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:~# lsusb&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:~# virsh attach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&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;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&lt;br /&gt;
 Device attached successfully&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Shutdown Win10&lt;br /&gt;
 root@ts01:~# virsh shutdown win10&lt;br /&gt;
 Domain &#039;win10&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Optional dump message to investigate the current settings&lt;br /&gt;
 root@ts01:~# virsh dumpxml win10 | grep -A10 hostdev&lt;br /&gt;
    &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039; managed=&#039;no&#039;&amp;gt;&lt;br /&gt;
      &amp;lt;source&amp;gt;&lt;br /&gt;
        &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
        &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
      &amp;lt;/source&amp;gt;&lt;br /&gt;
      &amp;lt;address type=&#039;usb&#039; bus=&#039;0&#039; port=&#039;4&#039;/&amp;gt;&lt;br /&gt;
      ....&lt;br /&gt;
&lt;br /&gt;
*Start back win10&lt;br /&gt;
 root@ts01:~# virsh start win10&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|1200px]]&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:~# virsh detach-device win10 --file &amp;lt;(cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;hostdev mode=&#039;subsystem&#039; type=&#039;usb&#039;&amp;gt;&lt;br /&gt;
   &amp;lt;source&amp;gt;&lt;br /&gt;
     &amp;lt;vendor id=&#039;0x0781&#039;/&amp;gt;&lt;br /&gt;
     &amp;lt;product id=&#039;0x5591&#039;/&amp;gt;&lt;br /&gt;
   &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;/hostdev&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
 ) --persistent&lt;br /&gt;
 Device detached successfully&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=File:Wininst04a.png&amp;diff=1109</id>
		<title>File:Wininst04a.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Wininst04a.png&amp;diff=1109"/>
		<updated>2026-02-06T18:33: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:Winusbb.png&amp;diff=1108</id>
		<title>File:Winusbb.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Winusbb.png&amp;diff=1108"/>
		<updated>2026-02-06T18:32:18Z</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:Windows10afterclone.png&amp;diff=1107</id>
		<title>File:Windows10afterclone.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Windows10afterclone.png&amp;diff=1107"/>
		<updated>2026-02-06T18:32: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:Wininst03.png&amp;diff=1106</id>
		<title>File:Wininst03.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Wininst03.png&amp;diff=1106"/>
		<updated>2026-02-06T18:31:45Z</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:Wininst02.png&amp;diff=1105</id>
		<title>File:Wininst02.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Wininst02.png&amp;diff=1105"/>
		<updated>2026-02-06T18:31:33Z</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:Wininst01a.png&amp;diff=1104</id>
		<title>File:Wininst01a.png</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=File:Wininst01a.png&amp;diff=1104"/>
		<updated>2026-02-06T18:31:09Z</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=Custom_Monitoring_Stack&amp;diff=1103</id>
		<title>Custom Monitoring Stack</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Custom_Monitoring_Stack&amp;diff=1103"/>
		<updated>2026-02-04T21:18:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About Custom Monitoring Stack =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A lightweight, Prometheus-native monitoring system designed for small environments&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Highlights:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Quick to set up&#039;&#039;&#039; – requires little more than a Prometheus container or a local Python Setup&lt;br /&gt;
* &#039;&#039;&#039;Custom exporter mode&#039;&#039;&#039; – exposes metrics in native Prometheus format&lt;br /&gt;
* &#039;&#039;&#039;Extensible plugin framework&#039;&#039;&#039; – simple, stateless checks (ping, port, process, http, cert) &lt;br /&gt;
* &#039;&#039;&#039;Highly flexible custom scheduler&#039;&#039;&#039; – orchestrates both local and remote plugin execution&lt;br /&gt;
* &#039;&#039;&#039;Minimal custom job runner&#039;&#039;&#039; – executes plugins remotely on behalf of the scheduler&lt;br /&gt;
* &#039;&#039;&#039;Grafana-ready by design&#039;&#039;&#039; – dashboards and alerting via Grafana and Grafana Alertmanager follow standard Prometheus workflows&lt;br /&gt;
* &#039;&#039;&#039;Mobile-friendly interface&#039;&#039;&#039; – optional mobile phone app available, view integrated with Grafana Alertmanager for basic alert monitoring and management&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This system provides a lightweight monitoring framework built around:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Component !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Custom-Exporter || Receives metrics and exposes Prometheus format&lt;br /&gt;
|-&lt;br /&gt;
| Plugins || Perform individual checks (ping, port, HTTP, cert, process)&lt;br /&gt;
|-&lt;br /&gt;
| Custom-JobRunner (optional) || Executes plugins remotely via HTTP&lt;br /&gt;
|-&lt;br /&gt;
| Custom-Scheduler (optional) || Orchestrates execution and intervals&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Design principles:&lt;br /&gt;
&lt;br /&gt;
* Stateless checks&lt;br /&gt;
* JSON-only interfaces&lt;br /&gt;
* No SSH dependency&lt;br /&gt;
* Automatic metric expiry&lt;br /&gt;
* Prometheus-native output&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
=== Logical Flow ===&lt;br /&gt;
&lt;br /&gt;
The monitoring stack supports three execution models.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== A: Direct execution via system scheduler (e.g. crontab) ====&lt;br /&gt;
&lt;br /&gt;
In this model, plugins are executed directly by the system scheduler.&lt;br /&gt;
In this way the local system crontab is in use.&lt;br /&gt;
&amp;lt;br&amp;gt;[[image:Custom-setup01.png]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check Plugins are also able to write from remote hosts via the network to the Custom-Exporter&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[[image:Custom-exporter01a.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typical use cases:&lt;br /&gt;
* Simple hosts&lt;br /&gt;
* Minimal dependencies&lt;br /&gt;
* One-off or legacy checks&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== B: Local execution using the Scheduler ====&lt;br /&gt;
&lt;br /&gt;
The Scheduler runs and orchestors locally and executes plugins directly on the same system.&lt;br /&gt;
&amp;lt;br&amp;gt;[[image:Custom-setup02.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical use cases:&lt;br /&gt;
* Centralized scheduling&lt;br /&gt;
* Consistent intervals&lt;br /&gt;
* Local-only monitoring&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== C: Remote execution using Scheduler and JobRunner ====&lt;br /&gt;
&lt;br /&gt;
In this model, the Scheduler coordinates execution and sends requests to the&lt;br /&gt;
JobRunner. The JobRunner executes plugins on remote hosts and returns the&lt;br /&gt;
results back to the Scheduler.&lt;br /&gt;
&lt;br /&gt;
The Custom-Scheduler then forwards metric payloads to the Custom-Exporter.&lt;br /&gt;
The Custom-Exporter is not part of the execution chain and operates independently.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;[[image:Custom-setup03.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another sample which is a bit odd and should only display the capabilties of&lt;br /&gt;
the check_plugins as they can write dierectly to the custom exporter via network.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;[[image:Custom-setup3a.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Combined Local and Remote Execution ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The preferred execution model.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As illustrated in the diagram below, the Custom Scheduler acts as the central&lt;br /&gt;
execution authority between local plugins, remote JobRunner instances,&lt;br /&gt;
and the Prometheus Custom Exporter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;[[image:Custom-setup04a.png]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A single Scheduler instance can:&lt;br /&gt;
&lt;br /&gt;
* Execute selected checks locally or via remote&lt;br /&gt;
* Dispatch other checks to one or more remote JobRunner instances&lt;br /&gt;
* Collect and evaluate all plugin results centrally&lt;br /&gt;
* Forward processed results to the Custom Exporter only after evaluation&lt;br /&gt;
&lt;br /&gt;
Local and remote execution paths are selected per check by scheduler&lt;br /&gt;
configuration, not by a global operating mode.&lt;br /&gt;
&lt;br /&gt;
This enables mixed deployments where local services are checked directly,&lt;br /&gt;
while remote, firewalled, or restricted hosts are monitored via JobRunner,&lt;br /&gt;
without duplicating exporters or schedulers.&lt;br /&gt;
&lt;br /&gt;
=== Key characteristics ===&lt;br /&gt;
&lt;br /&gt;
* JobRunner appears only once in the execution chain&lt;br /&gt;
* Downward flow represents execution requests&lt;br /&gt;
* Upward flow represents returned plugin results&lt;br /&gt;
* Custom-Scheduler receives and evaluates results&lt;br /&gt;
* Custom-Exporter is triggered only after result processing&lt;br /&gt;
* No direct plugin-to-exporter communication&lt;br /&gt;
&lt;br /&gt;
Typical use cases:&lt;br /&gt;
&lt;br /&gt;
* Remote hosts&lt;br /&gt;
* Environments without SSH access&lt;br /&gt;
* Firewalled or segmented networks&lt;br /&gt;
* Centralized orchestration&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Custom-Exporter ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
The exporter receives metrics via HTTP, stores them temporarily, and exposes them for Prometheus scraping.&lt;br /&gt;
&lt;br /&gt;
Metrics automatically expire if not refreshed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not a Pushgateway replacement.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
&lt;br /&gt;
* HTTP push ingestion&lt;br /&gt;
* Metric TTL (expiry)&lt;br /&gt;
* Optional SQLite persistence&lt;br /&gt;
* Thread-safe in-memory storage&lt;br /&gt;
* Mandatory label validation&lt;br /&gt;
* Optional check timestamp metrics&lt;br /&gt;
&lt;br /&gt;
=== Supported Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metric !! Description&lt;br /&gt;
|-&lt;br /&gt;
| check_ping || ICMP latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| check_tcp_port || TCP connect latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| check_proc || Process memory (RSS bytes)&lt;br /&gt;
|-&lt;br /&gt;
| check_http || HTTP latency or negative status&lt;br /&gt;
|-&lt;br /&gt;
| check_cert_expiry_days || Days until TLS expiry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mandatory Labels ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Label !! Required !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| source || Yes || Origin of the check&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== HTTP Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Endpoint !! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| /push || POST || Accept metric JSON&lt;br /&gt;
|-&lt;br /&gt;
| /metrics || GET || Prometheus scrape endpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Example Payload ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;metric_name&amp;quot;: &amp;quot;check_ping&amp;quot;,&lt;br /&gt;
  &amp;quot;value&amp;quot;: 12.3,&lt;br /&gt;
  &amp;quot;expiry&amp;quot;: 300,&lt;br /&gt;
  &amp;quot;time_label&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;labels&amp;quot;: {&lt;br /&gt;
    &amp;quot;host&amp;quot;: &amp;quot;example.com&amp;quot;,&lt;br /&gt;
    &amp;quot;source&amp;quot;: &amp;quot;scheduler&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Security and Exposure ===&lt;br /&gt;
&lt;br /&gt;
If the custom exporter is exposed beyond localhost or a trusted internal network,&lt;br /&gt;
it &#039;&#039;&#039;must&#039;&#039;&#039; be placed behind a reverse proxy such as nginx.&lt;br /&gt;
&lt;br /&gt;
Direct internet exposure of the custom exporter service is discouraged.&lt;br /&gt;
&lt;br /&gt;
The reverse proxy is responsible for:&lt;br /&gt;
&lt;br /&gt;
* TLS termination&lt;br /&gt;
* Authentication (Basic Auth, mTLS, or equivalent)&lt;br /&gt;
* IP allowlisting&lt;br /&gt;
* Rate limiting&lt;br /&gt;
* Request size limits&lt;br /&gt;
&lt;br /&gt;
The custom exporter itself intentionally remains simple and does not replace&lt;br /&gt;
an edge security layer.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Custom Exporter Startup Arguments ===&lt;br /&gt;
&lt;br /&gt;
The custom exporter is configured &#039;&#039;&#039;exclusively via command-line arguments&#039;&#039;&#039;.&lt;br /&gt;
There is no static configuration file.&lt;br /&gt;
&lt;br /&gt;
All runtime behaviour is derived from incoming metric payloads.&lt;br /&gt;
&lt;br /&gt;
=== Supported Arguments ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Argument !! Description !! Default&lt;br /&gt;
|-&lt;br /&gt;
| --db || Path to SQLite database for metric persistence || Disabled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Startup Load Sequence ===&lt;br /&gt;
&lt;br /&gt;
# Parse CLI arguments&lt;br /&gt;
# Initialize SQLite (if enabled)&lt;br /&gt;
# Load non-expired metrics from DB&lt;br /&gt;
# Start expiry cleanup thread&lt;br /&gt;
# Start HTTP server&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== Common Behaviour ===&lt;br /&gt;
&lt;br /&gt;
All plugins:&lt;br /&gt;
&lt;br /&gt;
* Are standalone executables&lt;br /&gt;
* Output structured JSON&lt;br /&gt;
* Support retries&lt;br /&gt;
* Support optional Basic Auth&lt;br /&gt;
* Support no export, allowing the scheduler to forward payloads&lt;br /&gt;
* Can run locally or remotely via the JobRunner&lt;br /&gt;
&lt;br /&gt;
=== Plugin Summary ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Plugin !! Function&lt;br /&gt;
|-&lt;br /&gt;
| check-ping || ICMP reachability&lt;br /&gt;
|-&lt;br /&gt;
| check-port || TCP connection latency&lt;br /&gt;
|-&lt;br /&gt;
| check-proc || Process memory usage&lt;br /&gt;
|-&lt;br /&gt;
| check-http || HTTP latency and content checks&lt;br /&gt;
|-&lt;br /&gt;
| check-cert || TLS certificate expiry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== check-ping ===&lt;br /&gt;
&lt;br /&gt;
* Uses system ping&lt;br /&gt;
* Measures round-trip time&lt;br /&gt;
* Retries on failure&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
check-ping --host google.de --expiry 300 --time-metric&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== check-port ===&lt;br /&gt;
&lt;br /&gt;
* TCP connect test&lt;br /&gt;
* Measures latency&lt;br /&gt;
* Supports arbitrary ports&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
check-port --host mail.example.com --port 587&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== check-proc ===&lt;br /&gt;
&lt;br /&gt;
* Uses psutil&lt;br /&gt;
* Reports RSS memory&lt;br /&gt;
* Fails if process is missing&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
check-proc --name dockerd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== check-http ===&lt;br /&gt;
&lt;br /&gt;
* Measures HTTP latency&lt;br /&gt;
* Optional regex content search&lt;br /&gt;
* Optional redirect handling&lt;br /&gt;
&lt;br /&gt;
Return values:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;0 || Latency in ms&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Pattern not found&lt;br /&gt;
|-&lt;br /&gt;
| -3xx || Redirect blocked&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
check-http -w https://example.com -p &amp;quot;Welcome&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== check-cert ===&lt;br /&gt;
&lt;br /&gt;
* Opens TLS connection&lt;br /&gt;
* Reads certificate notAfter field&lt;br /&gt;
* Returns remaining days&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
check-cert --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Custom JobRunner (Optional) ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
JobRunner allows controlled remote execution of plugins via HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
&lt;br /&gt;
* HTTP API&lt;br /&gt;
* Alias-based execution&lt;br /&gt;
* Sync or async execution&lt;br /&gt;
* Syslog logging&lt;br /&gt;
* No shell injection&lt;br /&gt;
* JSON output&lt;br /&gt;
&lt;br /&gt;
=== Example Request ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POST /run?alias=check-ping&amp;amp;args=--host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alias Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
joblist:&lt;br /&gt;
  - alias: check-ping&lt;br /&gt;
    cmd: /usr/local/bin/check-ping&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration Encryption ===&lt;br /&gt;
&lt;br /&gt;
Sensitive values in **jobrunner.yaml** and **exporter.yaml** may be stored encrypted.&lt;br /&gt;
&lt;br /&gt;
If plaintext or decrypted values are detected during load, JobRunner&lt;br /&gt;
will automatically encrypt them using **Fernet** and persist the&lt;br /&gt;
encrypted form.&lt;br /&gt;
&lt;br /&gt;
This prevents accidental long-term storage of secrets in readable form&lt;br /&gt;
while keeping configuration management simple.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Security and Exposure ===&lt;br /&gt;
&lt;br /&gt;
If JobRunner is accessible from outside the local host or trusted network,&lt;br /&gt;
it **must** be placed behind a reverse proxy such as nginx.&lt;br /&gt;
&lt;br /&gt;
The reverse proxy should provide:&lt;br /&gt;
&lt;br /&gt;
* TLS termination&lt;br /&gt;
* Authentication&lt;br /&gt;
* IP-based access control&lt;br /&gt;
* Rate limiting&lt;br /&gt;
&lt;br /&gt;
JobRunner deliberately avoids implementing complex security logic and&lt;br /&gt;
assumes a protected deployment environment.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Custom Scheduler (Optional) ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
The scheduler coordinates which checks run, where, and how often.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| hosts.yaml || Host inventory&lt;br /&gt;
|-&lt;br /&gt;
| services.yaml || Service definitions&lt;br /&gt;
|-&lt;br /&gt;
| commands.yaml || Local command paths&lt;br /&gt;
|-&lt;br /&gt;
| jobrunner.yaml || Remote runners&lt;br /&gt;
|-&lt;br /&gt;
| exporter.yaml || Exporter targets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Execution Logic ===&lt;br /&gt;
&lt;br /&gt;
# Load configuration&lt;br /&gt;
# Replace %hostname% placeholders&lt;br /&gt;
# Apply random startup delay&lt;br /&gt;
# Execute checks at interval&lt;br /&gt;
# Parse JSON output&lt;br /&gt;
# Forward metrics to exporter&lt;br /&gt;
&lt;br /&gt;
=== Interval Syntax ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Format !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 30s || 30 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 5m || 5 minutes&lt;br /&gt;
|-&lt;br /&gt;
| 1h || 1 hour&lt;br /&gt;
|-&lt;br /&gt;
| 1d || 1 day&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Python Module Requirements ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
&lt;br /&gt;
The monitoring stack is written in Python and relies on a small set of&lt;br /&gt;
well-known third-party modules in addition to the Python standard library.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Component !! Purpose !! Python Modules&lt;br /&gt;
|-&lt;br /&gt;
| Exporter || Prometheus metrics endpoint || flask, prometheus_client, requests, cryptography&lt;br /&gt;
|-&lt;br /&gt;
| Scheduler || Job orchestration || pyyaml&lt;br /&gt;
|-&lt;br /&gt;
| JobRunner || Remote execution API || flask, pyyaml, cryptography&lt;br /&gt;
|-&lt;br /&gt;
| Plugins || Monitoring checks || requests, psutil&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Custom Exporter ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from flask import Flask&lt;br /&gt;
from prometheus_client import CollectorRegistry, generate_latest&lt;br /&gt;
from prometheus_client.core import GaugeMetricFamily&lt;br /&gt;
import requests&lt;br /&gt;
import sqlite3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Scheduler ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import yaml&lt;br /&gt;
import threading&lt;br /&gt;
import subprocess&lt;br /&gt;
import time&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== JobRunner ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from flask import Flask, request, jsonify&lt;br /&gt;
from cryptography.fernet import Fernet&lt;br /&gt;
import yaml&lt;br /&gt;
import subprocess&lt;br /&gt;
import logging&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import requests&lt;br /&gt;
import psutil&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import argparse&lt;br /&gt;
import json&lt;br /&gt;
import time&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Python Version ===&lt;br /&gt;
&lt;br /&gt;
* Python 3.8 or newer&lt;br /&gt;
* Python 3.11 recommended&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Minimal Installation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pip install flask prometheus_client requests pyyaml psutil cryptography&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary of Custom Monitoring Stack ==&lt;br /&gt;
&lt;br /&gt;
This monitoring stack provides:&lt;br /&gt;
&lt;br /&gt;
* Stateless plugin execution&lt;br /&gt;
* Prometheus-compatible metrics&lt;br /&gt;
* Automatic metric expiry&lt;br /&gt;
* Remote execution without SSH&lt;br /&gt;
* Central scheduling&lt;br /&gt;
* Clear JSON boundaries&lt;br /&gt;
* Automatic self-healing encryption of sensitive configuration values&lt;br /&gt;
&lt;br /&gt;
It is intentionally simple, predictable, and easy to reason about.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1102</id>
		<title>PoC: KVM</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=PoC:_KVM&amp;diff=1102"/>
		<updated>2026-02-04T20:55:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;kvm testsetup at home  ==System==  vmadmin@ts01:~$ sudo -i  root@ts01:~# cat /etc/os-release  PRETTY_NAME=&amp;quot;Ubuntu 25.10&amp;quot;  NAME=&amp;quot;Ubuntu&amp;quot;  VERSION_ID=&amp;quot;25.10&amp;quot;  VERSION=&amp;quot;25.10 (Questing Quokka)&amp;quot;  VERSION_CODENAME=questing  ID=ubuntu  ID_LIKE=debian  HOME_URL=&amp;quot;https://www.ubuntu.com/&amp;quot;  SUPPORT_URL=&amp;quot;https://help.ubuntu.com/&amp;quot;  BUG_REPORT_URL=&amp;quot;https://bugs.launchpad.net/ubuntu/&amp;quot;  PRIVACY_POLICY_URL=&amp;quot;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&amp;quot;  UBUNTU_CODENAME...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kvm testsetup at home&lt;br /&gt;
&lt;br /&gt;
==System==&lt;br /&gt;
 vmadmin@ts01:~$ sudo -i&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 Packages==&lt;br /&gt;
 root@ts01:~# apt install -y   qemu-kvm \&lt;br /&gt;
 libvirt-daemon-system \&lt;br /&gt;
 libvirt-clients \&lt;br /&gt;
 bridge-utils \&lt;br /&gt;
 virt-manager \&lt;br /&gt;
 cpu-checker&lt;br /&gt;
&lt;br /&gt;
===Libvirt===&lt;br /&gt;
*Enable &lt;br /&gt;
 root@ts01:~# systemctl enable --now libvirtd&lt;br /&gt;
*Status&lt;br /&gt;
 root@ts01:~# systemctl status libvirtd&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Virsh===&lt;br /&gt;
*List&lt;br /&gt;
 root@ts01:~# virsh list --all&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:~# virsh net-start default&lt;br /&gt;
 root@ts01:~# virsh net-autostart default&lt;br /&gt;
&lt;br /&gt;
*Prepare for the first Debian Image&lt;br /&gt;
 root@ts01:~# cp /home/admin/debian-13.3.0-amd64-netinst.iso /var/lib/libvirt/images&lt;br /&gt;
 root@ts01:~# chmod 666 /var/lib/libvirt/images/debian-13.3.0-amd64-netinst.iso&lt;br /&gt;
 root@ts01:~# #Do this only on a sandbox&lt;br /&gt;
 root@ts01:~# chmod 777 /var/lib/libvirt/images&lt;br /&gt;
&lt;br /&gt;
===Prepare User===&lt;br /&gt;
*User admin:&lt;br /&gt;
 vmadmin@ts01:~$ usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ sudo usermod -aG libvirt,kvm $USER&lt;br /&gt;
 vmadmin@ts01:~$ less /etc/groups&lt;br /&gt;
&lt;br /&gt;
*User admin in xrdp:&lt;br /&gt;
 virt-manager&lt;br /&gt;
&lt;br /&gt;
==Installation Screenshots==&lt;br /&gt;
*VM Installer01&lt;br /&gt;
[[image:KVMInstall03.png]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer02&lt;br /&gt;
[[image:KVMInstall04.png]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer05&lt;br /&gt;
[[image:KVMInstall05a.png]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer06&lt;br /&gt;
[[image:KVMInstall06b.png]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer07&lt;br /&gt;
[[image:KVMInstall07.png]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer08&lt;br /&gt;
[[image:KVMInstall08.png]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer09&lt;br /&gt;
[[image:KVMInstall09.png]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer10&lt;br /&gt;
[[image:KVMInstall10a.png]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer11&lt;br /&gt;
[[image:KVMInstall11.png]]&lt;br /&gt;
&lt;br /&gt;
*VM Installer12&lt;br /&gt;
[[image:KVMInstall12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Advanced - Bridging==&lt;br /&gt;
&lt;br /&gt;
*advanced, make the vm bridged&lt;br /&gt;
 root@ts01:~# sudo virsh net-define /dev/stdin &amp;lt;&amp;lt;EOF&lt;br /&gt;
 &amp;lt;network&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;br0&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;forward mode=&amp;quot;bridge&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;bridge name=&amp;quot;br0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/network&amp;gt;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
*Start&lt;br /&gt;
 root@ts01:~# sudo virsh net-start br0&lt;br /&gt;
 sudo 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:~# virsh shutdown debian13&lt;br /&gt;
 Domain &#039;debian13&#039; is being shutdown&lt;br /&gt;
&lt;br /&gt;
*Edit&lt;br /&gt;
 virsh edit debian&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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>