2d42fc240c
In some cases, /dev/stderr may not point to a sensible location. For example, running nixos-enter inside a systemd unit where the unit's StandardOutput and StandardError are set to be sockets. In these cases, this line would fail. Piping to fd2 directly works just as well, even under strange and twisted executions. Co-authored-by: Michael Bishop <michael.bishop@iohk.io>
75 lines
1.8 KiB
Bash
75 lines
1.8 KiB
Bash
#! @shell@
|
|
|
|
set -e
|
|
|
|
# Re-exec ourselves in a private mount namespace so that our bind
|
|
# mounts get cleaned up automatically.
|
|
if [ -z "$NIXOS_ENTER_REEXEC" ]; then
|
|
export NIXOS_ENTER_REEXEC=1
|
|
if [ "$(id -u)" != 0 ]; then
|
|
extraFlags="-r"
|
|
fi
|
|
exec unshare --fork --mount --uts --mount-proc --pid $extraFlags -- "$0" "$@"
|
|
else
|
|
mount --make-rprivate /
|
|
fi
|
|
|
|
mountPoint=/mnt
|
|
system=/nix/var/nix/profiles/system
|
|
command=("$system/sw/bin/bash" "--login")
|
|
silent=0
|
|
|
|
while [ "$#" -gt 0 ]; do
|
|
i="$1"; shift 1
|
|
case "$i" in
|
|
--root)
|
|
mountPoint="$1"; shift 1
|
|
;;
|
|
--system)
|
|
system="$1"; shift 1
|
|
;;
|
|
--help)
|
|
exec man nixos-enter
|
|
exit 1
|
|
;;
|
|
--command|-c)
|
|
command=("$system/sw/bin/bash" "-c" "$1")
|
|
shift 1
|
|
;;
|
|
--silent)
|
|
silent=1
|
|
;;
|
|
--)
|
|
command=("$@")
|
|
break
|
|
;;
|
|
*)
|
|
echo "$0: unknown option \`$i'"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ ! -e $mountPoint/etc/NIXOS ]]; then
|
|
echo "$0: '$mountPoint' is not a NixOS installation" >&2
|
|
exit 126
|
|
fi
|
|
|
|
mkdir -p "$mountPoint/dev" "$mountPoint/sys"
|
|
chmod 0755 "$mountPoint/dev" "$mountPoint/sys"
|
|
mount --rbind /dev "$mountPoint/dev"
|
|
mount --rbind /sys "$mountPoint/sys"
|
|
|
|
(
|
|
# If silent, write both stdout and stderr of activation script to /dev/null
|
|
# otherwise, write both streams to stderr of this process
|
|
if [ "$silent" -eq 1 ]; then
|
|
exec 2>/dev/null
|
|
fi
|
|
|
|
# Run the activation script. Set $LOCALE_ARCHIVE to supress some Perl locale warnings.
|
|
LOCALE_ARCHIVE="$system/sw/lib/locale/locale-archive" chroot "$mountPoint" "$system/activate" 1>&2 || true
|
|
)
|
|
|
|
exec chroot "$mountPoint" "${command[@]}"
|