NVIDIA: could not open the device file /dev/nvidia2 (Input/output error)

把机器上的 GTX470 换下,上古老的 GTX295,开机后发现死活只能认出两块卡,其他机器都没问题怎么唯独这个不行?xorg.conf 改了无数遍也没效果,正准备换回来的时候发现这货上面装的 Ubuntu 竟然还是32位的,Google 一单发现问题所在:”The error happens on 32 bit linux systems when you try to initiate more graphic cards than the kernel can allocate memory for. This does not happen on 64 bit systems.” 看来这是32位独占 bug 呀!

知道问题所在,解决起来就比较简单了,加载内核的时候指定 vmalloc 参数。

vim /etc/default/grub

找到 GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”,在后面添加 vmalloc=256M

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vmalloc=256M"
update-grub

重启。

在这个连手机都要进入64位的时代,桌面PC还有什么理由停留在32位?!

把虚拟机放到内存里

在内存白菜价的今天,没个 8G、16G 的你都不好意思开口!但是在不需要跑程序时,这么多内存闲着可真够浪费的,本着节能减排的宗旨,必须把这空闲的利用起来。

用过 SSD 都应该对那种几近变态的 I/O 读写能力深有感触,就目前 SSD 的价格相对 HDD 来说还是贵了。但是可以利用大内存来曲线实现这种高速的 I/O 读写。市面上流行的 Linux 发行版都会划分出一块内存区域来做 ramfs,位于 /dev/shm,大小为实际物理内存的一半,可以直接利用这块区域而无需手动挂载 tmpfs.

很简单的一个脚本,就是利用 rsync 将硬盘上的虚拟机目录同步到内存中执行,然后每隔半小时同步一次防止丢数据。

#!/bin/bash

# Your tmpfs VirtualBox folder
VBOXTMPFS=/dev/shm/VirtualBox_VMs
# Your VirtualBox folder
VBOXHOME="${HOME}/VirtualBox_VMs"
# Seconds interval for rsync
INTERVAL=1800

# Check tmp folder
if [ ! -d "${VBOXTMPFS}" ]; then
    mkdir -p ${VBOXTMPFS}
fi

# Sync to tmpfs
echo "Syching ${VBOXHOME} to ${VBOXTMPFS}"
rsync -avi --delete "${VBOXHOME}/" "${VBOXTMPFS}/"

echo "Executing reverse sync every ${INTERVAL} seconds"
( while true; do sleep ${INTERVAL}; rsync -avi --delete "${VBOXTMPFS}/" "${VBOXHOME}/"; done; )&
SYNC=$!

echo "Launching VirtualBox"
virtualbox

echo "VirtualBox closed, kill auto sync and reverse sync one last time"
echo "Please wait..."
kill $!
rsync -avi --delete "${VBOXTMPFS}/" "${VBOXHOME}/"
echo "Done!"

效果绝对能接受,VirtualBox 里开一个 openSUSE 11.2 基本20s搞定。前提是内存足够大,要是低于10G的就要折腾一下了,毕竟 /dev/shm 只有内存的一半大小。

当然,这只是一个应用,你完全可以将 Chrome、Safari、Firefox等浏览器的缓存放到这里面来,加快读写速度。

PS:/dev/shm 本质还是 RAM 存储,所以一旦断电数据就没有了,切记!

小内存 VPS 释放内存

这完全是蛋疼闲着无聊的脚本,由于 Linux 强大的内存管理机制,在 Linux 下释放内存和在 Windows 桌面上不断右键刷新一样无聊。但有些 VPS 提供商会设置内存报警,一封封的报警邮件看着都烦,你还不能把它扔垃圾箱;干脆写个脚本,当内存低于16MB释放一次,然后放到 crontab 里几小时执行一次。

#!/bin/sh

freemem=$(cat /proc/meminfo | grep "MemFree" | awk '{print $2}')

if [ $freemem -le 16384 ]; then
	date >> /var/log/mem.log
	free -m >> /var/log/mem.log
	sync
	echo 3 > /proc/sys/vm/drop_caches
	free -m >> /var/log/mem.log
else
	echo "释放你妹啊,内存管够!"
fi

BugZilla 中创建以 bug_id 命名的文件夹

Bugzilla 是 Mozilla 公司提供的一个开源的免费缺陷跟踪工具。作为一个产品缺陷的记录及跟踪工具,它能够建立一个完善的 Bug 跟踪体系。

项目需要用大量的 GDS 文件来进行测试,一个 GDS 文件动辄上百兆,使用 BugZilla 上传测试用例肯定不现实了。一开始把一堆测试文件散仓的放在某个文件夹下,当 bugid 增加到3位数后,里面的文件已经混乱不堪了!必须要想办法整理一个干净的测试用目录,即方便测试,又可以间接的减少 debug 的时间。

大致的流程就是在 file bug 的时候生成一个 Product/Component/id 这样的文件夹,然后开启 BugZilla 的 AttachURL,直接填写测试用例地址

先搞定生成文件夹,修改 post_bug.cgi

查找这个bugid所属的 product:

my $Product = $dbh->selectrow_array('SELECT name FROM products WHERE id in (SELECT product_id FROM bugs WHERE bug_id = ?)', undef, $id);

可以用同样的方法查找 component 后创建文件夹,好在 perl 可以直接使用 mkdir 直接创建文件夹

mkdir "PATH/$Product/$Component/$bugid";

BugZilla 默认的 AttachURL 只支持 http|https|ftp,为了方便使用 NFS,所以需要添加 file:// 这样的 URL,修改 Bugzilla/Attachment.pm line 555

($data && $data =~ m#^(http|https|ftp|file)://\S+#)

局域网内获取公网IP脚本

公司没有固定 IP,每次 VPN 过去前都要先电话问一下那边的 IP 是多少,非常不方便,在不花钱的情况下只能曲线解决了。

思路很简单,从提供在线查询 IP 的网站上获取路由当前的 IP,然后和上一次存储的 IP 地址进行对比,不一样的话就覆盖上一次的记录并将现在获取到的 IP 以邮件的形式发送出去。

#!/bin/sh

IPFILE="extip.txt"
SENDTO=ADMINISTRATOR MAIL

if [ -f $IPFILE ]; then
	SAVEDIP=`cat $IPFILE`
else
	SAVEDIP="0"
fi

extIP=`wget -O - -q http://www.3322.org/dyndns/getip`

if [ "$SAVEDIP" = "0" -o "$SAVEDIP" != $extIP ]; then
	echo $extIP > $IPFILE
	mail -s "External IP Update" $SENDTO < $IPFILE
	cat $IPFILE
else
	echo "No change"
fi

将脚本扔到 crontab 里定时运行。