Compare commits

...

3 Commits

Author SHA1 Message Date
Daniel Barlow 68ab6faeb3 write etc/nix-store-paths in systemConfiguration 2023-05-19 23:57:50 +01:00
Daniel Barlow 00aeb81811 min-list-garbage: check all store paths against file
this is step 1 of min-collect-garbage, no point implementing
deletion ourselves when rm -r exists

(arguably no point in implementing any of it, but this is the bit we
can't do efficiently in bourne shell - it means we're reading the
store-paths list once instead of grepping it afresh for every entry in
/nix/store/)
2023-05-19 23:49:11 +01:00
Daniel Barlow a809c28dde liminix-rebuild source /etc/profile to get PATH for reboot 2023-05-18 22:43:08 +01:00
5 changed files with 94 additions and 12 deletions

View File

@ -5,7 +5,6 @@
, ...
}:
let
inherit (pkgs) closureInfo;
inherit (lib) mkIf;
in
{
@ -36,11 +35,7 @@ in
mkdir -p $TMPDIR/empty/nix/store/
cp ${systemConfiguration}/bin/activate $TMPDIR/empty/activate
ln -s ${pkgs.s6-init-bin}/bin/init $TMPDIR/empty/init
pkgClosure=${closureInfo {
rootPaths = [ systemConfiguration ];
}}
cp $pkgClosure/registration nix-path-registration
grafts=$(sed < $pkgClosure/store-paths 's/^\(.*\)$/--graft \1:\1/g')
grafts=$(sed < ${systemConfiguration}/etc/nix-store-paths 's/^\(.*\)$/--graft \1:\1/g')
mkfs.jffs2 --compression-mode=size ${endian} -e ${config.hardware.flash.eraseBlockSize} --enable-compressor=lzo --pad --root $TMPDIR/empty --output $out $grafts --squash --faketime
'';
};

View File

@ -8,9 +8,13 @@
buildInputs = [ ];
propagatedBuildInputs = [ cpio openssh nix ];
src = ./.;
makeFlags = [ "min-list-garbage" ];
installPhase = ''
mkdir -p $out/bin
cp min-copy-closure.sh $out/bin/min-copy-closure
cp liminix-rebuild.sh $out/bin/liminix-rebuild
for i in min-copy-closure liminix-rebuild; do
echo $i
cp ''${i}.sh $out/bin/$i
done
cp min-list-garbage $out/bin
'';
}

View File

@ -12,4 +12,4 @@ fi
toplevel=$(nix-build "$@" -A outputs.systemConfiguration --no-out-link)
min-copy-closure $target_host $toplevel
$ssh_command $target_host cp -v -fP $toplevel/bin/* /persist
$ssh_command $target_host "sync; reboot"
$ssh_command $target_host "sync; source /etc/profile; reboot"

View File

@ -0,0 +1,79 @@
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
typedef char hash_t[32];
hash_t *hash_list = NULL;
int hash_list_entries = 0;
int hash_list_size = 0;
int add_list_entry(char *name)
{
name += strlen("/nix/store/");
if(hash_list_entries >= hash_list_size) {
if(hash_list_size == 0) hash_list_size = 4;
hash_list_size = hash_list_size * 2;
hash_list = realloc(hash_list, hash_list_size * sizeof(hash_t));
}
strncpy(hash_list[hash_list_entries++], name, 32);
printf("%d %d\n", hash_list_entries, hash_list_size);
}
int read_list(char *filename)
{
char s[1024];
FILE *fp;
if(fp = fopen(filename, "r")) {
while(fgets(s, 1024, fp)) {
if(strrchr(s, '\n')) {
add_list_entry(s);
} else {
puts("hash list entry too long");
exit(1);
}
}
}
fclose(fp);
}
int on_list(char *name)
{
int i;
for(i = 0; i < hash_list_entries; i++) {
if(!strncmp(hash_list[i], name, 32)) {
return 1;
}
}
return 0;
}
int main(int argc, char * argv[])
{
struct dirent * de;
DIR * dirp;
char hash[32];
if(argc < 2) {
puts("Usage: min-list-garbage store-paths-file\n\nChecks all store paths against the list of expected paths in store-paths-file,\n and prints any which are present unexpectedly");
exit(1);
}
read_list(argv[1]);
if((dirp = opendir("/nix/store")) == NULL) {
puts("can't open /nix/store");
exit(1);
}
while(de = readdir(dirp)) {
if(strlen(de->d_name) >= 32) {
strncpy(hash, de->d_name, 32);
if(!on_list(hash)) puts(de->d_name);
}
}
closedir(dirp);
}

View File

@ -8,6 +8,7 @@
writeText
, lib
, s6-init-bin
, closureInfo
, stdenv
}:
let
@ -61,7 +62,8 @@ let
}
'';
in attrset:
stdenv.mkDerivation {
let makedevs = activateScript attrset;
in stdenv.mkDerivation {
name="make-stuff";
src = ./.;
@ -69,11 +71,13 @@ in attrset:
LDFLAGS = "-static";
postConfigure = ''
cp ${activateScript attrset} makedevs.c
cp ${makedevs} makedevs.c
'';
makeFlags = ["makedevs"];
installPhase = ''
mkdir -p $out/bin
closure=${closureInfo { rootPaths = [ makedevs ]; }}
mkdir -p $out/bin $out/etc
cp $closure/store-paths $out/etc/nix-store-paths
$STRIP --remove-section=.note --remove-section=.comment --strip-all makedevs -o $out/bin/activate
ln -s ${s6-init-bin}/bin/init $out/bin/init
'';