LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: wqkong

编译TinyX求助

[复制链接]
发表于 2007-7-19 01:04:22 | 显示全部楼层
说实话我很关注这个帖子,我自己做的LINUX有三大问题
1.ALSA不出声
2.MC如果用F4 的话就出错
3.BUSYBOX编得不够完善
当然,我也在关注如何加X上去~
以下是我摘抄的一些资料:

一、概述
精简Linux系统的主要目的是将Linux系统使用固态盘等小容量flash存储设备来替代PC机上面的硬盘。解约成本、减少体积、提高速度以及延长使用寿命和稳定性。

精简Linux的主要方法就是通过更换Linux的系统环境进行的。主要的过程是使用内存文件系统替换硬盘文件系统,使用busybox替换Linux的init进程、常用命令和shell,使用Framebuffer替换X11库。

二、准备工作
在精简之前,需要安装引导程序,用来引导我们精简之后的Linux系统,并且传递必要的参数给内核。我们使用的引导器是grub.

通常我们的Linux系统中都带有grub,在命令下面敲入grub可以进入grub的命令行。

我们暂时使用的存储介质是U盘。在装入grub之前,先使用fdisk进行分区。我是将整个U盘作为了主分区,并且设置为可引导分区(在linux的fdisk中,需要使用命令a进行设置)。然后我把该分区格式化为ext2格式(使用mkfs.ext2或者mke2fs命令)。我使用下面的命令进行格式化:

mke2fs /dev/sda1

格式化好之后,将U盘挂载到文件系统中,建立boot/grub/路径,将系统的/boot/grub/下面的stage1和stage2拷贝到boot/grub下。我将它挂载到/mnt/u,使用如下的命令进行操作:

mount /dev/sda1 /mnt/u

mkdir /mnt/u/boot

mkdir /mnt/u/boot/grub

cp /boot/grub/stage* /mnt/u/boot/grub/

然后,使用grub修改u盘的MBR记录,我系统下只有一个硬盘,我使用下面的命令进行操作:

grub

root (hd1,0)

setup(hd1)

然后需要在grub目录下建立配置文件grub.conf,我采用如下的方式建立的:

vi /mnt/u/boot/grub/grub.conf

然后在文件中写入如下内容:

default 0

timeout 0

title linux

kernel /bzImage vga=0x315

initrd /image.gz

使用wq保存配置文件。

三、编译内核
我们使用的是2.6.16的内核,可以在www.linux.org下载,文件名 ... 功能进行解压:

tar €€jxvf linux-2.6.16.tar.bz2

解压整个文件之后,进入linux-2.6.16的源代码目录,然后对代码进行编译。

编译过程如下:

make menuconfig

对内核进行配置,执行该命令的时候,要求所开的终端宽度要足够显示80个字符,以显示整个配置的图形界面,否则会出现错误。

进入配置界面之后,在Device Driver->block devices里面选择

RAM Disk support

Initial RAM disk support

两个项目。在Graphics support里面选择

Support for frame buffer deiveces

Console Display driver support->FrameBuffer console support

由于对于将要选择显卡不明确,我没有更改这个里面的设置

另外,还需要选择MultiMedia devices里面的Video for Linux选项,里面的驱动程序不用选择。



注意:1.对于奔腾II芯片,需要在 Processor里面选择

    2.选择内核模块的时候,会出现两种情况。一种是*号,表示选定到真正的内核中。另外一种是“M”符号,表示内核起来以后再加载进去的模块。我们文件系统里面不添加其它的内核模块,我们都选择第一种。

配置好之后,直接

make bzImage

编译之后,在arch/i386/boot/里面有一个bzImage文件,拷贝它到U盘的根目录下面。

注意:内核的编译是从源代码开始的,由于不同的编译器版本对源代码的处理方式不同。因此,相同的代码在不同的编译器上都会可能出现不同的编译错误。我在gcc3.2和gcc4.1下编译通过。

四、编译busybox

首先在www.busybox.net下载busybox的 ... sybox-1.2.0.tar.bz2

使用命令:

tar €€jxvf busybox-1.2.0.tar.bz2

解压之后,进入busybox-1.2.0的目录

使用make menuconfig进行配置,选择需要的命令。一定要选择shell里面的ash以及init utility里面的init,其它的可以随便选择一些常用的命令。

然后使用make,对源代码进行编译。

编译完成之后,建立一个临时的目录,保存busybox生成的文件。我建立的是/tmp/usb

然后使用下面命令拷贝busybox的文件到临时目录,这个目录以后就是我们的系统启动后的文件系统。

make  PREFIX=/tmp/usb  install

四、制作图形库
接下来编译Qt的嵌入式图形库。Qt的嵌入式图形库现在叫做Qtopia-core。可以在http://www.trolltech.com/trollte ... 的命令解压缩:

tar  €€zxvf  qtopia-core-opensource-src-4.1.4.tar.gz

进入qtopia-core目录,使用如下的配置方式

./configure €€embedded x86

配置好之后,使用make编译该源文件。

注意topia-core编译大概需要4个小时(我的机器用了这么长时间,配置是512M内存,P4 1.8G的处理器),而且需要大概1.5G的空间。如果空间不足,可能会出现莫名其妙的问题。

然后使用make install将Qtotpia-core安装到系统目录。

安装之后,就可以使用找个库开发图形界面的应用程序。但是要在精简的Linux系统上运行,需要把Qt的库拷贝到找个系统上。

调试库通常比较大,所以,我们主要拷贝非调试的库,同时还拷贝系统其它的库到/tmp/usb/lib目录。


拷贝的时候,cp命令要增加-a命令以拷贝符号链接。

比如我拷贝libQtGui的时候,我使用下面的命令:

cp /usr/local/Trolltech/Qtopia-core-4.1.4/lib/libQtGui.so* /tmp/usb/lib €€a

上面截图中的库的分布路径主要在/lib /usr/lib以及Qt的lib目录下面,如果找不到,可以使用locate命令进行查找.

locate libz.so

拷贝完成库之后,还需要把Qt的字体也拷贝过来。Qt的字体在/usr/local/Trolltech/QtopiaCore-4.1.4/lib/fonts里面。主要需要拷贝里面的fontdir文件。找个文件记录了每种字体所在的路径。可以拷贝一些必要的字体到/tmp/usb里面,路径跟本机路径相同。比如我就拷贝到

/tmp/usb/usr/local/Trolltech/QtopiaCore-4.1.4/lib/fonts里面

需要拷贝的字体由你的fontdir里面决定。你可以在找个文件中删除你没有拷贝的那些字体。

五、制作文件系统
   到现在为止,我们已经准备好了需要的文件了。最后我们要开始制作我们的文件系统。

刚刚已经拷贝了必要的库已经busybox到响应的目录了。现在我们还需要增加一些系统启动需要的文件。

   首先建立/tmp/usb//etc目录,在找个目录下面建立文件initab,在文件中写入以下内容:

::sysinit:/etc/rc.S

::askfirst:/bin/ash

其中,sysinit表示后面找个程序在系统初始化的时候执行,后面的askfirst表示系统初始化完毕后启动的程序。这个程序如果执行结束,那么系统会再次启动它。

然后建立rc.S文件,写入以下内容:

#!/bin/ash

/bin/mount -t proc /proc /proc

export PATH=/bin/:/sbin/:/usr/sbin/

最后,我们需要建立设备文件。首先建立一个/tmp/usb/dev目录。在下面执行一下命令以建立设备文件。

mknod console c 5 1

mknod fb0 c 29 0

mknod hda b 3 0

mknod hda1 b 3 1

mknod loop0 b 7 0

mknod null c 1 3

mknod ram0 b 1 0

mknod tty c 5 0

mknod tty0 c 4 0

ln €€s fb0 fb

建立好这些文件之后,文件系统就可以了。我们还可以把我们的程序拷贝到找个文件系统当中,然后修改rc.S文件,使得它自动运行。也可以进去之后,使用busybox提供的shell来执行。

最后一步,就是把找个文件系统做成一个内存文件系统的影像。

首先,新建一个空的文件,大小为16M,我使用下面的命令:

dd if=/dev/zero of=/tmp/image bs=1024 count=16384

然后,把找个空文件映射到一个设备文件上面,使用下面的命令进行:

losetup /dev/loop0 /tmp/image

把这个影像格式化为ext2格式:

mke2fs /dev/loop0

格式化好之后,把它挂载到我们主机的文件系统上面来,我把它挂载到/mnt/img:

mount /dev/loop0 /mnt/img

然后把我们建立好的文件系统从/tmp/usb拷贝过来

cp  /tmp/usb/*  /mnt/img/  -ar

拷贝完成之后,我们的images文件就是包含了这些文件的文件映像了。

把它从系统中卸载出来

umount /dev/loop0

把loop0跟imag脱离关系

losetup €€d /dev/loop0

sync

现在,我们的文件映像做好了。再把它压缩一下:

dd if=image |gzip -9 >image.gz

image.gz就是我们的压缩的内存文件影像了。把它拷贝到U盘的根目录下面。

设置系统引导从USB启动(USB-HDD),系统就会启动到busybox提供的shell下面。
回复 支持 反对

使用道具 举报

发表于 2007-7-19 01:05:10 | 显示全部楼层
还有另外一个人的:
在Linux下,从到头构建图形环境,不说是很难的事,至少也是要费些周折的,特别是对一个新手来说。最近老大让我研究一下Linux下的图形环境,以便决定是否能在手机上使用(CPU采用INTEL的PXA27x)。为了方便,先在PC上做实验,操作系统采用的是RH9,目标是让TinyX + GTK在RH上跑起来。为了编译,中间有多次反复,直到后来一口气完成,一共竟花了五六个晚上。下面把全过程写下来,和大家分享:
设置环境变量

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/X11R6/lib/pkgconfig

export LD_LIBRARY_PATH=/usr/local/lib:/usr/X11R6/lib

export CFLAGS=-g

说明:现在大多数软件,都是通过pkg-config来检查依赖关系的,一般来说,软件包都会在/usr/local/lib/pkgconfig下创建对应的pc文件,而X11有些特殊,它在/usr/X11R6/lib/pkgconfig下存放自己的pc文件,所以要把两者都加到PKG_CONFIG_PATH环境变量中。


安装最小的Linux(RH9),带基本的开发工具,不带图形系统。需要下载一个最新版本的Autoconf,编译并安装,否则后面检查autoconf的版本号会出错。


安装libpng:
下载libpng-1.2.8.tar.bz2。
tar jxvf libpng-1.2.8.tar.bz2
cd libpng-1.2.8
make -f scripts/makefile.linux
make -f scripts/makefile.linux install

安装libjpeg
下载libjpeg-6b.tar.gz
tar zxvf libjpeg-6b.tar.gz  
cd jpeg-6b
./configure --enable-shared; make; make install

说明:jpeg的默认配置不是share library,不要忘了加--enable-shared,否则到后面还得返工重来。

安装freetype
下载freetype-2.1.10.tar.gz
tar zxvf freetype-2.1.10.tar.gz
cd freetype-2.1.10
./configure; make; make install
安装TinyX
下载XFree86-4.4.99.9.tar.gz
tar zxvf XFree86-4.4.99.9.tar.gz
cd xc/config/util/
make -f Makefile.ini lndir
cd ../../../
mkdir build
cd build
../xc/config/util/lndir ../xc
cd config/cf/
cp TinyX.cf host.def
编辑host.def,做如下修改:

#define TinyXServer YES放到注释外来。
#define BuildLBX              YES
#define BuildFonts              YES

cd ../../
make World
make install

说明:编译TinyX要很长时间,在我的VMWare里,花了4个多小时才编译完成。

安装glib
下载glib-2.8.0.tar.gz
tar zxvf glib-2.8.0.tar.gz
cd glib-2.8.0
./configure; make; make install


创建文件:/usr/X11R6/lib/pkgconfig/xrender.pc,其内容如下:

prefix=/usr/X11R6

exec_prefix=/usr/X11R6/bin

libdir=/usr/X11R6/lib

hardcode_libdir_flag_spec=

includedir=/usr/X11R6/include



Name: Xrender

Description: X Xrender library

Version: 1.2.0

Requires:

Libs: ${hardcode_libdir_flag_spec} -L${libdir} -lXrender

Cflags: -I${includedir}

说明:安装TinyX后,并没有生成xrender.pc,查看了一下相关的库和头文件,都是正常的。Cairo通过xrender.pc去检查Xlib相关设置,于是手工编辑了这个文件,以使cairo的configure不会出错。


安装cairo
下载cairo-1.0.0.tar.gz
tar zxvf cairo-1.0.0.tar.gz
cd cairo-1.0.0
./configure --with-x --disable-win32;make; make install

安装pango
下载pango-1.10.0.tar.gz
tar zxvf pango-1.10.0.tar.gz
cd pango-1.10.0
./configure --with-x;make;make install

安装atk
下载atk-1.10.1.tar.gz
tar zxvf atk-1.10.1.tar.gz
cd atk-1.10.1
./configure; make; make install

安装gtk
下载gtk+-2.8.0.tar.bz2
tar jxvf gtk+-2.8.0.tar.bz2
cd gtk+-2.8.0
./configure --with-x --without-libtiff
cd /usr/X11R6/include
ln freetype2/freetype/ freetype -s
make;make install

说明:编译时,找不文件ftheader.h,在系统里查找了一下,发现该文件在:

/usr/X11R6/include /freetype2/freetype/config/ftheader.h

一时没有想到好的办法,就建了一个符号连接,让gcc可以找到该文件,这实属下策。
安装qvwm
下载qvwm-1.1.12.tar.gz
tar zxvf qvwm-1.1.12.tar.gz
cd qvwm-1.1.12
./configure;make;make install

测试
export DISPLAY=:0
Xfbdev &
gk-demo

呵,搞定了,有些地方技巧性的绕过去了,并没有完全弄清楚,还需要进一步研究。在编译的过程中,遇到的不少configure或者make通不过的情形,一般都是缺少某些库,或者编辑的先后顺序不对引起的。由于在VMWare里执行比较慢,重编译一次要花很长时间,以至于花了五六个晚上才搞定。
回复 支持 反对

使用道具 举报

发表于 2007-7-19 01:11:57 | 显示全部楼层
最近在切换机器,不方便自己做测试来玩,希望做出来的朋友说一下,谢谢了~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-19 10:10:19 | 显示全部楼层
host.def如下:
#define BuildServersOnly YES
#define KDriveXServer YES
#define TinyXServer YES
#define XfbdevServer YES

错误信息如下:
make[7]: *** 没有规则可以创建“xdmxconfig”需要的目标“../../../../../exports/lib/libXaw.a”。 停止。
make[7]: Leaving directory `/home/stone/2tinyx/xc/programs/Xserver/hw/dmx/config'
make[6]: *** [all] 错误 2
make[6]: Leaving directory `/home/stone/2tinyx/xc/programs/Xserver/hw/dmx'
make[5]: *** [all] 错误 2
make[5]: Leaving directory `/home/stone/2tinyx/xc/programs/Xserver/hw'
make[4]: *** [hw] 错误 2
make[4]: Leaving directory `/home/stone/2tinyx/xc/programs/Xserver'
make[3]: *** [all] 错误 2
make[3]: Leaving directory `/home/stone/2tinyx/xc/programs'
make[2]: *** [all] 错误 2
make[2]: Leaving directory `/home/stone/2tinyx/xc'
make[1]: *** [World] 错误 2
make[1]: Leaving directory `/home/stone/2tinyx/xc'
make: *** [World] 错误 2

还试了其他很多的host.def,自己也乱改过一通,就是过不去。

还是高手直接给说说编译的过程吧,我实在没办法了,自己又不懂,只能在这里求助了。
回复 支持 反对

使用道具 举报

发表于 2007-7-19 15:01:14 | 显示全部楼层
根据12楼来做~~我也在做,- -~
回复 支持 反对

使用道具 举报

发表于 2007-7-19 15:05:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2007-7-19 15:06:40 | 显示全部楼层
还有
使用debootstrap做一个属于自己的系统
最近做了一个系统,要求系统只保留firefox,开机后直接启动firefox进行网络浏览,X尽可能的小,试验了几种方法,最后选择 debootstrap+TinyX+GTK+Firefox的方案。我自己在做的时候查了一些零散的资料,现在自己整合了一下,共享一下。
————————————————————————–
本系统完成总共分三大步:
我使用的RAYS LX(基于debian的一个发行版本),这里大家可以用debian/ubuntu.
一、使用debootstrap创建基本系统
1.安装debootstrap
apt-get install debootstrap
2.创建一个目录
mkdir /root/minisys
说明:这里推荐使用一个空余分区,然后mount过来,这样后期处理启动的时候比较方便。
3.创建基本系统
debootstrap –arch i386 sarge /root/minisys http://debian.linux.org.tw/debian
4.删除临时文件
apt-get clean
基本系统即完成,大概为113M;
安装内核、修改GRUB中,从基本系统启动。
二、编译安装tinyx
1.从http://ftp.xfree86.org/pub/XFree86/4.3.0/source 下载源码包:
X43src-1~5.tgz,其中X43src-6.tgz和X43src-7.tgz是文档相关的包,可以不进行编译,这里我没有编译这2个包。
2.建立编译环境
apt-get install gcc
apt-get install make
apt-get install autoconf
apt-get install gcc-3.3
apt-get install pkg-config
3.安装相关依赖库
apt-get install bison
apt-get install flex
apt-get install zlib1g-dev
apt-get install libpam0g-dev
apt-get install libncurses5-dev
apt-get install freetype6
apt-get install libpng12-dev
4.准备编译tinyx
mkdir tinyx
mv X430src-*.tgz tinyx
tar zxf X430src-*.tgz
cd xc/config/util
make -f Makefile.ini lndir
cd ../../../
mkdir build
cd build
../sc/config/util/lndir ../xc
cd config/cf/
cp TinyX.cf host.def
5.编辑host.def文件,将其修改为:
#define KDriveXServer YES
#define TinyXServer YES
#define XfbdevServer YES
#define BuildLBX YES
#define BuildFonts YES
#define BuildDBE NO
#define BuildXCSecurity YES
#define FontServerAccess NO
#undef BuildXF86RushEXt
#define BuildXF86RushEXt NO
#undef BuildRender
#define BuildRender YES
#define UseRgbTxt YES
#define BuildFontServer NO
6.cd ../../
touch xf86Date.h
touch Xf86Version.h
7.make World
8. make install
所有文件都被安装在/usr/X11R6和/etc/x11两个目录下
三、安装firefox
这里我用了偷懒的方法,直接安装,如果不直接安装,需要自己编译GTK和Firefox.
apt-get install firefox
然后根据自己的需要安装其他软件包,如果做小型系统,根据实际需求,进行内核和相关库的裁减,这里小弟还在研究,就不班门弄斧了。
四、FAQ
1.启动Xfbdev
需要使用framebuffer,所以实际使用时,需要grub中设置vga=XXX即可
export DISPLAY=:0
/usr/X11R6/bin/Xfbdev &
2.实际使用时鼠标驱动未加载
修改/etc/modules
添加:
modprobe mousedev
modprobe psmouse
启动X时加入参数-mouse /dev/psaux
同理,如果有其他硬件未加载,可以将对应设备加到/etc/modules下。
3.整体启动firefox
编写脚本firefox.sh
#!/bin/sh
export DISPLAY=:0
/usr/X11R6/bin/Xfbdev -mouse /dev/psaux &
firefox
然后保存后,chmod +x firefox.sh
cd /etc/rc2.d
ln -s /root/firefox.sh S90firefox
重新启动系统即可。
————————————————————————
后记:本次做这个系统是自己做着玩,没有具体目标和需求,如果有目标和需求,可以进行大量裁减,估计可以用做嵌入式系统了,同时如果做嵌入式系统,使用firefox会比较大,可以考虑使用minimo+GPE,目前试验中,试验后放出吧。
–by Juix
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-19 15:10:27 | 显示全部楼层
非常感谢90999!

你的讲解很详细,受用了!谢谢!:)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-19 15:10:47 | 显示全部楼层
非常感谢90999!

你的讲解很详细,受用了!谢谢!:)
回复 支持 反对

使用道具 举报

发表于 2007-7-19 20:36:49 | 显示全部楼层
做好了么?做好了上个图看看结果
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表