材料
CentOS7,kernel-3.10.0.tar.gz,rpm打包工具
yum install rpmdevtools
步骤
0.其实最方便的方法是解压内核源码后进入源码文件夹一键make rpm/make binrpm-pkg,但是bug太多,所以手动编写spec文件来打包。
1.建立打包过程需要的空间,一般是
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
往各个文件夹放入对应的文件。BUILD放解压后的源码文件夹;SOURCES放源码压缩包(tar.gz);SPECS放打包脚本(.spec),这里用内核源码里自带的mkspec脚本来生成一个比较粗糙的spec脚本
bash ../linux-xxx/scripts/package/mkspec > /rpmbulid/SPECS/kernel.spec
2.按需修改spec脚本
①如果自己用的话,version和release其实无所谓,只不过Source后面一定要定位到SOURCES文件夹下的文件;
②cp arch/x86/boot/bzImage $RPM_BUILD_ROOT/boot/vmlinuz-3.10.0;x86是bzImage,arm是Image.gz,用这些文件的具体位置替换掉宏定义
③cp System.map与.config后面的重新命名最好统一(在新的服务器上装rpm后/boot目录下的文件都是这个命名)
Name: kernel
Summary: The Linux Kernel
Version: 3.10.0
Release: 3.10.0
License: GPL
Group: System Environment/Kernel
Vendor: The Linux Community
URL: http://www.kernel.org
Source: kernel-3.10.0.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{PACKAGE_VERSION}-root
Provides: kernel-3.10.0
%define __spec_install_post /usr/lib/rpm/brp-compress || :
%define debug_package %{nil}
%description
The Linux Kernel, the operating system core itself
%package headers
Summary: Header files for the Linux kernel for use by glibc
Group: Development/System
Obsoletes: kernel-headers
Provides: kernel-headers = %{version}
%description headers
Kernel-headers includes the C header files that specify the interface
between the Linux kernel and userspace libraries and programs. The
header files define structures and constants that are needed for
building most standard programs and are also needed for rebuilding the
glibc package.
%prep
%setup -q
%build
make clean && make %{?_smp_mflags}
%install
%ifarch ia64
mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib/modules
mkdir -p $RPM_BUILD_ROOT/lib/firmware
%else
mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib/modules
mkdir -p $RPM_BUILD_ROOT/lib/firmware
%endif
INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{?_smp_mflags} KBUILD_SRC= modules_install
%ifarch ia64
cp $KBUILD_IMAGE $RPM_BUILD_ROOT/boot/efi/vmlinuz-3.10.0
ln -s efi/vmlinuz-3.10.0 $RPM_BUILD_ROOT/boot/
%else
%ifarch ppc64
cp vmlinux arch/powerpc/boot
cp arch/powerpc/boot/$KBUILD_IMAGE $RPM_BUILD_ROOT/boot/vmlinuz-3.10.0
%else
cp arch/x86/boot/bzImage $RPM_BUILD_ROOT/boot/vmlinuz-3.10.0
%endif
%endif
make %{?_smp_mflags} INSTALL_HDR_PATH=$RPM_BUILD_ROOT/usr KBUILD_SRC= headers_install
cp System.map $RPM_BUILD_ROOT/boot/System.map-3.10.0
cp .config $RPM_BUILD_ROOT/boot/config-3.10.0
%ifnarch ppc64
cp vmlinux vmlinux.orig
bzip2 -9 vmlinux
mv vmlinux.bz2 $RPM_BUILD_ROOT/boot/vmlinux-3.10.0.bz2
mv vmlinux.orig vmlinux
%endif
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr (-, root, root)
%dir /lib/modules
/lib/modules/
/lib/firmware
/boot/*
%files headers
%defattr (-, root, root)
/usr/include
3.运行spec脚本打包
rpmbuild -bb --with baseonly --without debug --without debuginfo --target=`uname -m` kernel.spec
4.安装rpm包
rpm –ivh --force kernel-xxx.rpm
rpm -qa | grep kernel #查看是否安装成功
rpm -e kernel-xxx #卸载
5.更新引导
先检查一下/boot下是否有内核对应的initramfs文件,若无则利用dracut工具手动生成,再更新引导项,接着reboot重启就行了。(initramfs-后缀与System.map一致,和之前kernel.spec里面的一致)
dracut -f /boot/initramfs-xxx.img xxx #生成initramfs
grub2-mkconfig -o /boot/grub2/grub.cfg #查看所有可用内核
grub2-set-default "CentOS Linux (xxx) 7 (Core) #修改开机自启用的内核
6.无法启动,遇到dracut-initqueue timeout,网上大部分情况时用usb引导的时候出现这个问题,我们这里出现的原因八成是initramfs文件没生成好,所以重启以之前的内核进入系统,重新制作initramfs,参考https://zhuanlan.zhihu.com/p/281022253