linux配置内核
‘壹’ 一般优化linux的内核,需要优化什么参数
作为高性能WEB服务器,只调整Nginx本身的参数是不行的,因为Nginx服务依赖于高性能的操作系统。
以下为常见的几个Linux内核参数优化方法。
net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_syn_retries
net.ipv4.tcp_synack_retries
net.ipv4.ip_local_port_range
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
对于tcp连接,服务端和客户端通信完后状态变为timewait,假如某台服务器非常忙,连接数特别多的话,那么这个timewait数量就会越来越大。
毕竟它也是会占用一定的资源,所以应该有一个最大值,当超过这个值,系统就会删除最早的连接,这样始终保持在一个数量级。
这个数值就是由net.ipv4.tcp_max_tw_buckets这个参数来决定的。
CentOS7系统,你可以使用sysctl -a |grep tw_buckets来查看它的值,默认为32768,
你可以适当把它调低,比如调整到8000,毕竟这个状态的连接太多也是会消耗资源的。
但你不要把它调到几十、几百这样,因为这种状态的tcp连接也是有用的,
如果同样的客户端再次和服务端通信,就不用再次建立新的连接了,用这个旧的通道,省时省力。
该参数的作用是快速回收timewait状态的连接。上面虽然提到系统会自动删除掉timewait状态的连接,但如果把这样的连接重新利用起来岂不是更好。
所以该参数设置为1就可以让timewait状态的连接快速回收,它需要和下面的参数配合一起使用。
该参数设置为1,将timewait状态的连接重新用于新的TCP连接,要结合上面的参数一起使用。
tcp三次握手中,客户端向服务端发起syn请求,服务端收到后,也会向客户端发起syn请求同时连带ack确认,
假如客户端发送请求后直接断开和服务端的连接,不接收服务端发起的这个请求,服务端会重试多次,
这个重试的过程会持续一段时间(通常高于30s),当这种状态的连接数量非常大时,服务器会消耗很大的资源,从而造成瘫痪,
正常的连接进不来,这种恶意的半连接行为其实叫做syn flood攻击。
设置为1,是开启SYN Cookies,开启后可以避免发生上述的syn flood攻击。
开启该参数后,服务端接收客户端的ack后,再向客户端发送ack+syn之前会要求client在短时间内回应一个序号,
如果客户端不能提供序号或者提供的序号不对则认为该客户端不合法,于是不会发ack+syn给客户端,更涉及不到重试。
该参数定义系统能接受的最大半连接状态的tcp连接数。客户端向服务端发送了syn包,服务端收到后,会记录一下,
该参数决定最多能记录几个这样的连接。在CentOS7,默认是256,当有syn flood攻击时,这个数值太小则很容易导致服务器瘫痪,
实际上此时服务器并没有消耗太多资源(cpu、内存等),所以可以适当调大它,比如调整到30000。
该参数适用于客户端,它定义发起syn的最大重试次数,默认为6,建议改为2。
该参数适用于服务端,它定义发起syn+ack的最大重试次数,默认为5,建议改为2,可以适当预防syn flood攻击。
该参数定义端口范围,系统默认保留端口为1024及以下,以上部分为自定义端口。这个参数适用于客户端,
当客户端和服务端建立连接时,比如说访问服务端的80端口,客户端随机开启了一个端口和服务端发起连接,
这个参数定义随机端口的范围。默认为32768 61000,建议调整为1025 61000。
tcp连接的状态中,客户端上有一个是FIN-WAIT-2状态,它是状态变迁为timewait前一个状态。
该参数定义不属于任何进程的该连接状态的超时时间,默认值为60,建议调整为6。
tcp连接状态里,有一个是established状态,只有在这个状态下,客户端和服务端才能通信。正常情况下,当通信完毕,
客户端或服务端会告诉对方要关闭连接,此时状态就会变为timewait,如果客户端没有告诉服务端,
并且服务端也没有告诉客户端关闭的话(例如,客户端那边断网了),此时需要该参数来判定。
比如客户端已经断网了,但服务端上本次连接的状态依然是established,服务端为了确认客户端是否断网,
就需要每隔一段时间去发一个探测包去确认一下看看对方是否在线。这个时间就由该参数决定。它的默认值为7200秒,建议设置为30秒。
该参数和上面的参数是一起的,服务端在规定时间内发起了探测,查看客户端是否在线,如果客户端并没有确认,
此时服务端还不能认定为对方不在线,而是要尝试多次。该参数定义重新发送探测的时间,即第一次发现对方有问题后,过多久再次发起探测。
默认值为75秒,可以改为3秒。
第10和第11个参数规定了何时发起探测和探测失败后再过多久再发起探测,但并没有定义一共探测几次才算结束。
该参数定义发起探测的包的数量。默认为9,建议设置2。
设置和范例
在Linux下调整内核参数,可以直接编辑配置文件/etc/sysctl.conf,然后执行sysctl -p命令生效
‘贰’ 如何配置linux内核具有nfs的功能
1、使用的技术
NFS
2、测试环境
NFS服务器:192.168.255.18
NFS客户端:192.168.255.11
操作系统:REDHAT4
3、NFS服务器配置
(1)配置 /etc/hosts.deny
禁止任何客户端能和你的NFS服务器进行NFS连接:
### NFS DAEMONS
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
(2)配置/etc/hosts.allow
允许那些你想要的客户端和你的NFS服务器建立连接。下列步骤将允许任何IP地址
以192.168.2开头的主机(连接到NFS服务器上),也可以指定特定的IP地址。
### NFS DAEMONS
portmap: 192.168.255.
lockd: 192.168.255.
rquotad: 192.168.255.
mountd: 192.168.255.
statd: 192.168.255.
(3)重启portmap
运行 $ /etc/init.d/portmap restart 重启portmap daemon。
(4)配置/etc/exports
NFS挂载目录及权限由/etc/exports文件定义。比如要将我的/tmp目录让
192.168.255.*的IP共享, 则在该文件末尾添加下列语句:
/tmp 192.168.255.*(rw,sync,no_root_squash)
192.168.255.* 网段内的NFS客户端能够共享NFS服务器/tmp目录内容,且有读,写
权限,并且该用户进入/home/zp/share目录后的身份为root,最好加上sync,否则
$ sudo exportfs -r 时会给出警告, sync是NFS的默认选项。
(5)重启NFS服务
运行 $ /etc/init.d/nfs-kernel-server restart 重启nfs服务)
(6)NFS服务器查看共享是否成功
$ Showmount –e 192.168.255.18
/tmp 192.168.255.*
(6)NFS客户端启动NFS服务
service nfs start
(7)NFS客户端查看服务器共享目录
Showmount –e 192.168.255.18
(8)挂载NFS服务器共享目录
mount –t nfs -o tcp192.168.255.18:/tmp /tmp
4、错误排查
当/etc/exports设置的权限,不符合client端的来源时,则会出现以下错误信息:
mount: hostname:/dir failed, reason given by server: Permission denied
‘叁’ 如何定制自己的linux内核
一 前言
为什么要编译自己的内核?这可能会有各种不同的答案,列举如下:
1 为了研究,学习内核源码。
2 为了支持新的硬件或者打开某项内核功能。
3 升级内核到更新版本。
4 按自己的要求定制和优化内核功能。
如此种种...
折腾不需要理由,这里我就不在多说,下面直接进入主题。
编译方式
编译内核有多种方式,从kernel.org下载选择下载需要的版本的内核源码,
如:linux-2.6.32-rc1.tar.bz2,下载内核源码到/home/user/目录,进入下载目录,解压压缩包。
#cd /home/user/
#tar -xjvf linux-2.6.32-rc1.tar.bz2
二 准备编译环境
开始之前,首先确认下面软件包已经安装(编译中标普华4.0时,直接全部安装CD3可保证此条件)。
* rpmdevtools
* yum-utils
fedora系统可以使用如下命令安装:
#yum install yum-utils rpmdevtools
1. 生成一个rpmbuild命令工作所需的目录树,下面命令可以完成该操作,也可以手动建立目录树。
命令建立:
#rpmdev-setuptree
此命令将会在/usr/src/rpmbuild/目录下生成如下目录结构(如果此位置没有,则可能在当前用户目录下).
# tree /usr/src/rpmbuild/
rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
上面部分是rpmbuild的环境建立。rpm
3. 安装内核源码包需要的依赖组件(在此可以跳过此步操作)
su -c 'yum-builddep kernel-<version>.src.rpm'
4.安装内核源码到系统,默认目录在/usr/src/neoshine:
rpm -Uvh kernel-<version>.src.rpm
三 配置内核(生成config配置文件)
下面将介绍如何解开源码包,并修改,配置和重新打包源码
1. 解开源码包并打上所有的补丁到BUILD目录
cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec
kernel源码将在这里找到:
/usr/src/neoshine/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch> directory
配置内核源码
1. 进入内核源码:
cd ~/rpmbuild/BUILD/kernel-2.6.$ver/linux-2.6.$ver.$arch/
2. 复制/boot/config*配置文件到源码目录下,此config文件也可以是已经配好或者其他地方备份的kernel配置文件:
cp /boot/config2.6- 2.6.$ver.$arch .config
3. 先检查kernel配置中新增的选项:
make oldconfig
4. 定制内核功能,关闭initrd支持选项,执行图形化内核配置工具:
make menuconfig
注:在generic setup选项下找到initial RAM system and RAM disk(initramfs and initrd) support 项,取消编译。同时确保跟文件系统对应的驱动和系统所在存储器对应的驱动都已经编译到内核(否则会无法启动系统).
5. 在.config文件第一行改为下面内容(注意:没有此行时,后面的编译会报错)
# i386
6. 拷贝.config到SOURCES/:
cp .config ../SOURCES/config-$arch
四 编译新内核
1. 下面开始准备编译新的内核包
打开SPEC/kernel.spec
vim SPEC/kernel.spec
改变下面行内容,可以定制自己的内核扩展名(如fc10之类):
%define buildid .<自己内核的小版本名>
下一步将生成一个新内核的rpm包,此过程需要编译内核源码包
使用下面命令生成新的内核源码包
rpmbuild -bb --with baseonly --without debuginfo --target=`uname -m` kernel.spec
参数说明:bb表示只编译二进制包,即不生成源码包,without debuginfo 表示没有调试信息,
target=`uname -r`表示生成对应当前平台的内核包
如果上面的命令成功执行完成,那么会在BUILD/i686目录下生成新的内核安装包
五 安装新内核
rpm -ivh kernel-$ver-$arch.rpm
此步操作会自动安装内核到boot目录下,安装对应内核模块到/lib/moles/目录下,并且生成新内核对应的grub引导菜单。
修改grub引导菜单为以下格式
title new kernel
kernel /boot/vmlinuz-$ver-$arch root=/dev/sdax(hdax)
注意,此处不要使用uuid指定跟文件系统(可能会无法挂载根分区而导致内核死机),也不要再加和显示相关的参数(内核不支持对应设置时,只会看到一个黑黑的屏幕)。
至此一个禁用initrd的新内核配置安装完毕!
‘肆’ linux编译内核步骤
一、准备工作
a) 首先,你要有一台PC(这不废话么^_^),装好了Linux。
b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的)、make、ncurses等工具。
c) 下载一份纯净的Linux内核源码包,并解压好。
注意,如果你是为当前PC机编译内核,最好使用相应的Linux发行版的源码包。
不过这应该也不是必须的,因为我在我的Fedora 13上(其自带的内核版本是2.6.33.3),就下载了一个标准的内核linux-2.6.32.65.tar.xz,并且顺利的编译安装成功了,上电重启都OK的。不过,我使用的.config配置文件,是Fedora 13自带内核的配置文件,即/lib/moles/`uname -r`/build/.config
d) 如果你是移植Linux到嵌入式系统,则还要再下载安装交叉编译工具链。
例如,你的目标单板CPU可能是arm或mips等cpu,则安装相应的交叉编译工具链。安装后,需要将工具链路径添加到PATH环境变量中。例如,你安装的是arm工具链,那么你在shell中执行类似如下的命令,假如有类似的输出,就说明安装好了。
[root@localhost linux-2.6.33.i686]# arm-linux-gcc --version
arm-linux-gcc (Buildroot 2010.11) 4.3.5
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
注:arm的工具链,可以从这里下载:回复“ARM”即可查看。
二、设置编译目标
在配置或编译内核之前,首先要确定目标CPU架构,以及编译时采用什么工具链。这是最最基础的信息,首先要确定的。
如果你是为当前使用的PC机编译内核,则无须设置。
否则的话,就要明确设置。
这里以arm为例,来说明。
有两种设置方法():
a) 修改Makefile
打开内核源码根目录下的Makefile,修改如下两个Makefile变量并保存。
ARCH := arm
CROSS_COMPILE := arm-linux-
注意,这里cross_compile的设置,是假定所用的交叉工具链的gcc程序名称为arm-linux-gcc。如果实际使用的gcc名称是some-thing-else-gcc,则这里照葫芦画瓢填some-thing-else-即可。总之,要省去名称中最后的gcc那3个字母。
b) 每次执行make命令时,都通过命令行参数传入这些信息。
这其实是通过make工具的命令行参数指定变量的值。
例如
配置内核时时,使用
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
编译内核时使用
make ARCH=arm CROSS_COMPILE=arm-linux-
注意,实际上,对于编译PC机内核的情况,虽然用户没有明确设置,但并不是这两项没有配置。因为如果用户没有设置这两项,内核源码顶层Makefile(位于源码根目录下)会通过如下方式生成这两个变量的值。
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
ARCH?= $(SUBARCH)
CROSS_COMPILE ?=
经过上面的代码,ARCH变成了PC编译机的arch,即SUBARCH。因此,如果PC机上uname -m输出的是ix86,则ARCH的值就成了i386。
而CROSS_COMPILE的值,如果没配置,则为空字符串。这样一来所使用的工具链程序的名称,就不再有类似arm-linux-这样的前缀,就相当于使用了PC机上的gcc。
最后再多说两句,ARCH的值还需要再进一步做泛化。因为内核源码的arch目录下,不存在i386这个目录,也没有sparc64这样的目录。
因此顶层makefile中又构造了一个SRCARCH变量,通过如下代码,生成他的值。这样一来,SRCARCH变量,才最终匹配到内核源码arch目录中的某一个架构名。
SRCARCH := $(ARCH)
ifeq ($(ARCH),i386)
SRCARCH := x86
endif
ifeq ($(ARCH),x86_64)
SRCARCH := x86
endif
ifeq ($(ARCH),sparc64)
SRCARCH := sparc
endif
ifeq ($(ARCH),sh64)
SRCARCH := sh
endif
三、配置内核
内核的功能那么多,我们需要哪些部分,每个部分编译成什么形式(编进内核还是编成模块),每个部分的工作参数如何,这些都是可以配置的。因此,在开始编译之前,我们需要构建出一份配置清单,放到内核源码根目录下,命名为.config文件,然后根据此.config文件,编译出我们需要的内核。
但是,内核的配置项太多了,一个一个配,太麻烦了。而且,不同的CPU架构,所能配置的配置项集合,是不一样的。例如,某种CPU的某个功能特性要不要支持的配置项,就是与CPU架构有关的配置项。所以,内核提供了一种简单的配置方法。
以arm为例,具体做法如下。
a) 根据我们的目标CPU架构,从内核源码arch/arm/configs目录下,找一个与目标系统最接近的配置文件(例如s3c2410_defconfig),拷贝到内核源码根目录下,命名为.config。
注意,如果你是为当前PC机编译内核,最好拷贝如下文件到内核源码根目录下,做为初始配置文件。这个文件,是PC机当前运行的内核编译时使用的配置文件。
/lib/moles/`uname -r`/build/.config
这里顺便多说两句,PC机内核的配置文件,选择的功能真是多。不编不知道,一编才知道。Linux发行方这样做的目的,可能是想让所发行的Linux能够满足用户的各种需求吧。
b) 执行make menuconfig对此配置做一些需要的修改,退出时选择保存,就将新的配置更新到.config文件中了。
注
‘伍’ 怎么进入linux内核配置把CONFIG_ACPI_THERMAL设置为y
你要在目标文件夹(一般是/usr/src/kernels)下先解压内核源代码:tar jxvf linux-2.6.xx.xx.tar.bz2,然后cd到解压后的源代码目录树的根目录下运行make指令。
‘陆’ Linux中为什么要配置内核,怎样重新配置内核
新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译Linux内核。
为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:
(1)自己定制编译的内核运行更快(具有更少的代码)
(2)系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
(3)不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞
(4)
将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些
‘柒’ 如何配置linux 内核最小系统
下载内核下载热点内核标准配置文件编译内核makemenuconfig选中,然后选择刚下载的。config另外,要特别选中:1)、通过makemenuconfig选中以下对应的选项Generalsetup–>[*])、修改。config文件修改。config文件中CONFIG_SYSFS_DEPRECATED_V2,将原本被注释掉的CONFIG_SYSFS_DEPRECATED_V2改成CONFIG_SYSFS_DEPRECATED_V2=y注:修改这项是因为旧版的mkinitrd及其nash在内核没有CONFIG_SYSFS_DEPRECATED_V2参数时默认使用旧版sysfs路径格式,从而在新内核下无法正确访问/sys内的硬盘信息节点。主要是解决"mount:couldnotfindfilesystem'/dev/root'"这样的错误makebzImagemakemolesmakemoles_installmakeinstall解压修改内核cp/boot/initrd-2.6.38.img/tmpcd/tmp/mkdirnewinitrdcdnewinitrd/zcat/initrd-2.6.38.imgcpio-irm-rf/tmp/initrd-2.6.38.imgviinit找到这2行一样的,去掉1行echo"Loadingdm-region-hash.komole"insmod/lib/dm-region-hash.koecho"Loadingdm-region-hash.komole"insmod/lib/dm-region-hash.ko这主要是解决:"insmod:errorinserting'/lib/dm-region-hash.ko':-1Fileexists"这样的错误从新打包内核find.cpio-c-o>/initrdcd/gzip-9initrd-2.6.38imgrm-rf/boot/initrd-2.6.38.imgcpinitrd-2.6.38.img/bootrm-rf/cd/usr/src/linux-2.6.38.tar.gzrm-rf/cd/usr/src/linux-2.6.38设置从新内核启动,重启系统vi/boot/grub/grub.conf把default=1改为default=0reboot(重启系统)
‘捌’ 如何配置linux内核支持sata
(1)首先,用内核的 allnoconfig 配置目标,得到一个最最基本的内核配置。即,执行下面的命令:
make allnoconfig
内核的 allnoconfig 配置目标会把所有的内核选项都设置为no,也就是把它们既不编译进内核,也不编译成模块。
有了这个最基本的配置,我们再添加必须的配置项:再执行
make menuconfig
命令,按下面的步骤添加其他的配置——
(2)把 Executable file formats 下的ELF 和 emulations for 32bit ELF 选项编译进内核。
(3)在 Processor type and features 下面,选择合适的CPU类型。
(4)选择PCI/PCI-Express支持,位于Bus options (PCI, PCMCIA, EISA, MCA, ISA) 配置目录下。
(5)加入对根文件系统所在磁盘控制器的驱动:
Device Driver
|---->SCSI device support
|---->SCSI disk support
|----->SCSI low-level drivers
|---->Serial ATA (SATA) support
|---->intel PIIX/ICH SATA support
(6)加入Ext2文件系统的支持:在 File systems 配置目录下,选择 Second extended fs support。如果根文件系统是Ext3,则选择 Ext3 journalling file system support。
(7)为了是 Udev 正常工作,需要内核支持 Unix domain sockets。此配置选项位于 Networking 配置目录中的 Networking support ---> Networking options 下。
(8)使内核支持 /proc 虚拟文件系统和 tmpfs 文件系统:
File systems ---> Pseudo filesystems ---> /proc file system support / Virtual memory file system support (former shm fs)
(9)支持 swap 分区:
General setup ---> Support for paging of anonymous memory (swap)
(10)支持 RTC 设备:
Device Drivers ---> Character devices ---> Enhanced Real Time Clock Support
(11)为了充分发挥我的双核CPU的能力,我又加入了对SMP的支持:
Processor type and features ---> Symmetric multi-processing support。
‘玖’ linux内核配置哪些是必须的
内核配置注意事项
如果打算自己编译内核的话(内核源代码可以到ftp://ftp.kernel.org/pub/kernel/ 下载,国内下载可以到ftp://ftp.cn.kernel.org/pub/kernel/ 这样下载速度更快),在编译之前一般都要先用make menuconfig或make xconfig配置内核。我的系统中没有xconfig,所以只能用menuconfig。在我的Compaq Presario V3414TX laptop上编译2.6.23.x内核时,以下选项是必须要注意的:
1、Networking -->
Wireless LAN -->
[M]Generic IEEE 802.11 Networking Stack (mac80211)
这是Linux当前使用的网络栈模块。如果想要使用无线网卡(我的是Intel PRO/3945 ABG),就要将此选项编为模块(或者编入内核也可以,那样启动时就会自动加载mac80211模块)。否则到时候就要自己去intellinuxwireless.org下载该模块进行安装。
2、Device Drivers -->
Network Drivers -->
Wireless LAN-->
[M]Intel PRO/Wireless 3945ABG Network Connection
Intel PRO/Wireless 3945ABG Network Connection这一项可以换成你的任何无线网卡。同样,如果你想使用无线网卡的话,这一项也是要编为模块的。但是我最后编译的2.6.23.14内核中没有这一项,因此就必须到intellinuxwireless.org下载3495ABG的驱动了。
3、File System -->
DOS/FAT/NT Filesystems -->
<*> VFAT (Windows-95) fs support
(437) Default codepage for FAT (NEW)
(utf8) Default iocharset for FAT (NEW)
将 VFAT (Windows-95) fs support 选为y是为了让内核能支持FAT格式硬盘的挂载。这里codepage要用437;在网上很多文章都说要用936,这样才能让FAT硬盘的文件名显示支持中文,但事实上我这么做之后,在挂载FAT分区时却被新内核提示无法挂载,系统日志显示找不到codepage 936——可是我已经将codepage 936编进内核了啊(下文会说明),因此在这一点上我相当困惑。后来发现FAT分区的中文文件名能否正确显示是取决于 Default iocharset for FAT 这一项,其字符编码要使用utf8才行。原因上,也许是因为Windows的FAT分区默认的字符编码是ascii或gb2312,而Linux默认的是utf8编码,认不得gb2312……这个地方我也不太明白。
4、File System -->
Native Language Support -->
[M]Simplified Chinese charset (CP936, GB2312)
想要中文支持的话,当然要选上这一项(事实上Native Language Support 这一栏我就没动,默认是全部选上的,其中ASCII一项默认被编进内核)。
5、Kernel hacking -->
[ ]Use 4Kb for kernel stacks instead of 8Kb
如果想要使用ndiswrapper作为无线网卡驱动的话,这一项就要选为n。因为据说Windows和Linux的栈结构是不一样的。