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; }; }
./modules/hardware.nix
./modules/base.nix
./modules/busybox.nix
./modules/hostname.nix
device.module
liminix-config

View file

@ -2,7 +2,7 @@
let
inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ;
inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs) busybox;
# inherit (pkgs) busybox;
inherit (pkgs.liminix.networking) address interface;
inherit (pkgs.liminix.services) bundle;
@ -46,7 +46,7 @@ in {
};
config = {
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 = {
lo =
@ -113,10 +113,6 @@ in {
};
filesystem = dir {
bin = dir {
sh = symlink "${busybox}/bin/sh";
busybox = symlink "${busybox}/bin/busybox";
};
dev =
let node = type: major: minor: mode : { inherit type major minor mode; };
in dir {
@ -129,7 +125,7 @@ in {
etc = dir {
profile = symlink
(pkgs.writeScript ".profile" ''
PATH=${lib.makeBinPath config.defaultProfile.packages}
PATH=${lib.makeBinPath config.defaultProfile.packages}:/bin
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 = {
file = ''
#!${execline}/bin/execlineb -P
${busybox}/bin/getty -l ${busybox}/bin/login 115200 /dev/console
/bin/getty -l /bin/login 115200 /dev/console
'';
mode = "0755";
};
@ -134,6 +134,7 @@ let
};
in {
config = {
programs.busybox.applets = [ "login" "getty" ];
filesystem = dir {
etc = dir {
s6-rc = dir {

View file

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

View file

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

View file

@ -1,6 +1,5 @@
{
liminix
, busybox
, writeAshScript
, serviceFns
} :
@ -43,7 +42,7 @@ let
'';
in longrun {
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;
dependencies = [ interface ] ++ dependencies;
}

View file

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

View file

@ -4,7 +4,6 @@
, writeScript
, stdenvNoCC
, lib
, busybox
, s6-rc
}:
let
@ -14,7 +13,7 @@ let
'';
init = writeScript "init" ''
#!${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 {
name = "s6-init-bin";

View file

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