把虚拟机放到内存里

在内存白菜价的今天,没个 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 里就完事了。

简单的 SSH 脚本

要进入不同的服务器配置东西,一条条的输入 ssh 命令,一两台没事,一旦数量大于10台,想死的心都有了,所以还是写 shell 来的方便点。

#!/usr/bin/expect -f

set port Port_Number
set user Username
set host Host Address
set password Password
set timeout -1

spawn ssh -D $port $user@$host
expect "*assword:*"
send "$password\r"
expect eof

很简单的一个,就是用了 expect 来进行交互,timeout 可以根据自己需要来设置时长,这里配合 -D 翻墙就一直在线吧。