优化RHEL5的内核网络参数
[
2010/07/14 18:40 | by 井宿 ]
2010/07/14 18:40 | by 井宿 ]
vi /etc/sysctl.conf,加入以下参数,保存后使用/sbin/sysctl -p命令使设置生效或重启机器。
##减少超时前的探测次数
net.ipv4.tcp_keepalive_probes=5
##确定两次 isAlive 时间间隔探测之间的等待时间
net.ipv4.tcp_keepalive_intvl=15
##调整系统同时发起连接的tcp连接数
net.core.netdev_max_backlog=3000
net.core.somaxconn=3000
##减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalive_time=1800
##增加TCP SYN队列长度,使系统可以处理更多的并发连接。
net.ipv4.tcp_max_syn_backlog=8192
##减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
net.ipv4.tcp_fin_timeout=30
##打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
##优化TCP接收/发送缓冲区
net.ipv4.tcp_rmem=8192 4194304 8388608
net.ipv4.tcp_wmem=4096 2097152 8388608
##优化网络设备接收队列
net.core.netdev_max_backlog=3000
##优化系统套接字缓冲区
net.core.rmem_default=8388608
net.core.rmem_max=8388608
net.core.wmem_default=8388608
net.core.wmem_max=8388608
##打开TCP SYN cookie选项,有助于保护服务器免受SyncFlood攻击(RHEL5安装完就有了,没有加上)
net.ipv4.tcp_syncookies=1
##减少超时前的探测次数
net.ipv4.tcp_keepalive_probes=5
##确定两次 isAlive 时间间隔探测之间的等待时间
net.ipv4.tcp_keepalive_intvl=15
##调整系统同时发起连接的tcp连接数
net.core.netdev_max_backlog=3000
net.core.somaxconn=3000
##减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalive_time=1800
##增加TCP SYN队列长度,使系统可以处理更多的并发连接。
net.ipv4.tcp_max_syn_backlog=8192
##减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
net.ipv4.tcp_fin_timeout=30
##打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
##优化TCP接收/发送缓冲区
net.ipv4.tcp_rmem=8192 4194304 8388608
net.ipv4.tcp_wmem=4096 2097152 8388608
##优化网络设备接收队列
net.core.netdev_max_backlog=3000
##优化系统套接字缓冲区
net.core.rmem_default=8388608
net.core.rmem_max=8388608
net.core.wmem_default=8388608
net.core.wmem_max=8388608
##打开TCP SYN cookie选项,有助于保护服务器免受SyncFlood攻击(RHEL5安装完就有了,没有加上)
net.ipv4.tcp_syncookies=1
Jexus web server for linux V3.6 版的安装使用
[
2010/07/14 18:04 | by 井宿 ]
2010/07/14 18:04 | by 井宿 ]
Jexus 是Linux/Unix平台真正意义上的ASP.NET WEB服务器,是基于Linux/Unix平台建设ASP.NET网站的必然选择和最优方案!
Jexus 内置安全监测与自动防控功能,较之其它WEB服务器拥有更强的安全保障能力,而Jexus所具有URL重写、反向代理、无文件路由及对PHP的支持等重要功能,为建设企业级服务平台提供了强有力的支持。
一、安装:
安装前的准备工作:
A、安装好mono 2.4.3.1 或更高版本。
Mono的官方网址是:www.go-mono.com
Mono的下载地址:http://www.go-mono.com/mon... 。
B、必须以 root 身份登入服务器。
1、下载:
下载地址是:http://linux.j66.net/down/...
2、解压:
tar -zxvf jexus-4.0.tar.gz
3、安装:
Jexus安装非常简单,仅仅就是一个复制和注册全局程序集的过程
A、从V3.3/V3.4/3.5版升级安装:
1) 停止旧版jexus的运行:
sudo /etc/jws/jws.stop
2) 卸载全局程序集:
sudo gacutil -u jxAspx
sudo gacutil -j jxHost
2) 将解压文件夹中的下列文件复制到原来安装jexus的文件夹:
jws.exe
jwsHttpd.exe
jwsWorker.exe
jwsState.exe
jxAspx.dll
jxHost.dll
jws.regsvr
jws.start
jws.restart
jws.stop
3) 将 jws.regsvr、jws.start、jws.restart、jws.stop 设为可执行
4) 注册全局程序集(*非常重要*)
进入安装jexus目标文件夹,然后运行:
sudo ./jws.regsvr
B、全新安装:
1) 建立jexus安装文件夹:
sudo mkdir /etc/jws
2) 把解压所得到的文件及文件夹全部复制到 /etc/jws 这个文件夹中
3) 将 jws.regsvr、jws.start、jws.restart、jws.stop 设为可执行
4) 注册全局程序集(*非常重要*)
进入安装jexus目标文件夹,然后运行:
sudo ./jws.regsvr
二、Jexus web server (jws) 配置:
在与 jws.exe 相同的文件夹中(即安装文件夹,一般是“/etc/jws”)为Jexus建立一个配置文件,文件名一定要设为“jws.conf”。
sudo vim jws.conf
在 jws.conf 中至少得添加 SiteConfigDir 和 SiteLogDir 两行信息:
SiteConfigDir=/etc/jws/sites #指的是存放网站配置文件的文件夹,可以使用基于jws.exe文件的相对路径
SiteLogDir=/etc/jws/logs #指的是存放jexus日志的文件夹,可以使用基于jws.exe文件的相对路径
重要提示:
必须为Jexus指定并创建两个专用文件夹,一个是用于存放日志文件的“日志文件夹”,一个是存放网站配置文件的“网站配置文件夹”。
日志文件夹必须让jexus系统有写入权,因为它会在这儿写入jexus系统日志、网站访问日志等重要内容,安装程序中已经建了一个文件夹,名字是logs。
网站配置文件夹是用存放网站配置文件的地方(安装包中已经建了这个文件夹,名字是sites),既使只有一个网站,也必须有这个文件夹,因为jexus启动时会从这个文件夹读取网站配置的内容。
三、网站配置
Jexus支持多站点,可以用不同的端口、域名、虚拟路径设置任意多的网站。
必须把所有网站配置文件放到jws.conf指定的网站配置文件夹内,这个文件夹除了网站配置文件,不能有其它任何文件,因为jexus会认为这儿的任何一个文件都是配置文件。
每个网站有且只有一个配置文件,配置文件的文件名就是这个网站的名称,比如 www.mysite.cn这个网站,配置文件名可以写成“mysite”,当然也可以写成其它文件名。
一个网站可以拥有任意多的域名,不同网站不能有相同的域名,没有域名的网站只能有一个,这个没有域名的网站叫做“默认网站”,而一台服务器最多只能有一个默认网站。
***强调:网站配置文件的文件名不能有空格。
下面以www.mysite.cn为例,说说网站的配置
在网站配置文件夹中建立一个文件,这个文件的名称应该有一些意义(至少要能让服务器管理员了解这个配置文件是属于哪一个网站的)
设这个网站的配置文件的文件名为:mysite
sudo miv mysite
A、网站配置的基本内容:
port=80 # jexus WEB服务器侦听端口(必填。当然可以是其它端口)
root=/ /var/www/mysite # 网站URL根路径(虚拟目录)和对应的物理路径,用空格分开(必填。既然是一个纯粹的反向代理站,也得填)
#可选项
hosts=mysite.cn,www.mysite.cn # 网站域名(建议填写),可以用泛域名,比如:*.mysite.cn(不填此项或只填一个“*”号表示这是默认网站)
indexs=index.aspx,index.htm # 首页文件名,可以写多个,用英文逗号分开(可以不填。因为JWS系统含有常用首页名)
aspnet_exts=mspx,ttt # 添加新出现的或自定义的ASP.NET扩展名(不建议填。多个扩展名用英文逗号分开,不加点号。系统含有常用扩展名)
注:V4.0版已经弃用了V3.5及更低版本所有的path字段,V4.0版的root项,就是过去版本的root项与path项的合成项。
B、最简配置示例
最简配置只需port和root两项,如:
port=80
root=/ /var/www/default
注:以上两个条目的含义:“port=80”指本网站的服务端口是80(标准的WEB服务端口);“root=/ /var/www/default”是指该网站的的虚拟根路径是“/”,所对应的物理文件夹的绝对路径是“/var/www/default”。
Jexus 内置安全监测与自动防控功能,较之其它WEB服务器拥有更强的安全保障能力,而Jexus所具有URL重写、反向代理、无文件路由及对PHP的支持等重要功能,为建设企业级服务平台提供了强有力的支持。
一、安装:
安装前的准备工作:
A、安装好mono 2.4.3.1 或更高版本。
Mono的官方网址是:www.go-mono.com
Mono的下载地址:http://www.go-mono.com/mon... 。
B、必须以 root 身份登入服务器。
1、下载:
下载地址是:http://linux.j66.net/down/...
2、解压:
tar -zxvf jexus-4.0.tar.gz
3、安装:
Jexus安装非常简单,仅仅就是一个复制和注册全局程序集的过程
A、从V3.3/V3.4/3.5版升级安装:
1) 停止旧版jexus的运行:
sudo /etc/jws/jws.stop
2) 卸载全局程序集:
sudo gacutil -u jxAspx
sudo gacutil -j jxHost
2) 将解压文件夹中的下列文件复制到原来安装jexus的文件夹:
jws.exe
jwsHttpd.exe
jwsWorker.exe
jwsState.exe
jxAspx.dll
jxHost.dll
jws.regsvr
jws.start
jws.restart
jws.stop
3) 将 jws.regsvr、jws.start、jws.restart、jws.stop 设为可执行
4) 注册全局程序集(*非常重要*)
进入安装jexus目标文件夹,然后运行:
sudo ./jws.regsvr
B、全新安装:
1) 建立jexus安装文件夹:
sudo mkdir /etc/jws
2) 把解压所得到的文件及文件夹全部复制到 /etc/jws 这个文件夹中
3) 将 jws.regsvr、jws.start、jws.restart、jws.stop 设为可执行
4) 注册全局程序集(*非常重要*)
进入安装jexus目标文件夹,然后运行:
sudo ./jws.regsvr
二、Jexus web server (jws) 配置:
在与 jws.exe 相同的文件夹中(即安装文件夹,一般是“/etc/jws”)为Jexus建立一个配置文件,文件名一定要设为“jws.conf”。
sudo vim jws.conf
在 jws.conf 中至少得添加 SiteConfigDir 和 SiteLogDir 两行信息:
SiteConfigDir=/etc/jws/sites #指的是存放网站配置文件的文件夹,可以使用基于jws.exe文件的相对路径
SiteLogDir=/etc/jws/logs #指的是存放jexus日志的文件夹,可以使用基于jws.exe文件的相对路径
重要提示:
必须为Jexus指定并创建两个专用文件夹,一个是用于存放日志文件的“日志文件夹”,一个是存放网站配置文件的“网站配置文件夹”。
日志文件夹必须让jexus系统有写入权,因为它会在这儿写入jexus系统日志、网站访问日志等重要内容,安装程序中已经建了一个文件夹,名字是logs。
网站配置文件夹是用存放网站配置文件的地方(安装包中已经建了这个文件夹,名字是sites),既使只有一个网站,也必须有这个文件夹,因为jexus启动时会从这个文件夹读取网站配置的内容。
三、网站配置
Jexus支持多站点,可以用不同的端口、域名、虚拟路径设置任意多的网站。
必须把所有网站配置文件放到jws.conf指定的网站配置文件夹内,这个文件夹除了网站配置文件,不能有其它任何文件,因为jexus会认为这儿的任何一个文件都是配置文件。
每个网站有且只有一个配置文件,配置文件的文件名就是这个网站的名称,比如 www.mysite.cn这个网站,配置文件名可以写成“mysite”,当然也可以写成其它文件名。
一个网站可以拥有任意多的域名,不同网站不能有相同的域名,没有域名的网站只能有一个,这个没有域名的网站叫做“默认网站”,而一台服务器最多只能有一个默认网站。
***强调:网站配置文件的文件名不能有空格。
下面以www.mysite.cn为例,说说网站的配置
在网站配置文件夹中建立一个文件,这个文件的名称应该有一些意义(至少要能让服务器管理员了解这个配置文件是属于哪一个网站的)
设这个网站的配置文件的文件名为:mysite
sudo miv mysite
A、网站配置的基本内容:
port=80 # jexus WEB服务器侦听端口(必填。当然可以是其它端口)
root=/ /var/www/mysite # 网站URL根路径(虚拟目录)和对应的物理路径,用空格分开(必填。既然是一个纯粹的反向代理站,也得填)
#可选项
hosts=mysite.cn,www.mysite.cn # 网站域名(建议填写),可以用泛域名,比如:*.mysite.cn(不填此项或只填一个“*”号表示这是默认网站)
indexs=index.aspx,index.htm # 首页文件名,可以写多个,用英文逗号分开(可以不填。因为JWS系统含有常用首页名)
aspnet_exts=mspx,ttt # 添加新出现的或自定义的ASP.NET扩展名(不建议填。多个扩展名用英文逗号分开,不加点号。系统含有常用扩展名)
注:V4.0版已经弃用了V3.5及更低版本所有的path字段,V4.0版的root项,就是过去版本的root项与path项的合成项。
B、最简配置示例
最简配置只需port和root两项,如:
port=80
root=/ /var/www/default
注:以上两个条目的含义:“port=80”指本网站的服务端口是80(标准的WEB服务端口);“root=/ /var/www/default”是指该网站的的虚拟根路径是“/”,所对应的物理文件夹的绝对路径是“/var/www/default”。
恩,近来无聊, 发发与前女友们的交流情况,话说别人的生活我本不该操心,谁让咱当初也有真情呢,呵呵,除了老2,其他人还都挺愿意和我沟通的.
老一: 已经婚了, 前两天在Q上碰到了,人家陪老公一家从国外回来看世博会,过着踏踏实实的生活,赞一个
老二: 博客发了一大堆牢骚,看来还是太年轻,不能好好相处和男友之间的生活,慢慢来吧
老三:已经婚了,在日本,据说也不是很好的日子,希望回国,日语三级,我想,中国人还是很难在国外过的惯吧
老四:还在征婚中,多年不变,但是也爱美了,没事把艺术照放几张到网上,老四的意思:这年头玩玩的人多,真正想结婚的还没遇到
老五: 貌似和男友不是很融洽?吵架就不好了...两个人再慢慢磨和吧.....老五很有艺术细胞,对感情估计很讲究.
老六: ..... 这个我还不敢说.....怕跪CPU....
老一: 已经婚了, 前两天在Q上碰到了,人家陪老公一家从国外回来看世博会,过着踏踏实实的生活,赞一个
老二: 博客发了一大堆牢骚,看来还是太年轻,不能好好相处和男友之间的生活,慢慢来吧
老三:已经婚了,在日本,据说也不是很好的日子,希望回国,日语三级,我想,中国人还是很难在国外过的惯吧
老四:还在征婚中,多年不变,但是也爱美了,没事把艺术照放几张到网上,老四的意思:这年头玩玩的人多,真正想结婚的还没遇到
老五: 貌似和男友不是很融洽?吵架就不好了...两个人再慢慢磨和吧.....老五很有艺术细胞,对感情估计很讲究.
老六: ..... 这个我还不敢说.....怕跪CPU....
linux 下CA服务器安装(双加密)
[
2010/07/07 17:44 | by 井宿 ]
2010/07/07 17:44 | by 井宿 ]
本文在LINUX AS3.0+apache2.0.x,openssl0.97 上实验通过
首先在安装之前要明白一些基本概念
1、SSL所使用的证书可以自己生成,也可以通过一个商业性CA(如Verisign 或 Thawte)签署证书。
2、证书的概念:首先要有一个根证书,然后用根证书来签发服务器证书和客户证书,一般理解:服务器证书和客户证书是平级关系。在SSL必须安装根证书和服务器证书来认证。 因此:在此环境中,至少必须有三个证书:根证书,服务器证书,客户端证书。
在生成证书之前,一般会有一个私钥,同时用私钥生成证书请求,再利用证书服务器的根证来签发证书。
3、签发证书的问题:我最近找了很多关于openssl的资料,基本上只生成了根证书和私钥及服务器证书请求,并没有真正的实现签证。我这里参考了一些资料,用openssl自带的一个CA.sh来签证书,而不是用MOD_ssl里的sign.sh来签。用openssl语法来生成证书,有很多条件限定,如目录,key的位置等,比较麻烦,我实验了好几天,最后放弃了。有兴趣的可以参考一下openssl 手册。
步骤一:安装openssl和apache
1、到www.openssl.org下载openssl-0.9.7e.tar.gz(目前最新版)
2、卸载掉老的opensll库(如果卸载了出错,说找不到某些*.so.x的文件就不要卸载)
命令:
#rpm –e –-nodeps openssl
3、解压:
命令:
#tar xzvf openssl-0.9.7e.tar.gz
4、进入openssl目录,并安装,用--prefix指定openssl安装目录
命令:
#cd openssl-0.9.7e
#./config --prefix="/usr/local/openssl"
#make
#make test
#make install
5、安装apache (如果安装系统的时候按需配置安装了apache也可以,我是这种方法)
至www.apache.org/dist下载apache最新版httpd-2.0.52.tar.gz
解压后进入apache目录,根据需要安装需要的模块,我这里装了ssl,rewrite,动态模式安装
命令:
#tar zxvf httpd-2.0.52.tar.gz
#cd httpd-2.0.52
#./configure --prefix="PREFIX" --enable-ssl --enable-rewrite --enable-so --with-ssl="/usr/local/openssl"
#make
#make install
步骤二:签证
安装openssl后,在openssl下有一个CA.sh文件,就是利用此文件来签证,来签三张证书,然后利用这三张证书来布SSL服务器。
1、在/usr/local/apache/conf下,建立一个ssl.crt目录,将CA.sh文件copy至/usr/local/apache/conf/ssl.crt/目录
命令:
#cp /usr/local/openssl/ssl/misc/CA.sh /usr/local/apache/conf/ssl.crt/CA.sh
2、运行CA.sh -newca,他会找您要CA需要的一个CA自己的私有密钥密码文件。如果没有这个文件?按回车会自动创建,输入密码来保护这个密码文件。之后会要您的一个公司信息来做CA.crt文件。最后在当前目录下多了一个./demoCA这样的目录
../demoCA/private/cakey.pem就是CA的key文件
./demoCA/cacert.pem就是CA的crt文件
命令:
# ./CA.sh -newca
要求输入如下信息:
首先在安装之前要明白一些基本概念
1、SSL所使用的证书可以自己生成,也可以通过一个商业性CA(如Verisign 或 Thawte)签署证书。
2、证书的概念:首先要有一个根证书,然后用根证书来签发服务器证书和客户证书,一般理解:服务器证书和客户证书是平级关系。在SSL必须安装根证书和服务器证书来认证。 因此:在此环境中,至少必须有三个证书:根证书,服务器证书,客户端证书。
在生成证书之前,一般会有一个私钥,同时用私钥生成证书请求,再利用证书服务器的根证来签发证书。
3、签发证书的问题:我最近找了很多关于openssl的资料,基本上只生成了根证书和私钥及服务器证书请求,并没有真正的实现签证。我这里参考了一些资料,用openssl自带的一个CA.sh来签证书,而不是用MOD_ssl里的sign.sh来签。用openssl语法来生成证书,有很多条件限定,如目录,key的位置等,比较麻烦,我实验了好几天,最后放弃了。有兴趣的可以参考一下openssl 手册。
步骤一:安装openssl和apache
1、到www.openssl.org下载openssl-0.9.7e.tar.gz(目前最新版)
2、卸载掉老的opensll库(如果卸载了出错,说找不到某些*.so.x的文件就不要卸载)
命令:
#rpm –e –-nodeps openssl
3、解压:
命令:
#tar xzvf openssl-0.9.7e.tar.gz
4、进入openssl目录,并安装,用--prefix指定openssl安装目录
命令:
#cd openssl-0.9.7e
#./config --prefix="/usr/local/openssl"
#make
#make test
#make install
5、安装apache (如果安装系统的时候按需配置安装了apache也可以,我是这种方法)
至www.apache.org/dist下载apache最新版httpd-2.0.52.tar.gz
解压后进入apache目录,根据需要安装需要的模块,我这里装了ssl,rewrite,动态模式安装
命令:
#tar zxvf httpd-2.0.52.tar.gz
#cd httpd-2.0.52
#./configure --prefix="PREFIX" --enable-ssl --enable-rewrite --enable-so --with-ssl="/usr/local/openssl"
#make
#make install
步骤二:签证
安装openssl后,在openssl下有一个CA.sh文件,就是利用此文件来签证,来签三张证书,然后利用这三张证书来布SSL服务器。
1、在/usr/local/apache/conf下,建立一个ssl.crt目录,将CA.sh文件copy至/usr/local/apache/conf/ssl.crt/目录
命令:
#cp /usr/local/openssl/ssl/misc/CA.sh /usr/local/apache/conf/ssl.crt/CA.sh
2、运行CA.sh -newca,他会找您要CA需要的一个CA自己的私有密钥密码文件。如果没有这个文件?按回车会自动创建,输入密码来保护这个密码文件。之后会要您的一个公司信息来做CA.crt文件。最后在当前目录下多了一个./demoCA这样的目录
../demoCA/private/cakey.pem就是CA的key文件
./demoCA/cacert.pem就是CA的crt文件
命令:
# ./CA.sh -newca
要求输入如下信息:
unix时间戳与系统时间相互转换
[
2010/07/07 11:53 | by 井宿 ]
2010/07/07 11:53 | by 井宿 ]
取得unix时间戳
date +%s
linux:
将时间戳1123495443 换算成可以识别的年月日分秒
date -d '1970-01-01 UTC 1123495443 seconds'
FreeBSD:
date -j -f "%Y%m%d " `date +%Y%m%d` "+ %s"
#date指令 源日期格式 要转换出的格式
date +%s
linux:
将时间戳1123495443 换算成可以识别的年月日分秒
date -d '1970-01-01 UTC 1123495443 seconds'
FreeBSD:
date -j -f "%Y%m%d " `date +%Y%m%d` "+ %s"
#date指令 源日期格式 要转换出的格式
getmail+procmail+msmtp实现自动下载并过滤转发邮件
[
2010/07/07 11:52 | by 井宿 ]
2010/07/07 11:52 | by 井宿 ]
1、概述
qxj监测软件项目实施了半年了,因为检测到有警告和错误,都会发给一个邮箱,而且监测软件只能设置发给一个邮箱。试想全国34个省,每省4台机器,时不时有一台网络不稳定的就发一封邮件,一天能收到百十来封邮件,管理员根本看不过来,所以提出新的需求:哪个省的邮件发给哪个省的管理员。
监测软件没有这个功能,只能在系统上想办法实现了。
最简单的方法就是:从该邮箱中把所有邮件收下来,然后根据邮件内容判断是哪个省的,就发给哪个省的管理员。
收邮件可以使用getmail(http://pyropus.ca/software...),getmail是一个基于GPL协议的开源软件,可以自动从多个邮箱中收取邮件到本地,支持pop3和IMAP。可以接合procmail实现邮件过滤,对不同的邮件做不同的操作。
邮件过滤使用procmail(http://www.procmail.org/),procmail 是一个强大得惊人的过滤进入邮件的应用程序。它允许用户定义 “规则”, 并用这些规则来匹配进入的邮件, 进而执行某些特定的功能,或将这些邮件转发到其他信箱和/或邮件地址。
邮件发送可以使用postfix或者senmail,缺点是只能使用本机的mail域名发送给用户。这里采用msmtp(http://msmtp.sourceforge.n...),msmtp是一个简单灵活的MTA,并且设置极为方便,可以从特定的邮箱发送邮件。
系统为:RedFlag DC Server 5.0 SP2 ia32
2、配置
因为测试发现用root实现全部功能有问题,具体哪步出问题忘记了,所以整个配置是在work用户下面操作。
2.1、getmail配置
从getmail网站下载最新getmail-4.16版本,直接编译成rpm包即可安装。
rpmbuild -tb getmail-4.16.0.tar.gz
rpm -ivh getmail-4.16.0-1.noarch.rpm
注意:编译完可不在当前目录下,在哪里?自己找。
默认getmail的配置文件是~/.getmail/getmailrc,需要手工建立.getmail目录
mkdir .getmail
mkdir .getmail/mail
创建~/.getmail/getmailrc文件,添加内容如下(可以通过/usr/share/doc/getmail-4.16.0/faq.txt中的例子修改):
[options]
read_all = false
delete = false #在服务器上保存附件
message_log = ~/.getmail/getmail.log #记录日志
[retriever]
type = SimplePOP3Retriever
server = mail.redflag-linux.com
username = dffan
password = secret
[destination]
type = MDA_external
path = /usr/bin/procmail #使用procmail过滤邮件
#type = Maildir #只是收到本机
#path = ~/.getmail/mail/
如果只是将邮件收到本机,可以将
type = MDA_external
path = /usr/bin/procmail
修改为
type = Maildir
path = ~/.getmail/mail/
这样就可以直接将邮件收取到~/.getmail/mail/目录下
在保证机器可以正确上网并解析域名的前提下,执行getmail可以将邮件收取到本机
2.2、配置procmail
getmail掉用procmail过滤邮件,那么procmail需要相应的配置。系统默认自带procmail可以使用,直接配置即可。
procmail默认配置文件~/.procmailrc,创建此文件并添加如下内容(参考/usr/share/doc/procmail-3.22/examples/2procmailrc):
PATH=/bin:/sbin:/usr/bin:/usr/sbin
SHELL=/bin/bash
MAILDIR=~/.getmail/mail/ #邮件存放目录
DEFAULT=$MAILDIR
LOGFILE="~/.getmail/procmail.log" #日志文件
#:0 B #后面的B是对邮件正文过滤
#* ^From.*@redflag-linux.com
#beijing.txt #来自redflag-linux.com的邮件保存到beijing.txt中
:0 B
* ^Beijing #邮件内容如果有以Beijing开头行,则取Subject和NOTE开头的行之间的内容,保存到monitor.log文件并且发送到 redflag_linux@163.com
|sed -n '/Subject/,/NOTE/p'|tee -a /home/work/.getmail/mail/monitor.log|mail -s "Limon Notification Message" redflag_linux@163.com
#-----------------------------------------------------------------------------------------
:0 B
* ^Hebei
|sed -n '/Subject/,/NOTE/p'|tee -a /home/work/.getmail/mail/monitor.log|mail -s "Limon Notification Message" redflag-linux@163.com
#-----------------------------------------------------------------------------------------
:0 B
* ^Tianjin
|sed -n '/Subject/,/NOTE/p'|tee -a /home/work/.getmail/mail/monitor.log|mail -s "Limon Notification Message" fan3838@tom.com
#-----------------------------------------------------------------------------------------
#:0
#*
#/home/work/.getmail/mail/ #其他全部放到指定目录下
2.3、msmtp配置
前面procmail过滤出邮件之后转发到特定邮件,使用的是mail命令,mail命令默认是sendmail,既然要使用msmtp,就需要重定义。
编辑~/.mailrc文件,添加如下一行:
set sendmail="/usr/local/bin/msmtp" #根据实际情况而定
系统使用msmtp转发邮件,系统默认没带,需要安装msmtp。从msmtp网站下载最新的1.4.20版本。
包中没有spac文件,解压后直接编译安装即可(可以从网上下载spac文件编译成rpm包)。
tar xvfj msmtp-1.4.20.tar.bz2
cd msmtp-1.4.20
./configure
make
make install
安装完毕之后,创建~/.msmtprc文件(参考man msmtp),其中定义使用哪个邮箱转发邮件:
account main
logfile ~/.getmail/msmtp.log
host mail.redflag-linux.com
from dffan@redflag-linux.com
auth login
user dffan
password secret
account default : main
2.4、计划任务配置
上述的配置完毕之后,如果配置无误已经可以正确收取邮件,并且将特定的邮件转发到特定邮箱了。
为了实现自动化,需要在计划任务crond中添加
*/15 * * * * /usr/bin/getmail
3、问题分析
即使保证上述配置无误的情况下,也无法避免一些意想不到的错误,比如有人会提出疑问:你没开postfix或者sendmail难道能转发出去?
postfix我确实已经启动了,不过是为监测软件发邮件用的。
如果出现问题,可以查看的日志有哪些?
~/.getmail/msmtp.log
~/.getmail/procmail.log
~/.getmail/getmail.log
这三个是主要的日志,如果没有达到上述结果,这三个文件中某一个或者两个会看出来原因。
当然不要忘记/var/log/maillog和/var/log/messages,还有/var/log/cron。
qxj监测软件项目实施了半年了,因为检测到有警告和错误,都会发给一个邮箱,而且监测软件只能设置发给一个邮箱。试想全国34个省,每省4台机器,时不时有一台网络不稳定的就发一封邮件,一天能收到百十来封邮件,管理员根本看不过来,所以提出新的需求:哪个省的邮件发给哪个省的管理员。
监测软件没有这个功能,只能在系统上想办法实现了。
最简单的方法就是:从该邮箱中把所有邮件收下来,然后根据邮件内容判断是哪个省的,就发给哪个省的管理员。
收邮件可以使用getmail(http://pyropus.ca/software...),getmail是一个基于GPL协议的开源软件,可以自动从多个邮箱中收取邮件到本地,支持pop3和IMAP。可以接合procmail实现邮件过滤,对不同的邮件做不同的操作。
邮件过滤使用procmail(http://www.procmail.org/),procmail 是一个强大得惊人的过滤进入邮件的应用程序。它允许用户定义 “规则”, 并用这些规则来匹配进入的邮件, 进而执行某些特定的功能,或将这些邮件转发到其他信箱和/或邮件地址。
邮件发送可以使用postfix或者senmail,缺点是只能使用本机的mail域名发送给用户。这里采用msmtp(http://msmtp.sourceforge.n...),msmtp是一个简单灵活的MTA,并且设置极为方便,可以从特定的邮箱发送邮件。
系统为:RedFlag DC Server 5.0 SP2 ia32
2、配置
因为测试发现用root实现全部功能有问题,具体哪步出问题忘记了,所以整个配置是在work用户下面操作。
2.1、getmail配置
从getmail网站下载最新getmail-4.16版本,直接编译成rpm包即可安装。
rpmbuild -tb getmail-4.16.0.tar.gz
rpm -ivh getmail-4.16.0-1.noarch.rpm
注意:编译完可不在当前目录下,在哪里?自己找。
默认getmail的配置文件是~/.getmail/getmailrc,需要手工建立.getmail目录
mkdir .getmail
mkdir .getmail/mail
创建~/.getmail/getmailrc文件,添加内容如下(可以通过/usr/share/doc/getmail-4.16.0/faq.txt中的例子修改):
[options]
read_all = false
delete = false #在服务器上保存附件
message_log = ~/.getmail/getmail.log #记录日志
[retriever]
type = SimplePOP3Retriever
server = mail.redflag-linux.com
username = dffan
password = secret
[destination]
type = MDA_external
path = /usr/bin/procmail #使用procmail过滤邮件
#type = Maildir #只是收到本机
#path = ~/.getmail/mail/
如果只是将邮件收到本机,可以将
type = MDA_external
path = /usr/bin/procmail
修改为
type = Maildir
path = ~/.getmail/mail/
这样就可以直接将邮件收取到~/.getmail/mail/目录下
在保证机器可以正确上网并解析域名的前提下,执行getmail可以将邮件收取到本机
2.2、配置procmail
getmail掉用procmail过滤邮件,那么procmail需要相应的配置。系统默认自带procmail可以使用,直接配置即可。
procmail默认配置文件~/.procmailrc,创建此文件并添加如下内容(参考/usr/share/doc/procmail-3.22/examples/2procmailrc):
PATH=/bin:/sbin:/usr/bin:/usr/sbin
SHELL=/bin/bash
MAILDIR=~/.getmail/mail/ #邮件存放目录
DEFAULT=$MAILDIR
LOGFILE="~/.getmail/procmail.log" #日志文件
#:0 B #后面的B是对邮件正文过滤
#* ^From.*@redflag-linux.com
#beijing.txt #来自redflag-linux.com的邮件保存到beijing.txt中
:0 B
* ^Beijing #邮件内容如果有以Beijing开头行,则取Subject和NOTE开头的行之间的内容,保存到monitor.log文件并且发送到 redflag_linux@163.com
|sed -n '/Subject/,/NOTE/p'|tee -a /home/work/.getmail/mail/monitor.log|mail -s "Limon Notification Message" redflag_linux@163.com
#-----------------------------------------------------------------------------------------
:0 B
* ^Hebei
|sed -n '/Subject/,/NOTE/p'|tee -a /home/work/.getmail/mail/monitor.log|mail -s "Limon Notification Message" redflag-linux@163.com
#-----------------------------------------------------------------------------------------
:0 B
* ^Tianjin
|sed -n '/Subject/,/NOTE/p'|tee -a /home/work/.getmail/mail/monitor.log|mail -s "Limon Notification Message" fan3838@tom.com
#-----------------------------------------------------------------------------------------
#:0
#*
#/home/work/.getmail/mail/ #其他全部放到指定目录下
2.3、msmtp配置
前面procmail过滤出邮件之后转发到特定邮件,使用的是mail命令,mail命令默认是sendmail,既然要使用msmtp,就需要重定义。
编辑~/.mailrc文件,添加如下一行:
set sendmail="/usr/local/bin/msmtp" #根据实际情况而定
系统使用msmtp转发邮件,系统默认没带,需要安装msmtp。从msmtp网站下载最新的1.4.20版本。
包中没有spac文件,解压后直接编译安装即可(可以从网上下载spac文件编译成rpm包)。
tar xvfj msmtp-1.4.20.tar.bz2
cd msmtp-1.4.20
./configure
make
make install
安装完毕之后,创建~/.msmtprc文件(参考man msmtp),其中定义使用哪个邮箱转发邮件:
account main
logfile ~/.getmail/msmtp.log
host mail.redflag-linux.com
from dffan@redflag-linux.com
auth login
user dffan
password secret
account default : main
2.4、计划任务配置
上述的配置完毕之后,如果配置无误已经可以正确收取邮件,并且将特定的邮件转发到特定邮箱了。
为了实现自动化,需要在计划任务crond中添加
*/15 * * * * /usr/bin/getmail
3、问题分析
即使保证上述配置无误的情况下,也无法避免一些意想不到的错误,比如有人会提出疑问:你没开postfix或者sendmail难道能转发出去?
postfix我确实已经启动了,不过是为监测软件发邮件用的。
如果出现问题,可以查看的日志有哪些?
~/.getmail/msmtp.log
~/.getmail/procmail.log
~/.getmail/getmail.log
这三个是主要的日志,如果没有达到上述结果,这三个文件中某一个或者两个会看出来原因。
当然不要忘记/var/log/maillog和/var/log/messages,还有/var/log/cron。
常在河边走,哪能不湿鞋。用Linux,总有死机的时候,如果运气好,会看到一些所谓”Oops”信息(在屏幕上或系统日志中),比如:
Unable to handle kernel paging request at virtual address f899b670
printing eip:
c01de48c
*pde = 00737067
Oops: 0002 [#1]
Modules linked in: bluesmoke_e752x bluesmoke_mc md5 ipv6 parport_pc lp parport nls_cp936 vfat fat dm_mod button battery asus_acpi ac joydev yenta_socket pcmcia_core uhci_hcd ehci_hcd snd_intel8×0 snd_ac97_codec snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd_page_alloc snd_mpu401_uart snd_rawmidi snd_seq_device snd soundcore ipw2200 ieee80211 ieee80211_crypt sk98lin ext3 jbd
CPU: 0
EIP: 0060:[] Not tainted VLI
EFLAGS: 00210286 (2.6.9-11.21AXKProbes)
EIP is at kobject_add+0×83/0xd7
eax: c038db78 ebx: c038db04 ecx: f899b670 edx: f8a4a630
esi: c038db4c edi: f8a4a614 ebp: c038db80 esp: d7568f2c
ds: 007b es: 007b ss: 0068
Process modprobe (pid: 8227, threadinfo=d7568000 task=f4ea99b0)
Stack: f8a4a614 ffffffea f8a4a5e4 00000000 c01de4f9 f8a4a614 c038db00 c024a1d4
f8a4a5c0 f8a4a5e4 f8a4a5f4 d7568000 c024a661 1d244b3c 00000000 0000000a
c032421b 00000000 00000000 00000015 00000014 00000016 f89ddb34 f8a4a5c0
Call Trace:
[] kobject_register+0×19/0×39
[] bus_add_driver+0×36/0×97
[] driver_register+0×82/0×89
[] pci_register_driver+0×85/0xa1
[] init_module+0xa/0×14 [bluesmoke_e752x]
[] sys_init_module+0×1ec/0×323
[] syscall_call+0×7/0xb
Code: 85 d2 0f 85 06 04 00 00 85 ed 75 0d 8b 47 28 83 c0 10 e8 82 01 00 00 89 c5 8b 47 28 8d 57 1c 83 c0 08 89 47 1c 8b 48 04 89 50 04 <89> 11 89 4a 04 8b 47 28 8b 18 8d 4b 48 89 c8 ba ff ff 00 00 0f
Oops可以看成是内核级的Segmentation Fault。应用程序如果进行了非法内存访问或执行了非法指令,会得到Segfault信号,一般的行为是coredump,应用程序也可以自己截获Segfault信号,自行处理。如果内核自己犯了这样的错误,则会打出Oops信息。
有不少文章说明如何理解这些Oops (http://pczou.blogchina.com...,这里只想解释一下它所产生的过程(以2.6系列内核为例):
首先是处理硬件发出的内存访问异常(fault),有些异常是无辜的(比如demand-paging),而有些则是内核的错误所致。
1. do_page_fault() arch/i386/mm/fault.c
如果是内核进行了非法访问,do_page_fault()会先打出EIP, PDE等信息,例如:
Unable to handle kernel paging request at virtual address f899b670
printing eip:
c01de48c
*pde = 00737067
然后调用 die(“Oops”, regs, error_code);
这之后,如果系统还活着(至少要满足两个条件:1. 在进程上下文 2. 没有设置panic_on_oops),会杀死当前进程。然后继续运行,好像什么事情都没有发生一样。不过,这样的好事不经常发生,发生了也不会太持久。
2. do_page_fault() -> die() arch/i386/kernel/traps.c
die() 首先打出一行:
Oops: 0002 [#1]
其中0002代表错误码 (读错误、发生在内核空间),#1代表Oops发生次数。
* error_code:
* bit 0 == 0 means no page found, 1 means protection fault
* bit 1 == 0 means read, 1 means write
* bit 2 == 0 means kernel, 1 means user-mode
然后,调用 show_registers(regs) 输出寄存器、当前进程、堆栈、指令代码等信息:
Modules linked in: bluesmoke_e752x bluesmoke_mc md5 ipv6 parport_pc lp parport nls_cp936 vfat fat dm_mod button battery asus_acpi ac joydev yenta_socket pcmcia_core uhci_hcd ehci_hcd snd_intel8×0 snd_ac97_codec snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd_page_alloc snd_mpu401_uart snd_rawmidi snd_seq_device snd soundcore ipw2200 ieee80211 ieee80211_crypt sk98lin ext3 jbd
CPU: 0
EIP: 0060:[] Not tainted VLI
EFLAGS: 00210286 (2.6.9-11.21AXKProbes)
EIP is at kobject_add+0×83/0xd7
eax: c038db78 ebx: c038db04 ecx: f899b670 edx: f8a4a630
esi: c038db4c edi: f8a4a614 ebp: c038db80 esp: d7568f2c
ds: 007b es: 007b ss: 0068
Process modprobe (pid: 8227, threadinfo=d7568000 task=f4ea99b0)
Stack: f8a4a614 ffffffea f8a4a5e4 00000000 c01de4f9 f8a4a614 c038db00 c024a1d4
f8a4a5c0 f8a4a5e4 f8a4a5f4 d7568000 c024a661 1d244b3c 00000000 0000000a
c032421b 00000000 00000000 00000015 00000014 00000016 f89ddb34 f8a4a5c0
Call Trace:
[] kobject_register+0×19/0×39
[] bus_add_driver+0×36/0×97
[] driver_register+0×82/0×89
[] pci_register_driver+0×85/0xa1
[] init_module+0xa/0×14 [bluesmoke_e752x]
[] sys_init_module+0×1ec/0×323
[] syscall_call+0×7/0xb
Code: 85 d2 0f 85 06 04 00 00 85 ed 75 0d 8b 47 28 83 c0 10 e8 82 01 00 00 89 c5 8b 47 28 8d 57 1c 83 c0 08 89 47 1c 8b 48 04 89 50 04 <89> 11 89 4a 04 8b 47 28 8b 18 8d 4b 48 89 c8 ba ff ff 00 00 0f
如果是在中断上下文,则直接调用panic()。如果是在进程上下文,则根据panic_on_oops的设置选择是否panic()。panic_on_oops的缺省设置是”0″,即在Oops发生时不会进行panic()操作。可以通过sysctl进行设置:
sysctl -w kernel.panic_on_oops=1
有panic_on_oops这样的设置,说明Oops不一定导致系统死亡,也不一定需要重新启动系统。正如用户程序segfault时可能还能坚持运行一样。不过Oops一旦发生,系统已经有些不正常了,即使表面上可能还正常,不过可能有些锁已经被占用而无法释放,很快会导致系统死锁。
那么,panic()是什么呢?panic()和用户空间的abort()类似,简单清理一下,就可以放心去死(reboot)了。
3. do_page_fault() -> die() -> panic()
panic会根据 kernel.panic 的设置决定 reboot 前的延时,如果 kernel.panic=0,则打开中断,陷入死循环。反之,则在几秒之后,reboot系统。
可以看出虽然都是死,但死因不同,死亡时的表现更是五花八门。常见的死因有:
非法内存访问 (比如访问地址0)
非法指令
有时候核心成心发出非法指令,比如BUG() (include/asm/bug.h) 中所做的,以引起Oops。类似用户程序中调用assert()。
死亡发生的地点也很关键,直接导致了死亡的不同表现,比如:
进程上下文
中断上下文
在中断上下文中,由于中断是关闭的,而且往往会占用一些锁,这种情况下一般除了死,没有什么别的办法。
在进程上下文中要自由一些,如果运气好的话,可以苟延残喘一段时间。
Unable to handle kernel paging request at virtual address f899b670
printing eip:
c01de48c
*pde = 00737067
Oops: 0002 [#1]
Modules linked in: bluesmoke_e752x bluesmoke_mc md5 ipv6 parport_pc lp parport nls_cp936 vfat fat dm_mod button battery asus_acpi ac joydev yenta_socket pcmcia_core uhci_hcd ehci_hcd snd_intel8×0 snd_ac97_codec snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd_page_alloc snd_mpu401_uart snd_rawmidi snd_seq_device snd soundcore ipw2200 ieee80211 ieee80211_crypt sk98lin ext3 jbd
CPU: 0
EIP: 0060:[] Not tainted VLI
EFLAGS: 00210286 (2.6.9-11.21AXKProbes)
EIP is at kobject_add+0×83/0xd7
eax: c038db78 ebx: c038db04 ecx: f899b670 edx: f8a4a630
esi: c038db4c edi: f8a4a614 ebp: c038db80 esp: d7568f2c
ds: 007b es: 007b ss: 0068
Process modprobe (pid: 8227, threadinfo=d7568000 task=f4ea99b0)
Stack: f8a4a614 ffffffea f8a4a5e4 00000000 c01de4f9 f8a4a614 c038db00 c024a1d4
f8a4a5c0 f8a4a5e4 f8a4a5f4 d7568000 c024a661 1d244b3c 00000000 0000000a
c032421b 00000000 00000000 00000015 00000014 00000016 f89ddb34 f8a4a5c0
Call Trace:
[] kobject_register+0×19/0×39
[] bus_add_driver+0×36/0×97
[] driver_register+0×82/0×89
[] pci_register_driver+0×85/0xa1
[] init_module+0xa/0×14 [bluesmoke_e752x]
[] sys_init_module+0×1ec/0×323
[] syscall_call+0×7/0xb
Code: 85 d2 0f 85 06 04 00 00 85 ed 75 0d 8b 47 28 83 c0 10 e8 82 01 00 00 89 c5 8b 47 28 8d 57 1c 83 c0 08 89 47 1c 8b 48 04 89 50 04 <89> 11 89 4a 04 8b 47 28 8b 18 8d 4b 48 89 c8 ba ff ff 00 00 0f
Oops可以看成是内核级的Segmentation Fault。应用程序如果进行了非法内存访问或执行了非法指令,会得到Segfault信号,一般的行为是coredump,应用程序也可以自己截获Segfault信号,自行处理。如果内核自己犯了这样的错误,则会打出Oops信息。
有不少文章说明如何理解这些Oops (http://pczou.blogchina.com...,这里只想解释一下它所产生的过程(以2.6系列内核为例):
首先是处理硬件发出的内存访问异常(fault),有些异常是无辜的(比如demand-paging),而有些则是内核的错误所致。
1. do_page_fault() arch/i386/mm/fault.c
如果是内核进行了非法访问,do_page_fault()会先打出EIP, PDE等信息,例如:
Unable to handle kernel paging request at virtual address f899b670
printing eip:
c01de48c
*pde = 00737067
然后调用 die(“Oops”, regs, error_code);
这之后,如果系统还活着(至少要满足两个条件:1. 在进程上下文 2. 没有设置panic_on_oops),会杀死当前进程。然后继续运行,好像什么事情都没有发生一样。不过,这样的好事不经常发生,发生了也不会太持久。
2. do_page_fault() -> die() arch/i386/kernel/traps.c
die() 首先打出一行:
Oops: 0002 [#1]
其中0002代表错误码 (读错误、发生在内核空间),#1代表Oops发生次数。
* error_code:
* bit 0 == 0 means no page found, 1 means protection fault
* bit 1 == 0 means read, 1 means write
* bit 2 == 0 means kernel, 1 means user-mode
然后,调用 show_registers(regs) 输出寄存器、当前进程、堆栈、指令代码等信息:
Modules linked in: bluesmoke_e752x bluesmoke_mc md5 ipv6 parport_pc lp parport nls_cp936 vfat fat dm_mod button battery asus_acpi ac joydev yenta_socket pcmcia_core uhci_hcd ehci_hcd snd_intel8×0 snd_ac97_codec snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd_page_alloc snd_mpu401_uart snd_rawmidi snd_seq_device snd soundcore ipw2200 ieee80211 ieee80211_crypt sk98lin ext3 jbd
CPU: 0
EIP: 0060:[] Not tainted VLI
EFLAGS: 00210286 (2.6.9-11.21AXKProbes)
EIP is at kobject_add+0×83/0xd7
eax: c038db78 ebx: c038db04 ecx: f899b670 edx: f8a4a630
esi: c038db4c edi: f8a4a614 ebp: c038db80 esp: d7568f2c
ds: 007b es: 007b ss: 0068
Process modprobe (pid: 8227, threadinfo=d7568000 task=f4ea99b0)
Stack: f8a4a614 ffffffea f8a4a5e4 00000000 c01de4f9 f8a4a614 c038db00 c024a1d4
f8a4a5c0 f8a4a5e4 f8a4a5f4 d7568000 c024a661 1d244b3c 00000000 0000000a
c032421b 00000000 00000000 00000015 00000014 00000016 f89ddb34 f8a4a5c0
Call Trace:
[] kobject_register+0×19/0×39
[] bus_add_driver+0×36/0×97
[] driver_register+0×82/0×89
[] pci_register_driver+0×85/0xa1
[] init_module+0xa/0×14 [bluesmoke_e752x]
[] sys_init_module+0×1ec/0×323
[] syscall_call+0×7/0xb
Code: 85 d2 0f 85 06 04 00 00 85 ed 75 0d 8b 47 28 83 c0 10 e8 82 01 00 00 89 c5 8b 47 28 8d 57 1c 83 c0 08 89 47 1c 8b 48 04 89 50 04 <89> 11 89 4a 04 8b 47 28 8b 18 8d 4b 48 89 c8 ba ff ff 00 00 0f
如果是在中断上下文,则直接调用panic()。如果是在进程上下文,则根据panic_on_oops的设置选择是否panic()。panic_on_oops的缺省设置是”0″,即在Oops发生时不会进行panic()操作。可以通过sysctl进行设置:
sysctl -w kernel.panic_on_oops=1
有panic_on_oops这样的设置,说明Oops不一定导致系统死亡,也不一定需要重新启动系统。正如用户程序segfault时可能还能坚持运行一样。不过Oops一旦发生,系统已经有些不正常了,即使表面上可能还正常,不过可能有些锁已经被占用而无法释放,很快会导致系统死锁。
那么,panic()是什么呢?panic()和用户空间的abort()类似,简单清理一下,就可以放心去死(reboot)了。
3. do_page_fault() -> die() -> panic()
panic会根据 kernel.panic 的设置决定 reboot 前的延时,如果 kernel.panic=0,则打开中断,陷入死循环。反之,则在几秒之后,reboot系统。
可以看出虽然都是死,但死因不同,死亡时的表现更是五花八门。常见的死因有:
非法内存访问 (比如访问地址0)
非法指令
有时候核心成心发出非法指令,比如BUG() (include/asm/bug.h) 中所做的,以引起Oops。类似用户程序中调用assert()。
死亡发生的地点也很关键,直接导致了死亡的不同表现,比如:
进程上下文
中断上下文
在中断上下文中,由于中断是关闭的,而且往往会占用一些锁,这种情况下一般除了死,没有什么别的办法。
在进程上下文中要自由一些,如果运气好的话,可以苟延残喘一段时间。








2010/07/06 11:31 | by 







