从Linux内核升级的必要性说开去

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多port的负载均衡内核模块,同一时候想出了利用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的本质特征之中的一个。可是却不是绝对的。万事都不绝对。因此,不到出问题的时候,你可能永远都不知道它有问题,你能非常easy证明一件事情是错误的,可是却非常难证明它是正确的。

既然这样,那还怕什么。升级是唯一的选择。由于即便你不升级。你也不能证明如今的内核和应用程序之间的配合就一定没有问题。尽管它们至少经过了測试,可是你难道不能在新内核上做相同的測试吗?不能由于惧怕错误而停止前进。
       或许你能够坚持全部东西都自己开发以保持自己的原创性以及竞争力,同一时候小心翼翼守护自己的战果,生怕被别人抢去,并心甘情愿为以上全部这些付出成本,由于每一个人都是这么干的。可是我却坚持我的观点。四处搜罗线索。最小化工作量满足最大的需求,东西能够不是我做的,可是一定是我交到你手上的。

Linux内核是多么大的一座宝库,随时都有新的东西供你使用,你能够使用它的最新的接口实现新的想法,你也能够抽取它的内部算法。迄今为止,我使用过非常多从Linux内核拿来的算法,比方嵌入式list,hlist,比方路由查找的hash算法。trie算法,红黑树,AVL树。radix树等容器,还借鉴其CFS以及O(1)调度算法实现过一个消息输出系统,从Linux内核说开去,不论什么的开源码其价值不不过终于形成的软件本身的自由使用分发。它内部实现本身就是一座宝库,你能够从中得到非常多的东西。不过,只拿来是无耻的,必须保持一颗时刻分享的心。升级内核的意义就在于,在你眼前,非常多的好玩的东西让你能够所见即所得。无论是工作中,还是平时的周末折腾。当然假设你是一个企业的总监级别的人。或者你有深深的包袱,能够将我所说的当成废话一堆,由于你可能有更重要的因素要考虑。比方客户升级之类的,比方兼容性之类的,而不不过图个纯技术性的痛快。可是即便对于这些高大上的所谓圈子正中央的人,假设你已经摆脱了包袱,也请考虑一下我的观点,时刻保持最新。


PS:我为何学不会Python
学不会吗?或许。

不想学吗?不。人们都说Python简单,可是我为何好几次都没有系统地学习它。由于我把关注点集中在问题本身而不是怎样实现它上了。我想通过买一个树莓派把家里的电视机改成网络播放器,同一时候用Python实现管理UI。通过这么一个动作来学习Python。我本以为做这么一个UI能够让我掌握Python,然而,我一心想早日通过我的电视机给小小放爱探险的朵拉,于是我在网上找到了现成的代码,复制粘贴,少量改动,任务非常快完毕了,Python没有学会...我非常沮丧。可是小小却非常高兴。


原文地址:https://www.cnblogs.com/yutingliuyl/p/6847296.html