从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多端口的负载均衡内核模块,同时想出了利用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没有学会...我很沮丧,可是小小却很高兴。

从Linux内核升级的必要性说开去,布布扣,bubuko.com

时间: 2024-12-21 04:20:32

从Linux内核升级的必要性说开去的相关文章

linux 内核升级2 转

linux内核升级 一.Linux内核概览 Linux是一个一体化内核(monolithic kernel)系统. 设备驱动程序可以完全访问硬件. Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载. 1. linux内核 linux操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件. 一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割. 计算机的硬件,含有外围设备.处理器.内存.硬盘和其他的电子设

docker (linux 内核升级)

docker 目前一般是部署在linux7以上系统.其要求linux系统内核在3.8或更高的版本.查看版本命令:uname -a 当一般linux系统是7以下,其内核版本都是2点几. uname -r 2.6.32-358.11.1.el6.x86_64 内核升级: 1.导入public key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 1.2下载源码包 去 http://www.kernel.org 首页,下载源码包

linux 内核升级 转

inux 内核升级 2011-03-25 23:13:28 分类: LINUX 因要测试一些软件,需要2.6.30以上的内核,安装好CentOS 5.5,内核是2.6.18-194.el5.这次的升级还算比较顺利,具体的过程如下: [[email protected] ~]# uname -r 2.6.18-194.el5 1.下载linux-2.6.30内核包到/usr/src目录 cd /usr/src wget ftp://ftp.kernel.org/pub/linux/kernel/v

linux内核升级(ubuntu12.04从3.13.0升级到3.4.0 )

花了一天的时间,终于把ubuntu12.04 的linux内核版本从3.13.0升级到3.4.0 升级后,系统更加稳定. 具体步骤:# wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.gz# tar zxvf linux-3.4.tar.gz -C /usr/src# cd /usr/src/linux-3.4# make menuconfig# make# make modules_install# cp arch/

linux 内核升级

首先我们需要了解几个概念 什么是内核? 内核是操作系统最基本的部分.它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间.内核的分类可分为单内核和双内核以及微内核 Kernel 是什么? Kernel 是操作系统内核 操作系统内核是指大多数操作系统的核心部分 那么我们只需要对kernel 版本进行升级即可,首先我们需要下载高版本的kernel 下载kernel 程序,安装kernel yum install kerne

Linux内核升级导致无法启动,Kernel panic - not syncing Unable to mount root fs on unknown block(0,0)

问题原因:内核的某次升级,导致系统无法启动. 首先进入recovery模式:引导界面选择-->Ubuntu高级-->出现的选项中选择能够启动的recovery模式(几个内核版本分别试一下)-->确认后就能看到一个界面出现很多选项,选择第一个recovery模式-->OK.(大概步骤就是这样,自己摸索一下就出来了) 然后就进入系统了.在这里操作如下 1,查看/boot/下的文件 abi-4.4.0-31-generic memtest86+.binabi-4.4.0-98-gener

linux内核升级5.0

升级内核$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm上述命令为启用elrepo仓库,我们可以使用以下命令列出可用的系统内核相关包:$ yum --disablerepo="*" --enablerepo="elrepo-kernel" list

LINUX内核升级-更新网卡驱动

因项目需要,将当前内核(2.6.32-220.el6.x86_64)升级到目标内核(2.6.33-110.el6.x86_64),但是编译的目标 内核(2.6.33-110.el6.x86_64)的对应驱动程序并不一定支持当前系统的对应设备.本篇将详细讲述目标内核驱动无法支持当前网卡设备的 处理步骤. 01.编译目标内核 请参考内核编译相关文档(省略) 02.显示所有网卡 由于一个系统可以支持多张网卡,可通过如下命显示当前系统的所有网卡及其基本信息: #ifconfig -a em1 Link

linux内核升级

1.查看内核版本 uname -r 2.下载升级所需要的编译包 yum install  -y vim yum install  -y wget yum install -y gcc gcc-c++ xz yum install -y bc yum install -y ncurses-devel yum install -y hmaccalc zlib-devel binutils-devel elfutils-libelf-devel 3.下载内核包 mkdir /usr/local/src