标签 内核 下的文章

lsmod 命令能够告诉你当前系统上加载了哪些内核模块,以及关于使用它们的一些有趣的细节。

Rob Oo (CC BY 2.0)

什么是 Linux 内核模块?

内核模块是可以根据需要加载到内核中或从内核中卸载的代码块,因此无需重启就可以扩展内核的功能。事实上,除非用户使用类似 lsmod 这样的命令来查询模块信息,否则用户不太可能知道内核发生的任何变化。

需要知道的重要一点是,在你的 Linux 系统上总会有很多可用的模块,并且如果你可以深入其中了解到很多细节。

lsmod 的主要用途之一是在系统不能正常工作时检查模块。然而,大多数情况下,模块会根据需要加载的,而且用户不需要知道它们如何运作。

显示内核模块

显示内核模块最简单的方法是使用 lsmod 命令。虽然这个命令包含了很多细节,但输出却是非常用户友好。

$ lsmod
Module                  Size  Used by
snd_hda_codec_realtek 114688  1
snd_hda_codec_generic  77824  1 snd_hda_codec_realtek
ledtrig_audio          16384  2 snd_hda_codec_generic,snd_hda_codec_realtek
snd_hda_codec_hdmi     53248  1
snd_hda_intel          40960  2
snd_hda_codec         131072  4 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel
                                ,snd_hda_codec_realtek
snd_hda_core           86016  5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel
                                ,snd_hda_codec,snd_hda_codec_realtek
snd_hwdep              20480  1 snd_hda_codec
snd_pcm               102400  4 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda
                                _core
snd_seq_midi           20480  0
snd_seq_midi_event     16384  1 snd_seq_midi
dcdbas                 20480  0
snd_rawmidi            36864  1 snd_seq_midi
snd_seq                69632  2 snd_seq_midi,snd_seq_midi_event
coretemp               20480  0
snd_seq_device         16384  3 snd_seq,snd_seq_midi,snd_rawmidi
snd_timer              36864  2 snd_seq,snd_pcm
kvm_intel             241664  0
kvm                   626688  1 kvm_intel
radeon               1454080  10
irqbypass              16384  1 kvm
joydev                 24576  0
input_leds             16384  0
ttm                   102400  1 radeon
drm_kms_helper        180224  1 radeon
drm                   475136  13 drm_kms_helper,radeon,ttm
snd                    81920  15 snd_hda_codec_generic,snd_seq,snd_seq_device,snd_hda
                                 _codec_hdmi,snd_hwdep,snd_hda_intel,snd_hda_codec,snd
                                 _hda_codec_realtek,snd_timer,snd_pcm,snd_rawmidi
i2c_algo_bit           16384  1 radeon
fb_sys_fops            16384  1 drm_kms_helper
syscopyarea            16384  1 drm_kms_helper
serio_raw              20480  0
sysfillrect            16384  1 drm_kms_helper
sysimgblt              16384  1 drm_kms_helper
soundcore              16384  1 snd
mac_hid                16384  0
sch_fq_codel           20480  2
parport_pc             40960  0
ppdev                  24576  0
lp                     20480  0
parport                53248  3 parport_pc,lp,ppdev
ip_tables              28672  0
x_tables               40960  1 ip_tables
autofs4                45056  2
raid10                 57344  0
raid456               155648  0
async_raid6_recov      24576  1 raid456
async_memcpy           20480  2 raid456,async_raid6_recov
async_pq               24576  2 raid456,async_raid6_recov
async_xor              20480  3 async_pq,raid456,async_raid6_recov
async_tx               20480  5 async_pq,async_memcpy,async_xor,raid456,async_raid6_re
                                cov
xor                    24576  1 async_xor
raid6_pq              114688  3 async_pq,raid456,async_raid6_recov
libcrc32c              16384  1 raid456
raid1                  45056  0
raid0                  24576  0
multipath              20480  0
linear                 20480  0
hid_generic            16384  0
psmouse               151552  0
i2c_i801               32768  0
pata_acpi              16384  0
lpc_ich                24576  0
usbhid                 53248  0
hid                   126976  2 usbhid,hid_generic
e1000e                245760  0
floppy                 81920  0

在上面的输出中:

  • Module 显示每个模块的名称
  • Size 显示每个模块的大小(并不是它们占的内存大小)
  • Used by 显示每个模块被使用的次数和使用它们的模块

显然,这里有很多模块。加载的模块数量取决于你的系统和版本以及正在运行的内容。我们可以这样计数:

$ lsmod | wc -l
67

要查看系统中可用的模块数(不止运行当中的),试试这个命令:

$ modprobe -c | wc -l
41272

与内核模块相关的其他命令

Linux 提供了几条用于罗列、加载及卸载、测试,以及检查模块状态的命令。

  • depmod —— 生成 modules.dep 和映射文件
  • insmod —— 一个往 Linux 内核插入模块的程序
  • lsmod —— 显示 Linux 内核中模块状态
  • modinfo —— 显示 Linux 内核模块信息
  • modprobe —— 添加或移除 Linux 内核模块
  • rmmod —— 一个从 Linux 内核移除模块的程序

显示内置的内核模块

正如前文所说,lsmod 命令是显示内核模块最方便的命令。然而,也有其他方式可以显示它们。modules.builtin 文件中列出了所有构建在内核中的模块,在 modprobe 命令尝试添加文件中的模块时会使用它。注意,以下命令中的 $(uname -r) 提供了内核版本的名称。

$ more /lib/modules/$(uname -r)/modules.builtin | head -10
kernel/arch/x86/crypto/crc32c-intel.ko
kernel/arch/x86/events/intel/intel-uncore.ko
kernel/arch/x86/platform/intel/iosf_mbi.ko
kernel/mm/zpool.ko
kernel/mm/zbud.ko
kernel/mm/zsmalloc.ko
kernel/fs/binfmt_script.ko
kernel/fs/mbcache.ko
kernel/fs/configfs/configfs.ko
kernel/fs/crypto/fscrypto.ko

你可以使用 modinfo 获得一个模块的更多细节,虽然没有对模块提供的服务的简单说明。下面输出内容中省略了冗长的签名。

$ modinfo floppy | head -16
filename:       /lib/modules/5.0.0-13-generic/kernel/drivers/block/floppy.ko
alias:          block-major-2-*
license:        GPL
author:         Alain L. Knaff
srcversion:     EBEAA26742DF61790588FD9
alias:          acpi*:PNP0700:*
alias:          pnp:dPNP0700*
depends:
retpoline:      Y
intree:         Y
name:           floppy
vermagic:       5.0.0-13-generic SMP mod_unload
sig_id:         PKCS#7
signer:
sig_key:
sig_hashalgo:   md4

你可以使用 modprobe 命令加载或卸载模块。使用下面这条命令,你可以找到特定模块关联的内核对象:

$ find /lib/modules/$(uname -r) -name floppy*
/lib/modules/5.0.0-13-generic/kernel/drivers/block/floppy.ko

如果你想要加载模块,你可以使用这个命令:

$ sudo modprobe floppy

总结

很明显,内核模块的加载和卸载非常重要。它使得 Linux 系统比使用通用内核运行时更加灵活和高效。这同样意味着你可以进行重大更改而无需重启,例如添加硬件。


via: https://www.networkworld.com/article/3391362/looking-into-linux-modules.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:LazyWolfLin 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在调试或试验内核时,向内核命令行添加选项是一项常见任务。即将发布的 Fedora 30 版本改为使用 Bootloader 规范(BLS)。根据你修改内核命令行选项的方式,你的工作流可能会更改。继续阅读获取更多信息。

要确定你的系统是使用 BLS 还是旧的规范,请查看文件:

/etc/default/grub

如果你看到:

GRUB_ENABLE_BLSCFG=true

看到这个,你运行的是 BLS,你可能需要更改设置内核命令行参数的方式。

如果你只想修改单个内核条目(例如,暂时解决显示问题),可以使用 grubby 命令:

$ grubby --update-kernel /boot/vmlinuz-5.0.1-300.fc30.x86_64 --args="amdgpu.dc=0"

要删除内核参数,可以传递 --remove-args 参数给 grubby

$ grubby --update-kernel /boot/vmlinuz-5.0.1-300.fc30.x86_64 --remove-args="amdgpu.dc=0"

如果有应该添加到每个内核命令行的选项(例如,你希望禁用 rdrand 指令生成随机数),则可以运行 grubby 命令:

$ grubby --update-kernel=ALL --args="nordrand"

这将更新所有内核条目的命令行,并保存作为将来条目的命令行选项。

如果你想要从所有内核中删除该选项,则可以再次使用 --remove-args--update-kernel=ALL

$ grubby --update-kernel=ALL --remove-args="nordrand"

via: https://fedoramagazine.org/setting-kernel-command-line-arguments-with-fedora-30/

作者:Laura Abbott 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

内核维护者 Greg Kroah-Hartman 谈论内核社区如何保护 Linux 不遭受损害。

由于 Linux 使用量持续扩大,内核社区去提高这个世界上使用最广泛的技术 —— Linux 内核的安全性的重要性越来越高。安全不仅对企业客户很重要,它对消费者也很重要,因为 80% 的移动设备都使用了 Linux。在本文中,Linux 内核维护者 Greg Kroah-Hartman 带我们了解内核社区如何应对威胁。

bug 不可避免

 title=

Greg Kroah-Hartman Linux 基金会

正如 Linus Torvalds 曾经说过的,大多数安全问题都是 bug 造成的,而 bug 又是软件开发过程的一部分。是软件就有 bug。

Kroah-Hartman 说:“就算是 bug,我们也不知道它是安全的 bug 还是不安全的 bug。我修复的一个著名 bug,在三年后才被 Red Hat 认定为安全漏洞“。

在消除 bug 方面,内核社区没有太多的办法,只能做更多的测试来寻找 bug。内核社区现在已经有了自己的安全团队,它们是由熟悉内核核心的内核开发者组成。

Kroah-Hartman 说:”当我们收到一个报告时,我们就让参与这个领域的核心开发者去修复它。在一些情况下,他们可能是同一个人,让他们进入安全团队可以更快地解决问题“。但他也强调,内核所有部分的开发者都必须清楚地了解这些问题,因为内核是一个可信环境,它必须被保护起来。

Kroah-Hartman 说:”一旦我们修复了它,我们就将它放到我们的栈分析规则中,以便于以后不再重新出现这个 bug。“

除修复 bug 之外,内核社区也不断加固内核。Kroah-Hartman 说:“我们意识到,我们需要一些主动的缓减措施,因此我们需要加固内核。”

Kees Cook 和其他一些人付出了巨大的努力,带来了一直在内核之外的加固特性,并将它们合并或适配到内核中。在每个内核发行后,Cook 都对所有新的加固特性做一个总结。但是只加固内核是不够的,供应商们必须要启用这些新特性来让它们充分发挥作用,但他们并没有这么做。

Kroah-Hartman 每周发布一个稳定版内核,而为了长期的支持,公司们只从中挑选一个,以便于设备制造商能够利用它。但是,Kroah-Hartman 注意到,除了 Google Pixel 之外,大多数 Android 手机并不包含这些额外的安全加固特性,这就意味着,所有的这些手机都是有漏洞的。他说:“人们应该去启用这些加固特性”。

Kroah-Hartman 说:“我购买了基于 Linux 内核 4.4 的所有旗舰级手机,去查看它们中哪些确实升级了新特性。结果我发现只有一家公司升级了它们的内核。……我在整个供应链中努力去解决这个问题,因为这是一个很棘手的问题。它涉及许多不同的组织 —— SoC 制造商、运营商等等。关键点是,需要他们把我们辛辛苦苦设计的内核去推送给大家。”

好消息是,与消费电子产品不一样,像 Red Hat 和 SUSE 这样的大供应商,在企业环境中持续对内核进行更新。使用容器、pod 和虚拟化的现代系统做到这一点更容易了。无需停机就可以毫不费力地更新和重启。事实上,现在来保证系统安全相比过去容易多了。

Meltdown 和 Spectre

没有任何一个关于安全的讨论能够避免提及 Meltdown 和 Spectre 缺陷。内核社区一直致力于修改新发现的和已查明的安全漏洞。不管怎样,Intel 已经因为这些事情改变了它们的策略。

Kroah-Hartman 说:“他们已经重新研究如何处理安全 bug,以及如何与社区合作,因为他们知道他们做错了。内核已经修复了几乎所有大的 Spectre 问题,但是还有一些小问题仍在处理中”。

好消息是,这些 Intel 漏洞使得内核社区正在变得更好。Kroah-Hartman 说:“我们需要做更多的测试。对于最新一轮的安全补丁,在它们被发布之前,我们自己花了四个月时间来测试它们,因为我们要防止这个安全问题在全世界扩散。而一旦这些漏洞在真实的世界中被利用,将让我们认识到我们所依赖的基础设施是多么的脆弱,我们多年来一直在做这种测试,这确保了其它人不会遭到这些 bug 的伤害。所以说,Intel 的这些漏洞在某种程度上让内核社区变得更好了”。

对安全的日渐关注也为那些有才华的人创造了更多的工作机会。由于安全是个极具吸引力的领域,那些希望在内核空间中有所建树的人,安全将是他们一个很好的起点。

Kroah-Hartman 说:“如果有人想从事这方面的工作,我们有大量的公司愿意雇佣他们。我知道一些开始去修复 bug 的人已经被他们雇佣了。”

你可以在下面链接的视频上查看更多的内容:


via: https://www.linux.com/blog/2018/10/greg-kroah-hartman-explains-how-kernel-community-securing-linux-0

作者:SWAPNIL BHARTIYA 选题:oska874 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

学习如何做出你的首个 Linux 内核贡献,以及在开始之前你应该知道什么。

Linux 内核是最大且变动最快的开源项目之一,它由大约 53,600 个文件和近 2,000 万行代码组成。在全世界范围内超过 15,600 位程序员为它贡献代码,Linux 内核项目的维护者使用了如下的协作模型。

本文中,为了便于在 Linux 内核中提交你的第一个贡献,我将为你提供一个必需的快速检查列表,以告诉你在提交补丁时,应该去查看和了解的内容。对于你贡献的第一个补丁的提交流程方面的更多内容,请阅读 KernelNewbies 的第一个内核补丁教程

为内核作贡献

第 1 步:准备你的系统。

本文开始之前,假设你的系统已经具备了如下的工具:

  • 文本编辑器
  • Email 客户端
  • 版本控制系统(例如:git)

第 2 步:下载 Linux 内核代码仓库。

git clone -b staging-testing
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git

复制你的当前配置:

cp /boot/config-`uname -r`* .config

第 3 步:构建/安装你的内核。

make -jX
sudo make modules_install install

第 4 步:创建一个分支并切换到该分支。

git checkout -b first-patch

第 5 步:更新你的内核并指向到最新的代码。

git fetch origin
git rebase origin/staging-testing

第 6 步:在最新的代码库上产生一个变更。

使用 make 命令重新编译,确保你的变更没有错误。

第 7 步:提交你的变更并创建一个补丁。

git add <file>
git commit -s -v
git format-patch -o /tmp/ HEAD^

主题是由冒号分隔的文件名组成,跟着是使用祈使语态来描述补丁做了什么。空行之后是强制的 signed off 标记,最后是你的补丁的 diff 信息。

下面是另外一个简单补丁的示例:

接下来,从命令行使用邮件(在本例子中使用的是 Mutt)发送这个补丁:

mutt -H /tmp/0001-<whatever your filename is>

使用 get\_maintainer.pl 脚本,去了解你的补丁应该发送给哪位维护者的列表。

提交你的第一个补丁之前,你应该知道的事情

  • Greg Kroah-Hartmanstaging tree 是提交你的 第一个补丁 的最好的地方,因为他更容易接受新贡献者的补丁。在你熟悉了补丁发送流程以后,你就可以去发送复杂度更高的子系统专用的补丁。
  • 你也可以从纠正代码中的编码风格开始。想学习更多关于这方面的内容,请阅读 Linux 内核编码风格文档
  • checkpatch.pl 脚本可以帮你检测编码风格方面的错误。例如,运行如下的命令:perl scripts/checkpatch.pl -f drivers/staging/android/* | less
  • 你可以去补全开发者留下的 TODO 注释中未完成的内容:find drivers/staging -name TODO
  • Coccinelle 是一个模式匹配的有用工具。
  • 阅读 归档的内核邮件
  • 为找到灵感,你可以去遍历 linux.git 日志去查看以前的作者的提交内容。
  • 注意:不要与你的补丁的审核者在邮件顶部交流!下面就是一个这样的例子:

错误的方式:

Chris,
Yes let’s schedule the meeting tomorrow, on the second floor.

> On Fri, Apr 26, 2013 at 9:25 AM, Chris wrote:
> Hey John, I had some questions:
> 1. Do you want to schedule the meeting tomorrow?
> 2. On which floor in the office?
> 3. What time is suitable to you?

(注意那最后一个问题,在回复中无意中落下了。)

正确的方式:

Chris,
See my answers below...

> On Fri, Apr 26, 2013 at 9:25 AM, Chris wrote:
> Hey John, I had some questions:
> 1. Do you want to schedule the meeting tomorrow?
Yes tomorrow is fine.
> 2. On which floor in the office?
Let's keep it on the second floor.
> 3. What time is suitable to you?
09:00 am would be alright.

(所有问题全部回复,并且这种方式还保存了阅读的时间。)

想学习更多内容,阅读 KernelNewbies 的第一个内核补丁教程。之后如果你还有任何问题,可以在 kernelnewbies 邮件列表 或者 #kernelnewbies IRC channel 中提问。


via: https://opensource.com/article/18/8/first-linux-kernel-patch

作者:Sayli Karnik 选题:lujun9972 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文作者 Greg Kroah-Hartman 是 Linux 稳定版内核的维护负责人。

很多人都问我这样的问题,在他们的产品/设备/笔记本/服务器等上面应该使用什么样的稳定版内核。一直以来,尤其是那些现在已经延长支持时间的内核,都是由我和其他人提供支持,因此,给出这个问题的答案并不是件容易的事情。在这篇文章我将尝试去给出我在这个问题上的看法。当然,你可以任意选用任何一个你想去使用的内核版本,这里只是我的建议。

和以前一样,在这里给出的这些看法只代表我个人的意见。

可选择的内核有哪些

下面列出了我建议你应该去使用的内核的列表,从最好的到最差的都有。我在下面将详细介绍,但是如果你只想得到一个结论,它就是你想要的:

建议你使用的内核的分级,从最佳的方案到最差的方案如下:

  • 你最喜欢的 Linux 发行版支持的内核
  • 最新的稳定版
  • 最新的 LTS (长期支持)版本
  • 仍然处于维护状态的老的 LTS 版本

绝对不要去使用的内核:

  • 不再维护的内核版本

给上面的列表给出具体的数字,今天是 2018 年 8 月 24 日,kernel.org 页面上可以看到是这样:

因此,基于上面的列表,那它应该是:

  • 4.18.5 是最新的稳定版
  • 4.14.67 是最新的 LTS 版本
  • 4.9.124、4.4.152、以及 3.16.57 是仍然处于维护状态的老的 LTS 版本
  • 4.17.19 和 3.18.119 是过去 60 天内有过发布的 “生命周期终止” 的内核版本,它们仍然保留在 kernel.org 站点上,是为了仍然想去使用它们的那些人。

非常容易,对吗?

Ok,现在我给出这样选择的一些理由:

Linux 发行版内核

对于大多数 Linux 用户来说,最好的方案就是使用你喜欢的 Linux 发行版的内核。就我本人而言,我比较喜欢基于社区的、内核不断滚动升级的用最新内核的 Linux 发行版,并且它也是由开发者社区来支持的。这种类型的发行版有 Fedora、openSUSE、Arch、Gentoo、CoreOS,以及其它的。

所有这些发行版都使用了上游的最新的稳定版内核,并且确保定期打了需要的 bug 修复补丁。当它拥有了最新的修复之后(记住所有的修复都是安全修复),这就是你可以使用的最安全、最好的内核之一。

有些社区的 Linux 发行版需要很长的时间才发行一个新内核版本,但是最终发行的版本和所支持的内核都是非常好的。这些也都非常好用,Debian 和 Ubuntu 就是这样的例子。

如果我没有在这里列出你所喜欢的发行版,并不是意味着它们的内核不够好。查看这些发行版的网站,确保它们的内核包是不断应用最新的安全补丁进行升级过的,那么它就应该是很好的。

许多人好像喜欢旧式、“传统” 模式的发行版,使用 RHEL、SLES、CentOS 或者 “LTS” Ubuntu 发行版。这些发行版挑选一个特定的内核版本,然后使用好几年,甚至几十年。他们反向移植了最新的 bug 修复,有时也有一些内核的新特性,所有的只是追求堂吉诃德式的保持版本号不变而已,尽管他们已经在那个旧的内核版本上做了成千上万的变更。这项工作是一项真正吃力不讨好的工作,分配到这些任务的开发人员做了一些精彩的工作才能实现这些目标。所以如果你希望永远不看到你的内核版本号发生过变化,那么就使用这些发行版。他们通常会为使用而付出一些钱,当发生错误时能够从这些公司得到一些支持,那就是值得的。

所以,你能使用的最好的内核是你可以求助于别人,而别人可以为你提供支持的内核。使用那些支持,你通常都已经为它支付过费用了(对于企业发行版),而这些公司也知道他们职责是什么。

但是,如果你不希望去依赖别人,而是希望你自己管理你的内核,或者你有发行版不支持的硬件,那么你应该去使用最新的稳定版:

最新的稳定版

最新的稳定版内核是 Linux 内核开发者社区宣布为“稳定版”的最新的一个内核。大约每三个月,社区发行一个包含了对所有新硬件支持的、新的稳定版内核,最新版的内核不但改善内核性能,同时还包含内核各部分的 bug 修复。接下来的三个月之后,进入到下一个内核版本的 bug 修复将被反向移植进入这个稳定版内核中,因此,使用这个内核版本的用户将确保立即得到这些修复。

最新的稳定版内核通常也是主流社区发行版所使用的内核,因此你可以确保它是经过测试和拥有大量用户使用的内核。另外,内核社区(全部开发者超过 4000 人)也将帮助这个发行版提供对用户的支持,因为这是他们做的最新的一个内核。

三个月之后,将发行一个新的稳定版内核,你应该去更新到它以确保你的内核始终是最新的稳定版,因为当最新的稳定版内核发布之后,对你的当前稳定版内核的支持通常会落后几周时间。

如果你在上一个 LTS (长期支持)版本发布之后购买了最新的硬件,为了能够支持最新的硬件,你几乎是绝对需要去运行这个最新的稳定版内核。对于台式机或新的服务器,最新的稳定版内核通常是推荐运行的内核。

最新的 LTS 版本

如果你的硬件为了保证正常运行(像大多数的嵌入式设备),需要依赖供应商的源码 树外 out-of-tree 的补丁,那么对你来说,最好的内核版本是最新的 LTS 版本。这个版本拥有所有进入稳定版内核的最新 bug 修复,以及大量的用户测试和使用。

请注意,这个最新的 LTS 版本没有新特性,并且也几乎不会增加对新硬件的支持,因此,如果你需要使用一个新设备,那你的最佳选择就是最新的稳定版内核,而不是最新的 LTS 版内核。

另外,对于这个 LTS 版本的用户来说,他也不用担心每三个月一次的“重大”升级。因此,他们将一直坚持使用这个 LTS 版本,并每年升级一次,这是一个很好的实践。

使用这个 LTS 版本的不利方面是,你没法得到在最新版本内核上实现的内核性能提升,除非在未来的一年中,你升级到下一个 LTS 版内核。

另外,如果你使用的这个内核版本有问题,你所做的第一件事情就是向任意一位内核开发者报告发生的问题,并向他们询问,“最新的稳定版内核中是否也存在这个问题?”并且,你需要意识到,对它的支持不会像使用最新的稳定版内核那样容易得到。

现在,如果你坚持使用一个有大量的补丁集的内核,并且不希望升级到每年一次的新 LTS 版内核上,那么,或许你应该去使用老的 LTS 版内核:

老的 LTS 版本

传统上,这些版本都由社区提供 2 年时间的支持,有时候当一个重要的 Linux 发行版(像 Debian 或 SLES)依赖它时,这个支持时间会更长。然而在过去一年里,感谢 Google、Linaro、Linaro 成员公司、kernelci.org、以及其它公司在测试和基础设施上的大量投入,使得这些老的 LTS 版内核得到更长时间的支持。

最新的 LTS 版本以及它们将被支持多长时间,这是 2018 年 8 月 24 日显示在 kernel.org/category/releases.html 上的信息:

Google 和其它公司希望这些内核使用的时间更长的原因是,由于现在几乎所有的 SoC 芯片的疯狂的(也有人说是打破常规)开发模型。这些设备在芯片发行前几年就启动了他们的开发周期,而那些代码从来不会合并到上游,最终结果是新打造的芯片是基于一个 2 年以前的老内核发布的。这些 SoC 的代码树通常增加了超过 200 万行的代码,这使得它们成为我们前面称之为“类 Linux 内核“的东西。

如果在 2 年后,这个 LTS 版本停止支持,那么来自社区的支持将立即停止,并且没有人对它再进行 bug 修复。这导致了在全球各地数以百万计的非常不安全的设备仍然在使用中,这对任何生态系统来说都不是什么好事情。

由于这种依赖,这些公司现在要求新设备不断更新到最新的 LTS 版本——这些为它们特定发布的版本(例如现在的每个 4.9.y 版本)。其中一个这样的例子就是新 Android 设备对内核版本的要求,这些新设备所带的 “Andrid O” 版本(和现在的 “Android P” 版本)指定了最低允许使用的内核版本,并且 Andoird 安全更新版本也开始越来越频繁在设备上要求使用这些 “.y” 版本。

我注意到一些生产商现在已经在做这些事情。Sony 是其中一个非常好的例子,在他们的大多数新手机上,通过他们每季度的安全更新版本,将设备更新到最新的 4.4.y 发行版上。另一个很好的例子是一家小型公司 Essential,据我所知,他们持续跟踪 4.4.y 版本的速度比其它公司都快。

当使用这种老的内核时有个重大警告。反向移植到这种内核中的安全修复不如最新版本的 LTS 内核多,因为这些使用老的 LTS 内核的设备的传统模式是一个更加简化的用户模式。这些内核不能用于任何“通用计算”模式中,在这里用的是 不可信用户 untrusted user 或虚拟机,极大地削弱了对老的内核做像最近的 Spectre 这样的修复的能力,如果在一些分支中存在这样的 bug 的话。

因此,仅在你能够完全控制的设备,或者限定在一个非常强大的安全模型(像 Android 一样强制使用 SELinux 和应用程序隔离)时使用老的 LTS 版本。绝对不要在有不可信用户/程序,或虚拟机的服务器上使用这些老的 LTS 版内核。

此外,如果社区对它有支持的话,社区对这些老的 LTS 版内核相比正常的 LTS 版内核的支持要少的多。如果你使用这些内核,那么你只能是一个人在战斗,你需要有能力去独自支持这些内核,或者依赖你的 SoC 供应商为你提供支持(需要注意的是,几乎没有供应商会为你提供支持,因此,你要特别注意 ……)。

不再维护的内核发行版

更让人感到惊讶的事情是,许多公司只是随便选一个内核发行版,然后将它封装到它们的产品里,并将它毫不犹豫地承载到数十万的部件中。其中一个这样的糟糕例子是 Lego Mindstorm 系统,不知道是什么原因在它们的设备上随意选取了一个 -rc 的内核发行版。-rc 的发行版是开发中的版本,根本没有 Linux 内核开发者认为它适合任何人使用,更不用说是数百万的用户了。

当然,如果你愿意,你可以随意地使用它,但是需要注意的是,可能真的就只有你一个人在使用它。社区不会为你提供支持,因为他们不可能关注所有内核版本的特定问题,因此如果出现错误,你只能独自去解决它。对于一些公司和系统来说,这么做可能还行,但是如果没有为此有所规划,那么要当心因此而产生的“隐性”成本。

总结

基于以上原因,下面是一个针对不同类型设备的简短列表,这些设备我推荐适用的内核如下:

  • 笔记本 / 台式机:最新的稳定版内核
  • 服务器:最新的稳定版内核或最新的 LTS 版内核
  • 嵌入式设备:最新的 LTS 版内核或老的 LTS 版内核(如果使用的安全模型非常强大和严格)

至于我,在我的机器上运行什么样的内核?我的笔记本运行的是最新的开发版内核(即 Linus 的开发树)再加上我正在做修改的内核,我的服务器上运行的是最新的稳定版内核。因此,尽管我负责 LTS 发行版的支持工作,但我自己并不使用 LTS 版内核,除了在测试系统上。我依赖于开发版和最新的稳定版内核,以确保我的机器运行的是目前我们所知道的最快的也是最安全的内核版本。


via: http://kroah.com/log/blog/2018/08/24/what-stable-kernel-should-i-use/

作者:Greg Kroah-Hartman 选题:lujun9972 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 内核之父 Linus Torvalds 为其无理咆哮而道歉,并决定离开 Linux 内核项目休息一段时间,学习一下如何与人相处之道。

前一段时间, Linus Torvalds 因为其个人的苏格兰休假计划而要将今年的 Linux 内核维护者峰会召开地点从原定的加拿大改到苏格兰。在会议上 Torvalds 招致了社区成员的强烈反对,以至于本次会议也由讨论技术问题,变成了抨击 Torvalds 本人的问题。一些维护者指责他“根本不懂得如何相处”,而由于此次议程变动,也使得很多本应该讨论的技术问题没能付诸讨论。

在昨天的邮件列表当中,Torvalds 在邮件中承认其对其他 Linux 内核开发者和贡献者们的“轻率的攻击”是“不专业的,也是不必要的,而且很多回应属于人身攻击。从努力维护好内核更新的角度,他们提出的观点是合情合理的。……我知道这是不对的,我真的感到很抱歉。”

“我也许需要‘照照镜子’了。” Torvalds 表示,“一方面,我终于意识到,我希望不出席每年一度的 Linux 内核维护者峰会的想法是不妥当的,另一方面,我意识到自己一直忽视了社群中的一些相当深思熟虑的观点。”

“我误会了其他人,并且几年来都没有意识到我对形势的判断,导致了社群内的不专业的环境的危害有多么巨大。”

“我需要改变一些我的行为”,他补充说,“我要向那些因为我个人行为而受到伤害,甚至可能完全脱离了内核开发的人道歉。”这不是 Torvalds 第一次为其出言不逊而道歉,之前甚至因为他的无礼而导致一位著名的女性 Linux 内核核心开发人员 Sarah Sharp 的退出,不过这次看起来 Torvalds 是真正开始反省自己,并以一个技术人员的思路寻求“技术”解决方案以解决这个问题。

而上一次 Torvalds 感觉到 Linux 内核开发中的“痛点”,决定自己出手解决这个“技术”问题的后果就是 Git 的产生。

Linus Torvalds 是 Linux 内核的创始人,并从 1991 年开始就一直从事于 Linux 内核的开发和管理。他表示他会从 Linux 内核的开发当中休息一段时间——就像当年为了创建 Git 一样休息一段时间,做做“自我反省”,开发一些像 Git 一样的小工具来解决他的问题。

“我需要休息一段时间,以找到一些解决我在工具和工作流方面的问题的办法”,他接着说,“这不是我要‘撒手不干’了,我不觉得我不想继续维护 Linux 内核了。恰恰相反,我非常想继续做这个我已经做了快三十年的项目。”

“没错,我可能只是要开发一些‘工具’,比如邮件过滤器,这样我下次在邮件里写了脏话,就不会发出去了。因为我是一个工具信徒,我觉得一些问题完全可以通过简单的自动化流程而解决。”

那么,让我们拭目以待,看看 Torvalds 休息的这段时间,内核社区会怎么样,而他又会给我们带来什么变化或惊喜。