superfight 发表于 2008-10-7 10:19:42

[提问]splashy如何进行配置?

configure
make
make install
后按照README的话

1.编辑/boot/grub/menu.lst ,添加splash vga=791 quiet

2.在 /etc/init.d/下有一个软连接splashy连接/etc/rcS.d/S01splashy

3.确保/etc/lsb-base-logging.sh工作 ,在/lib/lsb/init-functions中最后2行为

[ -e /etc/lsb-base-logging.sh ] && . /etc/lsb-base-logging.sh || true



现在 1.ML2.1 RC2的/boot/grub/menu.lst 为
kernel /boot/vmlinuz-2.6.25.16-smp ro root=/dev/hda2 vga=791 quiet splash=silent,fadein,theme:default console=tty1
应该是没问题的

2.在 /etc/init.d/下没发现软连接像创建一个吧....到/etc/一看没有rcS.d这个目录.....

3.在/etc中也没发现lsb-base-logging.sh这个文件......

请教如何在MC2.1 RC2中配置splashy呢?

sejishikong 发表于 2008-10-7 13:47:19

rc2中已经改成了fbsplash,splashy需要修改下rc.sysinit脚本。

上面的README针对debian系列的。

superfight 发表于 2008-10-7 14:14:05

噢~debian的啊   

怪不知道~   

想研究一下splashy的机理~

sejishikong 发表于 2008-10-7 14:51:56

其实和fbsplash的机理是一样的。只不过fbsplash直接使用fb,splashy通过directfb使用fb,总之就是在系统启动阶段显示一个比较漂亮的图形。系统启动阶段,最早是内核阶段,这个需要对内核打补丁(所以splashy在这个阶段是不能显示的),其次是initrd阶段(splashy和fbsplash都可以放在initrd,不过magic的splashy没有实现),再次是服务阶段(需要让它尽早的启动,也就是服务号最小)。
magic下的服务在/etc/rc.d/rc3.d和/etc/rc.d/rc5.d下,所以建立链接要在这两个目录下。
magic目前并不完全符合lsb(仓库里有lsb包),所以lsb的这个可以不管它。

superfight 发表于 2008-10-7 15:37:50

噢~..   splashy在内核阶段不显示的~

我还以为不打补丁也这么厉害~........

问一下, 在grub中添加的 splash=silent,fadein,theme:default是由内核的呢个部分进行处理的?

superfight 发表于 2008-10-8 14:00:00

如果不往内核打补丁的话~

fbsplash是不是在init中的rc.sysinit才启动?~

PS:

内核阶段指的是 : GRUB启动内核但还没到initrd阶段

initrd阶段指的是 : rc.sysinit 和 rc 阶段

服务阶段指的是 : login之后加载程序的阶段

不知道我理解得对不对?~

[ 本帖最后由 superfight 于 2008-10-8 14:04 编辑 ]

jiangtao9999 发表于 2008-10-8 15:32:35

fbsplash 内核阶段就是 initrd 里面的程序工作,这个是内核调用的。这个时候还没有进入系统的 init script 阶段,但是内核已经挂载了 initrd 镜像。
initrd 阶段其实很简单就是载入驱动,之后挂载 / 分区,其实就是一个超小型的 init script 启动脚本。这个阶段其实是可以越过的,不过这需要内核必须针对系统编译,所以没有 initrd 的情况基本都是出现在 gentoo 等源代码编译而来的针对当前硬件优化的系统上面。
但要注意,initrd 文件系统里面的文件,并不是都由 initrd 里面的 init script 来使用的, fbsplash 就是一个例子,他放在 initrd 里面,但其实是内核直接调用。

rc.sysinit 和 rc 阶段其实可以合并在一起,也就是我刚刚说的 initscript 阶段,这个阶段 sysinit 是初始化系统的基础环境,比如启动 udev ,挂载各种分区。之后 rc 进入 init level 部分,根据不同的 level 启动不同的服务。最后 init 进程启动用户交互环境,包括 tty 和 X 后,自己作为 pid 1 的进程当作系统的 root 进程。

启动顺序是 kernel -> initrd.img -> init 程序
init 才是真正 rc 阶段的后台管理程序,他一直运行直到关闭。
当然 init 程序是可以替代的,不过确实没有什么好的程序可以方便的替换它,而且提供更好的功能。

kernel 阶段咱们略过,因为这个是内核自己的 main() 在执行的段落。kernel 启动完成后,会启动 initrd.img 里面的 /bin/init 或者 /init ,这个 init 可以是一个程序,也可以是一个 shell 脚本。这个 init 程序一般用来检测系统分区是否正确,挂在一些临时目录,检测是否需要载入一些内核程序。之后挂载 / 分区,运行 / 分区里面的 /sbin/init 程序继续运行,同时也会把自己的 pid 替换过去,这个时候 / 分区的 /sbin/init 会以 pid=1 的身份继续启动系统,他会根据 /etc/inittab 里面的设置,ML 首先运行的是 rc.sysinit 运行完成后,init 会根据当前的 run level ,执行对应的 rc 脚本(ML 这里用的是一个 rc 脚本 + 参数传递来识别不同的 run level )。rc 会根据当前给定的 run level 调用 /etc/rc.X 里面的脚本启动、关闭服务。
其实关机时 init 不会退出的,因为 pid=1 的进程退出,会导致内核“crash”。rc 脚本在关机时会停掉全部的服务,之后启动 poweroff 或者 reboot 服务,这个“服务”会关掉电源,所以 init 程序是被关机而灭掉的。

init 启动到最后一步,就是启动 tty 和 X (其实大部分发行版 X 都是以服务形式出现的,tty 才是 init 的启动末端,不过 ML 却是用类似启动 tty 的方式启动 X )。
启动到这一步,其实是已经启动完成了,后面的事情都不是启动过程里面的动作了。不过因为程序运行的原因,X 也在最后一步启动,所以给人感觉 X 启动时 init 还在工作。其实那个图形登录框根本不是 init 的事情,启动 X 服务后,X 初始化工作完成后,他会启动一个登录管理器(比如 XDM KDM GDM)。之后的登录进入桌面环境,对于 init 程序来说,那是一个服务干的事,与他无关)。
X 的初始化一般是 xinit 脚本管理的,他会根据一些关联脚本来启动各种前期程序,scim 就是这个时间启动的。
login 后,系统就已经是完全启动完成了的。

如果你编程水平可以,完全可以让 X 作为 pid=1 的进程来启动整个系统。
当然 init 程序是需要修改的,貌似他没有 pid=1 ,是不干活的。

至于 fbsplash 的启动。顺序是这样的:
initrd.img 里面的程序会在内核完成初始化进程,即将进入 initrd 里 init 脚本之前调用,所以 ML 的 splash 显示会很靠前。你把 quite 参数取消就能看到内核初始化工作时的输出了,也就方便你看到 splash 显示时内核所处的位置(不过显示很快的建议找个快速摄像机录下显示过程)。
这部分代码其实就是在初始化 fb 后,显示 splash 里面的 slient 图片显示 kernel initialing.. 或者应用 verbos 风格,可以实现的功能很少。不过部分功能却很重要。尤其是 verbos 界面,就需要他。

之后系统 initrd 启动完成(ML 这步很快),系统进入 rc.sysinit 阶段,这个阶段在启动完 udev ,启动 fbsplash 的后台程序,或者叫守护进程(不能算服务,因为没有经过 start-stop-deamon 管理),这个时候,fbsplash 会显示“正在启动,按 F2 进入详细模式……”这个时候计算机才能响应 F2 切换,同时进度条开始走(在哪之前,fbsplahs 基本没有什么可以操作的可能)
如果内核启动了 fbsplash 模块,会多出一个 /dev/fbconsole 设备。fbsplash 的控制是写入 fbsplash 后台程序的 socket ,位于 /usr/splash/cache (好像是,忘了具体的地点了)。这个控制 ML 使用的是一个 shell 脚本来实现方便的控制。这个程序实现各种效果的显示。

启动完成,切换进入 verbos 状态,之后 fbsplash 守护进程会被关掉,设置各个 tty 的 theme (这步不需要 fbsplash 进程就可以,不过内核模块才能提供 verbos ),这个时候 /usr/splash 里面的 socket 也会消失。

如果没有启动 fbsplash 内核模块,fbsplash 守护进程只能显示 slient 界面,verbos 界面需要内核模块提供的 /dev/fbconsole 才能实现。

sejishikong 发表于 2008-10-8 15:50:30

ml的initrd很快的原因是那里的东西很少,大部分都放在内核了,所以ml的内核启动相对其它发行版会有点儿慢。而且更大。

jiangtao9999 发表于 2008-10-8 16:14:13

initrd 里面少的让我觉得已经没有存在的意义了……
:?

superfight 发表于 2008-10-8 23:19:43

噢~   大概知道过程了~


= = 能说一下GRUB里 SPLASH这个参数有什么用么    是不是传到rc.sysinit里用的?~

jiangtao9999 发表于 2008-10-9 00:02:09

很多地方都要用,他会跟随内核直到关机。
不过主要还是在 initrd 里面使用,进入 init 程序环境初始化完成后,fbsplash 已经可以读取 /etc/splash/ 里面的设置了,而且 fbsplash 控制脚本也有自己的默认参数。

其中silent是设置 fbsplash 以安静模式启动,fadein 是设置使用淡入淡出效果,theme:default 是设置使用哪个主题。
内核里不用说只能用这里的设置,到了 init 脚本里面,控制脚本先设置自己的默认设置,之后用 cmdline 覆盖自己的默认设置,之后再用 /etc/splash 里面的设置再覆盖自己的设置来综合全部设置。

haulm 发表于 2008-10-10 10:54:23

splashy 在MGC上经常死机所以不必尝试了,fbsplash 使得MGC真正取代bootsplash并有了自己的开机动画。

superfight 发表于 2008-10-10 16:02:33

先看一下RC.SYSINIT和RC的脚本

再研究一下fbsplash的代码实现~

superfight 发表于 2008-10-11 10:57:44

问一下

splash rc_init sysinit

这条SHELL脚本是什么意思

我的理解是执行splash命令并提供rc_init和sysint两个参数

但是并没有找到splash这个命令

应该怎么理解呢?请指教:lol:

sejishikong 发表于 2008-10-11 11:04:02

splash是个函数。
页: [1] 2 3 4
查看完整版本: [提问]splashy如何进行配置?