显示标签为“Linux”的博文。显示所有博文
显示标签为“Linux”的博文。显示所有博文

2009年6月2日星期二

LVM初接触

用了多年Linux了,对LVM的了解停留在名词的程度上,因为之前一直在PC机上用Linux,所以没有注意得到。

上个星期在一台服务器上装CentOS的时候选择要系统自动分区,它给分成了一个/boot卷,另外一个就是LVM,突然好奇,CentOS默认的在服务器上应该不错,所以就要它默认装了。昨天突然想到这是个光盘景象服务器,将来要添加硬盘怎么办,除了新建一个分区挂载新的硬盘之外,那么能否一个分区跨越硬盘呢?于是google了LVM,看到LVM的资料,我又一次的感觉自己之前了解得太少了。之前为了充分利用这个160G的硬盘,没有考虑平常系统恢复的需求,要是我自己操作,要是系统当掉了,肯定可以尝试使用Live
CD修复,而且原来以为那个逻辑卷管理器占用了整个物理分区,那么也不存在坏硬盘坏一个分区的情况,所以只分了一个根分区和一个swap分区。后来领导想到我不在的时候,如果系统当掉,要能直接像GHOST那么恢复,那么自然根分区就要分开了。我现在需要的是减少ext3分区大小,很多文章上都是说的使用reiserfs时扩大分区的情况,
下面说说我的经验

扩大分区时, 是先扩LVM大下,然后括文件系统分区大小,文件分区大小的扩大,ext3和reiserfs可以动态在线扩展,并且速度非常快。涉及到磁盘减少大小时,就不能在线了,如果是根分区的改变,还必须使用live
cd启动,而不能是本身的操作系统。可以想到的是,减少分区,要先缩文件系统,再缩逻辑卷。并且需要注意的是,逻辑卷要先激活才能挂载,不要尝试直接挂载/dev/sda2之类的分区,它的分区类型是8e,是不能直接挂载的。LVM的相关命令里面,可以分为几个组,以pv开头的命令,是表示处理物理卷的相关命令,vg开头的命令是处理卷组的工具,以lv开头的是处理逻辑卷的工具。相关使用使用-h参数打印命令帮助即可。值得注意的是,文件系统的resize和逻辑卷的resize的大小单位可能不一致,所以做两次resize可以保证文件系统使用了所有的逻辑分区大小。比如第一次resize缩小到你需要的大小之下,然后缩小逻辑卷,然后再一次不带参数resize文件系统,文件系统就能完全的使用逻辑卷大小了,
下面是参考命令。


vgdisplay #display the volume group, you can get volume_group_name here
vgchange -ay volume_group_name
lvdisplay #show the logic volumes
#假设要改变大小的是/dev/VolGroup00/Lov00, 需要缩小到10G
e2fsck -f /dev/VolGroup00/Lov00 #在resize之前强制要求的
resize2fs /dev/VolGroup00/Lov00 9G
lvreduce -L10G /dev/VolGroup00/Lov00
resize2fs /dev/VolGroup00/Lov00

2009年5月14日星期四

等待中的catalyst 9.5

由于ubuntu 9.04 ATI显卡的问题,使用catalyst 9.4驱动会出现窗口最大化跨越两屏的情况,这在使用双屏的时候是不可接受的,所以一直使用开源的radeon驱动,使用radeon驱动一切正常,但是就是速度不怎么样,而且不支持3D,想偶尔游戏下不行,所以一直等待这catalyst 9.5, 前一段时间一直有谣言说catalyst 9.5将在5月13日放出,我从昨天开始就在网上找,今天也没有找到,所以应该是谣言吧。

目前使用开源ATI驱动的问题是有的时候鼠标所在的位置会花一小块,虽然也不是什么big deal,但是还是感觉不爽,今天网上偶尔看到有关于性能调整的文章,照做了,果然产生了效果。

#section device
Option "AccelMethod" "EXA" #default is XAA, EXA is faster
Section "DRI“
Mode 0666
EndSection
Section "Extensions"
Option "Composite" "Enable"
EndSection

早先是知道这些调整选项的,但是ubuntu自动配置之后运行起来没有什么问题,就没有去管它了。现在调整一下效果更好了,不错,呵呵。

另外,找到了一个在gnome dual monitors下控制窗口的脚本,原来是想自己开发使得metacity具有转换monitor, workspace的功能,其实借用wmctrl程序,结合一些其他的小工具,这个功能就可以实现了,然后绑定到一个快捷键,即可达到一键移动窗口的功能了,在这个小脚本里面wmctrl指令的使用并没有什么特殊性的,值得关注的作者使用一些小工具做到了找到当前活动窗口的功能,这里贴一下, 根据这个脚本还可以调整wmctrl指令参数,达到把窗口在workspace中间传送的功能哦。

#!/bin/bash
# swap_monitor.sh
# Moves the active window to the other screen of a dual-screen Xinerama setup.
#
# Requires: wmctrl, xprop, xwininfo
#
# Author: Raphael Wimmer
# raphman@gmx.de

# get monitorWidth
monitorLine=$(xwininfo -root | grep "Width")
monitorWidth=$((${monitorLine:8}/2 ))
echo $monitorWidth

# get active window id
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId="${activeWinLine:40}"

# get window position
xPosLine=$(xwininfo -id $activeWinId | grep "Absolute upper-left X")
xPos=${xPosLine:25}

# get window width
xWidthLine=$(xwininfo -id $activeWinId | grep "Width")
xWidth=${xWidthLine:8}

# calculate new window position
if (( ${xPos} + ${xWidth}/2 > ${monitorWidth} ))
then xPos=$(( ${xPos} - ${monitorWidth}))
else xPos=$(( ${xPos} + ${monitorWidth}))
fi

# make sure window stays on screen completely
(( ${xPos} < 0 )) && xPos=0
(( ${xPos} + ${xWidth} > 2 * ${monitorWidth} )) &&
xPos=$((2*${monitorWidth} - ${xWidth}))

echo ${xPos}

# if maximized store info and de-maximize
winState=$(xprop -id ${activeWinId} | grep "_NET_WM_STATE(ATOM)" )

if [[ `echo ${winState} | grep "_NET_WM_STATE_MAXIMIZED_HORZ"` != "" ]]
then
maxH=1
wmctrl -i -r ${activeWinId} -b remove,maximized_horz
fi

if [[ `echo ${winState} | grep "_NET_WM_STATE_MAXIMIZED_VERT"` != "" ]]
then
maxV=1
wmctrl -i -r ${activeWinId} -b remove,maximized_vert
fi

# move window (finally)
wmctrl -i -r ${activeWinId} -e 0,${xPos},-1,-1,-1

# restore maximization
((${maxV})) && wmctrl -i -r ${activeWinId} -b add,maximized_vert
((${maxH})) && wmctrl -i -r ${activeWinId} -b add,maximized_horz

# raise window (seems to be necessary sometimes)
wmctrl -i -a ${activeWinId}

# and bye
exit 0

2009年5月12日星期二

使用gcc 4.3编译某些程序的出错问题解决

今天在ubuntu 9.04上编译sphinx的中文支持版本csft, 发现编译出错, mmseg出错, 提示找不到strncmp函数没有定义, google了一下才知道是gcc 4.3的问题, 为了加快编译速度, 那些常用的函数都必须显示包含了, 修改出错的文件加上对cstring的引用问题解决, 另外编译csft的时候, 会提示mmseg的一个头文件出错, 也必须在头文件中做类似修改, 下面是一个移植指引.
如果你编译的程序没有遵从这样的移植指引, 那么你就不得不自己去修改一下程序了.

2009年4月24日星期五

ubuntu 9.04试用手记

我的显卡是ATI Radeon HD3600 Series.

ubuntu9.04昨天正式发布,了解到ubuntu 9.04上使用xorg-server 1.6, 这点和Arch的配置相同,由于之前在Arch上ATI显卡的问题,所以不甘心的想在ubuntu 9.04上试一下,是否是我配置Arch的功力不够,还是确实在软件方面有问题。

Desktop CD启动计算机的结果是双屏只有一个点亮,安装fglrx驱动之后,提示不能插入fglrx模块,这是由于和已经载入的radeon冲突造成的,但是desktop CD不是那么容易听你调摆的,当手工停用gdm之后,想手工卸载radeon模块,加载fglrx模块,系统居然死了,所以这让我狠下心来把以前装arch的分区拿来装这个9.04了,当然把arch打了个包备份了,防止要回来。

首先是顺便使用desktop cd安装,发现desktop cd硬盘安装时,它始终提示有磁盘分区挂载了,确实也是挂载了,但是只要安装的分区不是放iso的分区应该就没有问题,可是desktop cd还是在那提示,于是只有再下载了一个alternative cd了。安装成功。

安装私有驱动之后,光重启X是不行的,要么就自己把gdm的服务停掉,然后手工卸载radeon模块,然后自己加载fglrx模块,所以干脆重启好了。

但是重启之后,启动X故障,键盘都不响应,也退不出来,只有重启了,在这之前学聪明了,把gdm服务停掉了,在测试的时候使用startx来启动X。在xorg.conf serverFlags节中加上DontZap为false的配置,这样就可以使用Ctrl+Alt+Delete关闭X了。

重启之后才发现刚刚可能不是启动故障,而是使用fglrx驱动造成X CPU占用100%,所以需要很久才能启动起来,在查资料的时候,发现了ubuntu关于这个问题的讨论。从文中貌似到了现在fglrx已经可以和xorg-server-1.6合用了,但是我这里的结果还是不行,另外也了解到了-ati驱动中已经加入了对ATI r6xx芯片的支持,也许这个驱动可以呢?于是卸载了fglrx驱动,改了xorg.conf, 使用开源驱动。

使用开源驱动默认只点亮了一个显示器,比如我只点亮了左边的显示器,这个时候,如果使用xrandr或者gnome-display-properties调整,会造成左边(主)显示器,显示整个虚拟桌面的右边,于是都没有办法点到菜单了。找到了开源ati驱动的网页,这个网页上的内容值得一读,另外关于双屏的设置,这个网页中所提到的文章应该好好读一下。由于xrandr是比较新的东西,以前做双显我了解到都是在xorg.conf中来作,并且aticonfig也是这么来做的,复制Device, Screen, Monitor节,然后在ServerLayout中配置两个屏幕的关系,但是这样做,在现在的xorg中,搭配ati驱动是会造成xorg不能启动的。我照着xrandr的how to实验xrandr的命令才后然发现下面的指令:

xrandr --output DVI-1 --mode 1280x1024 --rate 75

这样才点亮了右边的显示器,也才让我看到了在ubuntu 9.04下配置双显示器的可能性。
如果要连接在DVI-1上的显示器在主显示器的右边,使用下面的指令:

xrandr --output DVI-1 --right-of DVI-0

如果xrandr报错,提示屏幕大小不对,那么需要检查一下xorg.conf中关于虚拟屏幕的设置,比如我两个17的显示器,每个分辨率为1280x1024,那么虚拟屏幕大小至少应为2560x1024,我那时在arch上配置不成功,它提示屏幕最大只支持1280x1280,我曾经怀疑是开源radeon驱动仅仅可以支持到此大小,所以一度放弃了,但是也没有在xorg ati驱动的页面上找到此限制,所以才决定今天再试一下的。
但是很有意思的是,在ubuntu 8.10下,fglrx私有驱动工作得非常好,所以没有那么多限制了,直接使用ATI catalyst contrl center配置好就可以了,管它什么VitualScreen的设置!

一般的how to都会说要把xrandr的命令做到.xinirc,或者Xsession中去,但是ubuntu不用那么麻烦,使用gnome-display-properties改双屏设置之后,会在$HOME/.config下生成一个monitors.xml文件,里面保存了显示器的分辨率,相互关系等信息,在这方面ubuntu这是做得不错!

使用开源驱动,对于r6xx以上的显卡,3D支持还没有,性能也不佳,所以桌面效果就不能开了;否则就要等哪天fglrx驱动和xorg-server-1.6可以完美合作了。

看来我还是继续使用ubuntu 8.10好了!显卡支持好,偶尔还能打下Nexuiz呢!

2009年4月22日星期三

使用vim开发python的quickfix方案

这个问题用google一搜就能看到很普遍的一种做法, 但是我认为不对的设置方法:
在vimrc中设置:

autocmd FileType python set makeprg=python\ %
autocmd FileType python set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m

对于vim设置, 我并不是特别熟悉, 所以我也照抄了上面的设置, 使用一下这个设置就知道了, 如果你的python脚本中出错了, 那么quickfix会把你定位到错误堆栈的最高点, 但是在python中错误信息是most recent call last, 所以quickfix捕获到错误实际上是函数调用的顶端, 而在此并非你的代码真正错误的地方, 加入你的代码比较长的话, 那么实际上还会被mislead,然后你再傻傻的去找你的错误, 而且上面的设置把整个错误堆栈下面的信息吞掉了, 要找错误根本还不好找.

这个问题一直没有体会到,直到最近使用wxPython开发, 才知道没有一个好的quickfix是多么的痛苦, 所以下定决心要解决, 花了一个下午加一个晚上, 下面是我的心得.

从上面的分析可以想到最直接的办法, 修改errorformat, 让quickfix可以捕获错误堆栈中所有的内容, 然后用:cl查看, 用:clast定位到实际的错误处, 这个方案再vim站点上有, 可以看一下,不过仍然非常麻烦, 而且用wxPython编程时, 有时会包wxPython lib中的错误, 你就会被定位到lib中,而不是你在你的源代码中出错的地方.

方法二: 借助万能的google找到了别人的一个解决方案:
这个解决方案的核心思想是把python的error message逆转过来, 那么就能让quickfix默认停到第一条出错处, 不过这个解决方案值得改进的地方我认为有两个, 第一, 要能处理当你的源文件没有错误时,防止那个efm_filer.py出错, 应该对errors进行判断, 列表非空才调用pop方法, 第二, 它仍然没有解决在上个方案中我说的在wxPython编程中会被定位到类库中的情况, 也需要进行判断, 只有在当前编辑文件中找到的错误才是我们需要定位的错误. 下面是我改进之后的
efm_filter.py源代码:

#!/usr/bin/env python

import sys
import string
import re

errors = sys.stdin.readlines()

#find current filename, only errors
#in current file will be considered as *true* errors
current_file = None

for error in errors:
m = re.search("""^\s+File\s+"([^"]+)".+""", error)
if m is not None:
current_file = m.group(1)
# print current_file #for testing
break
if len(errors) > 0:
message = errors.pop()[:-1]
errors.reverse()

for error in errors:
if string.find(error, ' File \"%s\"' % current_file) == 0:
print error[:-1] + ", " + message
message = "Traceback"

为了避免上面的链接失效, 我把在compiler/python.vim中的设置贴过来

" python.vim
if exists("current_compiler")
finish
endif
let current_compiler = "python"

setlocal makeprg=python\ %
setlocal shellpipe=2>&1\ \|\ ~/.vim/tools/efm_filter.py\ \|\ tee
setlocal errorformat=\ \ File\ \"%f\"\\,\ line\ %l\\,\ in\ %*[^\\,]\\,\ %m


另外, 在python.vim中, 它说可以改写efm_filter.py,让其将它得到的输入直接输出, 处理后的输出写到vim quickfix临时文件中 (这个临时文件是vim传递的), 这样做的好处是可以在错误信息中看到熟悉的python错误信息, 又可以让quickfix捕获到准确的出错位置, 这个改写很容易,这里就不贴了, 感兴趣的可以试一下.

从python.vim中可以看到, shellpipe中用到了管道符号, 这是*nix系统下才有的概念, 在windows不能使用, 所以上面的解决方案仅仅适合于*nix系统的, 如果你的主要工作环境是Linux, 那么上面的方案非常不错了.

在windows下我也用gvim做编程工作, 那么在windows下如何解决呢? 我的方案是使用一个python脚本调用python解释器,然后做进一步的处理, 这样也许在速度上有点影响, 但是在windows系统上测试使用效果还不错. 改写上面我贴出的efm_filter.py, 你可以重新命名为pymake.py, 把从标准输入流读取错误信息的部分改为如下代码

from subprocess import Popen, PIPE
from cStringIO import StringIO

if len(sys.argv) < 1:
sys.exit(0)
pysrc = sys.argv[1]
output = Popen(["python", pysrc], stderr=PIPE).communicate()[1]
buf = StringIO()
buf.write(output)
buf.seek(0) #move pointer to the start of the file
errors = buf.readlines() #take place sys.stdin.readlines()
buf.close()

把pymake.py放置到PATH中, 然后改vimrc, 指定使用pymake编译:
autocmd FileType python set makeprg=pymake.py\ %
autocmd FileType python set efm=\ \ File\ \"%f\"\\,\ line\ %l\\,\ in\ %*[^\\,]\\,\ %m
当然你要愿意, 通过改python.vim的compiler设置也可以, 不过我认为, 既然不涉及到对其他配置文件的改变, 改这里更加直接.

当然上面的解决方法也同时适合Linux, 如果你同时在windows和Linux下面开发, 需要共享VIM配置的话, 最后一个方案看起来是最好的, 对于速度方面的影响, 一般配置的电脑是感觉不到的.

2009年4月20日星期一

说说ubuntu的一些设定

今天又花了一点时间,仿照着ubuntu的方法试图配置下Arch,可是显卡还是不行,另外才发现使用arch时显卡的glxgear测定值只有1200左右而用ubuntu有5000多,并且Arch下有拖影和延迟,所以决定完全换到ubuntu上来,之前是用的装arch那个盘上的grub,现在想用ubuntu的了。在安装ubuntu之后,如果没有设定grub,那么/boot下是没有grub目录的,要先grub-install /dev/sdaX一下(boot partition). 我开始以为只要在grub shell中写 root (hd0, X), setup (hd0)即可,结果setup提示没有找到stage1. 其实menu.lst可以完全从arch那边复制过来,但是我记得debian,ubuntu的menu.lst有些特别它可以在内核升级时自动的修改menu.lst,并且选项都可以按照你在注释中写的体现出来,可是不知道该怎么生成阿,看了下grub安装包的内容,看到有一个update-grub命令,猜想应该是这个了,果然它可以在没有menu.lst时自动生成一个。在设定智能化方面,debian/ubuntu可是非常不错的。

另外,usplash改分辨率时,光在usplash.conf中改是不行的,它只能影响到重启时的splash,而要在内核启动时就显示,那么还必须使用update-initramfs声称一个新的initrd.img才行!

2009年4月19日星期日

逃回到Ubuntu

在Arch下面为了显卡的问题困扰了很久,升级到了xorg-server1.6之后,根本就是双屏用不了了,而不谈透明效果的问题!看到catalyst-9.4版本时使用了ubuntu中的catalyst-installer-8.60版本,我突然想,像ubuntu这样关心用户体验并且有商业公司支持的linux发行版本这个问题应该考虑了吧?下载了ubuntu8.10的desktop cd,放到硬盘里面,搞了个硬盘启动,看了下,ubuntu下开启私有驱动完全没有问题!我才知道我从换了电脑以来,我是对于ATI显卡误会太多,不是Linux不行,而是发行版本的问题,从这点来看,ubuntu的优势体现出来了,我配置ArchLinux到现在零零总总的业余时间不下一个星期了!想当年,刚从ubuntu下转到arch下是多么的兴奋,想到可以像gentoo那样滚动升级,有简单的PKGBUILD,很多大软件还不用自己编译!后来配置的时候参照了很多ubuntu的东西,当时可是深深体会了ubuntu的用户体验了,之前我总以为Linux发行版本之间的区别很小,都是用一样的kernel,都是用一样的开源软件,那么能有多大区别,我当时所理解的Linux发行版的定义其实就是一套自己软件包管理系统和一些定制而已,而没有体会到定制用所包含的玄机:对于用户看见的定制是对系统的一些初始设定,这个设定适合于大部分的人,如果你不是有特别的偏好,使用其提供的已经足够;对于用户不可见的定制则是很多发行版独有的patch,虽然这些patch是公开的,但是不是每个发行版本都能用上考虑到的。所以Linux发行版本现在我理解不是一些自由软件的简单集合,而应该是优选的一系列软件并且通过系统的测试的软件产品!用了将近半年的arch linux之后,总结下来,升级之后,停下来配置系统的经历有好几次,有几次是udev,hal的问题,然后换了电脑之后,显卡的问题也一直困扰着我,arch确实给了用户很大的自由和可定制性,可是我感觉arch的很多方面测试不够,软件包提供和更新不够仔细,这可能是因为开发者少的原因吧,对比gentoo,gentoo尽管是通过源代码编译需要花费很多时间,但是配置基本上都是自动化进行的,软件版本的的管理也更加的灵活,而arch这方面似乎做得不够,不过总体看来Arch仍然不失为一个优秀的Linux发行版本,其非常简单和灵活,只是我现在的硬件环境不合适罢了。这些问题让我甚至从Linux世界逃离到Windows,不过这样的经历之后,特别是看过了《productive programer》之后,把windows好好配置了一番,再加上gvim,linux下的命令行工具的windows移植版本,发现自己慢慢喜欢上windows xp了,再加上偶尔电驴,迅雷一下,windows也用得非常舒服。而且在公司,用的是正版的windows xp,也没有心理上的障碍了,再者我觉得微软的开源策略慢慢开放起来,VS2008很好用,提供的框架还是免费的,DotNet3.5编程新功能让人欣喜,ASP.NET MVC也对胃口,eclipse在windows上更加的漂亮和迅速,开源的dotnet library也慢慢多了起来,这些都让我对windows更加喜欢了。

时间到了2009年,Linux 64位操作系统已经非常成熟了,我所关心的JDK, eclipse, flash,多媒体codecs, 在64位操作系统下都表现完美了, 如果使用ubuntu的AMD 64bit版本,那么就不存在arch i686优化对于ubuntu i386的速度优势了,我想可以尝试下Ubuntu 64bit了。安装之后体会也确实如此,不知道是计算机硬件升级带来的感觉还是真的64bit操作系统的速度优势,感觉操作流畅了很多。

值得一提的是ubuntu对于双屏的支持也非常好,在8.10中由于xorg-server的自动侦测功能的加入,ubuntu的xorg.conf文件非常简洁,并且双屏配置可以通过xrandr动态配置,使用catalyst control center配置起来更是方便,所以很喜欢。不过仍然有一点遗憾的是gnome的窗口管理器,没有方便的窗口双屏间移动的功能,在windows下可以使用amd提供的驱动来达到虚拟桌面和窗口控制的功能,而Linux下有现成的虚拟桌面功能,但是窗口切换目前只有fvwm很方便,可以配置快捷键,要是gnome的窗口管理器也可以做到该多好阿,使用fvwm好是好,但是从整体表现上来看,如果不考虑性能,gnome还是要易用一些,fvwm则要自己配置很多。看看有没有时间自己找找能否在gnome的metacity窗口管理器中增加这样的功能,最好是同时在窗口的右键菜单中增加还有就是快捷键支持。尽管fvwm可以和gnome一起使用,但是使用起来感觉不伦不类的,不舒服,所以试着要patch一下metacity了

再好好用ubuntu吧!把配置Linux的时间变成生产力!

2009年4月9日星期四

fvwm使用双显示器

换了机器之后, 由于显卡的问题, 基本就没有使用Linux了, 今天没有什么心情编程,突然想把自己的机器配置一下,由于最近ArchLinux的源速度也很慢,我也懒得升级, 甚至想把它降级到163的源对应的版本上去,由于显卡让我觉得很不爽,我甚至在考虑是不是使用Arch在日常工作中是否合适, 它让我花了不少时间去配置什么的, 也许用ubuntu更好, 并且我如果使用AMD64的版本, 就不用担心ubuntu i386版本只是为了i386优化,而不像Arch 特别为i686优化那样的,ubuntu应该也可以高性能的使用, 就算是臃肿, 那么如果换来易用性,那么也是值得的。

在Arch上使用Fvwm已经有一段时间了, 觉得也挺方便,但是换完电脑还有使用双显卡之后还没有怎么使用过,今天也好好的弄了一下, 把xorg. xinerama打开, 达到了那种big desktop的效果, 然后从vladstudio那下载了免费的双显示器的桌面壁纸,fvwm使用双显示器已经非常舒服了。后来看fvwm的文档,才发现fvwm对于multi-screen有特别的支持,它有MoveToScreen的指令, 我把这些绑定到快捷键上, 就像在windows上使用ATI的虚拟桌面一样, 用Alt+F1, Alt+F2控制屏幕选定窗口移动到屏幕1和屏幕2,然后用把9个虚拟桌面分别绑定在小数字键盘的九个键上,操作起来异常顺畅,而且没有使用windows切换虚拟桌面时窗口最小化恢复的延迟现象,所以fvwm使用双屏幕非常的舒服啊!

然而还是有些不满的事情,尽管ATI的catalyst Linux驱动已经更新到9.3版本了,但是还是不支持透明和compiz,以前用2.6.28内核和9.2版本驱动的时候开xcompmgr,窗口支离破碎;compiz反应缓慢;现在用2.6.29内核,9.3版本驱动时干脆报错No composite extension, google遍寻网络也没有一个有效的解决方法;如果使用开源的radeonhd驱动,它对于r6xx系列的显卡的2D加速还支持得不好,虽然透明可以打开,但是双屏幕配置就不行了;就在几个小时前,radeonhd1.2.5发布,在此版本中开始支持r6xx系列显卡, 也就是我的radeonhd 6350显卡的支持已经加入了,Arch源目前没有响应,自己修改PKGBUILD也不能编译成功,看来只有再等几天了,希望有可以完全的配置好。

我不知道自己的显卡是否目前在Linux世界已经可以支持得很好了,看到ArchLinux的catalyst 9.4版驱动开始使用ubuntu源中间的fglrx-installer-8.60来取得从官方下载的installer, 我其实一早就在怀疑ubuntu下面是否可以完美使用compiz和xcompmgr了,后来晚上有时间搞了个LiveCD用了一下,启动私有驱动之后, 居然可以, 看了一下catalyst版本, 8.20!难道老版本显卡驱动反而支持得更好?

要是不能解决, 决定换到ubuntu AMD64了,用Arch虽然觉得可以随心所欲, 但是用ubuntu觉得更省心!

2009年4月4日星期六

在ubuntu dapper上更新subversion

ubuntu 6.06上的subversion是1.3.2版本的, 服务器上的subversion旧就旧点, 本来也没有什么问题,最近用mercurial了,心里想要是能把mercurial和subversion结合起来多好阿,在自己电脑上, 笔记本电脑上, 使用u盘可以开发时可以小步提交到本地, 到了公司再提交到subversion服务器,以前我都是带个电脑过来直接同步代码到笔记本电脑上去, 省得把个u盘倒来倒去。
以前从网上看到mercurial和subversion结合的方法, 看到那长段的说明文字,就感觉到太复杂了, 而hgsubversion目前还不成熟; 昨天从网上看到有人说现在hgsubversion可以用了, 于是想试一下。
编译安装好mercurial之后, 也配置好了hgsubversion, 连接到客户段, 发现svnclone下来没有东西, 而hgsubversion提示说服务器subversion太老, 小于1.4, 心想是不是subversion太老的缘故, 后面才知道不是这个原因(其实是因为我用hgsubversion去clone svn的trunk分支了, 而hgsubversion要求版本库的布局必须是branches, tags, trunk, svn clone也必须针对根目录来做, 这些是后面偶然发现总结的),于是决定要升级subversion服务器, 这一个决定便是我接下来24小时痛苦的开始;
上到subversion的主页, 看到1.6版本近日刚刚稳定放出, 心想, 既然要更新就更新到最新版本吧, 根据INSTALL说明, 下载了源代码包还有deps包,编译安装成功,客户段一连发现还是提示版本库过老,以为必须服务器上的版本库更新才行, 所以就挑了一个小点的代码仓库进行了版本库升级操作,这么一搞, 客户端居然打不开版本库了,这时庆幸自己只是用了一个很小的版本库做的实验。停下来想了一下, 通过svnserve访问没有问题, 才想到我是通过apache的mod_dav_svn访问代码库的, 那么mod_dav_svn可能没有更新, 在编译后的目录中找了一下,果然没有,又仔细看了INSTALL说明, 才发现要apx在路径中才可以自动编译mod_dav_svn和mod_authz_svn模块,用aptitude查了一下, 发现apache2-dev没有安装,安装之后再编译configure时提示说apache和APR版本不兼容, 好好看了一下subversion-deps中的内容, 发现其中带了apr和apr-utils依赖,是不是和系统中那些相关dev软件包冲突呢? 重新解压了一个subversion源码包,这次不解压依赖,这个时候configure找到了系统中的apr, 版本为0.9.7, 但是还是提示不兼容, 比较晕倒, 网上一顿狂搜, 找到一个老外的博客说安装1.4.3成功了,根据他博客中说的,我总怀疑我有那个依赖没有安装, 找到ubutnu包查询的网站, 好好看了下还是不行, 这样左搞右搞从下午搞到晚上10点还没搞定, 下午到了办公室继续尝试, 突然想到是不是版本过高?于是下了一个1.5.6的版本来试了一下, 居然configure成功了!另外需要注意的是, 如果需要ssl支持, 那么需要在deps包中取得neon放到subversion源代码包中,系统自带的neon版本过老, subversion1.5要求neon>2.8. 这样成功之后, hgsubversion可以了,不给出警告了,可是有的库可以, 有的库不行? 不行的就是我直接check某个子目录的! 并且对我其中的一个版本库, 也是最重要的版本库, svnclone的时候报错,提示找不到文件。 这样忙忙碌碌搞了两天, 最终还是达不到我的要求,比较懊恼自己浪费了时间样, 不过倒是得到了subversion编译安装的经验, 写下来,给有同样需求的同学参考下。

说说163的源

cn99的源已经当掉很久了,这严重影响我用ubuntu的心情,想当年用cn99的源动辄上M的更新速度那就一个爽阿, 在公网了, 不比当年在教育网内用清华大学的源, 有CN99这种源真是我们这些用Linux的人的福气阿。
昨天更新服务器的subversion,试了一下ubuntu.cn99.com, 居然能上, ping一下, DNS解析居然指到了mirrors.163.com, 速度可真快, 可是ubuntu dapper用不了, 很多ubuntu dist没有i386架构的~
于是想想自己电脑上的Arch已经好久没有更新了, 163的镜像上主要的发行版都有了, arch也不例外, 把电脑上的源改到163试了一下, 才发现滞后了很多, 上面的包比我自己电脑上在两三个月前的还旧!看来不能用了,要是163的源更新再及时点就好了!

2009年4月2日星期四

关于VIM使用的惊喜发现

在windows下用官方的gvim有一点不爽的地方, 就是用python2.5不能自动补全, 通过看:version看python的编译参数可以知道, 官方的vim是针对python24编译的, 我今天下班的时候, 决定我必须要解决一下这个问题, 由于显卡的问题, 在桌面电脑上, 我已经很长时间不使用Linux了, 所以在windows上这个问题必须解决, 在google上一顿搜索之后, 知道我必须重新编译gvim或者下载别人编译的vim版本, 但是vim它是要针对多种脚本语言(多个interface)编译的, 那么我暂时没有安装的那些东西我肯定编译不了, 所以如果有别人编译的东西就非常好了, 在google上知道有一个cream的项目, 下载了之后, 发现安装包的文字我不认识, 非英文, 所以就不敢往下继续了. 后来在vim官方网站的下载页面上看到了alternate distribution, 看到另外一个链接"Yongwei's build", (吴咏伟), 介绍说是用了比较新的python, ruby, tcl interface, 这就正是我需要的, 遂下载使用了, 觉得非常好用, 省去了我自己编译的过程; 另外吴咏伟页面上的一篇VIM实用技术写得非常好, 总结了其vim的点滴经验, 在这里强烈推荐一下.
另外, 在这篇文章里, 有一个解决putty中文问题的方案, 解决了一个困扰我很久的putty中文显示和输入的问题, 我曾经在google上搜了很多, 很多人都说可以, 可以我好像没有成功过. 实际上只要保证了远程服务器的encoding为UTF-8, 不管你是zh_CN.UTF-8, 还是en_US.UTF-8; 而putty在连接之前设置encoding为UTF-8, 还有选中treat CJK ambiguous characters as wide, 然后连接, 就可以显示和输入中文了, 解决了这些问题之后, 我完全可以在windows下, 然后用putty连到服务器上去写程序和管理了.

2009年2月19日星期四

ArchLinux, hal-0.5.11-7造成gnome不能正常挂载NTF分区和USB

系统升级之后,发现在“位置”中可以显示各个分区,但是不能使用gnome挂载NTFS分区,U盘也不能自动挂载了,看了一下升级日志
,发现hal从0.5.11-4升级到0.5.11-7了,因为之前遇到过类似的问题,猜想是hal的问题,于是编译安装了老版的hal问题解决。另外新的networkmanager依赖于hal-0.5.11-7,所以networkmanager也不能用了,不过感觉也没有啥,只是少了个桌面Applet而已。。

顺便看了一下hal改变, 由于两个hal只是小版本号的问题,也就是说上游源码是没有变化的,问题应该出在Arch Linux的打包者的patch上,看了一下PKGBUILD,发现多了几个补丁,也许是它们造成的问题吧,涉及到源代码的改变,所以暂时算了,用老版本好了。

补充: 貌似是PolicyKit的问题,授权了就是挂不了。。

2009年1月18日星期日

再说ATI显卡

前面两天发了一下牢骚。。。因为用过三台电脑了,一直用Nidia的显卡,所以用Nidia的卡在Linux下用了7年了,用Nidia的卡也没有出过什么问题,所以对于ATI的卡评价可能不公平。
好好查了一下资料,其实还是觉得ATI卡不错的,至少势头是好的,AMD/ATI公布了技术参数,所以开源的xf86-video-radeonhd的开发进度很快,这是X.org上wiki的介绍,另外对ATI显卡的一个分类学习了一下,开始了解自己的显卡,这里是一份资料
我的ASUS EAH 3650是使用了ATI HD3650的芯片,从上面的资料看,它实际上是RV635这个类的:
* RV635: Radeon HD 3650, HD 3670
从X.org wiki上看到的内容,xf86-video-radeonhd从1.2.0的时候开始支持RV635的显卡,但是目前的2D加速还是仅仅限于R5xx (including RS6xx),也就是Radeon X1800; FireGL V5300, V7200, V7300, V7350,Xpress 1200, Xpress 1250系列芯片的显卡,所以目前2D加速在我的显卡上还是不支持的,需要继续等待了。3D支持在各个系列上都还是空,除非是另外的那个ati开源驱动,在老的芯片上实现了3D加速。如果我用开源的radeonhd驱动,那么就不能玩3D游戏了,比如nexuiz,不过我也不经常玩,所以无所谓;还有就是compiz白屏,我基本上用fvwm用得比较多,所以也无所谓了。但是如果用官方闭源驱动,如果开了透明效果,比如compiz或者xcompmgr(在fvwm中我使用使窗口透明,更加漂亮)就使用不了了,窗口反应特别迟钝,所以不能用。
目前有两个选择了,要么不玩nexuiz,要么不用xcompmgr。这样,我用Linux工作其实还是不影响的。但是上一篇说的使用windows xp来做开发工作,我确实想尝试一下,不知道在windows上用虚拟桌面软件的效果如何,得适用一下,习惯多屏工作了,也要学习一下windows是否有窗口控制的快捷键,我用fvwm快捷键控制窗口,移动,居中,最大最小化可以极大提高我的工作效率,但是不知道windows xp上能不能这么做,要研究一下。

2009年1月14日星期三

centos-java6-tomcat5配置

在上个月的一篇博客里面提到要更新服务器,最后定到两个候选对象,debian和Centos.
后来装了一下CentOs之后觉得它作为服务器来说,确实不错,它的安装是最快的。其实作为一个服务器来说,很多东西是必须而且不要自己再去定义的,比如SSHD,iptables等等,如果用debian,那么这些东西还要自己安装,在源慢的情况之下,那么装debian就比较费时间了。虽然它有DVD下载,但是它包含的软件包实在太多,有三张DVD,也不知道自己在服务器中用到那张的;而Centos专注于服务器应用,它那一张DVD,基本就能应付了。所以从安装方面来讲,Centos还是比较好的。
另外,Centos的图形配置工具也很值得推荐,比如system-config-securitylevel等等.
对于centos5,有一点不爽就是Java,它自带的Java是GCJ1.4.2,这个肯定是要换的。很多年没有用redhat的东西,当时用redhat的时候都还没有YUM呢,所以也都忘了有jpackage这个东西,对于在redhat之类的Linux上用Java,jpackage这个东西还是不能少的,关于Java的设定,在CentOS的wiki上有一个howto,google到了,自己找到并且编译了sun-jdk-1.6.0,才满足了我的需要,当然,如果愿意直接用sun提供的self-extrac安装包也可以,我原来是以为用jpackage源rpm包自己重新编译的能够解决一些依赖问题,但是不知道为什么,tomcat5还是依赖java-gcj-1.4.2,这让我非常不爽,不知道我用CentOs的经验太少还是怎么的。所以干脆也就不用它的tomcat5的包了,改用直接下载的tomcat5的tar包。其实对于用做服务器,我尽量用服务器自己带的软件包,而不想自己加的软件包更不用提自己手工编译了,因为这样涉及到很多配置的问题。而对于tomcat的这个也是如此,自己下载tomcat包的一个优点是系统会很干净,就加一个第三方包就可以了,也没有依赖的问题,唯一不爽的就是它的自自动。关于它的自启动,有这样几种方法:
(1) 直接把start.sh放到rc.local里面,这样是最省事的方法,但是带来的问题就是是用root启动的,并且不能用启动脚本灵活的控制其起停。
(2) 自己编写脚本,在start,stop函数中调用start.sh,stop.sh来控制tomcat起停,这样也很简单,但是也存在(1)中的问题,并且没有pid创建等等,故不能实现status的功能,可以做到灵活控制启动停止了,但是还是没有做到用non-root启动的目的。在网上找的脚本编写得并不好,由于启动tomcat需要比较多的延时,所以如果不注意控制,很可能发现自动不了,或者不能重启,停止了java还是不退出等等问题。
(3) 可以把catalina.sh放到init.d里面,因为catalina.sh本身就有start,stop之类的调用方法了,当然,为了适应chconfig的要求,这个脚本要做相应的修改,添加用数字表示的启动停止顺序等,缺点同(2)
(4) 使用tomcat带的jsvc,这样可以做到non-root用户,启动到特权端口上,这个是很多人的选择,并且jsvc里面带了启动脚本实例。
(5) 使用su - user -c script方法以其他用户运行tomcat的catalina.sh,这样可以以non-root用户运行tomcat,但是不能使用特权端口。这个也需要自己编写脚本来实现自启动,为这个我专门花了两个小时把CentOS自带的tomcat5的脚本改到合适单独安装tomcat的情况,经过测试不会遇到2的问题,CentOS这个启动脚本考虑问题很周全,建议自己安装tomcat的用户根据需要自己改改。可惜blogger不能贴附件,否则我就传上来。我的需要是使用nginx做前端的反向代理,所以方案5适合我的需要。

另外,经过一天的学习和配置,对CentOS理解越多,还是觉得它在服务器环境来讲确实很不错的,完全没有我担心额外软件包的问题。关于源:mirror.be10.com这个源比较快,在cn99源down掉了之后,比我遇到的任何debian,ubuntu源都快。源也是我挑选发行版的一个重要原因。还有就是epel这个comunity的rpm库也很重要,我原来以为用nginx之类的不包含在centOS发行中的软件包需要自己编译的,google了一下之后,发现还有epel这样一个软件库,由于centos和rhel二进制兼容,因此就不用担心软件包的问题了,基本上需要的软件包在epel里面都有。安装和使用也特别简单。
tomcat5启动脚本:
#!/bin/bash
#
# tomcat5 This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat5
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Description: Release implementation for Servlet 2.4 and JSP 2.0
# Short-Description: start and stop tomcat
### END INIT INFO
#
# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot
# - heavily rewritten by Deepak Bhole and Jason Corley
#

# commented out until the RHEL and FC daemon functions converge
# Source the function library
#if [ -r "/etc/rc.d/init.d/functions" ]; then
#. /etc/rc.d/init.d/functions
#fi

NAME="$(basename $0)"
unset ISBOOT
if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then
NAME="${NAME:3}"
ISBOOT="1"
fi

# For SELinux we need to use 'runuser' not 'su'
if [ -x "/sbin/runuser" ]; then
SU="/sbin/runuser"
else
SU="su"
fi

#tomcat setting
TOMCAT_CFG="/etc/tomcat/tomcat5.conf"
if [ -r "$TOMCAT_CFG" ]; then
. ${TOMCAT_CFG}
fi

SHUTDOWN_WAIT=30
# Define which connector port to use
CONNECTOR_PORT="${CONNECTOR_PORT:-8080}"

# Path to the tomcat launch script
TOMCAT_SCRIPT="${CATALINA_HOME}/bin/catalina.sh"

# Tomcat program name
TOMCAT_PROG="$NAME"

# Define the tomcat username
TOMCAT_USER="${TOMCAT_USER:-tomcat}"

# Define the tomcat log file
TOMCAT_LOG="${TOMCAT_LOG:-/var/log/tomcat/catalina.out}"

RETVAL="0"

# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function checkpid() {
local i
for i in $* ; do
if [ -d "/proc/${i}" ]; then
return 0
fi
done
return 1
}

# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function echo_failure() {
echo -en "\\033[60G"
echo -n "[ "
echo -n $"FAILED"
echo -n " ]"
echo -ne "\r"
return 1
}

# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function echo_success() {
echo -en "\\033[60G"
echo -n "[ "
echo -n $"OK"
echo -n " ]"
echo -ne "\r"
return 0
}

function parseOptions() {
options=""
#if GLOBAL VARIABLE is set, TOMCAT_CFG is optional
if [ -r "${TOMCAT_CFG}" ]; then
options="$options $(
awk '!/^#/ && !/^$/ { ORS=" "; print "export ", $0, ";" }' \
$TOMCAT_CFG
)"
fi
TOMCAT_SCRIPT="$options $TOMCAT_SCRIPT"
}

# See how we were called.
function start() {
echo -n "Starting ${TOMCAT_PROG}: "
if [ -f "/var/lock/subsys/${NAME}" ] ; then
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
if checkpid $kpid 2>&1; then
echo "$NAME process already running"
return -1
else
echo "lock file found but no process running for"
echo "pid $kpid, continuing"
fi
fi
fi
export CATALINA_PID="/var/run/${NAME}.pid"
touch $CATALINA_PID
chown ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_PID
$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT start" >> $TOMCAT_LOG 2>&1
#$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT run" #for testing
RETVAL="$?"
if [ "$RETVAL" -eq 0 ]; then
echo_success
touch /var/lock/subsys/${NAME}
else
echo_failure
fi
echo
return $RETVAL
}

function status() {
RETVAL="1"
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
if checkpid $kpid 2>&1; then
echo "$0 is already running (${kpid})"
RETVAL="0"
else
echo "lock file found but no process running for pid $kpid"
fi
else
pid="$(pgrep -u tomcat java)"
if [ -n "$pid" ]; then
echo "$0 running (${pid}) but no PID file exists"
RETVAL="0"
else
echo "$0 is stopped"
fi
fi
return $RETVAL
}

function stop() {
local STOP_VERBOSE="false"
echo -n "Stopping $TOMCAT_PROG: "
if [ -f "/var/lock/subsys/${NAME}" ]; then
$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT stop" >> $TOMCAT_LOG 2>&1
RETVAL="$?"
if [ "$RETVAL" -eq "0" ]; then
count="0"
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] || \
[ "$count" -gt "$SHUTDOWN_WAIT" ]; do
if [ "$STOP_VERBOSE" = "true" ]; then
echo -n -e "\nwaiting for processes $kpid to exit"
fi
sleep 1
let count="${count}+1"
done
if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then
if [ "$STOP_VERBOSE" = "true" ]; then
echo -n -e "\nkilling processes which didn't stop"
echo -n -e "after "
echo -n "$SHUTDOWN_WAIT seconds"
fi
kill -9 $kpid
fi
echo_success
if [ "$count" -gt "0" ]; then
echo -n -e "\n"
fi
fi
rm -f /var/lock/subsys/$NAME /var/run/$NAME.pid
else
echo_failure
fi
fi
}


# See how we were called.
case "$1" in
start)
parseOptions
start
;;
stop)
parseOptions
stop
;;
restart)
parseOptions
stop
sleep 2
start
;;
condrestart)
if [ -f "/var/run/${NAME}.pid" ]; then
parseOptions
stop
start
fi
;;
status)
status
;;
version)
parseOptions
"${JAVA_HOME}/bin/java" \
-classpath "${CATALINA_HOME}/server/lib/catalina.jar" \
org.apache.catalina.util.ServerInfo
;;
*)
echo "Usage: $TOMCAT_PROG {start|stop|restart|condrestart|status|version}"
exit 1
esac

exit $RETVAL

2008年9月5日星期五

Freetds on Arch Linux

今天把一个在ubuntu服务器上运行得很好的报表程序拖回到我的Arch Linux上发现运行不了,pymssql报错,首先以为是pymssql的问题,重新编译了还是不行,怀疑是freetds的问题,以为是更新了gcc和glibc造成问题,遂重新编译了freetds,用tsql测试也不行。问题就应该是出在freetds上了.仔细看了freetds的文档,知道了freetds默认的协议版本是5.0,可以在编译时通过--with-tdsver指定,也可以通过freetds.conf或者环境变量$TDSVER设置。我连接的是sql server 2000,TDSVER设置到8.0,果然好了。看来用Arch Linux还是等多动个心眼。

2008年9月4日星期四

注意Arch Linux服务的启动顺序

Arch Linux的启动脚本设计得非常简单,也很有意思,所有的配置在全部在rc.conf里面做了,在设置上没有传统Linux的启动分级的概念了,这点比gentoo还简化了,gentoo虽然做了简化,但也还分了boot和default。还有就是Arch Linux启动脚本的顺序需要你在rc.conf里面做好,它按照你在DAEMONS里面写的顺序启动,而不是像传统的Linux一样通过在脚本前面加数字前缀来决定启动顺序的,这点如果不注意的话容易造成问题。我们通常习惯一直在DEAMONS后面加下去,而不是自己知道这个顺序。我自己就由于添加了解服务CUPS放在GDM后面启动了,所以造成启动后,窗口上有个黑点去不掉,想来想去就是这点改动了,调了一下顺序就好了。所以以后千万要主义了,还好这些是没有关联的服务,对于有严格顺序的关联服务如果不注意就可能启动不了。

我是越来越喜欢这个Linux,从Ubuntu转过来,确实花了不少时间,很多的配置都是参照Ubutnu做的,比如字体配置,hal磁盘挂载,真是应了一句话“用Ubuntu的人用了Arch,才知道Arch比Ubuntu确实快不少;用Arch的人用Ubutnu,才知道Ubuntu帮我们做了多少不简单的事”。原来担心它的软件没有ubuntu库里面多,但是AUR里面基本上什么都包含了,不过很多没有跟随着更新,还好Arch的ABS机制很简单,所以自己修改一下PKGBUILD也就没有问题了。这里提几个我自己遇到的,配置打印机时,HP larserJet 1000要用到的foo2zjs,PKGBUILD中md5sum错了,要改了才能继续编译,splashy的依赖错了,要自己改到directfb-1.2,具体要改splashy.initcpio_install,还有一个zlib的问题,arch中libz.so放在/usr/lib/而不是/lib中,也需要在上面文件中改一下。

2008年8月31日星期日

Quick Arch Configuration Note

There are some steps to make Arch Linux work better for you:
----------------------------
#locale
(1) Edit /etc/locale.gen to enable the locales you need
(2) run locale-gen as root to generate locales
#fontconfig
(1) install the required TTF fonts
(2) edit /etc/fonts/local.conf, add your favorite settings
(3) edit java fontconfig setting in /opt/java/jre/lib/fontconfig.properties
#disk mount in GUI
add youself to the storage, optical group
#solve the Chinese problem of USB disk mount
add iocharset=utf8 in the gconf-/system/storage/default-options/vfat
#alsa config
(1) alsactl store to save the alsa setting
(2) add alsa to the rc.conf daemon section
#HAL configuration
#config HAL to only automount removable disks
#file /usr/share/hal/fdi/policy/10osvender/ignore-fixed-drivers.fdi
<device>
<match key="storage.hotpluggable" bool="false">
<match key="storage.removable" bool="false">
<merge key="storage.automount_enabled_hint" type="bool">false</merge>
</match>
</match>
</device>

2007年2月10日星期六

对update-grub的理解

硬盘被重新Fdisk过,但是记得分隔分区的扇区位置,重新建立分区表并不会影响系统的运行,也就是说分区还是跟以前一样的。
但是这个过程/dev/hda的序号号变了。比如以前linux根分区是/dev/hda8, 现在变成了/dev/hda6, 尽管在物理硬盘中是同一块区域没有变。
但是之后却发现安装自己编译的内核包之后,自动配置的menu.lst还是把启动项中的root设为了/dev/hda8,而不是/dev/hda6,要手动改到/dev/hda6才是
正确的,才可以启动。用dpkg-reconfigure效果也一样。由于南方电信的网络访问gentoo源的问题,所以从gentoo转来使用ubuntu,对debian(ubuntu)
的这种自动配置的机制不了解,有什么办法能让自动设置正确吗?是否这个reconfigure有个模板一样的东西存在,在第一次安装好系统之后,这个东西就定
了?上午google了很久找不到,下午继续研究这一问题,得到了答案。
 
原来之前想错了方向,原来总想可能deb包中有一个脚本会根据某个设置的情况来做此设置,但是实际的情况是这个postinst调用的就是update-grub,
#/etc/kernel-img.conf
do_symlinks = yes
relative_links = yes
do_bootloader = no
do_bootfloppy = no
do_initrd = yes
link_in_boot = no
postinst_hook = /sbin/update-grub #调用update-grub
postrm_hook = /sbin/update-grub
 
也就是说直接运行update-grub就可以自动的更新menu.lst设置。
而update-grub是根据什么来自动生成menu.lst呢?
答案很简单,但是容易让人忽略,实际上就是/boot/menu.lst,当menu.lst文件不存在时,update-grub将会生成一个新的menu.lst,但是可能不正确。
有则直接根据之前的menu.lst模板生成新的实际的menu.lst,老的进行备份。
 
所以要解决我提出来的情况,就是修改menu.lst模板就可以了,然后重新运行update-grub即可。修改menu.lst如下:
59 ## default kernel options
60 ## default kernel options for automagic boot options
61 ## If you want special options for specific kernels use kopt_x_y_z
62 ## where x.y.z is kernel version. Minor versions can be omitted.
63 ## e.g. kopt=root=/dev/hda1 ro
64 ## kopt_2_6_8=root=/dev/hdc1 ro
65 ## kopt_2_6_8_2_686=root=/dev/hdc2 ro
66 # kopt=root=UUID=a764e67f-e242-4d6e-b874-3f5ffcf30bfc ro
67 # kopt_2_6=root=/dev/hda6 ro
68
69 ## default grub root device
70 ## e.g. groot=(hd0,0)
71 # groot=(hd0,5)
改变以单个#的行中间的值即可,比如我改为了 kopt_2_6=root=/dev/hda6, groot=(hd0,5)
引申开去,如果要给内核加其他的启动选项,也可以加到这个模板当中,那么下次安装内核时,那些选项就不会被去掉了,比如vga=792等等内核参数。具体
的,请建menu.lst中间的注释

2007年2月7日星期三

Ubuntu终于认出两个CPU了

今天又开始在Linux下工作了,可以我的ubuntu一直是跑在386的模式下,让我很不舒服;但是没有办法,如果用686(generic)的内核,键盘和鼠标会死掉,一直也不知道什么原因。今天决定再来研究一下这个问题。先找了ubuntu下怎么编译内核的方法,看样子也只有重新编译内核才有得救,不过以前没有在ubuntu下做过。gentoo下简单阿,一个emerge就可以了,从网上找到了相关的资料,照着做了一下,发现debian(ubuntu)的这种make-kpkg的机制其实也挺好的。很简单。不过要注意的是,从软件库里面用apt-get等直接下来的源代码,往往不能编译成功,最好是下载kernel.org的内核,上一次编译内核不成功,也是因为用了软件库中间的内核源码。如果是从pool中通过浏览器等下载的该发行版支持的内核版本,那么直接用make-dpkg编译也是不行的,源码术当中的debian/control要做修改,偷懒的办法是直接删掉debian那个文件夹,让其在make-dpkg时自动生成,这样不会有多于信息,不会提示说control文件当中有重复的条目。

两条命令就可以完成内核的编译:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image
kernel_headers
之后完成内核的安装,用dpkg -i。

最后一个问题是nvidia的驱动,我安装好内核之后只能用xorg的nv驱动,效果不让人满意。不过能够用P4 CPU和SMP的选项编译成功,并且得到/proc/cpuinfo中有两个CPU的信息已经让我狂喜了。我一直担心这个问题。然而,看到一篇文章上直接用从nvidia网站上下来的驱动安装的方法,让我从执着于怎么从ubuntu的代码库中搞出能用的nvidia驱动的想法解脱了出来,我原来甚至想再编译一个和6.10默认内核版本相同的内核出来,以使用它的restricted-modules。说实话,从nvidia官方网站上下驱动来直接安装我之前都不知道!被gentoo宠坏了:).不过这个方法确实很简单,并且奏效。

至此,所有问题解决:Ubuntu 6.10用支持P4 smp的内核,用nvidia驱动,再没有
键盘鼠标不响应的情况了。