summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorobadz <obadz-git@obadz.com>2016-07-24 14:45:24 +0100
committerobadz <obadz-git@obadz.com>2016-08-04 16:22:25 +0100
commit037d9c6cab17a5dc28ed01c6b96c74e55cee57bc (patch)
treee284b9452ed21d41982f39b916f7158972df0f30 /nixos
parent4eef7a4ecf28859c93b647d032e5ee5fe0731256 (diff)
downloadnixpkgs-037d9c6cab17a5dc28ed01c6b96c74e55cee57bc.tar
nixpkgs-037d9c6cab17a5dc28ed01c6b96c74e55cee57bc.tar.gz
nixpkgs-037d9c6cab17a5dc28ed01c6b96c74e55cee57bc.tar.bz2
nixpkgs-037d9c6cab17a5dc28ed01c6b96c74e55cee57bc.tar.lz
nixpkgs-037d9c6cab17a5dc28ed01c6b96c74e55cee57bc.tar.xz
nixpkgs-037d9c6cab17a5dc28ed01c6b96c74e55cee57bc.tar.zst
nixpkgs-037d9c6cab17a5dc28ed01c6b96c74e55cee57bc.zip
nixos-install: add options --closure, --no-channel-copy, --no-root-passwd, and --no-bootloader
Closes #17236

nix-build -A tests.installer.simple '<nixos/release.nix>' succeeds ✓
Diffstat (limited to 'nixos')
-rw-r--r--nixos/doc/manual/man-nixos-install.xml33
-rw-r--r--nixos/modules/installer/tools/nixos-install.sh33
2 files changed, 56 insertions, 10 deletions
diff --git a/nixos/doc/manual/man-nixos-install.xml b/nixos/doc/manual/man-nixos-install.xml
index 7ad1be1ec10..15c603256ca 100644
--- a/nixos/doc/manual/man-nixos-install.xml
+++ b/nixos/doc/manual/man-nixos-install.xml
@@ -26,6 +26,19 @@
       <replaceable>root</replaceable>
     </arg>
     <arg>
+      <arg choice='plain'><option>--closure</option></arg>
+      <replaceable>closure</replaceable>
+    </arg>
+    <arg>
+      <arg choice='plain'><option>--no-channel-copy</option></arg>
+    </arg>
+    <arg>
+      <arg choice='plain'><option>--no-root-passwd</option></arg>
+    </arg>
+    <arg>
+      <arg choice='plain'><option>--no-bootloader</option></arg>
+    </arg>
+    <arg>
       <group choice='req'>
         <arg choice='plain'><option>--max-jobs</option></arg>
         <arg choice='plain'><option>-j</option></arg>
@@ -71,12 +84,13 @@ the following steps:
   <filename>/mnt/etc/nixos/configuration.nix</filename>.</para></listitem>
 
   <listitem><para>It installs the GRUB boot loader on the device
-  specified in the option <option>boot.loader.grub.device</option>,
+  specified in the option <option>boot.loader.grub.device</option>
+  (unless <option>--no-bootloader</option> is specified),
   and generates a GRUB configuration file that boots into the NixOS
   configuration just installed.</para></listitem>
 
-  <listitem><para>It prompts you for a password for the root
-  account.</para></listitem>
+  <listitem><para>It prompts you for a password for the root account
+  (unless <option>--no-root-passwd</option> is specified).</para></listitem>
 
 </itemizedlist>
 
@@ -104,6 +118,19 @@ it.</para>
   </varlistentry>
 
   <varlistentry>
+    <term><option>--closure</option></term>
+    <listitem>
+      <para>If this option is provided, <command>nixos-install</command> will install the specified closure
+      rather than attempt to build one from <filename>/mnt/etc/nixos/configuration.nix</filename>.</para>
+
+      <para>The closure must be an appropriately configured NixOS system, with boot loader and partition
+      configuration that fits the target host. Such a closure is typically obtained with a command such as
+      <command>nix-build -I nixos-config=./configuration.nix '&lt;nixos&gt;' -A system --no-out-link</command>
+      </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry>
     <term><option>-I</option></term>
     <listitem>
       <para>Add a path to the Nix expression search path. This option may be given multiple times.
diff --git a/nixos/modules/installer/tools/nixos-install.sh b/nixos/modules/installer/tools/nixos-install.sh
index 7962be13787..ae9f3a89295 100644
--- a/nixos/modules/installer/tools/nixos-install.sh
+++ b/nixos/modules/installer/tools/nixos-install.sh
@@ -24,6 +24,7 @@ fi
 # Parse the command line for the -I flag
 extraBuildFlags=()
 chrootCommand=(/run/current-system/sw/bin/bash)
+bootLoader=1
 
 while [ "$#" -gt 0 ]; do
     i="$1"; shift 1
@@ -40,6 +41,18 @@ while [ "$#" -gt 0 ]; do
         --root)
             mountPoint="$1"; shift 1
             ;;
+        --closure)
+            closure="$1"; shift 1
+            ;;
+        --no-channel-copy)
+            noChannelCopy=1
+            ;;
+        --no-root-passwd)
+            noRootPasswd=1
+            ;;
+        --no-bootloader)
+            bootLoader=0
+            ;;
         --show-trace)
             extraBuildFlags+=("$i")
             ;;
@@ -111,7 +124,7 @@ if test -z "$NIXOS_CONFIG"; then
     NIXOS_CONFIG=/etc/nixos/configuration.nix
 fi
 
-if ! test -e "$mountPoint/$NIXOS_CONFIG"; then
+if [ ! -e "$mountPoint/$NIXOS_CONFIG" ] && [ -z "$closure" ]; then
     echo "configuration file $mountPoint/$NIXOS_CONFIG doesn't exist"
     exit 1
 fi
@@ -200,16 +213,22 @@ for i in /nix/var/nix/manifests/*.nixmanifest; do
 done
 
 
-# Get the absolute path to the NixOS/Nixpkgs sources.
-nixpkgs="$(readlink -f $(nix-instantiate --find-file nixpkgs))"
+if [ -z "$closure" ]; then
+    # Get the absolute path to the NixOS/Nixpkgs sources.
+    nixpkgs="$(readlink -f $(nix-instantiate --find-file nixpkgs))"
 
+    nixEnvAction="-f <nixpkgs/nixos> --set -A system"
+else
+    nixpkgs=""
+    nixEnvAction="--set $closure"
+fi
 
 # Build the specified Nix expression in the target store and install
 # it into the system configuration profile.
 echo "building the system configuration..."
 NIX_PATH="nixpkgs=/tmp/root/$nixpkgs:nixos-config=$NIXOS_CONFIG" NIXOS_CONFIG= \
     chroot $mountPoint @nix@/bin/nix-env \
-    "${extraBuildFlags[@]}" -p /nix/var/nix/profiles/system -f '<nixpkgs/nixos>' --set -A system
+    "${extraBuildFlags[@]}" -p /nix/var/nix/profiles/system $nixEnvAction
 
 
 # Copy the NixOS/Nixpkgs sources to the target as the initial contents
@@ -218,7 +237,7 @@ mkdir -m 0755 -p $mountPoint/nix/var/nix/profiles
 mkdir -m 1777 -p $mountPoint/nix/var/nix/profiles/per-user
 mkdir -m 0755 -p $mountPoint/nix/var/nix/profiles/per-user/root
 srcs=$(nix-env "${extraBuildFlags[@]}" -p /nix/var/nix/profiles/per-user/root/channels -q nixos --no-name --out-path 2>/dev/null || echo -n "")
-if test -n "$srcs"; then
+if [ -z "$noChannelCopy" ] && [ -n "$srcs" ]; then
     echo "copying NixOS/Nixpkgs sources..."
     chroot $mountPoint @nix@/bin/nix-env \
         "${extraBuildFlags[@]}" -p /nix/var/nix/profiles/per-user/root/channels -i "$srcs" --quiet
@@ -244,7 +263,7 @@ touch $mountPoint/etc/NIXOS
 # a menu default pointing at the kernel/initrd/etc of the new
 # configuration.
 echo "finalising the installation..."
-NIXOS_INSTALL_GRUB=1 chroot $mountPoint \
+NIXOS_INSTALL_GRUB="$bootLoader" chroot $mountPoint \
     /nix/var/nix/profiles/system/bin/switch-to-configuration boot
 
 
@@ -253,7 +272,7 @@ chroot $mountPoint /nix/var/nix/profiles/system/activate
 
 
 # Ask the user to set a root password.
-if [ "$(chroot $mountPoint /run/current-system/sw/bin/sh -l -c "nix-instantiate --eval '<nixpkgs/nixos>' -A config.users.mutableUsers")" = true ] && [ -t 0 ] ; then
+if [ -z "$noRootPasswd" ] && [ "$(chroot $mountPoint /run/current-system/sw/bin/sh -l -c "nix-instantiate --eval '<nixpkgs/nixos>' -A config.users.mutableUsers")" = true ] && [ -t 0 ] ; then
     echo "setting root password..."
     chroot $mountPoint /var/setuid-wrappers/passwd
 fi