标签归档:BusyBox

Linux Busybox Qt Grub2 开发环境与配置整套解决方案

VirtualSys_x86_Linux_Ubuntu_14.04_CN-2014-12-07-11-12-46

Linux项目说明

 

修正日期:2014/11/25

目录

项目要求... 3

Linux内核编译... 3

目录内容介绍(LinuxProject/LinuxKernel/) 3

内核配置中需要注意... 3

Qt框架... 6

目录内容介绍(LinuxProject/ Qt-EmbAndDesktop/) 6

Qt开发环境配置... 7

Qt版本添加... 7

LinuxProjectQt/Desktop版本添加... 7

LinuxProjectQt/E版本添加... 8

Qt构建套件添加... 9

LinuxProjectQt/Desktop版本添加... 9

LinuxProjectQt/E版本添加... 10

Qt Creator开发环境添加“帮助”(开发文档)... 10

Grub2(支持“安全启动”)... 12

目录内容介绍(LinuxProject/Grub2/) 12

统BIOS创建的目录结构... 12

EFI BIOS创建的目录结构... 13

BusyBox工具... 13

目录内容介绍(LinuxProject/BusyBox/) 13

库... 14

Glib. 14

目录内容介绍(LinuxProject/lib/glib/) 14

Libiconv. 14

目录内容介绍(LinuxProject/lib/libiconv/) 14

其它介绍... 14

Linux项目根目录脚本介绍... 14

Other目录文件介绍... 17

给本Linux项目传递参数... 18

与操作系统结合... 18

传统BIOS引导方式(LegacyBIOSBoot)... 18

EFI BIOS引导方式(EFIBIOSBoot)... 19

自动选择内核... 19

注意事项... 20

其它... 21

命令行编译Qt实例配置... 21

环境变量... 21

测试环境变量设置是否生效... 22

进入需要编译的程序目录(程序名hello.cpp)... 22

使嵌入式Qt支持中文字体的方法... 22

修改Qt Framebuffer模式背景(从png图片载入当做背景)... 22

判断当前Qt库是否为嵌入式版本... 23

Qt Creator IDE字体样式... 23

Qt应用程序“国际化”... 23

其它约定... 24

SVN客户端工具PySVN安装命令... 24

SVN命令行工具安装命令... 24

Qt X11风格样式设置... 24

用到的lib库... 27

注释... 28

 


 

项目要求

操作系统版本

Linux Ubuntu 14.04 x86

 

其它代码版本

Linux 内核:linux-3.17.4

Qt框架:qt-everywhere-opensource-src-4.8.6

Grub2:grub-2.02~beta2

BusyBox工具:busybox-1.22.1

 

Glib库:glib-2.6.6

Libiconv库:libiconv-1.14

 

开发环境

Qt Creator 3.2.2

 

Linux内核编译

编译x86与x86_64版本的内核,x86内核屏蔽EFI平台启动选项,x86_64内核支持EFI平台启动。

 

目录内容介绍(LinuxProject/LinuxKernel/)

linux-3.17.4.tar.xz:Linux内核源代码压缩包

.config - x86:x86 Linux内核配置文件(在Linux默认是隐藏的,如果想查看此文件,需要显示隐藏文件。)

.config - x64:x64 Linux内核配置文件(在Linux默认是隐藏的,如果想查看此文件,需要显示隐藏文件。)

mk-LinuxKernel-all.sh:Linux内核编译脚本文件

NoSimplifyConfig:存放没有精简过的内核配置文件(.config)

 

编译后在目录中生成:x86与x86_64两个文件夹,分别存放x86与x86_64内核文件,内核文件名为:bzImage。

 

内核配置中需要注意

。 。。。 。。。 。。。

使用BusyBox做一个小巧的Linux操作系统

1.基础知识
一个操作系统可以简单的抽象为,引导程序 内核 文件系统。
 
vmlinuz是Linux 内核的镜像文件,可以被引导程序加载,从而启动Linux系统。
 
initrd的全称是boot loader initialized RAM disk,它是系统启动时所使用的根文件系统映像文件,这个文件系统中包含几个驱动模块,用来装载实际的根文件系统,比如一个IDE或SCSI硬盘的驱动模块,内核装入这个模块之后用它来驱动硬盘,挂接硬盘到ramdisk的某个子目录,然后再用其中的pivot_root命令,将硬盘文件系统变成根文件系统,并开始执行init进程,此时init ram disk被umount,寿终正寝。
 
由此可见,我们可以用vmlinuz initrd.img做一个文件系同长驻内存的迷你Linux。
 
现在进入正题了:
 
2.编译内核
cd /usr/src/....----进入内核源代码目录,没有的话去官方网站,随便下
make menuconfig-----配置编译选项请注意一定加入RAM disk support 和initial RAM disk
(initrd) support 的支持(在block device中)。另外最好将ext3文件系统编入内核,不要编成模块。配置完毕后保存为.config(默认)
make bzImage----编译
 
在许多内核编译参考中还有
make modules
make modules_install两步
但我们这里没有加入对modules的支持,所以不需要。生成的bzImage文件在usr/src/linux/arch/.../boot中,省略的根据你的机器架构决定,make过程中会有提示,比如我的是x86_64. 注意这个文件非常重要,其实就是我们最终的vmlinuz.
 
3.busybox
busybox是一个集成了一百多个最常用linux命令和工具的软件,它甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分力式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl alt F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接.在我们的迷你Linux中,需要的也正是busybox的命令和工具。
 
下载 http://busybox.net/downloads/
使用过程中许多高版本都出现编译错误,所以用了一个最原始的版本busybox-1.00
#cp busybox-1.00.tar.gz /tmp/bunny
#cd /tmp/bunny
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig ----编译配置
 
下面是需要编译进busybox的功能选项,其他的可以根据需要自选.
General Configuration应该选的选项
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf
Build Options
Build BusyBox as a static binary (no shared libs)
 
这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作.
 
Installation Options
Don't use /usr
 
这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向它的链接.
 
其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了.
配置好后退出并保存.config.
make
make install
编译好后在busybox目录下生成子目录_install,里面的内容:
bin
linuxrc -> bin/busybox
sbin
其中可执行文件busybox在bin目录下,其他的都是指向他的符号链接.
 
4.制作自己的root fs
1)目录结构
mkdir /tmp/myOS/rootfs
cd /tmp/myOS/rootfs
mkdir etc usr var tmp proc home root dev
其中etc,proc和dev是一定要建的,bin和sbin不用建,因为busybox中已经有了.
其他的可以象征性的建几个就可以了.
拷贝busybox
#cp -R /tmp/bunny/busybox-1.00/_install/* /tmp/myOS/rootfs/
 
2)设备文件
我是直接从FC系统/dev目录里cp的,方法如下:
#cp -R /dev/console /tmp/myOS/rootfs/dev/
#cp -R /dev/null /tmp/myOS/rootfs/dev/
#cp -R /dev/zero /tmp/myOS/rootfs/dev/
你认为需要的都cp过来
有的参考文献说fd0,hda,ram,ram1,tty1,loop1,fb0,fb,tty等是必备的,但是好像有些文件并没有
 
3)建立etc目录下的配置文件
我是直接拷贝busybox自带的例子
cp -R tmp/bunny/busybox-1.00/examples/bootfloppy/etc/* /tmp/myOS/rootfs/etc
 
4)制作initrd.img映象文件
cd /tmp/myOS/
dd if=/dev/zero of=/tmp/disk bs=1M count=32 ------初始化32M内存空间
mkfs.ext3 -m0 /tmp/disk ------格式化为ext3
mkdir /mnt/ram
mount -o loop /tmp/disk /mnt/ram ------挂载到/mnt/ram
cp -R rootfs/* /mnt/ram ------把rootfs写入内存
umount /mnt/ram
dd if=/tmp/disk of=/tmp/myOS/initrd.img ------把内存中的内容以映象方式取出
ok,这个initrd.img就是我们的rootfs
有的文献使用ram0,也就是将上述过程的/tmp/disk改为/dev/ram0,虽然制作过程没有问题,但是它存在大小限制
 
5.整合,启动
1)kernel
cp /usr/src/linux/arch/x86_64/bzImage /boot/vmlinuz
2)rootfs 一般命名为initrd.img
cp /tmp/myOS/initrd.img /boot
3)有了上述两个文件,已经可以通过网络dhcp, tftp服务器启动,tftp服务器中添加启动脚本如下
DEFAULT linux
PROMPT 0
LABEL linux
KERNEL vmlinuz
append initrd=initrd.img devfs=nomount ramdisk_size=52000
 

问题:理论上这个小Linux也应该可以从grub引导。