summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 7ad1be1ec105..15c603256ca7 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 7962be137875..ae9f3a892950 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