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

@@ -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/