Table of Contents
N100 Mini PC
N100 Mini PCs are very cheap and very capable devices.
Here is the procedure used to dual boot debian 12 on a Mini PC and prepare it to run VMs under KVM.
Hardware
TRIGKEY N100 CPU 16GB RAM 512GB SSD WIFI 6 BT 5.2 WIN 11 PRO
After discount this device should cost £169 (Jan 2024) or £154 (Aug 2024).
External SSD is an ADATA 240 GB for VMs. Any external USB3 drive will do.
Boot
Storage
Disk 0
Run Windows 11 “Disk Management”, select the C partition of “Disk 0” and choose “Shrink Volume”.
Enter the amount of space to shrink in MB, Eg, 128000.
A new empty partition will be created, this is where Linux will be installed.
Disk 1
Disk 1 is an external USB3 SSD and is not initialised in Windows.
This will be dedicated to KVM in Linux. In this instance the external SSD is 240 GB.
NB usb_storage.quirks will probably be required for external USB3 drives in Linux.
Debian 12 install
The recommended way to install Debian is using a USB flash drive.
Writing the drive image in Windows can be done using RUFUS.
This software was unreliable with one USB flash drive and failed with an ISO extraction error. It worked fine with an SDCARD in a USB adapter.
The latest stable Debian image at this time is Debian 12.4 AMD64.
Install
Power on and press DELETE to enter the BIOS.
To boot from a specific device navigate to the override section and then choose the Mass storage device to install Debian.
Partition
When installing Debian use the free space created when shrinking the C drive with the single partition option and let Debian work it all out.
Software
Choose basic software such as SSH and possibly LXQT when using a 4K display since the default console is barely readable at that resolution.
Boot
Change the NVMe boot priority from Windows boot manager to the Debian boot manager and save the setting to restart.
Miscellaneous
Environment
su root export PATH=/bin:/sbin
Tools
apt install hdparm apt-file net-tools cpu-checker lshw wireless-tools rfkill bridge-utils cgroupfs-mount conntrack iptables
apt-file update
Quirks
Eg. Ensure ADATA device uses USB Mass storage and not UAS.
cp /etc/default/grub /etc/default/grub.bak sed -i 's/DEFAULT="quiet"/DEFAULT="quiet usb-storage.quirks=125f:a88a:u"/g' /etc/default/grub update-grub
Shell
Install tcsh if preferred
apt install tcsh
Locales
Install GB and US locales
dpkg-reconfigure locales
Timezone
Set timezone to Etc/UTC
dpkg-reconfigure tzdata
Editor
Set editor to VIM in preference to pico/nano
apt install vim update-alternatives --config editor
Run level
Disable any window manager at boot.
systemctl isolate multi-user.target systemctl set-default multi-user.target
Services
Disable services not required for the KVM appliance (or servers).
As root
systemctl disable connman systemctl disable preload.service systemctl disable dundee.service systemctl disable ofono.service systemctl disable plymouth.service systemctl disable wpa_supplicant.service systemctl disable rtkit-daemon systemctl disable bluetooth.service systemctl disable cups.service systemctl disable cups-browsed.service systemctl disable avahi-daemon.service systemctl disable ModemManager.service
systemctl mask connman systemctl mask wpa_supplicant.service systemctl mask rtkit-daemon
update-rc.d pulseaudio-enable-autospawn disable update-rc.d sddm disable update-rc.d saned disable
apt remove --purge gvfs-backends gvfs
As user
systemctl --user stop pulseaudio.socket systemctl --user stop pulseaudio.service
systemctl --user disable pulseaudio.socket systemctl --user disable pulseaudio.service
systemctl --user mask pulseaudio.socket systemctl --user mask pulseaudio.service
Reboot
/sbin/reboot
File system
Follow the B-TREE filesystem guide to setup /dev/sda and mount on /opt
This file system will be used for VMs.
Network
In this example the host is 192.168.0.130 and VMs or containers will be bridged to the same network.
Save /etc/network/interfaces
cp interfaces interfaces.dist
Replace /etc/network/interfaces
auto lo iface lo inet loopback auto enp1s0 iface enp1s0 inet manual auto br0 iface br0 inet static bridge_ports enp1s0 address 192.168.0.130 netmask 255.255.255.0 gateway 192.168.0.1
Reboot to take effect.
ifconfig -a br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.130 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::4c3a:bff:feab:4fb0 prefixlen 64 scopeid 0x20<link> ether 4e:3a:0b:ab:4f:b0 txqueuelen 1000 (Ethernet) RX packets 114 bytes 11804 (11.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 93 bytes 14326 (13.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 7c:83:34:be:e3:5e txqueuelen 1000 (Ethernet) RX packets 114 bytes 13400 (13.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 93 bytes 14326 (13.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Permissions
mkdir -p /etc/qemu echo "allow all" > /etc/qemu/bridge.conf chmod u+s /usr/lib/qemu/qemu-bridge-helper
Example lease on bridge
lease 192.168.0.248 { starts 4 2024/01/18 18:11:39; ends 5 2024/01/19 18:11:39; cltt 4 2024/01/18 18:11:39; binding state active; next binding state free; rewind binding state free; hardware ethernet 52:54:00:e6:ab:09; uid "\001RT\000\346\253\011"; set vendor-class-identifier = "d-i"; }