| 
									
										
										
										
											2014-08-24 19:18:18 +02:00
										 |  |  |  | <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-nix-gc"> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <title>Cleaning the Nix Store</title> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <para>Nix has a purely functional model, meaning that packages are | 
					
						
							|  |  |  |  | never upgraded in place.  Instead new versions of packages end up in a | 
					
						
							|  |  |  |  | different location in the Nix store (<filename>/nix/store</filename>). | 
					
						
							|  |  |  |  | You should periodically run Nix’s <emphasis>garbage | 
					
						
							|  |  |  |  | collector</emphasis> to remove old, unreferenced packages.  This is | 
					
						
							|  |  |  |  | easy: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <screen> | 
					
						
							|  |  |  |  | $ nix-collect-garbage | 
					
						
							|  |  |  |  | </screen> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Alternatively, you can use a systemd unit that does the same in the | 
					
						
							|  |  |  |  | background: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <screen> | 
					
						
							| 
									
										
										
										
											2016-06-01 16:23:32 +02:00
										 |  |  |  | # systemctl start nix-gc.service | 
					
						
							| 
									
										
										
										
											2014-08-24 19:18:18 +02:00
										 |  |  |  | </screen> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | You can tell NixOS in <filename>configuration.nix</filename> to run | 
					
						
							|  |  |  |  | this unit automatically at certain points in time, for instance, every | 
					
						
							|  |  |  |  | night at 03:15: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <programlisting> | 
					
						
							|  |  |  |  | nix.gc.automatic = true; | 
					
						
							|  |  |  |  | nix.gc.dates = "03:15"; | 
					
						
							|  |  |  |  | </programlisting> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | </para> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <para>The commands above do not remove garbage collector roots, such | 
					
						
							|  |  |  |  | as old system configurations.  Thus they do not remove the ability to | 
					
						
							|  |  |  |  | roll back to previous configurations.  The following command deletes | 
					
						
							|  |  |  |  | old roots, removing the ability to roll back to them: | 
					
						
							|  |  |  |  | <screen> | 
					
						
							|  |  |  |  | $ nix-collect-garbage -d | 
					
						
							|  |  |  |  | </screen> | 
					
						
							|  |  |  |  | You can also do this for specific profiles, e.g. | 
					
						
							|  |  |  |  | <screen> | 
					
						
							|  |  |  |  | $ nix-env -p /nix/var/nix/profiles/per-user/eelco/profile --delete-generations old | 
					
						
							|  |  |  |  | </screen> | 
					
						
							|  |  |  |  | Note that NixOS system configurations are stored in the profile | 
					
						
							|  |  |  |  | <filename>/nix/var/nix/profiles/system</filename>.</para> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <para>Another way to reclaim disk space (often as much as 40% of the | 
					
						
							|  |  |  |  | size of the Nix store) is to run Nix’s store optimiser, which seeks | 
					
						
							|  |  |  |  | out identical files in the store and replaces them with hard links to | 
					
						
							|  |  |  |  | a single copy. | 
					
						
							|  |  |  |  | <screen> | 
					
						
							|  |  |  |  | $ nix-store --optimise | 
					
						
							|  |  |  |  | </screen> | 
					
						
							|  |  |  |  | Since this command needs to read the entire Nix store, it can take | 
					
						
							|  |  |  |  | quite a while to finish.</para> | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 16:23:32 +02:00
										 |  |  |  | </chapter> |