Tuesday, January 20, 2009

每个console和terminal都有screen

自己的notebook(现在已经是实验田了), 当然要是自己就DIY的世界了.

现在想要的功能:
* 每个将要使用的console或者terminal都要有screen的存在, 并且要自动运行.

使用如下shell脚本(.bash_profile):
tty_name=$(tty|cut -c 6-|tr -d "/")

# each tty, everyone can longi one time only!
# don't need environment
if [ ${tty_name::3} = "tty" ];then
screen
# if login from terminal
elif [ ${TERM::6} != "screen" ];then
screen -S $tty_name
fi


要使urxvt成为login shell, 需要增加如下配置(.Xdefaults)
URxvt.loginShell:True

console下的stardict

之前, 这个需求在我身上是绝对不会产生的。

但是现在的, 真的需要了。为什么现在又有了呢?Xorg! 一切都是因为X的问题!怕到某天没有了X11, 在console没有dictionary的世界里看man手册, 会疯了的!!

于是google了一把, 世界上还真的有同样需要的人: sdcv。 stardict console version版本。

还好, portage里面也有。

为了使screen更容易滚屏. 决定bind一个方捷键.

看了一把man手册. 于是在/etc/screenrc中加入:

bind y copy

这样进入copy mode只需要 ctrl + z + y 就OK了. 一切像vi了

^_^

推介多多使用命令行的操作方式.

moc配色问题引发的问题

本人的moc ( music on console)不是从portage安装的, 是download源码make的。

所有在没有配置man的时候, 是没有mocp的man手册的。

这个重要的信息的忘了。一直以为mocp没有man手册。!!!!


在moc的prefix的目录看了一下, 原来是有man手册的。

临时使用/etc/man.conf外的man手册的方法:

# man -M /usr/share/moc/share/man mocp

要注意, 是到man这一级的!!!

gentoo下的acpi

碰到这个的需求:我的notebook看不到电池的情况

只知道使用ubuntu时有可以查看。

由于在gentoo下, 找到了acpi。

what's acpi?

全称为:Advanced Configuration and Power Interface

那gentoo在哪里安装呢?

# cd /usr/src/linux
# make menuconfig

-->
Power management options
-----> ACPI (Advanced Configuration and Power Interface) Support
就有ACPI支持了。(对于内容就以后需要的时候再学)

哪怎么看系统现在是否有acpi支持呢?

#ps auxwww|grep acpi

就看到了。^_^

在编译acpi支持时, 如果选择了把acpi信息放到/proc目录中, 那么, 我们是可以使用这些文件去查看电池的信息的。

在找acpi工具时程序, 还看到一个叫apcid的程序, daemon类的。 不知道用来做什么的。 与kacpid同类?

Saturday, January 17, 2009

情侣南路段的生活照

google的picasa web地址:

* http://picasaweb.google.com/jessinio/PwcfRJ#

首次放生活照片!

X的启动

早就想了解X服务器的了. 只是没有好的机会和需求.

现在. 被gentoo逼出来了.

到底, 在startx, startxfce4之类的启动X服务的脚本中, 都干了些什么事呢?

能不能手动X服务器和自己想要的软件呢?

答案是可以的!!!!

来玩一把吧! ^_^

首先, 来一个最简的启动方案:
# X

看到一个什么都没有的"桌面". 这就是所谓的X服务器.

这个X服务器没有启动其它的外壳程序(shell), 这样, 我们只能看, 不能操作!!因为我们没有办法去fork出一个新的程序!

那么我们真的没有办法去操作了吗? 那个所谓的X服务器就只能看到"白板"一块了吗?

答案是: 可以的!

X服务器启动后, 显示默认使用的console是F7. 我们可以切换到其它的console, 比如console2. 在console2下, 我们就有了fork的基础了(^_^, 不是fuck哦)

如下的方法启动程序:
# firefox --display :0.0 &

这样, firefox的图形跑到console7了. 而当前的console2还是有平时一样!!

平时我们是不可能这样玩的, ^_^, 至少要在X服务器上跑一个可以fork程序的外壳程序(shell)吧.当然, 我们也可以像上面的方式那样跑一个shell,比如urxvt, 但是这样玩, 程序程序需要支持显频定向的功能. mousepad这样的程序就不能这样玩了(至少直接运行不行,需要export DISPLAY环境变量才行.)

那么, 还要什么改进呢?

答案是: 使用xinit

之前写过, xinit命令会使用到一个xinitrc的脚本. 好, 现在创建$HOME/.xinitrc文件.

其中加入:mousepad, 然后运行xinit
#xinit -no-listen tcp

哈, 可爱的mousepad就和X服务器一起出来了!!!

Friday, January 16, 2009

xinitrc脚本与Session脚本

在了解X启动的时候, 这样的文件是肯定会碰到的

这样会涉及到X的启动方式.X有两种启动方式:
1 第一种叫:xdm
2 第二种叫:xinit

xdm走的路线为Session线. xinit走的路线为xinitrc线.

Session脚本还没有去了解, 现在先写xinitrc

下面的例子是以xfce4

xinit路线的xfce4启动使用如下的文件

/usr/bin/startxcfe4

/etc/xdg/xfce4/xinitrc

$HOME/.config/xfce4/xinitrc

$HOME/.xinitrc

startxfce4是启动脚本. 它主要是去调用一个文件:xinitrc

到底是$HOME/.xinitrc, 还是$HOME/.xinitrc, 还是/etc/xdg/xfce4/xinitrc呢?

不管最后使用是哪个xinitrc文件, 走xinitrc路线的方法最后都是使用了xinit命令!

命令行如下:
xinit /path/to/xinitrc -- -nolisten tcp

startxfce4有一次判断:
* 如果$HOME/.config/xfce4/xinitrc存在, 就让xinit使用此文件.
* 如果$HOME/.config/xfce4/xinitrc文件不存在, 就让xinit使用/etc/xdg/xfce4/xinitrc文件.

那么, $HOME/.xinitrc是用来干什么的呢?

它是当调用xinit命令没有指定xintrc文件时, 才被使用的.有意思的是当使用xinit命令又没有指定xinitrc文件和$HOME/.xinitrc不存在时, xinit程序会使用如下内容代替:
xterm -geometry +1+1 -n login -display :0

xinit命令调用一个这个的文件, 有什么用处呢?

这涉及到X服务器启动时,需要做的一些初始化和启动的软件集!

还是使用xfce

实在受不了fluxbox之类的"非主流"windows manager!

本是想着使用最小软件集的, 在受不了的情况下, 只能使用xfce这样的"套件"了.

# UES="alas doc -gnome" sudo emerge xfce4

安装后, 启动xfce:
# startxfce4

一开始就个问题: 找不到nio-laptop这个域名, 不过还提示本人使用/etc/hosts文件. ^_^

增加 "127.0.0.1 nio-laptop"到文件/etc/hosts问题解决!
* 这里有一个问题: gentoo下的主机名(nio-laptop)是在哪里存放的?
* ubuntu下有一个/etc/hostname的文件, gentoo是没有的. where ??

安装后, 第一件事是启动urxvt!

第二件事, 查看:
1. $HOME/.xsessinio文件

2. 看查/etc/X11下的文件
发现有新的东西:

增加了以下文件:
/etc/X11/dm/Sessions/xfce.desktop (目录也是新创建的)
/etc/X11/wmsession.d/10XFce4 (目录也是新创建的)
/etc/X11/Sessions下增加了一个Xsession文件
/etc/xdg (目录也是新创建的)

为什么要了解这种东西呢?

因为windows manager的主要配置文件, 这就关系到initrc与xsessinio之关的知识!(这部分下次写出来)

如果已经存在一个DISPLAY变量,会报X服务器已经存在. 可以删除这个环境变量:
* unset DISPLAY


使用startx很慢.为什么呢? 是没有-nolisten tcp的问题?
* 发现启动scim后, 启动使用X server resource的程序就变得很慢, 比如使用urxvt, xterm, 解决方法可以search本blog的"scim"关键字

startxfce4启动很快, 可是进入去没有没有输入法!
看了一下startxfce4的代码, 发现有一个目录:
$HOME/.config/xfce4/xinitrc

在没有细看代码的情况, 就生成了这个文件, 内容如下面:
#!/bin/bash
export LC_CTYPE="en_US.UTF-8"
export XIM=SCIM
export XIM_PROGRAM=/usr/bin/scim
export XIM_ARGS="-d"
export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=xim
export QT_IM_MODULE=xim
export DEPENDS="scim,scim-pinyin|scim-tables"

$XIM_PROGRAM $XIM_ARGS

exec startxface4



结果, 报misc字体被多次引用!


无奈之下, 只能细看/etc/xdg/xfce4/xinitrc的代码了.发现此文件要干的活N多!! T_T X的启动还真不简单.

但是/etc/xdg/xfce4/xinitrc的脚本没有调用用户的任何代码,不可能在这个文件中增加用户的代码的!至少一般用户没有这个权限.

在startxfce4中看到下面的命令:
$prog /etc/xdg/xfce4/xinitrc $CLIENTRC -- -nolisten tcp $SERVERRC

在startxfce4没有参数调用时, 命令如下:
xinit /etc/xdg/xfce4/xinitrc -- -nolisten tcp

又加上看startxfce4的代码, 发现, 有了$HOME/.config/xfce4/xinitrc文件后, /etc/xdg/xfce4/xinitrc文件就不被使用了!

于是想到:
* 用户要在xfce4启动时增加自己的代码, 应该在$HOME/.config/xfce4/xinitrc文件中增加, 然后这个文件去调用/etc/xdg/xfce4/xinitrc脚本!这样就可以定义自己想要的启动过程!
如下是使用startxfce4后有输入法的方法:
#!/bin/bash
export LC_CTYPE="en_US.UTF-8"
export XIM=SCIM
export XIM_PROGRAM=/usr/bin/scim
export XIM_ARGS="-d"
export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=xim
export QT_IM_MODULE=xim
export DEPENDS="scim,scim-pinyin|scim-tables"

$XIM_PROGRAM $XIM_ARGS
. /etc/xdg/xfce4/xinitrc



看来要启动输入法, 不能简单的处理. 还要知道xfce4对Sessinio脚本, xinitrc脚本的使用方式了.....

shell脚本中的seteuid功能

因为需要在shell脚本中增加这样的功能:
脚本是root用户启动, 需要在脚本中的某些地方使用指定的用户去运行命令

在python等语言中存在一个API: seteuid.

在系统都没有相似的命令.

看了一下bash的man手册, 只有两个read-only的变量.

现在本人是这样处理的:

# sudo -H -u www httpd

这里有一点要注意的, 就是使用sudo时的环境变量.

Thursday, January 15, 2009

解释性shell的环境变量的来源

登陆性的shell很明显, 会使用$HOME/.profile之类的文件, 这样shell就可以得到新的环境变量.

那么, 当一个shell为非登陆(作用解释器)的shell, 它的环境变量哪里来呢?

如下:
1. 父进程中继承
1. 脚本启动时的命令行.
1. 解释器启动时内置的环境变量(都为编程需要的, 与用户的变量不同)

因此, 在运行一个对环境变量有要求的脚本时, 首先要整清楚上面的来个来源:
1. 父进程有没有存在要求的环境变量
1. 能不能在启动脚本的时候指定.

例子说明上面的问题:
1. crontab中的PATH常常是使用crontab时碰到的问题, 为正确使用crontab去运行定时任务, 一般是设置它的PATH, 这样, crontab就是把这个环境变量继承给由它启动的子进程

2. 在脚本启动时指定环境变量也是常见的. 如:
jessinio@jessinio-desktop:/tmp$ sudo -u root HOME=/tmp -i
root@jessinio-desktop:/root# echo $HOME
/tmp

virtualbox的时间问题

发现virtualbox下的guest虚拟环境时间不对, 第一时间是搞时区, 但是BT的事情来了:

平时使用tzselect程序是没有问题的, 呃.....今天机器扯了!

火了, 手动搞:
[jessinio@fedora9 ~]$ date
Wed Jan 14 22:17:33 EST 2009
[jessinio@fedora9 ~]$ cp /etc/localtime /tmp/
[jessinio@fedora9 ~]$ sudo cp /usr/share/zoneinfo/Asia/Chongqing /etc/localtime
[jessinio@fedora9 ~]$ date
Thu Jan 15 11:18:02 CST 2009
[jessinio@fedora9 ~]$ date "+%z"
+0800




现在至少时区为东8区了!!

不过时间还有不对, 真的是时区的问题吗?

看来要使用排除法了, 去掉时区, 地区等等干扰, 决定使用UTC时间:

下面是python的time.time的说明:
* Return the time as a floating point number expressed in seconds since the epoch, in UTC

虚拟机内
[jessinio@fedora9 ~]$ python -c "import time;print time.time()"
1232001572.22

真机内:
jessinio@ubuntu-test-1:~$ python -c "import time;print time.time()"
1232019587.81

差了1000多秒!

为了防止被date程序的修改干扰, 决定reboot机器, 结果后还是一样!!!!

最在无法解决的情况, 猜想了一把: date在virtualbox内会修改virtualbox的bois时间?

决定做一把测试, 结果...........狗日的!!!!!

真的会保存时间的!!!! -_-!!!

virtualbox版本
jessinio@ubuntu-test-1:~$ VBoxManage -v
2.0.2r36488

Wednesday, January 14, 2009

SA真正的砍柴工: sh脚本

吼一声: 不会sh就不要当SA啦!

这主要的确是表个态, 我一定要学好sh脚本!

Monday, January 12, 2009

人类是可怕的动物

我发现, 生活在地球上的所有动物中, 最可怕的动物就算人(至少top 10榜上有名)

为什么这样说呢?
己所不欲, 全施于人!!

这还不算就恶毒的, 明摆着施反而可以体谅的, 所谓的:
人不为己, 天株地来

但是, 恐怖的动物是慢慢地施的!你无法看懂, 至少在短期内无法猜到, 知道这只动物要做什么.

为自己的利益, 布置一张好大好大的网(关系网, 步骤, 谎言等等).

体会到, 在职场特别明显, 为什么呢?

利益!

当利益与欲望发生差异的时候, 就是放撒网之时.

Saturday, January 10, 2009

dhcp协议与强制绑定IP引发的问题

这个问题来得不是个时候, 偏偏要在我玩net配置文件的时候跑来,还以为是自己的配置有问题呢.

事情的过程:

使用dhcp客户端申请一个IP:
jessinio@nio-laptop ~ $ sudo dhcpcd eth0
eth0: dhcpcd 4.0.2 starting
eth0: broadcasting for a lease
eth0: offered 192.168.52.112 from 192.168.18.10
eth0: checking 192.168.52.112 is available on attached networks
eth0: ignoring offer of 192.168.52.41 from 192.168.18.11
eth0: hardware address 00:10:5c:f9:e6:7b claims 192.168.52.112
eth0: broadcasting for a lease
eth0: offered 192.168.52.112 from 192.168.18.10
eth0: checking 192.168.52.112 is available on attached networks
eth0: ignoring offer of 192.168.52.41 from 192.168.18.11
eth0: hardware address 00:10:5c:f9:e6:7b claims 192.168.52.112
eth0: timed out
eth0: trying to use old lease in `/var/lib/dhcpcd/dhcpcd-eth0.lease'
eth0: probing for an IPV4LL address
eth0: checking 169.254.68.141 is available on attached networks
eth0: using IPv4LL address 0.0.0.0


上面的意思是: dhcp服务反回了一个IP(52.112), 但是dhcp客户端发现此IP被人使用了.结果得一个169的IP, 此IP是无效的.

没事干, rdesktop一把这个52.112 IP, 发现是一台windows机器!

狗日的抢IP!要强焊一点!
# sudo dhcpcd --release eth0
# sudo dhcpcd -A eth0 (也可以使用dhclient,dhcpcd是gentoo下的dhcp客端)
这样, IP就要了, 不过, 这个IP现在被两台机使用!^_^

现在有三种处理方法, 一种是:
1. 与强制绑定IP的人作长期斗争
对这个种做法, 本是想的, 后面同事说:为什么要和一台没人理的机器做斗争呢? 呃... 好男不与机器斗 ^_^

2. 找信息部的人.
这种做法最省事, 不过, 坐着不上网, 也是那个BT的!(没妞泡), 还是自食其力吧!用下一方法

3. 师夷长技以制夷
人家会绑定IP, 我也会呀!!@~!~!~!~!~!

如下方法:

#把dhcp客端给停了:
# sudo dhcpcd --release eth0
# 绑定一个IP: dhcp服务器还在分配52.112, 表示刚到这个IP, 所以下面使用大一点的地址52.245 ^_^
# sudo ifconfig eth0 192.168.52.245
# 增加路由表
# sudo route add default gw 192.168.52.1
# 增加DNS服务器地址
# echo "nameserver 192.168.18.10" | sudo tee -a /etc/resolv.conf

OK!, 网络正常! 有空去信息部投诉去.

route的使用

碰到一个问题, 使用dhcpcd得了一个很BT的IP, 可能是dhcp程序没有处理好的问题, 一气之下, 使用ifconfig硬来:
jessinio@nio-laptop:~$ sudo ifconfig eth0 192.168.52.118 (这个IP现在没有人使用)

jessinio@nio-laptop:~$ ping 192.168.18.10 (公司的DNS)
connect: Network is unreachable

# 看一下路由表:
jessinio@nio-laptop:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.52.0 * 255.255.252.0 U 1 0 0 eth0
loopback * 255.0.0.0 U 0 0 0 lo


公司的网关应该是192.168.52.1才对, 上面没的, 又要硬来了:
jessinio@nio-laptop:~$ sudo route add default gw 192.168.52.1

这下可以ping得通了, 不过, 这样搞死人呀.

不知道Dhcp程序哪里配置出了问题, 哎, 头大呀~~~~~~

Friday, January 9, 2009

gentoo下的resolv.conf问题

前提:安装gentoo就是用来折腾的.

gentoo好后, 有一个奇问题:
每次/etc/resolv.conf被错误地设置了, 至少是没有被设置对, 如下内容

# Generated by net-scripts for interface lo
domain localhost


有一点蛛丝马迹: Generated by net-scripts for interface lo

好, 折腾开始!

在/etc/runlevels下的boot目录中找到一个net.lo文件, link到/etc/init.d/net.lo

jessinio@nio-laptop ~ $ ls -l /etc/runlevels/boot/net.lo
lrwxrwxrwx 1 root root 18 2008-12-27 11:42 /etc/runlevel /boot/net.lo -> /etc/init.d/net.lo


本想look一把/etc/init.d/net.lo代码的, 但是,一个想法闪出来:
* 有/etc/init.d/net.lo文件, 为什么没有/etc/init.d/net.eth0呢?
有这个想法还是有依据的:
* 因为lo是回流网卡, eth0是我的以太网卡

jessinio@nio-laptop ~ $ sudo ls -l /etc/init.d/net.eth0
lrwxrwxrwx 1 root root 6 2008-12-27 11:42 /etc/init.d/net.eth0 -> net.lo

此文件中存在这样的代码:
* "depend_${iface}

这应该是一个文件, 启动多个网卡的脚本

看了一把/etc/inint.d/net.lo代码, 现在了两点东西:
1. gentoo中的runlevel脚本的依懒关系是通过/etc/init.d/下的脚本的depend函数去处理的.有这样的字键字:
* need
* after
* use
这里的脚本的运行过程是怎么样的呢? 下次折腾吧

这个文件有一句话:
#NB: Config is in /etc/conf.d/net

这就扯到如下三个文件的作用了:
1. /etc/init.d
这是启动脚本的总文件夹!启动脚本是通过/etc/runlevel分开的
2. /etc/conf.d
这里一般是/etc/init.d脚本的配置文件
3. /etc/runlevels
用于分开/etc/init.d脚本

查看/etc/conf.d/net, 已经有如下信息了:
dns_domain_lo="localhost"
config_eth0=( "dhcp" )
dhcp_eth0="nodns nontp nonis"

看到上面的选项, 第一时间是想到man, 但还有例子文件可以看
/etc/conf.d/net.example

config_eth0的作用:
# For a static configuration, use something like this
# (They all do exactly the same thing btw)
config_eth0=( "192.168.0.2/24" )
config_eth0=( "192.168.0.2 netmask 255.255.255.0" )
routes_eth0=("default via 192.168.52.1")

上面的是静态IP的处理方法, dhcp的处理方法:
# Regardless of which DHCP client you prefer, you configure them the
# same way using one of following depending on which interface modules
# you're using.
#config_eth0=( "dhcp" )

看来"dhcp"应该为dhcp协议的程序, 在gentoo中应该使用dhcpcd(当然, dhclient之类的也可以)

dhcp协议程序的参数传递方法:
# For passing custom options to dhcpcd use something like the following. This
# example reduces the timeout for retrieving an address from 60 seconds (the
# default) to 10 seconds.
#dhcpcd_eth0="-t 10"


现在还不知道dhcp_eth0的作用:
# GENERIC DHCP OPTIONS
# Set generic DHCP options like so
#dhcp_eth0="release nodns nontp nonis nogateway nosendhost"

换个钱包, 换个心情, 进一个阶段

一个钱包, 一个时代!

看上去, 说得过火了, 其实意义还是很大的.

1.5年前, 也就是上一个钱包的购买时间, 自己还处于申手要钱的时代, 生活完成是依懒于家.

1.5年后的今天, 也是新钱包的购买时间, 自己完全是自立的时代, 虽然不富有, 但还是会给钱回家的.

时间的飞逝, 人被强迫地改变了自己的生活. 不管是好的, 还是坏的, 至少人还活着, 希望就是有的!希望在明天......

EOF

FreeBSD下的jail无法使用socket

This summary is not available. Please click here to view the post.

Thursday, January 8, 2009

umount无法拆载文件系统

自从使用了NFS后, 问题就一箩箩. 还出现了这种情况:
# umount -f /mnt/nfs
device is busy

使用-f这种暴力方法都无法拆载, 到牛B的,google了一把, 看到了一个-l的选项.

如下是man的内容:
-l Lazy unmount. Detach the filesystem from the filesystem hier‐archy now, and cleanup all references to the filesystem as soon as it is not busy anymore. (Requires kernel 2.4.11 or later.)

shell中使用python代码

这样的使用方法我以前也写过, 不过, 此时非彼时, 当时有些事是没有解理到的:
1. shell还是shell, 就算加入了python, 它还是shell
1. python代码不能太长!会违反上面的原则
1. unix思想: 简单但尽完美完成自己那部分(流程的一个节点)

如果要在shell脚本中嵌入太多的代码, 那请使用python脚本吧

shell经久不衰, 已证明它的魅力。

那为什么又要使用在shell脚本python呢?

在shell中处理字符串不是很方便(至少我自己到的是这样认为), 需要对sed等等程序了解.

虽然在shell中引入python代码, 会使shell脚本代码增加长, 不好看,但至少简单的多行python代码比sed,awk等来得简单, 容易看懂和维护

shell中使用python代码, 有两个关键点:
1. python定在shell脚本文件中
1. shell与python代码片的信息交流

满足第一个条件是很简单的, 就是使用python的-c参数!

第二个条件的方法:
1. 使用arguments
1. 使用environments
1. 使用pipe

下面的代码片一次性使用了这三种方法:

export EnvOne="EnvOne"

ls -l | python -c """
import sys, os
#### read data from stdin ####
for line in sys.stdin.readlines():
print line.strip('\n')
#### get data from environment ####
print os.environ['EnvOne']
#### pass info from argument
print sys.argv[1]
print sys.argv[2]

""" Arg1 Arg2
exit 0

过程如下:
ls把结果通过pipe传数据给python
shell在启动python时还给点一些信息它:
1. 参数的方式给了信息
1. shell在产生子进程时还给了环境变量的信息

VBox的命令行控制

现在有个问题:
* VM在启动时系统有交互, 需要人工干涉(如cd-rom,keyboard的变化等等)
* 在CLI和GUI之间方便切换(命令行方便ssh管理, GUI方便管理员排错误)

下面的做法不行:
1. GUI程序下, 启动VM, 等一切正常后, 使用VBoxManage controlvm去pause暂停VM
2. 使用CLI:VBoxVRDP去继续VM,结果报错!

[!] FAILED calling vrdpServer->SetPort(vrdpPort) at line 847!
[!] Primary RC = E_ACCESSDENIED (0x80070005) - Access denied
[!] Full error info present: true , basic error info present: true
[!] Result Code = E_ACCESSDENIED (0x80070005) - Access denied
[!] Text = The machine is not mutable (state is 2)
[!] Component = Machine, Interface: IMachine, {1e509de4-d96c-4f44-8b94-860194f710ac}
[!] Callee = IVRDPServer, {f4584ae7-6bce-474b-83d6-17d235e6aa89}

主要是如下错误:
The machine is not mutable

就是不让修改VM的旧运行参数!

发现有一个VBoxManage modifyvm的命令.但是savestat后还是不能modify参数.

是没有运行时修改的? 试了一下真的可以修改参数:

#jessinio@ubuntu-test-1:~$ sudo VBoxManage modifyvm fedora9 -vrdpport 8765
VirtualBox Command Line Management Interface Version 2.0.2
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.

修改后, 现在要处理的就是是否可以在没有指定port的情况下, VBox会使用这个port

首先, GUI方式启动VM, 查看端口情况:没有发现自已定义的8765!!-_-!!!

savestat后, 使用VBoxVRDP还是不能启动!!

无奈下, 从CLI下启动VM:
#jessinio@ubuntu-test-1:~$ sudo VBoxVRDP -s fedora9
VirtualBox Headless Interface 2.0.2
(C) 2008 Sun Microsystems, Inc.
All rights reserved

Listening on port 8765

看可以出, 使用了8765端口!

命令行将之pause:
#jessinio@ubuntu-test-1:~$ sudo VBoxManage controlvm fedora9 savestate
VirtualBox Command Line Management Interface Version 2.0.2
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

很高兴, 在GUI中看到的VM是处于saved和可以被start的!! ^_^

从GUI启动pause的VM很正常,可以ssh到VM上!!

然后进行只关键的一步: 从GUI上pause VM和从CLI中恢复VM

GUI去pause是很简单的,也很正常!现在的问题是怎么从CLI中恢复VM!从上面的历史命令行中可以看出:VBoxVRDP在没有指定port的时候会使用VM的vrdpport参数(可以由VBoxManage modifyvm命令去修改), 那么也就是说: 启动被pause的VM不应该使用--port参数!!

一切OK!事实表现从的和自己猜想的一样!! good luck!


工作中还要求这种做法:CLI -> pause -> GUI

Sunday, January 4, 2009

tar包的QQ for Linux无法从$PATH中启动的处理

在gentoo下, 一般是下载QQ for linux的tar包安装.

但是tar包有一个问题:
创建一个link文件到/usr/bin下面还是无法从$PATH中方便启动
sudo ln -s ~/qqforlinux/qq /usr/bin/qq
启动QQ后出错

主要问题是qq for linux的tar包是被编译好的二进制,它代码中应该加入了去读取res.db的路径,如open("./res.db","r+")之类的语句.

可以使用如下脚本去处理:

sudo vim /usr/bin/qq
#!/bin/bash

cd /path/to/qqforlinux
./qq

然后修改一下这个文件的权限:
sudo chmod 755 /usr/bin/qq

OK

ftp的非交互式使用

同事有个需求, 要在linux机器上定时把文件上传到指定的ftp服务器上.

一想.ftp命令默认情况下都是交互式使用的.要shell去上传文件就会有问题.原来ftp命令有一个-i使之成为非交互式的,如下例子:

ftp -inv domain.com <<EOF
user UserName PassWord
ls .
bye
EOF

选项的含意:
-i表示使用非交互式
-n表示使用auto-login
-v表示使用long verbose

详细的使用说明最好view一把man手册

使gentoo的bash有ubuntu的bash补全功能

gentoo的console的确比ubuntu的漂亮多了。

但是默认的gentoo的bash没有ubuntu下的bash的补全好用。

无意中,发现ubuntu下的/etc有一个文件叫bash_completion。直觉告诉我这就是ubuntu下的命令行补全的关键。

在友人的提示下, emerge搜索一把, 真的有一包叫bash-completion

安装之:
sudo emerge bash-completion

按提示加以下内容到~/.bash_profile内
[[ -f /etc/profile.d/bash-completion ]] && source /etc/profile.d/bash-completion
* 这段代码的意思:如果指定的文件存在,就source入来.
* 把它加到.bash_profile内, 主要是因为它为login shell准备的

运行代码(或者配置好后再login一次)
sudo em (tab)(tab)
果然出提示了.

又看:
svn ch (tab)(tab)
发现没有提示.

这就不爽了!!不信gentoo没有办法!!!!
在ubuntu下
svn an (tab)(tab)补全了一annotate单词.
然后cd /etc中. 使用很好很强大的grep搜索一把:
grep -r "annotate" * 2>/dev/null|less

哈, 发现还有一个/etc/bash_completion.d的文件夹
ls /etc/bash_completion.d看到一个svnversion的文件.

copy到gentoo相应的文件夹下,OK!!!

nice!!!!!

gentoo的CFLAGS标志

为特定的CPU优化编译软件时会使用到一个叫CFLASGS的选项。

主要有三个选项。它在都在/etc/make.conf文件下

如果不清楚自已的CPU应该填什么,看见如下URL:

http://en.gentoo-wiki.com/wiki/Safe_Cflags

URL的最下面有不同的CPU的选项页面。

Thursday, January 1, 2009

让gentoo使用无线网络

要达到这个目标主要分为两部分:
1. 驱动部分
2. 应用配置部分

第一步是让系统能够驱动无线设备,第二步是让应用程序可以使用网络

首先,在进行第一步时, 需要了解自己的硬件情况:
lspci -vv看到如下信息:
01:00.0 Network controller: Broadcom Corporation BCM94311MCG wlan mini-PCI (rev 01)

还可以这样找:
jessinio@nio-laptop ~ $ lspci -n|grep 14e4:43
01:00.0 0280: 14e4:4311 (rev 01)

可以看到, 本人的bcm卡是11版本的,也是人家说是4311(bcm43xx)

bcm43xx的驱动自linux2.6.27开始7就被加入到kernel中了, 所以一般都把无线网卡驱动编译到内核中

Networking support -->
--Wireless
----Generic IEEE 802.11 Networking Stack (mac80211)
Device Drivers -->
--Network device support -->
----Wireless LAN -->
------Wireless LAN (IEEE 802.11)
------Broadcom 43xx wireless support (mac802.11 stack)

这样把内核编译好后,系统就有了bcm43xx的驱动. 但是无线网卡还是不能工作的, 还差无线卡网的firmware,firmware也称固件,类似主板的BIOS,详细可以看百科:
http://en.wikipedia.org/wiki/Firmware

bcm43xx无线卡的固件去哪里要呢?答案为:
http://linuxwireless.org/en/users/Drivers/bcm43xx

如何得到固件, 看上面的网页就OK了

驱动部分搞好, 到第二部分:应用配置部分
应用配置就是要让无线连接AP,并得到IP. 有两个命令行工具:
1. wireless-tools工具, 它包括了两个命令:iwconfig,iwlist, 此工具包只能连接WEP和没有加密的无线AP
2. wpa_supplicant.此工具是专门连接WPA无线AP的.目前它还有一些驱动是无法使用的

要使无线网得到IP(前提是网卡的驱动没有问题),需要使用dhcp的客户端程序.在ubuntu下有一个默认安装的工具叫dhclient,但是在gentoo下就不同了(当然也可以安装), 它们有什么区别呢?下面是比较:


dhclient net-misc/dhcp 由ISC(也是BIND DNS软件的开发人员)制作;高度可配置性。 配置起来过于复杂;软件十分臃肿;无法通过DHCP获得NTP服务器;默认不发送主机名。
dhcpcd net-misc/dhcpcd Gentoo一直以来的预设软件;不依赖其他外部软件;由Gentoo开发的。 有时很慢;当租约为无穷大时不会变成守护进程。
pump net-misc/pump 轻量级的;不依赖其他外部软件 不再被上游维护,不可靠,尤其在使用modem的时候;不能通过DHCP获得NIS服务器。
udhcpc net-misc/udhcp 轻量级的——最小的DHCP客户端,为嵌入式系统设计。 未经考验——没有任何发行版默认使用它,不能定义3秒以上的超时。
如下步骤可以让无线网得到IP:
#启动无线网卡
ifconfig wlan0 up
#查看周边的无线AP网络
iwlist wlan0 scan
#连接指定的AP无线网络
iwconfig wlan0 essid WEP_AP_NAME key WEP_AP_PASSWORD
#通过dhcp协议得到网络IP
dhcpcd wlan0

相关文档: http://en.gentoo-wiki.com/wiki/Wireless_Networking

EOF

.Xdefaults与.Xresources

看rxvt的man手册, 提到这两个文件, 但是是不是一样的呢?

gentoo下是不一样的, 因为是startx后, .Xresource文件没有被xrdb使用.只有.Xdefaults被使用.

但是在ubuntu下, 这两个都一样的.

猜:
.Xdefaults和.Xresources的关系就像是.xinitrc和.sessinio, startx和gdm的关系

没有深究!

touchpad的驱动安装

默认情况下, X服务器只能驱动touchpad最基本的功能: 光标的移动, 左右键

为了使touchpad有更多的功能. 需要使用touchpad的驱动

emerge synatics
此驱动为X服务器的桥接驱动, 安装后的so文件会放到如下地址:
/usr/lib/xorg/modules/input/synaptics_drv.so

为X服务器的桥接驱动, 那么, 他就由X去调用它, 因此, 需要配置X服务器的配置文件:
/etc/X11/xorg.conf

在"ServerLayout"一section中增加一个子节:
InputDevice "Touchpad" #其实此名可以随意 主要是一个section的名字罢了

然后增加一个section:
Section "InputDevice"
Identifier "Touchpad" #就是section的名字, 给人看的
Driver "synaptics"
Option "SendCoreEvents" "true"
Option "SHMConfig" "on"
# User customized stuff
Option "Protocol" "auto-dev"
Option "LeftEdge" "1700"
Option "RightEdge" "5300"
Option "TopEdge" "1700"
Option "BottomEdge" "4200"
Option "FingerLow" "25"
Option "FingerHigh" "30"
Option "MaxTapTime" "180"
Option "MaxTapMove" "220"
Option "VertScrollDelta" "100"
Option "HorizScrollDelta" "0" # this disables horizontal scrolling
Option "MinSpeed" "0.06"
Option "MaxSpeed" "0.16"
Option "AccelFactor" "0.0018"
Option "TapButton1" "1"
Option "TapButton2" "1"
Option "TapButton3" "1"
Option "LTCornerButton" "2"
Option "LBCornerButton" "0"
Option "RTCornerButton" "0"
Option "RBCornerButton" "0"
Option "LeftRightScrolling" "0" # this *should* disable leftrightscrolling
EndSection

重启一下X服务器, 就OK了, 不行就reboot机器

urxvt中使用scim中文输入, 随便说说scim的配置

情况:
1. 其它的X client可以使用scim输入法, 就是urxvt不用使用.
2. ubuntu时代可以使用, gentoo时代不可以使用

重点就是scim需要的几个环境变量, 下面一个个解释:
export LC_CTYPE="en_US.UTF-8"
* scim输入法需要locale变量来显示scim-setup的显示语言
export XIM=SCIM
* urxvt程序需要这个环境环境, 这里一定要为大写
export XMODIFIERS=@im=SCIM
* 与XIM服务器通信的程序, 这里一定要为大写
export GTK_IM_MODULE=xim
export QT_IM_MODULE=xim
* 指定GTK和QT的client程序都使用xim协议通信
* 比如firefox这种程序就需要有这样的环境变量
export XIM_PROGRAM=/usr/bin/scim
export XIM_ARGS="-d"
export DEPENDS="scim,scim-pinyin|scim-tables"

BWT:

上面的环境变量是把GTK和QT程序都使用X的古老输入系统(XIM), 现代的GTK和QT程序有一套新的输入系统, 使用这套输入系统需要scim有im-module特性(GTK下的im-module是scim默认支持的, QT下环境下需要特定的scim-qtimm)

新输入系统比旧的输入系统稳定
让GTK和QT程序使用新的输入系统应该使用下面的环境变量:
export XMODIFIERS=@im=SCIM
* 还是为大写
export GTK_IM_MODULE=scim
export QT_IM_MODULE=scim
* 这里为小写

增加小节:

在使用xfce4后(其实也不是使用xfce4后才知道的, 早就知道了,没有理会), 发现启动使用x Server resource 的程序很慢. 解决方式:
在$HOME/.Xdefaults文件中增加:
URxvt.imFont:-misc-fixed-medium-r-normal--7-70-75-75-c-50-iso8859-1

其实-misc-fixed-medium-r-normal--7-70-75-75-c-50-iso8859-1是随意增加的, 这样的记录在/usr/local/fonts/fonts.dir文件可以找到, 随意找一条就OK了!