diff options
author | obadz <obadz-git@obadz.com> | 2016-08-22 01:15:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-22 01:15:13 +0100 |
commit | 3d16af70bf894ce15ec9bdcad3c9ac736dc43630 (patch) | |
tree | 75f612c7c1128c02334769e63a1e631225531f9a /nixos/modules/system/boot/stage-1-init.sh | |
parent | 5120af001f2bb163b58c41c84b11a0c136a207fe (diff) | |
download | nixpkgs-3d16af70bf894ce15ec9bdcad3c9ac736dc43630.tar nixpkgs-3d16af70bf894ce15ec9bdcad3c9ac736dc43630.tar.gz nixpkgs-3d16af70bf894ce15ec9bdcad3c9ac736dc43630.tar.bz2 nixpkgs-3d16af70bf894ce15ec9bdcad3c9ac736dc43630.tar.lz nixpkgs-3d16af70bf894ce15ec9bdcad3c9ac736dc43630.tar.xz nixpkgs-3d16af70bf894ce15ec9bdcad3c9ac736dc43630.tar.zst nixpkgs-3d16af70bf894ce15ec9bdcad3c9ac736dc43630.zip |
nixos/stage-1: add mechanism which lustrates all impurities from / (#17784)
lustrate /ˈlʌstreɪt/ verb. purify by expiatory sacrifice, ceremonial washing, or some other ritual action. - sudo touch /etc/NIXOS_LUSTRATE ⇒ on next reboot, during stage 1, everything but /nix and /boot is moved to /old-root - echo "etc/passwd" | sudo tee -a /etc/NIXOS_LUSTRATE ⇒ on next reboot, during stage 1, everything but /nix and /boot is moved to /old-root; except /etc/passwd is copied back. Useful for installing NixOS in place on another distro. For instance: $ nix-env -iE '_: with import <nixpkgs/nixos> { configuration = {}; }; with config.system.build; [ nixos-generate-config manual.manpages ]' $ sudo mkdir /etc/nixos $ sudo `which nixos-generate-config` … edit the configuration files in /etc/nixos using man configuration.nix if needed maybe add: users.extraUsers.root.initialHashedPassword = "" ? … Build the entire NixOS system and link it to the system profile: $ nix-env -p /nix/var/nix/profiles/system -f '<nixpkgs/nixos>' -A system --set … If you were using a single user install: $ sudo chown -R 0.0 /nix … NixOS is about to take over $ sudo touch /etc/NIXOS $ sudo touch /etc/NIXOS_LUSTRATE … Let's keep the configuration files we just created $ echo etc/nixos | sudo tee -a /etc/NIXOS_LUSTRATE $ sudo mv -v /boot /boot.bak && sudo /nix/var/nix/profiles/system/bin/switch-to-configuration boot $ sudo reboot … NixOS boots, Stage 1 moves all the old distro stuff in /old-root.
Diffstat (limited to 'nixos/modules/system/boot/stage-1-init.sh')
-rw-r--r-- | nixos/modules/system/boot/stage-1-init.sh | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/nixos/modules/system/boot/stage-1-init.sh b/nixos/modules/system/boot/stage-1-init.sh index fbb32901f64..65d1dcb6168 100644 --- a/nixos/modules/system/boot/stage-1-init.sh +++ b/nixos/modules/system/boot/stage-1-init.sh @@ -312,8 +312,50 @@ mountFS() { echo "retrying..." n=$((n + 1)) done + + [ "$mountPoint" == "/" ] && + [ -f "/mnt-root/etc/NIXOS_LUSTRATE" ] && + lustrateRoot "/mnt-root" } +lustrateRoot () { + local root="$1" + + echo + echo -e "\e[1;33m<<< NixOS is now lustrating the root filesystem (cruft goes to /old-root) >>>\e[0m" + echo + + mkdir -m 0755 -p "$root/old-root.tmp" + + echo + echo "Moving impurities out of the way:" + for d in "$root"/* + do + [ "$d" == "$root/nix" ] && continue + [ "$d" == "$root/boot" ] && continue # Don't render the system unbootable + [ "$d" == "$root/old-root.tmp" ] && continue + + mv -v "$d" "$root/old-root.tmp" + done + + # Use .tmp to make sure subsequent invokations don't clash + mv -v "$root/old-root.tmp" "$root/old-root" + + mkdir -m 0755 -p "$root/etc" + touch "$root/etc/NIXOS" + + exec 4< "$root/old-root/etc/NIXOS_LUSTRATE" + + echo + echo "Restoring selected impurities:" + while read -u 4 keeper; do + dirname="$(dirname "$keeper")" + mkdir -m 0755 -p "$root/$dirname" + cp -av "$root/old-root/$keeper" "$root/$keeper" + done + + exec 4>&- +} # Function for waiting a device to appear. waitDevice() { |