76 lines
1.9 KiB
Nix
76 lines
1.9 KiB
Nix
|
{
|
||
|
writeScriptBin
|
||
|
, writeScript
|
||
|
, systemconfig
|
||
|
, execline
|
||
|
, lib
|
||
|
, services ? null
|
||
|
, liminix
|
||
|
, pseudofile
|
||
|
, pkgs
|
||
|
} :
|
||
|
let
|
||
|
inherit (pseudofile) dir symlink;
|
||
|
inherit (liminix.services) oneshot;
|
||
|
newRoot = "/run/maintenance";
|
||
|
sysconfig =
|
||
|
let
|
||
|
doChroot = writeScript "exec" ''
|
||
|
#!${execline}/bin/execlineb -P
|
||
|
cd ${newRoot}
|
||
|
foreground { mount --move ${newRoot} / }
|
||
|
redirfd -r 0 /dev/console
|
||
|
redirfd -w 1 /dev/console
|
||
|
fdmove -c 2 1
|
||
|
emptyenv chroot . /bin/init
|
||
|
'';
|
||
|
base = {...} : {
|
||
|
config = {
|
||
|
services = services // {
|
||
|
banner = oneshot {
|
||
|
name = "banner";
|
||
|
up = "cat /etc/banner > /dev/console";
|
||
|
down = "true";
|
||
|
};
|
||
|
};
|
||
|
|
||
|
filesystem = dir {
|
||
|
exec = symlink doChroot;
|
||
|
etc = dir {
|
||
|
banner = symlink (pkgs.writeText "banner" ''
|
||
|
|
||
|
LADIES AND GENTLEMEN WE ARE FLOATING IN SPACE
|
||
|
|
||
|
Most services are disabled. The system is operating
|
||
|
with a ram-based root filesystem, making it safe to
|
||
|
overwrite the flash devices in order to perform
|
||
|
upgrades and maintenance.
|
||
|
|
||
|
Don't forget to reboot when you have finished.
|
||
|
|
||
|
'');
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
eval = lib.evalModules {
|
||
|
modules = [
|
||
|
{ _module.args = { inherit pkgs; inherit (pkgs) lim; }; }
|
||
|
../../modules/base.nix
|
||
|
../../modules/users.nix
|
||
|
../../modules/busybox.nix
|
||
|
base
|
||
|
../../modules/s6
|
||
|
];
|
||
|
};
|
||
|
in systemconfig eval.config.filesystem.contents;
|
||
|
in writeScriptBin "levitate" ''
|
||
|
#!/bin/sh
|
||
|
destdir=${newRoot}
|
||
|
mkdir -p $destdir $destdir/nix/store
|
||
|
for path in $(cat ${sysconfig}/etc/nix-store-paths) ; do
|
||
|
(cd $destdir && cp -a $path .$path)
|
||
|
done
|
||
|
${sysconfig}/bin/activate $destdir
|
||
|
''
|