分类 Linux 下的文章

现在最方便最便宜的存储,当属网盘了。于是想,是否可以利用来作为VPS的日常备份?Google了一下,很多教程。本来想用百度盘,毕竟2TB的免费空间肯定用不完。但是想想,还是用国外的吧,速度会更快。Google Drive的免费空间有15GB,而且已有了开源的同步工具,就选它了。

以下教程已经说得很详细了:
VPS每日自动备份到Google Drive
http://eamin.net/vps%E6%AF%8F%E6%97%A5%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E5%88%B0google-drive/

按照教程去配置同步工具grive,修改了一下备份脚本,如下(主要是去掉了数据库文件的加密操作):

[code]
#### begin file autobackup.sh ##########################
#!/bin/bash
# from http://eamin.net/vps%E6%AF%8F%E6%97%A5%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E5%88%B0google-drive/
# begin settings
# MySQL user
MYSQL_USER=ro
# MySQL password
MYSQL_PASS=123
# backup directory
BACKUPDIR=/opt/backup
# grive directory
GDRIVEDIR=/opt/grive/
# website directory
WEB_DATA=/opt/www/
# the password file for encrypting the database backup files
#PASSWDFILE=/home/passwd
# end settings

# naming rule of backup files
DataBakName=mysql_$(date +"%Y%m%d").tar.gz
WebBakName=www_$(date +%Y%m%d).tar.gz
# delete files three weeks ago
OldData=mysql_$(date -d -21day +"%Y%m%d").tar.gz
OldWeb=www_$(date -d -21day +"%Y%m%d").tar.gz

# Create the directory when not existed
if [ ! -d $BACKUPDIR ]; then
    mkdir -p $BACKUPDIR
fi

cd $BACKUPDIR

# begin backup database
DATABASES=`mysql -h "127.0.0.1" -u $MYSQL_USER -p$MYSQL_PASS -Bse 'show databases'`

for DB in $DATABASES; do

# ignore system tables
if [ "$DB" == "information_schema" -o "$DB" == "performance_schema" -o "$DB" == "mysql" ]; then
    continue
fi

# export data to backup file
SQLFILE="$BACKUPDIR/$DB.sql.gz"
#ENCFILE="$BACKUPDIR/$DB.sql.gz.enc"
mysqldump -h "127.0.0.1" -u $MYSQL_USER -p$MYSQL_PASS $DB | gzip -9 > $SQLFILE

# encrypt database backup file
#openssl des3 -in $SQLFILE -out $ENCFILE -pass file:$PASSWDFILE
# decrypt database backup file
#openssl des3 -d -in $ENCFILE -out $SQLFILE -pass file:$PASSWDFILE

# delete the file without encryption
#rm $SQLFILE
done
# end backup database

# compress and merge all the backup files
#tar zcf $BACKUPDIR/$DataBakName $BACKUPDIR/*.sql.gz.enc
#rm $BACKUPDIR/*.sql.gz.enc
tar zcf $BACKUPDIR/$DataBakName $BACKUPDIR/*.sql.gz
rm $BACKUPDIR/*.sql.gz

# backup website files
tar zcpf $BACKUPDIR/$WebBakName $WEB_DATA

cd $GDRIVEDIR
grive
rm $OldData
rm $OldWeb

# move the files to grive directory
mv $BACKUPDIR/$WebBakName $GDRIVEDIR/bwg01_backup
mv $BACKUPDIR/$DataBakName $GDRIVEDIR/bwg01_backup
grive

#### end file autobackup.sh ##########################
[/code]

使用“搬瓦工”的vps已经接近半年了。期间升级过配置,拥有128m内存“大内存”(真是泪流满面)和2GB硬盘空间。于是把blog和自己的网站都丢上去,抛弃那个又慢又小的虚拟空间。把过程中的问题都记录一下。

域名
第一次绑定域名和IP,走了点弯路。一开始不知道域名提供商不提供DNS服务,要自己找一个。
1)申请DNSPod,国内的免费DNS服务。添加域名,然后针对该域名添加两条A类型的记录,主机分别是“@”和“www”。
2)设置域名的DNS服务器地址为DNSPod的地址:
f1g1ns1.dnspod.net
f1g1ns2.dnspod.net
3)剩下就只有等待了。不过不用等多久就开通了。

Nginx
主要是PHP相关的设置:

location ~ \.php(\/.+)?$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock; #用SOCK比较快
    fastcgi_index index.php;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_buffers 8 16k; #避免跳转报502错误
    fastcgi_buffer_size 32k; #避免跳转报502错误
}

后面还要设置HTTPS,用于部署OwnCloud。

PHP和PHP-FPM
这里基本用的是默认配置,后面再考虑优化。

MySQL
前面已经配好了,而且是针对小内存的机器来优化的。

VIM
增加支持显示中文字符。修改 /etc/vim/vimrc 文件,字啊末尾增加如下代码:

set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set fileformats=unix
set encoding=prc

Wordpress迁移Typecho
主要是Wordpress太臃肿了,对于一个几乎只有自己看的Blog来说,不需要那么多东西。于是直接部署Typecho。利用相关的插件,导入Wordpress的数据即可。

大概就这样完成了迁移。后面的计划是部署OwnCloud,用来同步一些小文件。对了部署个私有SVN或者GIT服务器也是不错的。然后就是Laravel框架的学习了。

在128MB内存的VPS上折腾了一下MySQL,把过程总结一下记录下来。

1)配置文件
备份原配置文件,把官方配置样例中最低配置的配置文件复制过来,就可以了。命令如下:

mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
cp /usr/share/doc/mysql-server-5.5/examples/my-small.cnf /etc/mysql/my.cnf

2)禁用InnoDB
禁用InnoDB,为了节省内存。

详细参考:
小内存VPS上MySQL5.5内存优化——禁用Innodb引擎
http://hxs.fd.fj.cn/?action=show&id=48

简单来说,就是修改my.cnf,在[mysqld]下增加以下配置:

default-storage-engine = MyISAM
loose-skip-innodb
innodb=OFF

文中还提到MySQL 5.5,还需要添加以下配置,否则程序会很容易退出的:

loose-innodb-trx = 0
loose-innodb-locks = 0
loose-innodb-lock-waits = 0
loose-innodb-cmp = 0
loose-innodb-cmp-per-index = 0
loose-innodb-cmp-per-index-reset = 0
loose-innodb-cmp-reset = 0
loose-innodb-cmpmem = 0
loose-innodb-cmpmem-reset = 0
loose-innodb-buffer-page = 0
loose-innodb-buffer-page-lru = 0
loose-innodb-buffer-pool-stats = 0

3)设置默认字符集UTF-8
登录MySQL后,用以下命令查看字符集设置:

show variables like ‘character%’;

默认字符集一般是latin1,最简单是修改my.cnf文件
[client]增加:

default-character-set = utf8

[mysqld]增加:

character-set-server = utf8

[mysql]增加:

default-character-set = utf8

4)重启MySQL服务

PS. MySQL的错误日志在 /var/lib/mysql/*.err

使用“搬瓦工”的超级便宜VPS已经快3个月了,除了有时晚饭时间比较卡以外,其它方面都工作良好。于是心里开始发痒,想再利用它做更多的事情。

首先,肯定是升级Micro中最高性能的服务,128MB内存版。用过64MB版后,才深深感受到内存的重要性,而“搬瓦工”的空间就是内存比较少。升级过程很简单,用PayPal花费足够的美刀就OK了。付款后立刻看到效果!第一次感受到128MB原来也可以很爽(记得第一台电脑的内存也有256MB啊)。

然后是重装Shadowsocks服务。就为了以后升级方便,因为一开始是用源码编译安装的。关于Shadowsocks服务,真心推荐shadowsocks-libev,用C写的就是效率高、省内存,小内存主机必备。详细安装教程见:http://shadowsocks.org/en/download/servers.html

简单来说就是加入安装源,再用apt-get install安装。

wget -O- http://shadowsocks.org/debian/1D27208A.gpg | sudo apt-key add -
echo "deb http://shadowsocks.org/debian wheezy main" >> /etc/apt/sources.list
apt-get update
apt-get install shadowsocks

再然后是想学下Laravel这个PHP框架(感觉没CodeIgniter那么容易上手),慢慢来吧。

PS.昨天一个网友说也买了个“搬瓦工”的VPS,但是3个月后开始变得好慢。虽然有点担心,但是起码还有三个月可以玩玩,重点是就算不能用,损失也不会很严重(毕竟我的那个才5.99美刀/年)

某天发现“搬瓦工”的特价优惠,推出4美元/年的VPS!(https://bandwagonhost.com/cart.php)配置如下:
Micro-64
Self-managed
HDD: 1.5 GB
RAM: 64 MB
CPU: 1x Intel Xeon
BW: 100 GB/mo

虽然配置很差,但是比我原来用的国外空间还要便宜!除了内存比较难看以外,其它配置都非常满意,而且这是VPS,不是普通网站空间!最后,经过胖子的试用和帮助付费后,终于入手了属于我自己的VPS!

入手后,第一件事是装上Debian 7 x86_64 minimal,然后是部署现在比较流行的Shadowsocks,解决接上Google的问题。

Shadowsocks服务,选择用shadowsocks-libev,部署起来比Python的版本简单。详细部署过程参考了这个:http://www.lucong.com.cn/lulu/centos-debian-shadowsocks-libev.html
简单总结了一下命令如下:

apt-get install build-essential autoconf libtool libssl-dev gcc -y
apt-get install git -y
git clone https://github.com/madeye/shadowsocks-libev.git
cd shadowsocks-libev 
./configure 
make && make install

运行服务:

nohup /usr/local/bin/ss-server -s IP地址 -p 端口 -k 密码 -m 加密方式 &

设置开机启动

echo "nohup /usr/local/bin/ss-server -s IP地址 -p 端口 -k 密码 -m 加密方式 &" >> /opt/ss_start
echo "ssh /opt/ss_start" >> /etc/rc.local

然后,为了安全起见,新建了一个普通用户来登录ssh。这时才发现没学好Linux。经过一番Google后勉强新建了一个用户,但是登录后发现方向键乱码。按这个 http://bbs.chinaunix.net/thread-1942074-1-1.html 去修改默认的shell后解决。

总结一下吧。首先,深深感受到国外的美好生活,这么便宜的VPS在国内是永远找不到的,更不要提那几百块/月的云服务。其次,Linux的命令需要努力学习。

4月中,终于换了个公司,重新投入到软件开发的行业。公司给我配置了个笔记本,Thinkpad E440(等了一个月才拿到手),于是今天装上Lubuntu 14.04。

安装过程比以前的台式机、前两个笔记本,都简单。iso文件用YUMI弄成启动盘,然后就图形化界面中点“下一步”。然而问题总是出现在安装之后的配置过程,比如内核没带该网卡的驱动,自带了很烂的iBUS输入法,任务栏没显示音量控制图标,大量的软件需要重新安装配置等等。直到写本文时,还没弄好。

过程中,突然感慨,好像我就一直在用Linux,都只停留在系统安装和软件设置上,没弄出个像样的东西。例如,昨天同事问我Linux中如何把禁掉的端口打开,我都没想到用iptable处理。

换上第3个笔记本了,希望能继续努力~

今天突然发现“二奶”上装的Windows7被错误格式化了,于是想办法重装。折腾了一个晚上,直到11点半,还没搞好。

其实只要用个WinPE启动盘,备份一下C盘的MBR,再用个Ghost装上新系统就完了。但是手上没有WinPE的可启动U盘,也没有能够在Linux上能够使用的制作工具。当然,用过WINE,也用过KVM上运行的WinXP,都不能很好地访问U盘。也折腾过用YUMI制作的启动盘,但不懂其menu的设置,手动添加的iso文件不能启动。最后放弃,只好明天回公司再弄。

洗澡时,不禁在想,其实装个Win7还有没有意义?Lubuntu已经很好地满足我自己的需求了,Chromium、MPlayer、Eclipse、Nginx、PHP等,都能满足日常开发和娱乐的需求。网上支付的话,建行的小额支付,可以用手机验证。至于游戏,WINE能够运行一些经典的游戏,还有手机也能玩一些好玩的。至于那些“大作”,早就没心思去“折腾”了。何不借此机会,把Windows铲除干净?

还是先睡吧~过了明天,就是周末了~

PS.发现近来特健忘,看来有必要开发个任务备忘的手机软件!

由于想把Raspberry Pi改造成无线中继,所以插了两个USB网卡上去。后来发现系统启动后,无线网卡的名称每次都不一定相同,以致启动桥接服务的shell脚本出错。但笔记本上的Lubuntu 12.10却是无线网卡每次的名称都不变。同样是基于Debian,Raspbian也应该可以实现无线网卡名称固定(其实就是跟MAC绑定网络接口名称)。翻查了资料,还是Debian的Wiki比较靠谱。见:http://wiki.debian.org/udev

最后还是比较懒,从Lubuntu 12.10上复制文件 /etc/udev/rules.d/70-persistent-net.rules 到Raspbian上,再改改来用就可以了。该文件修改如下:

## begin the file /etc/udev/rules.d/70-persistent-net.rules #################
# USB Ethernet (usb)
#SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="aa:bb:cc:dd:ee:ff", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# USB device 0x0cf3:0x1006 (Mercury MW54U)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="aa:bb:cc:dd:ee:ff", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"

# USB device 0x0bda:0x8171 (Netcore NW338)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="aa:bb:cc:dd:ee:ff", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan1"
## end the file /etc/udev/rules.d/70-persistent-net.rules #################

其中aa:bb:cc:dd:ee:ff要替换成网卡对应的MAC码。

为了重新安装Lubuntu 12.10,需要备份原来的12.04。因为很多资料还在上面,装好系统就可以直接复制过来了。如果直接复制到Windows分区,权限信息会丢失。于是找了以下方案:

方案一:GHOST备份。

GHOST默认不支持EXT4文件系统,需要先设置options->Image/Tape,选择Image All。

优点:
备份速度快,备份文件小。

缺点:
1)不能查看、提取备份文件。本来用Ghost Explorer可以查看或提取,设置修改备份文件的,但是ETX4的备份文件什么也没显示。
2)需要在DOS、Windows等非Linux系统上进行。

方案二:dd命令。参考资料:http://blog.csdn.net/shendl/article/details/7384755
1)U盘启动Linux LiveCD(现在Linux的发行版一般都支持LiveCD了),进入盘上的系统,打开命令行,执行如下命令,查看第一个硬盘(sda)的分区情况:

sudo fdisk -u -l /dev/sda

2)然后执行备份命令:

dd bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sda1 of=/linux_bak.img

这样,就可以把硬盘上的第一个分区(sda1)数据全部copy到linux_bak.img文件中。
3)还原。进入Linux LiveCD,打开命令行,执行如下命令:

dd if=/linux_bak.img of=/dev/sda1

这样把备份文件还原到硬盘的第一个分区上了。
4)浏览或修改备份文件。执行以下命令:

sudo mkdir /mnt/bak chmod 777 /mnt/bak mount /linux_bak.img /mnt/bak

进入/mnt/bak文件夹,就可以浏览或者修改备份文件了。

优点:
1)一切都是Linux的操作。
2)可以对备份文件进行浏览、提取或修改文件。

缺点:
1)需要在Linux LiveCD上进行备份和还原。
2)只能是备份分区或整个硬盘,如果分区划分的空间比较大,生成的备份文件也一样大。
3)速度慢,特别是备份容量很大的分区。

方案三:tar命令。参开资料:http://www.yesure.net/archives/6984.html

1)备份,在Linux系统中执行以下命令:

sudo tar -cvpzf /media/disk/linux_bak.tgz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=/media /

2)还原:

sudo tar -xvpzf /media/disk/linux_bak.tgz -C /

优点:
1)可以在使用中的Linux上直接备份。
2)只备份存在的文件,且备份文件经过压缩,比原始文件小。
3)备份文件就是个Zip文件,可以直接打开浏览、修改。

缺点:
1)备份速度上不如GHOST。
2)备份文件比较大的话,打开速度很慢。

最后,我还是采用了第三个方案。资料上还提示,可以在新立得上装个sbackup(图形界面备份还原工具)。有空再试试吧。

经过昨天的实践,终于搞定Ubuntu共享WiFi功能,而且不是Ad-hoc模式。从此“二奶”可以作为无线中继使用(这里指的是在Ubuntu系统下)。参考教程:
Ubuntu共享WiFi(AP)给Android/更新方法二 http://weibin.me/538

首先很重要的是,要确定无线网卡驱动是否支持master mode。如果不支持,就别想了。然后就可以按照教程安装并设置hostapd和dnsmasq。根据教程,写了个脚本,方便启动或关闭该功能。第一次写比较长的Shell脚本,所以该脚本还是不太完善,但基本可用。要注意,/etc/dnsmasq.conf还是要手动修改。脚本如下:

#!/bin/sh
# begin file: sharewifi

# Setup wireless AP, share the Internet from interface0 to interface1
# USAGE: sharewifi [ start | stop ] interface0 interface1
# EXAMPLE: sharewifi start wlan1 wlan0

help( )
{
cat << HELP
Setup wireless AP, share the Internet from interface0 to interface1
USAGE: sharewifi [ help | start | stop ] interface0 interface1
EXAMPLE: sharewifi start wlan1 wlan0
HELP
exit 0
}

start( )
{
echo Starting share wifi ......
echo Share Internet $port_in to $port_out

# Configure iptable rules
iptables -F
iptables -t nat -A POSTROUTING -s 192.168.7.0/24 -o $port_in -j MASQUERADE
iptables -A FORWARD -s 192.168.7.0/24 -o $port_in -j ACCEPT
iptables -A FORWARD -d 192.168.7.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -i $port_in -j ACCEPT

# Log the message of route
#iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN: "

# Save iptable rules
sh -c "iptables-save > /etc/iptables.rules"

# Configure hostapd
hostapd_conf=/etc/hostapd/hostapd.conf
[ -f $hostapd_conf ] && rm $hostapd_conf
echo >> $hostapd_conf interface=$port_out
echo >> $hostapd_conf driver=nl80211
echo >> $hostapd_conf ssid=AO522-Tether
echo >> $hostapd_conf channel=1
echo >> $hostapd_conf hw_mode=g
echo >> $hostapd_conf auth_algs=1
echo >> $hostapd_conf wpa=3
echo >> $hostapd_conf wpa_passphrase=1234567890
echo >> $hostapd_conf wpa_key_mgmt=WPA-PSK
echo >> $hostapd_conf wpa_pairwise=TKIP CCMP
echo >> $hostapd_conf rsn_pairwise=CCMP
chmod 755 $hostapd_conf

# Configure /etc/dnsmasq.conf
#interface=wlan0
#bind-interfaces #这个是只监听wlan0,没有之会检测所有卡
#except-interface=lo
#dhcp-range=10.1.1.10,10.1.1.110,6h #设置dhcp地址范

killall named
killall hostapd
ifconfig $port_out 192.168.7.1
hostapd -B $hostapd_conf
/etc/init.d/dnsmasq restart

echo Sucess share wifi

exit 0
}

stop( )
{
echo Stopping share wifi ......
echo Stop share Internet $port_in to $port_out

# Configure iptable rules
iptables -F

# Log the message of route
#iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN: "

# Save iptable rules
sh -c "iptables-save > /etc/iptables.rules"

# Configure hostapd
hostapd_conf=/etc/hostapd/hostapd.conf
[ -f $hostapd_conf ] && rm $hostapd_conf

# Configure /etc/dnsmasq.conf

killall named
killall hostapd
ifconfig $port_out down
ifconfig $port_out del 192.168.7.1
ifconfig $port_out up

echo Sucess stop share wifi

exit 0
}
#port_in is the network interface which connected to Internet, and default wlan1.
port_in=wlan1

#port_out is the network interface which will be setup AP, and default wlan0.
port_out=wlan0

if [ -n "$2" ]; then
port_in=$2

if [ -n "$3" ]; then
port_out=$3
fi
fi

case "$1" in
"help" )
help ;;
"start" )
start ;;
"stop" )
stop ;;
*)
help ;;
esac

# end file: sharewifi

PS. “二奶”升级到Lubuntu 12.04 LTS,感觉更好用了~