更新内核 联网默认版 非最新
1:查看系统版本
# uname -r
或者
#rpm -qa |grep kernel
或者
#rpm -q | grep kernel
2.更新内核
#yum -yinstall kernel
或者全局更新
#yum update
3.删除升级内核
#rpm -qa |grep kernel
或者
# rpm -q |grep kernel
然后
#yum remove +内核名称
或者
#rpm -e +内核名称
或者
安装yum-utls: yuminstall -y yum-utils
设置你想要保留多少旧的内核,比如我想保留两个:sudo package-cleanup--oldkernels --count=2
再次用rpm -q kernel查看内核信息,只剩最新的两个
4.修改文件修改数字几 系统保留内核数量
# vi /etc/yum.conf
修改该项值
installonly_limit=2 // 系统保留2个内核
5.修改Grub引导顺序
安装完成后,需要修改Grub引导顺序,让新安装的内核作为默认内核。
编辑 grub.conf文件,
sudo vim /etc/grub.conf
数一下刚刚新安装的内核在哪个位置,从0开始,然后设置default为那个数字,一般新安装的内核在第一个位置,所以设置default=0。
6.最后重启查看
#rpm -qa kernel
更新内核 软件安装指定版本
1.确定发行版的内核源码
# cat /etc/redhat-release
然后
如果是centos,则下载地址为类似如下的地址:
http://vault.centos.org/6.9/os/Source/SPackages/kernel-2.6.32-696.el6.src.rpm
2.导入系统 使用如下命令安装源码包
如果机器不能联网,可以下载现有内核包到本地机器,直接在本地更新
1.从http://ftp.scientificlinux.org/linux/scientific/7.0/x86_64/updates/security/下载需要的颁布rpm
2. 登录本地服务器下载
[email protected]:/home/worker/kernel-3.10.0-123.1.2.el7.x86_64.rpm
[email protected]'spassword:
kernel-3.10.0-123.1.2.el7.x86_64.rpm 100% 29MB 28.9MB/s 00:00
3.[root@localhost os2]# yum installkernel-3.10.0-123.1.2.el7.x86_64.rpm
或者
#rpm -i kernel-2.6.32-696.el6.src.rpm
Warning:user mockbuild does not exist.using root
解决办法:
# yum install mock
# useradd -s /sbin/nologin mockbuild
首先是安装mock,由于mock是在epel仓库里的,所以还需要先装epel仓库
1 2 |
|
yum install epel-release yum install mock |
安装完成后,在 /usr/src/redhat/目录下会生成一些目录:如果是centos,相关目录是生成在 /root/rpmbuild目录下。
例如,BUILD SOURCES SPECS等。
其中SOURCES 目录下,应该是内核源码文件与补丁等。
以red hat为例,SOURCES 中包含:
linux-2.6.18.tar.bz2 ---- 标准的Linux内核源码包
一大堆.patch的文件 ---- 这些是源码补丁文件
若干个.config ---- 这些是内核配置文件
其他的文件 ---- 在下目前也不理解 :)
3.获得内核源码
使用如下命令得到完整的redhatlinux内核源码
cd /root/rpmbuild/SPECS
rpmbuild-bp --target=$(uname -m) kernel.spec
如果提示
xmltois needed by kernel-2.6.32-696.el6.x86_64
解决方法
#yuminstall xmlto
什么isneeded就yum install什么。
如果一切顺利,那么在/root/rpmbuild/BUILD/kernel-2.6.32-696.el6/linux-2.6.32-696.el6.x86_64目录中,就会生成一份内核源码。这个源码,是在标准Linux内核源码的基础上,打上了RedHat(或centos/fedora)的补丁及相关配置的源码。
4. 安装前配置
#cd/root/rpmbuild/BUILD/
#yuminstall ncurses-devel
//make[-jn]
""" n 为数字,如:make -j4 拆分 4 个作业任务并行编译,加快编译速度 """
""" 使用make -j 则不限制并行编译的任务数,但是出错率可能会高一些 """
""" 如果不使用任何编译参数,一两个小时也是很常见的 """
#makemenuconfig /* 配置内核 */
//makemenuconfig
""" 此命令运行将弹出"kernel configuration"界面"""
""" 按"ESC",点"YES"退出即可 """
""" 如需定制内核,请按提示进行选择 """
//makeoldconfig
""" 如果定制内核,则不需要此步 """
""" 为要编译的内核源码使用当前系统内核配置文件 """
""" 当前目录下将会创建 ".config" 文件 """
#makebzImage /* 编译内核 */
#makemodules /* 编译模块 */
#makemodules_install /* 安装模块 */
#makeinstall /* 安装内核 */
#reboot /* 重启机器。起来之后就是新内核了 */
更新内核 联网 指定版本
1.安装必要的工具
#yuminstall rng-tools
#yuminstall rpm-build redhat-rpm-config unifdef
2. 安装源码
#rpm -i http://vault.centos.org/6.7/updates/Source/SPackages/kernel-2.6.32-573.8.1.el6.src.rpm2>&1 | grep -v exist
3.编译工具
#yum install rpm-buildredhat-rpm-config asciidoc bison hmaccalc patchutils perl-ExtUtils-Embed xmlto
#yum install audit-libs-develbinutils-devel elfutils-devel elfutils-libelf-devel
#yum install newt-develpython-devel zlib-devel
#yum install gcc bc bison
4.获得内核源码
使用如下命令得到完整的redhat linux内核源码
cd /root/rpmbuild/SPECS
rpmbuild -bp --target=$(uname-m) kernel.spec
如果提示
xmlto is needed bykernel-2.6.32-696.el6.x86_64
解决方法
#yum install xmlto
什么is needed就yuminstall什么。
如果一切顺利,那么在/root/rpmbuild/BUILD/kernel-2.6.32-696.el6/linux-2.6.32-696.el6.x86_64目录中,就会生成一份内核源码。这个源码,是在标准Linux内核源码的基础上,打上了RedHat(或centos/fedora)的补丁及相关配置的源码。
4. 安装前配置
#cd /root/rpmbuild/BUILD/
#yum install ncurses-devel
//make [-jn]
""" n 为数字,如:make-j4 拆分 4 个作业任务并行编译,加快编译速度"""
""" 使用 make -j 则不限制并行编译的任务数,但是出错率可能会高一些 """
""" 如果不使用任何编译参数,一两个小时也是很常见的 """
#make menuconfig /* 配置内核 */
//make menuconfig
""" 此命令运行将弹出"kernelconfiguration"界面 """
""" 按"ESC",点"YES"退出即可 """
""" 如需定制内核,请按提示进行选择 """
//make oldconfig
""" 如果定制内核,则不需要此步"""
""" 为要编译的内核源码使用当前系统内核配置文件 """
""" 当前目录下将会创建".config" 文件 """
#make bzImage /* 编译内核 */
#make modules /* 编译模块 */
#make modules_install /* 安装模块 */
#make install /* 安装内核 */
#reboot /* 重启机器。起来之后就是新内核了 */
更新内核 联网下载 指定版本
二、内核升级攻略
1. 查看linux内核版本:
# uname -r
2.6.18-194.el5
2. 下载新的内核版本:
去官网上下载最新的内核版本和对应的补丁:
https://www.kernel.org/
我选的是3.2.14
#wget -chttp://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.14.tar.bz2
3. 解压
将所需文件复制到/usr/src 下并解压。
(注:如果/usr/src下的空间不够,将源文件放在别的目录下也是一样的)
# cplinux-3.2.14.tar.gz /usr/src/
# cd /usr/src/
将文件解压到/usr/src/kernels
# tar -xvflinux-3.2.14.tar.gz -C /usr/src/kernels
4. 清理文件
清除掉以前升级留下的一些不正确文件。
# cd/usr/src/kernels/linux-3.2.14
# yum installncurses-devel #升级ncurses
# make mrporper
# cp/boot/config-‘uname -r’/usr/src/kernels/linux3.2.14/.config #使用原来的配置文件
5. 通过菜单方式配置内核
# cd/usr/src/kernels/linux-3.2.14
# makemenuconfig
linux配置菜单如下图所示:
一定要勾选(输入y选中,M编译为模块)
a、General setup→[*]enable deprecated sysfs features to support old userspace tools
b、Processor type and features→HighMemory Support。
c、找到以下选中选项并选中:
networking support → networking options → network packet filtering framework(netfilter)
(1)Corenetfilter configuration
. 勾中"Netfilter connection trackingsupport" -m state相关模块是依赖它的,不选则没有。
. 将netbios name service protocal support(new) 编译成模块,不然后面升级iptables后启动时会出错
. 勾中"Netfilter Xtables support (requiredfor ip_tables)"
(2)IP: Netfilter Configuration
. 将 "IPv4 connection tracking support(require for NAT)" 编译成模块。
. 勾中IP tables support (required forfiltering/masq/NAT) 。
. 将 "Full NAT" 下的 "MASQUERADE target support" 和"REDIRECT target support" 编译成模块
6. 编译并安装内核
# make clean // 清除下内核编译的目标文件
# make bzImage // 生成内核文件
# make modules // 编码模块
# makemodules_install // 安装模块
# make install // 安装
7. 编辑开机菜单选项grub文件
将default=1 改为 default=0
# vim/etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub aftermaking changes to this file
# NOTICE: You do not have a /bootpartition. This means that
# all kerneland initrd paths are relative to /, eg.
# root (hd0,0)
# kernel/boot/vmlinuz-version ro root=/dev/sda1
# initrd/boot/initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (3.2.14)
root (hd0,0)
kernel/boot/vmlinuz-3.2.14 ro root=LABEL=/
initrd/boot/initrd-3.2.14.img
title Red Hat Enterprise Linux Server(2.6.18-274.el5)
root (hd0,0)
kernel/boot/vmlinuz-2.6.18-274.el5 ro root=LABEL=/
initrd/boot/initrd-2.6.18-274.el5.img
【保存并退出】
8. 重启
# shutdown -r"now"
9. 查看内核编译结果
# uname -r
3.2.14-rt24
CentOS yum方式升级内核kernel
(此方法只限于CentOS派系的yum/rpm。补充:限于64Bit。CentOS7的32位,我试过用CentOS6的32位内核来升级,可升级可重启可使用,半个小时后删除了此系统没再尝试使用,所以不知道会带来什么不良体验。)
CentOS、Debian升级内核的方式,前几篇日志中也提到过。
自编译内核:升级内核至当前最新稳定版 4.4.1
今儿个介绍一种更快捷的方式,直接yum安装编译好的内核,也就几个命令
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
这步必须要执行的,要得到Key。
若只想升级至当前的最新稳定内核,只需要执行下面两个命令
# yum install -yhttp://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm //添加源
# yum --enablerepo=elrepo-kernel install -y kernel-ml //安装当前最新内核,以后升级内核直接运行这句就可
若只想升级只指定的内核,或者由于不能访问到源地址,也可以用以下方法。
先在以下两个网址中找到想要的内核。
1、http://elrepo.reloumirrors.NET/kernel/el7/x86_64/RPMS/ //官方源
2、http://hkg.mirror.rackspace.com/elrepo/kernel/el7/x86_64/RPMS/ //香港镜像,最新版本会比官网延迟1、2天
上图中显示当前最新版本是 kernel-ml-4.5.2-1.el7.elrepo.x86_64.rpm ( MainLine = ml ),
链接地址为:http://hkg.mirror.rackspace.com/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.5.2-1.el7.elrepo.x86_64.rpm(香港速度相对快一些)
# yum install -yhttp://hkg.mirror.rackspace.com/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.5.2-1.el7.elrepo.x86_64.rpm
升级完内核,自动按最新内核启动,修改以下文件
# vi /etc/default/grub
修改成 GRUB_DEFAULT=0
# grub2-mkconfig -o /boot/grub2/grub.cfg //重新编译内核启动文件,以后升级完内核也要执行一次
删除旧内核
# rpm -qa | grep kernel
# yum autoremove kernel-3.10.0-327.13.1.el7.x86_64
其他版本更新内核
二、Fedora指导
如果你使用Fedora或其衍生版,整个过程与Ubuntu非常类似。只是下载不同文件的位置不同,安装命令也不同。
查看为Fedora构建的最新内核列表。从列表中选择最新的稳定版,然后向下翻到i686或x86_64版本,这取决于你系统的架构。在这个部分,你需要下载下列文件,并保存到各自的文件夹下(比如Downloads文件夹下的“Kernel”):
如果你的系统是i686(32位),又有4GB或更多的内存,就需要下载所有这些文件的PAE版本。PAE是用于32位系统的地址扩展技术,让系统可以使用超过3GB的内存。
现在使用cd命令进入该文件夹,比如:
然后运行下面这个命令来安装所有文件:
最后,重启计算机,这时你应该运行新内核了!
三、内核编译中遇到的错误及解决办法
错误一、 编译时出现错误提示
In file included from/usr/include/sys/time.h:31,
from /usr/include/linux/input.h:12,
from samples/hidraw/hid-example.c:14:
/usr/include/sys/select.h:78: error: conflictingtypes for 'fd_set'
/usr/include/linux/types.h:12: error: previousdeclaration of 'fd_set' was here
In file included from /usr/include/linux/input.h:14,
from samples/hidraw/hid-example.c:14:
/usr/include/sys/types.h:46: error: conflictingtypes for 'loff_t'
/usr/include/linux/types.h:30: error: previousdeclaration of 'loff_t' was here
/usr/include/sys/types.h:62: error: conflictingtypes for 'dev_t'
/usr/include/linux/types.h:13: error: previousdeclaration of 'dev_t' was here
In file included from/usr/include/sys/types.h:133,
from /usr/include/linux/input.h:14,
from samples/hidraw/hid-example.c:14:
/usr/include/time.h:105: error: conflictingtypes for 'timer_t'
/usr/include/linux/types.h:22: error: previousdeclaration of 'timer_t' was here
In file included from/usr/include/linux/input.h:14,
from samples/hidraw/hid-example.c:14:
/usr/include/sys/types.h:198: error: conflictingtypes for 'int64_t'
/usr/include/linux/types.h:98: error: previousdeclaration of 'int64_t' was here
/usr/include/sys/types.h:204: error: conflictingtypes for 'u_int64_t'
/usr/include/linux/types.h:97: error: previousdeclaration of 'u_int64_t' was here
In file included from/usr/include/linux/input.h:14,
from samples/hidraw/hid-example.c:14:
/usr/include/sys/types.h:235: error: conflictingtypes for 'blkcnt_t'
/usr/include/linux/types.h:114: error: previousdeclaration of 'blkcnt_t' was here
samples/hidraw/hid-example.c:15:26: error:linux/hidraw.h: No such file or directory
samples/hidraw/hid-example.c: In function'main':
samples/hidraw/hid-example.c:48: error: storagesize of 'rpt_desc' isn't known
samples/hidraw/hid-example.c:49: error: storagesize of 'info' isn't known
samples/hidraw/hid-example.c:65: error:'HIDIOCGRDESCSIZE' undeclared (first use in this function)
samples/hidraw/hid-example.c:65: error: (Each undeclaredidentifier is reported only once
samples/hidraw/hid-example.c:65: error: for eachfunction it appears in.)
samples/hidraw/hid-example.c:73: error:'HIDIOCGRDESC' undeclared (first use in this function)
samples/hidraw/hid-example.c:84: warning: implicitdeclaration of function 'HIDIOCGRAWNAME'
samples/hidraw/hid-example.c:91: warning:implicit declaration of function 'HIDIOCGRAWPHYS'
samples/hidraw/hid-example.c:98: error:'HIDIOCGRAWINFO' undeclared (first use in this function)
samples/hidraw/hid-example.c:49: warning: unusedvariable 'info'
samples/hidraw/hid-example.c:48: warning: unusedvariable 'rpt_desc'
samples/hidraw/hid-example.c: In function'bus_str':
samples/hidraw/hid-example.c:171: error:'BUS_VIRTUAL' undeclared (first use in this function)
make[2]: *** [samples/hidraw/hid-example] Error1
make[1]: *** [samples/hidraw] Error 2
make: *** [vmlinux] Error 2
解决方案:
# cpinclude/linux/hidraw.h /usr/include/linux/
# cpinclude/linux/hid.h /usr/include/linux/
# vimsamples/hidraw/hid-example.c
(在Linux下编译程序有时会遇到这种问题,这貌似是一个Linux历史遗留问题:
把所有#include
之所以出现面的问题是存在循环引用所致。)
将13-15行的如下3行移动到33行以后。
13 #include
14 #include
15 #include
29 #include
30 #include
31 #include
32 #include
33 #include
【保存并退出】
# vim/usr/include/linux/input.h
line 647
#define BUS_PCI 0x01
#define BUS_ISAPNP 0x02
#define BUS_USB 0x03
#define BUS_HIL 0x04
#define BUS_BLUETOOTH 0x05
/*以下一行为新增*/
#define BUS_VIRTUAL 0x06
#define BUS_ISA 0x10
#define BUS_I8042 0x11
#define BUS_XTKBD 0x12
#define BUS_RS232 0x13
#define BUS_GAMEPORT 0x14
#define BUS_PARPORT 0x15
#define BUS_AMIGA 0x16
#define BUS_ADB 0x17
#define BUS_I2C 0x18
#define BUS_HOST 0x19
#define BUS_GSC 0x1A
/*以下两行为新增*/
#define BUS_ATARI 0x1B
#define BUS_SPI 0x1C
【保存并退出】
再重新编译;
错误二:
错误提示:Kernelpanic—not syncing :vfs:unable to mount root fs onunkown—block (0,0)
错误分析:initrd-*.*.img文件有问题;未能成功挂载真正的根文件系统。
解决方法:请你确认执行了make install 命令,我就因为没有执行这条命令而浪费了一周时间
错误三:
错误提示:Createroot device mkrootdev: label / not found
Mountingrootfilesystem
mount :error2 mounting ext3
mount :error 2mountingnone
switch root mount failed:22
umount /initrd/dev failed :2
kernel panic-not synicncing :Attempted to kill init .
(错误提示是不是有点长,貌似错误很多哦,其实可能就一个原因导致)
错误分析:
1、根文件系统找不到挂载点 ,修改grub.conf文件为 root=/dev/ *
2、硬盘驱动未能找到,请看看你机器的硬盘是都是 SATA盘,是的话同样恭喜你本文对你有帮助。
错误解决:
1.、修改grub.conf文件试试,具体修改点
root=/dev/*
* 指的是原系统中/分区的挂载点。修改后,重启进入新内核系统,估计十有八九又会遇到如下错误提示:
Mounting root filesystem
mount :error6 mounting ext3
mount :error 2 mountingnone
switchroot mount failed:22
umount /initrd/dev failed :2
kernel panic-not synicncing :Attempted tokil linit .
如果不幸被我言中,请接着往下看。
2、硬盘驱动未能成功找到,SCSI驱动有问题。
我在内核编译升级中遇到这个问题,对内核选项选了又选,方法试了很多种,错误依旧。
最终让我无意中选正确选项,成功升级内核。
具体选项是:
Device Drivers--------SCSI
device support------SCSI
low-level drivers----Serial ATA(SATA)support 选为 M,
然后再选择相应的子选项,我选择了Intel PIIX/ICH SATA support (new)后机器就成功启动了。
错误四:
错误提示:Enforcingmode requested but no policy loaded. Halting now.
kernel panic - not syncing: Attenpted to killinit!
错误分析:原内核中启用了selinux,新内核未选择selinux的选项,不能成功启动。
解决方法:修改grub.conf文件,在root=LABEL=/ 后加入 enforcing=0
错误五:
编译完重启后出现:
switchroot: mount failed: 22
umount /initrd/dev failed: 2
kernel panic - not symcing: Attempted to kill init!
的错误,
解决办法:
重新makemenuconfig, 使CONFIG_SYSFS_DEPRECATED_V2=y
也可以打开文件.config做修改和验证;
再执行:
# make bzImage
# make modules
# make modules_install
# make install
# shutdown -r "now"