Skip to content

Commit

Permalink
install-darwin: fix _nixbld uids for macOS sequoia
Browse files Browse the repository at this point in the history
Starting in macOS 15 Sequoia, macOS daemon UIDs are encroaching on our
default UIDs of 301-332. This commit relocates our range up to avoid
clashing with the current UIDs of 301-304 and buy us a little time
while still leaving headroom for people installing more than 32 users.

It also adds a migration script that can save people some heartache if
they discover and run it before installing the macOS update.
  • Loading branch information
abathur committed Jun 15, 2024
1 parent 573e385 commit dbdbd95
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 2 deletions.
2 changes: 1 addition & 1 deletion scripts/bigsur-nixbld-user-migration.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env bash

((NEW_NIX_FIRST_BUILD_UID=301))
((NEW_NIX_FIRST_BUILD_UID=331))

id_available(){
dscl . list /Users UniqueID | grep -E '\b'"$1"'\b' >/dev/null
Expand Down
2 changes: 1 addition & 1 deletion scripts/install-darwin-multi-user.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ set -eu
set -o pipefail

# System specific settings
export NIX_FIRST_BUILD_UID="${NIX_FIRST_BUILD_UID:-301}"
export NIX_FIRST_BUILD_UID="${NIX_FIRST_BUILD_UID:-331}"
export NIX_BUILD_USER_NAME_TEMPLATE="_nixbld%d"

readonly NIX_DAEMON_DEST=/Library/LaunchDaemons/org.nixos.nix-daemon.plist
Expand Down
36 changes: 36 additions & 0 deletions scripts/sequoia-nixbld-user-migration.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/usr/bin/env bash

((NEW_NIX_FIRST_BUILD_UID=331))

id_available(){
dscl . list /Users UniqueID | grep -E '\b'"$1"'\b' >/dev/null
}

change_nixbld_names_and_ids(){
local name uid next_id
((next_id=NEW_NIX_FIRST_BUILD_UID))
echo "Attempting to migrate _nixbld users."
echo "Each _nixbld# user should have its UID moved to $next_id+"
while read -r name uid; do
echo " Checking $name (uid: $uid)"
# iterate for a clean ID
while id_available "$next_id"; do
((next_id++))
if ((next_id >= 400)); then
echo "We've hit UID 400 without placing all of your users :("
echo "You should use the commands in this script as a starting"
echo "point to review your UID-space and manually move the"
echo "remaining users (or delete them, if you don't need them)."
exit 1
fi
done

# first 2 are cleanup, it's OK if they aren't here
sudo dscl . delete "/Users/$name" dsAttrTypeNative:_writers_passwd &>/dev/null || true
sudo dscl . change "/Users/$name" NFSHomeDirectory "/private/var/empty 1" "/var/empty" &>/dev/null || true
sudo dscl . change "/Users/$name" UniqueID "$uid" "$next_id"
echo " $name migrated to uid: $next_id"
done < <(dscl . list /Users UniqueID | grep _nixbld | sort -n -k2)
}

change_nixbld_names_and_ids

0 comments on commit dbdbd95

Please sign in to comment.