V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
drlittlemouse
V2EX  ›  Linux

一次奇怪的 kernel panic 解决,但求甚解

  •  
  •   drlittlemouse · 2015-10-23 00:31:01 +08:00 · 3842 次点击
    这是一个创建于 3305 天前的主题,其中的信息可能已经有所发展或是发生改变。

    楼主的一台 Linode ,运行好好的突然就 kernel panic 了,不能重启,重启有很大概率无法启动——成功的概率大概小于 1%,不要问我怎么计算的,的确进去过一次...

    首先说频繁重启肯定是 Lassie 狗的原因,检测到系统没有启动就会尝试 reboot ,这并不是问题

    问题在于看到 dmesg 的一瞬间楼主就傻了,贴一小段出来:

    Entering non-interactive startup
    Calling the system activity data collector (sadc)...
    ipset: Loaded with no configuration
    ip6tables: Applying firewall rules: [ OK ]^M
    iptables: Applying firewall rules: [ OK ]^M
    Bringing up loopback interface: [ OK ]^M
    Bringing up interface eth0: BUG: unable to handle kernel NULL pointer dereference at 0000000000000030

    这是在说 eth0 无法启动啊?不过楼主非常确信没有改过网卡的配置。

    于是改为 Single 模式启动, Lish 进去,先检查了一下配置信息,看起来都没什么问题,然后楼主就在拼命回忆之前修改了哪些配置,然并卵,因为很久没重启过了已然记不清了。

    没办法,只好先禁用一部分启动项,把和网络有关的都 chkconfig off 掉了,改回正常运行模式,重启,喵了个咪,起来了!

    于是非常确定嫌犯就在这些启动项里面,最后逐个排查的结果(点重启点到手断),居然是 iptables 导致的!

    于是尝试清空了 iptables 的全部规则,重新 chkconfg iptables on ,重启,没问题!

    那么问题必然出在规则上面了!

    楼主尝试添加了之前删除的规则,没问题! service iptables save 重启!擦,又特喵的挂了!

    那么这几条规则到底是什么呢?还是贴一小部分出来:

    -A PREROUTING -p tcp -m multiport --dports 60000:60199 -j REDIRECT --to-ports XXXX
    -A PREROUTING -p udp -m multiport --dports 60000:60199 -j REDIRECT --to-ports XXXX
    -A PREROUTING -p tcp -m multiport --dports 60200:60399 -j REDIRECT --to-ports XXXX
    -A PREROUTING -p udp -m multiport --dports 60200:60399 -j REDIRECT --to-ports XXXX

    其实就是个范围端口重定向,看起来很正常啊,不过只要 iptables 启动的时候有这些规则,必死无疑。

    想到这里的时候,楼主本来都准备放弃治疗了,干脆启动后动态载入这些规则罢了。

    不过奇迹的瞬间就这么来了,楼主最后一次超载了智商,突然想起来,前几天修改过 sysctl 里面的一个参数 net.ipv4.ip_local_port_range

    赶紧打开配置文件看,现在是 net.ipv4.ip_local_port_range = 1024 65535

    难道是这个端口范围和我的重定向存在冲突?赶紧修改为 1024 59999 ( 60000 以后的楼主都做了重定向),保存全部规则,重启,妥了。

    那么问题来了,且问各位看官,端口重定向为何会引发 kernel panic ?
    和 ip_local_port_ranged 的冲突又是怎么形成的?

    第 1 条附言  ·  2015-10-23 09:11:50 +08:00
    刚才重新验证发现思路有误,其实根本不是 net.ipv4.ip_local_port_range 的问题,重启后再次出现了无法启动的问题

    看了一下 /etc/rc3.d 下面的启动顺序,发现 iptables 、 ip6tables 的启动在 network 之前

    调整一下放在 network 后面启动,无论怎样重启都没问题了。
    7 条回复    2015-10-23 12:56:48 +08:00
    msg7086
        1
    msg7086  
       2015-10-23 00:42:15 +08:00
    我这默认是 32768 61000 啊,怎么会改到那么奇怪的数字的……。
    其实你这个说不定是个 bug ,去 kernel 那边报一下?
    应该是最新版 kernel 吧。
    drlittlemouse
        2
    drlittlemouse  
    OP
       2015-10-23 00:45:19 +08:00
    @msg7086 Linode 自带的不算新吧, 4.1.5 啊
    所以我暂时没有考虑是 kernel 的 bug
    pyKun
        3
    pyKun  
       2015-10-23 00:59:49 +08:00
    楼主试试改成 1024: 60398 有错没
    pyKun
        4
    pyKun  
       2015-10-23 01:00:58 +08:00
    看错了,请忽略上条...
    ceyes
        5
    ceyes  
       2015-10-23 01:07:52 +08:00
    eth0: BUG: unable to handle kernel NULL pointer dereference at 0000000000000030
    空指针解引用,然后内核挂了。
    这当然是 kernel 的 bug 啊, consle.log 里应该有不少的 Call Trace 吧。

    建议换 kernel 试试,排除下先么。

    要求甚解,就仔细读 Call Trace 或 配 kdump 抓 vmcore 慢慢研究,或者找到稳定的重现步骤,报 bug 给 upstream 让他们去研究也是极好的。
    drlittlemouse
        6
    drlittlemouse  
    OP
       2015-10-23 05:58:44 +08:00
    @ceyes 今天晚些时候我切换成 Release 版本内核尝试一下,现在用的是 L 记的优化内核。
    carmark
        7
    carmark  
       2015-10-23 12:56:48 +08:00
    发个 kernel dump 吧,这种要通过 crash core 和代码综合分析了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2831 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.