support USB ethernet in bordervm

This commit is contained in:
Daniel Barlow 2023-05-09 22:58:56 +01:00
parent 55387b0ee3
commit b70c8ee258
3 changed files with 39 additions and 17 deletions

View file

@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
let let
cfg = config.bordervm; cfg = config.bordervm;
inherit (lib) mkOption mdDoc types; inherit (lib) mkOption mkEnableOption mdDoc types optional optionals;
in { in {
options.bordervm = { options.bordervm = {
l2tp = { l2tp = {
@ -22,7 +22,9 @@ in {
}; };
}; };
ethernet = { ethernet = {
pciId = mkOption { pci = {
enable = mkEnableOption "passthru PCI ethernet";
id = mkOption {
description = '' description = ''
Host PCI ID (as shown by `lspci`) of the ethernet adaptor Host PCI ID (as shown by `lspci`) of the ethernet adaptor
to be used by the VM. This uses VFIO and requires setup to be used by the VM. This uses VFIO and requires setup
@ -32,6 +34,18 @@ in {
example = "04:00.0"; example = "04:00.0";
}; };
}; };
usb = {
enable = mkEnableOption "passthru USB ethernet";
vendor = mkOption {
type = types.str;
example = "0x0bda";
};
product = mkOption {
type = types.str;
example = "0x8153";
};
};
};
}; };
imports = [ imports = [
<nixpkgs/nixos/modules/virtualisation/qemu-vm.nix> <nixpkgs/nixos/modules/virtualisation/qemu-vm.nix>
@ -66,8 +80,13 @@ in {
virtualisation = { virtualisation = {
qemu = { qemu = {
networkingOptions = []; networkingOptions = [];
options = [ options = [] ++
"-device vfio-pci,host=${cfg.ethernet.pciId}" optional cfg.ethernet.pci.enable
"-device vfio-pci,host=${cfg.ethernet.pci.id}" ++
optionals cfg.ethernet.usb.enable [
"-device usb-ehci,id=ehci"
"-device usb-host,bus=ehci.0,vendorid=${cfg.ethernet.usb.vendor},productid=${cfg.ethernet.usb.product}"
] ++ [
"-nographic" "-nographic"
"-serial mon:stdio" "-serial mon:stdio"
]; ];

View file

@ -1,7 +1,8 @@
{...}: {...}:
{ {
bordervm = { bordervm = {
ethernet.pciId = "01:00.0"; # ethernet.pci = { id = "01:00.0"; enable = true; };
ethernet.usb = { vendor = "0x0bda"; product = "0x8153"; enable = true; };
l2tp = { l2tp = {
host = "l2tp.aa.net.uk"; host = "l2tp.aa.net.uk";
}; };

View file

@ -139,11 +139,13 @@ router from the internet so you can borrow the cable/fibre/DSL.
``bordervm`` is included for this purpose. You will need ``bordervm`` is included for this purpose. You will need
* a Linux machine with a spare PCI ethernet card which you can dedicate to Liminix * a Linux machine with a spare (PCI or USB) ethernet device which you can dedicate to Liminix
* an L2TP service such as https://www.aa.net.uk/broadband/l2tp-service/ * an L2TP service such as https://www.aa.net.uk/broadband/l2tp-service/
You need to configure the Ethernet card for VFIO passthru, then You need to "hide" the Ethernet device from the host - for PCI this
means configuring it for VFIO passthru; for USB you need to
unload the module(s) it uses. Then
you can execute :command:`run-border-vm` in a ``buildEnv`` shell, you can execute :command:`run-border-vm` in a ``buildEnv`` shell,
which starts up QEMU using the NixOS configuration in which starts up QEMU using the NixOS configuration in
:file:`bordervm-configuration.nix`. :file:`bordervm-configuration.nix`.