http://mirrors.163.com/ubuntu-releases/11.10/ 上面的每个镜像都有对应的一个zsync文件,这个文件就是同步升级镜像用的。

首先我们需要安装zsync

1
sudo apt-get install zsync

然后将已有的镜像重命名

比如现在有一个ubuntu的beta版的镜像,将它重命名成和服务器上的镜像相同的文件名。

开始下载

1
zsync http://mirrors.163.com/ubuntu-releases/11.10/ubuntu-11.10-server-amd64.iso.zsync

然后等待下载完成就可以了,使用zsync能节省大量的下载时间。

制作zsync文件

zsync有一个zsyncmake的工具用来制作.zsync文件。基本用法如下:

zsyncmake -C -u http://localhost/xxx.iso xxx.iso

然后就会生成一个xxx.iso.zsync文件,把这个文件上传到http服务器上就可以了。

上个月因为原先使用的yardvps tree1方案的vps网络频繁抽风,不得已的情况下买了一个ucvps,使用了将近一个月,一直很稳定。但也发现了几点让人特别不爽的地方。

  1. 装openbox,开firefox去国外的网盘下载东西 ,结果一分钟不到xorg就直接出错挂掉,内存也没超没找出是什么原因。
  2. 因为我使用了mongodb,而ucvps用的是openvz,没有swap。
  3. ucvps居然封锁了smtp,导致博客评论功能一直无法正常的发送邮件。

smtp的问题可以通过使用非25端口的smtp服务解决,我是ssh到另一台服务器,通过那台服务器代理解决的。还是挺不爽的,很想换掉他,所以昨天去买了一个123com的kvm主机。结果中彩,那个分配到的Jessie node一直无法开机。发TK过去问才知道这个主机坏了好几天了,到现在都还没解决,今天早上发了TK让他们给我退款,不知道能不能退的回来。Jessie node从15开始坏,到现在已经19号了,还是坏的,他们的技术似乎有点问题啊。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#-*- encoding:utf-8 -*-

import smtplib, mimetypes
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.Header import Header
from email.mime.image import MIMEImage

msg = MIMEMultipart()
msg['From'] = "xxx@qq.com"
msg['To'] = 'xxx@qq.com'
msg['Subject'] = Header('中文的标题', charset='UTF-8')#中文主题

#添加邮件内容
txt = MIMEText("这是邮件内容~~", _subtype='plain', _charset='UTF-8')
#添加html的邮件内容
#txt = MIMEText("<a href='http://blog.plotcup.com'>Chronos的博客</a>", _subtype='html', _charset='UTF-8')
msg.attach(txt)

#发送邮件
smtp = smtplib.SMTP()
smtp.connect('smtp.qq.com:25')
smtp.login('xxx', 'xxx')
smtp.sendmail('xxx@qq.com', 'xxx@qq.com', msg.as_string())
smtp.quit()
print '邮件发送成功'

这个博客程序在三个月前就开始写了,后来一直放在那里没动,最近才重新开始写。今天基本把这个给完工了,然后部署到vps上。部署的时候遇到点问题,我的附件是放在kyotocabinet上的,然后自己实现了一个网络层,原来在ubuntu11.10下一直好好的。今天部署到ubuntu.10.04下就出问题了,死活无法提示put请求,后来发现是libevent的版本问题,换成 libevent-2.0.16-stable.tar.gz 就没问题了。

新的程序使用ReStructureText做为写作工具,比起名气更大的MarkDown,我还是更喜欢rst,尤其是用rst在sphinx里面写文档。

搜索引擎直接使用google,自己不想弄这块了。

原来我也是想直接把附件放在磁盘上的,后来看了一些分布式文件系统,想在一个地图项目中使用,但找来找去都不是特别喜欢,后来脑袋一发热就自己写了一个基于kyotocabinet的,功能非常少。以后如果数据量大的时候再扩充。

用如下命令查看输入的硬件信息:

xinput list

会显示如下信息:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ USB OPTICAL MOUSE                         id=10   [slave  pointer  (2)]
⎜   ↳ FSPPS/2 Sentelic FingerSensingPad         id=12   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ USB2.0 UVC 1.3M Webcam                    id=9    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=11   [slave  keyboard (3)]

像我的这个触控板的id号是12,使用:

xinput set-prop 12 "Device Enabled" 0

这条命令去禁用它。启用只要把最后的0改成1就可以。

我使用的是ubuntu11.10,使用sublime text2的时候发现死活无法输入中文,也不是快捷键的问题。从网上找了一个解决方案是说安装scim,然后使用scim-brige方式,并调整一下配置就可以在sublime text2里面输入中文,但我参照那个方法还是死活无法输入中文。后来想起来原先在debian6上面使用fcitx可以在sublime text2上输入中文的,卸了scim,安装上fcitx。结果依旧无法输入中文,shit,差点就放弃Ubuntu直接装Debian算了。后来想想可能是fcitx的版本问题,我的debian用的是testing的源,里面的软件比较新,fcitx比Ubuntu上的要新一点,版本是4.2.0-1,而Ubuntu上面的是4.0的。

添加fcitx的ppa源

sudo add-apt-repository ppa:fcitx-team/nightly

执行源更新

sudo apt-get update

安装新版的fcitx

sudo apt-get install fcitx

然后更改Sublime Text2里面的按键配置,将ctrl+space改成alt+/。

tip

至于绑定到什么按键根据自己喜好决定

然后重新打开sublime text2就可以在里面输入中文了,但光标是无法跟随的。不过这个也无所谓了,能输入就好。

今天想测试一下py-leveldb,试试将小文件存储在这个数据库上的性能如何。但安装这个数据库的时候花了好长时间,svn里面的那个snappy一直无法编译。

下载py-leveldb:

svn checkout http://py-leveldb.googlecode.com/svn/trunk/ py-leveldb-read-only

下载过来的源代码里面会有一个snappy-read-only的目录,在ubuntu上编译的时候需要安装automake,libtool,autoconf这几个包:

sudo apt-get install autoconf libtool automake

执行snappy-read-only目录中的autogen.sh,但是一直提示我:

configure.ac:41: error: possibly undefined macro: AC_DEFINE
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.

查了半天也没找到个解决方法,后来直接去单独下了个snappy,删掉snappy-read-only,并解压下载过来的snappy,并将目录名改为snappy-read-only:

rm snappy-read-only -R -f
tar xvzf snappy-1.0.5.tar.gz
mv snappy-1.0.5 snappy-read-only

编辑compile_leveldb.sh文件,改成如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh

(
cd snappy-read-only;
./configure --enable-shared=no --enable-static=yes;
make clean;
make CXXFLAGS='-g -O2 -fPIC';
)

(
cd leveldb-read-only;
make clean;
make OPT='-fPIC -O2 -DNDEBUG -DSNAPPY -I../snappy-read-only' SNAPPY_CFLAGS=''
)

然后运行一下./compile_leveldb.sh,会自动编译好leveldb和snappy。再执行下面命令安装好py-leveldb:

python setup.py build
sudo python setup.py install

我用的是debian系统,安装mogilefs也挺方便的,直接用cpan:

cpan -i MogileFS::Server
cpan -i MogileFS::Utils
cpan -i MogileFS::Client

这样就已经安装好了,太方便了。

Mogilefs的Trackers节点需要再安装一个mysql:

apt-get install mysql-server

然后建立数据库:

mysql> CREATE DATABASE mogilefs;
mysql> GRANT ALL ON mogilefs.* TO ‘mogile’@'%’;
mysql> SET PASSWORD FOR ‘mogile’@'%’ = OLD_PASSWORD( ‘sekrit’ );
mysql> FLUSH PRIVILEGES;
mysql> quit

伪分布模式就是在一台单机上运行hadoop,开发测试的时候非常有用,特别是针对那些想学习又没多余的机子的童鞋。不过初次安装hadoop还是碰到挺多问题的,经查找都是一些版本问题引起的,当然还有权限和配置不当的关系。

首先去下载jdk和hadoop,我下的是 jdk-6u31-linux-x64.binhadoop-0.20.205.0.tar.gz

一、安装jdk

将下载过来的文件存到~目录下然后执行:

chmod +x jdk-6u31-linux-x64.bin
./jdk-6u31-linux-x64.bin

安装完后会在~目录下出现一个jdk1.6.0_31目录,记住这个路径,等会要在hadoop-env.sh文件里面设置环境变量

二、配置ssh无密码登陆

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

用如下命令验证一下:

ssh localhost

三、安装hadoop

将下载过来的hadoop解压到~目录,并进入hadoop-0.20.205.0目录中。 :

tar xvzf hadoop-0.20.205.0.tar.gz -C ~/
cd ~/hadoop-0.20.205.0

四、配置环境变量

在conf/hadoop-env.sh文件的最后添加如下代码:

export JAVA_HOME=~/jdk1.6.0_31
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

五、配置hadoop

修改conf/core-site.xml文件,添加namenode的配置

1
2
3
4
5
6
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

修改conf/hdfs-site.xml文件,设定文件在hdfs中只保留一份,因为伪分布只有一台datanode。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<configuration>
<!-- dfs.name.dir和dfs.data.dir最好设置一下 -->
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

tip

这里要使用绝对路径。

修改conf/mapred-site.xml文件,添加jobtracker配置

1
2
3
4
5
6
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>

最后运行bin目录下的start-all.sh就可以启动了。 :

bin/start-all.sh

可以通过运行jdk的bin里的jps命令查看是否已经成功运行。

六、后记

刚开始配置这个的时候下了个jdk1.7版本的,结果死活无法启动,提示没有-jvm参数。后来想到可能是版本问题就又去下了个jdk1.6的,然后启动namenode成功了。想复制一个文件到hdfs,发现jobtracker居然没启动起来。错误提示信息如下:

Does not contain a valid host:port authority: local

看了半天没看出来就又去网上找了找别人写的教程,原来我下的这个版本的配置文件是分开的,而官网上的0.18版本的教程里面的配置文件都是写在core-site.xml文件里面的。所以jobtracker的配置无法识别到了。

有些linux下如果没有配置dfs.name.dir和dfs.data.dir的目录的话有可能会出现明明live datanodes有一个,而且也不是处在safemode下,但就是put的时候会出错:

could only be replicated to 0 nodes, instead of 1

提示没有datanode可用,后来经常多方排查才知道,原来像ubuntu和debian之类的tmp目录的文件系统是不能被hadoop所支持的,所以最好自己设置一下。

我在debian上面编译安装了KyotoCabinet和KyotoTycoon后,运行ktserver出现错误。

ktserver: error while loading shared libraries: libkyototycoon.so.2: cannot open shared object file: No such file or directory

这个原因应该是找不到lib库,但是libkytotycoon.so.2确实是存在的,位置在/usr/local/lib。后来发现原来/usr/local/lib这个目录默认是没有加入到lib的寻找列表里面的,只要执行一下ldconfig就可以找到了。

ldconfig