ArchLinux安装几天的经验总结、bug修正和软件配置

1. ArchLinux的wiki是个非常不错的资源。我的安装就是照着Beginer's Guide做的,从中也学会了很多之前不知道的一些东西,比如HAL是做什么用的,alsamixer可以用来调音量,普通用户需要加入到optical, storage, video等几个组中,从而获得一些特别的权限。所以,有问题或是初装,一定要按照Beginer's Guide来做,文档非常不错。 

本篇文章其实有很多重要的内容都没有描述,不描述是因为wiki写的很好,我就是按照wiki做的,没有任何问题,所以不再赘述了。比如安装acpid, cpufreq, laptop-mode, pm-utils这些,这些对于笔记本电脑都非常的有用。 

2. /etc/rc.d/network 脚本有bug。start一个interface的时候有个检查该interface是否已经启动的代码,这段代码是有问题的,他通过判断ifconfig eth1这个命令是否有输出来判断eth0是否已经启动了。事实上,就算eth0没有启动,ifconfig eth0这个命令都是有输出的,这就导致eth0压根就不会被配置。 

把/etc/rc.d/network脚本打开来看一下,restart的时候会首先调用stop,然后是start,stop没有问题,但是start的时候,具体调用的是这个脚本中ifup这个函数,这个函数中有一句代码是判断需要start的interface是否已经启动(如果已经启动那就什么都不做了),就是这句代码有问题,因为这句代码是这样写的(大概是这样,现在没有archlinux的环境,无法拷贝过来): 

[ $(/sbin/ifconfig $1 |grep -v "inet6...."|grep -e "..." -e "....") ] && return 0 

这里的$1就是传递到这个函数的网络interface,比如lo,eth0这样的,设计者的意图是:因为前面已经stop了网络,所以ifconfig eth0应该没有输出,所以,上面的代码判断就是失败,于是继续往下做(不return),下面的代码就是给eth0配置IP地址和netmask这些。但问题恰恰是此时ifconfig eth0有输出,于是这句代码判断eth0已经启动了,所以不再去尝试启动eth0。 

由于ifup函数中没有启动网络interface,所以在后面的代码中,设置route的时候,其实就是命令:route add default gw xxx.xxx.xxx.xxx这样的代码,default gw xxx.xxx.xxx.xxx就是我们写在/etc/rc.conf中gateway那个变量的内容。由于interface没有启动,所以route add就出错了,就打印出了SIOCADDRT: No such process 这个出错信息。 

其实现在看来,目前的arch中,网络被stop了之后,输入ifconfig是什么输出都没有的,但是ifconfig eth0这个命令却有输出,这是不太符合逻辑的。估计是ifconfig这个包有问题。这就是导致问题的根源。 

我现在直接将ifup中上面提到的那句代码注释掉了,不判断interface是否已经启动,就一切正常了。 

3. 使用kdesktop_lock --forcelock可以启动KDE的lock session。 

4. gmplayer打开rmvb失败,说无法初始化xv设备。而用mplayer打开却可以,观察mplayer的输出,mplayer一开始也尝试用xv,发现不行就转成使用x11,成功。所以,修改~/.mplayer/gui.conf,将其中vo driver改成x11即可。此外,mplayer播放全屏图像不拉伸,可以在~/.mplayer/config中添加一行:zoom=yes即可。最后,在mplayer的设置中,记得将双缓冲和direct rendering打开,默认这两项不开启的。 

5. xhost + local: -- let root can run X programs while su to root from normal user because the kde is started by normal user。注意local后面有个冒号。默认kdeinit是普通用户执行的,所以root无法访问KDE环境,除非在登录的时候,直接用root登录。普通用户登录了,在命令行su成root之后,要执行有图形界面的程序,就要执行这个命令。做一次就好了,不用每次都做。 

6. 下载了stardict的字典,连目录放在/usr/share/stardict/dic目录下,dic目录不存在则创建一个,重启stardict即可。 

7. 无法自动挂载含有中文字符的卷标的光盘的解决办法,改变HAL默认的挂载点(默认挂载点是/media目录下以这个光盘卷标为名的目录,中文名konqueror无法进入,所以修改掉)。在/etc/hal/fdi/policy目录下新建preferences.fdi,内容如下: 

CODE: SELECT ALL
<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="1.2">
    <device>
        <match key="volume.is_disc" bool="true">
            <match key="block.device" string="/dev/sr0">
                <merge key="volume.policy.desired_mount_point" type="string">mydvd</merge>
            </match>
        </match>

        <match key="volume.fsusage" string="filesystem">
            <match key="volume.fstype" string="iso9660">
                <merge key="volume.policy.should_mount" type="bool">true</merge>
                <merge key="volume.policy.mount_option.iocharset=utf8" type="bool">true</merge>
            </match>
        </match>
    </device>
</deviceinfo>


mydvd就是将来挂载在/media/mydvd目录下。mydvd这个目录事先不能建立,如果建了会mount失败,因为HAL认为这个目录已经存在,有可能正被人使用。所以这个目录不能存在,HAL会自动建立的。

在KDE的control center -> Desktop -> Behavior -> Device Icons tab -> check the "show device icons" checkbox, 这样被自动挂载的设备就会显示在桌面上,默认是不会的。

8. 如果定义了MANPATH环境变亮,那么,/etc/man.conf中的配置将不再有效。man只会在MANPATH环境变量的值中寻找man手册。

9. 如何使用windows键。在KDE下直接支持。在control center -> Region and Accessibility -> Keyboard shortcut中,选择windows scheme(with win key),然后在下面的表格中就可以自己定义喜欢的快捷键了,如win+L就是lock session等。唯一可惜的就是无法定义按下win键就打开K菜单,这里面一定要组合键才行,不能光定义一个win键,所以我选择了win+1打开K菜单。

10. Thinkpad Hotkey,modprobe thinkpad_acpi module,在/etc/modprobe.conf中添加optin:

options thinkpad_acpi hotkey=enable,0xffffffff

然后在/etc/acpi/handler.sh中添加响应脚本:

CODE: SELECT ALL
ibm/hotkey)
        case "$2" in
            HKEY)
                case "$4" in
                    #00001002) su - eric -c "/opt/kde/bin/kdesktop_lock --forcelock >& /home/eric/outputs" ;;
                    00001004) pm-suspend ;;
                    00001005)
                        iw_status=$(cat /sys/bus/pci/drivers/ipw3945/0000:03:00.0/rf_kill)
                        if [ $iw_status == "0" ]; then
                            echo "1" > /sys/bus/pci/drivers/ipw3945/0000:03:00.0/rf_kill
                        else
                            echo "0" > /sys/bus/pci/drivers/ipw3945/0000:03:00.0/rf_kill
                        fi
                        ;;
                    00001007) echo video_switch > /proc/acpi/ibm/video ;;
                    0000100c) pm-hibernate ;;
                esac
                ;;
            *) logger "thinkpad_acpi undefined: $2" ;;
        esac
        ;;


将echo "1" > /sys/bus/pci/drivers/ipw3945/0000:03:00.0/rf_kill添加到/etc/rc.local中,让开机的时候默认wireless不启动

11. 安装永中office. 解开后一定要切换成root用户,执行setup(图形界面安装)或setup.sh(脚本界面安装)。我这里用的是图形界面安装,执行了setup之后java报了一个security exception,不过图形界面好像出来了。安装很容易,就是选择一个安装路径。完成后,切换到普通用户,执行一下seteio命令,桌面出来一个快捷方式,就可以用了。要卸载的时候,重新执行setup这个安装程序,就会看到卸载的界面了。

12. Java的程序,无论是手动装的java,还是永中office中自带的java,运行的时候(如果用命令行运行就能看到)会出现这样的错误:

Locking assertion failure. Backtrace:
#0 /usr/lib/libxcb-xlib.so.0 [0x2aaaafdeb97c]
#1 /usr/lib/libxcb-xlib.so.0(xcb_xlib_unlock+0x24) [0x2aaaafdeba84]
#2 /usr/lib/libX11.so.6(_XReply+0x10f) [0x2aaaaf92ddaf]
#3 /opt/java/jre/lib/i386/xawt/libmawt.so [0x2aaaaf7bf826]
#4 /opt/java/jre/lib/i386/xawt/libmawt.so [0x2aaaaf7a22ab]
#5 /opt/java/jre/lib/i386/xawt/libmawt.so [0x2aaaaf7a257d]

其实不影响使用,解决办法如下:
Try this as root:
sed -i 's/XINERAMA/FAKEEXTN/g' /opt/java/jre/lib/amd64/xawt/libmawt.so

The i686 users should use:
sed -i 's/XINERAMA/FAKEEXTN/g' /opt/java/jre/lib/i386/xawt/libmawt.so

用这个办法修改/usr/local/Evermore/EIOffice/Jre/lib/i386/xawt/libmawt.so,也可以让永中office运行的时候没这个错误。

13. 手动安装Netbeans 5.5.1,需要安装bc这个软件,否则会出错说找不到bc这个command。bc -- An arbitrary precision calculator language。 sudo pacman -S bc

14. 后来jdk还是手动装的jrockit,因为jdk6在字体方面比较别扭(好像有AA效果导致字体模糊),而且EC本身一直用JDK 5编译的,怕有兼容问题。jrockit装也非常简单,好用。装完后在/etc/profile.d下创建了jrockit.sh, jrockit.csh设置了JAVA_HOME。jrockit也有Locking assertion failure这个问题,同样的方法修改。

15. KDE下的窗口管理非常的不错。比如想让gvim在启动的时候就最大化,在网上搜了一下,想用命令:au GUIEnter * simalt ~x,但是发现这个命令只能用于win32下的gvim,于是再搜,发现了好东西:在gvim的标题栏上单击右键,选择Advance -> Special Application Settings, 在Geometry标签中,选择Maximized Horizontal & Maximized Vertical,两个下拉框选择Forced,最后一定要记住这两个最后还有两个checkbox,一定要打上勾!这样,每次启动gvim都会自动最大化了,爽!如法炮制,一直相让konsole启动就最大化的,用这个方法也可以了!KDE的窗口管理真的做的非常不错,可以针对窗口和应用单独设置。而且,在刚才那个对话框里,还可以设置很多东西,比如让某个应用一启动就放到第几个Desktop中等等,非常的棒!

16. sudo. sudo是个非常使用的utility。主要就是可以让普通用户以root用户的身份执行一些命令。通过visudo(root用户身份执行),可以设定某个用户能怎么样执行哪些命令,比如:

eric ALL=(ALL) ALL
eric ALL=(ALL) NOPASSWD: /usr/sbin/pm-hibernate
eric ALL=(ALL) NOPASSWD: /usr/sbin/pm-suspend

这样eric就可以执行ALL(所有的命令),下面两行eric可以以不输入密码的方式执行pm-hibernate, pm-suspend这些命令。sudo的时候,第一次会让我们输入密码,注意输入的是自己账户的密码,不是root口令(显然不能是root口令,因为第一,root口令不能让普通用户知道,第二,输入自己的口令以防止不是这个用户的人在使用sudo执行命令),第一次sudo成功之后,之后的一段时间内,每次sudo都不需要输入口令了,知道一段时间过后,再执行sudo就又要输入口令了。

所以,sudo是个很有用的utility,可以让用户暂时获得root权限,而且root用户可以设定一些策略。但是sudo也有一些bug,比如我安装jdk和netbeans的时候,如果sudo执行的话,安装程序出错了(就是上面写的那个Locking assertion failure),就立刻退出了。一定要su成root,然后执行,就是OK的。

请参考archlinux wiki中的sudo的文章。最后,在自己的.bashrc中加上complete -cf sudo也是一个非常有用的东西,这样,当我们输入sudo,然后输入命令的时候,按tab,后面的这些内容也能自动补齐了,否则是没有auto complete这个feature的。

17. 安装mysql+php5+apache2。Arch的repository上这三个软件都有。

mysql是5版本的,和4不太一样了,第一,装完之后,默认没有名为mysql的一个db了,第二,grant all privileges on *.* ....这个命令貌似没用了,第三,所以我只能用mysqladmin -u root password 'athena9126'这样的命令来给root修改口令了(这样修改的是root针对localhost这个host的口令),然后我就只会使用mysql的图形工具mysqladmin来添加用户,修改密码了。

其次,php5,arch上提供的这个php5其实已经做了很多工作了,有mysql的支持,有ssl的支持,还有一堆模块的支持,此外,在安装的时候,还会向/usr/lib/apache目录下拷贝一个libphp5.so的库,这是后来apache和php结合的时候所需要的。具体信息可以将php的包解开,看包里面的那个.INSTALL文件就明白了。此外,这个php5的包默认在/etc/php目录下寻找php.ini文件,而这个php.ini在安装的时候也已经拷贝到了/etc/php目录下,所以,我需要做的唯一事情就是修改/etc/php/php.ini,将mysql的support打开就完了。

最后,有关apache,一开始我装的是apache13,因为之前我一直用的都是apache 1.3,但是后来发现不行,首先,apache13的module so文件放在了/usr/lib/apache13目录下,所以php安装的时候,那个libphp5.so就没有放对地方(php包默认拷贝的这个位置是假设用户安装apache2的),其次,我手动将libphp5.so拷贝到/usr/lib/apache13目录下后,然后修改完了httpd.conf,发现apache启动不了,定位了一下,发现apache装载libphp5.so这个文件失败,此时就想到了这个so是给apache2用的。于是,重新删掉apache13,装上apache(就是apache2)。参考了www.php.net上的安装步骤,特简单,只需修改httpd.conf,加上LoadModule和AddType就OK了,而且我发现arch上下来的这个apache2,LoadModule这一句就有,只需去掉前面的注释即可,AddType这一句也有,都配好了,所以,我在httpd.conf中就做了一件事情,将php的LoadModule这一句的注释去掉了。然后启动apache: /etc/rc.d/httpd start,搞定。将mysql, httpd放到了/etc/rc.conf的DAEMON中,开机启动这两个东西。

Apache2默认的DocumentRoot在/home/httpd/html目录下,我在这个目录下写了一个test.php:

CODE: SELECT ALL
<?php
    phpinfo();
?>


执行正常。然后修改了httpd.conf中的DocumentRoot为/home/eric/TipBBS,重启apache(TipBBS的数据已导入,和mysql4一样,mysql -u root -p phpbb2mod < /home/eric/TipBBS/ericdbbackup/xxxxx.sql,前提是phpbb2mod这个db已经建好),发现无法进入,总是提示Access Denied。于是回去研究httpd.conf,果然和apache 1.3很不一样。apache2对权限控制这一块有了更高的要求和配置:

1. user, group这两个配置项指定httpd进程由哪个用户启动,默认是nobody,nobody显然无权限访问/home/eric/TipBBS,所以,我将这两项修改成了eric, users,重启apache,ps aux|grep httpd看了一下,都是eric用户启的了(有一个root启动的,这应该就是第一个进程,这个进程启动后fork进程,chuser成eric再启动的其他进程)。然后访问,还是Access Denied。

2. 再研究httpd.conf,发现了门道,有这么一段:

CODE: SELECT ALL
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>


这表示web的/这个目录,默认策略是deny,而且deny from all。这就是为什么我access deined了,因为我访问的就是http://localhost(DocumentRoot改成了/home/eric/TipBBS了)。再参考之前apache刚装好之后的位于/home/httpd/html的Directory配置,看懂了,这就是为什么这个目录下的东西能访问的原因,配置如下:

CODE: SELECT ALL
<Directory "/home/httpd/html">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Order allow,deny
    Allow from all

</Directory>


明白了,现在apache2的权限更严格了,而且可配置性更好了,不仅能对访问的机器做限制,还能对每个web目录做限制,于是,我修改了/这个Directory的配置,如下:

CODE: SELECT ALL
<Directory />
    Options FollowSymLinks
    AllowOverride None
    #Order deny,allow
    #Deny from all
    Order allow,deny
    Allow from all
</Directory>


重启apache,现在搞定了。Congratulations!

18. 有关iptables。TipBBS搞定了,现在要搞iptables,不让别人也能访问我的TipBBS,首先我sudo iptables -vnL,发现没有任何策略被配置了,可能是iptables根本没启动,于是我sudo /etc/rc.d/iptables start,发现出错,报告说找不到文件:/etc/iptables/iptables.rules,哦,原来iptables一直都没有配置,也没有工作过。进一步,发现/etc/iptables下有个文件名为simple_firewall.rules,这应该是arch提供给我们的sample,打开一看,完全满足我的要求,于是直接sudo cp /etc/iptables/simple_firewall.rules /etc/iptables/iptables.rules,再启动iptables,成功。再其他机器上一试,果然无法访问我的TipBBS了,最后将iptables加到了/etc/rc.conf的DAEMON,开机启动,完工。附上arch提供的simple_firewall.rules文件的内容:

CODE: SELECT ALL
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT


这个规则写的还是很不错的,拒绝任何外来的链接,除了icmp、ESTABLISHED/RELATED、lo的之外。所以,很安全了,如果要打开ssh,自己再打开22端口就OK了。 

对了,除了ArchLinux的wiki之外,让我决定尝试ArchLinux的是linuxtoy上的文章 -- 《打造完美的Linux桌面》,这个文章已经做成了PDF版,很不错,安装的时候也可以参考,但写的太简单,只能做参考。详细的和权威的还是要看ArchWiki的guide系列。文章见附件1 
19. 忘了说了,安装的时候,字体装了: 

ttf-arphic-uming ttf-arphic-ukai ttf-ms-fonts ttf-dejavu ttf-bitstream-vera wqy-zenhei 

特别是wqy-zenhei一定要装,非常不错的truetype字体。而且,按照他的建议,我修改了/etc/fonts/conf.d/44-wqy-zenhei.conf中的: 

<edit name="embeddedbitmap"><bool>true</bool></edit> 

原来这个值是false。表示在9-12号字体的时候,使用zenhei自带的点阵字体,而不是使用zenhei字体本身。因为9-12这种小字的话,点阵字体非常的犀利和清楚,用zenhei反而字会发现挤在一起,看不清楚。再大的字用zenhei正合适。这几个字体装完,基本就不用美化了,已经很好了,在KDE的Fonts中选选不同的地方用什么字体就OK了。 

20. 将字体文件拷贝到/usr/X11R6/lib/X11/fonts/TrueType目录下,这些字体就能在永中office中使用 

21. sudo iwconfig eth1 ESSID ERICWIRELESS key 5127B4F54518D38FD275E989B5 ,配置无线网卡的信息。然后sudo ifconfig eth1 192.168.3.28 netmask 255.255.255.0,配置无线网卡的IP地址,最后sudo route add default gw 192.168.3.1,配置路由,看情况是否要配置/etc/resolv.conf,这样就可以使用无线网卡上网了。BTW:使用命令iwlist scanning可以扫描无线网络。 

22. 上面设置的iptables的规则无法让amule获得HighID,因为防火墙block了外来的连接,我的amule设置的TCP端口是7559,UDP是7569,所以,在/etc/iptables/iptables.rules中添加: 

-A INPUT -p tcp -m tcp --dport 7559 -j ACCEPT 
-A INPUT -p udp -m udp --dport 7569 -j ACCEPT 

重启iptables就OK了 

23. 使用netcfg2可以给网络建立profile,建立好了之后可以非常方便的在多个网络profile中切换。它的图形化前端ArchAssistant没什么太大意思,就是作了一个GUI界面。KNetworkManager和netcfg2类似,但是没有profile这样的概念,它是针对每个网络设备的。如何配置netcfg2请参考wiki,非常简单。 

24. pacman的几个实用命令:pacman -Rs <package name>,这样可以将这个package依赖的包也一起卸载掉,如果没有s这个option,那么,只会单独卸载置顶的那个包,这样就会产生一些孤儿(orphan)包。使用命令pacman -Qdt可以来查询整个系统中所有的orphan包。 

25. 前面提到了mplayer播放片子的时候,全屏居然不拉伸图像的问题,后来加了一个zoom=yes解决的。其实这个问题不是偶然的,为什么mplayer全屏默认不拉伸图像呢?不合理阿,今天发现了答案:那是因为我们用了x11这个video driver的缘故。在网上查了一下,x11驱动是软解码的,也就是说用CPU来解码影片,这显然不是我所希望的,因为解码影片自然应该是显卡的事情,我的thinkpad怎么说也有一块raedon x1300的显卡阿!而mplayer中,用xv这个驱动是公认最好的硬件解码驱动。能否使用xv驱动,可以尝试运行命令xvinfo看有无输出。xvinfo果然在我电脑上运行后输出说找不到支持xv的显卡。由于x11驱动是软解码,所以,mplayer默认全屏的时候不拉伸,因为这会给CPU带来巨大的负担,全屏看电影和非全屏,工作量不是一个级别的。

于是开往在网上搜索,找了一些方法,比如,在/etc/X11/xorg.conf中,在Device一段,加入Option "VideoOverlay" "on",重启X server,xvinfo依然不工作。

后来在/var/log/Xorg.0.log中找到了办法,因为找到了这么一句话:

(WW) fglrx(0): Video Overlay not supported on AVIVO based graphics cards. For XVideo support use Option "TexturedVideo"

OK,加入Option "TexturedVideo" "on"即可,去掉VideoOverlay这样的东西。重启X server,xvinfo输出正常。

现在马上就回去把~/.mplayer/gui.conf中vo_driver一项改成xv,~/.mplayer/config中将zoom=yes去掉,打开一部片子,果然全屏自动就拉伸图像了。而且参考了一下mplayer的man手册,有了硬件加速后(使用了xv驱动),可以使用1,2两个数字键来调片子图像的对比度,用3,4两个数字键调亮度,太棒了!这些软加速的时候是无法调的。

有关性能方面,使用xv驱动的确有一些改进,一般的rmvb片子,使用x11驱动,全屏后CPU占用率达到40%左右,使用了xv驱动,不论是否全屏,CPU占用率都在10%左右。我想如果是播放更高品质的电影,可能性能差距会更明显。而且,使用了xv驱动播放,更可以调节对比度和亮度,所以,使用xv驱动还是非常必要的。

不过话又说回来,现在ATI的显卡驱动还是有问题的,比如,使用x11驱动,可以开两个mplayer同时放片子,但是使用xv驱动,开第二个mplayer,必然是花屏。而且,就算只放一个片子,开一个mplayer,也偶然会出现花屏的现象,更严重的时候,会导致X崩溃(黑屏,必须重启)。 

 26. 从mplayer播放电影,隔一段时间会“顿一下”的现象来看laptop-mode。之前按照arch的beginner guide安装arch的时候,就装过laptop-mode这个东西。当初不是非常理解,这次通过“mplayer播放电影,隔一段时间会“顿一下”的现象”对laptop-mode有了理解。


现象是:在没有电源的情况下,也就是电池供电的时候,使用mplayer播放电影,隔一段时间会顿一下。顿的时候硬盘灯常亮,似乎在读盘,1秒左右就能恢复,继续播放。插上电源之后就一切OK了。

从这个现象我想到了laptop-mode。laptop-mode是2.6内核的一个feature,我们安装的laptop-mode-tools只是一个用户空间的软件,用来打开、关闭、设置这个feature的。laptop-mode的作用应该是控制硬盘的读写,也就是说,应用程序要求读盘或写盘,内核并没有真正去读盘或写盘,而是cache了这些动作(在内核中有一个buffer),积累一段时间再去真正的读盘或写盘,目的就是减少读盘,降低硬盘工作的时间,从而达到保护硬盘,延迟电池续航时间。这就解释了上述的“顿一下”这个现象,因为mplayer在播放电影的时候会定时、频繁的读盘,但是上面说了,这些读盘的动作会被内核cache,并没有真去读盘,所以,如果mplayer已将自己buffer中的数据播完,而此时需要的数据内核还没有去读取,那么,自然就会“顿一下”了。

另外,在电池供电的时候,也就是laptop-mode工作的时候,笔记本的硬盘灯基本上不闪; 而接上电源后,硬盘灯在电影播放的时候就会有规律的闪动着。这就更证明了一点:laptop-mode工作的时候,硬盘经常并没有真正产生读或写的动作,所以硬盘灯长时间会没有闪动。

检查/etc/laptop-mode/laptop-mode.conf里面的配置,更确定了我的这个想法。我没有配置这个文件,换句话说,是默认配置。默认配置下,在有电源的时候,laptop-mode将被禁用,在电池供电的时候,laptop-mode将打开。

进一步参考了laptop-mode的网站,查看/proc/sys/vm/laptop-mode文件中的内容就可以知道laptop-mode有没有开启,这个文件中的值如果非0,那就开启了laptop-mode,否则就没有开启。

laptop-mode还可以设置LCD的亮度。前面讲到thinkpad_acpi的时候说过了,控制LCD亮度的是标准的ACPI事件,在我的笔记本上,/proc/acpi/video/VID1/LCD0/brightness文件就是当前的亮度,往这个文件中写入值就可以控制LCD的亮度,我的笔记本这个亮度值是从30-100。所以,这里我也做了配置,laptop-mode在电池供电下启动,亮度设成80,否则,亮度都是90。试了一下,果然有效,嘿嘿。

讲到这里,再次回到问题上来,为什么mplayer播放的时候有时会出现“顿一下”这种情况呢?现在我觉得,可能是内核的bug,或者说目前内核对laptop-mode的实现还欠缺测试和实践的验证。出现顿一下的情况,明显是cache的太多,导致真正需要的数据长期上不来而导致的,这说明内核在cache和控制硬盘读写的时候可能有问题,或是设置硬盘的power或工作状态的时候有问题。有关这个问题,在laptop-mode的FAQ中有,问题就是为什么启动了laptop-mode,系统有时会经常Freeze一下。事实就是这样,我试验了,就算不用mplayer播放电影,就是平时办公,如果细心观察的话,有时也会出现系统Freeze一下的情况。而且,我针对laptop-mode的配置文件也做过一些修改,比如将硬盘进入idle状态的等待时间调长,发现没有效果;将read ahead的量调大,也没有效果,这倒是正常的,因为read ahead只是在程序启动的时候read一次而已。所以,我现在觉得,这应该内核的不完善的地方。

但是瑕不掩瑜,现在起码使用了laptop-mode之后,硬盘的读写次数的确降低了。硬盘灯闪烁的频率明显比没开laptop-mode的时候要低很多。

更多内容参考laptop-mode的网站,或laptop-mode.conf文件本身,这个文件中有一些注释,挺好理解的。
原文地址:https://www.cnblogs.com/super119/p/1910258.html