Storage optimization: Difference between revisions
imported>Petersjt014 added a bash alias demonstrating the utility of /nix/var/nix/gcroots |
imported>Petersjt014 note about noatime |
||
| Line 118: | Line 118: | ||
== Moving the store == | == Moving the store == | ||
{{ic|/nix}} can reside on another device. This is useful if your root device is very small, and that you have another, larger drive at hand. | {{ic|/nix}} can reside on another device. This is useful if your root device is very small, and that you have another, larger drive at hand. | ||
# Create a new | If the second mountpoint is on the same device, some benefit can still be gained by formatting the partition it points to with a different file system. For example: on a Raspberry Pi, f2fs could possibly be used for a gain in I/O throughput. | ||
Regardless of <code>/nix</code>'s filesystem, it can also be mounted with <code>noatime</code> (as seen in the example below). This will reduce metadata writes, improving I/O and the device's lifespan. | |||
This is easiest to set up while installing NixOS, but <code>/nix</code> can be moved on a live system: | |||
# Create a new partition and mount it over <code>/mnt</code> | |||
# <code>rsync -aAxv</code> everything from <code>/nix</code> to <code>/mnt</code> | # <code>rsync -aAxv</code> everything from <code>/nix</code> to <code>/mnt</code> | ||
# bind <code>/mnt</code> to <code>/nix</code> (e.g. using <code>mount</code>). | # bind <code>/mnt</code> to <code>/nix</code> (e.g. using <code>mount</code>). | ||
# Restart nix daemon with <code>systemctl restart nix-daemon.service </code> <code>systemctl restart nix-daemon.socket </code>. | # Restart nix daemon with <code>systemctl restart nix-daemon.service </code> <code>systemctl restart nix-daemon.socket </code>. | ||
# Rerun <code>nixos-rebuild switch</code> with something like <syntaxhighlight lang="bash">fileSystems."/nix" = { device = "/dev/disk/by-label/nix"; neededForBoot = true; options = [ "noatime" ]; };</syntaxhighlight> | # Rerun <code>nixos-rebuild switch</code> with something like <syntaxhighlight lang="bash">fileSystems."/nix" = { device = "/dev/disk/by-label/nix"; neededForBoot = true; options = [ "noatime" ]; };</syntaxhighlight> | ||
# reboot to be sure <code>/nix/store</code> is properly mounted. | # reboot to be sure <code>/nix/store</code> is properly mounted. | ||
# Once you are sure everything works, you can delete the old store doing a bind mount <code>/</code> to <code>/old_root</code>, and remove <code>/old_root/nix</code>. | # Once you are sure everything works, you can delete the old store doing a bind mount <code>/</code> to <code>/old_root</code>, and remove <code>/old_root/nix</code>. | ||
Keep in mind that all commands like <code>mount</code> and <code>bash</code> point to some executable in <code>/nix/store</code>, so never mount an empty disk over <code>/nix</code> or <code>/nix/store</code>, otherwise you will be locked out until reboot! | Keep in mind that all commands like <code>mount</code> and <code>bash</code> point to some executable in <code>/nix/store</code>, so never mount an empty disk over <code>/nix</code> or <code>/nix/store</code>, otherwise you will be locked out until reboot! | ||