构建包括ramdisk的内核映像(.img)


12

我通过以下步骤为Raspberry Pi构建了Linux内核(3.0.1):

1. Downloading kernel source
2. tar xvf source.tar.bz2
3. downloading arm cross compilation tool.
4. tar xvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
5. setting up path for cross tool export PATH=$PATH:/home/shan/<cross tool folder>/bin/
6. after entering linux source dir make ARCH=arm versatile_defconfig (is this reliable   with raspberry pi)
7. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
8. zImage is generated in /arch/arm/boot

我的问题是,如何构建kernel.img?我认为它包含zImage + ramdisk,但如何构建它?

谁能指导我制作ramdisk并将这两个文件打包到kernel.img文件中?我想在我的Raspberry Pi上启动该内核。


这是一个很好的问题,令我惊讶的是还没有有人问过。
Jivings

为什么使用内核3.0.1?可以在kernel.org现场找到这种香草内核吗?
Krzysztof Adamski

是的,我从kernel.org找到了它
Shantanu Banerjee

我已经增加了大约QEMU一个新的问题和crosscompiled覆盆子PI-2内核,busybox的在initramfs中:raspberrypi.stackexchange.com/questions/56302/...
42n4

Answers:


8

kernel.img文件

使用Linux内核时,kernel.img文件只是重命名linux/arch/arm/boot/Image。也应该有可能(或至少有可能我上次检查过)使用此文件的压缩版本- zImage。它可以包含集成的initramfs(虚拟磁盘),但不是必需的。例如,库存kernel.img文件不包含initramfswhile 包含kernel_emergency.img

注意:eLinux Wiki上的官方内核编译指南建议您应使用imagetool-uncompressed.py工具来准备kernel.img文件。这是必要的,RaspberyPi的初期,但现在引导程序可以处理常规ImagezImage文件。

内核资源问题

重要的是,在为RaspberryPi构建内核时,您不能仅使用它的任何版本。只有移植到RaspberryPi的特殊版本才可以使用。不幸的是,当前的上游版本(在kernel.org网站上找到)与RaspberryPi不兼容。另外,versatil_config对于RaspberryPi不利,您应该改bcmrpi_defconfig而使用(在与RaspberryPi兼容的内核源代码中找到),或者bcmrpi_emergency_defconfig如果您打算使用buildin initramfs

内核构建说明

获取RaspberryPi内核资源的最佳位置是在github基础上。您还可以在RasbperryPi官方Wiki上找到有关如何获取和编译它的有用说明。这是我所涉及的步骤的简化版本(注意:我假设您想交叉编译内核。它速度更快,应该创建相同的结果,但是也可以在RaspberryPi上本地构建内核):

  1. 下载官方工具链即可创建自己的工具。用另一种方式,我假设它安装在中/usr/bin/arm-linux-gnueabi-*。如果您在其他位置使用它,则应CROSS_COMPILE在所有make命令中更改选项。

  2. 转到https://github.com/raspberrypi/linux网站,您可以在其中找到RapsberryPi官方内核源代码。您可以通过两种方式下载代码:

    • 作为压缩文件(要使用此选项,您无需安装git实用程序,甚至可以在RapsberryPi本身上执行此操作):单击ZIP图标,该图标Code位于站点顶部选项卡下方的一点。这应该使您可以将最新的源文件下载为zip文件。您可以使用git来代替它,但是(如Wiki中所述)将需要更多的空间和时间。然后解压缩文件以获取源树。
    • 使用git实用程序(这在RaspberryPi上对我不起作用,因为可能存在少量RAM,但在台式机系统上应该可以正常工作(请注意--depth 1,该参数可防止git下载整个开发历史(这是巨大的)):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. 使用基金会提供的默认配置:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. 运行make oldconfig并回答一些问题(可以在每个问题中按Enter键保留默认答案):

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
    
  5. 编译内核:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. 将内核模块复制到/tmp/modules

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Image文件用作kernel.img

  8. 将所有模块从/tmp/modules/lib/modules/您的计算机/lib/modules/上上传到RaspberryPi rootfs上的目录。

添加initramfs

但是,这没有提供有关如何创建的说明initramfs。由于这是一个非常广泛的主题(基本上,您必须创建一个有效的Linux用户空间环境ant,实际上对它的复杂程度没有任何限制),所以我现在不在这里讨论。我只会注意到它initramfs可以以两种不同的形式使用-独立的一种,它是单独的文件,而buildin是与内核映像文件集成在一起的(例如in kernel_emergency.img)。RaspberryPi引导加载程序应支持第二个选项,但是有传言说它在当前固件版本上已被破坏,因此您可能应该使用内置版本。

最好的开始方法是通过从另一个基础github存储库下载可使用的initramfs内容(用于kernel_emergency.img),只有在您能够使用该iniramfs映像引导内核之后,才尝试构建自己的内容。为此所需要做的就是使用CONFIG_INITRAMFS_SOURCE内核配置选项指向下载的目录。

最后的笔记

因此,您应该分3个步骤进行操作:

  1. 尝试构建和启动没有initramfs文件的内核。
  2. 尝试将现成的initramfs内容添加到内核​​中。
  3. 更改此initramfs内容以满足您的需求。

1
写得很好,但是你不应该使用zipgit高效地传输文件,您可以使用它depth=1来防止下载历史记录(我认为)。
亚历克斯·张伯伦

是的,这是真的,但是尝试在RaspberryPi本身上做到这一点并不是一个好主意。另一方面,下载zip效果很好。我还将添加有关使用git的简短说明。
Krzysztof Adamski

在Raspberry Pi上编译内核本身就是一个糟糕的主意。
亚历克斯·张伯伦

@AlexChamberlain:确实很慢,但是绝对可以(我自己做的)。花了一个晚上,所以还算不错。除此之外,为什么这么可怕?
Krzysztof Adamski

如果我使用bcmrpi_emergency_defconfig,它将包含initramfs吗?
Shantanu Banerjee 2012年

0

如果您在两者上都运行相同版本的Debian,请使用X-Apt,dpkg-cross等...,并且emdebian工具可以很好地工作。

来源:用于为运行emdebian的嵌入式ARM系统开发c ++应用程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.