Add Getting Started
commit
8c8f07fb16
1 changed files with 358 additions and 0 deletions
358
Getting-Started.md
Normal file
358
Getting-Started.md
Normal file
|
|
@ -0,0 +1,358 @@
|
|||
# 🚀 MNMIVM-SE — Getting Started
|
||||
|
||||
This guide walks through **installing dependencies**, **building MNMIVM-SE**, and **basic CLI usage** on a fresh system.
|
||||
|
||||
MNMIVM-SE is intentionally simple: no services, no installers, no background daemons.
|
||||
If the host is ready, the binary just runs.
|
||||
|
||||
---
|
||||
|
||||
## 🧱 Prerequisites
|
||||
|
||||
Before building or running MNMIVM-SE, your host must support **KVM virtualization** and **bridged networking**.
|
||||
|
||||
### Hardware requirements
|
||||
- x86_64 CPU
|
||||
- Hardware virtualization enabled (Intel VT-x / AMD-V)
|
||||
- Wired Ethernet (Wi-Fi cannot be bridged)
|
||||
|
||||
---
|
||||
|
||||
## 📦 Installing Dependencies
|
||||
|
||||
### Debian 12+ (Recommended)
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y \
|
||||
qemu-system-x86 \
|
||||
qemu-utils \
|
||||
qemu-bridge-helper \
|
||||
cloud-image-utils \
|
||||
genisoimage \
|
||||
bridge-utils \
|
||||
iproute2 \
|
||||
iptables \
|
||||
curl \
|
||||
ca-certificates \
|
||||
git \
|
||||
build-essential
|
||||
````
|
||||
|
||||
Optional (but useful):
|
||||
|
||||
```bash
|
||||
sudo apt install -y cpu-checker
|
||||
kvm-ok
|
||||
```
|
||||
|
||||
Verify KVM is available:
|
||||
|
||||
```bash
|
||||
ls -l /dev/kvm
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Alpine Linux 3.22+
|
||||
|
||||
Alpine does not ship a hypervisor stack by default.
|
||||
|
||||
```bash
|
||||
apk add \
|
||||
qemu-system-x86_64 \
|
||||
qemu-img \
|
||||
qemu-hw-display-virtio-vga \
|
||||
bridge-utils \
|
||||
cdrkit \
|
||||
go \
|
||||
git
|
||||
```
|
||||
|
||||
Notes:
|
||||
|
||||
* `cdrkit` provides `genisoimage`
|
||||
* No libvirt or system services are required
|
||||
* OpenRC is sufficient
|
||||
|
||||
---
|
||||
|
||||
## 🔌 Required Kernel Modules
|
||||
|
||||
MNMIVM-SE requires **TUN/TAP** for bridged networking.
|
||||
|
||||
Check:
|
||||
|
||||
```bash
|
||||
ls -l /dev/net/tun
|
||||
```
|
||||
|
||||
If missing:
|
||||
|
||||
```bash
|
||||
sudo modprobe tun
|
||||
```
|
||||
|
||||
Persist on boot:
|
||||
|
||||
### Debian
|
||||
|
||||
```bash
|
||||
echo tun | sudo tee /etc/modules-load.d/tun.conf
|
||||
```
|
||||
|
||||
### Alpine
|
||||
|
||||
```bash
|
||||
echo tun | sudo tee -a /etc/modules
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Bridge Setup (Required)
|
||||
|
||||
MNMIVM-SE expects a Linux bridge named **`br0`**.
|
||||
|
||||
### Example (Debian `/etc/network/interfaces`)
|
||||
|
||||
```ini
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
|
||||
auto ens18
|
||||
iface ens18 inet manual
|
||||
|
||||
auto br0
|
||||
iface br0 inet static
|
||||
address 192.168.86.10
|
||||
netmask 255.255.255.0
|
||||
gateway 192.168.86.1
|
||||
dns-nameservers 1.1.1.1 8.8.8.8
|
||||
bridge_ports ens18
|
||||
bridge_stp off
|
||||
bridge_fd 0
|
||||
```
|
||||
|
||||
Rules:
|
||||
|
||||
* Host IP lives on `br0`
|
||||
* Physical NIC has **no IP**
|
||||
* Wi-Fi cannot be bridged
|
||||
|
||||
---
|
||||
|
||||
## 🔥 Disable Bridge Netfilter (CRITICAL)
|
||||
|
||||
If this is enabled, VMs will boot but be unreachable.
|
||||
|
||||
```bash
|
||||
cat /proc/sys/net/bridge/bridge-nf-call-iptables
|
||||
# must be 0
|
||||
```
|
||||
|
||||
Fix (runtime):
|
||||
|
||||
```bash
|
||||
sudo sysctl -w net.bridge.bridge-nf-call-iptables=0
|
||||
sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=0
|
||||
sudo sysctl -w net.bridge.bridge-nf-call-arptables=0
|
||||
```
|
||||
|
||||
Persist:
|
||||
|
||||
```ini
|
||||
# /etc/sysctl.d/99-bridge.conf
|
||||
net.bridge.bridge-nf-call-iptables = 0
|
||||
net.bridge.bridge-nf-call-ip6tables = 0
|
||||
net.bridge.bridge-nf-call-arptables = 0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Allow QEMU to Use the Bridge
|
||||
|
||||
Create or edit:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/qemu/bridge.conf
|
||||
```
|
||||
|
||||
```ini
|
||||
allow br0
|
||||
```
|
||||
|
||||
Verify helper exists:
|
||||
|
||||
```bash
|
||||
ls -l /usr/lib/qemu/qemu-bridge-helper
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Building MNMIVM-SE
|
||||
|
||||
Clone the repository:
|
||||
|
||||
```bash
|
||||
git clone https://mentalnet.xyz/forgejo/markmental/mnmivm-se.git
|
||||
cd mnmivm-se
|
||||
```
|
||||
|
||||
Build the binary:
|
||||
|
||||
```bash
|
||||
./build.sh
|
||||
```
|
||||
|
||||
This produces:
|
||||
|
||||
```bash
|
||||
./mnmivm-se
|
||||
```
|
||||
|
||||
(Optional) Install system-wide:
|
||||
|
||||
```bash
|
||||
sudo install -m 755 mnmivm-se /usr/local/bin/mnmivm-se
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Configuration (Code-Level)
|
||||
|
||||
MNMIVM-SE is configured **in code** for predictability.
|
||||
|
||||
Edit constants in `main.go`:
|
||||
|
||||
```go
|
||||
// Networking
|
||||
bridgeName = "br0"
|
||||
lanCIDR = "192.168.86.0/24"
|
||||
lanGW = "192.168.86.1"
|
||||
lanDNS1 = "192.168.86.1"
|
||||
lanDNS2 = "8.8.8.8"
|
||||
|
||||
// VM sizing
|
||||
baseDiskSize = "12G"
|
||||
memMB = "1024"
|
||||
cpus = "1"
|
||||
```
|
||||
|
||||
Rebuild after changes:
|
||||
|
||||
```bash
|
||||
./build.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧰 CLI Usage
|
||||
|
||||
### Create a VM
|
||||
|
||||
```bash
|
||||
sudo mnmivm-se create vm1 \
|
||||
--os debian \
|
||||
--pubkey-path ~/.ssh/id_ed25519.pub \
|
||||
--ip 192.168.86.53
|
||||
```
|
||||
|
||||
This will:
|
||||
|
||||
* Download the cloud image (if missing)
|
||||
* Create a QCOW2 disk
|
||||
* Generate a cloud-init seed
|
||||
* Pin MAC, IP, and SSH key
|
||||
|
||||
---
|
||||
|
||||
### Start the VM
|
||||
|
||||
```bash
|
||||
sudo mnmivm-se start vm1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### SSH Into the VM
|
||||
|
||||
```bash
|
||||
ssh debian@192.168.86.53
|
||||
```
|
||||
|
||||
SSH is **key-only**.
|
||||
No passwords are enabled.
|
||||
|
||||
---
|
||||
|
||||
### Stop the VM
|
||||
|
||||
```bash
|
||||
sudo mnmivm-se stop vm1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Update Cloud-Init (Key or IP)
|
||||
|
||||
```bash
|
||||
sudo mnmivm-se update-cloud vm1 \
|
||||
--pubkey-path newkey.pub \
|
||||
--ip 192.168.86.54
|
||||
```
|
||||
|
||||
Changes apply on next boot.
|
||||
|
||||
---
|
||||
|
||||
### List VMs
|
||||
|
||||
```bash
|
||||
sudo mnmivm-se list
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Delete a VM
|
||||
|
||||
```bash
|
||||
sudo mnmivm-se delete vm1
|
||||
```
|
||||
|
||||
Requires typing `YES` to confirm.
|
||||
|
||||
---
|
||||
|
||||
## 🔑 Security Notes
|
||||
|
||||
* SSH key–only access
|
||||
* No password authentication
|
||||
* No root login
|
||||
* Static IP assignment
|
||||
* VNC console for recovery only
|
||||
|
||||
Security is **intentional by default**.
|
||||
|
||||
---
|
||||
|
||||
## 🧠 Final Notes
|
||||
|
||||
* MNMIVM-SE does not manage host firewalls
|
||||
* IPv4 is used for predictable internal networking
|
||||
* IPv6 may be present depending on your router
|
||||
* If IPv6 is enabled, it is assumed you understand its exposure model
|
||||
|
||||
If something breaks, it’s almost always:
|
||||
|
||||
* bridge config
|
||||
* kernel sysctls
|
||||
* missing `tun` module
|
||||
|
||||
That’s not a bug.
|
||||
|
||||
That’s infrastructure.
|
||||
|
||||
---
|
||||
|
||||
Happy launching! 🚀
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue