2007年12月17日星期一

XDMCP迷思

我相信XDMCP是个好东西,基于X Windows伟大的C/S架构,速度、易用性都很强,但是,我的Gutsy主机、Gutsy客户端怎么就个小问题呢?

主机上的/etc/gdm/gdm.conf中[xdmcp]组中开启设置:

[xdmcp] Enable=true 

至于下面这两个选项我看是否设置没什么影响:

RemoteGreeter=/usr/lib/gdm/gdmlogin DisallowTCP=false 

设置好以后,用客户端,在登录界面Actions->Remote Login via XDMCP…,能看到主机,连接以后就是错误:

There already appears to be an X server running on display :2. Should another display number tried? Answering no will cause GDM to attempt starting the server on :2 again. (You can change console by pressing Ctrl-Alt plus a function key, such as Ctrl-Atl-F7 to go to console 7. X servers usually run on consoles 7 and higher. 

不管选Yes还是No,最终都是重新回到GDM登录界面。

但是,但是啊,不管是在主机本机,还是在客户端,居然都可以用命令连接上:

X :1 -query host_machine_name 

真是奇怪。另外如果一处远程桌面关闭,也会同时关闭使用相同 :? 标号的桌面,用的时候尽量错开。

Source: http://www.fwolf.com/blog/post/376

安装配置fluxbox桌面环境

安装

基本系统Ubuntu 7.10 Gutsy,Xfce桌面。直接安装源里的fluxbox:

aptitude install fluxbox 

版本1.0.0-1,大小只有1058k。安装完成后,检查一下/usr/share/xsessions/fluxbox.desktop文件,里面已经有Exec=/usr/bin/startfluxbox,不用修改了。重启X,(应该会自动创建~/.fluxbox/startup配置文件。

在X登录界面,Sessions选择Fluxbox,并设置为默认session。输入用户名密码进入系统之后,只看见一个光板的桌面,下面有一条工具栏,想截屏来着,可按PrintScreen键没反应,作罢。不过说真的,进入桌面的速度真的很快。工具栏上点右键可以调出工具栏的设置,桌面上点中键可以调出虚拟桌面的设置,但在桌面上点右键没反应,原来是fluxbox默认配置的问题( 害我瞎折腾半天)。

菜单

fluxbox安装完成后默认的菜单配置文件~/.fluxbox/menu内容如下:

[begin] (fluxbox) [include] (/etc/X11/fluxbox/fluxbox-menu) [end] 

而include的这个菜单文件根本就不存在,所以就没有菜单出现喽。现在我来手工加点内容吧:

[begin] (fluxbox) [exec] (Firefox) {/usr/bin/firefox} [exec] (Bash) {x-terminal-emulator -T "Bash" -e /bin/bash --login} [include] (/etc/X11/fluxbox/fluxbox-menu) [end] 

现在,不用重启或重开X,在桌面上点右键,怎么样,一个小小的菜单出来了吧,内容只有两项:Bash和Firefox,选中后会打开相应的程序。不过真要这样一个一个的把菜单配置全可就累死了,本来fluxbox自带一个菜单生成程序fluxbox-generate_menu的,但在Gutsy中没有,虽然它只是一个脚本,可以自己去下载一个单独用,不过手动一下:

sudo update-menus 

然后再重启Fluxbox就好了,根据当前系统中原有桌面系统(比如Gnome、Xfce)软件安装情况,自动把menu项建好了,生成了刚才缺少的/etc/X11/fluxbox/fluxbox-menu这个文件。

利用这种方式,或者使用fluxbox-generate_menu的好处就是可以随系统中软件安装情况变化,再搭配个人的一些优化设置,使用起来就更顺手了。

关机与重启

Fluxbox菜单中的restart和exit分别对应"重启窗口管理器"和"退出X,回到GDM界面",没有直接关机或重启的选项,需要自己手工添加:

[submenu]     [exec] (Reboot System) {sudo /sbin/shutdown -r now}     [exec] (Reboot System) {sudo /sbin/reboot}      #和上面一句作用相同     [exec] (Shutdown System) {sudo /sbin/shutdown -h now} [end] 

先别着急用,命令不都带着sudo了么,还要赋予用户不需密码就能够使用/sbin/shutdown的权限,修改/etc/sudoers,添加:

Cmnd_Alias REBOOT = /sbin/reboot Cmnd_Alias SHUTDOWN = /sbin/shutdown  fwolf ALL=(ALL) NOPASSWD: REBOOT, SHUTDOWN 

再调用关机或重启,虽然使用到sudo,也不再需要输入密码,而是直接就执行了。(参考1 参考2

如果一定要需要用户输入自己的密码才能关机的话,也是可以实现的,那就是通过shell来执行sudo,在新开的shell窗口中会提示用户输入sudo时的密码,输入密码不正确时就拒绝执行sudo了,比如这样(参考):

[exec] (Shutdown) {konsole -T "Shutdown" -e sudo shutdown now -h} [exec] (Shutdown) {gnome-terminal -t "Shutdown" -e "sudo shutdown now -h"} [exec] (Shutdown) {xfce4-terminal -t "Shutdown" -e "sudo shutdown now -h"} 

挂起与休眠

首先安装hibernate,源里有的,然后用root命令运行hibernate或者hibernate-disk就是休眠(信息写入磁盘,不耗电),运行hibernate-ram就是挂起(信息写入内存,会耗一点点的电)。如果运行了gnome-power-manager(在状态栏上会有电池图标),就可以设定合上笔记本时就休眠。菜单项和sudoers文件的修改和上面的关机和重启一样:

Cmnd_Alias SUSPEND = /usr/sbin/hibernate-ram Cmnd_Alias HIBERNATE = /usr/sbin/hibernate-disk  fwolf ALL=(ALL) NOPASSWD: REBOOT, SHUTDOWN, SUSPEND, HIBERNATE 

感觉挂起没有休眠好用,有时候从挂起状态恢复时会死掉,得重启X。

rxvt-uincode的daemon模式

超节省资源的fluxbox当然要搭配同样节省资源的rxvt-unicode来使用才更好,rxvt-unicode的daemon模式就更好了,可以在菜单中这样配置:

[exec] (rxvt-unicode) {urxvtc "$@"; if [ $? -eq 2 ]; then urxvtd -q -o -f; urxvtc "$@"; fi} 

这样就可以自动启动守护程序urxvcd了(参见官方文档)。使用中rxvt-unicode到gedit或者scribes这样的程序粘贴内容有点问题,Ctrl-V不管用,不过用鼠标中键可以粘贴过来,而Shift+Insert只在rxvt-unicode里起作用。 也有人说可以用autocutsel来同步两个剪贴板。

其它设置

快捷键

快捷键设置的默认定义文件为$HOME/.fluxbox/keys,注意Mod1代表Alt, Control代表Ctrl, Mod4代表Windows键,Mouse2是鼠标中键,Mouse4、5则是鼠标滚轮下滚、上滚。比如音量调节:

Control Mod1 Up :Exec amixer sset Master 1+ unmute Control Mod1 Down :Exec amixer sset Master 1- unmute Control Mod1 Left :Exec amixer sset Master mute 

界面字体

默认设置下,如果菜单中有中文,那么配置完成后只能看见两个小方框,这并不是说fluxbox菜单不支持中文,而是字体没设置好。其它窗口标题栏等地方的中文也是类似的情况。可以在$HOME/.fluxbox/overlay文件中设置字体、字号的选项(这个文件的本来作用是定义Style切换中的保留设置),比如如下的内容:

# 菜单标题的字体 menu.title.font: Simsun-10 # 菜单组标题的对齐方式 menu.title.justify: center # 菜单项目的字体 menu.frame.font: Simsun-10 # 菜单项目的对齐方式 menu.frame.justify: left # 窗口标题栏文字的字体 window.font: Simsun-10 # 窗口标题栏文字的对齐方式 window.justify: center # 窗口标题聚焦时的背景颜色|5/5/f window.label.focus.color: rgb:4e/8f/cf window.label.focus.colorTo: rgb:4e/8f/cf # 时钟的字体 toolbar.clock.font: Simsun-10 # 工作区名称的字体 #toolbar.workspace.font: Simsun # 图标栏的字体 toolbar.iconbar.focused.font: Simsun-10 toolbar.iconbar.unfocused.font: Simsun-10 

字体名称后面-11为字体大小,再后面跟:bold表示黑体显示,中间都没有空格。

自启动程序

自启动程序可以在$HOME/.fluxbox/startup中配置,写在exec /usr/bin/fluxbox一句的前面,并且**一定要在后面加上表示后台运行的&符号。比如为了优化GTK程序的运行,可以加上:

GSDPID=`pidof gnome-settings-daemon` if [ "x$GSDPID" == "x" ]; then     gnome-settings-daemon & fi gnome-power-manager gnome-volume-manager -daemon=yes & 

gnome-power-manager是电源管理程序,用来管理笔记本的电源,台式机可以不用;gnome-volume-manager则是卷管理器,只有加载了它,插入u盘或者移动硬盘之后才能自动挂载。

程序属性apps

$HOME/.fluxbox/apps这个文件我还是第一次见过,它可以定义窗口的各项属性,比如:

[app] (name=xfce4-terminal) [Position]  (LOWERLEFT) {0 55} [end]  [group]     [app] (name=urxvt) (class=URxvt)         [Position] (LOWERLEFT) {0 25} [end] 

第一个[app]是定义了程序xfce4-terminal启动时的窗口位置为相对于屏幕左下角0,55的坐标,这样每次启动程序的时候就不用再手工移动窗口到自己舒服的位置了。fluxbox没有gnome那样窗口自动dock到屏幕边缘的功能,这算是另外一种方式的补充。

第二个[group]则是定义在本group范围之内的app,启动之后自动tab到一起,tab是fluxbox的特有功能,有点类似xfce4-terminalgnome-terminal开多个tab的功能(我也正是利用这点来模拟rxvt-unicode的多tab),这样打开多个rxvtc的时候,就自动tab到一个窗口去了,不用再手工按鼠标中键把一个标题栏拖到另外一个标题栏上。如果再在keys文件中配上Ctrl+PageDown切换到下一个Tab的功能:

Control Prior :PrevTab Control Next :NextTab 

多Tab shell窗口功能就近乎完美了,几乎可以完全淘汰xfce4-terminal了(字体颜色设置上还略有些不太习惯)(这样还把xfce4-terminal自身的tab切换功能给屏蔽了,调成用Mod1/Alt来组合也不错)。如果你想,在group中加上其它程序也是可以的。

apps文件很重要,不过如果手工在设定窗口保存属性的话,会被系统自动改写,为了保存手工编写代码的美观性,可以把这个文件的属性设置为444,编辑时再用w!强行写入。

桌面图片随机轮换

这一点简直太适合我了,我就喜欢设定一个目录,用里面的图片随机作为桌面,只需要把下面这个命令仍到crontab里就可以了:

env DISPLAY=":0.0" fbsetbg -F -R /path/to/your/wallpaper/ 

注意这个目录中不能有非图片文件。记得安装feh,虽然不装的话也能用,装上以后图片显示速度和拉伸效果都更好一些。

参考

Source: http://www.fwolf.com/blog/post/375

2007年12月11日星期二

Xfce桌面上不显示图标了怎么办?

环境:Ubuntu 7.10 Gutsy, Xfce桌面。

这个现象已经很久了,桌面上不显示图标,点鼠标右键也没反应,虽然在Desktop Settings中选择Allow Xfce to manage the desktop的话,能显示桌面,但这是xfce自己用xfdesktop接管了桌面管理,不是根本之道。网上似乎很多人遇到类似问题,多半是升级Ubuntu搞出来的,推荐的解决方法无外乎删除xfce配置文件云云。

Xfce具备保存session功能(其实,我都不之道如何开始一个新的session),也好也不好,不过利用这个特性倒是能解决桌面上不显示图标的问题。

首先换上一个新的windows manager,过渡用一下而已:

x-window-manager --replace & 

然后就可以再替换为nautilus来管理桌面了:

nautilus 

把打开的文件管理器窗口关掉,你会发现桌面图标已经出来了。

有时候还会出现窗口无标题栏等问题,也能解决,首先在User Interface Preference中换一款主题,不管用的话再手工启动metacity:

metacity --replace & 

另外,在Sessions and StartupAdvanced中记得勾选Launch Gnome services on startup,要想桌面漂亮,这个好像还没法优化。

现在退出登录并且记得选上Save session for future logins,貌似一切恢复平静。

老实说,其实我是在换了Fluxbox后,右键依然唤不出菜单,才想起来找这里的原因,但这边解决以后发现fluxbox根本没有变化,大概还是fluxbox配置的问题。用了一段时间的xfce后感觉还是脱不开gnome的种种类类,希望fluxbox能好一些,让我的老机器跑快一点。

Source: http://www.fwolf.com/blog/post/374

2007年12月6日星期四

纪念老妈的半颗大牙

本来想让老妈尝点好吃东东的,买了点99辣鸭脖,还"逼"着老妈一定要吃。老妈倒也卖力,边看电视边啃,《金婚》演完了以后告诉我们一个坏消息,一颗牙齿(左边、上面,尖牙后面的第一颗大牙)不幸断裂了大半个下来。

老妈从小爱吃糖,可惜那时候条件不好,把牙都吃坏了,后来刷牙也不知道正确的方法(上下刷),还把牙给刷出一道横向的沟,牙齿更不结实了。后来牙齿出毛病,也补过、镶过牙齿,现在吃饭全靠假牙。今天吃鸭爪的时候,可能太认真,鸭骨头就把这颗本来就不太结实的牙给"撬"断了,看着这半颗牙齿,心里真不是滋味儿,早知道不买这些费牙的东东了。

在这里还要批评我老爸,记得去年过年的时候,买过一袋"老奶奶××豆",打开一尝,哪是什么老奶奶吃的豆啊,我吃都咬不动,遂扔在一边。后来一没留神,发现老爸边斗地主边在啃这个豆,也就仗着老爸牙好,咧着嘴咖蹦咖蹦的费劲咬着豆,看得我是又心疼又生气,一把就把豆给扔了,还数落了老爸半天,这么大岁数了也不知道心疼牙齿。要知道牙不好,食物无法充分咀嚼,胃的负担就重,胃累坏了,消化、吸收就不好,进而影响健康。其实最该死的就是生产这豆的厂家,应该改名叫"铁蛋"豆子。

再说《金婚》这电视剧,我挺喜欢,推荐给老妈和lp,她们也都很爱看,我尤其喜欢看改革开放之前的部分,感觉很真实,描写那些年代的影视不多。

唉,牙断了也接不上,后悔也没用,和老爸老妈一起生活的时候可要注意了,不要买太费牙的东东给他们吃,尤其是鸡鸭这种带小棒子骨的。

Source: http://www.fwolf.com/blog/post/373

2007年12月4日星期二

Linux下使用华为h3c Aolynk WuB320G无线网卡

我搜到的国内唯一的两篇参考文章(之所以说是唯一,是因为内容基本一致,大概是同一个人写的):

不过这位老大写得比较模糊,具体操作的时候还是费了不少周折。加上本本上的迅驰无线捣乱,由于本本比较老了,自带无线网卡是Intel PRO/Wireless 2100,只支持802.11b,好像还不支持WPA(WPA是2004年提出的,比本本的岁数小),所以在它身上也浪费了不少时间。

华为3com的Aolynk WUB320g usb无线网卡芯片组应该是Ralink(它的台湾分站)的RT73,虽然Ubuntu Gutsy自带了驱动,并且识别出了网卡,但注意,这个自带的驱动不好用,或者说 没法用,仍然需要自己到http://rt2×00.serialmonkey.com/下载开源的驱动,编译使用。(编译前后,用 iwpriv wlan0看列出的可用参数就知道这两个驱动的区别了)

编译需要内核相应的头文件,比如linux-headers-2.6.22-14-generic,解压后按照README文件的内容:

$ tar xzf rt73-cvs-daily.tar.gz $ cd rt73-cvs-YYYYMMDDHH/Moduls $ make $ make install 

就算编译安装完成了,手工挂载:modprobe rt73 ifname=wlan0,在/etc/modules中添加一句rt73,每次启动就能够自动挂载了。还可以在/etc/modprobe.d/blacklist中增加一句:blacklist rt73usb,禁用系统自带的驱动。

如果要和采用WPA-PSK认证方式的AP连接,还要修改一下/etc/network/interfaces文件,比如:

auto wlan0 iface wlan0 inet static     address 192.168.0.13     netmask 255.255.255.0     gateway 192.168.0.1      pre-up ifconfig wlan0 up     pre-up ifconfig wlan0 down     pre-up ifconfig wlan0 up     pre-up iwconfig wlan0 essid "my_essid"     pre-up iwconfig wlan0 mode Managed     pre-up iwpriv wlan0 set AuthMode=WPAPSK     pre-up iwpriv wlan0 set EncrypType=TKIP     pre-up iwpriv wlan0 set WPAPSK="my_wpa_passphrase"     pre-up ifconfig wlan0 up 

这个设置是从WifiDocs/Driver/RalinkRT73抓过来的,大体意思知道,但为什么写成这个格式不是非常明白,不过这样的确就可以使用了 :-)。

配置无线连接还可以使用其它工具,比如wifi-radar,或者专门为Ralink开源驱动设计的RutilT也不错。

试着用两块Wub320g配置Ad-Hoc对等网,但失败了,配置如下(两端的配置是一样的):

auto wlan0 iface wlan0 inet static     address 192.168.0.13     netmask 255.255.255.0     gateway 192.168.0.1      pre-up ifconfig wlan0 up     pre-up ifconfig wlan0 down     pre-up ifconfig wlan0 up     pre-up iwconfig wlan0 mode Ad-Hoc     pre-up iwconfig wlan0 channel 2     pre-up iwconfig wlan0 essid "fwolf_home"     pre-up iwconfig wlan0 key 1234567890     #pre-up iwpriv wlan0 set NetworkType=Adhoc     #pre-up iwpriv wlan0 set AuthMode=OPEN     #pre-up iwpriv wlan0 set EncrypType=NONE     #pre-up iwpriv wlan0 set SSID="fwolf_home"     # Break 802.11i's 11m/s limit     #pre-up iwpriv wlan0 set AdhocOfdm=1     pre-up ifconfig wlan0 up 

注释中是另外一种方式,两种方式下网卡都能够连通,从iwconfig或者其它工具中都能看到已连接的状态,ifconfig也能看到发送和接收的流量,但两块网卡之间就是ping不通(属于同一网段)。把两端的机器都重启,偶尔能从还连接着局域网的机器上ping通另外一台只连接了无线网的机器,而反过来ping不通,提示:

Destination Host Unreachable 

有时候还会提示:

ping: sendmsg: No buffer space available 

对等网计划只好暂时搁浅,先找个AP用着。

最后总结,在为linux操作系统选购硬件时,一定要先上网看看相应的功能好不好配置,优先选择应用比较广泛、驱动比较开放、配置容易的产品。

参考

Source: http://www.fwolf.com/blog/post/372

Bash script中的命令行参数处理

Bash中的script是强大的,但如果想让写出的脚本更加实用、灵活,不能简单的堆砌命令,势必要加上一些命令行参数。命令行参数除了实际的操作对象以外,还可能是一些选项(通常是用-开头的),如果还是用$1、$2这样的方式一个一个的判断参数到底是不是选项、是哪个选项就太低效了,更好的方式是用getopts,先看简单的例子:

#!/bin/bash while getopts 'd:Dm:f:t:' OPT; do     case $OPT in         d)             DEL_DAYS="$OPTARG";;         D)             DEL_ORIGINAL='yes';;         f)             DIR_FROM="$OPTARG";;         m)             MAILDIR_NAME="$OPTARG";;         t)             DIR_TO="$OPTARG";;         ?)             echo "Usage: `basename $0` [options] filename"     esac done  shift $(($OPTIND - 1)) 

getopts后面的字符串就是可以使用的选项列表,每个字母代表一个选项,后面带:的意味着选项除了定义本身之外,还会带上一个参数作为选项的值,比如d:在实际的使用中就会对应-d 30,选项的值就是30;getopts字符串中没有跟随:的是开关型选项,不需要再指定值,相当于true/false,只要带了这个参数就是true。如果命令行中包含了没有在getopts列表中的选项,会有警告信息,如果在整个getopts字符串前面也加上个 :,就能消除警告信息了。

使用getopts识别出各个选项之后,就可以配合case来进行相应的操作了。操作中有两个相对固定的"常量",一个是OPTARG,用来取当前选项的值,另外一个是OPTIND,代表当前选项在参数列表中的位移。注意case中的最后一个选择──?,代表这如果出现了不认识的选项,所进行的操作。

选项参数识别完成之后,如果要取剩余的其它命令行参数,可以使用shift把选项参数抹去,就像例子里面的那样,对整个参数列表进行左移操作,最左边的参数就丢失了(已经用case判断并进行了处理,不再需要了),位移的长度正好是刚才case循环完毕之后的OPTIND - 1,因为参数从1开始编号,选项处理完毕之后,正好指向剩余其它参数的第一个。在这里还要知道,getopts在处理参数的时候,处理一个开关型选项,OPTIND加1,处理一个带值的选项参数,OPTIND则会加2。

最后,真正需要处理的参数就是$1~$#了,可以用for循环依次处理。

使用getopts处理参数虽然是更加方便了,但仍然有两个小小的局限:

  1. 选项参数的格式必须是-d val,而不能是中间没有空格的-dval
  2. 所有选项参数必须写在其它参数的前面,因为getopts是从命令行前面开始处理,遇到非-开头的参数,或者选项参数结束标记--就中止了,如果中间遇到非选项的命令行参数,后面的选项参数就都取不到了。

参考

Source: http://www.fwolf.com/blog/post/371