centos6.5 升级内核(centos7有必要升级内核吗)
大家好,今天小编来为大家解答centos6.5 升级内核这个问题,centos7有必要升级内核吗很多人还不知道,现在让我们一起来看看吧!
如何在CentOS6.5系统中安装Docker
开始安装docker之旅:
[root@localhost~]# uname-r
2.6.32-431.el6.x86_64
[root@localhost~]# cat/etc/issue
CentOS release 6.5(Final)
Kernel\r on an\m
注意其他的源可能导致你的内核和docker的版本不一致,需要升级内核至3.x。
安装:
[root@localhost~]# rpm-ivh raproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Retrievingg/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
warning:/var/tmp/rpm-tmp.JN76fI: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing.。。###########################################[100%]
1:epel-release###########################################[100%]
[root@localhost~]# rpm--import/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
[root@localhost~]# yum-y install docker-io
启动并设置开机自动启动
[root@localhost~]# service docker start
Starting cgconfig service:[确定]
Starting docker:[确定]
[root@localhost~]# chkconfig docker on
获取cnetos镜像
[root@localhost~]# docker pull centos:latest
centos:latest: The image you are pulling has been verified
511136ea3c5a: Pull complete
5b12ef8fd570: Pull complete
34943839435d: Downloading[===》] 18.38 MB/232.5 MB 1h7m49s
#官方安装方式docker pull imagename从docker的索引中心下载,imagename是镜像名称,例如docker pull Ubuntu就是下载base ubuntu并且tag是latest。
我们还可以搜索基于 Fedora和 Ubuntu操作系统的容器。
[root@localhost~]# docker search ubuntu
[root@localhost~]# docker search fedora
查看docker镜像
[root@localhost~]# docker images centos
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos latest 34943839435d Less than a second ago 224 MB
运行docker运行shell
[root@localhost~]# docker run-i-t centos/bin/bash
[root@2ce733141ece/]#
[root@2ce733141ece/]#
[root@2ce733141ece/]#
[root@2ce733141ece/]#
停止容器
[root@localhost~]# docker stop《CONTAINER ID》
删除所有容器
docker rm$(docker ps-a-q)
查看docker的子命令,直接敲docker或完整的docker help就可以
常用命令
总结一下常用命令:
其中《》阔起来的参数为必选,[]阔起来为可选
docker version查看docker的版本号,包括客户端、服务端、依赖的Go等
docker info查看系统(docker)层面信息,包括管理的images, containers数等
docker search在docker index中搜索image
docker pull从docker registry server中下拉image
docker push推送一个image或repository到registry
docker push:TAG同上,指定tag
docker inspect查看image或container的底层信息
docker images TODO filter out the intermediate image layers(intermediate image layers是什么)
docker images-a列出所有的images
docker ps默认显示正在运行中的container
docker ps-l显示最后一次创建的container,包括未运行的
docker ps-a显示所有的container,包括未运行的
docker logs查看container的日志,也就是执行命令的一些输出
docker rm删除一个或多个container
docker rm `docker ps-a-q`删除所有的container
docker ps-a-q| xargs docker rm同上,删除所有的container
docker rmi删除一个或多个image
docker start/stop/restart开启/停止/重启container
docker start-i启动一个container并进入交互模式
docker attach attach一个运行中的container
docker run使用image创建container并执行相应命令,然后停止
docker run-i-t/bin/bash使用image创建container并进入交互模式, login shell是/bin/bash
docker run-i-t-p将container的端口映射到宿主机的端口
docker commit[repo:tag]将一个container固化为一个新的image,后面的repo:tag可选
docker build
寻找path路径下名为的Dockerfile的配置文件,使用此配置生成新的image
docker build-t repo[:tag]同上,可以指定repo和可选的tag
docker build-使用指定的dockerfile配置文件,docker以stdin方式获取内容,使用此配置生成新的image
docker port查看本地哪个端口映射到container的指定端口,其实用docker ps也可以看到。
centos从u盘进入拯救模式
centos从u盘进入拯救模式()Linux在启动中往往会由于一些故障而无法正常其中。这是时候往往可以通过Single单用户模式、救援模式等方式进行启动和救援恢复正常。本文虫虫给大家介绍一下这些典型的模式以及以一个Xen虚拟化模式下Centos 6.5升级内核情况下导致系统故障的救援解决。
单用户模式
Linux下最常用的是单用户模式,可以在最小加载模式下(init 1),无需用户认证情况下加载系统,进入shell命令行界面。单用户模式网络被禁用,而且也没有启用很多服务。如果出现系统文件损坏,配置文件丢失,或者用户密码丢失无法进入系统的情况,可以使用单用户模式。注意新版本的centos 7和以前版本centos进去单用户方式不一样,我们分别截图介绍下:
centos 6
在Grub菜单界面
按e,编辑命令
kernel行的最后加上single,回车,然后按b,加载启动系统。
就会到到单用户shell界面,在改界面可以用passwd修改root密码。
centos 7
centos7是用grub2菜单,菜单界面如下图:
按b进入编辑界面,注意centos 7下grub 2的编辑界面和以前的系统大有不同
在linux 16哪一行 LANG= en_US.UTF-8最后增加\"init=/bin/sh\"
按住Ctrl+x启动系统就进入了单用户模式。然后用passwd修改密码或者其他操作
电脑救援模式
有时候系统根本无法启动,甚至grub菜单都加载不了,这时候就需要使用Linux启动盘来辅助进入救援模式来做故障修复了。
救援模式需要启动盘辅助加载系统,所以要改变boot顺序为从光盘或者USB启动。注意在如果使用xen虚拟机Centos系统的话,是无法修改boot顺序的,如下图:
要改变启动顺序必须借助Xen宿主机来,我们先登陆宿主机:
执行xe vm-list,找到我们的虚拟机的uuid
然后依次执行下面两个命令:
xe vm-param-set uuid=97f817bd-7f6b-3ea8-056b-e19fe055c800 HVM-boot-policy=\"BIOS order\"xe vm-param-set uuid=97f817bd-7f6b-3ea8-056b-e19fe055c800电脑 HVM-boot-params:order=\"dc\"这样就可以显示设置boot顺序了
我们选中DVD-Drive,然后启动系统
选择\"Rescue installed system\"进入救援模式,选择语言、键盘和网络后进入
Tab点击Continue继续
注意该页的信息我们的系统被加载到/mnt/sysimage下了,后面要用到。
电脑
此处选择shell进入命令操作界面,其他两个是fakd进行诊断;reboot重启系统。
这时就会进入一个命令行界面,注意此时系统是临时的光盘启动救援系统。为了进行操作我们需要加载硬盘上的系统。我们要用chroot命令:
chroot/mnt/sysimage然后就可以进行其他操作了,比如修改密码,修复配置,备份文件等。
救援实例
最后我们举个救援的实例作为结束,之前Linux内核爆个严重漏洞TCP网络数据包时候存在缺陷导致三个漏洞, CVE-2019-11477,CVE-2019-11478和CVE-2019-11479,关于该漏洞的预警和修复方法,虫虫的此前发文介绍过。修复该漏洞根本方法是升级内核,Centos 6.5需要升级内核版本到kernel-2.6.32-754.15.3版本。
用yum update kernel升级Xen虚拟机Centos 6.5后,重启出现故障,甚至无法进入grub菜单。
电脑
此时我们可以使用上面的提到的救援模式,在救援模式下修改/etc/grub.conf
修改配置中default=1,表示加载上一个内核。
然后reboot重启系统,故障恢复。
由于centos内核补丁和Xen架构兼容导致问题,所以恢复系统后
yum remove kernel-2.6.32-754.15.3.el6.x86_64.rpm恢复所有现场。
以上是一般情况下的救援恢复模式。由于我们的事故主机是Xen虚拟机,我们有更便捷编辑启动选项的方法。那就是使用xe命令来直接在xen宿主机上编辑虚拟机的grub.conf。
首先登陆到xen宿主机上:
1、执行 xe vm-list查询事故机器的uuid(同上面部分)。
2在xen center关闭该机器或者用命令关机
xe vm-shutdown uuid=97f817bd-7f6b-3ea8-056b-e19fe055c8003、通过以下命令启动编辑:
xe-edit-bootloader-u 97f817bd-7f6b-3ea8-056b-e19fe055c800-p 1和救援模式一样,修改配置中default=1,保存。
重启系统,其他同救援模式操作一样。
总结
本文介绍了Linux(centos)下系统单用户模式以及救援模式及操作方法。并通过实例介绍了在内核升级失败系统无法启动情况下的救援恢复操作。并穿插介绍了xen虚拟化中一些xen宿主机管理命令。
电脑电脑
centos 6.6怎么升级内核
1.准备工作
确认内核及版本信息
[root@hostname~]# uname-r
2.6.32-220.el6.x86_64
[root@hostname~]# cat/etc/centos-release
CentOS release 6.5(Final)
安装软件
编译安装新内核,依赖于开发环境和开发库
# yum grouplist//查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库;
# yum groupinstall"Development Tools"//一般是安装这两个软件包组,这样做会确定你拥有编译时所需的一切工具
# yum install ncurses-devel//你必须这样才能让 make*config这个指令正确地执行
# yum install qt-devel//如果你没有 X环境,这一条可以不用
# yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel//创建 CentOS-6内核时需要它们
如果当初安装系统是选择了Software workstation,上面的安装包几乎都已包含。
2.编译内核
获取并解压内核源码,配置编译项
Linux内核版本有两种:稳定版和开发版,Linux内核版本号由3个数字组成:r.x.y
r:主版本号
x:次版本号,偶数表示稳定版本;奇数表示开发中版本。
y:修订版本号,表示修改的次数
去 首页,可以看到有stable, longterm等版本,longterm是比stable更稳定的版本,会长时间更新,因此我选择 3.10.58。
[root@sean~]#wget
[root@sean~]# tar-xf linux-3.10.58.tar.xz-C/usr/src/
[root@sean~]# cd/usr/src/linux-3.10.58/
[root@sean linux-3.10.58]# cp/boot/config-2.6.32-220.el6.x86_64.config
我们在系统原有的内核配置文件的基础上建立新的编译选项,所以复制一份到当前目录下,命名为.config。接下来继续配置:
[root@sean linux-3.10.58]# sh-c'yes""| make oldconfig'
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
scripts/kconfig/conf--oldconfig Kconfig
.config:555:warning: symbol value'm' invalid for PCCARD_NONSTATIC
.config:2567:warning: symbol value'm' invalid for MFD_WM8400
.config:2568:warning: symbol value'm' invalid for MFD_WM831X
.config:2569:warning: symbol value'm' invalid for MFD_WM8350
.config:2582:warning: symbol value'm' invalid for MFD_WM8350_I2C
.config:2584:warning: symbol value'm' invalid for AB3100_CORE
.config:3502:warning: symbol value'm' invalid for MMC_RICOH_MMC
*
* Restart config...
*
*
* General setup
*
......
XZ decompressor tester(XZ_DEC_TEST) [N/m/y/?](NEW)
Averaging functions(AVERAGE) [Y/?](NEW) y
CORDIC algorithm(CORDIC) [N/m/y/?](NEW)
JEDEC DDR data(DDR) [N/y/?](NEW)
#
# configuration written to.config
make oldconfig会读取当前目录下的.config文件,在.config文件里没有找到的选项则提示用户填写,然后备份.config文件为.config.old,并生成新的.config文件,参考
有的文档里介绍使用make memuconfig,它便是根据需要定制模块,类似界面如下:(在此不需要)
开始编译
[root@sean linux-3.10.58]# make-j4 bzImage//生成内核文件
[root@sean linux-3.10.58]# make-j4 modules//编译模块
[root@sean linux-3.10.58]# make-j4 modules_install//编译安装模块
-j后面的数字是线程数,用于加快编译速度,一般的经验是,逻辑CPU,就填写那个数字,例如有8核,则为-j8。(modules部分耗时30多分钟)
安装
[root@sean linux-3.10.58]# make install
实际运行到这一步时,出现ERROR: modinfo: could not find module vmware_balloon,但是不影响内核安装,是由于vsphere需要的模块没有编译,要避免这个问题,需要在make之前时修改.config文件,加入
HYPERVISOR_GUEST=yCONFIG_VMWARE_BALLOON=m
(这一部分比较容易出问题,参考下文异常部分)
修改grub引导,重启
安装完成后,需要修改Grub引导顺序,让新安装的内核作为默认内核。
编辑 grub.conf文件,
vi/etc/grub.conf
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS(3.10.58)
root(hd0,0)
...
数一下刚刚新安装的内核在哪个位置,从0开始,然后设置default为那个数字,一般新安装的内核在第一个位置,所以设置default=0。
重启reboot:
boot-with-new-kernel
确认当内核版本
[root@sean~]# uname-r
3.10.58
升级内核成功!
3.异常
编译失败(如缺少依赖包)
可以先清除,再重新编译:
# make mrproper#完成或者安装过程出错,可以清理上次编译的现场
# make clean
在vmware虚拟机上编译,出现类似下面的错误
[root@sean linux-3.10.58]# make install
sh/usr/src/linux-3.10.58/arch/x86/boot/install.sh 3.10.58 arch/x86/boot/bzImage\
System.map"/boot"
ERROR: modinfo: could not find module vmware_balloon
可以忽略,如果你有强迫症的话,尝试以下办法:
要在vmware上需要安装VMWARE_BALLOON,可直接修改.config文件,但如果vi直接加入CONFIG_VMWARE_BALLOON=m依然是没有效果的,因为它依赖于HYPERVISOR_GUEST=y。如果你不知道这层依赖关系,通过make menuconfig后,Device Drivers-> MISC devices下是找不到VMware Balloon Driver的。(手动vi.config修改HYPERVISOR_GUEST后,便可以找到这一项),另外,无论是通过make menuconfig或直接vi.config,最后都要运行sh-c'yes""| make oldconfig'一次得到最终的编译配置选项。
然后,考虑到vmware_balloon可能在这个版本里已更名为vmw_balloon,通过下面的方法保险起见:
# cd/lib/modules/3.10.58/kernel/drivers/misc/
# ln-s vmw_balloon.ko vmware_balloon.ko#建立软连接
其实,针对安装docker的内核编译环境,最明智的选择是使用sciurus帮我们配置好的.config文件。
也建议在make bzImage之前,运行脚本check-config.sh检查当前内核运行docker所缺失的模块。
当提示缺少其他module时如NF_NAT_IPV4时,也可以通过上面的方法解决,然后重新编译。
4.几个重要的Linux内核文件介绍
在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。比如对于RedHat Linux,在/boot目录下有一些与Linux内核有关的文件,进入/boot执行:ls–l。编译过RedHat Linux内核的人对其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些文件的建立等操作。那么这几个文件是怎么产生的?又有什么作用呢?
(1)vmlinuz
vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。
vmlinuz的建立有两种方式。
一是编译内核时通过“make zImage”创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。
二是内核编译时通过命令make bzImage创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage/boot/vmlinuz”产生。
bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。
zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip或 gzip–dc解包vmlinuz。
内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。
vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。
(2) initrd-x.x.x.img
initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题。initrd-2.4.7-10.img是用gzip压缩的文件,下面来看一看这个文件的内容。
initrd实现加载一些模块和安装文件系统等。
initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd
下面的命令创建initrd映象文件:
(3) System.map
System.map是一个特定内核的内核符号表。它是你当前运行的内核的System.map的链接。
内核符号表是怎么创建的呢? System.map是由“nm vmlinux”产生并且不相关的符号被滤出。对于本文中的例子,编译内核时,System.map创建在/usr/src/linux-2.4/System.map。像下面这样:
nm/boot/vmlinux-2.4.7-10> System.map
下面几行来自/usr/src/linux-2.4/Makefile:
nm vmlinux| grep-v'(compiled)|(.o
)|([aUw])|(..ng
)|(LASH[RL]DI)'| sort> System.map
然后复制到/boot:
cp/usr/src/linux/System.map/boot/System.map-2.4.7-10
在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号。
Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名。比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。
对于使用计算机的人来说,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,所以编译器/连接器允许我们编码时使用符号名,当内核运行时使用地址。
然而,在有的情况下,我们需要知道符号的地址,或者需要知道地址对应的符号。这由符号表来完成,符号表是所有符号连同它们的地址的列表。Linux符号表使用到2个文件:/proc/ksyms和System.map。
/proc/ksyms是一个“proc file”,在内核引导时创建。实际上,它并不真正的是一个文件,它只不过是内核数据的表示,却给人们是一个磁盘文件的假象,这从它的文件大小是0可以看出来。然而,System.map是存在于你的文件系统上的实际文件。当你编译一个新内核时,各个符号名的地址要发生变化,你的老的System.map具有的是错误的符号信息。每次内核编译时产生一个新的System.map,你应当用新的System.map来取代老的System.map。
虽然内核本身并不真正使用System.map,但其它程序比如klogd, lsof和ps等软件需要一个正确的System.map。如果你使用错误的或没有System.map,klogd的输出将是不可靠的,这对于排除程序故障会带来困难。没有System.map,你可能会面临一些令人烦恼的提示信息。
另外少数驱动需要System.map来解析符号,没有为你当前运行的特定内核创建的System.map它们就不能正常工作。
Linux的内核日志守护进程klogd为了执行名称-地址解析,klogd需要使用System.map。System.map应当放在使用它的软件能够找到它的地方。执行:man klogd可知,如果没有将System.map作为一个变量的位置给klogd,那么它将按照下面的顺序,在三个地方查找System.map:
/boot/System.map
/System.map
/usr/src/linux/System.map
System.map也有版本信息,klogd能够智能地查找正确的映象(map)文件。