diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-10-09T22·14+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-10-09T22·14+0000 |
commit | a8629de827e4d5a67372614727ce6fcc26423f8c (patch) | |
tree | bf1cffcf63a74e41ec48fb7e12918d57979fc763 /scripts/optimise-store.pl | |
parent | 27a0662828cb5ac9da198f35754750f12628d546 (diff) |
* New command `nix-store --optimise' to reduce Nix store disk space
usage by finding identical files in the store and hard-linking them to each other. It typically reduces the size of the store by something like 25-35%. This is what the optimise-store.pl script did, but the new command is faster and more correct (it's safe wrt garbage collection and concurrent builds).
Diffstat (limited to 'scripts/optimise-store.pl')
-rwxr-xr-x | scripts/optimise-store.pl | 91 |
1 files changed, 0 insertions, 91 deletions
diff --git a/scripts/optimise-store.pl b/scripts/optimise-store.pl deleted file mode 100755 index 41557e6d1889..000000000000 --- a/scripts/optimise-store.pl +++ /dev/null @@ -1,91 +0,0 @@ -#! /usr/bin/perl -w - -use strict; -use File::Basename; - - -my @paths = ("/nix/store"); - - -print "hashing...\n"; - -my $hashList = "/tmp/nix-optimise-hash-list"; - -system("find @paths -type f -print0 | xargs -0 md5sum -- > $hashList") == 0 - or die "cannot hash store files"; - - -print "sorting by hash...\n"; - -system("sort $hashList > $hashList.sorted") == 0 - or die "cannot sort list"; - - -sub atomicLink { - my $target = shift; - my $new = shift; - my $tmpNew = "${new}_optimise.$$"; - - # Make the directory writable temporarily. - my $dir = dirname $new; - my @st = stat $dir or die; - - chmod ($st[2] | 0200, $dir) or die "cannot make `$dir' writable: $!"; - - link $target, $tmpNew or die "cannot create hard link `$tmpNew': $!"; - - rename $tmpNew, $new or die "cannot rename `$tmpNew' to `$new': $!"; - - chmod ($st[2], $dir) or die "cannot restore permission on `$dir': $!"; - utime ($st[8], $st[9], $dir) or die "cannot restore timestamp on `$dir': $!"; -} - - -print "hard-linking...\n"; - -open LIST, "<$hashList.sorted" or die; - -my $prevFile; -my $prevHash; -my $prevInode; -my $prevExec; - -my $totalSpace = 0; -my $savedSpace = 0; - -while (<LIST>) { - /^([0-9a-f]*)\s+(.*)$/ or die; - my $curFile = $2; - my $curHash = $1; - - my @st = stat $curFile or die; - next if ($st[2] & 0222) != 0; # skip writable files - - my $fileSize = $st[7]; - $totalSpace += $fileSize; - my $isExec = ($st[2] & 0111) == 0111; - - if (defined $prevHash && $curHash eq $prevHash - && $prevExec == $isExec) - { - - if ($st[1] != $prevInode) { - print "$curFile = $prevFile\n"; - atomicLink $prevFile, $curFile; - $savedSpace += $fileSize; - } - - } else { - $prevFile = $curFile; - $prevHash = $curHash; - $prevInode = $st[1]; - $prevExec = ($st[2] & 0111) == 0111; - } -} - -print "total space = $totalSpace\n"; -print "saved space = $savedSpace\n"; -my $savings = ($savedSpace / $totalSpace) * 100.0; -print "savings = $savings %\n"; - -close LIST; |