快捷搜索:

用bootsplash制作Linux全图形启动界面

Linux的各类发行版在启动时基础上都有两种模式:silent mode和verbose mode。verbose模式下会打印极为详尽的启动信息,比如挂载文件系统,加载光驱,激活收集办事等等,而silent模式则樊篱掉落这些信息。bootsplash对象可以将一张图片放在silent模式下的虚拟节制台上,从而使Linux用户看到一个全画面的启动历程。别的一个对象是gensplash,比bootsplash要轻细繁杂一些,不过功能更为强大年夜,设计也更为合理——它将一些非需要的元素从kernel space挪出来,放在user space来做。

收集上关于bootsplash(启动动画)的应用基础上是基于Linux的SuSe发行版进行评论争论的——开拓这组对象的作者说他们的事情平台是SuSe。gensplash则是基于Linux的Gentoo发行版进行评论争论的。当然这些两组对象都可以经由过程适当的篡改利用于Linux的其它发行版。

因为我的事情平台是red hat linux,此篇文章就评论争论如何在RH linux下应用bootsplash。下面先给出相关的一些网站:

http://www.bootsplash.org (官方网站,基础应用及相关道理)

http://www.bootsplash.com (详尽的应用措施,基于SuSe发行版)

http://www.bootsplash.de (bootsplash的喜欢者组织的网站,资料齐备)

http://www.kernel.org (Linux内核下载)

本文严重参考http://www.linuxhall.org/modules.php?name=News&file=article&sid=201,哈哈,特此阐明。

现在我们进入正题。

http://www.bootsplash.org网站上说,bootsplash的内核补丁针对2.4.18--2.4.22和2.6.0-test9,这个消息很旧了,可以到http://www.bootsplash.de站点查看bootsplash所供给的各个版本的内核补丁,然后确定你所用的Linux内核版本,选择一个补丁下载。

我的内核是2.4.20-8,下载补丁bootsplash-3.0.7-2.4.20.vanilla.diff。补丁中的3.0.7是bootsplash对象的版本号,我们下载bootsplash-3.0.7.tar.bz2,再下载所要用的主题Theme-NewLinux.tar.bz2,关于材料的筹备就完成了。这些都可以在上面的说起的网站上找到。假如你的内核没有响应补丁,那么可以选择一个版本的内核源代码,打上补丁后,编译一个新的内核。

假如没有编译过内核,可以到网上查找相关资料,对比着演习一下。当然,我们必要root的权限。

第一步 改动/usr/include目录下的三个符号链接:asm,scsi,linux(mv asm asm.bak,mv scsi scsi.bak,mv linux linux.bak),假如没有,则要新建。在编译内核时,用到这些链接所指向的一些头文件。我在/usr/src目录下建了一个名为linux的链接指向同一层的内核源代码目录linux-2.4.20-8(这样今后再编译不合版本内核时,只需改动/usr/src目录下的linux符号链接就可以了)。(敕令ln -s linux-2.4.20-8 linux),然落后入/usr/include目录,分手履行ln -s /usr/src/linux/include/asm-i386 asm;ln -s /usr/src/linux/include/linux linux;ln -s /usr/src/linux/include/scsi scsi。

第二步 打补丁,假设补丁在/usr/src/linux目录下(不在的话加上路径即可)。patch -p1  Code maturity level options --->

[*] Prompt for development and/or incomplete code/drivers

Processor type and features --->

[*] MTRR (Memory Type Range Register) support

Block Devices ->

[*] Loopback device support

[*] RAM disk support

(4096)  Default RAM disk size

[*] Initial RAM disk (initrd) support

Console Drivers ->

[*] VGA text console

[*] Video mode selection support

Console Drivers -> Frame-buffer support ->

[*] Support for frame buffer devices

[*] VESA VGA graphics console

[*] Use splash screen instead of boot logo

对付2.6.x内核:

Code maturity level options --->

[*] Prompt for development and/or incomplete code/drivers

Processor type and features --->

[*] MTRR (Memory Type Range Register) support

Device Drivers --->

Block devices --->

Loopback device support

RAM disk support

(4096) Default RAM disk size

[*]  Initial RAM disk (initrd) support

Graphics support --->

[*] Support for frame buffer devices

[*]  VESA VGA graphics support

Console display driver support --->

[*]  Video mode selection support

Framebuffer Console support

Bootsplash configuration --->

[*] Bootup splash screen

第四步

http://www.bootsplash.org/config.html

# name of the picture file (full path recommended)

jpeg=/etc/bootsplash/themes/NewLinux/images/bootsplash-800x600.jpg

silentjpeg=/etc/bootsplash/themes/NewLinux/images/silent-800x600.jpg

这两行指定了作为启动动画的图片和节制台背景的图片的名字和绝对路径,我们只需把自己制作的图片命名为这里指定的图片,并且放在这个路径下,就可以利用自己的主题了。(想想看,制作themes是相称简单的。不明白为什么网上没有redhat linux的主题图片。)

我改动了/etc/bootsplash/themes/NewLinux/config/bootsplash-800x600.cfg文件,定义显示文本信息区域。###部分是我添加的内容。

[code:1:7b9eb010fc]

第六步 将图片与 init Ram Disk 绑定 splash -s -f /etc/bootsplash/themes/Linux/config/bootsplash-800x600.cfg > /boot/initrd-splash.img 对付ide硬盘,我们可以直接用splash对象天生initrd*.img文件,这个文件对ide硬盘来说没什么用,我们在这里只是经由过程它来应用启动画面。

假如你只想看到一副静态的画面,跳过第七步,看第八步,不用改动脚本文件。

第七步> 将脚本splash.sh拷入/etc/rc.d/下,并改动splash.sh和rc,建议在改动rc脚本文件提高行备份(cp rc rc.bak)

# cp bootsplash-3.0.7/Scripts/splash.sh/etc/rc.d

下面来看完备的splash.sh脚本文件,要想这个脚本起感化,必须改动rc脚本,经由过程rc脚本调用splash.sh脚本,必要付与splash.sh脚本可履行权限。必要一些shell script的常识。网上很多,google吧。

我现在的/etc/rc.d/splash.sh脚本,删除了原本放在这个脚本中的绘制进度条部分(调试不成功)和播放动画部分(还没有实验),以及不适用于red hat linux的一些敕令。这个脚本现在只打印类似“booting the system"和"shutting down the system"的信息和实现关机时的silent mode。

现在这个可以实现以下功能,开机silent模式,有开始画面,有进度条,进度条下有booting system 提示。关机时切换到silent模式,有画面。提示shutting down the system.

不过在开机的时刻,有一半光阴进度条是空的(系统在加载内核,检测硬件),在关机的时刻,进度条一会儿就满了,然后又变空,直到关机。呵呵,转头再改,告一段落了先。

[code:1:7b9eb010fc]

#! /bin/bash

#

# rc        This file is responsible for starting/stopping

#          services when the runlevel changes.

#

# Original Author:

#          Miquel van Smoorenburg,

#

# check a file to be a correct runlevel script

###########################Bootsplash start##############

####function progressbar

function progressbar ()

{

_progress=$1

_num=$num

echo show "$(( 65534*($_progress + 1)/$_num ))">/proc/splash 2>/dev/null

}

####end fuction

##########################Bootsplash End###############

check_runlevel ()

{

# Check if the file exists at all.

[ -x "$1" ] || return 1

# Reject backup files and files generated by rpm.

case "$1" in

*.rpmsave|*.rpmorig|*.rpmnew|*~|*.orig)

return 1

;;

esac

return 0

}

# Now find out what the current and what the previous runlevel are.

argv1="$1"

set `/sbin/runlevel`

runlevel=$2

previous=$1

export runlevel previous

. /etc/init.d/functions

# See if we want to be in user confirmation mode

if [ "$previous" = "N" ]; then

if [ -f /var/run/confirm ]

|| grep -i confirm /proc/cmdline >/dev/null; then

rm -f /var/run/confirm

CONFIRM=yes

export CONFIRM

echo $"Entering interactive startup"

else

echo $"Entering non-interactive startup"

fi

fi

# Get first argument. Set new runlevel to this argument.

[ -n "$argv1" ] && runlevel="$argv1"

####################Bootsplash start###############

progress=0

num=0

###count the services for progressbar

for countservices in /etc/rc$runlevel.d/*;do

num=$(( $num + 1 ))

done

###################Bootsplash End##################

# Is there an rc directory for this new runlevel?

[ -d /etc/rc$runlevel.d ] || exit 0

# First, run the KILL scripts.

for i in /etc/rc$runlevel.d/K*; do

###################Bootsplash start#################

progress=$(( $progress + 1 ))

/etc/rc.d/splash.sh 2>/dev/null

progressbar $progress

##################Bootsplash End####################

check_runlevel "$i" || continue

# Check if the subsystem is already up.

subsys=${i#/etc/rc$runlevel.d/K??}

[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ]

|| continue

# Bring the subsystem down.

if egrep -q "(killproc |action )" $i; then

$i stop

else

action $"Stopping $subsys: " $i stop

fi

done

# Now run the START scripts.

for i in /etc/rc$runlevel.d/S*; do

###################Bootsplash start#################

progress=$(( $progress + 1 ))

/etc/rc.d/splash.sh 2>/dev/null

progressbar $progress

##################Bootsplash End####################

check_runlevel "$i" || continue

# Check if the subsystem is already up.

subsys=${i#/etc/rc$runlevel.d/S??}

[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ]

&& continue

# If we’re in confirmation mode, get user confirmation

if [ -n "$CONFIRM" ]; then

confirm $subsys

case $? in

0) :;;

2) CONFIRM=;;

*) continue;;

esac

fi

# Bring the subsystem up.

if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then

export LC_ALL=C

exec $i start

fi

if egrep -q "(daemon |action |success |failure )" $i 2>/dev/null

|| [ "$subsys" = "single" -o "$subsys" = "local" ]; then

$i start

else

action $"Starting $subsys: " $i start

fi

done

[/code:1:7b9eb010fc]

[code:1:7b9eb010fc]

第八步 改动(bootloader) grub(或者lilo)。我用的是grub,硬盘是ide的。只列出必要改动的部分。我的硬盘分区swap,boot,/。

title Red Hat Linux (2.4.20+bootsplash)

root (hd0,0)

kernel /bzImage-2.4.20 ro root=/dev/hda3 vga=788 splash=silent

initrd /initrd-splash.img

title Red Hat Linux (2.4.23)

root (hd0,0)

kernel /vmlinuz-2.4.20-8 ro root=LABEL=/

initrd /initrd-2.4.20-8.img

788为800x600模式,791为1024x768模式。这里的模式选摘要与图片的大年夜小同等。

到这里就可以从新启动了。呵呵,大年夜功告成。赶快实验一下,享受自己的全画面Linux启动吧。

您可能还会对下面的文章感兴趣: