2023-08-09 23:27:37 +02:00
|
|
|
## Base options
|
|
|
|
## ============
|
|
|
|
|
|
|
|
|
2022-09-27 17:17:55 +02:00
|
|
|
{ lib, pkgs, config, ...}:
|
2022-09-26 12:46:09 +02:00
|
|
|
let
|
|
|
|
inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ;
|
2022-09-26 19:27:43 +02:00
|
|
|
inherit (pkgs.pseudofile) dir symlink;
|
2023-03-07 23:02:24 +01:00
|
|
|
inherit (pkgs.liminix.networking) address interface;
|
|
|
|
inherit (pkgs.liminix.services) bundle;
|
2022-09-26 19:27:43 +02:00
|
|
|
|
2023-07-14 21:22:29 +02:00
|
|
|
type_service = pkgs.liminix.lib.types.service;
|
2022-09-26 12:46:09 +02:00
|
|
|
|
2022-09-25 12:22:15 +02:00
|
|
|
in {
|
|
|
|
options = {
|
2022-09-27 17:17:55 +02:00
|
|
|
# analogous to nixos systemPackages, but we don't symlink into
|
|
|
|
# /run/current-system, we just add the paths in /etc/profile
|
|
|
|
defaultProfile = {
|
|
|
|
packages = mkOption {
|
|
|
|
type = types.listOf types.package;
|
|
|
|
};
|
2022-09-25 12:22:15 +02:00
|
|
|
};
|
|
|
|
services = mkOption {
|
2022-09-26 12:46:09 +02:00
|
|
|
type = types.attrsOf type_service;
|
2022-09-25 12:22:15 +02:00
|
|
|
};
|
2022-09-27 17:33:58 +02:00
|
|
|
filesystem = mkOption { type = types.anything; };
|
2023-04-10 20:59:09 +02:00
|
|
|
rootfsType = mkOption {
|
|
|
|
default = "squashfs";
|
|
|
|
type = types.str;
|
|
|
|
};
|
2022-09-26 13:11:26 +02:00
|
|
|
kernel = {
|
2023-02-10 18:54:33 +01:00
|
|
|
src = mkOption { type = types.package; } ;
|
2023-07-16 17:55:50 +02:00
|
|
|
modular = mkOption {
|
2023-08-04 21:07:06 +02:00
|
|
|
type = types.bool;
|
2023-07-16 17:55:50 +02:00
|
|
|
default = true;
|
|
|
|
description = "support loadable kernel modules";
|
|
|
|
};
|
2023-02-10 18:54:33 +01:00
|
|
|
extraPatchPhase = mkOption {
|
|
|
|
default = "true";
|
|
|
|
type = types.lines;
|
|
|
|
} ;
|
2022-09-26 13:11:26 +02:00
|
|
|
config = mkOption {
|
|
|
|
# mostly the values are y n or m, but sometimes
|
|
|
|
# other strings are also used
|
|
|
|
type = types.attrsOf types.nonEmptyStr;
|
|
|
|
};
|
2022-09-25 12:22:15 +02:00
|
|
|
};
|
2023-02-18 16:13:19 +01:00
|
|
|
boot = {
|
|
|
|
commandLine = mkOption {
|
|
|
|
type = types.listOf types.nonEmptyStr;
|
|
|
|
default = [];
|
|
|
|
};
|
2023-03-18 15:45:51 +01:00
|
|
|
tftp = {
|
|
|
|
loadAddress = mkOption { type = types.str; };
|
|
|
|
# These names match the uboot environment variables. I reserve
|
|
|
|
# the right to change them if I think of better ones.
|
|
|
|
ipaddr = mkOption { type = types.str; };
|
|
|
|
serverip = mkOption { type = types.str; };
|
|
|
|
};
|
2023-02-10 19:20:01 +01:00
|
|
|
};
|
2022-09-25 12:22:15 +02:00
|
|
|
};
|
2022-09-26 21:45:00 +02:00
|
|
|
config = {
|
2022-09-27 17:17:55 +02:00
|
|
|
defaultProfile.packages = with pkgs;
|
2023-03-10 19:40:45 +01:00
|
|
|
[ s6 s6-init-bin execline s6-linux-init s6-rc ];
|
2022-09-28 22:31:15 +02:00
|
|
|
|
2023-03-07 23:02:24 +01:00
|
|
|
hardware.networkInterfaces = {
|
|
|
|
lo =
|
|
|
|
let iface = interface { type = "loopback"; device = "lo";};
|
|
|
|
in bundle {
|
|
|
|
name = "loopback";
|
|
|
|
contents = [
|
|
|
|
(address iface { family = "inet4"; address ="127.0.0.1"; prefixLength = 8;})
|
|
|
|
(address iface { family = "inet6"; address ="::1"; prefixLength = 128;})
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2022-10-05 22:50:10 +02:00
|
|
|
kernel = rec {
|
2023-07-16 17:55:50 +02:00
|
|
|
modular = true; # disabling this is not yet supported
|
2022-10-05 22:50:10 +02:00
|
|
|
config = {
|
|
|
|
IKCONFIG = "y";
|
|
|
|
IKCONFIG_PROC = "y";
|
|
|
|
PROC_FS = "y";
|
2022-10-09 10:55:30 +02:00
|
|
|
|
2023-03-19 10:49:32 +01:00
|
|
|
KEXEC = "y";
|
2023-07-16 17:55:50 +02:00
|
|
|
MODULES = if modular then "y" else "n";
|
|
|
|
MODULE_SIG = if modular then "y" else "n";
|
2023-02-22 19:20:56 +01:00
|
|
|
DEBUG_FS = "y";
|
2022-10-09 10:55:30 +02:00
|
|
|
|
2023-03-23 22:50:44 +01:00
|
|
|
MIPS_BOOTLOADER_CMDLINE_REQUIRE_COOKIE = "y";
|
|
|
|
MIPS_BOOTLOADER_CMDLINE_COOKIE = "\"liminix\"";
|
|
|
|
MIPS_CMDLINE_DTB_EXTEND = "y";
|
|
|
|
|
2022-10-18 23:28:07 +02:00
|
|
|
# basic networking protocols
|
|
|
|
NET = "y";
|
2022-10-18 16:48:37 +02:00
|
|
|
UNIX = "y";
|
2022-10-18 19:56:29 +02:00
|
|
|
INET = "y";
|
|
|
|
IPV6 = "y";
|
2022-10-18 23:28:07 +02:00
|
|
|
PACKET = "y"; # for ppp, tcpdump ...
|
|
|
|
SYSVIPC= "y";
|
2022-10-18 16:48:37 +02:00
|
|
|
|
2023-04-10 21:28:18 +02:00
|
|
|
# disabling this option causes the kernel to use an "empty"
|
|
|
|
# initramfs instead: it has a /dev/console node and not much
|
|
|
|
# else. Note that pid 1 is started *before* the root
|
|
|
|
# filesystem is mounted and it expects /dev/console to be
|
|
|
|
# present already
|
|
|
|
BLK_DEV_INITRD = lib.mkDefault "n"; # overriden by initramfs module
|
|
|
|
|
2022-10-07 01:21:04 +02:00
|
|
|
# s6-linux-init mounts this on /dev
|
|
|
|
DEVTMPFS = "y";
|
2022-10-08 00:26:24 +02:00
|
|
|
# some or all of these may be fix for "tmpfs: Unknown parameter 'mode'" error
|
|
|
|
TMPFS = "y";
|
|
|
|
TMPFS_POSIX_ACL = "y";
|
|
|
|
TMPFS_XATTR = "y";
|
2023-03-01 19:11:38 +01:00
|
|
|
|
|
|
|
FW_LOADER = "y";
|
|
|
|
FW_LOADER_COMPRESS = "y";
|
|
|
|
# We don't have a user helper, so we get multiple 60s pauses
|
|
|
|
# at boot time unless we disable trying to call it.
|
|
|
|
# https://lkml.org/lkml/2013/8/5/175
|
|
|
|
FW_LOADER_USER_HELPER = "n";
|
2022-10-05 22:50:10 +02:00
|
|
|
};
|
2022-10-02 11:03:17 +02:00
|
|
|
};
|
2022-10-07 01:21:04 +02:00
|
|
|
boot.commandLine = [
|
2023-04-10 20:59:09 +02:00
|
|
|
"console=ttyS0,115200 panic=10 oops=panic init=/bin/init loglevel=8"
|
2023-04-26 23:16:15 +02:00
|
|
|
"root=${config.hardware.rootDevice}"
|
2023-04-10 20:59:09 +02:00
|
|
|
"rootfstype=${config.rootfsType}"
|
2022-10-15 17:11:40 +02:00
|
|
|
"fw_devlink=off"
|
2022-10-07 01:21:04 +02:00
|
|
|
];
|
2022-09-28 22:31:15 +02:00
|
|
|
users.root = {
|
|
|
|
uid = 0; gid= 0; gecos = "Root of all evaluation";
|
2023-03-18 15:46:50 +01:00
|
|
|
dir = "/home/root/";
|
2023-03-04 01:24:48 +01:00
|
|
|
passwd = lib.mkDefault "";
|
2022-09-28 22:31:15 +02:00
|
|
|
shell = "/bin/sh";
|
|
|
|
};
|
2023-02-25 21:33:18 +01:00
|
|
|
groups = {
|
|
|
|
root = {
|
|
|
|
gid = 0; usernames = ["root"];
|
|
|
|
};
|
2023-02-25 23:53:06 +01:00
|
|
|
system = {
|
|
|
|
gid = 1; usernames = ["root"];
|
|
|
|
};
|
2022-09-28 22:31:15 +02:00
|
|
|
};
|
|
|
|
|
2022-09-27 17:33:58 +02:00
|
|
|
filesystem = dir {
|
2022-09-27 15:06:07 +02:00
|
|
|
dev =
|
|
|
|
let node = type: major: minor: mode : { inherit type major minor mode; };
|
|
|
|
in dir {
|
|
|
|
null = node "c" "1" "3" "0666";
|
|
|
|
zero = node "c" "1" "5" "0666";
|
|
|
|
tty = node "c" "5" "0" "0666";
|
|
|
|
console = node "c" "5" "1" "0600";
|
|
|
|
pts = dir {};
|
|
|
|
};
|
2023-05-21 18:08:32 +02:00
|
|
|
etc = let
|
2022-09-26 21:45:00 +02:00
|
|
|
profile = symlink
|
|
|
|
(pkgs.writeScript ".profile" ''
|
2023-05-21 18:08:32 +02:00
|
|
|
PATH=${lib.makeBinPath config.defaultProfile.packages}:/bin
|
2022-09-26 21:45:00 +02:00
|
|
|
export PATH
|
2023-05-21 18:08:32 +02:00
|
|
|
'');
|
|
|
|
in dir {
|
|
|
|
inherit profile;
|
|
|
|
ashrc = profile;
|
2022-09-26 21:45:00 +02:00
|
|
|
};
|
2023-05-21 18:08:32 +02:00
|
|
|
|
2022-09-27 15:06:07 +02:00
|
|
|
proc = dir {};
|
|
|
|
run = dir {};
|
|
|
|
sys = dir {};
|
2022-09-26 21:45:00 +02:00
|
|
|
};
|
|
|
|
};
|
2022-09-25 12:22:15 +02:00
|
|
|
}
|