forked from DGNum/liminix
5ba14fd915
sets up a chroot system in tmpfs that will be executed on the next reboot to enable system maintenance without the regular filesystems mounted
75 lines
1.9 KiB
Nix
75 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
|
|
''
|