git-subtree-dir: third_party/nix
git-subtree-mainline: cf8cd640c1
git-subtree-split: be66c7a6b24e3c3c6157fd37b86c7203d14acf10
		
	
			
		
			
				
	
	
		
			86 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
<chapter xmlns="http://docbook.org/ns/docbook"
 | 
						||
      xmlns:xlink="http://www.w3.org/1999/xlink"
 | 
						||
      xmlns:xi="http://www.w3.org/2001/XInclude"
 | 
						||
      version="5.0"
 | 
						||
      xml:id='sec-garbage-collection'>
 | 
						||
 | 
						||
<title>Garbage Collection</title>
 | 
						||
 | 
						||
<para><command>nix-env</command> operations such as upgrades
 | 
						||
(<option>-u</option>) and uninstall (<option>-e</option>) never
 | 
						||
actually delete packages from the system.  All they do (as shown
 | 
						||
above) is to create a new user environment that no longer contains
 | 
						||
symlinks to the “deleted” packages.</para>
 | 
						||
 | 
						||
<para>Of course, since disk space is not infinite, unused packages
 | 
						||
should be removed at some point.  You can do this by running the Nix
 | 
						||
garbage collector.  It will remove from the Nix store any package
 | 
						||
not used (directly or indirectly) by any generation of any
 | 
						||
profile.</para>
 | 
						||
 | 
						||
<para>Note however that as long as old generations reference a
 | 
						||
package, it will not be deleted.  After all, we wouldn’t be able to
 | 
						||
do a rollback otherwise.  So in order for garbage collection to be
 | 
						||
effective, you should also delete (some) old generations.  Of course,
 | 
						||
this should only be done if you are certain that you will not need to
 | 
						||
roll back.</para>
 | 
						||
 | 
						||
<para>To delete all old (non-current) generations of your current
 | 
						||
profile:
 | 
						||
 | 
						||
<screen>
 | 
						||
$ nix-env --delete-generations old</screen>
 | 
						||
 | 
						||
Instead of <literal>old</literal> you can also specify a list of
 | 
						||
generations, e.g.,
 | 
						||
 | 
						||
<screen>
 | 
						||
$ nix-env --delete-generations 10 11 14</screen>
 | 
						||
 | 
						||
To delete all generations older than a specified number of days
 | 
						||
(except the current generation), use the <literal>d</literal>
 | 
						||
suffix. For example,
 | 
						||
 | 
						||
<screen>
 | 
						||
$ nix-env --delete-generations 14d</screen>
 | 
						||
 | 
						||
deletes all generations older than two weeks.</para>
 | 
						||
 | 
						||
<para>After removing appropriate old generations you can run the
 | 
						||
garbage collector as follows:
 | 
						||
 | 
						||
<screen>
 | 
						||
$ nix-store --gc</screen>
 | 
						||
 | 
						||
The behaviour of the gargage collector is affected by the 
 | 
						||
<literal>keep-derivations</literal> (default: true) and <literal>keep-outputs</literal>
 | 
						||
(default: false) options in the Nix configuration file. The defaults will ensure
 | 
						||
that all derivations that are build-time dependencies of garbage collector roots
 | 
						||
will be kept and that all output paths that are runtime dependencies
 | 
						||
will be kept as well. All other derivations or paths will be collected. 
 | 
						||
(This is usually what you want, but while you are developing
 | 
						||
it may make sense to keep outputs to ensure that rebuild times are quick.)
 | 
						||
 | 
						||
If you are feeling uncertain, you can also first view what files would
 | 
						||
be deleted:
 | 
						||
 | 
						||
<screen>
 | 
						||
$ nix-store --gc --print-dead</screen>
 | 
						||
 | 
						||
Likewise, the option <option>--print-live</option> will show the paths
 | 
						||
that <emphasis>won’t</emphasis> be deleted.</para>
 | 
						||
 | 
						||
<para>There is also a convenient little utility
 | 
						||
<command>nix-collect-garbage</command>, which when invoked with the
 | 
						||
<option>-d</option> (<option>--delete-old</option>) switch deletes all
 | 
						||
old generations of all profiles in
 | 
						||
<filename>/nix/var/nix/profiles</filename>.  So
 | 
						||
 | 
						||
<screen>
 | 
						||
$ nix-collect-garbage -d</screen>
 | 
						||
 | 
						||
is a quick and easy way to clean up your system.</para>
 | 
						||
 | 
						||
<xi:include href="garbage-collector-roots.xml" />
 | 
						||
 | 
						||
</chapter>
 |