QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3823|回复: 25

1.2 RC1里的rcalsasound脚本修正

[复制链接]
发表于 2005-1-25 03:26:17 | 显示全部楼层 |阅读模式
问题描述(alsamixer无法保存音量设置,导致每次开机后的第一次进入kde时没哟启动音效,而且,init3下音量缺省为零):
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=97803&start=120

分析过程:
1、
分析:alsamixer的音量保存动作通常是由alsasound这个脚本在stop动作时执行的
检查:于是首先检查有没有这个alsasound脚本,检查结果,存在/etc/init.d/rcalsasound脚本,但并没有/etc/init.d/alsasound脚本
2、
检查:查看/etc/init.d/rcalsasound脚本,发现它就是其他linux发行版中常见的alsasound脚本;
相关:alsasound脚本的主要动作是:
在系统启动时执行alsasound --start动作,从/etc/asound.state文件恢复音量设置;在系统关机或重启时执行alsasound --stop动作,将当前的音量设置保存进/etc/asound.state文件里
于是检查这个rcalsasound(其实就是alsasound)的内容,并没有发现有何不妥,但很明显,无论系统启动还是关机还是重启,从屏幕提示信息来看,都没有执行这个脚本
3、
分析:既然脚本没有错误,那么没有执行的原因只有一个,就是这个服务没有注册到系统启动服务里去。
检查:检查/etc/rc0.d--/etc/rc6.d目录,果然没有发现任何和rcalsasound脚本有关的链接,也就是说,无论是哪个init级别,都没有执行rcalsasound,rcalsasound脚本形同虚设,根本就不起任何作用。
3、执行chkconfig --add --level 345 rcalsasound进行rcalsasound服务注册,再检查/etc/rc0.d--/etc/rc6.d目录,可以见到这些目录下都生成了相关的rcalsasound脚本链接,说明rcalsasound服务已经在各个init级别里注册好,再执行service rcalsasound restart,发现无论start还是stop都OK了,也就是说,这样当进入init 3、4、5级别时,系统会执行rcalsasound脚本
4、重启系统测试,在进入init 5逐个启动服务时,可以见到有提示信息表明rcalsasound在执行start动作(执行start动作时,屏幕有“Starting sound driver:”字样),而且OK,正以为一切OK了,可是进入kde时,却发现依然没有启动音效;百思不得其解,于是进入kde后,调整好音量设置,再次重启系统,这回看出问题了,并没有信息表明在执行rcalsasound的stop动作(从脚本来看,执行stop动作时应该屏幕上有“Shutting down sound driver:”字样),也就是说,根本没有保存当前的音量设置,还是用回原先的缺省音量为零的设置
5、分析:系统在重启或关机时(init 0和init 6),通常只执行两个脚本killall和halt(这里的killall和halt并不是执行命令,而是/etc/init.d目录下的两个脚本),从killall脚本内容来看,它会检查/var/lock/subsys目录下有哪些文件来确定系统执行了哪些开机服务(因为开机服务脚本在执行start脚本时,通常在/var/lock/subsys目录下touch一个和脚本文件名相同的0字节文件,来表明服务启动成功,譬如keytable服务启动成功后,会生成/var/lock/subsys/keytable这个文件),然后来逐个stop服务。也就是说,rcalsasound服务启动后,应该生成/var/lock/subsys/rcalsasound文件,这样系统在重启或关机时,才会根据/var/lock/subsys/rcalsasound的存在来执行stop rcalsasound动作。
检查:检查结果表明:/var/lock/subsys/下存在alsasound这个文件,但并不存在rcalsasound文件;于是翻查/etc/init.d/rcalsasound脚本,发现如下语句:
  if [ -d /var/lock/subsys ] ; then
    touch /var/lock/subsys/alsasound
  fi
这些语句touch出来的文件是alsasound而不是rcalsasound,于是在脚本里用查找替换,将所有的“/var/lock/subsys/alsasound”替换成“/var/lock/subsys/rcalsasound”,保存修改后的脚本。
6、重启系统进行测试,一切正常,启动时rcalsasound脚本的start动作会自动恢复音量设置,而关机或重启时rcalsasound脚本的stop动作也会正常执行,自动保存当前音量设置,终于可以听到kde启动时的悦耳声效了:-)

总结:
修正方法是:
执行chkconfig --add --level 345 rcalsasound
然后将/etc/init.d/rcalsasound脚本里所有的“/var/lock/subsys/alsasound”替换成“/var/lock/subsys/rcalsasound”,再保存修改后的脚本就OK
  
最终建议:rpm -qf /etc/init.d/rcalsasound,结果表明这个文件属于mgc-patch-1.0-13mgc这个包,按rpm  -ql mgc-patch的结果来看,这个包应该是一些补丁文件的集合(alsasound脚本也是补丁?!)。估计可能由于打包者的粗心,没有加入chkconfig --add --level 345 rcalsasound动作,加上可能人为将脚本改名(因为从rcalsasound脚本内容来看,这个脚本应该叫alsasound而不是rcalsasound)而造成了这个bug的产生;建议按上面方法修改好rcalsasound脚本,重新打包mgc-patch这个rpm包,在这个rpm包的script段,加入chkconfig --add --level 345 rcalsasound动作,即可解决这个问题。
 楼主| 发表于 2005-1-25 14:46:56 | 显示全部楼层
补充一下:
似乎安装完后的第一次alsaconfig配置声卡时会往/etc/modprobe.conf里写上几行preinstall/remove之类的模块安装信息,这些语句似乎没有起什么作用(这些语句好像只是在使用内核oss模块时才有效,而ml的内核默认使用alsa),反而会导致rcalsasound脚本在start时失效(因为ml的alsa缺少了/bin/alsa-startup这个命令),因此,如果你的/etc/modprobe.conf里有那些语句,请在每行前面加注#将其注释掉,仅留下标记有alsaconfig添加的内容即可,否则会导致rcalsasound失效
不知道这个是安装程序的问题还是alsaconf的问题,可能不是alsaconf的问题,因为将/etc/modprobe.conf改名后重新alsaconf不会出现那些preinstall语句
回复

使用道具 举报

发表于 2005-1-25 15:01:06 | 显示全部楼层
llc兄的钻研精神真佩服,现在我上网条件不行,等过了这段时间也要继续参与了。
回复

使用道具 举报

 楼主| 发表于 2005-1-25 17:02:33 | 显示全部楼层
昨晚喝咖啡超量,没办法睡觉,只好折腾ml了
回复

使用道具 举报

发表于 2005-1-25 17:22:16 | 显示全部楼层
吼吼~
回复

使用道具 举报

发表于 2005-1-25 18:25:35 | 显示全部楼层
不应该继续使用错误的东西,应该使用 alsa 默认的 /etc/init.d/alsasound 脚本。
回复

使用道具 举报

发表于 2005-1-25 18:27:09 | 显示全部楼层
谢谢 llc 找到了这个大 BUG。
回复

使用道具 举报

 楼主| 发表于 2005-1-26 01:19:24 | 显示全部楼层
[quote:d7e0886152="KDE"]不应该继续使用错误的东西,应该使用 alsa 默认的 /etc/init.d/alsasound 脚本。[/quote]
确实应该用回alsasound这个名字
回复

使用道具 举报

发表于 2005-1-26 09:03:46 | 显示全部楼层
为什么不把rcalsasound都改成alsasound,而要反过来呢?
回复

使用道具 举报

 楼主| 发表于 2005-1-26 10:10:07 | 显示全部楼层
[quote:bfda6eac88="rockmen"]为什么不把rcalsasound都改成alsasound,而要反过来呢?[/quote]
早就料到会有人这么问
因为前面我已经按
chkconfig --add --level 345 rcalsasound
将rcalsasound注册了
如果将rcalsasound改回alsasound
那么需要执行
chkconfig --del rcalsasound将rcalsasound反注册
然后重新chkconfig --add --level 345 alsasound将alsasound注册
有点烦
而rcalsasound脚本我一直打开,顺手将“/var/lock/subsys/alsasound”查找替换比较方便
不过,建议重新打包时还是按alsasound来打好,它才是原装的名字
回复

使用道具 举报

发表于 2005-1-26 10:14:24 | 显示全部楼层
在我的SBLive上出问题了,让alsasound开机运行后,到了starting alsasound停住不返回了,不知道是什么原因。
回复

使用道具 举报

 楼主| 发表于 2005-1-26 10:51:23 | 显示全部楼层
[quote:b79a5818fc="rockmen"]在我的SBLive上出问题了,让alsasound开机运行后,到了starting alsasound停住不返回了,不知道是什么原因。[/quote]
停住不返回是死锁吗?
启动时按I进入逐步启动模式,不要启动alsasound,进入系统后,将/etc/modprobe.conf的内容帖一下看看
回复

使用道具 举报

发表于 2005-1-26 11:00:58 | 显示全部楼层
按照上面改了一顿 问题依旧 每次还要手动 起动 声音程序

[root@MagicLinux ~]# service rcalsasound restart
Shutting down sound driver: done
Starting sound driver: snd-au8820 sh: /bin/alsa-startup: 没有那个文件或目录
FATAL: Error running install command for snd_au8820
done
[root@MagicLinux ~]#
回复

使用道具 举报

 楼主| 发表于 2005-1-26 11:03:58 | 显示全部楼层
[quote:dda869b306="easycat"]按照上面改了一顿 问题依旧 每次还要手动 起动 声音程序[/quote]
启动时有没有看见“Starting sound driver:XXX”这样的字样?如果没有,alsasound服务根本没有启动,执行ntsysv,看看有没有alsasound或rcalsasound服务,选上,并检查/etc/rc0.d--/etc/rc6.d目录下有没有相关链接
回复

使用道具 举报

发表于 2005-1-26 12:03:34 | 显示全部楼层
[×]rcalsasound这就是 选中的意思吧 可是 使用播放器 仍然没有声音。
必须手动点开 magicconf里面的声音 设置一下才能出声
/bin/alsa-startup
我好象没有这个程序:[[
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-4-28 10:55 , Processed in 0.093540 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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