Skip to content

Instantly share code, notes, and snippets.

@phryneas
Last active August 6, 2018 21:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phryneas/7ef5eb97e35d973eb1e7c2a8c9590153 to your computer and use it in GitHub Desktop.
Save phryneas/7ef5eb97e35d973eb1e7c2a8c9590153 to your computer and use it in GitHub Desktop.
{ config, pkgs, ... }:
{
imports =
[
./hardware-configuration.nix
# use zfs from current master instead of nixos bundled versoin
./zfs-master.nix
];
boot.loader.grub.enable = true;
boot.loader.grub.version = 2;
services.openssh = {
enable = true;
passwordAuthentication = false;
};
users.users.root.openssh.authorizedKeys.keys = [
# "ssh-rsa your-key-here"
];
system.stateVersion = "18.03";
}
# Do not modify this file! It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, ... }:
{
imports =
[ <nixpkgs/nixos/modules/profiles/qemu-guest.nix>
];
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "virtio_pci" "sd_mod" "sr_mod" ];
boot.kernelModules = [ ];
boot.extraModulePackages = [ ];
boot.supportedFilesystems = [ "zfs" ];
boot.zfs.enableUnstable = true;
boot.loader.grub.devices = [ "/dev/sda" ];
networking.hostId = "5afef035";
fileSystems."/" =
{ device = "rpool/crypt/root";
fsType = "zfs";
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/ed0a67c6-ec57-45bf-a6c1-a4aaac872ac3";
fsType = "ext4";
};
fileSystems."/home" =
{ device = "rpool/crypt/home";
fsType = "zfs";
};
fileSystems."/tmp" =
{ device = "rpool/crypt/tmp";
fsType = "zfs";
};
fileSystems."/var/lib" =
{ device = "rpool/crypt/var-lib";
fsType = "zfs";
};
swapDevices = [ ];
nix.maxJobs = lib.mkDefault 1;
}
{ pkgs, options, lib, config, ... }:
with pkgs;
{
boot.kernelPackages = pkgs.linuxPackages.extend (self: super: rec {
splUnstable = stdenv.mkDerivation {
name = "spl-dummy";
unpackPhase = ":";
installPhase = "mkdir $out; touch $out/dummy";
};
zfsUnstable = (self.callPackage ./zfs.nix {}).common rec {
# comment/uncomment if breaking kernel versions are known
incompatibleKernelVersion = null;
# this package should point to a version / git revision compatible with the latest kernel release
version = "2018-05-22";
rev = "3d503a76e890d7711d5e906e025e092d0e244211";
sha256 = "0a7i8klky1965rsxv4lyzblxlilgbcaamyavxwxmxj2ryaayj740";
isUnstable = true;
extraPatches = [
./zfs.patch
];
spl = splUnstable;
};
});
}
{ stdenv, fetchFromGitHub, autoreconfHook, utillinux, nukeReferences, coreutils
, perl, fetchpatch
, configFile ? "all"
# Userspace dependencies
, zlib, libuuid, python, attr, openssl
, nfs-utils
# Kernel dependencies
, kernel ? null, spl ? null, splUnstable ? null, splLegacyCrypto ? null
}:
with stdenv.lib;
let
buildKernel = any (n: n == configFile) [ "kernel" "all" ];
buildUser = any (n: n == configFile) [ "user" "all" ];
common = { version
, sha256
, extraPatches
, spl
, rev ? "zfs-${version}"
, isUnstable ? false
, isLegacyCrypto ? false
, incompatibleKernelVersion ? null } @ args:
if buildKernel &&
(incompatibleKernelVersion != null) &&
versionAtLeast kernel.version incompatibleKernelVersion then
throw ''
Linux v${kernel.version} is not yet supported by zfsonlinux v${version}.
${stdenv.lib.optionalString (!isUnstable) "Try zfsUnstable or set the NixOS option boot.zfs.enableUnstable."}
''
else stdenv.mkDerivation rec {
name = "zfs-${configFile}-${version}${optionalString buildKernel "-${kernel.version}"}";
src = fetchFromGitHub {
owner = "zfsonlinux";
repo = "zfs";
inherit rev sha256;
};
patches = extraPatches;
postPatch = optionalString buildKernel ''
patchShebangs scripts
'';
nativeBuildInputs = [ autoreconfHook nukeReferences ]
++ optional buildKernel (kernel.moduleBuildDependencies ++ [ perl ]);
buildInputs =
optionals buildKernel [ spl ]
++ optionals buildUser [ zlib libuuid python attr ]
++ optionals (buildUser && (isUnstable || isLegacyCrypto)) [ openssl ];
# for zdb to get the rpath to libgcc_s, needed for pthread_cancel to work
NIX_CFLAGS_LINK = "-lgcc_s";
hardeningDisable = [ "fortify" "stackprotector" "pic" ];
preConfigure = ''
substituteInPlace ./module/zfs/zfs_ctldir.c --replace "umount -t zfs" "${utillinux}/bin/umount -t zfs"
substituteInPlace ./module/zfs/zfs_ctldir.c --replace "mount -t zfs" "${utillinux}/bin/mount -t zfs"
substituteInPlace ./lib/libzfs/libzfs_mount.c --replace "/bin/umount" "${utillinux}/bin/umount"
substituteInPlace ./lib/libzfs/libzfs_mount.c --replace "/bin/mount" "${utillinux}/bin/mount"
substituteInPlace ./lib/libshare/nfs.c --replace "/usr/sbin/exportfs" "${nfs-utils}/bin/exportfs"
substituteInPlace ./cmd/ztest/ztest.c --replace "/usr/sbin/ztest" "$out/sbin/ztest"
substituteInPlace ./cmd/ztest/ztest.c --replace "/usr/sbin/zdb" "$out/sbin/zdb"
substituteInPlace ./config/user-systemd.m4 --replace "/usr/lib/modules-load.d" "$out/etc/modules-load.d"
substituteInPlace ./config/zfs-build.m4 --replace "\$sysconfdir/init.d" "$out/etc/init.d"
substituteInPlace ./etc/zfs/Makefile.am --replace "\$(sysconfdir)" "$out/etc"
substituteInPlace ./cmd/zed/Makefile.am --replace "\$(sysconfdir)" "$out/etc"
substituteInPlace ./module/Makefile.in --replace "/bin/cp" "cp"
substituteInPlace ./etc/systemd/system/zfs-share.service.in \
--replace "/bin/rm " "${coreutils}/bin/rm "
for f in ./udev/rules.d/*
do
substituteInPlace "$f" --replace "/lib/udev/vdev_id" "$out/lib/udev/vdev_id"
done
./autogen.sh
configureFlagsArray+=("--libexecdir=$out/libexec")
'';
configureFlags = [
"--with-config=${configFile}"
] ++ optionals buildUser [
"--with-dracutdir=$(out)/lib/dracut"
"--with-udevdir=$(out)/lib/udev"
"--with-systemdunitdir=$(out)/etc/systemd/system"
"--with-systemdpresetdir=$(out)/etc/systemd/system-preset"
"--with-systemdgeneratordir=$(out)/lib/systemd/system-generator"
"--with-mounthelperdir=$(out)/bin"
"--sysconfdir=/etc"
"--localstatedir=/var"
"--enable-systemd"
] ++ optionals buildKernel [
"--with-spl=${spl}/libexec/spl"
"--with-linux=${kernel.dev}/lib/modules/${kernel.modDirVersion}/source"
"--with-linux-obj=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build"
];
enableParallelBuilding = true;
installFlags = [
"sysconfdir=\${out}/etc"
"DEFAULT_INITCONF_DIR=\${out}/default"
];
postInstall = ''
# Prevent kernel modules from depending on the Linux -dev output.
nuke-refs $(find $out -name "*.ko")
'' + optionalString buildUser ''
# Remove provided services as they are buggy
rm $out/etc/systemd/system/zfs-import-*.service
sed -i '/zfs-import-scan.service/d' $out/etc/systemd/system/*
for i in $out/etc/systemd/system/*; do
substituteInPlace $i --replace "zfs-import-cache.service" "zfs-import.target"
done
# Fix pkgconfig.
ln -s ../share/pkgconfig $out/lib/pkgconfig
# Remove tests because they add a runtime dependency on gcc
rm -rf $out/share/zfs/zfs-tests
'';
outputs = [ "out" ] ++ optionals buildUser [ "lib" "dev" ];
meta = {
description = "ZFS Filesystem Linux Kernel module";
longDescription = ''
ZFS is a filesystem that combines a logical volume manager with a
Copy-On-Write filesystem with data integrity detection and repair,
snapshotting, cloning, block devices, deduplication, and more.
'';
homepage = http://zfsonlinux.org/;
license = licenses.cddl;
platforms = platforms.linux;
maintainers = with maintainers; [ jcumming wizeman wkennington fpletz globin ];
};
};
in {
# also check if kernel version constraints in
# ./nixos/modules/tasks/filesystems/zfs.nix needs
# to be adapted
zfsStable = common {
# comment/uncomment if breaking kernel versions are known
incompatibleKernelVersion = null;
# this package should point to the latest release.
version = "0.7.9";
sha256 = "0krpxrvnda2jx6l71xhw9fsksyp2a6h9l9asppac3szsd1n7fp9n";
extraPatches = [
(fetchpatch {
url = "https://github.com/Mic92/zfs/compare/zfs-0.7.0-rc3...nixos-zfs-0.7.0-rc3.patch";
sha256 = "1vlw98v8xvi8qapzl1jwm69qmfslwnbg3ry1lmacndaxnyckkvhh";
})
];
inherit spl;
};
zfsUnstable = common rec {
# comment/uncomment if breaking kernel versions are known
incompatibleKernelVersion = null;
# this package should point to a version / git revision compatible with the latest kernel release
version = "2018-05-22";
rev = "ba863d0be4cbfbea938b10e49fb6ff459ac9ec20";
sha256 = "11dhigw1gybalwg2m6si148b6w195dj2lw38snqf6576wb5zndd0";
isUnstable = true;
extraPatches = [
(fetchpatch {
url = "https://github.com/Mic92/zfs/compare/${rev}...nixos-zfs-2018-02-02.patch";
sha256 = "1gqmgqi39qhk5kbbvidh8f2xqq25vj58i9x0wjqvcx6a71qj49ch";
})
];
spl = splUnstable;
};
# TODO: Remove this module before 18.09
# also remove boot.zfs.enableLegacyCrypto
zfsLegacyCrypto = common {
# comment/uncomment if breaking kernel versions are known
incompatibleKernelVersion = null;
# this package should point to a version / git revision compatible with the latest kernel release
version = "2018-02-01";
rev = "4c46b99d24a6e71b3c72462c11cb051d0930ad60";
sha256 = "011lcp2x44jgfzqqk2gjmyii1v7rxcprggv20prxa3c552drsx3c";
isUnstable = true;
extraPatches = [
(fetchpatch {
url = "https://github.com/Mic92/zfs/compare/4c46b99d24a6e71b3c72462c11cb051d0930ad60...nixos-zfs-2018-02-01.patch";
sha256 = "1gqmgqi39qhk5kbbvidh8f2xqq25vj58i9x0wjqvcx6a71qj49ch";
})
];
spl = splLegacyCrypto;
};
inherit common;
}
diff --git a/Makefile.am b/Makefile.am
index 55cae89fa..91cb7a1ab 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -11,10 +11,10 @@ endif
if CONFIG_KERNEL
SUBDIRS += module
-extradir = $(prefix)/src/zfs-$(VERSION)
+extradir = $(prefix)/libexec/zfs-$(VERSION)
extra_HEADERS = zfs.release.in zfs_config.h.in
-kerneldir = $(prefix)/src/zfs-$(VERSION)/$(LINUX_VERSION)
+kerneldir = $(prefix)/zfs-$(VERSION)/$(LINUX_VERSION)
nodist_kernel_HEADERS = zfs.release zfs_config.h module/$(LINUX_SYMBOLS)
endif
@@ -56,7 +56,7 @@ install-data-hook:
ln -s ../zfs-$(VERSION)/$(LINUX_VERSION) $(LINUX_VERSION) && \
ln -s ../zfs-$(VERSION)/zfs_config.h.in spl_config.h.in && \
ln -s ../zfs-$(VERSION)/zfs.release.in spl.release.in && \
- cd $(DESTDIR)$(prefix)/src/zfs-$(VERSION)/$(LINUX_VERSION) && \
+ cd $(DESTDIR)$(prefix)/zfs-$(VERSION)/$(LINUX_VERSION) && \
ln -fs zfs_config.h spl_config.h && \
ln -fs zfs.release spl.release
endif
diff --git a/include/Makefile.am b/include/Makefile.am
index 5f13505f2..14a6ee21f 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -26,6 +26,6 @@ libzfs_HEADERS = $(COMMON_H) $(USER_H)
endif
if CONFIG_KERNEL
-kerneldir = @prefix@/src/zfs-$(VERSION)/include
+kerneldir = @prefix@/include
kernel_HEADERS = $(COMMON_H)
endif
diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am
index efb49520e..b201a8fea 100644
--- a/include/linux/Makefile.am
+++ b/include/linux/Makefile.am
@@ -23,6 +23,6 @@ libzfs_HEADERS = $(COMMON_H) $(USER_H)
endif
if CONFIG_KERNEL
-kerneldir = @prefix@/src/zfs-$(VERSION)/include/linux
+kerneldir = @prefix@/include/linux
kernel_HEADERS = $(COMMON_H) $(KERNEL_H)
endif
diff --git a/include/sys/Makefile.am b/include/sys/Makefile.am
index d64133ceb..44ef4360e 100644
--- a/include/sys/Makefile.am
+++ b/include/sys/Makefile.am
@@ -148,6 +148,6 @@ libzfs_HEADERS = $(COMMON_H) $(USER_H)
endif
if CONFIG_KERNEL
-kerneldir = @prefix@/src/zfs-$(VERSION)/include/sys
+kerneldir = @prefix@/include/sys
kernel_HEADERS = $(COMMON_H) $(KERNEL_H)
endif
diff --git a/include/sys/fm/Makefile.am b/include/sys/fm/Makefile.am
index 8bca5d846..a5eafcd5e 100644
--- a/include/sys/fm/Makefile.am
+++ b/include/sys/fm/Makefile.am
@@ -16,6 +16,6 @@ libzfs_HEADERS = $(COMMON_H) $(USER_H)
endif
if CONFIG_KERNEL
-kerneldir = @prefix@/src/zfs-$(VERSION)/include/sys/fm
+kerneldir = @prefix@/include/sys/fm
kernel_HEADERS = $(COMMON_H) $(KERNEL_H)
endif
diff --git a/include/sys/fm/fs/Makefile.am b/include/sys/fm/fs/Makefile.am
index fdc9eb545..807c47cd2 100644
--- a/include/sys/fm/fs/Makefile.am
+++ b/include/sys/fm/fs/Makefile.am
@@ -13,6 +13,6 @@ libzfs_HEADERS = $(COMMON_H) $(USER_H)
endif
if CONFIG_KERNEL
-kerneldir = @prefix@/src/zfs-$(VERSION)/include/sys/fm/fs
+kerneldir = @prefix@/include/sys/fm/fs
kernel_HEADERS = $(COMMON_H) $(KERNEL_H)
endif
diff --git a/include/sys/fs/Makefile.am b/include/sys/fs/Makefile.am
index 0859b9f67..b0c6eec8b 100644
--- a/include/sys/fs/Makefile.am
+++ b/include/sys/fs/Makefile.am
@@ -13,6 +13,6 @@ libzfs_HEADERS = $(COMMON_H) $(USER_H)
endif
if CONFIG_KERNEL
-kerneldir = @prefix@/src/zfs-$(VERSION)/include/sys/fs
+kerneldir = @prefix@/include/sys/fs
kernel_HEADERS = $(COMMON_H) $(KERNEL_H)
endif
diff --git a/module/Makefile.in b/module/Makefile.in
index 82d155dd3..3dcc17472 100644
--- a/module/Makefile.in
+++ b/module/Makefile.in
@@ -44,15 +44,15 @@ clean:
modules_install:
@# Install the kernel modules
$(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` $@ \
- INSTALL_MOD_PATH=$(DESTDIR)$(INSTALL_MOD_PATH) \
+ INSTALL_MOD_PATH=@prefix@/$(INSTALL_MOD_PATH) \
INSTALL_MOD_DIR=$(INSTALL_MOD_DIR) \
KERNELRELEASE=@LINUX_VERSION@
@# Remove extraneous build products when packaging
- kmoddir=$(DESTDIR)$(INSTALL_MOD_PATH)/lib/modules/@LINUX_VERSION@; \
- if [ -n "$(DESTDIR)" ]; then \
+ kmoddir=@prefix@$(INSTALL_MOD_PATH)/lib/modules/@LINUX_VERSION@; \
+ if [ -n "@prefix@" ]; then \
find $$kmoddir -name 'modules.*' | xargs $(RM); \
fi
- sysmap=$(DESTDIR)$(INSTALL_MOD_PATH)/boot/System.map-@LINUX_VERSION@; \
+ sysmap=@prefix@$(INSTALL_MOD_PATH)/boot/System.map-@LINUX_VERSION@; \
if [ -f $$sysmap ]; then \
depmod -ae -F $$sysmap @LINUX_VERSION@; \
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment