Compare commits

...

14 Commits

  1. 7
      .copr/Makefile
  2. 73
      README.md
  3. 19
      build.sh
  4. 26
      centos-10/PATCHES/20-enable-zfs.patch
  5. 9
      centos-10/SPECS/libvirt.spec
  6. 26
      centos-9/PATCHES/20-enable-zfs.patch
  7. 4
      centos-9/SOURCES/zfs-2.2.8.tar.gz
  8. 9
      centos-9/SPECS/libvirt.spec
  9. 26
      fedora-41/PATCHES/20-enable-zfs.patch
  10. 4
      fedora-41/SOURCES/zfs-2.3.4.tar.gz
  11. 9
      fedora-41/SPECS/libvirt.spec
  12. 26
      fedora-42/PATCHES/20-enable-zfs.patch
  13. 9
      fedora-42/SPECS/libvirt.spec
  14. 26
      fedora-43/PATCHES/20-enable-zfs.patch
  15. 3
      fedora-43/SOURCES/zfs-2.3.4.tar.gz
  16. 9
      fedora-43/SPECS/libvirt.spec
  17. 168
      fedora-43/SPECS/zfs-dkms.spec
  18. 604
      fedora-43/SPECS/zfs.spec
  19. 30
      update.sh

7
.copr/Makefile

@ -0,0 +1,7 @@
srpm:
@mkdir -p $(outdir)
dnf install -y git-lfs
git lfs install
git lfs pull
git lfs ls-files
/bin/bash -xEeuo pipefail -c 'rootdir="$$(dirname $(spec))/../"; ln -s $(outdir) $$rootdir/SRPMS; rpmbuild --define "_topdir $$rootdir" -bs $(spec)'

73
README.md

@ -0,0 +1,73 @@
# ZFS RPM packages for aarch64 architecture for Fedora, CentOS Stream & RHEL
## Purpose
This repository provides ZFS and libvirt RPM packages compiled specifically for the aarch64 (ARM64) architecture on Fedora, CentOS Stream, and RHEL systems. The main goals are:
- **ZFS Support on ARM64**: Provides native ZFS filesystem support for aarch64 systems where official ZFS packages may not be available or up-to-date
- **Libvirt with ZFS Storage**: Patches libvirt to enable ZFS storage pool support on aarch64 architecture, allowing virtualization environments to leverage ZFS storage backends
- **Multi-distribution Support**: Builds packages for multiple Linux distributions (Fedora 41-43, CentOS Stream 9-10) to ensure broad compatibility
- **Automated Building**: Uses COPR (Cool Other Package Repo) infrastructure for automated building and distribution
The repository automatically downloads upstream source RPMs, applies necessary patches (especially the `20-enable-zfs.patch` for libvirt), and builds optimized packages for ARM64 systems.
## Usage
### Installing ZFS Packages
The packages are built and hosted on COPR. To use them on your aarch64 system:
1. **Enable the COPR repository:**
```bash
sudo dnf copr enable nmasse-itix/zfs-aarch64
```
2. **Install ZFS packages:**
```bash
# Install ZFS userspace utilities
sudo dnf install zfs zfs-dkms
# Install libvirt with ZFS support
sudo dnf install libvirt
```
And then follow the [Getting Started](https://openzfs.github.io/openzfs-docs/Getting%20Started/index.html) documentation.
### Supported Distributions
- **Fedora**: 41, 42, 43
- **CentOS Stream**: 9, 10
- **RHEL**: 9, 10 (via EPEL repositories)
### Using ZFS with Libvirt
After installing the patched libvirt package, you can create ZFS storage pools:
```bash
# Create a ZFS storage pool definition
virsh pool-define-as mypool zfs - - - - /path/to/zfs/dataset
# Start and enable the pool
virsh pool-start mypool
virsh pool-autostart mypool
```
## Development
If you want to fork this repo and build it yourself, here are the instructions with `copr-cli`.
```sh
copr-cli create --chroot fedora-41-aarch64 --chroot fedora-42-aarch64 --chroot epel-9-aarch64 --chroot epel-10-aarch64 zfs-aarch64
```
And then send the build to COPR.
```sh
./build.sh
```
## License
The source code of ZFS, Libvirt and the Fedora RPM spec files remain licensed under their original license.
The patches and top-level scripts may be too trivial to receive a license.
In case a license is required for them, they are under MIT License.

19
build.sh

@ -0,0 +1,19 @@
#!/bin/bash
set -Eeuo pipefail
GIT_REPOSITORY="https://github.com/nmasse-itix/zfs-aarch64.git"
COPR_PROJECT="zfs-aarch64"
COPR_USERNAME="$(copr-cli whoami)"
for dist in centos-* fedora-*; do
chroot="${dist//centos/epel}-aarch64"
echo "Building packages for $dist using $chroot..."
for spec in $dist/SPECS/*.spec; do
spec="${spec#$dist/}"
copr-cli buildscm --clone-url "$GIT_REPOSITORY" --method make_srpm --subdir "$dist" --spec "$spec" --chroot "$chroot" --background --nowait "$COPR_PROJECT"
done
done
echo "All builds submitted to COPR project '@$COPR_USERNAME/$COPR_PROJECT'."
echo "You can monitor the build status at: https://copr.fedorainfracloud.org/coprs/$COPR_USERNAME/$COPR_PROJECT/builds/"

26
centos-10/PATCHES/20-enable-zfs.patch

@ -0,0 +1,26 @@
diff --git a/SPECS/libvirt.spec b/SPECS/libvirt.spec
--- a/SPECS/libvirt.spec
+++ b/SPECS/libvirt.spec
@@ -26,7 +26,7 @@
%endif
%define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit}
-%define arches_zfs %{arches_x86} %{power64} %{arm}
+%define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64
%define arches_ch x86_64 aarch64
@@ -76,12 +76,7 @@
%define with_storage_gluster 0
%endif
-# Fedora had zfs-fuse until F43
-%if 0%{?fedora} && 0%{?fedora} < 43
- %define with_storage_zfs 0%{!?_without_storage_zfs:1}
-%else
- %define with_storage_zfs 0
-%endif
+%define with_storage_zfs 1
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9

9
centos-10/SPECS/libvirt.spec

@ -26,7 +26,7 @@
%endif %endif
%define arches_vbox %{arches_x86} %define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit} %define arches_ceph %{arches_64bit}
%define arches_zfs %{arches_x86} %{power64} %{arm} %define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x %define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64 %define arches_numad %{arches_x86} %{power64} aarch64
%define arches_ch x86_64 aarch64 %define arches_ch x86_64 aarch64
@ -76,12 +76,7 @@
%define with_storage_gluster 0 %define with_storage_gluster 0
%endif %endif
# Fedora had zfs-fuse until F43 %define with_storage_zfs 1
%if 0%{?fedora} && 0%{?fedora} < 43
%define with_storage_zfs 0%{!?_without_storage_zfs:1}
%else
%define with_storage_zfs 0
%endif
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1} %define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9 # libiscsi has been dropped in RHEL-9

26
centos-9/PATCHES/20-enable-zfs.patch

@ -0,0 +1,26 @@
diff --git a/SPECS/libvirt.spec b/SPECS/libvirt.spec
--- a/SPECS/libvirt.spec
+++ b/SPECS/libvirt.spec
@@ -26,7 +26,7 @@
%endif
%define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit}
-%define arches_zfs %{arches_x86} %{power64} %{arm}
+%define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64
%define arches_ch x86_64 aarch64
@@ -76,12 +76,7 @@
%define with_storage_gluster 0
%endif
-# Fedora had zfs-fuse until F43
-%if 0%{?fedora} && 0%{?fedora} < 43
- %define with_storage_zfs 0%{!?_without_storage_zfs:1}
-%else
- %define with_storage_zfs 0
-%endif
+%define with_storage_zfs 1
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9

4
centos-9/SOURCES/zfs-2.2.8.tar.gz

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ef669f8ba31b6998a97002d29eb079c8680e59fd2a9202fcb9ca7a9d9522459d oid sha256:727ac0e81c5446aae76839a85ea3ea7a966ed4112421db1d0f70c1b2f92dc0c0
size 33857690 size 33851391

9
centos-9/SPECS/libvirt.spec

@ -26,7 +26,7 @@
%endif %endif
%define arches_vbox %{arches_x86} %define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit} %define arches_ceph %{arches_64bit}
%define arches_zfs %{arches_x86} %{power64} %{arm} %define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x %define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64 %define arches_numad %{arches_x86} %{power64} aarch64
%define arches_ch x86_64 aarch64 %define arches_ch x86_64 aarch64
@ -76,12 +76,7 @@
%define with_storage_gluster 0 %define with_storage_gluster 0
%endif %endif
# Fedora had zfs-fuse until F43 %define with_storage_zfs 1
%if 0%{?fedora} && 0%{?fedora} < 43
%define with_storage_zfs 0%{!?_without_storage_zfs:1}
%else
%define with_storage_zfs 0
%endif
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1} %define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9 # libiscsi has been dropped in RHEL-9

26
fedora-41/PATCHES/20-enable-zfs.patch

@ -0,0 +1,26 @@
diff --git a/SPECS/libvirt.spec b/SPECS/libvirt.spec
--- a/SPECS/libvirt.spec
+++ b/SPECS/libvirt.spec
@@ -26,7 +26,7 @@
%endif
%define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit}
-%define arches_zfs %{arches_x86} %{power64} %{arm}
+%define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64
@@ -75,12 +75,7 @@
%endif
%endif
-# Fedora has zfs-fuse
-%if 0%{?fedora}
- %define with_storage_zfs 0%{!?_without_storage_zfs:1}
-%else
- %define with_storage_zfs 0
-%endif
+%define with_storage_zfs 1
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9

4
fedora-41/SOURCES/zfs-2.3.4.tar.gz

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:70bc4b6b22e5474faf46d4dad5717a6cdd5f85a9830012ae64014abbe52406fc oid sha256:960dadef24223edf16578de75ab471acdf4119ec8e1402408e8c789577ed305e
size 34387363 size 34377346

9
fedora-41/SPECS/libvirt.spec

@ -26,7 +26,7 @@
%endif %endif
%define arches_vbox %{arches_x86} %define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit} %define arches_ceph %{arches_64bit}
%define arches_zfs %{arches_x86} %{power64} %{arm} %define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x %define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64 %define arches_numad %{arches_x86} %{power64} aarch64
@ -75,12 +75,7 @@
%endif %endif
%endif %endif
# Fedora has zfs-fuse %define with_storage_zfs 1
%if 0%{?fedora}
%define with_storage_zfs 0%{!?_without_storage_zfs:1}
%else
%define with_storage_zfs 0
%endif
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1} %define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9 # libiscsi has been dropped in RHEL-9

26
fedora-42/PATCHES/20-enable-zfs.patch

@ -0,0 +1,26 @@
diff --git a/SPECS/libvirt.spec b/SPECS/libvirt.spec
--- a/SPECS/libvirt.spec
+++ b/SPECS/libvirt.spec
@@ -26,7 +26,7 @@
%endif
%define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit}
-%define arches_zfs %{arches_x86} %{power64} %{arm}
+%define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64
@@ -75,12 +75,7 @@
%endif
%endif
-# Fedora has zfs-fuse
-%if 0%{?fedora}
- %define with_storage_zfs 0%{!?_without_storage_zfs:1}
-%else
- %define with_storage_zfs 0
-%endif
+%define with_storage_zfs 1
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9

9
fedora-42/SPECS/libvirt.spec

@ -26,7 +26,7 @@
%endif %endif
%define arches_vbox %{arches_x86} %define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit} %define arches_ceph %{arches_64bit}
%define arches_zfs %{arches_x86} %{power64} %{arm} %define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x %define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64 %define arches_numad %{arches_x86} %{power64} aarch64
%define arches_ch x86_64 aarch64 %define arches_ch x86_64 aarch64
@ -77,12 +77,7 @@
%endif %endif
%endif %endif
# Fedora has zfs-fuse %define with_storage_zfs 1
%if 0%{?fedora}
%define with_storage_zfs 0%{!?_without_storage_zfs:1}
%else
%define with_storage_zfs 0
%endif
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1} %define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9 # libiscsi has been dropped in RHEL-9

26
fedora-43/PATCHES/20-enable-zfs.patch

@ -0,0 +1,26 @@
diff --git a/SPECS/libvirt.spec b/SPECS/libvirt.spec
--- a/SPECS/libvirt.spec
+++ b/SPECS/libvirt.spec
@@ -26,7 +26,7 @@
%endif
%define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit}
-%define arches_zfs %{arches_x86} %{power64} %{arm}
+%define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64
%define arches_ch x86_64 aarch64
@@ -76,12 +76,7 @@
%define with_storage_gluster 0
%endif
-# Fedora had zfs-fuse until F43
-%if 0%{?fedora} && 0%{?fedora} < 43
- %define with_storage_zfs 0%{!?_without_storage_zfs:1}
-%else
- %define with_storage_zfs 0
-%endif
+%define with_storage_zfs 1
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9

3
fedora-43/SOURCES/zfs-2.3.4.tar.gz

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:70bc4b6b22e5474faf46d4dad5717a6cdd5f85a9830012ae64014abbe52406fc
size 34387363

9
fedora-43/SPECS/libvirt.spec

@ -26,7 +26,7 @@
%endif %endif
%define arches_vbox %{arches_x86} %define arches_vbox %{arches_x86}
%define arches_ceph %{arches_64bit} %define arches_ceph %{arches_64bit}
%define arches_zfs %{arches_x86} %{power64} %{arm} %define arches_zfs %{arches_x86} %{power64} %{arm} aarch64
%define arches_numactl %{arches_x86} %{power64} aarch64 s390x %define arches_numactl %{arches_x86} %{power64} aarch64 s390x
%define arches_numad %{arches_x86} %{power64} aarch64 %define arches_numad %{arches_x86} %{power64} aarch64
%define arches_ch x86_64 aarch64 %define arches_ch x86_64 aarch64
@ -76,12 +76,7 @@
%define with_storage_gluster 0 %define with_storage_gluster 0
%endif %endif
# Fedora had zfs-fuse until F43 %define with_storage_zfs 1
%if 0%{?fedora} && 0%{?fedora} < 43
%define with_storage_zfs 0%{!?_without_storage_zfs:1}
%else
%define with_storage_zfs 0
%endif
%define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1} %define with_storage_iscsi_direct 0%{!?_without_storage_iscsi_direct:1}
# libiscsi has been dropped in RHEL-9 # libiscsi has been dropped in RHEL-9

168
fedora-43/SPECS/zfs-dkms.spec

@ -1,168 +0,0 @@
%{?!packager: %define packager Brian Behlendorf <behlendorf1@llnl.gov>}
%if ! 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler}
%define not_rpm 1
%endif
# Exclude input files from mangling
%global __brp_mangle_shebangs_exclude_from ^/usr/src/.*$
%define module zfs
%define mkconf scripts/dkms.mkconf
Name: %{module}-dkms
Version: 2.3.4
Release: 1%{?dist}
Summary: Kernel module(s) (dkms)
Group: System Environment/Kernel
License: CDDL
URL: https://github.com/openzfs/zfs
Source0: %{module}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: noarch
Requires: dkms >= 2.2.0.3
Requires(pre): dkms >= 2.2.0.3
Requires(post): dkms >= 2.2.0.3
Requires(preun): dkms >= 2.2.0.3
Requires: gcc, make, perl, diffutils
Requires(post): gcc, make, perl, diffutils
# Hold back kernel upgrades if kernel is not supported by ZFS
%if 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler}
Requires: kernel-devel >= 4.18, kernel-devel <= 6.16.999
Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.16.999
Conflicts: kernel-devel < 4.18, kernel-devel > 6.16.999
Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.16.999
Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.16.999
Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.16.999
Obsoletes: spl-dkms <= %{version}
%endif
Provides: %{module}-kmod = %{version}
AutoReqProv: no
%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9)
# We don't directly use it, but if this isn't installed, rpmbuild as root can
# crash+corrupt rpmdb
# See issue #12071
BuildRequires: ncompress
%endif
%description
This package contains the dkms ZFS kernel modules.
%prep
%setup -q -n %{module}-%{version}
%build
%{mkconf} -n %{module} -v %{version} -f dkms.conf
%install
if [ "$RPM_BUILD_ROOT" != "/" ]; then
rm -rf $RPM_BUILD_ROOT
fi
mkdir -p $RPM_BUILD_ROOT/usr/src/
cp -rf ${RPM_BUILD_DIR}/%{module}-%{version} $RPM_BUILD_ROOT/usr/src/
%clean
if [ "$RPM_BUILD_ROOT" != "/" ]; then
rm -rf $RPM_BUILD_ROOT
fi
%files
%defattr(-,root,root)
/usr/src/%{module}-%{version}
%pre
echo "Running pre installation script: $0. Parameters: $*"
# We don't want any other versions lingering around in dkms.
# Tests with 'dnf' showed that in case of reinstall, or upgrade
# the preun scriptlet removed the version we are trying to install.
# Because of this, find all zfs dkms sources in /var/lib/dkms and
# remove them, if we find a matching version in dkms.
dkms_root=/var/lib/dkms
if [ -d ${dkms_root}/%{module} ]; then
cd ${dkms_root}/%{module}
for x in [[:digit:]]*; do
[ -d "$x" ] || continue
otherver="$x"
opath="${dkms_root}/%{module}/${otherver}"
if [ "$otherver" != %{version} ]; then
# This is a workaround for a broken 'dkms status', we caused in a previous version.
# One day it might be not needed anymore, but it does not hurt to keep it.
if dkms status -m %{module} -v "$otherver" 2>&1 | grep "${opath}/source/dkms.conf does not exist"
then
echo "ERROR: dkms status is broken!" >&2
if [ -L "${opath}/source" -a ! -d "${opath}/source" ]
then
echo "Trying to fix it by removing the symlink: ${opath}/source" >&2
echo "You should manually remove ${opath}" >&2
rm -f "${opath}/source" || echo "Removal failed!" >&2
fi
fi
if [ `dkms status -m %{module} -v "$otherver" | grep -c %{module}` -gt 0 ]; then
echo "Removing old %{module} dkms modules version $otherver from all kernels."
dkms remove -m %{module} -v "$otherver" --all ||:
fi
fi
done
cd ${dkms_root}
fi
# Uninstall this version of zfs dkms modules before installation of the package.
if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then
echo "Removing %{module} dkms modules version %{version} from all kernels."
dkms remove -m %{module} -v %{version} --all ||:
fi
%post
echo "Running post installation script: $0. Parameters: $*"
# Add the module to dkms, as reccommended in the dkms man page.
# This is generally rpm specfic.
# But this also may help, if we have a broken 'dkms status'.
# Because, if the sources are available and only the symlink pointing
# to them is missing, this will resolve the situation
echo "Adding %{module} dkms modules version %{version} to dkms."
dkms add -m %{module} -v %{version} %{!?not_rpm:--rpm_safe_upgrade} ||:
# After installing the package, dkms install this zfs version for the current kernel.
# Force the overwriting of old modules to avoid diff warnings in dkms status.
# Or in case of a downgrade to overwrite newer versions.
# Or if some other backed up versions have been restored before.
echo "Installing %{module} dkms modules version %{version} for the current kernel."
dkms install --force -m %{module} -v %{version} ||:
%preun
dkms_root="/var/lib/dkms/%{module}/%{version}"
echo "Running pre uninstall script: $0. Parameters: $*"
# In case of upgrade we do nothing. See above comment in pre hook.
if [ "$1" = "1" -o "$1" = "upgrade" ] ; then
echo "This is an upgrade. Skipping pre uninstall action."
exit 0
fi
# Check if we uninstall the package. In that case remove the dkms modules.
# '0' is the value for the first parameter for rpm packages.
# 'remove' or 'purge' are the possible names for deb packages.
if [ "$1" = "0" -o "$1" = "remove" -o "$1" = "purge" ] ; then
if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then
echo "Removing %{module} dkms modules version %{version} from all kernels."
dkms remove -m %{module} -v %{version} --all %{!?not_rpm:--rpm_safe_upgrade} && exit 0
fi
# If removing the modules failed, it might be because of the broken 'dkms status'.
if dkms status -m %{module} -v %{version} 2>&1 | grep "${dkms_root}/source/dkms.conf does not exist"
then
echo "ERROR: dkms status is broken!" >&2
echo "You should manually remove ${dkms_root}" >&2
echo "WARNING: installed modules in /lib/modules/`uname -r`/extra could not be removed automatically!" >&2
fi
else
echo "Script parameter $1 did not match any removal condition."
fi
exit 0

604
fedora-43/SPECS/zfs.spec

@ -1,604 +0,0 @@
%global _sbindir /sbin
%global _libdir /%{_lib}
# Set the default udev directory based on distribution.
%if %{undefined _udevdir}
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler}
%global _udevdir %{_prefix}/lib/udev
%else
%global _udevdir /lib/udev
%endif
%endif
# Set the default udevrule directory based on distribution.
%if %{undefined _udevruledir}
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler}
%global _udevruledir %{_prefix}/lib/udev/rules.d
%else
%global _udevruledir /lib/udev/rules.d
%endif
%endif
# Set the default _bashcompletiondir directory based on distribution.
%if %{undefined _bashcompletiondir}
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler}
%global _bashcompletiondir /etc/bash_completion.d
%else
%global _bashcompletiondir /usr/share/bash-completion
%endif
%endif
# Set the default dracut directory based on distribution.
%if %{undefined _dracutdir}
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler}
%global _dracutdir %{_prefix}/lib/dracut
%else
%global _dracutdir %{_prefix}/share/dracut
%endif
%endif
%if %{undefined _initconfdir}
%global _initconfdir /etc/sysconfig
%endif
%if %{undefined _unitdir}
%global _unitdir %{_prefix}/lib/systemd/system
%endif
%if %{undefined _presetdir}
%global _presetdir %{_prefix}/lib/systemd/system-preset
%endif
%if %{undefined _modulesloaddir}
%global _modulesloaddir %{_prefix}/lib/modules-load.d
%endif
%if %{undefined _systemdgeneratordir}
%global _systemdgeneratordir %{_prefix}/lib/systemd/system-generators
%endif
%if %{undefined _pkgconfigdir}
%global _pkgconfigdir %{_prefix}/%{_lib}/pkgconfig
%endif
%bcond_with debug
%bcond_with debuginfo
%bcond_with asan
%bcond_with ubsan
%bcond_with systemd
%bcond_with pam
%bcond_without pyzfs
# Generic enable switch for systemd
%if %{with systemd}
%define _systemd 1
%endif
# Distros below support systemd
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler}
%define _systemd 1
%endif
# When not specified default to distribution provided version.
%if %{undefined __use_python}
%define __python /usr/bin/python3
%define __python_pkg_version 3
%else
%define __python %{__use_python}
%define __python_pkg_version %{__use_python_pkg_version}
%endif
%define __python_sitelib %(%{__python} -Esc "
import sysconfig;
if hasattr(sysconfig, 'get_default_scheme'):
scheme = sysconfig.get_default_scheme()
else:
scheme = sysconfig._get_default_scheme()
if scheme == 'posix_local':
scheme = 'posix_prefix'
prefix = '%{_prefix}'
if prefix == 'NONE':
prefix = '%{ac_default_prefix}'
sitedir = sysconfig.get_path('purelib', scheme, vars={'base': prefix})
print(sitedir);" 2>/dev/null || %{__python} -Esc "from distutils import sysconfig; print(sysconfig.get_python_lib(0,0))")
Name: zfs
Version: 2.3.4
Release: 1%{?dist}
Summary: Commands to control the kernel modules and libraries
Group: System Environment/Kernel
License: CDDL
URL: https://github.com/openzfs/zfs
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Requires: libzpool6%{?_isa} = %{version}-%{release}
Requires: libnvpair3%{?_isa} = %{version}-%{release}
Requires: libuutil3%{?_isa} = %{version}-%{release}
Requires: libzfs6%{?_isa} = %{version}-%{release}
Requires: %{name}-kmod = %{version}
Provides: %{name}-kmod-common = %{version}-%{release}
Obsoletes: spl <= %{version}
# zfs-fuse provides the same commands and man pages that OpenZFS does.
# Renaming those on either side would conflict with all available documentation.
Conflicts: zfs-fuse
%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler}
BuildRequires: gcc, make
BuildRequires: zlib-devel
BuildRequires: libuuid-devel
BuildRequires: libblkid-devel
BuildRequires: libudev-devel
BuildRequires: libattr-devel
BuildRequires: openssl-devel
%if 0%{?fedora}%{?suse_version}%{?openEuler} || 0%{?rhel} >= 8 || 0%{?centos} >= 8
BuildRequires: libtirpc-devel
%endif
%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9)
# We don't directly use it, but if this isn't installed, rpmbuild as root can
# crash+corrupt rpmdb
# See issue #12071
BuildRequires: ncompress
%endif
Requires: openssl
%if 0%{?_systemd}
BuildRequires: systemd
%endif
%endif
%if 0%{?_systemd}
Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd
%endif
# The zpool iostat/status -c scripts call some utilities like lsblk and iostat
Requires: util-linux
Requires: sysstat
%description
This package contains the core ZFS command line utilities.
%package -n libzpool6
Summary: Native ZFS pool library for Linux
Group: System Environment/Kernel
Obsoletes: libzpool2 <= %{version}
Obsoletes: libzpool4 <= %{version}
Obsoletes: libzpool5 <= %{version}
%description -n libzpool6
This package contains the zpool library, which provides support
for managing zpools
%if %{defined ldconfig_scriptlets}
%ldconfig_scriptlets -n libzpool6
%else
%post -n libzpool6 -p /sbin/ldconfig
%postun -n libzpool6 -p /sbin/ldconfig
%endif
%package -n libnvpair3
Summary: Solaris name-value library for Linux
Group: System Environment/Kernel
Obsoletes: libnvpair1 <= %{version}
%description -n libnvpair3
This package contains routines for packing and unpacking name-value
pairs. This functionality is used to portably transport data across
process boundaries, between kernel and user space, and can be used
to write self describing data structures on disk.
%if %{defined ldconfig_scriptlets}
%ldconfig_scriptlets -n libnvpair3
%else
%post -n libnvpair3 -p /sbin/ldconfig
%postun -n libnvpair3 -p /sbin/ldconfig
%endif
%package -n libuutil3
Summary: Solaris userland utility library for Linux
Group: System Environment/Kernel
Obsoletes: libuutil1 <= %{version}
%description -n libuutil3
This library provides a variety of compatibility functions for OpenZFS:
* libspl: The Solaris Porting Layer userland library, which provides APIs
that make it possible to run Solaris user code in a Linux environment
with relatively minimal modification.
* libavl: The Adelson-Velskii Landis balanced binary tree manipulation
library.
* libefi: The Extensible Firmware Interface library for GUID disk
partitioning.
* libshare: NFS, SMB, and iSCSI service integration for ZFS.
%if %{defined ldconfig_scriptlets}
%ldconfig_scriptlets -n libuutil3
%else
%post -n libuutil3 -p /sbin/ldconfig
%postun -n libuutil3 -p /sbin/ldconfig
%endif
# The library version is encoded in the package name. When updating the
# version information it is important to add an obsoletes line below for
# the previous version of the package.
%package -n libzfs6
Summary: Native ZFS filesystem library for Linux
Group: System Environment/Kernel
Obsoletes: libzfs2 <= %{version}
Obsoletes: libzfs4 <= %{version}
Obsoletes: libzfs5 <= %{version}
%description -n libzfs6
This package provides support for managing ZFS filesystems
%if %{defined ldconfig_scriptlets}
%ldconfig_scriptlets -n libzfs6
%else
%post -n libzfs6 -p /sbin/ldconfig
%postun -n libzfs6 -p /sbin/ldconfig
%endif
%package -n libzfs6-devel
Summary: Development headers
Group: System Environment/Kernel
Requires: libzfs6%{?_isa} = %{version}-%{release}
Requires: libzpool6%{?_isa} = %{version}-%{release}
Requires: libnvpair3%{?_isa} = %{version}-%{release}
Requires: libuutil3%{?_isa} = %{version}-%{release}
Provides: libzpool6-devel = %{version}-%{release}
Provides: libnvpair3-devel = %{version}-%{release}
Provides: libuutil3-devel = %{version}-%{release}
Obsoletes: zfs-devel <= %{version}
Obsoletes: libzfs2-devel <= %{version}
Obsoletes: libzfs4-devel <= %{version}
Obsoletes: libzfs5-devel <= %{version}
%description -n libzfs6-devel
This package contains the header files needed for building additional
applications against the ZFS libraries.
%package test
Summary: Test infrastructure
Group: System Environment/Kernel
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires: parted
Requires: lsscsi
Requires: mdadm
Requires: bc
Requires: ksh
Requires: fio
Requires: acl
Requires: sudo
Requires: sysstat
Requires: libaio
Requires: python%{__python_pkg_version}
%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler}
BuildRequires: libaio-devel
%endif
AutoReqProv: no
%description test
This package contains test infrastructure and support scripts for
validating the file system.
%package dracut
Summary: Dracut module
Group: System Environment/Kernel
BuildArch: noarch
Requires: %{name} >= %{version}
Requires: dracut
Requires: /usr/bin/awk
Requires: grep
%description dracut
This package contains a dracut module used to construct an initramfs
image which is ZFS aware.
%if %{with pyzfs}
# Enforce `python36-` package prefix for CentOS 7
# since dependencies come from EPEL and are named this way
%package -n python%{__python_pkg_version}-pyzfs
Summary: Python %{python_version} wrapper for libzfs_core
Group: Development/Languages/Python
License: Apache-2.0
BuildArch: noarch
Requires: libzfs6 = %{version}-%{release}
Requires: libnvpair3 = %{version}-%{release}
Requires: libffi
Requires: python%{__python_pkg_version}
%if 0%{?centos} == 7
Requires: python36-cffi
%else
Requires: python%{__python_pkg_version}-cffi
%endif
%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler}
%if 0%{?centos} == 7
BuildRequires: python36-packaging
BuildRequires: python36-devel
BuildRequires: python36-cffi
BuildRequires: python36-setuptools
%else
BuildRequires: python%{__python_pkg_version}-packaging
BuildRequires: python%{__python_pkg_version}-devel
BuildRequires: python%{__python_pkg_version}-cffi
BuildRequires: python%{__python_pkg_version}-setuptools
%endif
BuildRequires: libffi-devel
%endif
%description -n python%{__python_pkg_version}-pyzfs
This package provides a python wrapper for the libzfs_core C library.
%endif
%if 0%{?_initramfs}
%package initramfs
Summary: Initramfs module
Group: System Environment/Kernel
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires: initramfs-tools
%description initramfs
This package contains a initramfs module used to construct an initramfs
image which is ZFS aware.
%endif
%if %{with pam}
%package -n pam_zfs_key
Summary: PAM module for encrypted ZFS datasets
%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler}
BuildRequires: pam-devel
%endif
%description -n pam_zfs_key
This package contains the pam_zfs_key PAM module, which provides
support for unlocking datasets on user login.
%endif
%prep
%if %{with debug}
%define debug --enable-debug
%else
%define debug --disable-debug
%endif
%if %{with debuginfo}
%define debuginfo --enable-debuginfo
%else
%define debuginfo --disable-debuginfo
%endif
%if %{with asan}
%define asan --enable-asan
%else
%define asan --disable-asan
%endif
%if %{with ubsan}
%define ubsan --enable-ubsan
%else
%define ubsan --disable-ubsan
%endif
%if 0%{?_systemd}
%define systemd --enable-systemd --with-systemdunitdir=%{_unitdir} --with-systemdpresetdir=%{_presetdir} --with-systemdmodulesloaddir=%{_modulesloaddir} --with-systemdgeneratordir=%{_systemdgeneratordir} --disable-sysvinit
%define systemd_svcs zfs-import-cache.service zfs-import-scan.service zfs-mount.service zfs-mount@.service zfs-share.service zfs-zed.service zfs.target zfs-import.target zfs-volume-wait.service zfs-volumes.target
%else
%define systemd --enable-sysvinit --disable-systemd
%endif
%if %{with pyzfs}
%define pyzfs --enable-pyzfs
%else
%define pyzfs --disable-pyzfs
%endif
%if %{with pam}
%define pam --enable-pam
%else
%define pam --disable-pam
%endif
%setup -q
%build
%configure \
--with-config=user \
--with-udevdir=%{_udevdir} \
--with-udevruledir=%{_udevruledir} \
--with-dracutdir=%{_dracutdir} \
--with-pamconfigsdir=%{_datadir}/pam-configs \
--with-pammoduledir=%{_libdir}/security \
--with-python=%{__python} \
--with-pkgconfigdir=%{_pkgconfigdir} \
--disable-static \
%{debug} \
%{debuginfo} \
%{asan} \
%{ubsan} \
%{systemd} \
%{pam} \
%{pyzfs}
make %{?_smp_mflags}
%install
%{__rm} -rf $RPM_BUILD_ROOT
make install DESTDIR=%{?buildroot}
find %{?buildroot}%{_libdir} -name '*.la' -exec rm -f {} \;
%if 0%{!?__brp_mangle_shebangs:1}
find %{?buildroot}%{_bindir} \
\( -name arc_summary -or -name arcstat -or -name dbufstat \
-or -name zilstat \) \
-exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \;
find %{?buildroot}%{_datadir} \
\( -name test-runner.py -or -name zts-report.py \) \
-exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \;
%endif
%post
%if 0%{?_systemd}
%if 0%{?systemd_post:1}
%systemd_post %{systemd_svcs}
%else
if [ "$1" = "1" -o "$1" = "install" ] ; then
# Initial installation
systemctl preset %{systemd_svcs} >/dev/null || true
fi
%endif
%else
if [ -x /sbin/chkconfig ]; then
/sbin/chkconfig --add zfs-import
/sbin/chkconfig --add zfs-load-key
/sbin/chkconfig --add zfs-mount
/sbin/chkconfig --add zfs-share
/sbin/chkconfig --add zfs-zed
fi
%endif
exit 0
# On RHEL/CentOS 7 the static nodes aren't refreshed by default after
# installing a package. This is the default behavior for Fedora.
%posttrans
%if 0%{?rhel} == 7 || 0%{?centos} == 7
systemctl restart kmod-static-nodes
systemctl restart systemd-tmpfiles-setup-dev
udevadm trigger
%endif
%preun
%if 0%{?_systemd}
%if 0%{?systemd_preun:1}
%systemd_preun %{systemd_svcs}
%else
if [ "$1" = "0" -o "$1" = "remove" ] ; then
# Package removal, not upgrade
systemctl --no-reload disable %{systemd_svcs} >/dev/null || true
systemctl stop %{systemd_svcs} >/dev/null || true
fi
%endif
%else
if [ "$1" = "0" -o "$1" = "remove" ] && [ -x /sbin/chkconfig ]; then
/sbin/chkconfig --del zfs-import
/sbin/chkconfig --del zfs-load-key
/sbin/chkconfig --del zfs-mount
/sbin/chkconfig --del zfs-share
/sbin/chkconfig --del zfs-zed
fi
%endif
exit 0
%postun
%if 0%{?_systemd}
%if 0%{?systemd_postun:1}
%systemd_postun %{systemd_svcs}
%else
systemctl --system daemon-reload >/dev/null || true
%endif
%endif
%files
# Core utilities
%{_sbindir}/*
%{_bindir}/raidz_test
%{_bindir}/zvol_wait
# Optional Python 3 scripts
%{_bindir}/arc_summary
%{_bindir}/arcstat
%{_bindir}/dbufstat
%{_bindir}/zilstat
# Man pages
%{_mandir}/man1/*
%{_mandir}/man4/*
%{_mandir}/man5/*
%{_mandir}/man7/*
%{_mandir}/man8/*
# Configuration files and scripts
%{_libexecdir}/%{name}
%{_udevdir}/vdev_id
%{_udevdir}/zvol_id
%{_udevdir}/rules.d/*
%{_datadir}/%{name}/compatibility.d
%if ! 0%{?_systemd} || 0%{?_initramfs}
# Files needed for sysvinit and initramfs-tools
%{_sysconfdir}/%{name}/zfs-functions
%config(noreplace) %{_initconfdir}/zfs
%else
%exclude %{_sysconfdir}/%{name}/zfs-functions
%exclude %{_initconfdir}/zfs
%endif
%if 0%{?_systemd}
%{_unitdir}/*
%{_presetdir}/*
%{_modulesloaddir}/*
%{_systemdgeneratordir}/*
%else
%config(noreplace) %{_sysconfdir}/init.d/*
%endif
%config(noreplace) %{_sysconfdir}/%{name}/zed.d/*
%config(noreplace) %{_sysconfdir}/%{name}/zpool.d/*
%config(noreplace) %{_sysconfdir}/%{name}/vdev_id.conf.*.example
%attr(440, root, root) %config(noreplace) %{_sysconfdir}/sudoers.d/*
%config(noreplace) %{_bashcompletiondir}/zfs
%config(noreplace) %{_bashcompletiondir}/zpool
%files -n libzpool6
%{_libdir}/libzpool.so.*
%files -n libnvpair3
%{_libdir}/libnvpair.so.*
%files -n libuutil3
%{_libdir}/libuutil.so.*
%files -n libzfs6
%{_libdir}/libzfs*.so.*
%files -n libzfs6-devel
%{_pkgconfigdir}/libzfs.pc
%{_pkgconfigdir}/libzfsbootenv.pc
%{_pkgconfigdir}/libzfs_core.pc
%{_libdir}/*.so
%{_includedir}/*
%doc AUTHORS COPYRIGHT LICENSE NOTICE README.md
%files test
%{_datadir}/%{name}/zfs-tests
%{_datadir}/%{name}/test-runner
%{_datadir}/%{name}/runfiles
%{_datadir}/%{name}/*.sh
%files dracut
%doc contrib/dracut/README.md
%{_dracutdir}/modules.d/*
%if %{with pyzfs}
%files -n python%{__python_pkg_version}-pyzfs
%doc contrib/pyzfs/README
%doc contrib/pyzfs/LICENSE
%defattr(-,root,root,-)
%{__python_sitelib}/libzfs_core/*
%{__python_sitelib}/pyzfs*
%endif
%if 0%{?_initramfs}
%files initramfs
%doc contrib/initramfs/README.md
/usr/share/initramfs-tools/*
%else
# Since we're not building the initramfs package,
# ignore those files.
%exclude /usr/share/initramfs-tools
%endif
%if %{with pam}
%files -n pam_zfs_key
%{_libdir}/security/*
%{_datadir}/pam-configs/*
%endif

30
update.sh

@ -4,15 +4,31 @@ set -Eeuo pipefail
find . -name '*.src.rpm' -delete find . -name '*.src.rpm' -delete
function install_all_srpm () {
local dist=$1
echo "Importing source RPMs of $dist..."
rpm -ivh "--define=_topdir $PWD/$dist" "$dist/SRPMS/"*.src.rpm
}
function apply_patches () {
local dist=$1
for patch in "$dist/PATCHES"/*.patch; do
echo "Applying patch $(basename "$patch")..."
patch -d "$dist"* -p1 < "$patch"
done
}
for v in 41 42 43; do for v in 41 42 43; do
dist="fedora-$v" dist="fedora-$v"
mkdir -p "$dist/SRPMS" mkdir -p "$dist/SRPMS"
echo "Downloading libvirt source for Fedora $v..." echo "Downloading libvirt source for Fedora $v..."
dnf download --repofrompath=$dist,https://dl.fedoraproject.org/pub/fedora/linux/releases/$v/Everything/source/tree/ --repofrompath=$dist-updates,https://dl.fedoraproject.org/pub/fedora/linux/updates/$v/Everything/source/tree/ --repo="$dist" --repo="$dist-updates" --source libvirt --destdir $dist/SRPMS/ dnf download --repofrompath=$dist,https://dl.fedoraproject.org/pub/fedora/linux/releases/$v/Everything/source/tree/ --repofrompath=$dist-updates,https://dl.fedoraproject.org/pub/fedora/linux/updates/$v/Everything/source/tree/ --repo="$dist" --repo="$dist-updates" --source libvirt --destdir $dist/SRPMS/
echo "Downloading zfs source for Fedora $v..." echo "Downloading zfs source for Fedora $v..."
dnf download --repofrompath=zfs-$dist,http://download.zfsonlinux.org/fedora/42/SRPMS/ --repo=zfs-$dist --source zfs zfs-dkms --destdir $dist/SRPMS/ if ! dnf download --repofrompath=zfs-$dist,http://download.zfsonlinux.org/fedora/$v/SRPMS/ --repo=zfs-$dist --source zfs zfs-dkms --destdir $dist/SRPMS/; then
echo "Importing source RPMs for Fedora $v..." echo "ZFS source RPM not found for Fedora $v, skipping..."
rpm -ivh "--define=_topdir $PWD/$dist" $dist/SRPMS/*.src.rpm fi
install_all_srpm "$dist"
apply_patches "$dist"
done done
for v in 9 10; do for v in 9 10; do
@ -21,7 +37,9 @@ for v in 9 10; do
echo "Downloading libvirt source for CentOS Stream $v..." echo "Downloading libvirt source for CentOS Stream $v..."
dnf download --repofrompath=$dist,https://mirror.stream.centos.org/$v-stream/AppStream/source/tree/ --repo="$dist" --source libvirt --destdir $dist/SRPMS/ dnf download --repofrompath=$dist,https://mirror.stream.centos.org/$v-stream/AppStream/source/tree/ --repo="$dist" --source libvirt --destdir $dist/SRPMS/
echo "Downloading zfs source for CentOS Stream $v..." echo "Downloading zfs source for CentOS Stream $v..."
dnf download --repofrompath=zfs-$dist,http://download.zfsonlinux.org/epel/10/SRPMS/ --repo=zfs-$dist --source zfs zfs-dkms --destdir $dist/SRPMS/ if ! dnf download --repofrompath=zfs-$dist,http://download.zfsonlinux.org/epel/$v/SRPMS/ --repo=zfs-$dist --source zfs zfs-dkms --destdir $dist/SRPMS/; then
echo "Importing source RPMs for CentOS Stream $v..." echo "ZFS source RPM not found for CentOS Stream $v, skipping..."
rpm -ivh "--define=_topdir $PWD/$dist" $dist/SRPMS/*.src.rpm fi
install_all_srpm "$dist"
apply_patches "$dist"
done done

Loading…
Cancel
Save