#niceos-cloud-virt-ultimate.fragment #niceos-fs-everything.fragment %bcond_without zfs %bcond_without gost %define debug_package %{nil} %global kernel_srcdir %{_usrsrc}/kernel %global zfs_version 2.4.0 %global zfs_moddir extra/zfs %global modulesloaddir %{_prefix}/lib/modules-load.d # ========================= Arch mapping (RPM arch vs Kbuild ARCH) ========================= # В Kbuild для x86_64 используется ARCH=x86 (каталог arch/x86) %ifarch x86_64 %define arch x86_64 %define archdir x86 %global karch x86 %endif %global localversion -%{release}.%{_target_cpu} %global uname_r %{version}%{localversion} %define _modulesdir /lib/modules/%{uname_r} %global bootdir /boot %global kimg %{bootdir}/vmlinuz-%{uname_r} %global initrd %{bootdir}/initramfs-%{uname_r}.img %global sysmap %{bootdir}/System.map-%{uname_r} %global kconf %{bootdir}/config-%{uname_r} Name: linux Version: 6.12.87 Release: 1%{?dist} Summary: Ядро операционной системы NiceOS / Linux operating system kernel License: GPLv2 Group: System Environment/Kernel Vendor: NiceSOFT Packager: ООО "НАЙС СОФТ ГРУПП" 5024245440 Distribution: NiceOS.Core BugURL: https://niceos.ru/package/%{name} URL: https://www.kernel.org # Исходники ядра и ваш .config Source0: https://www.kernel.org/pub/linux/kernel/v6.x/linux-%{version}.tar.xz Source1: LINUX%{version}-host Source2: https://www.kernel.org/pub/linux/kernel/v6.x/linux-%{version}.tar.sign Source19: %{name}-dracut-%{_arch}.conf Source1000: linux-crypto.tar.gz Source1001: build_gost_kernel.md %if %{with zfs} Source2000: https://github.com/openzfs/zfs/releases/download/zfs-%{zfs_version}/zfs-%{zfs_version}.tar.gz Patch2000: zfs-2.2.2-import-by-disk-id.patch %endif Source56: signing_key.x509 # ================== BuildRequires (ядро + tools) ================== BuildRequires: gcc BuildRequires: make BuildRequires: bc BuildRequires: bison BuildRequires: flex BuildRequires: perl BuildRequires: openssl-devel BuildRequires: elfutils-libelf-devel BuildRequires: elfutils-devel BuildRequires: binutils-devel BuildRequires: zlib-devel BuildRequires: zstd-devel BuildRequires: libcap-devel BuildRequires: libtraceevent-devel BuildRequires: python3-devel BuildRequires: python3-setuptools # только x86_64: BuildRequires: pciutils-devel BuildRequires: ncurses-devel BuildRequires: dwarves >= 1.23 # OpenZFS (kernel-only) build deps BuildRequires: autoconf BuildRequires: automake BuildRequires: libtool BuildRequires: pkgconfig BuildRequires: libuuid-devel BuildRequires: libblkid-devel BuildRequires: libtirpc-devel BuildRequires: libaio-devel BuildRequires: libattr-devel Requires: kmod Requires: filesystem Requires(pre): coreutils >= 9.1-7 Requires(preun): coreutils >= 9.1-7 Requires(post): coreutils >= 9.1-7 Requires(postun): coreutils >= 9.1-7 # Для корректного installonly поведения в менеджере пакетов Provides: installonlypkg(kernel) Provides: kernel-uname-r = %{uname_r} ExclusiveArch: x86_64 %description Ядро Linux — основная часть ОС, управляющая аппаратными ресурсами и предоставляющая базовые сервисы. Пакет содержит ядро и его модули. Инструменты perf/turbostat/cpupower поставляются в подпакетах. # ========================= Subpackages ========================= %package tools Summary: Набор инструментов ядра (perf, turbostat, cpupower) Group: System/Tools Requires: %{name} = %{version}-%{release} Requires: audit elfutils-libelf binutils-libs Requires: xz-libs Requires: slang Requires: python3 Requires: traceevent-plugins %ifarch x86_64 Requires: pciutils %endif %description tools Инструменты анализа производительности и питания: perf, turbostat, cpupower. # python-расширения perf отдельно %package python3-perf Summary: Python-модули и расширения для perf Group: Development/Languages Requires: %{name}-tools = %{version}-%{release} Requires: python3 %description python3-perf Python-биндинги и вспомогательные скрипты для perf (site-packages). %package devel Summary: Заголовки и файлы для сборки внешних модулей ядра (%{uname_r}) Group: Development/System Requires: %{name} = %{version}-%{release} Provides: kernel-devel = %{version}-%{release} Provides: kernel-devel-uname-r = %{uname_r} Obsoletes: kernel-devel < %{version}-%{release} %description devel Подготовленное дерево исходников/заголовков для сборки внешних модулей: /usr/src/linux-headers-%{uname_r} и симлинк /usr/lib/modules/%{uname_r}/build. Содержит include/*, arch/x86/include/*, scripts/, Module.symvers, .config, Makefile и инструменты objtool/fixdep, необходимые Kbuild. %package tools-devel Summary: Заголовки и файлы для сборки tools (%{uname_r}) Group: Development/System Requires: %{name}-devel = %{version}-%{release} %description tools-devel Файлы ядра для cpufreq.h cpuidle.h perf_dlfilter.h powercap.h. %if %{with gost} %package -n gost-source-%{name} Summary: GOST cryptographic algorithms sources Summary(ru): Исходники модулей ядра ГОСТ криптографии BuildArch: noarch Requires: build-essential %package crypto-gost Summary: Linux Kernel GOST crypto modules for %{uname_r} Group: System Environment/Kernel Requires: %{name} = %{version}-%{release} Requires: kmod # нужно, чтобы можно было держать несколько версий рядом под разные installonly ядра Provides: kernel-modules-gost = %{uname_r} %description crypto-gost Набор внешних (out-of-tree) модулей ядра linux-crypto, добавляющих поддержку российских криптоалгоритмов семейства GOST через Linux Kernel Crypto API. Модули должны быть собраны строго под вашу версию ядра (%{uname_r}). %endif %if %{with zfs} %package kmod-zfs Summary: Linux Kernel ZFS modules (OpenZFS) for %{uname_r} Group: System Environment/Kernel Requires: %{name} = %{version}-%{release} Requires: kmod Recommends: zfs = %{zfs_version} Recommends: zfs-utils = %{zfs_version} Recommends: zfs-zed = %{zfs_version} # удобно для поиска/политик, и чтобы явно было видно соответствие uname -r Provides: kernel-modules-zfs = %{uname_r} Provides: zfs-kmod-uname-r = %{uname_r} %description kmod-zfs Модули OpenZFS (только .ko), собранные строго под это ядро (%{uname_r}). Утилиты zpool/zfs поставляются отдельным пакетом. %endif %description -n gost-source-%{name} This is a set of Linux kernel modules implementing GOST cryptographic algorithms. %description -l ru -n gost-source-%{name} linux-crypto — набор внешних модулей ядра Linux (out-of-tree) для подсистемы Kernel Crypto API, добавляющий реализации криптографических алгоритмов ГОСТ. Состав реализованных алгоритмов: - ГОСТ 28147-89 (блочный шифр) и режимы/варианты применения (в т.ч. MAC “имитовставка”); - ГОСТ Р 34.11-94 (хэш), включая HMAC на его основе; - ГОСТ Р 34.12-2015: «Магма» и «Кузнечик», включая CMAC; - ГОСТ Р 34.11-2012 (Стрибог) — сборка может быть включена/отключена отдельно. %package drivers-gpu Summary: Kernel GPU Drivers Group: System Environment/Kernel Requires: %{name} = %{version}-%{release} %description drivers-gpu The Linux package contains the Linux kernel drivers for GPU %package drivers-sound Summary: Kernel Sound modules Group: System Environment/Kernel Requires: %{name} = %{version}-%{release} %description drivers-sound The Linux package contains the Linux kernel sound support # ========================= BUILD ========================= %prep %setup -q -n linux-%{version} %make_build ARCH=%{karch} mrproper cp -v %{SOURCE1} .config %make_build ARCH=%{karch} LOCALVERSION=%{localversion} olddefconfig echo "==== CONFIG DIFF AFTER olddefconfig ====" scripts/diffconfig %{SOURCE1} .config || : echo "========================================" install -m 700 -d certs if [ -n "${NICEOS_KERNEL_SIGNING_KEY:-}" ]; then if [ ! -r "$NICEOS_KERNEL_SIGNING_KEY" ]; then echo "ERROR: NICEOS_KERNEL_SIGNING_KEY is set but not readable: $NICEOS_KERNEL_SIGNING_KEY" >&2 exit 1 fi echo "Using external NiceOS kernel module signing key" >&2 cat "$NICEOS_KERNEL_SIGNING_KEY" %{SOURCE56} > certs/signing_key.pem chmod 0600 certs/signing_key.pem else echo "ERROR: NICEOS_KERNEL_SIGNING_KEY is not set" >&2 echo "Official NiceOS kernel builds must provide private key outside dist-git." >&2 exit 1 fi # linux-crypto sources (out-of-tree modules) # Распаковываем внутрь дерева ядра, чтобы KSRC указывал на собираемое ядро, а не на загруженное. mkdir -p linux-crypto # Вариант с strip-components=1 удобен для git-archive с корневым каталогом; fallback — без strip. tar -xf %{SOURCE1000} -C linux-crypto --strip-components=1 2>/dev/null || tar -xf %{SOURCE1000} -C linux-crypto # OpenZFS sources (out-of-tree, kernel modules) # Распаковываем рядом с деревом ядра: сборка будет указывать на KSRC текущей сборки, а не на uname -r билд-хоста. %if %{with zfs} tar -xf %{SOURCE2000} %patch 2000 -p1 -d zfs-%{zfs_version} # Fix OpenZFS lookup_bdev() detection only if kernel has moved the file if [ -f "%{_builddir}/linux-%{version}/block/bdev.c" ]; then sed -i 's@fs/block_dev\.c@block/bdev.c@g' zfs-%{zfs_version}/config/kernel-blkdev.m4 fi %endif %build # Ядро и модули (LOCALVERSION влияет на /usr/lib/modules/*) %make_build KBUILD_EXTMOD= KBUILD_BUILD_VERSION="%{release}" \ KBUILD_BUILD_HOST="niceos" \ ARCH=%{karch} LOCALVERSION=%{localversion} # После modules_prepare дерево готово к сборке внешних модулей krel=$(make -s -C %{_builddir}/linux-%{version} \ ARCH=%{karch} LOCALVERSION=%{localversion} kernelrelease) echo "Kernel release from tree: $krel" test "$krel" = "%{uname_r}" # linux-crypto (GOST) — собираем строго под текущее дерево ядра, независимо от uname -r сборочной системы %if %{with gost} sed -i \ -e 's|^ccflags-y[[:space:]]*:= -I[[:space:]]*$(PWD)|ccflags-y := -I$(src)|' \ -e 's|M=$(PWD)|M=$(CURDIR)|g' \ linux-crypto/Makefile %make_build -C %{_builddir}/linux-%{version} \ M=%{_builddir}/linux-%{version}/linux-crypto \ ARCH=%{karch} LOCALVERSION=%{localversion} \ CONFIG_CRYPTO_STREEBOG=n \ modules %endif %if %{with zfs} pushd zfs-%{zfs_version} ./autogen.sh ./configure \ --with-config=kernel \ --with-linux=%{_builddir}/linux-%{version} \ --with-linux-obj=%{_builddir}/linux-%{version} # Собираем модули %make_build -C module \ KERNEL_SRC=%{_builddir}/linux-%{version} \ KERNEL_BUILD=%{_builddir}/linux-%{version} popd %endif # perf: отключаем Werror и самые проблемные предупреждения %make_build -C tools/perf \ PYTHON=python3 \ NO_LIBPERL=1 NO_SLANG=1 NO_GTK2=1 \ WERROR=0 NO_WERROR=1 \ EXTRA_CFLAGS='-Wno-error=alloc-size -Wno-error=calloc-transposed-args -Wno-error=deprecated-declarations' %make_build ARCH=%{karch} -C tools turbostat cpupower PYTHON=python3 # ========================= INSTALL ========================= %install # Модули ядра %make_build KBUILD_EXTMOD= ARCH=%{karch} INSTALL_MOD_PATH=%{buildroot} LOCALVERSION=%{localversion} modules_install # Автозагрузка: грузим верхний модуль zfs, зависимости подтянутся автоматически %if %{with zfs} install -m 755 -d %{buildroot}%{modulesloaddir} cat > %{buildroot}%{modulesloaddir}/zfs-%{uname_r}.conf <<'EOF' zfs EOF %endif # Образ ядра и сопутствующие файлы # Для installonly НЕ ставим общие /boot/vmlinuz, /boot/System.map, /boot/config (иначе конфликт версий). install -m 755 -d %{buildroot}%{bootdir} install -m 644 arch/%{archdir}/boot/bzImage %{buildroot}%{kimg} install -m 400 System.map %{buildroot}%{sysmap} install -m 644 .config %{buildroot}%{kconf} # modprobe.d пример (версионируем, чтобы не конфликтовало между installonly ядрами) install -m755 -d %{buildroot}/etc/modprobe.d cat > %{buildroot}/etc/modprobe.d/usb-%{uname_r}.conf <<'EOF' install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true EOF # ---------- kernel-devel (linux-headers) ---------- install -m 755 -d %{buildroot}%{_usrsrc}/linux-headers-%{uname_r} # Register myself to initramfs (директории общие, конфликтов не создают) mkdir -p %{buildroot}%{_localstatedir}/lib/initramfs/kernel # Cleanup dangling symlinks from modules_install (создадим свои в -devel) rm -rf %{buildroot}%{_modulesdir}/source \ %{buildroot}%{_modulesdir}/build # Копируем файлы, необходимые Kbuild для внешних модулей (включая generated/config) hdrdst=%{buildroot}%{_usrsrc}/linux-headers-%{uname_r} # Базовые Makefile/Kconfig/скрипты find . \ \( -name 'Makefile*' \ -o -name 'Kbuild*' \ -o -name 'Kconfig*' \ -o -name '*.pl' \ -o -name '*.sh' \ -o -name '*.awk' \ -o -name '*.lds' \) \ -type f -print0 | xargs -0 -r cp --parents -t "$hdrdst" # include + arch includes find include arch/%{archdir}/include -type f -print0 \ | xargs -0 -r cp --parents -t "$hdrdst" # generated (после modules_prepare) find include/generated include/config arch/%{archdir}/include/generated -type f -print0 2>/dev/null \ | xargs -0 -r cp --parents -t "$hdrdst" # scripts (включая modpost/genksyms и прочее) find scripts -type f -print0 \ | xargs -0 -r cp --parents -t "$hdrdst" # Символы экспортов install -m 644 Module.symvers "$hdrdst/Module.symvers" # .config туда, где его ожидают внешние сборки install -m 644 .config "$hdrdst/.config" # после сборки ядра: objtool и fixdep (явно) install -m 755 -d "$hdrdst/tools/objtool" install -m 755 tools/objtool/objtool "$hdrdst/tools/objtool/objtool" install -m 755 -d "$hdrdst/scripts/basic" install -m 755 scripts/basic/fixdep "$hdrdst/scripts/basic/fixdep" # modpost/genksyms (если собраны) if [ -x scripts/mod/modpost ]; then install -m 755 -d "$hdrdst/scripts/mod" install -m 755 scripts/mod/modpost "$hdrdst/scripts/mod/modpost" fi if [ -x scripts/genksyms/genksyms ]; then install -m 755 -d "$hdrdst/scripts/genksyms" install -m 755 scripts/genksyms/genksyms "$hdrdst/scripts/genksyms/genksyms" fi # Ссылки /lib/modules//{build,source} -> /usr/src/linux-headers- ln -snf "%{_usrsrc}/linux-headers-%{uname_r}" "%{buildroot}%{_modulesdir}/build" ln -snf "%{_usrsrc}/linux-headers-%{uname_r}" "%{buildroot}%{_modulesdir}/source" %if %{with gost} # linux-crypto (GOST) — устанавливаем модули в отдельный подкаталог extra/ %make_build -C %{_builddir}/linux-%{version} \ M=%{_builddir}/linux-%{version}/linux-crypto \ INSTALL_MOD_PATH=%{buildroot} \ INSTALL_MOD_DIR=extra/linux-crypto-gost \ modules_install # Автозагрузка модулей (modules-load.d), как рекомендовано в README linux-crypto install -m 755 -d %{buildroot}%{modulesloaddir} cat > %{buildroot}%{modulesloaddir}/linux-crypto-gost-%{uname_r}.conf <<'EOF' # GOST crypto modules gost28147_generic gosthash94_generic magma_generic kuznyechik_generic # streebog_generic EOF %endif # OpenZFS — установка модулей в /lib/modules/%{uname_r}/extra/zfs # В buildroot depmod запускать не нужно (и часто вредно), depmod делаем в %post. %if %{with zfs} krel=$(make -s -C %{_builddir}/linux-%{version} \ ARCH=%{karch} LOCALVERSION=%{localversion} kernelrelease) test "$krel" = "%{uname_r}" %make_build -C zfs-%{zfs_version}/module \ KERNEL_SRC=%{_builddir}/linux-%{version} \ KERNEL_BUILD=%{_builddir}/linux-%{version} \ INSTALL_MOD_PATH=%{buildroot} \ INSTALL_MOD_DIR=%{zfs_moddir} \ DEPMOD=/usr/bin/true \ modules_install %endif # Устанавливаем perf напрямую из подкаталога, с теми же флагами %make_build -C tools/perf \ DESTDIR=%{buildroot} prefix=%{_prefix} PYTHON=python3 \ NO_LIBPERL=1 NO_SLANG=1 NO_GTK2=1 \ WERROR=0 NO_WERROR=1 \ EXTRA_CFLAGS='-Wno-error=alloc-size -Wno-error=calloc-transposed-args -Wno-error=deprecated-declarations' \ install-bin install-python_ext %make_build -C tools ARCH=%{karch} DESTDIR=%{buildroot} \ prefix=%{_prefix} mandir=%{_mandir} turbostat_install cpupower_install PYTHON=python3 # dracut conf (версионируем, чтобы не конфликтовало между installonly ядрами) install -m 755 -d %{buildroot}/usr/lib/dracut/dracut.conf.d install -m 644 %{SOURCE19} %{buildroot}/usr/lib/dracut/dracut.conf.d/%{name}-%{uname_r}.conf # GOST sources (версионируем, чтобы не конфликтовало между installonly ядрами) install -pDm0644 %{SOURCE1000} %{buildroot}%{kernel_srcdir}/%{name}-%{uname_r}.tar.gz install -pDm0644 %{SOURCE1001} %{buildroot}%{kernel_srcdir}/build_gost_kernel-%{uname_r}.md # ========================= FILES ========================= %triggerin -- initramfs mkdir -pv %{_sharedstatedir}/rpm-state/initramfs/pending touch %{_sharedstatedir}/rpm-state/initramfs/pending/%{uname_r} echo "initrd generation of kernel %{uname_r} will be triggered later" >&2 %post /sbin/depmod -a %{uname_r} || : mkdir -p %{_localstatedir}/lib/rpm-state/initramfs/pending : > %{_localstatedir}/lib/rpm-state/initramfs/pending/%{uname_r} %if %{with gost} %post crypto-gost /sbin/depmod -a %{uname_r} || : %postun crypto-gost [ -d "/lib/modules/%{uname_r}" ] && /sbin/depmod -a %{uname_r} || : %endif %if %{with zfs} %post kmod-zfs /sbin/depmod -a %{uname_r} || : %postun kmod-zfs [ -d "/lib/modules/%{uname_r}" ] && /sbin/depmod -a %{uname_r} || : %endif %post drivers-gpu /sbin/depmod -a %{uname_r} || : %post drivers-sound /sbin/depmod -a %{uname_r} || : %posttrans set -eu bootdir="%{bootdir}" kver="%{uname_r}" kimg="%{kimg}" initrd="%{initrd}" grubcfg="/boot/grub2/grub.cfg" # 1) Гарантируем initramfs под конкретный uname_r if [ -x /usr/bin/dracut ]; then /usr/bin/dracut --force --kver "$kver" "$initrd" || : fi # 2) Обновляем GRUB (BLS нет → kernel-install не используем вообще) if [ -x /usr/sbin/grub2-mkconfig ] && [ -d /boot/grub2 ]; then /usr/sbin/grub2-mkconfig -o "$grubcfg" || : fi # 2.1) Сделать новое ядро дефолтным (без grubby) # Ищем menuentry-id для "Linux $kver" и пишем его в saved_entry в grubenv grubenv="" [ -f /boot/grub2/grubenv ] && grubenv="/boot/grub2/grubenv" [ -z "$grubenv" -a -f /boot/grub/grubenv ] && grubenv="/boot/grub/grubenv" entry_id="$( awk -v k="$kver" ' $0 ~ /^menuentry / && $0 ~ ("Linux " k) { n=split($0, a, "'\''"); for (i=1; i<=n; i++) if (a[i] ~ /^gnulinux-/) { print a[i]; exit } } ' "$grubcfg" 2>/dev/null || true )" if [ -n "${entry_id:-}" ]; then if [ -x /usr/sbin/grub2-set-default ]; then /usr/sbin/grub2-set-default "$entry_id" || : elif [ -n "$grubenv" ] && [ -x /usr/bin/grub2-editenv ]; then /usr/bin/grub2-editenv "$grubenv" set "saved_entry=$entry_id" || : fi fi # (опционально) grubby: можно добавить entry явно, но mkconfig обычно достаточно. if [ -x /usr/sbin/grubby ]; then /usr/sbin/grubby \ --add-kernel="$kimg" \ --initrd="$initrd" \ --title="NiceOS Linux ($kver)" \ --copy-default || : fi # 3) Обратная совместимость: “текущие” симлинки (не пакетим их в %files) ln -snf "vmlinuz-$kver" "$bootdir/vmlinuz" 2>/dev/null || : ln -snf "initramfs-$kver.img" "$bootdir/initramfs.img" 2>/dev/null || : ln -snf "System.map-$kver" "$bootdir/System.map" 2>/dev/null || : ln -snf "config-$kver" "$bootdir/config" 2>/dev/null || : # dracut conf link для старых обвязок (если надо) if [ -d /usr/lib/dracut/dracut.conf.d ]; then if [ -f "/usr/lib/dracut/dracut.conf.d/%{name}-$kver.conf" ]; then ln -snf "%{name}-$kver.conf" "/usr/lib/dracut/dracut.conf.d/%{name}.conf" 2>/dev/null || : fi fi exit 0 %postun set -eu bootdir="%{bootdir}" kver="%{uname_r}" kimg="%{kimg}" grubcfg="/boot/grub2/grub.cfg" # $1 == 0 означает erase (а не upgrade) if [ "${1}" -eq 0 ]; then # 1) Удаляем entry через grubby, если он есть (удобно, но не обязательно) if [ -x /usr/sbin/grubby ]; then /usr/sbin/grubby --remove-kernel="$kimg" || : fi # 2) Пересобираем grub.cfg (главное!) if [ -x /usr/sbin/grub2-mkconfig ] && [ -d /boot/grub2 ]; then /usr/sbin/grub2-mkconfig -o "$grubcfg" || : fi # 3) Если “текущие” симлинки указывали на удалённое — переназначим на самый новый оставшийся if [ -L "$bootdir/vmlinuz" ] && [ ! -e "$bootdir/$(readlink "$bootdir/vmlinuz")" ]; then newest="$(ls -1 "$bootdir"/vmlinuz-* 2>/dev/null | sort -V | tail -n 1 || true)" [ -n "$newest" ] && ln -snf "$(basename "$newest")" "$bootdir/vmlinuz" || : fi if [ -L "$bootdir/initramfs.img" ] && [ ! -e "$bootdir/$(readlink "$bootdir/initramfs.img")" ]; then newest="$(ls -1 "$bootdir"/initramfs-*.img 2>/dev/null | sort -V | tail -n 1 || true)" [ -n "$newest" ] && ln -snf "$(basename "$newest")" "$bootdir/initramfs.img" || : fi if [ -L "$bootdir/System.map" ] && [ ! -e "$bootdir/$(readlink "$bootdir/System.map")" ]; then newest="$(ls -1 "$bootdir"/System.map-* 2>/dev/null | sort -V | tail -n 1 || true)" [ -n "$newest" ] && ln -snf "$(basename "$newest")" "$bootdir/System.map" || : fi if [ -L "$bootdir/config" ] && [ ! -e "$bootdir/$(readlink "$bootdir/config")" ]; then newest="$(ls -1 "$bootdir"/config-* 2>/dev/null | sort -V | tail -n 1 || true)" [ -n "$newest" ] && ln -snf "$(basename "$newest")" "$bootdir/config" || : fi fi exit 0 %files %license COPYING %dir %{_localstatedir}/lib/initramfs %dir %{_localstatedir}/lib/initramfs/kernel /usr/lib/dracut/dracut.conf.d/%{name}-%{uname_r}.conf /boot/vmlinuz-%{uname_r} /boot/System.map-%{uname_r} /boot/config-%{uname_r} %{_modulesdir} %dir /etc/modprobe.d /etc/modprobe.d/usb-%{uname_r}.conf %exclude %{_modulesdir}/build %exclude %{_modulesdir}/source %if %{with gost} %exclude %{_modulesdir}/extra/linux-crypto-gost %endif %if %{with zfs} %exclude %{_modulesdir}/%{zfs_moddir} %endif %exclude %{_modulesdir}/kernel/drivers/gpu %exclude %{_modulesdir}/kernel/sound %if %{with gost} %files crypto-gost %defattr(-,root,root) %{_modulesdir}/extra/linux-crypto-gost %{modulesloaddir}/linux-crypto-gost-%{uname_r}.conf %endif %if %{with zfs} %files kmod-zfs %defattr(-,root,root) %{_modulesdir}/%{zfs_moddir} %{modulesloaddir}/zfs-%{uname_r}.conf %endif # ---------- tools (perf + cpupower + turbostat) ---------- %files tools %defattr(-,root,root) # perf %{_bindir}/perf %{_sysconfdir}/bash_completion.d/perf %{_libexecdir}/perf-core %{_datadir}/perf-core %{_docdir}/perf-tip # cpupower / turbostat %{_bindir}/cpufreq-bench_plot.sh %{_bindir}/cpupower %{_bindir}/trace %{_bindir}/turbostat %{_libdir}/libcpupower.so* %{_docdir}/packages/cpupower %{_datadir}/bash-completion/completions/cpupower %config(noreplace) %{_sysconfdir}/cpufreq-bench.conf %{_sbindir}/cpufreq-bench %{_datadir}/locale/*/LC_MESSAGES/cpupower.mo %{_mandir}/man1/cpupower* %{_mandir}/man8/turbostat* # ---------- python3-perf ---------- %files python3-perf %defattr(-,root,root) %{python3_sitelib}/* # ---------- devel (linux-headers) ---------- %files devel %defattr(-,root,root) %{_modulesdir}/build %{_modulesdir}/source %{_usrsrc}/linux-headers-%{uname_r} %files tools-devel %{_includedir}/cpufreq.h %{_includedir}/cpuidle.h %{_includedir}/perf/perf_dlfilter.h %{_includedir}/powercap.h %files drivers-gpu %defattr(-,root,root) %{_modulesdir}/kernel/drivers/gpu %files drivers-sound %defattr(-,root,root) %{_modulesdir}/kernel/sound %files -n gost-source-%{name} %{kernel_srcdir}/%{name}-%{uname_r}.tar.gz %{kernel_srcdir}/build_gost_kernel-%{uname_r}.md %changelog * Sat May 09 2026 Stanislav Belikov - 6.12.87-1 - Update Linux kernel from 6.12.65 to 6.12.87. - Pull latest upstream 6.12.y longterm stable fixes from kernel.org. - Include security-sensitive networking/IPsec fixes, including xfrm ESP handling for shared skb fragments. - Include stable fixes for networking, netfilter/nftables, IPv6, bridge, bonding, MPTCP, RXRPC, QRTR and MCTP. - Include stable fixes for memory management, scheduler, CPU frequency handling, crypto, block/storage, filesystems and driver core. - Include stable driver fixes for DRM/AMDGPU, USB, ALSA, SPI, PHY and platform drivers. - Refresh NiceOS host kernel configuration for Linux 6.12.87. - Keep kernel ABI package provides based on the full NiceOS kernel release string. * Mon Mar 31 2025 Stanislav Belikov - 6.12.65-1 - Ядро: сборка с согласованным LOCALVERSION - Добавлены подпакеты: tools (perf/turbostat/cpupower), python3-perf, cpupower-libs, turbostat - Реализована сборка и установка perf (+python_ext), cpupower, turbостат из tools