Linux内核更新超级频繁,但是有必要时刻升级吗?
个人感觉没有必要,但是你要时刻关注新特性列表,然后把自己的内核升级到离最新版本差一两个月发布的版本而不是最新版本,以保证稳定性,因为一两个月的时间足够多的慧眼会发现足够多的问题,既然自己不是Alan Cox那个梯队的大牛,最好不要在自己的生产版本上使用最新内核,当然,做试验或者Just play例外。
为什么要升级内核?是的,很多人并不同意这种观点,可能他们认为使用内核提供的最持久最稳定的接口就已经足够,多数的定制特性需要自己在用户空间开发,当然这也符合UNIX的哲学,并且,他们认为用户态写自己的so而不是bash,python脚本会提高自己软件的竞争力,因为你看不到源代码,一个so就能实现OpenVPN的负载均衡,你又不知道他是怎么做的,所以这种神秘感的背后,人们会认为其技术及其高深。反之,如果使用了内核提供的特性,他们便会认为这种技术谁都可以使用,并不是自己独占独享的,做出来的东西便失去了竞争力。
这种观点是彻头彻尾错误而且及其错误且幼稚的!
关键不是你保留了多少别人不知道的技术细节,关键在于你能多快推出一个可以使用的五脏俱全的最简版本,并且能以多快的频率持续更新,持续优化,而这一切很大的分量上并不是你自己闭门顿悟的,而是来自使用者的反馈。快,才是根本!
怎么才能快?简单,能不自己写的就直接拿来,能利用的现成特性就直接用,这样就节省了自己很大的工作量。要把心思花在如何简单地扩展功能满足需求上,而不是花在钻研某个技术细节上。难道你用C写so的时候,不也是调用了人家C库以及第三方(甚至是你的同事写的)库提供的API么?这不也是拿来?你隐藏的仅仅是如何组装这一切的细节,而这只是一条路而已,没人在乎你是如何将组件组装成功能的,用户在乎的是可以使用。
举例来讲,我在Linux 2.6.32内核上吭哧几个星期也搞不定如何让多个OpenVPN进程共享一块TUN网卡,事实上我改写过TUN驱动,但是没有经过稳定性压力测试,所以能不能用还不知道,我所完成的可能仅仅是可行性预研罢了,后来由于没有项目或者个人原因推动,这种成果也只能停留在纸面上。但是那毕竟消耗了我的时间和精力,虽然我没有占用我的工作时间(到了后期就不一样了),那个时候老婆和女儿又长期不在身边,就我自己在家,我下班后或者周末有的是时间,但是毕竟因为搞这个东西让我直到现在还欠了几部关于古罗马的纪录片没有看!我花了很长时间研究如何实现UDP服务的并发,《UNIX网络编程》上的方案也看过,对于OpenVPN这样的服务而言根本不切实际,我想过通过fork让子进程继承父进程的UDP描述符,但是会有惊群问题,我知道有SO_REUSEPORT这个option,但是Linux的实现并不能满足我的需求(这是实现问题,而不是接口问题),于是我又花了很长实现写出了UDP多端口的负载均衡内核模块,同时想出了利用iptables的random DNAT方案,然而只要我将内核版本升级到3.9.6这个版本或者以上,所有问题都解决了,我只需要在UDP socket上设置一个SO_REUSEPORT选项即可,同时我也不再需要写代码了。
高版本的内核具有三方面的效用,更高效,更多新的特性,曾经bug的修复,但是对于新引入的特性,可能会引入新的bug,不过你仅仅需要慎重使用新特性就可以了。举例来讲,我实际中会使用到的功能,比如TCP的Fast open,网络的命名空间,多队列的TUN网卡,这些在2.6.32内核上就不支持(命名空间有是有,但是接口使用时太不方便)。你是想花一月时间自己写一个多队列的TUN驱动呢?还是希望有一个直接可以用的呢?诚然,高版本内核自带的TUN驱动不是你写的,不能代表你的实力,不能给你带来竞争力,但是你的目的决不仅仅是用上一个多队列的TUN而已,你的目标可能是搞一个另类的OpenVPN,别人不曾想到的那些易用的功能,你自己提炼出来的可能的新的需求,这些才是竞争力,而不是其实现。我通过阿皮亚大道到达罗马,而你辗转阿尔卑斯山,是的,你比我更能体现什么是力量和毅力,但是,我先到了。
升级内核有什么问题呢?没有免费的午餐,升级内核也不例外。升级后,所有的应用软件还能正常吗?这就是说,两个版本的内核的API规范变了吗?一般而言,兼容性是内核API的本质特征之一,可是却不是绝对的,万事都不绝对。因此,不到出问题的时候,你可能永远都不知道它有问题,你能很容易证明一件事情是错误的,但是却很难证明它是正确的。既然这样,那还怕什么,升级是唯一的选择,因为即便你不升级,你也不能证明现在的内核和应用程序之间的配合就一定没有问题,虽然它们至少经过了测试,但是你难道不能在新内核上做同样的测试吗?不能因为惧怕错误而停止前进。
也许你可以坚持所有东西都自己开发以保持自己的原创性以及竞争力,同时小心翼翼守护自己的战果,生怕被别人抢去,并心甘情愿为以上所有这些付出成本,因为每个人都是这么干的。但是我却坚持我的观点,四处搜罗线索,最小化工作量满足最大的需求,东西可以不是我做的,但是一定是我交到你手上的。Linux内核是多么大的一座宝库,随时都有新的东西供你使用,你可以使用它的最新的接口实现新的想法,你也可以抽取它的内部算法,迄今为止,我使用过很多从Linux内核拿来的算法,比如嵌入式list,hlist,比如路由查找的hash算法,trie算法,红黑树,AVL树,radix树等容器,还借鉴其CFS以及O(1)调度算法实现过一个消息输出系统,从Linux内核说开去,任何的开源代码其价值不仅仅是最终形成的软件本身的*使用分发,它内部实现本身就是一座宝库,你可以从中得到很多的东西。不过,仅仅拿来是无耻的,必须保持一颗时刻分享的心。升级内核的意义就在于,在你眼前,很多的好玩的东西让你可以所见即所得,不管是工作中,还是平时的周末折腾。当然如果你是一个企业的总监级别的人,或者你有深深的包袱,可以将我所说的当成废话一堆,因为你可能有更重要的因素要考虑,比如客户升级之类的,比如兼容性之类的,而不仅仅是图个纯技术性的痛快。但是即便对于这些高大上的所谓圈子正*的人,如果你已经摆脱了包袱,也请考虑一下我的观点,时刻保持最新。
PS:我为何学不会Python
学不会吗?也许。不想学吗?不。人们都说Python简单,但是我为何好几次都没有系统地学习它。因为我把关注点集中在问题本身而不是如何实现它上了。我想通过买一个树莓派把家里的电视机改成网络播放器,同时用Python实现管理UI,通过这么一个动作来学习Python,我本以为做这么一个UI可以让我掌握Python,然而,我一心想早日通过我的电视机给小小放爱探险的朵拉,于是我在网上找到了现成的代码,复制粘贴,少量修改,任务很快完成了,Python没有学会...我很沮丧,可是小小却很高兴。