通过moblin MIC2制作的usb启动,有两种方式,一种是liveOS的,直接boot,一种是象传统安装Linux OS的方式在设备中安装。我想将moblin2安装在MID(menlow)上,需要重新rebuild内核。kernel编译可以通过moblin-chroot的方式展开开发环境,也可以通过KVM的环境。
- 从moblin的repo网站中获取kernel的source code,例如wget http://repo.moblin.org/moblin/development/core/source/kernel-2.6.29.5-8.1.moblin2.src.rpm
- 展开rpm包:rpm –ivh kernel-2.6.29.5-8.1.moblin2.src.rpm,在~/rpmbuild/下面展开,进入SPECS/目录,下面有kernel.spec文件。在SOURCES/目录下面有原代码和补丁。通过rpmbuild –bp kernel.spec,可以解压源代码,并打上补丁。
- 进入~/rpmbuild/BUILD/目录下面,就是我们kernel的source code。在这里根据传统的kernel编译方式进行即可。
根据kernel的编译,我们成功地在/lib/modules下面安装的kernel modules,以及在/boot下面提供vmlinuz和System.map。但是在通过MIC2将他们制作成usbimg的时候,出现问题:
问题一:Error creating Live CD : Unable to copy valid kernels or initrds, please check the repo
尝试一:我曾认为是没有生成initrd导致的,因此使用mkinitrd的命令来制作initrd,但是虽然没有报错,但是也没有实际生成,这个非常奇怪。但是根据以前的实验说明,initrd不是必须的,所以放弃。
尝试二:在/boot下面有两个kernel,旧的(netbook)和新的(menlow),删除旧的版本,并同时删除/lib/moudules相关的文件夹。不在报错,问题解决。导致这个问题的原因是:存在多个kernel。
问题二:我们成功制作了usbimg,使用它来启动MID。对于直接Boot的方式,没有问题,可以直接启动。但是对于安装方式,出错。
在安装成功,启动时出现:
Error 15 File note found
然后,"Press any key to continue....",进入grub,发现只有一个选项Moblin(2.6.29.5-8.1.moblin2-netbook,及旧的kernel),需要edit到新的kernel才能进去。这说明我们在编译kernel或者制作usbimg的过程中可能出现遗漏,没有引导到新的kernel中。
尝试一:以为某个配置问题,因此我大范围地grep netbook,没有发现有效线索,放弃。
尝试二:以为是制作问题,因此我跟踪了MIC2中py脚本,只是证明在live OS中得到正确的version。没有发现有效的线索,放弃。
尝试三:用rpm –e kernel-netbook的方式彻底删除旧的版本,重新制作usbimg,这时在安装的过程中出现找不到kernel package的提示。这是个重要的信息,表面出现这种情况,是因为我们没有将新的kernel制作成为rpm,而系统安装是根据package来安装的,需要kernel的rpm。有效的解决方式是:将新的kernel制作成功rpm。
根据这个信息,我们在网上查阅的如何打rpm的资料,我的初衷是,我有kernel modules,有kernel的vmlinz这些目标 文件,如果将他们打成rpm包。但是似乎所有的资料显示都是通过spec的方式,讲过make,build等过程来进行,也就是说适合于源码的方式,不适合于直接将二进制文件或者其他我们的目标文件直接进行封装打包。我们从moblin网站上下载的source是带有spec的,应该可以直接利用它来生成rpm。
阅读spec,检索ivi或者netbook,我们据此添加menlow的脚本。使用rpmbuild –ba kernel.spec,经过了漫长时间的等待,在~/rpmbuild/RPM/i386里面有相关的rpm生成。我们同时生成了netbook、ivi、menlow的版本。删除系统原有的kernel,安装新的menlow rpm,我们重新制作usbimg,一切正常。
我们思考下面的问题:
1、如果是我们的一些应用软件,是否也要制作成相关的rpm包,才能通过安装方式?
应该不需要。在开始的时候,我们没有打包,也没有删除越来的旧包,可以通过edit grub的方式进入系统,这也就是说明相关的文件能够放入文件系统当中,是可以被使用的。只是kernel package是系统重要的rpm,如果缺乏在启动的时候,连grub的无法开启。但是用rpm来管理我们的软件,不但是版本的问题,对于软件升级和软件下载都是非常重要的。
2、如果我们得到了一个官方的linux kernel的新版本,这个只有tar.bz,不是moblin的rpm方式,没有spec,我们如何将它进行编译和打包?
无论如何,我们有必要学习rpm的打包方式。