358 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			358 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
| <!-- vim: set expandtab ts=2 softtabstop=2 shiftwidth=2 smarttab textwidth=80 wrapmargin=2 -->
 | ||
| <section
 | ||
|     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-installing-from-other-distro">
 | ||
|  <title>Installing from another Linux distribution</title>
 | ||
| 
 | ||
|  <para>
 | ||
|   Because Nix (the package manager) & Nixpkgs (the Nix packages collection)
 | ||
|   can both be installed on any (most?) Linux distributions, they can be used to
 | ||
|   install NixOS in various creative ways. You can, for instance:
 | ||
|  </para>
 | ||
| 
 | ||
|  <orderedlist>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Install NixOS on another partition, from your existing Linux distribution
 | ||
|     (without the use of a USB or optical device!)
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Install NixOS on the same partition (in place!), from your existing
 | ||
|     non-NixOS Linux distribution using <literal>NIXOS_LUSTRATE</literal>.
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Install NixOS on your hard drive from the Live CD of any Linux
 | ||
|     distribution.
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|  </orderedlist>
 | ||
| 
 | ||
|  <para>
 | ||
|   The first steps to all these are the same:
 | ||
|  </para>
 | ||
| 
 | ||
|  <orderedlist>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Install the Nix package manager:
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     Short version:
 | ||
|    </para>
 | ||
| <screen>
 | ||
| <prompt>$ </prompt>curl https://nixos.org/nix/install | sh
 | ||
| <prompt>$ </prompt>. $HOME/.nix-profile/etc/profile.d/nix.sh # …or open a fresh shell</screen>
 | ||
|    <para>
 | ||
|     More details in the
 | ||
|     <link
 | ||
|                     xlink:href="https://nixos.org/nix/manual/#chap-quick-start">
 | ||
|     Nix manual</link>
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Switch to the NixOS channel:
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     If you've just installed Nix on a non-NixOS distribution, you will be on
 | ||
|     the <literal>nixpkgs</literal> channel by default.
 | ||
|    </para>
 | ||
| <screen>
 | ||
| <prompt>$ </prompt>nix-channel --list
 | ||
| nixpkgs https://nixos.org/channels/nixpkgs-unstable</screen>
 | ||
|    <para>
 | ||
|     As that channel gets released without running the NixOS tests, it will be
 | ||
|     safer to use the <literal>nixos-*</literal> channels instead:
 | ||
|    </para>
 | ||
| <screen>
 | ||
| <prompt>$ </prompt>nix-channel --add https://nixos.org/channels/nixos-<replaceable>version</replaceable> nixpkgs</screen>
 | ||
|    <para>
 | ||
|     You may want to throw in a <literal>nix-channel --update</literal> for good
 | ||
|     measure.
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Install the NixOS installation tools:
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     You'll need <literal>nixos-generate-config</literal> and
 | ||
|     <literal>nixos-install</literal> and we'll throw in some man pages and
 | ||
|     <literal>nixos-enter</literal> just in case you want to chroot into your
 | ||
|     NixOS partition. They are installed by default on NixOS, but you don't have
 | ||
|     NixOS yet..
 | ||
|    </para>
 | ||
| <screen><prompt>$ </prompt>nix-env -iE "_: with import <nixpkgs/nixos> { configuration = {}; }; with config.system.build; [ nixos-generate-config nixos-install nixos-enter manual.manpages ]"</screen>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <note>
 | ||
|     <para>
 | ||
|      The following 5 steps are only for installing NixOS to another partition.
 | ||
|      For installing NixOS in place using <literal>NIXOS_LUSTRATE</literal>,
 | ||
|      skip ahead.
 | ||
|     </para>
 | ||
|    </note>
 | ||
|    <para>
 | ||
|     Prepare your target partition:
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     At this point it is time to prepare your target partition. Please refer to
 | ||
|     the partitioning, file-system creation, and mounting steps of
 | ||
|     <xref linkend="sec-installation" />
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     If you're about to install NixOS in place using
 | ||
|     <literal>NIXOS_LUSTRATE</literal> there is nothing to do for this step.
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Generate your NixOS configuration:
 | ||
|    </para>
 | ||
| <screen><prompt>$ </prompt>sudo `which nixos-generate-config` --root /mnt</screen>
 | ||
|    <para>
 | ||
|     You'll probably want to edit the configuration files. Refer to the
 | ||
|     <literal>nixos-generate-config</literal> step in
 | ||
|     <xref
 | ||
|                     linkend="sec-installation" /> for more
 | ||
|     information.
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     Consider setting up the NixOS bootloader to give you the ability to boot on
 | ||
|     your existing Linux partition. For instance, if you're using GRUB and your
 | ||
|     existing distribution is running Ubuntu, you may want to add something like
 | ||
|     this to your <literal>configuration.nix</literal>:
 | ||
|    </para>
 | ||
| <programlisting>
 | ||
| <xref linkend="opt-boot.loader.grub.extraEntries"/> = ''
 | ||
|   menuentry "Ubuntu" {
 | ||
|     search --set=ubuntu --fs-uuid 3cc3e652-0c1f-4800-8451-033754f68e6e
 | ||
|     configfile "($ubuntu)/boot/grub/grub.cfg"
 | ||
|   }
 | ||
| '';</programlisting>
 | ||
|    <para>
 | ||
|     (You can find the appropriate UUID for your partition in
 | ||
|     <literal>/dev/disk/by-uuid</literal>)
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Create the <literal>nixbld</literal> group and user on your original
 | ||
|     distribution:
 | ||
|    </para>
 | ||
| <screen>
 | ||
| <prompt>$ </prompt>sudo groupadd -g 30000 nixbld
 | ||
| <prompt>$ </prompt>sudo useradd -u 30000 -g nixbld -G nixbld nixbld</screen>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Download/build/install NixOS:
 | ||
|    </para>
 | ||
|    <warning>
 | ||
|     <para>
 | ||
|      Once you complete this step, you might no longer be able to boot on
 | ||
|      existing systems without the help of a rescue USB drive or similar.
 | ||
|     </para>
 | ||
|    </warning>
 | ||
| <screen><prompt>$ </prompt>sudo PATH="$PATH" NIX_PATH="$NIX_PATH" `which nixos-install` --root /mnt</screen>
 | ||
|    <para>
 | ||
|     Again, please refer to the <literal>nixos-install</literal> step in
 | ||
|     <xref linkend="sec-installation" /> for more information.
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     That should be it for installation to another partition!
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Optionally, you may want to clean up your non-NixOS distribution:
 | ||
|    </para>
 | ||
| <screen>
 | ||
| <prompt>$ </prompt>sudo userdel nixbld
 | ||
| <prompt>$ </prompt>sudo groupdel nixbld</screen>
 | ||
|    <para>
 | ||
|     If you do not wish to keep the Nix package manager installed either, run
 | ||
|     something like <literal>sudo rm -rv ~/.nix-* /nix</literal> and remove the
 | ||
|     line that the Nix installer added to your <literal>~/.profile</literal>.
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <note>
 | ||
|     <para>
 | ||
|      The following steps are only for installing NixOS in place using
 | ||
|      <literal>NIXOS_LUSTRATE</literal>:
 | ||
|     </para>
 | ||
|    </note>
 | ||
|    <para>
 | ||
|     Generate your NixOS configuration:
 | ||
|    </para>
 | ||
| <screen><prompt>$ </prompt>sudo `which nixos-generate-config` --root /</screen>
 | ||
|    <para>
 | ||
|     Note that this will place the generated configuration files in
 | ||
|     <literal>/etc/nixos</literal>. You'll probably want to edit the
 | ||
|     configuration files. Refer to the <literal>nixos-generate-config</literal>
 | ||
|     step in <xref
 | ||
|                     linkend="sec-installation" /> for more
 | ||
|     information.
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     You'll likely want to set a root password for your first boot using the
 | ||
|     configuration files because you won't have a chance to enter a password
 | ||
|     until after you reboot. You can initalize the root password to an empty one
 | ||
|     with this line: (and of course don't forget to set one once you've rebooted
 | ||
|     or to lock the account with <literal>sudo passwd -l root</literal> if you
 | ||
|     use <literal>sudo</literal>)
 | ||
|    </para>
 | ||
| <programlisting>
 | ||
| <link linkend="opt-users.users._name__.initialHashedPassword">users.users.root.initialHashedPassword</link> = "";
 | ||
| </programlisting>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Build the NixOS closure and install it in the <literal>system</literal>
 | ||
|     profile:
 | ||
|    </para>
 | ||
| <screen><prompt>$ </prompt>nix-env -p /nix/var/nix/profiles/system -f '<nixpkgs/nixos>' -I nixos-config=/etc/nixos/configuration.nix -iA system</screen>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Change ownership of the <literal>/nix</literal> tree to root (since your
 | ||
|     Nix install was probably single user):
 | ||
|    </para>
 | ||
| <screen><prompt>$ </prompt>sudo chown -R 0.0 /nix</screen>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Set up the <literal>/etc/NIXOS</literal> and
 | ||
|     <literal>/etc/NIXOS_LUSTRATE</literal> files:
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     <literal>/etc/NIXOS</literal> officializes that this is now a NixOS
 | ||
|     partition (the bootup scripts require its presence).
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     <literal>/etc/NIXOS_LUSTRATE</literal> tells the NixOS bootup scripts to
 | ||
|     move <emphasis>everything</emphasis> that's in the root partition to
 | ||
|     <literal>/old-root</literal>. This will move your existing distribution out
 | ||
|     of the way in the very early stages of the NixOS bootup. There are
 | ||
|     exceptions (we do need to keep NixOS there after all), so the NixOS
 | ||
|     lustrate process will not touch:
 | ||
|    </para>
 | ||
|    <itemizedlist>
 | ||
|     <listitem>
 | ||
|      <para>
 | ||
|       The <literal>/nix</literal> directory
 | ||
|      </para>
 | ||
|     </listitem>
 | ||
|     <listitem>
 | ||
|      <para>
 | ||
|       The <literal>/boot</literal> directory
 | ||
|      </para>
 | ||
|     </listitem>
 | ||
|     <listitem>
 | ||
|      <para>
 | ||
|       Any file or directory listed in <literal>/etc/NIXOS_LUSTRATE</literal>
 | ||
|       (one per line)
 | ||
|      </para>
 | ||
|     </listitem>
 | ||
|    </itemizedlist>
 | ||
|    <note>
 | ||
|     <para>
 | ||
|      Support for <literal>NIXOS_LUSTRATE</literal> was added in NixOS 16.09.
 | ||
|      The act of "lustrating" refers to the wiping of the existing distribution.
 | ||
|      Creating <literal>/etc/NIXOS_LUSTRATE</literal> can also be used on NixOS
 | ||
|      to remove all mutable files from your root partition (anything that's not
 | ||
|      in <literal>/nix</literal> or <literal>/boot</literal> gets "lustrated" on
 | ||
|      the next boot.
 | ||
|     </para>
 | ||
|     <para>
 | ||
|      lustrate /ˈlʌstreɪt/ verb.
 | ||
|     </para>
 | ||
|     <para>
 | ||
|      purify by expiatory sacrifice, ceremonial washing, or some other ritual
 | ||
|      action.
 | ||
|     </para>
 | ||
|    </note>
 | ||
|    <para>
 | ||
|     Let's create the files:
 | ||
|    </para>
 | ||
| <screen>
 | ||
| <prompt>$ </prompt>sudo touch /etc/NIXOS
 | ||
| <prompt>$ </prompt>sudo touch /etc/NIXOS_LUSTRATE
 | ||
| </screen>
 | ||
|    <para>
 | ||
|     Let's also make sure the NixOS configuration files are kept once we reboot
 | ||
|     on NixOS:
 | ||
|    </para>
 | ||
| <screen>
 | ||
| <prompt>$ </prompt>echo etc/nixos | sudo tee -a /etc/NIXOS_LUSTRATE
 | ||
| </screen>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     Finally, move the <literal>/boot</literal> directory of your current
 | ||
|     distribution out of the way (the lustrate process will take care of the
 | ||
|     rest once you reboot, but this one must be moved out now because NixOS
 | ||
|     needs to install its own boot files:
 | ||
|    </para>
 | ||
|    <warning>
 | ||
|     <para>
 | ||
|      Once you complete this step, your current distribution will no longer be
 | ||
|      bootable! If you didn't get all the NixOS configuration right, especially
 | ||
|      those settings pertaining to boot loading and root partition, NixOS may
 | ||
|      not be bootable either. Have a USB rescue device ready in case this
 | ||
|      happens.
 | ||
|     </para>
 | ||
|    </warning>
 | ||
| <screen>
 | ||
| <prompt>$ </prompt>sudo mv -v /boot /boot.bak &&
 | ||
| sudo /nix/var/nix/profiles/system/bin/switch-to-configuration boot
 | ||
| </screen>
 | ||
|    <para>
 | ||
|     Cross your fingers, reboot, hopefully you should get a NixOS prompt!
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     If for some reason you want to revert to the old distribution, you'll need
 | ||
|     to boot on a USB rescue disk and do something along these lines:
 | ||
|    </para>
 | ||
| <screen>
 | ||
| # mkdir root
 | ||
| # mount /dev/sdaX root
 | ||
| # mkdir root/nixos-root
 | ||
| # mv -v root/* root/nixos-root/
 | ||
| # mv -v root/nixos-root/old-root/* root/
 | ||
| # mv -v root/boot.bak root/boot  # We had renamed this by hand earlier
 | ||
| # umount root
 | ||
| # reboot</screen>
 | ||
|    <para>
 | ||
|     This may work as is or you might also need to reinstall the boot loader
 | ||
|    </para>
 | ||
|    <para>
 | ||
|     And of course, if you're happy with NixOS and no longer need the old
 | ||
|     distribution:
 | ||
|    </para>
 | ||
| <screen>sudo rm -rf /old-root</screen>
 | ||
|   </listitem>
 | ||
|   <listitem>
 | ||
|    <para>
 | ||
|     It's also worth noting that this whole process can be automated. This is
 | ||
|     especially useful for Cloud VMs, where provider do not provide NixOS. For
 | ||
|     instance,
 | ||
|     <link
 | ||
|                     xlink:href="https://github.com/elitak/nixos-infect">nixos-infect</link>
 | ||
|     uses the lustrate process to convert Digital Ocean droplets to NixOS from
 | ||
|     other distributions automatically.
 | ||
|    </para>
 | ||
|   </listitem>
 | ||
|  </orderedlist>
 | ||
| </section>
 | 
