2
0
Files
liminix/modules/busybox.nix
T

232 lines
4.0 KiB
Nix
Raw Normal View History

2023-08-09 22:27:37 +01:00
## Busybox
## =======
##
## Busybox provides stripped-down versions of many usual
## Linux/Unix tools, and may be configured to include only
## the commands (termed "applets") required by the user or
## by other included modules.
2025-02-10 21:55:08 +00:00
{
lib,
pkgs,
config,
...
}:
2023-03-10 18:40:45 +00:00
let
2024-06-29 22:59:27 +01:00
inherit (lib) mkOption types mapAttrsToList;
2023-03-10 18:40:45 +00:00
inherit (pkgs.pseudofile) dir symlink;
inherit (lib.strings) toUpper;
2025-02-10 21:55:08 +00:00
attrs =
{ options, applets }:
2023-03-10 18:40:45 +00:00
let
2025-02-10 21:55:08 +00:00
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
{
2023-03-10 18:40:45 +00:00
enableMinimal = true;
extraConfig = ''
${extraOptions}
${appletOptions}
'';
};
cfg = config.programs.busybox;
2025-02-10 21:55:08 +00:00
busybox = pkgs.busybox.override (attrs {
inherit (cfg) applets options;
});
makeLinks = lib.attrsets.genAttrs cfg.applets (a: symlink "${busybox}/bin/busybox");
2023-03-10 18:40:45 +00:00
minimalApplets = [
2023-03-10 23:14:13 +00:00
# this is probably less minimal than it could be
2025-02-10 21:55:08 +00:00
"arch"
"ash"
"base64"
"basename"
"bc"
"brctl"
"bunzip2"
"bzcat"
"bzip2"
"cal"
"cat"
"chattr"
"chgrp"
"chmod"
"chown"
"chpst"
"chroot"
"clear"
"cmp"
"comm"
"cp"
"cpio"
"cut"
"date"
"dhcprelay"
"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"
"ipaddr"
"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"
"umount"
"uname"
"unexpand"
"uniq"
"unlink"
"unlzma"
"unxz"
"unzip"
"uptime"
"watch"
"wc"
"whoami"
"xargs"
"xxd"
"xz"
"xzcat"
"yes"
"zcat"
2023-03-10 18:40:45 +00:00
];
2025-02-10 21:55:08 +00:00
in
{
2023-03-10 18:40:45 +00:00
options = {
programs.busybox = {
2025-02-10 21:55:08 +00:00
applets = mkOption {
2023-03-10 18:40:45 +00:00
type = types.listOf types.str;
2023-08-09 22:27:37 +01:00
description = "Applets required";
2025-02-10 21:55:08 +00:00
default = [ ];
example = [
"sh"
"getty"
"login"
];
2023-03-10 18:40:45 +00:00
};
options = mkOption {
# mostly the values are y n or m, but sometimes
# other strings are also used
2023-08-09 22:27:37 +01:00
description = "Other busybox config flags that do not map directly to applet names (often prefixed FEATURE_)";
2023-03-10 18:40:45 +00:00
type = types.attrsOf types.nonEmptyStr;
2025-02-10 21:55:08 +00:00
default = { };
example = {
FEATURE_DD_IBS_OBS = "y";
};
2023-03-10 18:40:45 +00:00
};
};
};
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";
2023-06-30 10:17:33 +01:00
FEATURE_IPV6 = "y";
2023-03-10 18:40:45 +00:00
};
};
filesystem = dir {
2024-06-30 16:58:29 +01:00
bin = dir (
{
busybox = symlink "${busybox}/bin/busybox";
sh = symlink "${busybox}/bin/busybox";
}
// makeLinks
);
2023-03-10 18:40:45 +00:00
};
};
}