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

局域网内获取公网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 里定时运行。

简单监控 MySQL 的脚本

放假前写的,监控服务器端的 MySQL 状态。

#!/bin/sh  
  
MUSER=MySQL User
MPASS=MySQL Password 
MHOST=MySQL Host  
MSTART="/etc/init.d/mysqld start"  
MADMIN=/usr/bin/mysqladmin 
MTO=Administrator Email 

$MADMIN -h $MHOST -u $MUSER -p"${MPASS}" ping 2>/dev/null 1>/dev/null
if [ $? -ne 0 ]; then  
    echo "Server ERROR: MySQL Service Stopped. Restart Service..."  
    $MSTART>/dev/null  
    sleep 3 
    o=$(ps cax | grep -c ' mysqld$')  
    if [ $o -eq 1 ]; then  
        echo "MySQL Restart Success."
    else  
        echo "MySQL Service Stopped." | mail -s "MySQL Server Crashed" $MTO
    fi  
 
else  
    echo "MySQL is alive"  
fi  

功能很简单,监控 MySQL 服务是否运行,如果挂了就尝试重启服务,重启失败就发邮件通知管理员。把这个 script 放到 crontabe 里就完事了。