2010-10-05 15:44:40 +00:00
|
|
|
# Xen hypervisor (Dom0) support.
|
2010-09-12 22:43:45 +00:00
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
{
|
|
|
|
config,
|
|
|
|
lib,
|
|
|
|
pkgs,
|
|
|
|
...
|
|
|
|
}:
|
2010-09-12 22:43:45 +00:00
|
|
|
|
2014-04-14 16:26:48 +02:00
|
|
|
with lib;
|
2010-09-12 22:43:45 +00:00
|
|
|
|
2011-09-14 18:20:50 +00:00
|
|
|
let
|
|
|
|
cfg = config.virtualisation.xen;
|
2010-09-16 15:24:46 +00:00
|
|
|
in
|
2010-09-12 22:43:45 +00:00
|
|
|
|
|
|
|
{
|
2019-12-10 02:51:19 +01:00
|
|
|
imports = [
|
2024-09-17 20:13:28 +00:00
|
|
|
(mkRemovedOptionModule [
|
|
|
|
"virtualisation"
|
|
|
|
"xen"
|
|
|
|
"qemu"
|
|
|
|
] "You don't need this option anymore, it will work without it.")
|
|
|
|
(mkRenamedOptionModule
|
|
|
|
[
|
|
|
|
"virtualisation"
|
|
|
|
"xen"
|
|
|
|
"qemu-package"
|
|
|
|
]
|
|
|
|
[
|
|
|
|
"virtualisation"
|
|
|
|
"xen"
|
|
|
|
"package-qemu"
|
|
|
|
]
|
|
|
|
)
|
2019-12-10 02:51:19 +01:00
|
|
|
];
|
|
|
|
|
2010-09-12 22:43:45 +00:00
|
|
|
###### interface
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
virtualisation.xen.enable = mkOption {
|
|
|
|
default = false;
|
|
|
|
type = types.bool;
|
|
|
|
description = ''
|
|
|
|
Setting this option enables the Xen hypervisor, a
|
|
|
|
virtualisation technology that allows multiple virtual
|
|
|
|
machines, known as *domains*, to run
|
|
|
|
concurrently on the physical machine. NixOS runs as the
|
|
|
|
privileged *Domain 0*. This option
|
|
|
|
requires a reboot to take effect.
|
|
|
|
'';
|
|
|
|
};
|
2010-09-12 22:43:45 +00:00
|
|
|
|
2017-03-03 17:46:57 +00:00
|
|
|
virtualisation.xen.package = mkOption {
|
|
|
|
type = types.package;
|
2021-10-03 18:06:03 +02:00
|
|
|
defaultText = literalExpression "pkgs.xen";
|
|
|
|
example = literalExpression "pkgs.xen-light";
|
2022-07-20 12:32:04 +02:00
|
|
|
description = ''
|
2017-03-03 17:46:57 +00:00
|
|
|
The package used for Xen binary.
|
|
|
|
'';
|
2024-09-17 20:13:28 +00:00
|
|
|
relatedPackages = [
|
|
|
|
"xen"
|
|
|
|
"xen-light"
|
|
|
|
];
|
2017-03-03 17:46:57 +00:00
|
|
|
};
|
|
|
|
|
2017-12-07 21:26:49 +00:00
|
|
|
virtualisation.xen.package-qemu = mkOption {
|
2017-03-03 17:46:57 +00:00
|
|
|
type = types.package;
|
2021-10-03 18:06:03 +02:00
|
|
|
defaultText = literalExpression "pkgs.xen";
|
|
|
|
example = literalExpression "pkgs.qemu_xen-light";
|
2022-07-20 12:32:04 +02:00
|
|
|
description = ''
|
2017-12-07 21:26:49 +00:00
|
|
|
The package with qemu binaries for dom0 qemu and xendomains.
|
2017-03-03 17:46:57 +00:00
|
|
|
'';
|
2024-09-17 20:13:28 +00:00
|
|
|
relatedPackages = [
|
|
|
|
"xen"
|
|
|
|
{
|
|
|
|
name = "qemu_xen-light";
|
|
|
|
comment = "For use with pkgs.xen-light.";
|
|
|
|
}
|
|
|
|
];
|
2017-03-03 17:46:57 +00:00
|
|
|
};
|
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
virtualisation.xen.bootParams = mkOption {
|
|
|
|
default = [ ];
|
|
|
|
type = types.listOf types.str;
|
|
|
|
description = ''
|
|
|
|
Parameters passed to the Xen hypervisor at boot time.
|
|
|
|
'';
|
|
|
|
};
|
2010-09-12 22:43:45 +00:00
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
virtualisation.xen.domain0MemorySize = mkOption {
|
|
|
|
default = 0;
|
|
|
|
example = 512;
|
|
|
|
type = types.addCheck types.int (n: n >= 0);
|
|
|
|
description = ''
|
|
|
|
Amount of memory (in MiB) allocated to Domain 0 on boot.
|
|
|
|
If set to 0, all memory is assigned to Domain 0.
|
|
|
|
'';
|
|
|
|
};
|
2010-09-12 22:43:45 +00:00
|
|
|
|
2015-06-23 13:36:32 +02:00
|
|
|
virtualisation.xen.bridge = {
|
2024-09-17 20:13:28 +00:00
|
|
|
name = mkOption {
|
|
|
|
default = "xenbr0";
|
|
|
|
type = types.str;
|
|
|
|
description = ''
|
|
|
|
Name of bridge the Xen domUs connect to.
|
|
|
|
'';
|
|
|
|
};
|
2017-04-30 06:50:28 +00:00
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
address = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "172.16.0.1";
|
|
|
|
description = ''
|
|
|
|
IPv4 address of the bridge.
|
|
|
|
'';
|
2015-01-29 09:58:28 +01:00
|
|
|
};
|
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
prefixLength = mkOption {
|
|
|
|
type = types.addCheck types.int (n: n >= 0 && n <= 32);
|
|
|
|
default = 16;
|
|
|
|
description = ''
|
|
|
|
Subnet mask of the bridge interface, specified as the number of
|
|
|
|
bits in the prefix (`24`).
|
|
|
|
A DHCP server will provide IP addresses for the whole, remaining
|
|
|
|
subnet.
|
|
|
|
'';
|
2015-01-29 09:58:28 +01:00
|
|
|
};
|
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
forwardDns = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
|
|
|
description = ''
|
|
|
|
If set to `true`, the DNS queries from the
|
|
|
|
hosts connected to the bridge will be forwarded to the DNS
|
|
|
|
servers specified in /etc/resolv.conf .
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
virtualisation.xen.stored = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
description = ''
|
|
|
|
Xen Store daemon to use. Defaults to oxenstored of the xen package.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2017-05-04 08:31:40 +00:00
|
|
|
virtualisation.xen.domains = {
|
2024-09-17 20:13:28 +00:00
|
|
|
extraConfig = mkOption {
|
|
|
|
type = types.lines;
|
|
|
|
default = "";
|
|
|
|
description = ''
|
|
|
|
Options defined here will override the defaults for xendomains.
|
|
|
|
The default options can be seen in the file included from
|
|
|
|
/etc/default/xendomains.
|
|
|
|
'';
|
2017-05-04 08:31:40 +00:00
|
|
|
};
|
2024-09-17 20:13:28 +00:00
|
|
|
};
|
2017-05-04 08:31:40 +00:00
|
|
|
|
2020-04-27 09:04:07 +02:00
|
|
|
virtualisation.xen.trace = mkEnableOption "Xen tracing";
|
|
|
|
|
2010-09-12 22:43:45 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
###### implementation
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
2024-09-17 20:13:28 +00:00
|
|
|
assertions = [
|
|
|
|
{
|
|
|
|
assertion = pkgs.stdenv.isx86_64;
|
|
|
|
message = "Xen currently not supported on ${pkgs.stdenv.hostPlatform.system}";
|
|
|
|
}
|
|
|
|
{
|
|
|
|
assertion = config.boot.loader.grub.enable && (config.boot.loader.grub.efiSupport == false);
|
|
|
|
message = "Xen currently does not support EFI boot";
|
|
|
|
}
|
|
|
|
];
|
2010-09-12 22:43:45 +00:00
|
|
|
|
2017-03-23 23:22:29 +00:00
|
|
|
virtualisation.xen.package = mkDefault pkgs.xen;
|
2017-12-07 21:26:49 +00:00
|
|
|
virtualisation.xen.package-qemu = mkDefault pkgs.xen;
|
2017-03-03 17:46:57 +00:00
|
|
|
virtualisation.xen.stored = mkDefault "${cfg.package}/bin/oxenstored";
|
2015-03-05 12:46:50 +01:00
|
|
|
|
2017-03-03 17:46:57 +00:00
|
|
|
environment.systemPackages = [ cfg.package ];
|
2010-09-12 22:43:45 +00:00
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
boot.kernelModules = [
|
|
|
|
"xen-evtchn"
|
|
|
|
"xen-gntdev"
|
|
|
|
"xen-gntalloc"
|
|
|
|
"xen-blkback"
|
|
|
|
"xen-netback"
|
|
|
|
"xen-pciback"
|
|
|
|
"evtchn"
|
|
|
|
"gntdev"
|
|
|
|
"netbk"
|
|
|
|
"blkbk"
|
|
|
|
"xen-scsibk"
|
|
|
|
"usbbk"
|
|
|
|
"pciback"
|
|
|
|
"xen-acpi-processor"
|
|
|
|
"blktap2"
|
|
|
|
"tun"
|
|
|
|
"netxen_nic"
|
|
|
|
"xen_wdt"
|
|
|
|
"xen-acpi-processor"
|
|
|
|
"xen-privcmd"
|
|
|
|
"xen-scsiback"
|
|
|
|
"xenfs"
|
|
|
|
];
|
2010-09-14 11:22:50 +00:00
|
|
|
|
2015-07-15 12:19:38 +02:00
|
|
|
# The xenfs module is needed in system.activationScripts.xen, but
|
|
|
|
# the modprobe command there fails silently. Include xenfs in the
|
|
|
|
# initrd as a work around.
|
|
|
|
boot.initrd.kernelModules = [ "xenfs" ];
|
2015-01-29 09:58:28 +01:00
|
|
|
|
2010-09-12 22:43:45 +00:00
|
|
|
# The radeonfb kernel module causes the screen to go black as soon
|
|
|
|
# as it's loaded, so don't load it.
|
|
|
|
boot.blacklistedKernelModules = [ "radeonfb" ];
|
|
|
|
|
2010-12-06 09:54:08 +00:00
|
|
|
# Increase the number of loopback devices from the default (8),
|
|
|
|
# which is way too small because every VM virtual disk requires a
|
|
|
|
# loopback device.
|
2024-09-17 20:13:28 +00:00
|
|
|
boot.extraModprobeConfig = ''
|
|
|
|
options loop max_loop=64
|
|
|
|
'';
|
2010-12-06 09:54:08 +00:00
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
virtualisation.xen.bootParams =
|
|
|
|
[ ]
|
|
|
|
++ optionals cfg.trace [
|
|
|
|
"loglvl=all"
|
|
|
|
"guest_loglvl=all"
|
|
|
|
]
|
|
|
|
++ optional (cfg.domain0MemorySize != 0) "dom0_mem=${toString cfg.domain0MemorySize}M";
|
|
|
|
|
|
|
|
system.extraSystemBuilderCmds = ''
|
|
|
|
ln -s ${cfg.package}/boot/xen.gz $out/xen.gz
|
|
|
|
echo "${toString cfg.bootParams}" > $out/xen-params
|
|
|
|
'';
|
2010-09-12 22:43:45 +00:00
|
|
|
|
2010-09-12 22:56:54 +00:00
|
|
|
# Mount the /proc/xen pseudo-filesystem.
|
2024-09-17 20:13:28 +00:00
|
|
|
system.activationScripts.xen = ''
|
|
|
|
if [ -d /proc/xen ]; then
|
|
|
|
${pkgs.kmod}/bin/modprobe xenfs 2> /dev/null
|
|
|
|
${pkgs.util-linux}/bin/mountpoint -q /proc/xen || \
|
|
|
|
${pkgs.util-linux}/bin/mount -t xenfs none /proc/xen
|
|
|
|
fi
|
|
|
|
'';
|
2010-09-12 22:56:54 +00:00
|
|
|
|
2015-01-29 09:58:28 +01:00
|
|
|
# Domain 0 requires a pvops-enabled kernel.
|
2024-09-17 20:13:28 +00:00
|
|
|
system.requiredKernelConfig = with config.lib.kernelConfig; [
|
|
|
|
(isYes "XEN")
|
|
|
|
(isYes "X86_IO_APIC")
|
|
|
|
(isYes "ACPI")
|
|
|
|
(isYes "XEN_DOM0")
|
|
|
|
(isYes "PCI_XEN")
|
|
|
|
(isYes "XEN_DEV_EVTCHN")
|
|
|
|
(isYes "XENFS")
|
|
|
|
(isYes "XEN_COMPAT_XENFS")
|
|
|
|
(isYes "XEN_SYS_HYPERVISOR")
|
|
|
|
(isYes "XEN_GNTDEV")
|
|
|
|
(isYes "XEN_BACKEND")
|
|
|
|
(isModule "XEN_NETDEV_BACKEND")
|
|
|
|
(isModule "XEN_BLKDEV_BACKEND")
|
|
|
|
(isModule "XEN_PCIDEV_BACKEND")
|
|
|
|
(isYes "XEN_BALLOON")
|
|
|
|
(isYes "XEN_SCRUB_PAGES")
|
|
|
|
];
|
2010-09-14 11:58:06 +00:00
|
|
|
|
2010-09-16 15:24:46 +00:00
|
|
|
environment.etc =
|
2019-09-14 19:51:29 +02:00
|
|
|
{
|
|
|
|
"xen/xl.conf".source = "${cfg.package}/etc/xen/xl.conf";
|
|
|
|
"xen/scripts".source = "${cfg.package}/etc/xen/scripts";
|
|
|
|
"default/xendomains".text = ''
|
|
|
|
source ${cfg.package}/etc/default/xendomains
|
|
|
|
|
|
|
|
${cfg.domains.extraConfig}
|
|
|
|
'';
|
|
|
|
}
|
|
|
|
// optionalAttrs (builtins.compareVersions cfg.package.version "4.10" >= 0) {
|
2018-03-07 18:31:41 +01:00
|
|
|
# in V 4.10 oxenstored requires /etc/xen/oxenstored.conf to start
|
2019-09-14 19:51:29 +02:00
|
|
|
"xen/oxenstored.conf".source = "${cfg.package}/etc/xen/oxenstored.conf";
|
|
|
|
};
|
2010-09-16 15:24:46 +00:00
|
|
|
|
|
|
|
# Xen provides udev rules.
|
2017-03-03 17:46:57 +00:00
|
|
|
services.udev.packages = [ cfg.package ];
|
2010-09-16 15:24:46 +00:00
|
|
|
|
2024-09-17 20:13:28 +00:00
|
|
|
services.udev.path = [
|
|
|
|
pkgs.bridge-utils
|
|
|
|
pkgs.iproute2
|
|
|
|
];
|
2010-09-16 15:24:46 +00:00
|
|
|
|
2015-01-29 09:58:28 +01:00
|
|
|
systemd.services.xen-store = {
|
|
|
|
description = "Xen Store Daemon";
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
2024-09-17 20:13:28 +00:00
|
|
|
after = [
|
|
|
|
"network.target"
|
|
|
|
"xen-store.socket"
|
|
|
|
];
|
2015-01-29 09:58:28 +01:00
|
|
|
requires = [ "xen-store.socket" ];
|
|
|
|
preStart = ''
|
|
|
|
export XENSTORED_ROOTDIR="/var/lib/xenstored"
|
|
|
|
rm -f "$XENSTORED_ROOTDIR"/tdb* &>/dev/null
|
|
|
|
|
|
|
|
mkdir -p /var/run
|
2015-07-15 12:19:38 +02:00
|
|
|
mkdir -p /var/log/xen # Running xl requires /var/log/xen and /var/lib/xen,
|
|
|
|
mkdir -p /var/lib/xen # so we create them here unconditionally.
|
2015-01-29 09:58:28 +01:00
|
|
|
grep -q control_d /proc/xen/capabilities
|
2024-09-17 20:13:28 +00:00
|
|
|
'';
|
|
|
|
serviceConfig =
|
|
|
|
if (builtins.compareVersions cfg.package.version "4.8" < 0) then
|
|
|
|
{
|
|
|
|
ExecStart = ''
|
|
|
|
${cfg.stored}${optionalString cfg.trace " -T /var/log/xen/xenstored-trace.log"} --no-fork
|
2017-05-11 10:12:47 +00:00
|
|
|
'';
|
2024-09-17 20:13:28 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ExecStart = ''
|
|
|
|
${cfg.package}/etc/xen/scripts/launch-xenstore
|
2017-05-11 10:12:47 +00:00
|
|
|
'';
|
2024-09-17 20:13:28 +00:00
|
|
|
Type = "notify";
|
|
|
|
RemainAfterExit = true;
|
|
|
|
NotifyAccess = "all";
|
|
|
|
};
|
2015-01-29 09:58:28 +01:00
|
|
|
postStart = ''
|
2018-03-04 13:35:20 +01:00
|
|
|
${optionalString (builtins.compareVersions cfg.package.version "4.8" < 0) ''
|
2017-05-11 10:12:47 +00:00
|
|
|
time=0
|
|
|
|
timeout=30
|
|
|
|
# Wait for xenstored to actually come up, timing out after 30 seconds
|
|
|
|
while [ $time -lt $timeout ] && ! `${cfg.package}/bin/xenstore-read -s / >/dev/null 2>&1` ; do
|
|
|
|
time=$(($time+1))
|
|
|
|
sleep 1
|
|
|
|
done
|
|
|
|
|
|
|
|
# Exit if we timed out
|
|
|
|
if ! [ $time -lt $timeout ] ; then
|
|
|
|
echo "Could not start Xenstore Daemon"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
''}
|
|
|
|
echo "executing xen-init-dom0"
|
|
|
|
${cfg.package}/lib/xen/bin/xen-init-dom0
|
2024-09-17 20:13:28 +00:00
|
|
|
'';
|
2015-01-29 09:58:28 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
systemd.sockets.xen-store = {
|
|
|
|
description = "XenStore Socket for userspace API";
|
|
|
|
wantedBy = [ "sockets.target" ];
|
|
|
|
socketConfig = {
|
2024-09-17 20:13:28 +00:00
|
|
|
ListenStream = [
|
|
|
|
"/var/run/xenstored/socket"
|
|
|
|
"/var/run/xenstored/socket_ro"
|
|
|
|
];
|
2015-01-29 09:58:28 +01:00
|
|
|
SocketMode = "0660";
|
|
|
|
SocketUser = "root";
|
|
|
|
SocketGroup = "root";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
systemd.services.xen-console = {
|
|
|
|
description = "Xen Console Daemon";
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
after = [ "xen-store.service" ];
|
2017-05-11 10:12:47 +00:00
|
|
|
requires = [ "xen-store.service" ];
|
2015-01-29 09:58:28 +01:00
|
|
|
preStart = ''
|
|
|
|
mkdir -p /var/run/xen
|
|
|
|
${optionalString cfg.trace "mkdir -p /var/log/xen"}
|
|
|
|
grep -q control_d /proc/xen/capabilities
|
2024-09-17 20:13:28 +00:00
|
|
|
'';
|
2015-01-29 09:58:28 +01:00
|
|
|
serviceConfig = {
|
|
|
|
ExecStart = ''
|
2017-05-11 10:12:47 +00:00
|
|
|
${cfg.package}/bin/xenconsoled\
|
2018-03-04 13:35:20 +01:00
|
|
|
${optionalString ((builtins.compareVersions cfg.package.version "4.8" >= 0)) " -i"}\
|
2017-05-11 10:12:47 +00:00
|
|
|
${optionalString cfg.trace " --log=all --log-dir=/var/log/xen"}
|
2024-09-17 20:13:28 +00:00
|
|
|
'';
|
2015-01-29 09:58:28 +01:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
systemd.services.xen-qemu = {
|
|
|
|
description = "Xen Qemu Daemon";
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
after = [ "xen-console.service" ];
|
2017-05-11 10:12:47 +00:00
|
|
|
requires = [ "xen-store.service" ];
|
2015-01-29 09:58:28 +01:00
|
|
|
serviceConfig.ExecStart = ''
|
2017-12-07 21:26:49 +00:00
|
|
|
${cfg.package-qemu}/${cfg.package-qemu.qemu-system-i386} \
|
|
|
|
-xen-attach -xen-domid 0 -name dom0 -M xenpv \
|
2017-03-03 17:46:57 +00:00
|
|
|
-nographic -monitor /dev/null -serial /dev/null -parallel /dev/null
|
2024-09-17 20:13:28 +00:00
|
|
|
'';
|
2015-01-29 09:58:28 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
systemd.services.xen-watchdog = {
|
|
|
|
description = "Xen Watchdog Daemon";
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
2024-09-17 20:13:28 +00:00
|
|
|
after = [
|
|
|
|
"xen-qemu.service"
|
|
|
|
"xen-domains.service"
|
|
|
|
];
|
2017-03-03 17:46:57 +00:00
|
|
|
serviceConfig.ExecStart = "${cfg.package}/bin/xenwatchdogd 30 15";
|
2015-01-29 09:58:28 +01:00
|
|
|
serviceConfig.Type = "forking";
|
|
|
|
serviceConfig.RestartSec = "1";
|
|
|
|
serviceConfig.Restart = "on-failure";
|
|
|
|
};
|
|
|
|
|
|
|
|
systemd.services.xen-bridge = {
|
|
|
|
description = "Xen bridge";
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
before = [ "xen-domains.service" ];
|
2015-06-23 13:36:32 +02:00
|
|
|
preStart = ''
|
|
|
|
mkdir -p /var/run/xen
|
|
|
|
touch /var/run/xen/dnsmasq.pid
|
|
|
|
touch /var/run/xen/dnsmasq.etherfile
|
|
|
|
touch /var/run/xen/dnsmasq.leasefile
|
|
|
|
|
|
|
|
IFS='-' read -a data <<< `${pkgs.sipcalc}/bin/sipcalc ${cfg.bridge.address}/${toString cfg.bridge.prefixLength} | grep Usable\ range`
|
|
|
|
export XEN_BRIDGE_IP_RANGE_START="${"\${data[1]//[[:blank:]]/}"}"
|
|
|
|
export XEN_BRIDGE_IP_RANGE_END="${"\${data[2]//[[:blank:]]/}"}"
|
|
|
|
|
|
|
|
IFS='-' read -a data <<< `${pkgs.sipcalc}/bin/sipcalc ${cfg.bridge.address}/${toString cfg.bridge.prefixLength} | grep Network\ address`
|
|
|
|
export XEN_BRIDGE_NETWORK_ADDRESS="${"\${data[1]//[[:blank:]]/}"}"
|
|
|
|
|
2017-04-28 07:48:51 +00:00
|
|
|
IFS='-' read -a data <<< `${pkgs.sipcalc}/bin/sipcalc ${cfg.bridge.address}/${toString cfg.bridge.prefixLength} | grep Network\ mask`
|
|
|
|
export XEN_BRIDGE_NETMASK="${"\${data[1]//[[:blank:]]/}"}"
|
|
|
|
|
2015-06-23 13:36:32 +02:00
|
|
|
echo "${cfg.bridge.address} host gw dns" > /var/run/xen/dnsmasq.hostsfile
|
|
|
|
|
|
|
|
cat <<EOF > /var/run/xen/dnsmasq.conf
|
|
|
|
no-daemon
|
|
|
|
pid-file=/var/run/xen/dnsmasq.pid
|
|
|
|
interface=${cfg.bridge.name}
|
|
|
|
except-interface=lo
|
|
|
|
bind-interfaces
|
|
|
|
auth-zone=xen.local,$XEN_BRIDGE_NETWORK_ADDRESS/${toString cfg.bridge.prefixLength}
|
|
|
|
domain=xen.local
|
|
|
|
addn-hosts=/var/run/xen/dnsmasq.hostsfile
|
|
|
|
expand-hosts
|
|
|
|
strict-order
|
|
|
|
no-hosts
|
|
|
|
bogus-priv
|
2017-04-30 06:50:28 +00:00
|
|
|
${optionalString (!cfg.bridge.forwardDns) ''
|
|
|
|
no-resolv
|
|
|
|
no-poll
|
|
|
|
auth-server=dns.xen.local,${cfg.bridge.name}
|
|
|
|
''}
|
2015-06-23 13:36:32 +02:00
|
|
|
filterwin2k
|
|
|
|
clear-on-reload
|
|
|
|
domain-needed
|
|
|
|
dhcp-hostsfile=/var/run/xen/dnsmasq.etherfile
|
|
|
|
dhcp-authoritative
|
2016-10-26 16:26:01 +00:00
|
|
|
dhcp-range=$XEN_BRIDGE_IP_RANGE_START,$XEN_BRIDGE_IP_RANGE_END
|
2015-06-23 13:36:32 +02:00
|
|
|
dhcp-no-override
|
|
|
|
no-ping
|
|
|
|
dhcp-leasefile=/var/run/xen/dnsmasq.leasefile
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# DHCP
|
2016-10-25 07:27:05 +00:00
|
|
|
${pkgs.iptables}/bin/iptables -w -I INPUT -i ${cfg.bridge.name} -p tcp -s $XEN_BRIDGE_NETWORK_ADDRESS/${toString cfg.bridge.prefixLength} --sport 68 --dport 67 -j ACCEPT
|
|
|
|
${pkgs.iptables}/bin/iptables -w -I INPUT -i ${cfg.bridge.name} -p udp -s $XEN_BRIDGE_NETWORK_ADDRESS/${toString cfg.bridge.prefixLength} --sport 68 --dport 67 -j ACCEPT
|
2015-06-23 13:36:32 +02:00
|
|
|
# DNS
|
2016-10-25 07:27:05 +00:00
|
|
|
${pkgs.iptables}/bin/iptables -w -I INPUT -i ${cfg.bridge.name} -p tcp -d ${cfg.bridge.address} --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
|
|
|
|
${pkgs.iptables}/bin/iptables -w -I INPUT -i ${cfg.bridge.name} -p udp -d ${cfg.bridge.address} --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
|
2015-06-23 13:36:32 +02:00
|
|
|
|
|
|
|
${pkgs.bridge-utils}/bin/brctl addbr ${cfg.bridge.name}
|
|
|
|
${pkgs.inetutils}/bin/ifconfig ${cfg.bridge.name} ${cfg.bridge.address}
|
2017-04-28 07:48:51 +00:00
|
|
|
${pkgs.inetutils}/bin/ifconfig ${cfg.bridge.name} netmask $XEN_BRIDGE_NETMASK
|
2015-06-23 13:36:32 +02:00
|
|
|
${pkgs.inetutils}/bin/ifconfig ${cfg.bridge.name} up
|
|
|
|
'';
|
|
|
|
serviceConfig.ExecStart = "${pkgs.dnsmasq}/bin/dnsmasq --conf-file=/var/run/xen/dnsmasq.conf";
|
|
|
|
postStop = ''
|
2017-05-11 09:40:59 +00:00
|
|
|
IFS='-' read -a data <<< `${pkgs.sipcalc}/bin/sipcalc ${cfg.bridge.address}/${toString cfg.bridge.prefixLength} | grep Network\ address`
|
|
|
|
export XEN_BRIDGE_NETWORK_ADDRESS="${"\${data[1]//[[:blank:]]/}"}"
|
|
|
|
|
2015-06-23 13:36:32 +02:00
|
|
|
${pkgs.inetutils}/bin/ifconfig ${cfg.bridge.name} down
|
|
|
|
${pkgs.bridge-utils}/bin/brctl delbr ${cfg.bridge.name}
|
|
|
|
|
|
|
|
# DNS
|
2016-10-25 07:27:05 +00:00
|
|
|
${pkgs.iptables}/bin/iptables -w -D INPUT -i ${cfg.bridge.name} -p udp -d ${cfg.bridge.address} --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
|
|
|
|
${pkgs.iptables}/bin/iptables -w -D INPUT -i ${cfg.bridge.name} -p tcp -d ${cfg.bridge.address} --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
|
2015-06-23 13:36:32 +02:00
|
|
|
# DHCP
|
2017-05-11 09:40:59 +00:00
|
|
|
${pkgs.iptables}/bin/iptables -w -D INPUT -i ${cfg.bridge.name} -p udp -s $XEN_BRIDGE_NETWORK_ADDRESS/${toString cfg.bridge.prefixLength} --sport 68 --dport 67 -j ACCEPT
|
|
|
|
${pkgs.iptables}/bin/iptables -w -D INPUT -i ${cfg.bridge.name} -p tcp -s $XEN_BRIDGE_NETWORK_ADDRESS/${toString cfg.bridge.prefixLength} --sport 68 --dport 67 -j ACCEPT
|
2015-06-23 13:36:32 +02:00
|
|
|
'';
|
2015-01-29 09:58:28 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
systemd.services.xen-domains = {
|
|
|
|
description = "Xen domains - automatically starts, saves and restores Xen domains";
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
2024-09-17 20:13:28 +00:00
|
|
|
after = [
|
|
|
|
"xen-bridge.service"
|
|
|
|
"xen-qemu.service"
|
|
|
|
];
|
|
|
|
requires = [
|
|
|
|
"xen-bridge.service"
|
|
|
|
"xen-qemu.service"
|
|
|
|
];
|
2015-01-29 09:58:28 +01:00
|
|
|
## To prevent a race between dhcpcd and xend's bridge setup script
|
|
|
|
## (which renames eth* to peth* and recreates eth* as a virtual
|
|
|
|
## device), start dhcpcd after xend.
|
|
|
|
before = [ "dhcpd.service" ];
|
|
|
|
restartIfChanged = false;
|
|
|
|
serviceConfig.RemainAfterExit = "yes";
|
2024-09-17 20:13:28 +00:00
|
|
|
path = [
|
|
|
|
cfg.package
|
|
|
|
cfg.package-qemu
|
|
|
|
];
|
2017-03-03 17:46:57 +00:00
|
|
|
environment.XENDOM_CONFIG = "${cfg.package}/etc/sysconfig/xendomains";
|
2015-01-29 09:58:28 +01:00
|
|
|
preStart = "mkdir -p /var/lock/subsys -m 755";
|
2017-03-03 17:46:57 +00:00
|
|
|
serviceConfig.ExecStart = "${cfg.package}/etc/init.d/xendomains start";
|
|
|
|
serviceConfig.ExecStop = "${cfg.package}/etc/init.d/xendomains stop";
|
2015-01-29 09:58:28 +01:00
|
|
|
};
|
|
|
|
|
2010-09-12 22:43:45 +00:00
|
|
|
};
|
|
|
|
}
|