Linux
Nginx使用Linux内存加速静态文件访问
by Elton on 二.05, 2012, under Linux, Web
Nginx是一个非常出色的静态资源web服务器。如果你嫌它还不够快,可以把放在磁盘中的文件,映射到内存中,减少高并发下的磁盘IO。
先做几个假设。nginx.conf中所配置站点的路径是/home/wwwroot/res,站点所对应文件原始存储路径:/opt/web/res
shell脚本非常简单,思路就是拷贝资源文件到内存中,然后在把网站的静态文件链接指向到内存中即可。具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #! /bin/bash res_path="/opt/web/res" mem_path="/dev/shm/res" lk_path="/home/wwwroot/res" if [ ! -d "$mem_path" ]; then cp -r "$res_path" "$mem_path" fi if [ ! -L "$lk_path" ]; then ln -s "$mem_path" "$lk_path" fi |
分布式文件系统MFS、Ceph、GlusterFS、Lustre的比较
by Elton on 十二.29, 2011, under Linux
摘自存储实验室
MongoDB与内存管理
by Elton on 八.20, 2011, under Database, Linux
但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了。
据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果:
1 2 3 4 5 6 | shell> top -p $(pidof mongod) Mem: 32872124k total, 30065320k used, 2806804k free, 245020k buffers Swap: 2097144k total, 100k used, 2097044k free, 26482048k cached VIRT RES SHR %MEM 1892g 21g 21g 69.6 |
这台MongoDB服务器有没有性能问题?大家可以一边思考一边继续阅读。
先讲讲Linux是如何管理内存的
在Linux里(别的系统也差不多),内存有物理内存和虚拟内存之说,物理内存是什么自然无需解释,虚拟内存实际是物理内存的抽象,多数情况下,出于方便性的考虑,程序访问的都是虚拟内存地址,然后操作系统会把它翻译成物理内存地址。
很多人会把虚拟内存和Swap混为一谈,实际上Swap只是虚拟内存引申出的一种技术而已:操作系统一旦物理内存不足,为了腾出内存空间存放新内容,就会把当前物理内存中的内容放到交换分区里,稍后用到的时候再取回来,需要注意的是,Swap的使用可能会带来性能问题,偶尔为之无需紧张,糟糕的是物理内存和交换分区频繁的发生数据交换,这被称之为Swap颠簸,一旦发生这种情况,先要明确是什么原因造成的,如果是内存不足就好办了,加内存就可以解决,不过有的时候即使内存充足也可能会出现这种问题,比如MySQL就有可能出现这样的情况,解决方法是限制使用Swap:
1 | shell> sysctl -w vm.swappiness=0 |
查看内存情况最常用的是free命令:
1 2 3 4 5 | shell> free -m total used free shared buffers cached Mem: 32101 29377 2723 0 239 25880 -/+ buffers/cache: 3258 28842 Swap: 2047 0 2047 |
新手看到used一栏数值偏大,free一栏数值偏小,往往会认为内存要用光了。其实并非如此,之所以这样是因为每当我们操作文件的时候,Linux都会尽可能的把文件缓存到内存里,这样下次访问的时候,就可以直接从内存中取结果,所以cached一栏的数值非常的大,不过不用担心,这部分内存是可回收的,操作系统会按照LRU算法淘汰冷数据。还有一个buffers,也是可回收的,它和cache的区别,可以参考维基百科。
知道了原理,我们就可以推算出系统可用的内存是free + buffers + cached:
1 2 | shell> echo "2723 + 239 + 25880" | bc -l 28842 |
至于系统实际使用的内存是used – buffers – cached:
1 2 | shell> echo "29377 - 239 - 25880" | bc -l 3258 |
除了free命令,还可以使用sar命令:
1 2 3 4 5 6 7 | shell> sar -r kbmemfree kbmemused %memused kbbuffers kbcached 3224392 29647732 90.19 246116 26070160 shell> sar -W pswpin/s pswpout/s 0.00 0.00 |
希望你没有被%memused吓到,如果不幸言中,重读本文。
再说说MongoDB是如何使用内存的
目前,MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟内存管理器去处理,这样的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,事实上MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起。
有时候,即便MongoDB使用的是64位操作系统,也可能会遭遇臭名昭著的OOM问题,出现这种情况,多半是因为限制了虚拟内存的大小所致,可以这样查看当前值:
1 | shell> ulimit -a | grep 'virtual' |
多数操作系统缺省都是把它设置成unlimited的,如果你的操作系统不是,可以这样修改:
1 | shell> ulimit -v unlimited |
不过要注意的是,ulimit的使用是有上下文的,最好放在MongoDB的启动脚本里。
有时候,出于某些原因,你可能想释放掉MongoDB占用的内存,不过前面说了,内存管理工作是由虚拟内存管理器控制的,所以通常你只能通过重启服务来释放内存,你一定不齿于这样的方法,幸好可以使用MongoDB内置的closeAllDatabases命令达到目的:
1 2 | mongo> use admin mongo> db.runCommand({closeAllDatabases:1}) |
另外,通过调整内核参数drop_caches也可以释放缓存:
1 | shell> sysctl -w vm.drop_caches=1 |
平时可以通过mongo命令行来监控MongoDB的内存使用情况,如下所示:
1 2 3 4 5 6 | mongo> db.serverStatus().mem: { "resident" : 22346, "virtual" : 1938524, "mapped" : 962283 } |
还可以通过mongostat命令来监控MongoDB的内存使用情况,如下所示:
1 2 3 | shell> mongostat mapped vsize res faults 940g 1893g 21.9g 0 |
其中内存相关字段的含义是:
- mapped:映射到内存的数据大小
- visze:占用的虚拟内存大小
- res:占用的驻留内存大小
注:如果操作不能在内存中完成,结果faults列的数值不会是0,视大小可能有性能问题。
在上面的结果中,vsize是mapped的两倍,而mapped等于数据文件的大小,所以说vsize是数据文件的两倍,之所以会这样,是因为本例中,MongoDB开启了journal,需要在内存里多映射一次数据文件,如果关闭journal,则vsize和mapped大致相当。
如果想验证这一点,可以在开启或关闭journal后,通过pmap命令来观察文件映射情况:
1 | shell> pmap $(pidof mongod) |
到底MongoDB配备多大内存合适?宽泛点来说,多多益善,如果要确切点来说,这实际取决于你的数据及索引的大小,内存如果能够装下全部数据加索引是最佳情况,不过很多时候,数据都会比内存大,比如本文所涉及的MongoDB实例:
1 2 3 4 5 | mongo> db.stats() { "dataSize" : 1004862191980, "indexSize" : 1335929664 } |
本例中索引只有1G多,内存完全能装下,而数据文件则达到了1T,估计很难找到这么大内存,此时保证内存能装下热数据即可,至于热数据是多少,取决于具体的应用。如此一来内存大小就明确了:内存 > 索引 + 热数据。
原文引自:火丁笔记
在 Ubuntu 上安装和配置 OpenStack Nova
by Elton on 八.16, 2011, under Linux
OpenStack 是由 Rackspace 和 NASA 共同开发的云计算平台,帮助服务商和企业内部实现类似于 Amazon EC2 和 S3 的云基础架构服务(Infrastructure as a Service, IaaS)。OpenStack 包含两个主要模块:Nova 和 Swift,前者是 NASA 开发的虚拟服务器部署和业务计算模块;后者是 Rackspack 开发的分布式云存储模块,两者可以一起用,也可以分开单独用。OpenStack 是开源项目,除了有 Rackspace 和 NASA 的大力支持外,后面还有包括 Dell, Citrix, Cisco, Canonical 这些重量级公司的贡献和支持,发展速度非常快,有取代另一个业界领先开源云平台 Eucalyptus 的态势。
OpenStack 是 Python 2.6 写的,CentOS 5.6 上默认的是 Python 2.4 的环境并且还有很多依赖关系不容易升级到 2.6,所以在 Ubuntu 上安装会简单一些,而且 Ubuntu 是 OpenStack 的官方首选系统,文档都是按 Ubuntu 写的,所以这里 VPSee 采用最新的 Ubuntu 11.04 Server 64bit 版本来安装和配置 OpenStack Nova.
配置网络
在安装完基本的 Ubuntu 11.04 Server 系统后升级和更新整个系统,安装完 bridge-utils 包后重启系统:
1 2 3 4 5 6 | $ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install bridge-utils $ sudo reboot |
配置网桥:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $ sudo vi /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 172.16.39.111 netmask 255.255.254.0 gateway 172.16.38.1 auto br100 iface br100 inet static bridge_ports eth1 bridge_stp off bridge_maxwait 0 bridge_fd 0 address 192.168.0.1 netmask 255.255.0.0 broadcast 192.168.255.255 |
安装 NTP 服务
OpenStack Nova 需要 NTP 服务器来保持所有节点服务器(Cloud Compute)的时间同步,所以需要在前端控制服务器(Cloud Controller)上安装 NTP 服务器,然后在节点服务器上安装 NTP 客户端保持与前端的同步:
1 2 3 4 5 6 7 | $ sudo apt-get install ntp $ sudo vi /etc/ntp.conf server 127.127.1.0 fudge 127.127.1.0 stratum 10 $ sudo /etc/init.d/ntp restart |
安装和配置 MySQL 数据库
OpenStack Nova 需要数据库的支持,这里选用 MySQL(当然也可以用其他的数据库,比如 PostgreSQL 等):
1 | $ sudo apt-get install mysql-server |
修改 MySQL 绑定地址,以便其他的节点服务器也能访问这个数据库:
1 2 3 4 5 6 7 | $ sudo vi /etc/mysql/my.cnf ... #bind-address = 127.0.0.1 bind-address = 0.0.0.0 ... $ sudo /etc/init.d/mysql restart |
创建一个名为 nova 的数据库,并设置 root 从任何 IP 访问的权限和密码:
1 2 3 4 5 | $ sudo mysql -uroot -ppassword -e 'CREATE DATABASE nova;' $ sudo mysql -uroot -ppassword -e "GRANT ALL PRIVILEGES ON *.* TO \ 'root'@'%' WITH GRANT OPTION;" $ sudo mysql -uroot -ppassword -e "SET PASSWORD FOR \ 'root'@'%' = PASSWORD('password');" |
安装 Glance 镜像服务
Glance 是个镜像服务器,用来给 OpenStack Nova 提供操作系统镜像(image)服务,提供可选择的操作系统模版(镜像)。
1 | $ sudo apt-get install glance |
安装 OpenStack Nova
OpenStack Nova 已经进入 Ubuntu 11.04 源,所以直接安装就可以了,不必源码安装:
1 2 3 4 5 6 | $ sudo apt-get install rabbitmq-server nova-common nova-doc python-nova nova-api nova-network nova-volume nova-objectstore nova-scheduler nova-compute $ sudo apt-get install -y euca2ools $ sudo apt-get install -y unzip |
配置 Nova:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $ sudo vi /etc/nova/nova.conf --dhcpbridge_flagfile=/etc/nova/nova.conf --dhcpbridge=/usr/bin/nova-dhcpbridge --logdir=/var/log/nova --state_path=/var/lib/nova --lock_path=/var/lock/nova --verbose --s3_host=172.16.39.111 --rabbit_host=192.168.0.1 --cc_host=192.168.0.1 --ec2_url=http://172.16.39.111:8773/services/Cloud --fixed_range=192.168.0.0/16 --network_size=8 --FAKE_subdomain=ec2 --routing_source_ip=192.168.0.1 --sql_connection=mysql://root:password@172.16.39.111/nova --glance_host=192.168.0.1 --image_service=nova.image.glance.GlanceImageService |
重启 nova 相关服务以便设置生效:
1 2 3 4 | $ sudo restart libvirt-bin; sudo restart nova-network; sudo restart nova-compute; sudo restart nova-api; sudo restart nova-objectstore; sudo restart nova-scheduler; sudo restart nova-volume; sudo restart glance-api; sudo restart glance-registry |
使用 Nova
开始使用 Nova 前需要创建 nova 数据库表、创建网络、创建管理员帐号、创建云并联到刚才创建的管理员上:
1 2 3 4 5 | $ sudo nova-manage db sync $ sudo nova-manage network create 192.168.0.0/24 1 255 $ sudo nova-manage floating create 10.10.10.2 10.10.10.224/27 $ sudo nova-manage user admin vpsee $ sudo nova-manage project create mycloud vpsee |
因为多个管理员可以创建多个不同的云,所以某个云的管理员需要特定的权限才能访问和管理自己的 Nova 云,创建权限信息,并解压到自己的目录里,需要注意的是每次使用 nova 管理云的时候都需要读取 novarc 里面的配置信息:
1 2 3 4 5 6 7 8 | $ mkdir /home/vpsee/creds $ sudo nova-manage project zipfile mycloud vpsee /home/vpsee/creds/novacreds.zip $ cd /home/vpsee/creds $ unzip novacreds.zip $ sudo chown -R vpsee:vpsee /home/vpsee/creds/ $ source /home/vpsee/creds/novarc |
每次用 nova 的时候都要用到 novarc 里面的环境变量,每次 source novarc 很麻烦,所以最好加到 .bashrc 里面:
1 2 | $ cat /home/vpsee/creds/novarc >> /home/vpsee/.bashrc $ source /home/vpsee/.bashrc |
再次重启 nova 相关的所有服务:
1 2 3 4 | $ sudo restart libvirt-bin; sudo restart nova-network; sudo restart nova-compute; sudo restart nova-api; sudo restart nova-objectstore; sudo restart nova-scheduler; sudo restart nova-volume; sudo restart glance-api; sudo restart glance-registry |
如果一切正常的话,应该可以打印出如下的类似信息:
1 2 3 4 5 6 | $ euca-describe-availability-zones verbose AVAILABILITYZONE nova available AVAILABILITYZONE |- node00 AVAILABILITYZONE | |- nova-scheduler enabled :-) 2011-05-22 10:32:31 AVAILABILITYZONE | |- nova-network enabled :-) 2011-05-22 10:32:32 AVAILABILITYZONE | |- nova-compute enabled :-) 2011-05-22 10:32:24 |
启动第一个实例
启动实例之前需要先上传一个系统模版,我们称之为镜像(image),自己制作操作系统镜像有点麻烦(请看:为 OpenStack Nova 制作 Ubuntu 镜像 和 为 OpenStack Nova 制作 Windows 镜像。),这里直接使用一个已经做好的 Ubuntu 10.10 版本镜像,下载已经做好的镜像文件并上传到镜像服务器(这里镜像服务器和前端服务器在同一台物理服务器上):
1 2 3 | $ wget http://c0179148.cdn1.cloudfiles.rackspacecloud.com/ubuntu1010-UEC-localuser-image.tar.gz $ uec-publish-tarball ubuntu1010-UEC-localuser-image.tar.gz ubuntu1010-bucket x86_64 |
列出云里现有的可以加载的镜像,并以某个镜像(比如编号为 ami-00000003)为模版启动一个实例(操作系统):
1 2 3 4 5 6 | $ euca-describe-images IMAGE aki-00000001 ubuntu1010-bucket/vmlinuz-2.6.32-28-server.manifest.xml available public x86_64 kernel IMAGE ari-00000002 ubuntu1010-bucket/initrd.img-2.6.32-28-server.manifest.xmavailable public x86_64 ramdisk IMAGE ami-00000003 ubuntu1010-bucket/maverick-server-uec-amd64.img.manifest.xml available public x86_64 machine aki-00000001 ari-00000002 $ euca-run-instances -k mykey -t m1.tiny ami-00000003 |
检查一下实例是否成功启动和运行:
1 2 3 4 | $ virsh list Id Name State ---------------------------------- 1 instance-00000001 running |
访问实例
启动实例后怎么访问呢?和访问 VPS 一样,需要 IP 地址然后 ssh 访问,还记得上面的网络配置么,新创建的系统将按照 192.168.0.x 的形式分配 IP,所以 192.168.0.3 就是刚刚 euca-run-instances 创建的实例的 IP 地址:
1 | $ ssh ubuntu@192.168.0.3 |
摘自:vpsee.com
通过JNI实现Java对C/C++的调用
by Elton on 七.29, 2011, under C/C++, Java, Linux
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
大致步骤
- 编写带有native声明的方法的java类
- 使用javac命令编译所编写的java类
- 使用javah命令生成扩展名为h的头文件
- 使用C/C++实现本地方法
- 将C/C++编写的文件生成动态连接库
1) 编写java程序:
1 2 3 4 5 6 7 8 9 10 11 12 | public class HelloNative{ public native void greeting();//所有native所修饰的都是本地方法 static{ System.loadLibrary("HelloNative");//载入本地库 } public static void main(String[] args){ new HelloNative().greeting(); // System.out.println(System.getProperty("java.library.path")); } } |
声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明该方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。 Load动态库:System.loadLibrary(“HelloNative”);加载动态库(我们可以这样理解:我们的方法 greeting()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“HelloNative”是动态库的名字。
2) 编译
1 | javac HelloNative.java |
3) 生成扩展名为h的头文件
1 | javah HelloNative |
命令执行后会在当前目录下生产一个c的头文件,名字为HelloNative.h。内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloNative */ #ifndef _Included_HelloNative #define _Included_HelloNative #ifdef __cplusplus extern "C" { #endif /* * Class: HelloNative * Method: greeting * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloNative_greeting (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif |
这个h文件相当于我们在java里面的接口,这里声明了一个 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致
4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。
1 2 3 4 5 6 7 8 9 | #include <stdio.h> #include <jni.h> #include "HelloNative.h" JNIEXPORT void JNICALL Java_HelloNative_greeting (JNIEnv * env, jobject obj) { printf("Hello, Native!\n"); } |
5) 生成动态库
1 | gcc -fPIC -I/home/elton/jdk/include -I/home/elton/jdk/include/linux -shared -o libHelloNative.so HelloNative.c |
注意,必须告知编译器jni.h所在的接口位置。linux的动态库都是以lib开头,以.so结尾的,要遵守这个命名规范。-fPIC是告诉编译器生成跟位置无关的动态链接库
命令执行后,会在当前目录生成一个libHelloNative.so的动态链接库文件
6) 运行程序
1 | java -Djava.library.path=. HelloNative |
必须指定java.library.path变量的内容,告诉java你的动态链接库的位置。
或者在命令行上输入
1 | export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH |
这样就不用每次调试的时候都输入-Djava.library.path=.这个参数了。
当你部署的时候,你通过System.out.println(System.getProperty(“java.library.path”));得到你系统的java.library.path位置,然后把你的动态链接库拷贝到这个目录中。我用的是ubuntu 11.04 64位版本,得到的结果是
1 | /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib |
这样你的动态链接库就永远都会被java访问到了,不用每次指定环境变量了。
让Redis使用TCMalloc,实现高性能NOSql服务器
by Elton on 七.28, 2011, under C/C++, Linux, NoSQL
TCMalloc(Thread-Caching Malloc)是google开发的开源工具──“google-perftools”中的成员。与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多,可以在很大程度上提高MySQL服务器在高并发情况下的性能,降低系统负载。
TCMalloc库的安装步骤(Linux环境):
Step 1. 64位操作系统请先安装libunwind库(32位操作系统不要安装)
libunwind库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。
1 2 3 4 5 6 | wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz tar zxvf libunwind-0.99-alpha.tar.gz cd libunwind-0.99-alpha/ CFLAGS=-fPIC ./configure make CFLAGS=-fPIC make CFLAGS=-fPIC install |
Step 2、安装google-perftools:
1 2 3 4 5 6 7 8 | wget http://google-perftools.googlecode.com/files/google-perftools-1.8.1.tar.gz tar zxvf google-perftools-1.8.1.tar.gz cd google-perftools-1.8.1/ ./configure --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal make && make install sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf #如果没有这个文件,自己建一个 sudo /sbin/ldconfig |
Step 3. 安装Redis
1 2 3 4 5 | $ curl -O http://redis.googlecode.com/files/redis-2.2.12.tar.gz $ tar xzvf redis-2.2.12.tar.gz $ cd redis-2.2.12 $ make USE_TCMALLOC=yes $ sudo make install |
Step 4. 检查tcmalloc是否生效
1 2 | sudo lsof -n | grep tcmalloc redis-ser 31590 elton mem REG 8,3 1155539 4856411 /usr/local/lib/libtcmalloc_minimal.so.0.2.1 |
Step 5. 测试Redis
1 2 3 4 5 6 7 8 9 10 11 12 | # 修改配置文件: vim redis.conf # 找到 daemonize,将后面的no改为yes,让其可以以服务方式运行 # 然后启动 redis: $ ./redis-server ./redis.conf #连接数据库进行测试 $ src/redis-cli redis> set foo bar OK redis> get foo "bar" |
ubuntu 11.04安装OpenCV
by Elton on 七.27, 2011, under C/C++, Linux
Step 1:安装必要的依赖包
1 | sudo apt-get install build-essential libgtk2.0-dev libjpeg62-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev |
Step 2:安装ffmpeg
1 2 3 4 5 6 7 | cd ~ wget http://ffmpeg.org/releases/ffmpeg-0.7-rc1.tar.gz tar -xvzf ffmpeg-0.7-rc1.tar.gz cd ffmpeg-0.7-rc1 ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libxvid --enable-x11grab --enable-swscale --enable-shared make sudo make install |
Step 3:安装OpenCV 2.3
1 2 3 4 5 6 7 8 | cd ~ wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.3/OpenCV-2.3.0.tar.bz2 tar -xvf OpenCV-2.3.0.tar.bz2 cd OpenCV-2.3.0/ mkdir release cd releasecmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_TBB=ON -D WITH_V4L=OFF -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON .. make sudo make intall |
Step 4:添加库的路径
1 | sudo vim /etc/ld.so.conf.d/opencv.conf |
加入:
1 | /usr/local/lib |
更新系统库
1 | $sudo ldconfig |
设置环境变量
1 | $sudo vim /etc/environment |
加入
1 | PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig |
至此,OpenCV的设置都完成了。
Step 5:测试
进入OpenCV源代码目录中的sample
1 2 3 | cd ~/OpenCV-2.3.0/samples/c chmod +x build_all.sh ./build_all.sh |
然后执行
1 | ./facedetect --cascade="/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg |
你应该可以看到以下图片,说明OpenCV运行正常

ubuntu 11.04安装gcc 4.6.1
by Elton on 七.27, 2011, under C/C++, Linux
首先下载相应的源代码:
ftp://ftp.dti.ad.jp/pub/lang/gcc/releases/gcc-4.6.1/
#下载 gcc-4.6.1.tar.bz2
ftp://ftp.dti.ad.jp/pub/lang/gcc/infrastructure/
#下载 gmp-4.3.2.tar.bz2 mpfr-2.4.2.tar.bz2 mpc-0.8.1.tar.gz
Step 0:
1 2 3 | $sudo apt-get install build-essential $sudo apt-get install zlibc $sudo apt-get install zlib1g-dev |
Step 1: 安装 gmp-4.3.2
1 2 3 4 | #cd to src_dir $./configure --prefix=/usr/local/gmp-4.3.2 $make $sudo make install |
Step 2: 安装 mpfr-2.4.2
1 2 3 4 | #cd to src_dir $./configure --prefix=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2 $make $sudo make install |
Step 3: 安装 mpc-0.8.1
1 2 3 4 | #cd to src_dir $./configure --prefix=/usr/local/mpc-0.8.1 --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2 $make $sudo make install |
Step 4: 安装 gcc-4.6.0
1 2 3 4 5 | $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-0.8.1/lib:/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-2.4.2/lib #cd to src_dir $./configure --prefix=/usr/local/gcc-4.6.1 --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2 --with-mpc=/usr/local/mpc-0.8.1 $make $sudo make install |
Step 5: 多版本支持
为了让ubuntu支持多个gcc版本,需要做以下设置:
1 2 3 4 | $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 40 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-4.6.1/bin/gcc 60 #选择你需要的版本 $sudo update-alternatives --config gcc |
Step 6:添加新版共享库
为了在编译软件时候,可以使用到最新的共享库
1 | $sudo vim /etc/ld.so.conf.d/x86_64-linux-gnu.conf |
添加下面内容
/usr/local/gcc-4.6.1/lib64/
保存后执行,更新共享库
1 | $sudo ldconfig |
安装史上最牛的vimrc
by Elton on 七.19, 2011, under Linux
平时大家都会用到vim,发现一个不错的vimrc,大家可以试着用下。
通过一下命令安装这个vimrc
1 2 3 4 5 | $ mkdir ~/.vim_runtime $ svn co svn://orangoo.com/vim ~/.vim_runtime $ cat ~/.vim_runtime/install.sh $ sh ~/.vim_runtime/install.sh <system> <sytem> can be `mac`, `linux` or `windows` |
安装好后的vim看起来像这个样子

ubuntu下自动安装雅黑字体脚本
by Elton on 七.18, 2011, under Linux
安装ubuntu的时候,总是需要美化中文字体。 微软雅黑是比较好的中文字体美化方案。 下面的这个脚本可以帮助大家自动来美化中文字体。
1 2 3 4 | wget -O get-fonts.sh.zip http://files.cnblogs.com/DengYangjun/get-fonts.sh.zip unzip -o get-fonts.sh.zip 1>/dev/null chmod a+x get-fonts.sh ./get-fonts.sh |
删除下载的字体安装脚本文件:
1 | rm get-fonts.sh get-fonts.sh.zip 2>/dev/null |
恢复以前的字体设置:
1 2 3 4 5 | cd /etc/fonts/conf.avail sudo mv 51-local.conf.old 51-local.conf 2>/dev/null sudo mv 69-language-selector-zh-cn.conf.old 69-language-selector-zh-cn.conf 2>/dev/null sudo rm -f -r /usr/share/fonts/truetype/myfonts 2>/dev/null cd - |
修正记录:
#1.添加了最新的Windows 7的微软雅黑字体。(附件大小限制,未实现)
2.修正了CRT渲染的配置文件的链接错误。
3.添加字体:Agency FB
4.添加字体设置恢复功能。


