Moblin usb 启动盘中inintrd&vmlinuz的制作
Moblin主要用于MID等便携式移动设备。由于这些设备没有光驱,需要通过usb移动优盘来安装系统。usb盘中主要包括用于执行安装动作的安装脚本、用于启动和挂在文件系统的initrd&vmlinuz(kernel bzImage)、用于安装的文件系统以及syslinux(bootloader)。同时,制作usb安装盘还需要moblin支持aufs文件系统和具有解压lzma能力的msquashfs文件系统。以下是个人使用moblin2(kernel2.6.27-rc6)制作initrd&vmlinz的一个详细过程。
一、initrd的制作。
initrd的使用需要内核支持,在kernel2.6 27-rc6中,需要如下配置 General setup --->
[*]Initial RAM filesystem and RAM disk (initramfs/initrd) support Initrd所需要的脚本和命令可以从下面的网址获取:
我们使用copy initrd/rootfs作为initrd的根文件系统,它已经包含了需要的基本命令和库文件,我们可以根据需要添加一些目录和命令(如更换新的busybox),同时copy initrd下的所有脚本(linuxrc 在kernel2.6上需要改名为init)。如果需要使用其它目录下的命令,也可以copy到rootfs下的对应目录中。然后可以根据需要修改对应的脚本。我的目录结构如下:
然后把它打包成cpio格式文件
# find . | cpio --quiet -c -o|gzip -9 > ../
可以用如下方法修改一个cpio格式的initrd. #mv //modify to .gz file
#gunzip //we will find initrd #file initrd //it is cpio file initrd: ASCII cpio archive (SVR4 with no CRC)
# cpio -id < initrd //will see the FS in dir then we can modify the ram disk fs.
如果已经有一个ext2格式的initrd,可以直接修改和使用它,但kernel需要支持ext2 和cramfs。 # file
.bak: gzip compressed data, was \2008, max compression
#mv //modify to .gz file
#gunzip //we will find initrd
#file initrd //it is filesystem data,just to mount initrd: Linux rev 1.0 ext2 filesystem data (mounted or unclean) #mount initrd /mnt
Then we can modify the ram disk system 制作完成后把生成的放到usb盘中。
同时copy cd-root/boot/syslinux下的syslinux可执行文件和 到usb盘中,作为它们的bootloader。我的配置如下: prompt 1 timeout 30
default linux label linux
kernel vmlinuz
append initrd= boot=usb root=/dev/ram0 rw hanges=/dev/sdb
二、内核的配置与打补丁。
除了通用的配置,需要注意如下选项: 首先,要配置内核支持initrd General setup --->
[*]Initial RAM filesystem and RAM disk (initramfs/initrd) support 其次,usb设备的支持 Device Drivers --->
[*] Block devices --->
<*> Loopback device support [*] USB support --->
{*} Support for Host-side USB
<*> EHCI HCD (USB 2.0) support <*> OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support <*> USB Mass Storage support
usb设备如果配置成模块,需要在initrd中加载。这需要把生成的usb模块放到initrd文件系统中并修改init(linuxsrc)来加载它们。
最后,文件系统aufs和squashfs的支持。
由于是个只读文件,需要通过squashfs 和aufs的支持才能mount作为内核的文件系统。
Moblin不支持aufs文件系统,需要下载补丁文件,可以从下面的网站上获取:
补丁文件的具体说明和使用可以阅读补丁源码中的相关文档。
Moblin中已经提供了squashfs文件系统补丁,但这个补丁不支持LZMA,因此我放弃了这个补丁而另外找了一个,可以从下面的网站下载:
按照补丁说明文件操作会麻烦一点,因此我直接把对应文件copy到内核源码树下编译进了内核。具体操作如下:
1.下载源码包.bz2,sqlzma3..bz2,squashfs3.4. 2.解压
tar xjf sqlzma3..bz2 tar xzf squashfs3.4. mkdir lzma457
tar -C lzma457 -xjf .bz2 3.patch
patch -d linux-2.6.26 -p1 <
squashfs3.4/kernel-patches/linux-2.6.27-rc4/squashfs3.4-patch
patch -d linux-2.6.26 -p1 < sqlzma2k-3.4.patch patch -d squashfs3.4 -p1 < sqlzma2u-3.4.patch patch -d lzma457 -p1 <
4.把相应源码copy到此fs/squashfs/
源码文件可以在lzma457/C/Compress/Lzma和压缩包解压的首目录找到。最终的squashfs中的文件有:
inode.c,Lzmadecode.c,Lzmadecode.h,LzmaTypes.h,sqlzma.h.sqmagic.h,squashfs.h,squashfs2_0.c,uncomp.c,Makefile. 其中,Makefile需要手动编些,其内容如下: #
# Makefile for the linux squashfs routines. #
obj-$(CONFIG_SQUASHFS) += squashfs.o squashfs-y += inode.o
squashfs-y += squashfs2_0.o squashfs-y += LzmaDecode.o squashfs-y += uncomp.o
5.配置内核以支持squashfs
fs/Kconfig已经被补丁文件修改过,只需选中编译进内核即可。
三、编译内核,把生成的bzImage放到usb盘中,修改bzImage为vmlinuz,即可进行测试。
此时也需确认需要安装到主机的文件系统压缩包也已经放到usb盘中。