forked from DGNum/liminix
add levitate package
sets up a chroot system in tmpfs that will be executed on the next reboot to enable system maintenance without the regular filesystems mounted
This commit is contained in:
parent
3df34428d6
commit
5ba14fd915
2 changed files with 77 additions and 0 deletions
|
@ -102,4 +102,6 @@ in {
|
|||
fennel = callPackage ./fennel {};
|
||||
fennelrepl = callPackage ./fennelrepl {};
|
||||
anoia = callPackage ./anoia {};
|
||||
|
||||
levitate = callPackage ./levitate {};
|
||||
}
|
||||
|
|
75
pkgs/levitate/default.nix
Normal file
75
pkgs/levitate/default.nix
Normal file
|
@ -0,0 +1,75 @@
|
|||
{
|
||||
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
|
||||
''
|
Loading…
Reference in a new issue