Skip navigation.

Fat R笔记……与减肥无关

Fat awful terrible Rubbish-bin

Posts tagged with "godson"

总结备忘……跟Xserver相关的……

,

之前零零碎碎地记在本子上,还是在这里总结一下吧。

* GUI的应用程序只要安装了依赖的库就可以运行,Xserver不是必须的。可以export DISPLAY=xxx.xxx.xxx.xxx:0来指定远程的Xserver作为输出(Windows下面的XManager就是一个不错的Xserver)。不过有的程序似乎不能在非本地的Xserver上面正常运行,比如狗剩自带的fltv这个mpeg播放软件,只有在本地Xserver上才会有图像。

* 用的Xserver是XFree86(xserver-xfree86_4.3.0.dfsg.1-14sarge1_mipsel.deb),Xorg东西太多,懒得装了……其实还好没装,装了也用不了,因为似乎需要狗剩自己的视频驱动。所以XFree86在启动时会在视频初始化的时候出错退出,最后只好直接把狗剩自带的那个/usr/X11R6/bin/XFree86复制过来用,然而这个XServer里的视频驱动似乎不支持24位色深

* XFree86的配置文件是/etc/X11/XF86Config-4,可以修改显示器、分辨率、鼠标等设置。显卡Device Driver用的是sis(板载显示芯片是sis6326),好像fbdev也许。ps2鼠标可以用/dev/psaux或者/dev/misc/psaux,如果是usb鼠标则可以用/dev/input/mice(ps2鼠标用这个好像不太正常,但有时似乎又能用。另外,Protocol写PS/2居然没有影响)

* 使用usb鼠标需要kernel的支持。如果kernel连usb都不支持,鼠标插上去后会没有任何反应,灯也不亮。kernel的menuconfig中,USB support配置界面应该选上以下项:Support for USB, OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support, USB HIDBP Keyboard (basic) support, USB HIDBP Mouse (basic) support, USB Human Interface Device (full HID) support。另外,General setup里选上Support for hot-pluggable devices(CONFIG_HOTPLUG),否则usb模块会编译错误。Plug and Play configuration里的Plug and Play support最好也选上

* 基本上usb鼠标和usb键盘插上去后就能使用,不需要手动修改配置。然而usb键盘在console下不正常,Caps Lock、Shift等键按下去后就死掉了,而在X下面却不会。是Xserver的键盘驱动兼容性比较好的缘故?解决了,上面HID那里选USB Human Interface Device (full HID) support(CONFIG_USB_HID)就正常鸟……

* 声音与X无关。声音的驱动同样由kernel提供。板载声卡是IT8172,对应kernel选项是Sound下面的IT8172G Sound。打开这个选项后,系统里就会有过/dev/sound/dsp和/dev/sound/mixer(但没有OSS的/dev/audio设备)。在rc.sysinit中加入ln -s /dev/sound/dsp /dev/dspln -s /dev/sound/mixer /dev/mixer两行,这样程序就能利用这两个设备控制音频了。

* Audio Server用的是EsounD(可支持混合多个音频流),单单安装esound-common并不能为enlightenment等程序提供声音,还需要安装esound,并运行esd来启动Audio Server。可以在rc.sysinit中加入esd -as 2 &来随系统启动,-as 2参数表示空闲2秒后释放/dev/dsp,不然esd会一直占用/dev/dsp,这样fltv这种直接使用/dev/dsp来播放音频的软件就不能正常工作。

* startx脚本中指定了xserver启动后运行的x程序,默认是xterm。可以看到一般有这一行:
userclientrc=$HOME/.xinitrc

因此编辑$HOME/.xinitrc,在里面可以设置LANG以及默认的xclient。例如我的是:
export LANG=en_US.ISO-8859-1
blackbox

这样startx后启动的就是blackbox这个window manager。不过我的c libaray不支持locale,不知道怎么解决,郁闷啊……

还原狗剩kernel原来的引导画面

,

原来的kernel在引导时屏幕是一个大大的“神州龙芯”的logo,下面只有2行用来显示信息。这种设置对于正常使用来说没什么影响,但由于我要把内核和根文件系统里面的东西改来改去,所以还是比较想念标准的linux内核启动画面的。

  于是diff了一下它自家的kernel跟标准的kernel,找找跟logo有关的文件有哪些,最后锁定了两个:/drivers/viode/fbcon.c和include/asm/linux_logo.h

  对于fbcon.c
#define LOGO_H160
#define LOGO_W480

改成
#define LOGO_H          80
#define LOGO_W          80


注释掉
#ifndef CONFIG_VGA_POST
        logo_lines = 30 - SS_LINE;
#else
        logo_lines = 37 - SS_LINE;
#endif


    //scrollback_phys_max += 4 ;

    scrollback_max = 0;
    scrollback_current = 0;


改成
    scrollback_phys_max += 4 ;
/*
    scrollback_max = 0;
    scrollback_current = 0;
*/


注释掉
fb = fb + line * (( p->var.yres - LOGO_H - 16 * SS_LINE) / 2 )  + (line / 2  - LOGO_W/2) / (depth/8) ;



  linux_logo.h则只需要改一下开头
#if 0
#ifndef CONFIG_DECSTATION
#       include <asm/linux_logo_sgi.h>
#else
#       include <asm/linux_logo_dec.h>
#endif
#endif

#include <asm/blx_logo.h>

把#if 0及其对应的#endif去掉,把#include <asm/blx_logo.h>去掉

   修改完后,重新make一次就ok了

战完busybox....

,

Busybox可以menuconfig,还算方便,但用在狗剩上,有些设置还是要注意一下。由于时间关系,懒得直接找跟.config的对应关系了,直接以menuconfig的方式说明。

Busybox Settings -> Build Options 下:
  Build BusyBox as a static binary (no shared libs)
  这个最好选上,编译成一个不需要动态链接库的程序,以后至少发生意外还是能进系统
  不选,原因见后。然而选也可以,注意glibc的版本就是了。
  Do you want to build BusyBox with a Cross Compiler?
  选上
  Cross Compiler prefix
  如,我的交叉编译工具链在/usr/bin里,前缀为mipsel-linux-*,则这里写/usr/bin/mipsel-linux-

Busybox Settings -> Installation Options下:
  Don't use /usr
  这个不选。意识大概是,如果选上,则不会在/usr/bin等目录放东西
  BusyBox installation prefix
  跟前一样,填写狗剩NFS的root,即/LX-SIS

Init Utilities 下:
  init
  这个选上,用busybox来初始化系统。
  debugging aid
  这个会在使用inittab初始化时显示额外的信息,我没选

Login/Password Management Utilities下:
  Use internal password and group functions rather than system functions
  这个如果不选上,busybox会认不了lib下的libnss,然后解析不了uid...

Shells下:
  选择ash
  Job control
  这个选上(虽然在/dev/console下用不了——直接造成不能ctrl+c,这是最郁闷的)
  Standalone shell
  不选。很奇怪,选上后PATH这个环境变量似乎就无效了-.-
  Command line editing
  方向键,Tab补全等功能都在这里,我统统选上了。

其余的命令根据需要取舍就是了。

附1:login后出现sh: can't access tty; job control turned off提示,是因为本地使用的是dev/console,不是一个controlling tty。对于这个问题没有进行太多尝试,可以参考一下网址:
http://busybox.net/lists/busybox/2005-June/014725.html
http://uclibc.org/FAQ.html#job_control
http://blog.21ic.org/more.asp?name=good02xaut&id=8406

附2:在安装glibc 2.3后,郁闷的事情就发生了——ping用不了,提示segment fault。netstat也是,但是加了-n后就能用了。初步怀疑还是域名解析的问题,但目前还没有解决方法


[2006-08-01]
  ping的问题解决了……然而解决的方式是不使用静态编译……


[2006-08-01]
  再补充:Static Linking Considered Harmful
  还有一位仁兄在一个帖子里说道

Statically linked binaries are significantly *less* portable then
the dynamically linked ones (on UNIX in general and Linux in
particular).


  在busybox编译过程中,可以看到
warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
之类的警告。而且的确,如果使用glibc 2.2静态编译出来的busybox,在glibc 2.3环境下用到域名解析的时候就会segment fault。把工具链的glibc 升级到2.3后再编译就能工作了。另外,rpm直接拿来用也会出现segment fault,大概也是因为它是静态编译的缘故。

哦~耶~~总算是搞定glibc了~~

,

我……我知道错了…… 果然是我之前的步骤不对,然后就越弄越乱……现在总结一下完整的安装步骤吧:

首先,解压source,安装linuxthreads,删除nptl(这两个add-on不处理一下,等下configure的时候会出问题的)
# tar zxvf glibc-2.3.6.tar.gz
# cd glibc-2.3.6
# rm -rf nptl*
# tar zxvf ../glibc-linuxthreads-2.3.6.tar.gz


建立一个build目录(glibc不推荐在source目录中编译)
# cd ..
# mkdir glibc-build


这时应该有两个目录了
glibc-2.3.6为source
glibc-build为等下用来编译的目录

接着可以configure了
# cd glibc-build
# ../glibc-2.3.6/configure  --build=i686-linux --host=mipsel-linux --prefix=/LX-SIS --disable-profile --enable-add-ons --without-gd

这里--host指定了使用的交叉编译器的前缀(mipsel-linux-*),--prefix指定了目标目录。/LX-SIS就是狗剩的nfs的root了。

然后就是make,并等待……
# make


经过漫长的等待 ,终于make完了。这时先别急着make install,不然在狗剩没有开机的时候install了,狗剩启动时到了运行init的时候,就会亲切地告诉你ld.so.1找不到了,然后就拒绝作出任何进一步的反应。

所以,先去boot狗剩,并进入shell。这时可以在编译主机上make install了。
# make install


听完一首歌,应该也差不多install完了。这时在狗剩上运行ldconfig,会看到出错提示
# ldconfig
    Can't open configuration file /LX-SIS/usr/etc/ld.so.conf :No such file or directory
    Can't create temporary cache file /LX-SIS/usr/etc/ld.so.cache~ :No such file or directory

真诡异 ……为啥它会去usr下找……大概之前什么地方把它弄得混乱了吧……不过,既然它说要,那就给它好了

回到编译主机,执行以下命令(也可以用 && \来一次执行完)
/LX-SIS# mkdir LX-SIS
/LX-SIS# cd LX-SIS
/LX-SIS/LX-SIS# ln -s ../{bin,include,lib,libexec,sbin,usr,etc} .
/LX-SIS/LX-SIS# cd usr
/LX-SIS/LX-SIS/usr# cd etc
/LX-SIS/LX-SIS/usr/etc# ls
/LX-SIS/LX-SIS/usr/etc# cp ../../etc/ld.so.conf .

然后再到狗剩上ldconfig,现在应该不会出错了。然而ls的时候,却提示libtermcap.so.2找不到。这个so命名是在/lib下面的,照说ldconfig应该默认会把/usr/lib和/lib加进去的,真是莫名其妙……

看看LX-SIS/usr/etc/ld.so.conf,是空的。把两个库目录加进去
# echo /usr/lib >>ld.so.conf
# echo /lib >>ld.so.conf

这次为ldconfig加个-v参数:ldconfig -v,看看它到底设对目录没有。这次总算是没问题了。
然后可以在狗剩上试试ls等命令了,一切正常,嗯。然而ldd却没有任何输出,原因不明……

参考网址:
http://www.linuxquestions.org/questions/showthread.php?t=254023
http://www.e-techstudios.net/sites/slax/docs/LFS-6.1.1/chapter06/glibc.html



补充
又重新试了一下,这次ldconfig不会到/LX-SIS/usr下面找etc了,而是乖乖地在/LX-SIS下面找。看来还是之前几次尝试configure的时候用过--prefix=/LX-SIS和--prefix=/LX-SIS/usr,重新make的时候某些文件没有重新编译的关系。执行命令:
# cd /LX-SIS && \
mkdir LX-SIS && \
cd LX-SIS && \
ln -s ../{bin,include,lib,libexec,sbin,usr} .

然后ldconfig -v,看到它的确只添加了/LX-SIS/lib。所以etc/ld.so.conf还是要改才行。

openssh的交叉编译

,

这个有点麻烦……而且我不太确定到底搞定没有,因为狗剩台机的网络接口坏掉了。。。 反正程序是编译出来了,姑且当它成功吧……

  openssh需要先安装Zlib和OpenSSL。首先说说Zlib的安装。这东西俺在上古时期在MS-DOS下编译过,还算简单,不过现在要交叉编译,所以还是得做一些工作。首先是config:
./configure --prefix=/LX-SIS/usr

然后修改Makefile:
CC=gcc
-->
CC=mipsel-linux-gcc
 
CFLAGS=-O3 -DUSE_MMAP
-->
CFLAGS= -mtune=r4600 -mips2 -O3 -DUSE_MMAP
 
LDSHARED=gcc
CPP=gcc -E
-->
LDSHARED=mipsel-linux-gcc
CPP=mipsel-linux-gcc -E


AR和RANLIB可以不改(用x86下面的ar好像也可以得到libz.a文件)。然后make,再make install。然后把/LX-SIS/usr/lib和/LX-SIS/usr/include下面的东西分别复制到/opt/crosstool-godson/mipsel-linux/lib和/opt/crosstool-godson/mipsel-linux/include(其实也就是libz.a zconf.h zlib.h三个文件)。这样Zlib算是搞定了。

  接下来是openssl。用./Configure可以看到一堆编译平台,不过似乎没有哪个比较合适,还是自己来吧,手工加上一个"linux-mipsel"平台。修改Configure,在my %table=(里面加入一行:
"linux-mipsel", "mipsel-linux-gcc:-mtune=r4600 -mips2 -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl::${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",

保存后,执行:
./Configure linux-mipsel no-asm zlib --prefix=/LX-SIS/usr

(或者先make TABLE,然后看看TABLE文件里面的变量有没问题)
然后make , make install(因为生成的文件不能在x86下运行,所make test没啥意义),把lib和include复制一份到交叉编译工具链里(复制include用cp -a --reply=yes openssl/ /opt/crosstool-godson/mipsel-linux/include/),搞定。

  openssh的脚本对交叉编译支持比较好,首先config:
./configure --build=i686-linux --host=mipsel-linux --prefix=/LX-SIS/usr

如果直接make,会出现In function `dlfcn_load'之类的错误,我在这个网页
http://if.ustc.edu.cn/~zhouwei/tech/archives/2006_01.html
找到了解决方法,就是在Makefile的LIBS=里加上-ldl,添加链接libdl这个库,然后make,就没有问题了。
  接着make install……嗯,出现了strip错误。可以在configure后面加--disable-strip关掉strip功能,或者在Makefile里把STRIP_OPT=-s改成STRIP_OPT=,然后再make install……没有strip过体积虽然大了点,不过懒得研究了-.-(好像在Makefile里指定STRIP=mipsel-linux-strip,并export都不行,搞不懂……)然后make install,出现无法执行ssh-keygen的错误,这就没办法了,只好等狗剩的网络端口正常了才能继续了……

Ncurses 与 bash的交叉编译

,

目录/LX-SIS是用nfs export给狗剩NC作为root目录使用的。两个东西的编译步骤如下:

Ncurses-5.5:
#./configure --build=i686-linux --host=mipsel-linux --prefix=/LX-SIS/usr
#make BUILD_CC=gcc
#make install
(安装到/LX-SIS/usr)
#make install --prefix=/opt/crosstool-godson/mipsel-linux
(/opt/crosstool-godson是交叉编译工具链的目录,这里安装多一份给工具链用)
#cd /opt/crosstool-godson/mipsel-linux/lib
#ln -s libncurses.a libcurses.a
#cd /LX-SIS/usr/lib
#ln -s libncurses.a libcurses.a
#cd /LX-SIS
#mkdir /LX-SIS
#cd LX-SIS
#ln -s ../usr usr

bash-2.05a:
#ac_cv_sys_restartable_syscalls=yes \
ac_cv_func_setvbuf_reversed=yes \
./configure --build=i686-linux --host=mipsel-linux --enable-readline --enable-static-link --with-curses --prefix=/LX-SIS/usr
#make
#make install prefix=/LX-SIS/usr (直接make install也可以)
#cd /LX-SIS/bin
#ln -s ../usr/bin/bash sh


参考资料:
Linux From Scratch ver. 20021030
http://www.ailis.de/~k/docs/crosscompiling/#bash
以及这个网页
http://www.openqnx.com/index.php?name=PNphpBB2&file=printview&t=1585&start=0

Ncurses的编译遇到了一些麻烦,刚开始我用的是5.3,总是编译出错,后来换了5.5就好使了
刚开始make完后只是make install,然后就跑去编译bash,理所当然地出现了ncurses库不存在的错误提示。因为这只是安装到了狗剩的本地开发环境里,也就是说,在狗剩上进行本地编译应该是没有问题的,但在我的P4上交叉编译就不行了,因为没有安装到我的交叉编译工具链里。所以要安装多一份:
#make install --prefix=/opt/crosstool-godson/mipsel-linux
#cd /opt/crosstool-godson/mipsel-linux/lib
#ln -s libncurses.a libcurses.a

这样,再去编译bash就没问题了
然而bash编译完(bash在交叉编译时需要修改makefile.in,可以参考上面提到的参考资料),在狗剩上运行的时候,执行clear会提示Unknown terminal type。google了一下,是terminfo的问题
在狗剩上
#TERMINFO=/usr/lib/terminfo clear

可以实现clear,或者一了百了地在/LX-SIS/etc/rc.d里加上
#export TERMINFO=/usr/lib/terminfo

看起来问题似乎是clear那个程序找不到terminfo文件造成的
之前被网上的一些文章误导,试着在opt等目录下建立符号链接,都解决不了
后来想想,因为clear是编译Ncurses的时候生成的,会不会是--prefix参数把terminfo的位置编译到clear中了呢?交叉编译的时候指定的目录是/LX-SIS/usr,然而在狗剩上运行时,/LX-SIS变成了root,也就是说/LX-SIS/usr变成了/usr,但clear仍然是在/LX-SIS/usr/lib/terminfo下面找terminfo文件,自然就找不到了
于是,在LX-SIS下面创建一个符号链接
#cd /LX-SIS
#mkdir /LX-SIS
#cd LX-SIS
#ln -s ../usr usr

这样,在狗剩下,就有一个/LX-SIS/usr目录了,而这个目录实际上是链接到/usr下面的
再到狗剩下试试,已经没有问题了
这种方法感觉有些龌龊,不过我懒得研究chroot之类的东西了,龌龊就龌龊了点,Stupid但是Simple嘛