2010年09月5日, 12:49 下午
一个工程有多个子目录。每个子目录下都有一个Makefile,将该子目录下的源代码编译为一个.o文件。根目录下的Makefile控制将这些.o链接到一起形成最终的执行文件。执行文件只依赖.o文件,对每个.o的处理规则都是进入其子目录然后make。这种布局会遇到一个问题,就是子目录里有源码的修改,根目录Makefile定义的依赖关系里检测不到,就不会重新编译。被这个问题困扰很久,今天看qt的Makefile,发现了一个很巧的解决方法。
subdir1/sub1.o: FORCE
cd subdir1 && make
subdir2/sub2.o: FORCE
cd subdir2 && make
FORCE:
2010年09月4日, 11:28 下午
- 把硬盘拆下来,挂到别的机器上,并且拆下那台机器的硬盘;
- 在别的机器上安装Linux;
- 硬盘换回原先的机器;
- done
同样的方法用来安装Windows,硬件的相似度必备比较高才行。Linux貌似并不保存硬件信息,而是每次启动时重新检测。至少我这两台年龄相差6岁的机器没有半点儿相同的硬件。
2010年08月15日, 12:24 下午
在内核源码目录下使用下面命令:
grep SYSCALL_DEFINE[0-6]\(XXXX * -R --include=*.c
XXXX可以替换为任何系统调用名。未必能找到所有的,八九不离十吧。至少2.6.32下是这样。
2010年03月31日, 1:11 下午
给笔记本接上了两个usb键盘,做了个测试,觉得挺有意思的。
Windows XP下,用记事本:
- 两个键盘同时按“a”,出现“aa”;
- 三个键盘同时按“a”,出现“aaa”;
- 三个键盘分别按“a”、“b”、“c”,得到abc的随机排列。
貌似没啥特别的。好玩的是在Linux上。
Ubuntu 9.10,Linux 2.6.31。在控制台,一切正常,和XP表现一样。在gnome里:
- 两个键盘同时按“a”,出现“aaa”;
- 三个键盘同时按“a”,出现“aaaaa”;
- 三个键盘分别按“a”、“b”、“c”,得到abc的随机排列。
- 两个键盘同时按“a”,另一个键盘按“b”,输出结果里必然有一个“b”和三个“a”。
总结一下gnome的规律。设同时按动按键X的键盘个数为k,那么向系统输入的字符X的数目为2*k-1。
不知道这是否该算作一个bug。没有装KDE、xfce等其它窗口管理器,不能推断这是gnome的问题还是X或其它组件的问题。
2010年03月22日, 7:37 下午
曾管理一台同时有教育网、网通和电信三条接入线路的服务器多年,最近终于略有小成,领略了多线管理的要点。想到现在vpn因为某些伟大的原因变得盛行,这也是一种多线路接入,故撰写此文,同时做为自己的备忘。
为简化,下面仅描述双线的情况。假设两条线路的配置如下:
- eth0设备,IP:1.1.1.1,网关:1.1.1.9
- eth1设备,IP:2.2.2.2,网关:2.2.2.9
1. 配置基本路由
路由决定了从本地访问不同网站会自动从哪条线路走。比如运行命令:
route add -net 3.3.3.3 netmask 255.255.255.0 gw 1.1.1.9
此后所有对3.3.3.x的访问都会自动从线路一出去。线路一访问哪里快,就把到哪里的路由都配到线路一,然后把线路二配成缺省路由:
route add -net default gw 2.2.2.9
这样所有不从线路一走的访问就从线路二走了。当然,也可以让线路一做缺省,线路二逐条配,具体情况就看怎么方便了。
2.配置基于源地址的策略路由
对于一般用户而言,完成基本路由的配置就够了。但如果这台机器希望通过两条线路同时对外提供服务,或者想使用后面第4条介绍的东东,那么就必须配置源地址路由。为什么呢?原因并不难理解,但挺绕嘴,所以我就不说了。
首先修改/etc/iproute2/rt_tables,增加类似下面两行:
100 line1
101 line2
再用下面命令完成路由配置:
ip route add default via 1.1.1.9 table line1
ip rule add from 1.1.1.1 table line1
ip route add default via 2.2.2.9 table line2
ip rule add from 2.2.2.2 table line2
上面命令的意思是让所有从1.1.1.1发出的包都走1.1.1.9这个网关,所有从2.2.2.2发出的包都走2.2.2.9这个网关。
3. 测速
ping是最常用的测速命令。如果想测试到一个网站(比如:3.3.3.3)的速度,可以先把它路由到线路一,ping一次,再路由到线路二,再ping一次,比较ping的结果决定把它放入哪个路由。这样太麻烦了。无论当前路由是什么样,用下面命令
ping -I eth0 3.3.3.3
都是从线路一ping 3.3.3.3。同理:
ping -I eth1 3.3.3.3
都是从线路二ping 3.3.3.3。
我还拼凑出一个脚本,命名为mping,可以一行命令从多条线路ping一个网址,如下:
#!/bin/sh
ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' |
cut -d: -f2 | awk '{ print $1}' |
xargs --verbose -I srcip fping $* -eS srcip 2>&1
使用它之前得先安装fping。
4. 若干命令忽视路由的参数
很多命令都能忽视路由配置,直接通过参数指定走哪条线路,列出我知道的几个:
wget --bind-address=x.x.x.x ......
ssh -b x.x.x.x
lftp中set net:socket-bind-ipv4 x.x.x.x
squid中可以这样配置:
acl bgfw dstdomain .google.com .wikipedia.org .............
tcp_outgoing_address x.x.x.x bgfw
我猜想,应该有某个命令可以以wrapper,通过它启动的进程发出网络连接时的来源地址永远是这个命令指定的地址。但我没搜到这样的东东。如果谁知道,赶快告诉我!
2010年03月11日, 12:54 下午
要给一台服务器升级内存,懒得去机房查型号,就用google发现了dmidecode这个linux命令。用它轻松了解了主机品牌、型号、内存型号和布局等许多细节信息。记录一下,备忘。
2009年10月7日, 10:35 上午
rdesktop is a powerful RDP client for Linux. The inability of switch applications between remote side and local side by hot key makes it a little uncomfortable. Look around the internet, you can find many requests for the feature but no solutions. So I made the patch. It do things like:
- Double press Ctrl+Alt+Left or Ctrl+Alt+Right to switch local active workspaces.
- Double press Ctrl+Alt+Tab to switch local active window.
- Other hot keys are sent directly to remote machine.
- If rdesktop is running in fullscreen mode (-f), Ctrl+Alt+Left/Right/Tab will toggle it to window mode first. After switching back, it can NOT toggle to fullscreen automatically. Press Ctrl+Alt+Enter to do that. (I know this is boring. But it is the best I can do. Rdesktop use override_redirect to implement fullscreen which makes it always the top-most window no matter which workspace/window you have switched to)
Download and unpack rdesktop.tgz to get a patched executable file: rdesktop. Overwrite /usr/bin/rdesktop with it. That’s all. The file was compiled with all debian/ubuntu official patches and tested in Ubuntu 9.10 (Karmic). It should work in other Linux distribution too. If it does or does not work in your environment, please leave a comment to report.
switch_local_workspace_and_window.patch is the code.
2009年10月6日, 2:26 下午
此贴已老,请移步rdesktop Patch: Switch Local Workspaces and Windows by Local Hot Keys
经常本地运行Linux,用rdesktop连接远程的Windows主机,两边配合工作。如果能通过快捷键切换两个桌面环境,会很方便。但rdesktop窗口会吸走所有的按键,发给远程桌面,包括Window Manager管理的热键。加上“-K”参数,远端就收不到很多热键了,比如最常用的Alt+Tab。在网上搜了一下,很多人都为此困扰,但没有任何解决办法。可能大牛们都只用纯用*nix,根本无视rdesktop的存在吧。于是,我就自己做了这个补丁,实现了下面的效果:
- Linux桌面上要有至少两个Workspace,一个运行rdesktop,其余的本地用
- 在rdesktop中,连按两次及以上的Ctrl+Alt+Left/Right,可以切换Workspace,也就是虚拟桌面
- 建议启动rdesktop的时候,不加“-K”参数
- 如果用全屏方式(-f)启动rdesktop,切换Workspace的时候,rdesktop会跟着走,达不到想要的效果。这和rdesktop用override_redirect方式实现全屏窗口有关。我不知道该怎么解决。如果有了解的朋友,请不吝赐教。我现在是用“-D”参数隐藏rdesktop窗口的外框,用“-g”设一个足够大的窗口,刚好上顶上面的panel,下踩下面的panel。
rdesktop_1.6.0-2ubuntu99_i386.deb是我在Ubuntu karmic上编译好的安装文件,估计Debian上也能用。用“sudo dpkg -i rdesktop_1.6.0_2ubuntu99_i386.deb”安装。其它平台可以下载rdesktop源代码,打上99_switch_desktop_support.dpatch补丁,自己编译试试,估计应该都能好用。
2009年07月4日, 3:53 下午
搞了个挺大的阵列,fdisk、mkfs之后发现,一个分区最大只能用到2TB。google之后获知,有两种方法解决:
- 不分区,直接对磁盘设备(就是/dev/xxx)mkfs。此时的极限就是文件系统,而不是古老的分区表了。
- 用GPT分区,可以突破2TB的限制。