NOTE:为方便起见,以下命令都在root模式下运行
一:准备编译环境
1 2 3 |
pacman -S xmlto kmod inetutils bc libelf git make gcc base-devel |
二:创建工作目录
1 2 3 |
mkdir ~/kernelbuild |
三:下载内核源码并解压
- 下载
12345678cd ~/kernelbuildwget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.0.13.tar.signwget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.0.13.tar.gz#笔者写这篇文章时所用的最新版本内核是5.0.13的,如果需要下载其他版本,请自行修改URL下载对应版本#或者到网页上寻找https://mirrors.edge.kernel.org/pub/linux/kernel/ - 解压
1234#先解压gz, gz文件替换成你下载的tar xfv linux-5.0.13.tar.gz - 跳过验证部分,若要执行验证步骤请参考原文(笔者验证时出现了一些问题,故直接跳过):https://wiki.archlinux.org/index.php/Kernel/Traditional_compilation#Preparation
- 修改所需变更的源码
四:配置
- 保证内核树的绝对干净
123cd linux-5.0.13/
1234make cleanmake mrproper - 导出当前内核配置
123zcat /proc/config.gz > .config
打开.config找到 CONFIG_LOCALVERSION在引号中填入版本名,注意不要与 /usr/lib/modules/下的文件夹有重复,不然会覆盖掉原先的内核。
五:编译安装
- 8线程全速运行
1234make -j8#时间有点久,笔者用了40多分钟 - 安装内核模块
123make modules_install - 拷贝内核到 /boot 目录
1234#目标内核命名随意,但不要覆盖掉目标目录的cp -v arch/x86_64/boot/bzImage /boot/vmlinuz-linux-mine
一般都是64位机器,32位的就不写了,x86_64换成x86就是32位系统的了。
六:制作初始化内存盘
- 复制模板preset文件
123cp /etc/mkinitcpio.d/linux.preset /etc/mkinitcpio.d/linux-mine.preset - 修改preset文件
123vim /etc/mkinitcpio.d/linux-mine.preset - 举例
1234567891011121314151617#以下是笔者的配置,注意vmlinux-linux-mine来自原来的bzImage#initramfs和fallback镜像改成你所需要的名字,注意不要和/boot下的重复ALL_config="/etc/mkinitcpio.conf"ALL_kver="/boot/vmlinuz-linux-mine"PRESETS=('default' 'fallback')#default_config="/etc/mkinitcpio.conf"default_image="/boot/initramfs-linux-mine.img"#default_options=""#fallback_config="/etc/mkinitcpio.conf"fallback_image="/boot/initramfs-linux-mine-fallback.img"fallback_options="-S autodetect" - 自动生成initramfs镜像
1234#linux-mine为刚刚在mkinitcpio.d下创建的文件(复制过去的)mkinitcpio -p linux-mine
也可以手动生成
123mkinitcpio -k <kernelversion> -g /boot/initramfs-<file name>.img
七:生成引导文件
- 用grub-mkconfig命令生成引导文件
123grub-mkconfig > /boot/grub/grub.cfg
八:相关问题
1. 生成的镜像无法引导成功
笔者第一次启动的时候确实失败了,切换到原来的内核,删除掉定制内核相关文件,用mkinitcpio重新生成后就正常了。其他问题暂时没有遇到,姑且不论。
2. 新内核造成相关软件运行异常
有些软件是需要一些驱动的,新安装的内核不包含这些驱动,就会造成软件运行异常,比如Virtualbox,安装对应软件的dkms版本,Dkms会将软件相关驱动编译进内核,重启就可以正常运行了。
如Virtualbox的:
1 2 3 |
pacman -S virtualbox-host-dkms |
再加载驱动模块
1 2 3 4 5 6 |
# 请用root权限执行 modprobe vboxguest modprobe vboxvideo vboxreload |