configurable busybox
allows modules to add to the busybox applets and change config
This commit is contained in:
parent
8b2fcb5336
commit
225fc6fe51
10 changed files with 101 additions and 20 deletions
|
@ -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
|
||||||
|
|
|
@ -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
85
modules/busybox.nix
Normal 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);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -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 {
|
||||||
|
|
|
@ -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/
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
{
|
{
|
||||||
liminix
|
liminix
|
||||||
, lib
|
, lib
|
||||||
, busybox
|
|
||||||
, ppp
|
, ppp
|
||||||
, pppoe
|
, pppoe
|
||||||
, writeAshScript
|
, writeAshScript
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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}
|
||||||
''
|
''
|
||||||
|
|
Loading…
Reference in a new issue