Qt configure 参数说明

Qt configure

在编译QT前,可加各种参数来定制自己想要的QT库。这对需要裁减QT库的朋友来说非常重要。对于如何编译QT,可以参考:http://hi.baidu.com/agassi%5Fp/blog/item/455833601e4eb14ceaf8f866.html

配置参数选项:

前面是*号的表示默认参数. +号表示该功能要求被评估,评估成功后才能被接受.

-release ........... 调试关闭.没有调试库,自己的项目只能发布,不能调试(没有调试库的缘故),如果你硬要编译debug版本的话,会提示找不到xxxxxd.dll

* -debug ............. 只有调试库,没有释放库,也就是说以后自己的项目只能调试,如果你硬要编译debug版本的话,会提示找不到xxxxx.dll

+ -debug-and-release . 编译后包含两种库。最好编译两种库

-opensource ........ 编译开源版.

-commercial ........ 编译商业版. 这两个参数一般不需指定,configure开始需要你选择版本。

-developer-build ... 编译开发者选项。

* -shared ............动态编译.

-static ............ 静态链接库.貌似有插件不能用静态编译。

* -no-fast ........... configure生成所有项目makefiles文件,并编译

-fast .............. 只生成库目录及子目录下的项目的makefiles文件.

-no-exceptions ..... 关闭异常支持

* -exceptions ........ 开启异常支持.

-no-accessibility .. 关闭对windows active控件支持.

* -accessibility .....对windows active控件支持.

-no-stl ............ 无c++标准库支持

* -stl ............... 有标准库支持

尖括号在blogger出问题了。。。。。

-no-sql- ... Disable SQL entirely, by default none are turned on.

-qt-sql- ... Enable a SQL in the Qt Library.

-plugin-sql- Enable SQL as a plugin to be linked to at runtime.

Available values for :

mysql

psql

oci

odbc

tds

db2

+ sqlite

sqlite2

ibase

(drivers marked with a '+' have been detected as available on this system)

-system-sqlite ..... Use sqlite from the operating system.

-no-qt3support ..... 不提供对qt3函数支持

-no-opengl ......... 不提供OpenGL函数支持

-platform ... The operating system and compiler you are building on.

(default %QMAKESPEC%)

-xplatform .. The operating system and compiler you are cross compiling to.

See the README file for a list of supported operating systems and compilers.

-qtnamespace Wraps all Qt library code in 'namespace name {...}

-D ........ Add an explicit define to the preprocessor.

-I ... Add an explicit include path.

-L ... Add an explicit library path.

-l ... Add an explicit library name, residing in a librarypath.

-graphicssystem Specify which graphicssystem should be used.

Available values for :

* raster - Software rasterizer

opengl - Using OpenGL accelleration, experimental!

-help, -h, -? ...... Display this information.

第三方库

-qt-zlib ........... 使用zlib绑定到qt.

+ -system-zlib ....... 使用操作系统的zlib

见 http://www.gzip.org/zlib

-no-gif ............ 不编译gif文件读取支持插件

+ -qt-gif ............ 编译gif文件读取支持插件

参见 src/plugins/imageformats/gif/qgifhandler.h

-no-libpng ......... 不编译PNG支持插件.

-qt-libpng ......... 编译PNG支持插件.

+ -system-libpng ..... 使用系统libpng库

见 http://www.libpng.org/pub/png

-no-libmng ......... 不编译MNG支持插件.

-qt-libmng ......... 编译MNG支持插件.

+ -system-libmng ..... 使用系统的mng库

参见 http://www.libmng.com

-no-libtiff ........ 不编译tiff支持插件.

-qt-libtiff ........ 编译tiff支持插件.

+ -system-libtiff .... 使用系统的libtiff库

见 http://www.libtiff.org

-no-libjpeg ........ 不编译jpeg支持插件库

-qt-libjpeg ........ 编译jpeg支持插件库

+ -system-libjpeg .... 使用系统的jpeg支持库

见 http://www.ijg.org

以下参数仅对qt for windows有效

-no-dsp ............ 不生成 VC++ .dsp 文档.

* -dsp ...............生成 VC++ .dsp文档, 需要有平台标识符"win32-msvc".注意 qt4开始就不支持vc6.0了所以这两个参数无效。

-no-vcproj ......... 不生成 VC++ .vcproj 文档

* -vcproj ............ 生成 VC++ .vcproj 文档, 需要平台标识符"win32-msvc.net".也就是vs2003以上的编译环境

-no-incredibuild-xge Do not add IncrediBuild XGE distribution commands to custom build steps.

+ -incredibuild-xge .. Add IncrediBuild XGE distribution commands to custom build steps. This will distribute MOC and UIC steps, and other custom buildsteps which are added to the INCREDIBUILD_XGE variable.

(The IncrediBuild distribution commands are only added to Visual Studio projects)

-no-plugin-manifests 插件不嵌入manifests.

* -plugin-manifests .. 插件嵌入manifests.

-no-qmake .......... 不编译qmake

* -qmake ............. 编译 qmake. 不建议 不编译qmake

-dont-process ...... 不生成makefiles和project文档. 比 -no-fast 参数优先级更高

* -process ........... 生成makefiles和project文档.

-no-rtti ........... 不编译运行时类型信息。

* -rtti .............. 编译运行时类型信息。

//下面是对指令的支持,不解释了

-no-mmx ............ Do not compile with use of MMX instructions

+ -mmx ............... Compile with use of MMX instructions

-no-3dnow .......... Do not compile

with use of 3DNOW instructions

+ -3dnow ............. Compile with use of 3DNOW instructions

-no-sse ............ Do not compile with use of SSE instructions

+ -sse ............... Compile with use of SSE instructions

-no-sse2 ........... Do not compile with use of SSE2 instructions

+ -sse2 .............. Compile with use of SSE2 instructions

+ -direct3d .......... 将Direct3D支持编译进来。检测不到direct3d sdk 就不支持

-no-openssl ........ Do not compile in OpenSSL support

+ -openssl ........... Compile in run-time OpenSSL support

-openssl-linked .... Compile in linked OpenSSL support

-no-dbus ........... Do not compile in D-Bus support

+ -dbus .............. Compile in D-Bus support and load libdbus-1 dynamically

-dbus-linked ....... Compile in D-Bus support and link to libdbus-1

-no-phonon ......... 不将 Phonon 模块 编译进来

+ -phonon ............ 将 Phonon 模块编译进来 (若使用的规范的c++编译器则会自动编译Phonon模块)

-no-phonon-backend . Do not compile the platform-specific Phonon backend-plu

gin

* -phonon-backend .... Compile in the platform-specific Phonon backend-plugin

-no-webkit ......... 不将webkit模块编译进来,编译webkit非常耗时间。

+ -webkit ............ 将webkit模块编译进来 (若使用的规范的c++编译器则会自动编译WebKit模块)

-no-scripttools .... Do not build the QtScriptTools module.

* -scripttools ....... Build the QtScriptTools module.

-arch ....... 外观样式.

有以下几种 :

* windows

windowsce

boundschecker

generic

-no-style-尖括号里包含上面的样式。

编译一次Qt要耗费太多的时间,常常是越着急用它,编起来越慢。其实通过很简单的几招可以帮你节省编译的时间。下面就一一道来:

第一招,编译之前确定哪些功能是不必要的,对编译树进行简单裁剪。

比如最常见的,像demos, examples,虽然很有参考价值,但完全可以放在后面用到的时候再单独编译小工程,这样可以节省不少时间。经过实践,最简单的方法是修改configure文件,在该文件中有个指定编译目录的字段:

QT_DEFAULT_BUILD_PARTS=”libs tools examples demos docs translations”

可以把examples、demos和docs从这里去掉,但要注意,别的可不能随便去掉。

如果在后面的使用中发现有些小工程需要编译了,可以采用一般编译Qt程序的方法,即用Qt安装目录bin下的qmake来生成Makefile,同样可以编译和测试例子代码,一点也不影响使用。

第二招,裁剪Qt模块。

Qt从4版本开始采用了模块化的形式,将独立的功能封装在独立的库里,所以可以很简单的去掉一些不需要的库,这样也能节省编译时间和对硬盘空间的占用。 Qt的configure配置提供了一些设置模块的方法,如它支持-no-svg和-no-webkit,通过configure的时候加这些选项就可以去掉这部分支持。相应的还有很多小的功能可以通过configure参数的形式配置,具体的参考configure –help的输出。在查看configure帮助的时候特别要注意加*号的内容,也就是Qt默认的configure选项,有的时候默认选项可不一定是讨人喜欢的哦。

Qt桌面版本默认会尽量多的编译feature进去,这样有一定的好处,就是用户可以用到所有的Qt功能,但坏处也很明显,那就是编译出来的Qt超级大,特别是编译debug版本,基本上要占1到2G的空间,所以个人感觉研究一下configure的选项还是很有必要的。另外, 默认状况下有些插件是不会编译的,比如数据库插件,往往需要用户自己根据需要编译,这一点也要注意。

第三招,针对嵌入式版本的配置。

Qt的嵌入式版本本身就支持feature裁剪,我们可以充分利用这一特性让Qt库尽量变小。具体的做法是要做一个自己的qconfig-[myconfig].h特性文件,该文件中定义你要去掉Qt中的哪些feature。在configure的时候加“-qconfig myconfig” 选项, Qt就会根据你给出的配置文件来编译,以达到裁剪的目的。这里要强调一下,这种裁剪方式只适用于嵌入式版本。这里的myconfig可以用任何你喜欢的名字来代替。

在qt的代码中已经给出了一些qconfig头文件的例子,默认编译采用full config也就是

不裁剪任何feature。所有Qt预定义好的qconfig文件,可以在src/corelib/global/下找到,包括qconfig-minimal.h, qconfig-small.h, qconfig.medium.h,qconfig-large.h和qconfig-dist.h,也就是从裁剪量由多到少都有据可依。如果要添加你自己的配置文件,要在src/corelib/global下建立一个形如qconfig-xxx.h的文件,这个xxx也就是你要在configure的时候传入的qconfig参数。笔者测试使用的Qt版本是4.4.1,这个版本的build system有个小毛病,就是如果你指定的qconfig参数实际上没有qconfig-xxx.h文件对应, build不会停止,它只会给出一个不起眼的提示,编译过程会继续, 这一点挺让人费解的。而且这种情况下Qt编译使用的配置基本上和fullconfig相同,鉴于它的让人迷惑的举动,个人觉得有必要提醒大家一下,使用自定义qconfig的时候一定要确定配置文件放对了位置,而且qconfig参数给的正确。

一般我们的建议是在桌面上测试阶段编译一个full的版本,再根据你的项目使用Qt feature的情况总结哪些可去掉的feature。 feature之间有千丝万缕的依赖关系,这个问题也是困扰很多人的难点所在。具体的依赖可以查阅src/corelib/global/qfeatures.h和src/corelib/global/qfeatures.txt(描述依赖关系的文档)。另外,Qt里还提供了一个可视化的配置依赖的工具,叫做qconfig,在QTDIR/tools/qconfig目录。该工具需要基于Qt桌面版本编译。如在我的linux系统下可以用下面的命令来编译:

$ cd qt-embedded-linux-commercial-4.4.1/tools/qconfig

$ /usr/local/Trolltech/Qt-4.4.3/bin/qmake

$ make

编译成功后运行./qconfig,初始要打开qfeatures.txt. Qconfig读取该文件生成一个树状图,该图很清楚的显示出feature之间的依赖关系。如下图所示,如果你去掉了LINEEDIT这个feature,用到该控件的combobox也就不能继续使用了。有了这个工具裁剪Qt变得简洁直观,方便了很多。

选定了你要去掉的feature后点击菜单File->Save As..会弹出保存文件的页面,文件名字应该定义成qconfig-xxx.h的形式,这样你在configure的时候就可以传入相应的qconfig参数了。你还可以通过选择File->Open打开现有的qconfig-xxx.h文件,通过修改已经有的文件更快的编辑配置。

根据笔者测试,未经裁剪的qte4.4.1编译出来为:

libQtCore.so是2.6M

libQtGui.so是9.5M

如果用small来编译,就能缩小为:

libQtCore.so是2.0M

libQtGui.so是5.7M

差异还是比较明显的。

Linux 下查看程序依赖的库

查看arm程序的依赖库

# arm-linux-readelf hello -d
Dynamic section at offset 0xf10 contains 25 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x82e0
 0x0000000d (FINI)                       0x847c
 0x00000019 (INIT_ARRAY)                 0x10f04
 0x0000001b (INIT_ARRAYSZ)               4 (bytes)

查看x86程序的依赖库

# ldd hell0.x86
        linux-gate.so.1 =>  (0xb77c5000)
        libc.so.6 => /lib/libc.so.6 (0xb7672000)
        /lib/ld-linux.so.2 (0xb77c6000)

Linux中DD命令详解

Linux中DD命令详解 
1.dd命令简介 

       功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的diskcopy命令的作用。先用dd命令把软盘上的数据写成硬盘的一个寄存文件,再把这个寄存文件写入第二张软盘上,完成diskcopy的功能。需要注意的是,应该将硬盘上的寄存文件用rm命令删除掉。系统默认使用标准输入文件和标准输出文件。  

语法:dd [选项]  

if =输入文件(或设备名称)。  
of =输出文件(或设备名称)。  
ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。  
skip = blocks 跳过读入缓冲区开头的ibs*blocks块。  
obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。  
bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。  
cbs = byte 一次转换bytes字节。  
count=blocks 只拷贝输入的blocks块。  
conv = ASCII 把EBCDIC码转换为ASCIl码。  
conv = ebcdic 把ASCIl码转换为EBCDIC码。  
conv = ibm 把ASCIl码转换为alternate EBCDIC码。  
conv = block 把变动位转换成固定字符。  
conv = ublock 把固定位转换成变动位。  
conv = ucase 把字母由小写转换为大写。 
conv = lcase 把字母由大写转换为小写。  
conv = notrunc 不截短输出文件。  
conv = swab 交换每一对输入字节。  
conv = noerror 出错时不停止处理。  
conv = sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)。  
2.实例分析
2.1.数据备份与恢复
2.1.1整盘数据备份与恢复
备份:
dd if=/dev/hdx of=/dev/hdy
将本地的/dev/hdx整盘备份到/dev/hdy

dd if=/dev/hdx of=/path/to/image
将/dev/hdx全盘数据备份到指定路径的image文件

dd if=/dev/hdx | gzip >/path/to/image.gz
备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径

恢复:
dd if=/path/to/image of=/dev/hdx
将备份文件恢复到指定盘

gzip -dc /path/to/image.gz | dd of=/dev/hdx
将压缩的备份文件恢复到指定盘

2.1.2.利用netcat远程备份

dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
在源主机上执行此命令备份/dev/hda

netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
在目的主机上执行此命令来接收数据并写入/dev/hdc

netcat -l -p 1234 | bzip2 > partition.img
                netcat -l -p 1234 | gzip > partition.img
以上两条指令是目的主机指令的变化分别采用bzip2 gzip对数据进行压缩,并将备份文件保存在当前目录。

2.1.3.备份MBR
备份:

dd if=/dev/hdx of=/path/to/image count=1 bs=512
备份磁盘开始的512Byte大小的MBR信息到指定文件
              
恢复:

dd if=/path/to/image of=/dev/hdx
将备份的MBR信息写到磁盘开始部分

2.1.4.备份软盘

dd if=/dev/fd0 of=disk.img count=1 bs=1440k
将软驱数据备份到当前目录的disk.img文件

2.1.5.拷贝内存资料到硬盘

dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件

2.1.6.从光盘拷贝iso镜像

dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件     

2.2.增加Swap分区文件大小

dd if=/dev/zero of=/swapfile bs=1024 count=262144
创建一个足够大的文件(此处为256M)

mkswap /swapfile
把这个文件变成swap文件

swapon /swapfile
启用这个swap文件

/swapfile swap swap defaults 0 0
在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行

2.3.销毁磁盘数据

dd if=/dev/urandom of=/dev/hda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。

2.4磁盘管理

2.4.1.得到最恰当的block size

dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
                dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
                dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file      
                dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小

2.4.2测试硬盘读写速度

dd if=/root/1Gb.file bs=64k | dd of=/dev/null
                dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度     

2.4.3.修复硬盘

dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生magnetic flux point。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。

2.4.4.软盘拷贝

要把一张软盘的内容拷贝到另一张软盘上,利用/tmp作为临时存储区。把源盘插入驱动器中,输入下述命令:  

$ dd if =/dev/fd0 of = /tmp/tmpfile  

拷贝完成后,将源盘从驱动器中取出,把目标盘插入,输入命令:  

$ dd if = /tmp/tmpfile of =/dev/fd0  

软盘拷贝完成后,应该将临时文件删除:  

$ rm /tmp/tmpfile  

2.4.5.把net.i这个文件写入软盘中,并设定读/写缓冲区的数目。  

(注意:软盘中的内容会被完全覆盖掉)  

$ dd if = net.i of = /dev/fd0 bs = 16384  

2.4.6.将文件sfile拷贝到文件 dfile中。  

$ dd if=sfile of=dfile

使用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引导。