====N100 Mini PC==== {{boards:n100:box.jpg?200}} 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 [[:tools:kvm|KVM]]. ===Hardware=== [[https://www.amazon.co.uk/Windows-3750H-TRIGKEY-S3-Graphics/dp/B09MFKZFYG/|TRIGKEY N100 CPU 16GB RAM 512GB SSD WIFI 6 BT 5.2 WIN 11 PRO]] After discount this device should cost £169. External SSD is an ADATA 240 GB for VMs. Any external USB3 drive will do. ===Boot=== {{boards:n100:sysinfo.jpg?200}} Factory default BIOS mode is UEFI and "Secure boot state" is OFF. ===Storage=== {{boards:n100:shrink_volume.jpg?200}} __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 [[https://rufus.ie/en/|RUFUS]]. {{:boards:n100:rufus.jpg?200}} 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 [[https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.4.0-amd64-netinst.iso|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. {{boards:n100:boot.jpg?200}} ==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. {{boards:n100:partition.jpg?200}} ==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. {{:boards:n100:bootpri.jpg?100}} {{boards:n100:debian.jpg?100}} [[boards:n100-dmesg|dmesg]] ===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 [[https://wiki.kewl.org/dokuwiki/tools:btrfs|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 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 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 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 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 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"; }