若能避开猛烈的欢喜,自然也不会有悲痛的来袭。

Kernel

Debian9.x内核编译遇到的一些坑-

Rokas Yang阅读(4324)

前言

最近装完debian9.6发现系统没声音,然后编译安装alsa声卡驱动发现内核太老不支持,所以只能把内核编译到最新版本。(这里赘述一句,电脑硬件太新,而内核太老从而出现系统不识别硬件的状况,以至于找不到驱动程序均属于正常情况)目前内核最新stable版本为4.20.3,把内核更新后发现声卡正常了,于是便有了这篇文章。

1.下载内核

wget -q https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.3.tar.xz

你也可以直接去Linux内核官网(www.kernel.org)下载你需要的内核版本,如果你不知道自己需要什么那么建议下载最新stable版(目前最新stable版本为4.20.3,根据你目前最新来下载),如果喜欢寻求刺激可以下载mainline版本。
你要考虑到的是,内核是整个系统的核心,为应用软件和硬件提供了一套简洁、统一的接口,以及负责调度系统函数掌控进程生命周期、进程间通信、信号处理与发送、进程优先级、谦让度等等。如果你编译的是mainline版本内核,导致某天系统黑屏并且出现kernel panic,那么恭喜你!you need reinstall the system!内核错误是类Unix系统最高等级错误,内核一旦出错,整个系统毁于一旦,高风险高收益。

2.解压内核

tar xvf linux-4.20.3.tar.xz

3.复制旧内核配置文件到新内核文件下

cp -a /boot/config-$(uname -r).config linux-4.20.3/.config

4.安装内核编译必要组件

apt-get update
apt install bison flex -y

5.编译

make oldconfig

如果编译过程中遇到报错,比如说"缺xxx组件"、"command not found",这时候你需要去手动安装这些软件包,最聪明的做法是:

apt-cache search packages

因为有些组件可能包含在某个大包里面,你直接apt安装它是找不到的,需要通过上面那条搜索命令来查看组件在哪个包里,然后安装此包,你也可以通过aptitude命令来搜索并安装软件包:

aptitude search packages
aptitude install pakages

make oldconfig过程使用的是和用户交互界面,保持默认即可,一路回车,直到make oldconfig不报错这一步才算完成。

6.配置内核

make menuconfig

如果你不清楚你需要编译哪些内核组件,不需要修改它的默认勾选,save保存退出即可。
此步骤使用的是GUI交互界面,这种GUI交互界面很常见,shell中调用的是dialog库实现,我之前也写过,觉得没有CLI模式好用和强大,但是可以提升用户体验啊!不然需要Microsoft干嘛! :xd

7.正式编译内核

make -j 2
makefile : 958 : *** "cannot gerater ORC metadata for CONFIG_UNWINDER_ORC=y,please install libelf-dev,libelf-devel or elfulils-libels-devel"。stop

报如上错误或者其他错误直接根据提示安装包名即可,debian软件源我用的中科大源,这里只安装libelf-dev

apt-get install libelf-dev -y

make -j 2指定使用双核心编译,这样可以节省编译时间,指定多少核具体要看你CPU核数有多少以及CPU温度是否维持在正常水平

$ head -n 1 < <(awk '/cores/{print $4}' /proc/cpuinfo)
6

如上CPU为6核心,我试过用make -j 4用四核心来编译,结果CPU温度飙到95-98度,因为编译需要花费几十分钟甚至一两个小时,长时间把CPU温度维持在这个范围内,对硬件多少都有损害,毕竟笔记本CPU焊在主板上,为你的主板考虑考虑,于是立马改成make -j 2来编译,那么会有人问我,怎么查看CPU温度呢,我用的是sensors:

apt-get install lm-sensors
sensors-detect
service kmod start

然后你可以每五秒监视一次CPU温度:

while true;do sensors && sleep 5;done

如果你不在乎温度及核心的话,这个步骤可以省略,直接make即可,默认使用一核心编译,只是时间上的差距而已。

8.安装内核模块

make modules_install

这个步骤很快,大概不到十秒

9.安装内核

make install

需要注意的是,如果你的系统单独分了一个/boot分区,那么大小尽量大于1G,因为内核编译需要在里面写入新内核配置文件及必要组件。

10.更新grub

update-grub

11.重启系统,检查内核版本

uname -r
4.20.3

12.旧内核卸载、磁盘清理

到此编译内核完成,df -h发现磁盘空间多了十几个G,此时你可以卸载旧内核来腾出磁盘空间,进入到/boot目录下,删除旧内核版本用的 conifg 、initrd.img 、System.map 、vmlinuz 等文件,进入到 /lib/modules/ 删除旧版本对应文件,比如我的旧内核是4.9.0.8:

rm -rf /lib/modules/4.9.0.8
apt autoclean
apt autoremove

至此内核编译圆满结束,官方使用的编译方式是make-kpkg,即通过deb包来完成内核升级,相对来说比较简单,但是整个过程你无法控制,因为包都是封装好的。而从源码编译你可以选择你需要的编译组件,甚至加入你自己写的驱动,把驱动写进内核配置文件再编译会发现开机速度提升不少。Windows把桌面写进了内核,并且闭源,这就是为什么一开机就占用很大系统资源,这里就不黑Windows了:XD。升级完内核重启后我仔细观察了一段时间,内存占用没有超过1.3G(%8左右),并且整个系统流畅度也非常丝滑(非心理作用)。

如果在编译过程中遇到预料之外的错误,并且不知道如何解决,首先建议自行百度、谷歌关键词,因为前人走过的路现成给你铺好了。如果还是解决不了,很乐意发邮件给我,我们一起探讨,尽量在1-3天内给予答复,联系方式在网站底部,同时欢迎订阅本站。

Centos6.x/7.x升级内核版本

Rokas Yang阅读(1997)

前言

由于安装Docker时,Docker支持

  • CentOS 7 (64-bit)
  • CentOS 6.5 (64-bit) 或更高的版本

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本

CentOS 7 的内核一般都是3.10的,而CentOS 6.X 的内核一般都是2.6,在2.6的内核下,Docker运行会比较卡,所以一般会选择升级到3.10版本。

升级内核的方式,网上有很多方法是下载内核然后编译,这样需要安装很多必备的环境和工具,比较麻烦,但是也有助于我们了解内核的编译

编译内核方式升级:
https://segmentfault.com/a/1190000000733628#articleHeader13

1. 查看当前内核版本

[root@linux-code.com ~]# more /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
[root@linux-code.com ~]# uname -a
Linux localhost.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

2. 导入public key

[root@linux-code.com ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

3. 安装ELRepo到CentOS

可以去http://elrepo.org/tiki/tiki-index.php 选择要安装的ELRepo

[root@linux-code.com ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm

4. 安装 kernel-lt(lt=long-term)

[root@linux-code.com ~]# yum --enablerepo=elrepo-kernel install kernel-lt -y

或者 安装kernel-ml(ml=mainline)

[root@linux-code.com ~]# yum --enablerepo=elrepo-kernel install kernel-ml -y

5. 编辑grub.conf文件,修改Grub引导顺序

[root@linux-code.com ~]# vim /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/vda1 console=ttyS0 console=tty0 printk.time=1 panic=5
# initrd /boot/initrd-[generic-]version.img
#boot=/dev/sda
default=1   ##此处为应该修改的值
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1
terminal --timeout=3 console serial
title CentOS (2.6.32-696.6.3.el6.x86_64)
root (hd0,0)
kernel /boot/vmlinuz-2.6.32-696.6.3.el6.x86_64 ro root=/dev/vda1 console=ttyS0 console=tty0 printk.time=1 panic=5 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=C rd_NO_MD SYSFONT=latarcyrheb-sun16 rd_NO_LVM crashkernel=auto rd_NO_DM
initrd /boot/initramfs-2.6.32-696.6.3.el6.x86_64.img
title CentOS (2.6.32-504.30.3.el6.x86_64)
root (hd0,0)

因为一般新安装的内核在第一个位置,所以设置default=0,表示启动新内核

6. 重启

查看此时内核版本:

[root@linux-code.com ~]# uname -r
3.10.105-1.el6.elrepo.x86_64

成功!