configurable busybox

allows modules to add to the busybox applets and change config
This commit is contained in:
Daniel Barlow 2023-03-10 18:40:45 +00:00
parent 8b2fcb5336
commit 225fc6fe51
10 changed files with 101 additions and 20 deletions

View file

@ -22,6 +22,7 @@ let
{ _module.args = { inherit pkgs; lib = pkgs.lib; }; } { _module.args = { inherit pkgs; lib = pkgs.lib; }; }
./modules/hardware.nix ./modules/hardware.nix
./modules/base.nix ./modules/base.nix
./modules/busybox.nix
./modules/hostname.nix ./modules/hostname.nix
device.module device.module
liminix-config liminix-config

View file

@ -2,7 +2,7 @@
let let
inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ; inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs) busybox; # inherit (pkgs) busybox;
inherit (pkgs.liminix.networking) address interface; inherit (pkgs.liminix.networking) address interface;
inherit (pkgs.liminix.services) bundle; inherit (pkgs.liminix.services) bundle;
@ -46,7 +46,7 @@ in {
}; };
config = { config = {
defaultProfile.packages = with pkgs; defaultProfile.packages = with pkgs;
[ s6 s6-init-bin busybox execline s6-linux-init s6-rc ]; [ s6 s6-init-bin execline s6-linux-init s6-rc ];
hardware.networkInterfaces = { hardware.networkInterfaces = {
lo = lo =
@ -113,10 +113,6 @@ in {
}; };
filesystem = dir { filesystem = dir {
bin = dir {
sh = symlink "${busybox}/bin/sh";
busybox = symlink "${busybox}/bin/busybox";
};
dev = dev =
let node = type: major: minor: mode : { inherit type major minor mode; }; let node = type: major: minor: mode : { inherit type major minor mode; };
in dir { in dir {
@ -129,7 +125,7 @@ in {
etc = dir { etc = dir {
profile = symlink profile = symlink
(pkgs.writeScript ".profile" '' (pkgs.writeScript ".profile" ''
PATH=${lib.makeBinPath config.defaultProfile.packages} PATH=${lib.makeBinPath config.defaultProfile.packages}:/bin
export PATH export PATH
''); '');
}; };

85
modules/busybox.nix Normal file
View file

@ -0,0 +1,85 @@
{ lib, pkgs, config, ...}:
let
inherit (lib) mkOption mkEnableOption types mapAttrsToList;
inherit (pkgs.pseudofile) dir symlink;
inherit (lib.strings) toUpper;
attrs = { options, applets } :
let
extraOptions = builtins.concatStringsSep "\n"
(mapAttrsToList (n: v: "CONFIG_${toUpper n} ${toString v}") options);
appletOptions = builtins.concatStringsSep "\n"
(map (n: "CONFIG_${toUpper n} y") applets);
in {
enableMinimal = true;
extraConfig = ''
${extraOptions}
${appletOptions}
'';
};
cfg = config.programs.busybox;
busybox = pkgs.busybox.override (attrs { inherit (cfg) applets options; });
makeLinks = lib.attrsets.genAttrs
cfg.applets
(a: symlink "${busybox}/bin/busybox");
minimalApplets = [
# this is probably less minimal than it could be "arch" "ash"
"base64" "basename" "bc" "brctl" "bunzip2"
"bzcat" "bzip2" "cal" "cat" "chattr" "chgrp" "chmod" "chown"
"chpst" "chroot" "clear" "cmp" "comm" "cp" "cpio" "cut" "date"
"dd" "df" "dirname" "dmesg" "du" "echo" "egrep" "env" "expand"
"expr" "false" "fdisk" "fgrep" "find" "free" "fuser" "grep"
"gunzip" "gzip" "head" "hexdump" "hostname" "hwclock" "ifconfig"
"ip" "iplink" "ipneigh" "iproute" "iprule" "kill" "killall"
"killall5" "less" "ln" "ls" "lsattr" "lsof" "md5sum" "mkdir"
"mknod" "mktemp" "mount" "mv" "nc" "netstat" "nohup" "od" "pgrep"
"pidof" "ping" "ping6" "pkill" "pmap" "printenv" "printf" "ps"
"pwd" "readlink" "realpath" "reset" "rm" "rmdir" "route" "sed"
"seq" "setsid" "sha1sum" "sha256sum" "sha512sum" "sleep" "sort"
"stat" "strings" "stty" "su" "sum" "swapoff" "swapon" "sync"
"tail" "tee" "test" "time" "touch" "tr" "traceroute"
"traceroute6" "true" "truncate" "tty" "udhcpc" "udhcpc6" "umount"
"uname" "unexpand" "uniq" "unlink" "unlzma" "unxz" "unzip"
"uptime" "watch" "wc" "whoami" "xargs" "xxd" "xz" "xzcat" "yes"
"zcat"
];
in {
options = {
programs.busybox = {
applets = mkOption {
type = types.listOf types.str;
default = [];
example = ["sh" "getty" "login"];
};
options = mkOption {
# mostly the values are y n or m, but sometimes
# other strings are also used
type = types.attrsOf types.nonEmptyStr;
default = { };
};
};
};
config = {
programs.busybox = {
applets = minimalApplets;
options = {
ASH_ECHO = "y";
# ASH_OPTIMIZE_FOR_SIZE = "y";
BASH_IS_NONE = "y";
SH_IS_ASH = "y";
ASH_BASH_COMPAT = "y";
FEATURE_EDITING = "y"; # readline-ish command editing
FEATURE_EDITING_HISTORY = "128";
FEATURE_EDITING_MAX_LEN = "1024";
FEATURE_TAB_COMPLETION = "y";
FEATURE_EDITING_WINCH = "y";
};
};
filesystem = dir {
bin = dir ({
busybox = symlink "${busybox}/bin/busybox";
sh = symlink "${busybox}/bin/busybox";
} // makeLinks);
};
};
}

View file

@ -73,7 +73,7 @@ let
run = { run = {
file = '' file = ''
#!${execline}/bin/execlineb -P #!${execline}/bin/execlineb -P
${busybox}/bin/getty -l ${busybox}/bin/login 115200 /dev/console /bin/getty -l /bin/login 115200 /dev/console
''; '';
mode = "0755"; mode = "0755";
}; };
@ -134,6 +134,7 @@ let
}; };
in { in {
config = { config = {
programs.busybox.applets = [ "login" "getty" ];
filesystem = dir { filesystem = dir {
etc = dir { etc = dir {
s6-rc = dir { s6-rc = dir {

View file

@ -2,7 +2,7 @@
let let
inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ; inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs) stdenv busybox wireless-regdb; inherit (pkgs) stdenv wireless-regdb;
regulatory = stdenv.mkDerivation { regulatory = stdenv.mkDerivation {
name = "regulatory.db"; name = "regulatory.db";
phases = ["installPhase"]; phases = ["installPhase"];
@ -20,6 +20,9 @@ in {
}; };
}; };
}; };
programs.busybox.applets = [
"insmod" "rmmod"
];
kernel = rec { kernel = rec {
config = { config = {
# Most of this is necessary infra to allow wireless stack/ # Most of this is necessary infra to allow wireless stack/

View file

@ -1,7 +1,6 @@
{ {
liminix liminix
, lib , lib
, busybox
, ppp , ppp
, pppoe , pppoe
, writeAshScript , writeAshScript

View file

@ -1,6 +1,5 @@
{ {
liminix liminix
, busybox
, writeAshScript , writeAshScript
, serviceFns , serviceFns
} : } :
@ -43,7 +42,7 @@ let
''; '';
in longrun { in longrun {
inherit name; inherit name;
run = "${busybox}/bin/udhcpc -f -i ${interface.device} -x hostname:$(cat /proc/sys/kernel/hostname) -s ${script}"; run = "/bin/udhcpc -f -i ${interface.device} -x hostname:$(cat /proc/sys/kernel/hostname) -s ${script}";
notification-fd = 10; notification-fd = 10;
dependencies = [ interface ] ++ dependencies; dependencies = [ interface ] ++ dependencies;
} }

View file

@ -3,7 +3,6 @@
, s6-rc , s6-rc
, s6 , s6
, lib , lib
, busybox
, callPackage , callPackage
, writeScript , writeScript
, serviceFns , serviceFns
@ -12,7 +11,7 @@ let
inherit (builtins) concatStringsSep; inherit (builtins) concatStringsSep;
output = service: name: "/run/service-state/${service.name}/${name}"; output = service: name: "/run/service-state/${service.name}/${name}";
serviceScript = commands : '' serviceScript = commands : ''
#!${busybox}/bin/sh #!/bin/sh
exec 2>&1 exec 2>&1
. ${serviceFns} . ${serviceFns}
${commands} ${commands}

View file

@ -4,7 +4,6 @@
, writeScript , writeScript
, stdenvNoCC , stdenvNoCC
, lib , lib
, busybox
, s6-rc , s6-rc
}: }:
let let
@ -14,7 +13,7 @@ let
''; '';
init = writeScript "init" '' init = writeScript "init" ''
#!${execline}/bin/execlineb -S0 #!${execline}/bin/execlineb -S0
${s6-linux-init}/bin/s6-linux-init -c /etc/s6-linux-init/current -m 0022 -p ${lib.makeBinPath [busybox execline s6-linux-init s6-rc]}:/usr/bin:/bin -d /dev -- "\$@" ${s6-linux-init}/bin/s6-linux-init -c /etc/s6-linux-init/current -m 0022 -p ${lib.makeBinPath [execline s6-linux-init s6-rc]}:/usr/bin:/bin -d /dev -- "\$@"
''; '';
in stdenvNoCC.mkDerivation { in stdenvNoCC.mkDerivation {
name = "s6-init-bin"; name = "s6-init-bin";

View file

@ -1,14 +1,13 @@
{ {
busybox writeScript
, writeScript
, lib , lib
} }
: name : { runtimeInputs ? [] } : text : writeScript name '' : name : { runtimeInputs ? [] } : text : writeScript name ''
#!${busybox}/bin/sh #!/bin/sh
set -o errexit set -o errexit
set -o nounset set -o nounset
set -o pipefail set -o pipefail
export PATH="${lib.makeBinPath ([ busybox ] ++ runtimeInputs)}:$PATH" export PATH="${lib.makeBinPath runtimeInputs}:$PATH"
${text} ${text}
'' ''