Merge pull request #231283 from nikstur/filesystems-erofs
nixos/filesystems: init erofs
This commit is contained in:
commit
1ee11b8a31
|
@ -1374,6 +1374,7 @@
|
|||
./tasks/filesystems/cifs.nix
|
||||
./tasks/filesystems/ecryptfs.nix
|
||||
./tasks/filesystems/envfs.nix
|
||||
./tasks/filesystems/erofs.nix
|
||||
./tasks/filesystems/exfat.nix
|
||||
./tasks/filesystems/ext.nix
|
||||
./tasks/filesystems/f2fs.nix
|
||||
|
|
|
@ -293,6 +293,9 @@ checkFS() {
|
|||
# Skip fsck for inherently readonly filesystems.
|
||||
if [ "$fsType" = squashfs ]; then return 0; fi
|
||||
|
||||
# Skip fsck.erofs because it is still experimental.
|
||||
if [ "$fsType" = erofs ]; then return 0; fi
|
||||
|
||||
# If we couldn't figure out the FS type, then skip fsck.
|
||||
if [ "$fsType" = auto ]; then
|
||||
echo 'cannot check filesystem with type "auto"!'
|
||||
|
|
21
nixos/modules/tasks/filesystems/erofs.nix
Normal file
21
nixos/modules/tasks/filesystems/erofs.nix
Normal file
|
@ -0,0 +1,21 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
|
||||
inInitrd = lib.any (fs: fs == "erofs") config.boot.initrd.supportedFilesystems;
|
||||
inSystem = lib.any (fs: fs == "erofs") config.boot.supportedFilesystems;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
config = lib.mkIf (inInitrd || inSystem) {
|
||||
|
||||
system.fsPackages = [ pkgs.erofs-utils ];
|
||||
|
||||
boot.initrd.availableKernelModules = lib.mkIf inInitrd [ "erofs" ];
|
||||
|
||||
# fsck.erofs is currently experimental and should not be run as a
|
||||
# privileged user. Thus, it is not included in the initrd.
|
||||
|
||||
};
|
||||
}
|
|
@ -1,55 +1,106 @@
|
|||
import ./make-test-python.nix ({ lib, pkgs, ... }:
|
||||
{ system ? builtins.currentSystem
|
||||
, config ? { }
|
||||
, pkgs ? import ../.. { inherit system config; }
|
||||
}:
|
||||
|
||||
with import ../lib/testing-python.nix { inherit system pkgs; };
|
||||
with pkgs.lib;
|
||||
{
|
||||
name = "non-default-filesystems";
|
||||
|
||||
nodes.machine =
|
||||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
disk = config.virtualisation.rootDevice;
|
||||
in
|
||||
btrfs = makeTest
|
||||
{
|
||||
virtualisation.rootDevice = "/dev/vda";
|
||||
virtualisation.useDefaultFilesystems = false;
|
||||
name = "non-default-filesystems-btrfs";
|
||||
|
||||
boot.initrd.availableKernelModules = [ "btrfs" ];
|
||||
boot.supportedFilesystems = [ "btrfs" ];
|
||||
nodes.machine =
|
||||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
disk = config.virtualisation.rootDevice;
|
||||
in
|
||||
{
|
||||
virtualisation.rootDevice = "/dev/vda";
|
||||
virtualisation.useDefaultFilesystems = false;
|
||||
|
||||
boot.initrd.postDeviceCommands = ''
|
||||
FSTYPE=$(blkid -o value -s TYPE ${disk} || true)
|
||||
if test -z "$FSTYPE"; then
|
||||
modprobe btrfs
|
||||
${pkgs.btrfs-progs}/bin/mkfs.btrfs ${disk}
|
||||
boot.initrd.availableKernelModules = [ "btrfs" ];
|
||||
boot.supportedFilesystems = [ "btrfs" ];
|
||||
|
||||
mkdir /nixos
|
||||
mount -t btrfs ${disk} /nixos
|
||||
boot.initrd.postDeviceCommands = ''
|
||||
FSTYPE=$(blkid -o value -s TYPE ${disk} || true)
|
||||
if test -z "$FSTYPE"; then
|
||||
modprobe btrfs
|
||||
${pkgs.btrfs-progs}/bin/mkfs.btrfs ${disk}
|
||||
|
||||
${pkgs.btrfs-progs}/bin/btrfs subvolume create /nixos/root
|
||||
${pkgs.btrfs-progs}/bin/btrfs subvolume create /nixos/home
|
||||
mkdir /nixos
|
||||
mount -t btrfs ${disk} /nixos
|
||||
|
||||
umount /nixos
|
||||
fi
|
||||
${pkgs.btrfs-progs}/bin/btrfs subvolume create /nixos/root
|
||||
${pkgs.btrfs-progs}/bin/btrfs subvolume create /nixos/home
|
||||
|
||||
umount /nixos
|
||||
fi
|
||||
'';
|
||||
|
||||
virtualisation.fileSystems = {
|
||||
"/" = {
|
||||
device = disk;
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=/root" ];
|
||||
};
|
||||
|
||||
"/home" = {
|
||||
device = disk;
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=/home" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
|
||||
with subtest("BTRFS filesystems are mounted correctly"):
|
||||
machine.succeed("grep -E '/dev/vda / btrfs rw,relatime,space_cache=v2,subvolid=[0-9]+,subvol=/root 0 0' /proc/mounts")
|
||||
machine.succeed("grep -E '/dev/vda /home btrfs rw,relatime,space_cache=v2,subvolid=[0-9]+,subvol=/home 0 0' /proc/mounts")
|
||||
'';
|
||||
|
||||
virtualisation.fileSystems = {
|
||||
"/" = {
|
||||
device = disk;
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=/root" ];
|
||||
};
|
||||
|
||||
"/home" = {
|
||||
device = disk;
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=/home" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
erofs =
|
||||
let
|
||||
fsImage = "/tmp/non-default-filesystem.img";
|
||||
in
|
||||
makeTest {
|
||||
name = "non-default-filesystems-erofs";
|
||||
|
||||
with subtest("BTRFS filesystems are mounted correctly"):
|
||||
machine.succeed("grep -E '/dev/vda / btrfs rw,relatime,space_cache=v2,subvolid=[0-9]+,subvol=/root 0 0' /proc/mounts")
|
||||
machine.succeed("grep -E '/dev/vda /home btrfs rw,relatime,space_cache=v2,subvolid=[0-9]+,subvol=/home 0 0' /proc/mounts")
|
||||
'';
|
||||
})
|
||||
nodes.machine = _: {
|
||||
virtualisation.qemu.drives = [{
|
||||
name = "non-default-filesystem";
|
||||
file = fsImage;
|
||||
}];
|
||||
|
||||
virtualisation.fileSystems."/non-default" = {
|
||||
device = "/dev/vdb";
|
||||
fsType = "erofs";
|
||||
neededForBoot = true;
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
import subprocess
|
||||
import tempfile
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
with open(f"{tmp_dir}/filesystem", "w") as f:
|
||||
f.write("erofs")
|
||||
|
||||
subprocess.run([
|
||||
"${pkgs.erofs-utils}/bin/mkfs.erofs",
|
||||
"${fsImage}",
|
||||
tmp_dir,
|
||||
])
|
||||
|
||||
machine.start()
|
||||
machine.wait_for_unit("default.target")
|
||||
|
||||
file_contents = machine.succeed("cat /non-default/filesystem")
|
||||
assert "erofs" in file_contents
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue