LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3196|回复: 9

[==LFS精华系列==]显示bootsplash与字符界面背景

[复制链接]
发表于 2003-1-20 17:06:10 | 显示全部楼层 |阅读模式
在LFS下显示bootsplash与字符界面背景

writen by kj501
首发于www.linuxsir.net的gentoo+LFS版

大家都知道,在Linux控制台的字符界面下,是显示不了图形的。要查看图形,只有在Xwindow下才能办到。但是我的mandrake9.0启动时,却没有显示通常的启动检测过程,而是出现一个蓝白相间的屏幕,各种字符信息就显示在这个背景上。启动完毕后,在按Alt+F1切换到控制台vc1时,这个背景仍然存在,输入的字符和屏幕显示信息只能出现在屏幕中间一个不大的方框之内,虽然在有背景的控制台下工作感觉比盯着黑沉沉的屏幕要好,但输入的字符在屏幕上的范围受到限制,这一点总是使人感到有点不舒服,很想作些修改,但是不知道原理,自然也无从着手。现在,经过一天的反复尝试,终于在LFS下实现了开机图像背景和字符界面图像背景,而且背景可以换成自己喜爱的图片,屏幕上文本输入范围的大小也可以自己定制,感觉真是太好了。我是根据mars_diy兄提供的线索,参考公社kyue兄的贴子做的。在此,我要感谢mars_diy兄和Kyue兄。公社的贴子在这里:
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=22104

一、原理
凡事都要掌握原理。只有从原理出发,才能把握事物的本质,更好的分析问题和解决问题。
bootsplash和字符界面背景是SuSE首先搞起来的,只能支持800X600,1024X768,1280X1024,后来mandrake也采用了这种技术,并作了改进,可以支持640X480的分辩率。我在前面所说的mandrake的开机背景和控制台背景就是这种技术的体现。要做到这一点,首先要内核支持vesa frame-buffer。这样开机时才能显示图像。然后要修改核心,使核心能显示图像。给核心打补丁的boot_splash_complete.2.4.9-vanilla.patch实际上就是给核心中的vesa frame buffer加入一段图象处理程序,所以开机画面也是在vesa frame-buffer初始化完成时开始显示的。但是,由于核心是在开机时显示图像,即实际上是在还没有mount根分区时候进行图像显示的,此时不可能把磁盘上的图象装入到内存中。而且linux的开机方式是不考虑图象显示的。这就使得核心对图像的处理必须采用特殊的方式进行,否则必然会与启动过程发生冲突。 这种特殊处理就是采用在开机初始化阶段,建立一个RAM disk,将图象装入到这个RAM disk中(这需要LILO或者grub等等开机引导程序的支持),这样,在开机引导时,才能出现一个图片背景。这一点需要核心提供initial RAM disk支持。同时 还要把图像做成能够被核心识别并能被引导程序装入initial RAM disk的格式。这就需要采用一些工具把图像和一些配置信息做成RAM驱动映像initrd。在SuSE和mandrake中可以用mk_initrd实现这一点,其它的Linux发行版可以用splash来做initrd。有了这个载有图像和配置信息的initrd,再配合开机引导程序的支持,就可以实现开机引导画面和字符界面背景了。

二、操作要点
具体的操作过程在公社的贴子里面已经说得很详细了,大家可以参考那张贴子一步一步的做。但在操作过程中,要注意几点:
1。修改boot_splash_complete.2.4.19-vanilla.patch的方法
由于这个patch文件的核心源代码目录名和我们所用的不一样,要先修改才能打补丁。在公社的贴子里是用vi来实现查找替换:
vi boot_splash_complete.2.4.19-vanilla.patch
按下ESC鍵。输入
s/2.4.19-vanilla/linux/g 回车 (命令中的linux要换成你自己的核心源代码目录名)
然后输入wq,退出vi。
在这里,我推荐另外一种方法,这种方法更加简单,我相信做过LFS的人都会很熟悉。
先将boot_splash_complete.2.4.19-vanilla.patch复制到/usr/src目录下,然后进入你的核心源代码目录,执行:
patch -Np1 -i ../boot_splash_complete.2.4.19-vanilla.patch
如果出现success的字样,表明patch成功。
2。配置核心
从名称上可以看出,这个boot_splash_complete.2.4.19-vanilla.patch是针对2.4.19的,那么用其它版本的内核是否可行呢?我们的实践表明,只要是2.4.x的内核,都应该可以。
在make menuconfig时,要注意选中Code maturity level options,否则,frame-buffer支持的选项不会出现。在配置核心时,要注意把Block Devices和Frame-buffer support下的选项全部打开。这样找起来才会方便。必须的几个选项都在倒数第几的位置,所以倒过来找,会更省时间。需要特别强调的是,必选的几项都不能配置成模块,必须加入内核,才能在开机时发挥作用。
3。建立initrd
除了SuSE和mandrake之外,其它的版本都要使用splash来创建initrd文件。建立initrd的命令是:
splash -s -f  /usr/share/splash/bootsplash.cfg  >  /boot/initrd
在执行这个命令时,splash将会把/usr/share/splash目录下的bootsplash.jpg(或者其它同前缀名的图像文件)与bootsplash.cfg一起,合成一个boot目录下的initrd文件。其中bootsplash.cfg是一个控制屏幕上字符显示范围大小的文件。一般至少要80x25,如果小于这个范围,会使屏幕不能正确显示启动信息。给你的使用带来不便。生成的initrd文件,应该比bootsplash.jpg稍微大一点,自己用ls -l 比较两个文件,就可以看出。
如果你有兴趣看看initrd的内容,可以先在/mnt下建立一个目录:
mkdir /mnt/tmp
然后执行:
mount -o loop -t ext2 /boot/initrd  /mnt/tmp
就可以看到initrd的内容了。
4。分辩率、bootsplash.cfg和bootsplash.jpg的配合问题
这三项必须保持一致,如果你用大小为1024x768的图片,就必须在开机引导程序中把framebuffer设置成1024x768。同时最好用bootsplash-1024x768.cfg复制成bootsplash.cfg。其它的分辩率也要照此办理。
5。定义文本显示范围的大小
bootsplash.cfg是用来定义屏幕上文本显示范围大小的文件,文件中的tx,ty,tw ,th分别是文本显示范围的左上角起点坐标x和y,文本显示范围的宽度和高度。如:

  1.   ____________________________________________________
  2.    |                                                    |
  3.    |                                                    |
  4.    |  tx/ty                                 tx+tw/ty    |
  5.    |     ________________________________________       |
  6.    |    |                                        |      |
  7.    |    |                                        |      |
  8.    |    |                                        |      |
  9.    |    |                                        |      |
  10.    |    |                                        |      |
  11.    |    |                                        |      |
  12.    |    |                                        |      |
  13.    |    |                                        |      |
  14.    |    |                                        |      |
  15.    |    |                                        |      |
  16.    |    |________________________________________|      |
  17.    |  tx/th+ty                           tx+tw/ty+th    |
  18.    |                                                    |
  19.    |____________________________________________________|
复制代码

这样,如果觉得文本显示范围的大小不合适,你可以自行调整。但是在调整后,必须要重新生成initrd文件,并更新引导记录。
6。去掉字符界面背景的方法
去掉字符界面背景有两种方法,一种是暂时的,一种是永久的。如果想暂时去掉字符界面背景,可以用如下命令:
echo 0 > /proc/splash
命令执行后,字符界面背景会消失。如果要恢复,再执行:
echo 1 > /proc/splash
字符界面背景又会出现在你的眼前。
如果想永久性的去掉字符界面背景,可以重新编译核心,去掉对bootsplash的支持即可。


三、如何解决碰到的问题
由于操作过程的复杂性,总是难免会碰到这样或那样的问题。如果你不幸地碰到问题,可以试着按下面的步骤解决:
1。首先检查核心是否支持bootsplash
如果核心支持bootsplash,用dmesg查看开机信息中就应该看到这样的字样:
。。。
vesafb: scrolling: redraw
vesafb: directcolor: size=8:8:8:8, shift=24:16:8:0
Looking for splash picture.... found (1024x768, 27481 bytes).
Console: switching to colour frame buffer device 128x48
fb0: VESA VGA frame buffer device
。。。
开机后,在/proc目录下,应该有一个splash文件。如果没有这两项,那就是核心不支持bootsplash。原因可能有两个,一个是内核补丁没有打好,另一个是开机引导程序没有配置好正确的参数,无法激活对splash的支持。
2。如果在开机信息中出现:
Looking for splash picture.... not found (1024x768, 27481 bytes).
则有可能是initrd没有做好,或者采用的图片有问题,请重新生成initrd文件。还有就是分辩率不合适,可以换一种分辩率试试。
 楼主| 发表于 2003-1-20 17:11:12 | 显示全部楼层
这是我搜集网上的资料写出来的,目的是为了让大家更好的享受Linux DIY带来的乐趣。文中难免出现失误,希望成功的弟兄多提意见,以便进一步补充完善。
hyoga兄,公社有时候上不去,你能把公社那张贴子转贴到这里,给大家一个方便吗?
发表于 2003-1-20 17:27:14 | 显示全部楼层

我来转吧

举手之劳
 楼主| 发表于 2003-1-20 17:46:55 | 显示全部楼层
谢谢Gao兄,我已经把链接改过来了。
发表于 2003-1-20 19:13:39 | 显示全部楼层

不用谢啦

小事一桩,大家互相帮助嘛:)
发表于 2003-1-20 19:33:24 | 显示全部楼层
哇,我又来晚了。。。。。。
 楼主| 发表于 2003-1-20 20:50:59 | 显示全部楼层
最初由 hyoga 发布
哇,我又来晚了。。。。。。

呵呵,hyoga兄,你又想出风头呀,你这样每天要发多少张贴子,瞧你的级别,前两天才是老会员,现在都到资深了。不得了啊!
发表于 2003-1-20 22:52:00 | 显示全部楼层
嘿嘿,最近和兄弟们感情交流大于技术交流了。。。。。。如此这般
下去,我们的版面不愁不火啊!哈哈哈哈。。。
说错了,应该是不愁不水啊!
 楼主| 发表于 2003-1-20 23:14:06 | 显示全部楼层
还是火一点好,水太多就没味道了。我之所以要转型,这也是目的之一。
发表于 2003-7-16 11:26:28 | 显示全部楼层
写了一个小script,随机选择splash背景图案。
图案必须使jpg文件,不过如果不嫌麻烦,为每个图案建立一个.cfg文件也是一样道理的。

#Randomly select a jpg file and set up the splash screen
#Created by dimfox July 2003

export SPLASH_DIR=/root/splash
export PIC_DIR=/root/splash/pics

#get the current tty number
TTY=$(basename $(tty))
TTYN=${TTY##tty}
#the linux starts tty from 1 but splash starts from 0
TTYN=$(($TTYN-1))
echo 'Changing splash on tty #' $TTYN


if [[ -a $1 ]]
then
        echo "Copy the jpg file"
        cp -f $1 ${PIC_DIR}/my.jpg
else
#        echo "iterate through jpg files under current directory"
        X=0
        for JPGFILE in $(ls ${PIC_DIR}/*.jpg)
        do
            X=$(($X+1))
            FILES[$X]=${JPGFILE}
#            echo ${FILES[X]}
        done
        echo "No file choosed or file doesn't exist, select a random file"
       
        #Generating the random number
        LOBOUND=1
        HIBOUND=$X
        RANDMAX=32767
        CHOOSE_FILE=$(($LOBOUND + ($HIBOUND * $RANDOM)/($RANDMAX + 1) ))
        echo "Choose file ${FILES[CHOOSE_FILE]}"
        cp -f ${FILES[CHOOSE_FILE]} ${PIC_DIR}/my.jpg       

fi

${SPLASH_DIR}/splash -s -u $TTYN ${SPLASH_DIR}/bootsplash.cfg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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