Tag Archives: Linux

Fedora 15 tips

今天Fedora 15正式发布了,升级尝鲜。但是gnome3还是用不习惯啊。记录一点tips,让自己用的习惯一点。

1. 增加最小化、最大化按钮

gconftool-2 -s -t string /desktop/gnome/shell/windows/button_layout "menu:minimize,maximize,close"
alt+f2 r enter

参考文献
2. Alt+Tab切换问题

当有多个同一程序的窗口存在时,alt+tab会把他们合并在一起,比如我有3个firefox窗口,那么它们会只显示一个firefox,然后有一个向下的小箭头,指示你下边有子菜单。但要选某个firefox窗口的时候就需要动鼠标,或者把手移动到方向键上,很麻烦。

搜索发现,这个时候可以用alt+`来选择子菜单,也就是带~的那个键。其实更正确的说法是用tab键上边的那个键,无论那个键是什么。因为有的国家键盘布局可能不是这样的。

这样虽然还是没有gnome2的时候方便,但还算可以忍受。

参考文献

3. 使用类似gnome2的桌面(fallback mode)

用了这个之后,前边的2就不是问题了。使用类似gnome2的模式之后(gnome3中叫做fallback模式),就又出现上下两个panel,左上角是Applications和Places,右上角是一些程序图标了,下边的panel也会有最小化之后的窗口可供选择了。

点击右上角的用户名,然后选择“System Settings”,然后在System Info中的Graphics中,选择Force Fallback Mode,注销重新登录就好了。

这时如果想在panel上增加启动快捷方式,直接按鼠标右键是不管用的,移动正中间的时间也是没办法的。方法是按住alt键,然后用右键点击panel,或右键点击时间显示,会出现Move的选项,再把它移动到gnome2中它所在的右上角。

参考文献

bash对文件夹的自动补全问题

这几天发现debian sid下的自动补全功能出现问题了,症状如下:

当我要编辑data目录下的某个文件的时候,通常情况下我都会用

$ vi da<TAB>

用tab来自动补全文件夹的名称,出来的结果是

$ vi data/

这样我就可以继续按两次tab列出data目录下的所有文件。但是最近发现这个方法失效了,因为当我试图使用tab进行补全的时候出来的结果是

$ vi data

注意,data后还跟了一个空格,也就是说把data当作了一个文件名,而不是一个目录。

想到最近debian 6正式发布了,可能会有一些包升级,那么引起这个自动补全问题就应该是bash-completion这个包了。先看看apt的log,在/var/log/apt/history.log中果然发现8号的时候升级了这个包。然后用apt-get changelog bash-completion查看了下这个包的changelog,发现这么一行

- Added _tilde(), fix ~username completion (Closes: #587095)

其他的修改都看不出来跟这个问题有什么关系。接着查看bug 587095,是说对~username的补全不工作了,查了下修正这个bug的patch,悲剧的发现,我看不懂……不过能很清晰的看出来,这个patch只做了一处实质的修改。我就把这处改动改了回去,重新source /etc/bash_completion,发现问题消失了,并却对用户名的补全果然不管用了……虽然对用户名补全我基本用不上,但是明知道有一个错误却留在那不管很难受。

可以看出这个patch修改了_filedir这个函数,从函数上方的注释能看出,当使用-d参数的时候对dir进行补全。那么问题就可能出在调用这个函数的函数上。经过搜索,发现了一个可疑函数,_command,它在最后调用_filedir的时候没有-d参数。当我手动添加-d参数之后,重新source /etc/bash_completion,再进行测试,果然问题消失,并且对~username的补全依然可用。

虽然我不懂bash completion的语法,但是这个修改对我来说是起作用的。这里主要记录的是一个debug的思维过程吧,很啰嗦……

在bash的Here Document中禁用变量替换

Here Document是很有用也挺好玩的一个东西,当系统中没有编辑器的时候,当在脚本中生成配置文件的时候或者在犯懒不想调用编辑器而快速写入一段文本的时候都能用到。

Here Document最基本的用法就是

gery@eguan-dell:~$ cat > testfile <<EOF
> this is a test
> EOF
gery@eguan-dell:~$ cat testfile
this is a test
gery@eguan-dell:~$

但是之前遇到个问题,就是当要输入的文本中有变量存在的时候,here document会把变量作替换,这样得到的结果就跟预期不同了。在下面的例子中,$PWD被自动替换成了当前路径。

gery@eguan-dell:~$ cat > testfile <<EOF
> current dir is $PWD
> EOF
gery@eguan-dell:~$ cat testfile
current dir is /home/gery
gery@eguan-dell:~$

之前犯懒,没去解决这个问题,而是直接打开vi了。今天有一个同事也问我同样的问题,就顺便搜索了下,发现解决方法还是很简单的。一看就明白

gery@eguan-dell:~$ cat > testfile <<'EOF'
> current dir is $PWD
> EOF
gery@eguan-dell:~$ cat testfile
current dir is $PWD
gery@eguan-dell:~$

也就是在EOF两边加上引号,双引号ms也是可以的。这里还可以看到更多here document有趣的例子。

通过bitlbee在irssi中使用msn和gtalk

在上一篇日志中,开始折腾irssi作为irc client了,于是最近很有把常用的工具都放到终端下的冲动。在折腾一阵mutt之后,实在觉得不适应,现在开始折腾msn和gtalk。

说到终端下的IM客户端,第一个想到的应该是finch,也就是pidgin的终端版。但是finch的设计理念好像是图形版pidgin的同等替换,pidgin下有什么样的窗口,finch下就画相应的窗口,完全模拟gui界面,总有点不伦不类的感觉,用着不爽。于是搜索了下其他msn和gtalk的终端客户端,发现了竟然能够在irssi中使用msn和gtalk(其实其他任意一款irc client都可以)。

bitlbee,用它的帮助中的话来说就是“IRC gateway to ICQ, MSN, AOL, Jabber, Yahoo! and Twitter.“。其实就是在本机启动一个irc server,把msn等协议请求进行转发。至于使用方法,在google里搜索”bitlbee msn gtalk”就会出来很多教程。这里简单说下我自己的配置。我参考了tuxtrainingDebian user forum的文章。

首先要启动bitlbee。如果看/etc/bitlbee/bitlbee.conf,可以发现它支持三种模式,xinetd、Deamon和ForkDaemon,具体区别看配置文件中的说明吧。我这里用的是ForkDaemon模式。网上有的教程会说,通过/etc/init.d/bitlbee来启动,但是F13中没有这个启动脚本,我只好直接命令行启动了

bitlbee -F -d ~/.bitlbee

-F表示用ForkDaemon模式,-d表示使用~/.bitlbee作为配置文件目录,保存的msn或者gtalk帐号信息都在这个目录下,默认是在/var/lib/bitlbee,因为我这个用户没有写权限,所以要自己指定配置文件目录。(因为bitlbee是一个irc server,默认任何人都可以来连接,所以默认的保存配置路径就在/var里了。也可以配置成只有使用密码才能连接的模式,具体看配置文件说明吧。)

启动好服务之后就可以用irssi连接了。

/connect localhost

这样会加入一个&bitlbee频道,这个是bitlbee的控制台。然后给自己进行注册,只有注册用户才能保存其他IM的帐号信息,不用每次都设置帐号信息了。

register anypassword

注册很简单,就是register命令后跟一个你想用的密码。这样当你下次启动的时候用identify anypassword来表明自己身份bitlbee就知道你是谁并用哪个帐号的配置了。

这个时候可以添加msn和gtalk帐号信息了。

account add msn username@hotmail.com password
account add jabber username@gmail.com passwd talk.google.com:5223:ssl
save
account list  # 查看帐号列表
account on    # 启用所有帐号
account on <num>  # 启用<num>号帐号 

这样帐号信息就保存下来了,可以看一下~/.bitlbee/中的文件,密码不是明文存储,还不错。

接下来设置irssi,让irssi开始自动连接bitlbee

/network add bitlbee
/server add -auto -network bitlbee localhost

到此基本设置就结束了,登录的msn好友和gtalk好友都在&bitlbee这个channel中显示出来了,只不过是用户id,不是昵称。可以使用rename命令来重命名,但是否能够保存设置我还没测试。如果要发起聊天,就可以用irc的方式

username, your message   # or
/msg username your message  # will open a new window in irssi

之前设置的irssi声音提示在这依然有效,很爽。

到此我把聊天完全放在了终端下,配合guake的快捷键和screen多窗口,用起来很舒服,上个图吧(有机会再介绍我screen的配置)

现在唯一遗憾的是还没办法用bitlbee上twitter,因为我没找到如何让irssi通过SOCKS5代理连接twitter。传说中irssi是支持socks代理的,但是irssi的官方文档中都说不知道“how it works”,我就寒了,等有闲了看看它的代码吧。虽然可以用vpn解决这个问题,但我还不想折腾vpn呢,先这样吧。

用bitlbee还可以上twitter,具体操作参考bitlbee的wiki。设置代理的方法就在/etc/bitlbee/bitlbee.conf中,也可以很方便的设置SOCKS代理。只是这样的话所有的连接都走代理了,如何只让twitter走代理呢?想到一个方法,就是在VPS上单独起一个bitlbee服务,要上twitter就连接这个IRC Server,专门用来上代理,当然首先要设置成用密码连接,否则任何人都可以连接我这个代理了。

irssi的提示音

这两天errata快测完了,空闲时间稍多了些,于是开始折腾screen和irssi了。关于screen要说的好像还不少,以后什么时候有闲了再详细说吧,觉得我现在这套screen的配置用着还是挺爽的。这里只说irssi的声音问题。

早就听说irssi是一款终端下非常强大的IRC client,但是上手比较难,因为其配置选项非常多,功能强大。后来因为在用xchat,也是很好用的IRC client,也就懒得折腾了。但是这两天心血来潮,想再次尝试一下。

irssi本身没有声音提示功能,都是通过脚本来实现的(相当于插件了)。关于声音的插件就有很多,比如beep_beep.pl、beep.pl、beepaway.pl等等,我选择了beep_beep.pl,感觉还比较简单吧。要实现新消息的声音提示需要两步:

1. 在irssi中设置beep相关的选项

/set beep_when_window_active ON
/set beep_when_away ON
/set beep_msg_level MSGS NOTICES DCC DCCMSGS HILIGHT
/set bell_beeps ON

2. 在screen中设置beep(因为我在screen中使用irssi)。通过ctrl-a ctrl-g来控制beep开关。

设置好之后还需要修改下beep_beep.pl脚本(关于如何加载使用脚本,请看这里)。主要是修改下播放声音文件的命令,默认是

play ~/.irssi/scripts/beep_beep.wav >/dev/null &

play这个命令在sox这个包中。我把pidgin的新消息的wav复制到了beep_beep.wav。但是这个命令还有一个问题,虽然把标准输出重定向了,标准错误还是要输出到屏幕的,而不知道为什么play这个命令的输出恰恰是在标准错误,这样在播放声音的时候会在irrsi中出现play的输出。所以只要把stderr也重定向下就好了

play ~/.irssi/scripts/beep_beep.wav >/dev/null 2>&1 &

恩,现在irssi就基本可用了。
关于irssi的使用和配置我还在摸索,以后有一定感想了再写吧。列出来两篇不错的参考

http://wiki.snese.net/software:irssi
http://hi.baidu.com/chencaifa/blog/item/fcf975e7adb06729b938201a.html

设置synergy开机自动启动

没想到关于synergy写了一个系列了,先把之前的列出来吧

1. 在Debian下用synergy共享鼠标键盘
2. 手工配置synergy共享鼠标键盘
3. 设置synergy快捷键,加速屏幕间的切换

这次要折腾的是让synergyc(也就是synergy的client)开机自动启动(在没有用户在X下登录的情况下)。下面又要开始讲长长的缘由了。

买了一个二手显示器,之前买的二手台式机就能用上了。给机器装上了SLED 11。因为我的桌子小,只够放下一套鼠标键盘的,而且这个二手台式机基本打算用来做build system的,所以鼠标键盘用的很少。但是不用还是不行的。虽然ssh可以完成一些工作,但是有些时候还是直接鼠标键盘操作会方便很多。所以我的打算是让synergyc开机自动启动,这样二手台式机的鼠标键盘就可以不用了。

但是synergy启动是需要X环境的,在rc.local或者bash_profile/bashrc中启动很可能不成功。如果在~/.xsession中启动则需要该用户在X下登录,这样有不得不用到本身的鼠标键盘。有问题就google。这里要再次赞叹下synergy,不光软件写的很强大,文档也相当强大,经过一番搜索,最终的答案还是在它自己的官方文档上找到了,而且是一个专门的autostart文档。建议看英文文档,说的很清晰。我这里就简单记录下我是怎么折腾的。

根据文档,需要修改系统中的三个脚本,分别是X的init脚本,startup脚本和session脚本。我在二手台式机上装的是SLED11,默认用的是xdm,所以这三个脚本是

/etc/X11/xdm/Xsetup
/etc/X11/xdm/Xstartup
/etc/X11/xdm/Xsession

如果是gdm就把目录换成gdm。其他的一些说明看文档吧。在第一个脚本中靠前的位置(因为这三个脚本很可能没有执行到最后就会退出,如果把自己的命令放在脚本最后很可能不会被执行。这也是在synergy的文档里提到的,作者的工作很细致啊)添加(命令的位置和ip地址替换成自己的,下同)

/usr/bin/killall synergyc
sleep 1
/usr/local/bin/synergyc 192.168.1.xxx

在第二个脚本中添加

/usr/bin/killall synergyc
sleep 1

在第三个脚本中添加

/usr/bin/killall synergyc
sleep 1
/usr/local/bin/synergyc 192.168.1.xxx

如果想启动的是synergys,那么就把上边的命令做相应的替换。但是要注意,这些脚本是用root执行的,运行synergys的时候会首先找/root/.synergy.conf然后是/etc/synergy.conf,确保文件存在。如果想指定配置文件就用synergys –config /path/to/configfile

配置完成后我重启了下机器(应该重启X也是可以的吧),很幸运,配置一次成功了。这下可以用一套鼠标键盘完全控制三台电脑了(包括我的笔记本)!

更改console下的键盘keymap

我又开始折腾键盘了,都是被ThinkPad的键盘给惯坏了,它的键位安排是我用着最舒服的。而一般USB键盘都没有这样的键位安排,其实就是右ctrl的位置问题,在这篇文章里有对我这个怪癖的解释。

之前写过3篇左右的文章,进行各种映射,比如这篇是把Super_R映射成Control_R。但是这些方法都是只在Xwindow环境下才起作用的,用的是xmodmap这个工具。今天为了测试SSD在RHEL6下的一些优化特性,在台式机上装了个RHEL6,但是默认没有X环境,直接终端操作。现在终端下的分辨率也能自动设置的很好了,感觉直接在终端下用这个测试机也许也挺爽的,于是开始折腾。

既然之前的映射方法在没有X环境的情况下不能工作,那么就需要找其他方法了。有问题当然问google了。以“keyboard console keymap”为关键字进行搜索,找到了这篇文章,其主要方法就是用loadkeys命令更改keymap,而这个keymap是经过自己编辑的。

在RH系列中keymap文件是存放在/lib/kbd/keymaps目录中,而我能用到的是在/lib/kbd/keymaps/i386/qwerty这个目录中。目录中有很多keymap,可以通过查看/etc/sysconfig/keyboard文件(KEYTABLE选项)得到使用的是哪个keymap。一般默认的都是“us”。那么我们可以通过编辑/lib/kbd/keymaps/i386/qwerty/us.map.gz来达到更改映射的效果。打开这个文件可以发现,其实就是把Super_R的keycode指定为Control就可以了。那么关键就在如何找到与Super_R对应的keycode了。在X环境下可以使用xev,在终端下就需要用showkey这个命令了。运行showkey,按下右边的Windows徽标键,发现它的keycode是126(不同系统/键盘可能不同吧),然后修改us.map.gz,增加一行

keycode  126 = Control

再运行

loadkeys us

就可以了。如果不想修改原来的文件,可以cp出一份自己的,然后把/etc/sysconfig/keyboard文件中的KEYTABLE的值修改为自己的keycode文件名,比如us-my。重启系统之后设置也依然有效。

在终端下工作一段时间看看,当然这样就离不开笔记本了,只能是常规的测试工作可以在终端下进行。以后有时间的话可以折腾下终端下的email,还从来没用过。

初探binfmt_misc

为了使用qemu user mode来做opensuse的系统移植而接触到了binfmt_misc这个东西,但是不知道这东西具体是做什么的,所以现在来一探究竟。

要对一个陌生的事物或概念进行初步的了解当然是找wikipedia了。从binfmt_misc的wiki页面上可以得知,binfmt_misc是内核的一个模块,具有让内核执行任何文件类型的功能。具体来说就是用户通过binfmt_misc的接口向内核注册新的可执行文件类型的解释器,内核在运行这种新的可执行文件的时候就把这个文件当作注册进内核的解释器的一个参数来运行这个解释器(说的有点绕……)。比较常见的用法是让windows的exe程序通过wine在Linux中直接运行,要做到这点需要执行如下命令(没有wine,没验证):

# First load module if not loaded
if [ ! -d /proc/sys/fs/binfmt_misc ]; then
 /sbin/modprobe binfmt_misc
fi
if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then
 mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
fi
# Register new executable file format
echo ':DOSWin:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register
# Then you can launch exe file directly
chmod a+x /path/to/prog.exe
/path/to/prog.exe

现在简要说明下那一长串被echo进去的字符串吧。这个串是用来描述新格式和相应的解释器的(interpreter)。一共分为7个部分,之间用’:’分隔:

  1. name:新类型的名称,注册成功后会在/proc/sys/fs/binfmt_misc 目录下生成一个新文件,来描述这个新类型;
  2. type:注册的类型,有两个有效值’M’和’E’,M表示使用magic number来识别新类型,E表示用extention(扩展名)来识别新类型;
  3. offset:magic number/mask在文件中的偏移量,以byte为单位,这个不是必须的,默认是0,也可以省略,如 ‘:name:type::magic:mask:interpreter:flag’;
  4. magic:是binfmt_misc用来识别文件类型的byte串,相当于特征码(不同类型的文件如何得到特征码还不清楚),如果type是E那么这部分就填写扩展名;
  5. mask:mask部分于magic部分做按位与操作,然后再匹配与操作之后的串,一般都是一串’xff’,也就是都是1;
  6. interpreter:解释器,可执行文件作为解释器的第一个参数来执行,需要解释器的全路径名;
  7. flag:控制解释器行为的一些flag。

详细的说明可以看Documentation/binfmt_misc.txt。

现在可以玩一些好玩的东西了,比如让jpg文件变成可执行的,用eog打开查看:

echo ':jpg:E::jpg::/usr/bin/eog:' > /proc/sys/fs/binfmt_misc/register
chmod +x pic.jpg
./pic.jpg

这样在运行jpg文件的时候,就会用eog打开这个图片文件。

最后来说说binfmt_misc与使用qemu user mode进行opensuse移植的关系。使用qemu user mode可以在比如x86_64环境下直接运行mipsel的二进制可执行文件(前提是准备好相应的运行时库环境),那么就可以把mipsel的二进制文件的interpreter注册为qemu-mipsel,再结合chroot,就可能实现在x86_64环境下得到mipsel的运行环境,这个运行环境比运行qemu-system-mipsel要快很多,在这个环境下编译打包rpm会节省很多时间。这也是去年做opensuse@arm port gsoc项目的那个学生的做法,比我用system level emulator效率高了非常非常多,不用忍受编译gcc用4天时间这种痛苦了。

但是现在我还没运行成功这个chroot环境,需要进一步折腾,离qemu mips64el user mode就更遥远了。有进展了会写日志的。

用xmodmap映射Super_R为Control_R

这个问题其实在之前这篇文章里已经解决了,那就是在~/.xmodmaprc中添加’add Control = Super_R’。可是这个方法在今天在台式机上重装成F13之后就不能用了,错误信息没有保存(现在很诡异的不能重现这个问题了……),总之是不认Super_R这个keysym。

经过一番折腾,试了各种xmodmap语句,改了键盘的布局,也没管用。最后使用如下配置才成功:

remove Control = Control_R
remove mod4 = Super_R
keysym Super_R = Control_R
add Control = Control_R

先用xmodmap -pm查看各个modifier里都有什么,然后再把Super_R从相应的modifier中去掉。

现在我也不太清除到底是因为改了什么才映射成功的,反正是好了,先记录在这吧。

在Linux下更改硬盘的 I/O scheduler

要开始测试SSD Tuning这个feature了,SSD的特点之一就是随机读取性能很好,那么就不需要什么I/O scheduler了。所以测试的时候就要改一下scheduler,由一般默认的CFQ改成noop,让I/O scheduler什么都不做就好了。

那么怎么在Linux系统下更改I/O scheduler呢,不会的就google吧。

1. 临时更改

如果想不重启系统而临时更改某个设备的scheduler,那么就用/sys接口吧。

cat /sys/block/<device>/queue/scheduler

可以看到类似如下的输出

noop anticipatory deadline [cfq]

列出的四种都是系统支持的scheduler,方括号中的是现在使用的,也就是cfq。(关于什么是cfq, anticipatory, deadline,自己搜索吧,我也不清楚呢)

要更改的话echo进去一个新值就可以了

# echo noop > /sys/block/<device>/queue/scheduler

2. 永久更改 (这个不是针对某个设备,而是整个系统了吧)

这就需要重启系统了。在grub的启动参数中增加 elevator=noop 参数,noop可以换成其他支持的scheduler。

另外重新编译内核,指定默认的scheduler应该也是可以的吧。

PS. 关于sudo和echo连起来用,还是没搞明白,其实应该是sudo没搞明白。

普通用户下, sudo echo noop > /sys/block/<device>/queue/scheduler是不可以的,没有权限,直接echo就要换成root,或者su -c “echo noop > /sys/block/<device>/queue/scheduler。

而使用 echo noop | sudo tee /sys/block/<device>/queue/scheduler 就是可行的。

谁能给详细介绍下sudo?