《树莓派实战秘籍》——2.3 技巧23更新到最新的预建内核

简介:

本节书摘来自异步社区《树莓派实战秘籍》一书中的第2章,第2.3节,作者: 【美】Ruth Suehle , Tom Callaway 更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.3 技巧23更新到最新的预建内核

让你的树莓派使用最新的Linux内核?你当然可以这么做,而且有一种方法可以让你不必从源代码构建就能够获取它们。

树莓派基金会的好人们经常努力工作增加新的功能到Linux内核源代码树中,而且他们又进一步定期更新一份预构建的Linux内核映像文件的拷贝。这个内核专门为树莓派配置了一系列选项及模块。使用这个内核意味着你可以确定所有内置到树莓派的硬件,以及任何树莓派的特定功能都可以正确地启动。

发行版特点

一些Linux发行版可能假定某些没有在树莓派基金会预构建的内核映像文件中启用或支持的功能存在,比如说SELinux、一些扩展文件系统属性,以及一些类型的密码系统等。这也是我们建议你在手边保留一份缺省提供的内核映像备份的原因,以防万一。

树莓派基金会在他们提供fireware的同一个Git仓库中也提供了预构建的二进制内核映像文件。参考技巧04的教程可以获得该Git树的副本。

请记住该Git树有两个分支:master是树莓派基于3.2版本Linux内核的源代码树,而next是树莓派基于3.6版本Linux内核的源代码树。你需要确保内核和固件修订版本匹配,否则,你的内核可能无法启动(或功能不能按你希望的方式工作)。预构建的内核文件的位置对Git库的每一个分支都是相同的。

树莓派基金会的预构建Linux内核使用方便,专为Pi的使用而设计,包含了许多常见的设备驱动模块。然而,它也缺少了一些你可能需要连接的外设模块。如果发生这样的情况,你可能想去从源代码构建一个自定义的Linux内核,如技巧22中所描述的。

2.3.1 获取预构建Linux内核

预构建Linux内核映像文件由两部分组成:

  • 核心Linux内核映像(firmware/boot/kernel.img)
  • 和该映像匹配的预构建Linux内核模块(firmware/modules)

你可以在GitHub网站1上查看核心Linux映像文件的构建历史记录。如果你想查看next分支的历史记录,只需要在网站上下拉改变分支2,或者用next替换URL中的master。

可选的预构建内核变种

树莓派基金会还提供了两种可选的预构建内核变种:


screenshot

这是可以在树莓派上启动的最小的Linux内核,它包含了极少的外围设备支持,只包括那些在树莓派上绝对需要使用的嵌入式设备。和标准的内核映像相比,它由一个更小的内核模块集组成。


screenshot

这个Linux内核映像文件包含了广泛的支持,并直接被编译进Linux内核。因为有如此多的支持被直接编译到内核,它被视为一个“安全模式”内核,即使树莓派的Linux用户空间出了问题它也可以正确启动。这个内核映像的缺点是其占用空间较大(9.2M)以及因而对性能的影响。同时,它也没有任何内核模块,所有的设备驱动程序都被编译进了内核映像!

这两个可供选择的内核映像都是由和正常内核映像相同的源代码树构建的,并都被放在Git的checkout目录中(firmware/boot)。你可以使用前述和拷贝普通映像文件同样的方法拷贝它们到boot分区:只要将当前目录更改到挂载的boot分区,重命名所有这些文件存在的副本以做备份,然后从Git checkout的目录复制这些新文件到挂载的boot分区即可。

请记住,如果你想从这些内核中的一个(或你备份的内核映像文件中的一个)启动的话,只需要在config.txt文件中添加一个合适的kernel=行即可。你可能想要添加多个行以对应不同的内核映像,但务必要注释掉任何你没有使用的条目,在该行的开头加上一个#字符即可。

现在你可以安全地从你的Git checkout出来的目录中拷贝新的核心Linux内核映像到boot分区(以root用户),当你拷贝时,你也许会将kernel.img重新命名(或者重命名已存在的SD卡boot分区中的kernel.img文件)。

2.3.2 安装预构建Linux模块

接下来该是安装匹配的预构建内核模块的时候了,你可以在Git checkout文件的firmware/modules目录中找到这些模块文件。这里至少有两个目录,每一个都包含了一个版本,对应于用于构建这些映像文件(以及模块)的Linux内核版本。在本书写作之时,这个版本是3.6.10,如下所示:


screenshot

那个+号是什么情况?

你也许已经注意到,这里的版本目录中有一个“+”号放在最后。这是一个自定义的标示符,树莓派基金会用于其内核构建,主要是为了防止和用户自定义的内核构建冲突(默认情况下,用户自定义的内核构建不包含这个自定义的标示符)。

预构建核心Linux内核映像将严格按照目录名(包括这个+号)来寻找其模块,因此不要更改它们的名字。如果已经存在一个相同名称的目录,有理由安全地覆盖它(假定你已经从同样的firemware的checkout文件中拷贝了匹配的内核映像文件),不过你总可以重新命名这些目录以做备份。

要知道,即使你修改config.txt文件中kernel=语句来启动老的内核,它也不知道如何在更名的模块目录中查找,它只能尝试从原来版本的目录中加载其模块。

3.6.10+目录中包含了为kernel.img构建的模块,而3.6.10-cutdown+目录则包含了为kernel_cutdown.img构建的模块。这是有意义的,对不对?如果你已经将kernel_cutdown.img文件拷贝到SD卡的boot分区中,此时你需要有相应的模块。如果你已经拷贝了单一的kernel.img文件,你也可以将其放在一边,拷贝cutdown内核的模块不会影响任何东西,除了它们会占用大约15M多的SD卡空间以外。

对于预构建的内核,下述命令将可以拷贝适当的模块:


screenshot

从现在起,你将需要做你在安装完从源代码生成的内核后所做的同样的安装后任务,如2.2.5小节“安装后任务”所述。

将树莓派变更合并到上游Linux内核源代码

在理想情况下的某个时刻,树莓派基金会将能够把所有的树莓派(以及BCM2835)的变更合并到上游的Linux内核源代码中。这意味着不再需要有一个单独的树莓派特定的Linux内核源代码树,作为其结果,树莓派基金会有可能会停止提供新的预构建内核映像文件。

这仅仅只是猜测,不过,虽然树莓派基金会已经表达了将其补丁合并到上游的Linux内核树的愿望,同时还有许多内核黑客正在朝着这个目标努力,但这个情况目前还没有发生。到目前为止,基金会还没有做出任何将停止制作预构建内核映像的表示。但这应该不是一个太大的问题,因为Linux发行版可以从他们维护的上游“Linus”源代码树中很容易地产生用于树莓派的Linux内核映像。

我们指出这一点只因为当你在未来某个时间正在阅读本书时,如果它确实发生了,而你在他们的GitHub固件库中看不到最近更新的预构建内核映像时,会知道原因。
相关文章
|
9月前
|
IDE Linux 程序员
Linux操作系统实验十二 Linux编程技术应用(上)
Linux操作系统实验十二 Linux编程技术应用
83 0
Linux操作系统实验十二 Linux编程技术应用(上)
|
9月前
|
Linux 开发工具 C语言
Linux操作系统实验十二 Linux编程技术应用(下)
Linux操作系统实验十二 Linux编程技术应用
74 0
|
数据可视化 网络安全 数据安全/隐私保护
树莓派开发笔记(一): 入手树莓派3b,成功运行树莓派系统
树莓派开发笔记(一): 入手树莓派3b,成功运行树莓派系统
树莓派开发笔记(一): 入手树莓派3b,成功运行树莓派系统
|
Linux
小白Linux教程——手动升级内核
    作为一个底层的硬件工程师,免不了和Linux打交道,而曾经有一段时间,升级Linux内核让很多用户打心里有所畏惧。在那个时候,升级内核包含了很多步骤,也需要很多时间。
1470 0