nixos/stage-1: support bind mounts of files

On my system, / is tmpfs, and /etc/machine-id is bind mounted from
/persist.
This commit is contained in:
Alyssa Ross 2023-05-26 13:26:48 +00:00
parent f91ee3065d
commit a92bc576b1
No known key found for this signature in database
GPG key ID: F9DBED4859B271C0
2 changed files with 48 additions and 1 deletions

View file

@ -114,6 +114,28 @@ waitDevice() {
done
}
# Create the mount point if required.
makeMountPoint() {
local device="$1"
local mountPoint="$2"
local options="$3"
local IFS=,
# If we're bind mounting a file, the mount point should also be a file.
if ! [ -d "$device" ]; then
for opt in $options; do
if [ "$opt" = bind ] || [ "$opt" = rbind ]; then
mkdir -p "$(dirname "/mnt-root$mountPoint")"
touch "/mnt-root$mountPoint"
return
fi
done
fi
mkdir -m 0755 -p "/mnt-root$mountPoint"
}
# Mount special file systems.
specialMount() {
local device="$1"
@ -400,7 +422,7 @@ mountFS() {
info "mounting $device on $mountPoint..."
mkdir -p "/mnt-root$mountPoint"
makeMountPoint "$device" "$mountPoint" "$optionsPrefixed"
# For ZFS and CIFS mounts, retry a few times before giving up.
# We do this for ZFS as a workaround for issue NixOS/nixpkgs#25383.

View file

@ -6,6 +6,31 @@
with import ../lib/testing-python.nix { inherit system pkgs; };
with pkgs.lib;
{
bind = makeTest {
name = "non-default-filesystem-bind";
nodes.machine = { ... }: {
virtualisation.writableStore = false;
virtualisation.fileSystems."/test-bind-dir/bind" = {
device = "/";
neededForBoot = true;
options = [ "bind" ];
};
virtualisation.fileSystems."/test-bind-file/bind" = {
depends = [ "/nix/store" ];
device = builtins.toFile "empty" "";
neededForBoot = true;
options = [ "bind" ];
};
};
testScript = ''
machine.wait_for_unit("multi-user.target")
'';
};
btrfs = makeTest
{
name = "non-default-filesystems-btrfs";