centos中安装xen虚拟机

2012年4月17日 没有评论

安装xen前需要检查CPU是否支持虚拟化,虚拟化又分全虚拟化和半虚拟化。
半虚拟检查:结果大于0表示支持

cat /proc/cpuinfo | grep flags | grep pae | wc -l

全虚拟化检查:结果大于0表示支持

cat /proc/cpuinfo | egrep '(vmx|svm)' | wc -l

其中vmx是intel cpu 标志,svm是amd cpu 标志

如果CPU支持虚拟化才能使用xen,centos 5.6下安装xen可以直接使用yum来安装。安装命令如下:

yum –y install kernel-xen xen

安装好后在/boot/grub/menu.lst可以看到带有xen内核的启动项,把它设置为默认启动项。重启后就可以安装虚拟机了。

道听途说得到的结论是半虚拟化(PV)的性能原则上比全虚拟化(FV)要好,我的机器支持半虚拟化,所有采用这种方式来创建虚拟机。由于半虚拟化时不能使用 cdrom,iso的方式安装,只能使用网络方式安装,如 http,ftp,nfs,这里采用http的方式。http服务用nginx,源是iso文件,操作步骤为:

  1. mount iso 文件 mount -o loop /iso文件的路径/iso文件名 /mnt/iso
  2. 在nginx的根目录下建立一个cs文件夹,拷贝 /mnt/iso下的文件到刚建立的cs文件夹中,注意nginx中的cs目录需要有list的权限,故需要在nginx中配置autoindex on,默认是off

使用dd命令创建一个固定大小的空间作为虚拟机的硬盘,这里创建了一个10G的文件

dd if=/dev/zero of=/data/xenimgs/purecentos5_6.img bs=1024K count=10240

安装命令:

virt-install -p -n purecentos5_6 -r 512 --vcpus=2 --file=/data/xenimgs/purecentos5_6.img  -l http://192.168.1.68/cs/  --vnc  --prompt

说明
-p 使用半虚拟
-n 虚拟机的名称  默认会在/etc/xen中创建一个同名的配置文件
-r 虚拟机的内存
--vcpus 虚拟cpu的个数,不要超过真实cpu的个数
--file 作为磁盘使用的映像文件(可以为多个该选项,该映像文件也可以不事先创建)
-l 安装源的路径
--vnc 开启vncserver,可以使用vncviewer连接,如果不指定端口,默认为5900,
如果同时还在创建第二个时候,端口为5901,依次类推,当然可以使用"--vncport=xxx"来为当前虚拟机指定一个端口
有时候由于多次操作,都不知道当前到底是哪个端口,可以使用命令 netstat -nap | grep 590 来查看一下,最后确认具体端口
--prompt 使用交互式的方式,这样会提示你属于一些信息

运行命令后用vncviewer连接上,可以看到跟安装普通的linux一样,按照要求一步一步走下去就ok.

使用已有的系统创建一个新系统,有两种方法

方法一
拷贝老系统的映像文件为新系统的映像文件 cp purecentos5_6.img centos1.img
拷贝配置文件 cp /etc/xen/purecentos5_6 /etc/xen/centos1
修改 /etc/xen/centos1 文件中的name、uuid、disk和mac中对应的信息就大功告成了

方法二
使用virt-clone命令来完成,例如:
virt-clone -o purecentos5_6 -n centos2 -f /data/xenimgs/centos2.img

可以先创建一个干净的系统,再根据上面的方法来创建虚拟机,这样可以快速的创建好一个虚拟机。

nginx中使用perl模块

2012年4月12日 1 条评论

如果对于一个绝大部分内容是静态的网站,只有极少数的地方需要动态显示,碰巧你又了解一点perl知识,那么nginx + perl的结合就能很好解决问题。要想nginx支持perl脚本,在编译nginx时候需要如下参数:

./configure --with-http_perl_module

如果make时候出现如下类似错误:
Can’t locate ExtUtils/Embed.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/i386-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi /usr/local/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl /usr/local/lib/perl5/site_perl .)

你的机器上可能需要安装perl-devel perl-ExtUtils-Embed,对于centos系统,直接使用yum搞定,例如:

yum -y install perl-devel perl-ExtUtils-Embed

nginx中使用perl有两种方法,一种是直接在配置文件写,还有一种是把perl脚本写在外部文件中,下面主要介绍一下第二种用法。

假设nginx的根目录为/usr/local/nginx,perl脚本存放的目录为nginx的根目录下的perl/lib下,脚本名字为test.pm,nginx配置为:


#位于http配置中
	perl_modules  perl/lib;
	perl_require  test.pm;
	
#位于server配置中	
		location /user/ {
			perl pkg_name::process;
		}

上述配置是把所有来自http://servername/user/下的请求交由test.pm脚本中定义的process方法来处理。

test.pm脚本的内容如下:

package pkg_name;

use Time::Local;
use nginx;

sub process {
    my $r = shift;
	
    $r->send_http_header('text/html; charset=utf-8');
    my @arr = split('/', $r->uri);
    my $username = @arr[2];
   
    if (!$username || ($username eq "")) {
		$username = "Anonymous";
    }
    
    $r->print('Hello, You name is : ' . $username . ''); 
	$r->rflush();
	return;
}

1;
__END__

当你访问http://servername/user/netingcn,你应该可以在网页上看到:

Hello, You name is : netingcn

另外:当使用 use nginx 时,会有如下的对象可以调用,可以看到上面 shift 一个对象到 $r 上,然后就可以用 $r 调用那些对象了:

$r->args – 请求的参数 .
$r->discard_request_body – 这个参数是让 Nginx 放弃 request 的 body 的内容.
$r->filename – 返回合适的请求文件的名字
$r->has_request_body(function) – 如果没有请求主体,返回0,但是如果请求主体存在,那么建立传递的函数并返回1,在程序的最后,nginx将调用指定的处理器.
$r->header_in(header) – 查找请求头的信息
$r->header_only – 如果我们只要返回一个响应的头
$r->header_out(header, value) – 设置响应的头
$r->internal_redirect(uri) – 使内部重定向到指定的URI,重定向仅在完成perl脚本后发生.可以使用 header_out(Location….的方法来让浏览器自己重定向
$r->print(args, …) – 发送数据给客户端
$r->request_body – 得到客户端提交过来的内容 (body 的参数,可能需要修改 nginx 的 client_body_buffer_size. )
$r->request_body_file —给客户的 body 存成文件,并返回文件名
$r->request_method — 得到请求 HTTP method.
$r->remote_addr – 得到客户端的 IP 地址.
$r->rflush – 立即传送数据给客户端
$r->sendfile(file [, displacement [, length ] ) – 传送给客户端指定文件的内容,可选的参数表明只传送数据的偏移量与长度,精确的传递仅在perl脚本执行完毕后生效.这可是所谓的高级功能啊
$r->send_http_header(type) – 添加一个回应的 http 头的信息
$r->sleep(milliseconds, handler) – 设置为请求在指定的时间使用指定的处理方法和停止处理,在此期间nginx将继续处理其他的请求,超过指定的时间后,nginx将运行安装的处理方法,注意你需要为处理方法通过一个reference,在处理器间转发数据你可以使用$r->variable().
$r->status(code) – 设置 http 的响应码
$r->unescape(text) – 使用 http 方法加密内容如 %XX
$r->uri – 得到请求的 URL.
$r->variable(name[, value]) – 设置变量的值

mac os 下的open命令

2012年4月11日 没有评论

windows下运行explorer就能打开资源管理器,在mac os下能不能在命令行中通过命令来打开finder呢?答案是肯定,该命令就是open,通过man open,可以看到它不仅能打开finder,还可以打开文件、url等。

在命令行下,如果有使用tab习惯,打开一个很深的文件夹肯定比在先打开finder在一级一级点下去要快,另外对于有隐藏文件夹,finder中默认是不显示的,但是在命令行可以轻松解决。例如路径/Users/yangyz/.m2/repository/,直接使用finder似乎进不去的,使用如下命令:

open /Users/yangyz/.m2/repository/

就即可进入该目录。同样对于隐藏的文件,也可以使用open来打开。

mac 下使用eclipse的easyexplore 插件

2012年4月11日 1 条评论

使用easyexplore 插件能快速把你指定的文件或文件夹在资源管理中打开,该插件默认是在针对window用户的,不过通过简单的设置,也能很好的用在ubuntu和mac下。

关于如果安装插件这里就不做介绍,安装好插件,在偏好设置中找到“easy explore”项,右边的配置默认是“explorer.exe {0}”,mac下把explorer.exe替换成open,ubuntu下替换成nautilus即可。

修改好配置后,在eclipse项目中任何一个文件或文件夹下点击右键,可以看到“easy explore”,点击后mac就会在finder中打开当前文件夹。

分类: Linux 标签:

mac os lion 上php连接mysql数据库不能使用使用localhost问题

2012年4月9日 没有评论

今天在mac上搭建好了php的环境,把先前在window、linux下运行良好的程序放在mac上,居然出现访问不了数据库,数据库连接的host用的是localhost,可以确认数据库配置是正确的,因为在java中使用localhost访问正常,另外通过命令行工具也能正常访问。当把localhost换成127.0.0.1或者本机的IP时,居然正常了。以前一直认为localhost与127.0.0.1是一回事,现在事实证明它们其中还是有区别的。

在网上搜索了一下它们的区别,有人已经说的很明白了,具体可以参看:http://blog.sina.com.cn/s/blog_40e1ba640100ivjj.html,http://www.diybl.com/course/7_databases/mysql/myxl/20090722/168062.html。它们的主要区别是localhost是通过socket方式来连接,而127.0.0.1则是走的TCP协议。

上面提到区别就是导致mac下无法连接数据库的原因。那为什么socket方式无法连接呢?由于mac os lion上已经自带了apache和php,我的环境使用就使用默认的,mysql服务是在官网下载dmg安装最近版本,php的配置文件(/ect/php.ini)中设置有三个地方(mysql.default_socket、mysqli.default_socket、pdo_mysql.default_socket)设置了mysql socket文件存放的位置,其默认值为/var/mysql/mysql.sock。查看mysql服务使用的socket文件有两种方式
方法1:

echo "show variables" | mysql | grep "socket"

方法二:

echo "status" | mysql | grep "socket"

注意:如果mysql设置了密码,使用-u,-p来指定用户名和密码
这里看到mysql的socket文件存放位置为/tmp/mysql.sock。

看到这儿应该知道问题所在了吧,使用localhost连接失败的原因为在socket的方式下,php默认配置的mysql服务的socket文件不存在,所以导致连接失败,如果把连接失败的错误信息dump出来,你应该会看到错误信息中包含了“No such file or directory”。

知道原因就容易修改了,只需要把php配置文件中mysql.default_socket、mysqli.default_socket、pdo_mysql.default_socket这三项值修改为mysql服务配置对应值即可,修改好后需要重启apache服务。当然也可以修改mysql配置文件中的socket信息,使其保持一致即可,修改好后重启mysql服务。

mac os lion 编译安装php memcached 扩展

2012年4月7日 5 条评论

mac os lion 系统默认安装了apache和php,如果要在php中使用memcached,就需要自己安装扩展。本文采用源码方式来安装。php扩展有两种,一个是memcache,一个是memcached,下载地址为:
memcache:http://pecl.php.net/package/memcache
memcached:http://pecl.php.net/package/memcached
安装memcached,就需要安装先libmemcached,这里安装的是memcache。

在上述链接中选择下载一个源码,例如:memcache-2.2.6.tgz,解压并进入解压目录,先执行phpize,本人系统出现如下错误:

Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

原因是系统没有安装autoconf,解决办法下载autoconf的源码,自己编译安装。autoconf的官方网址是:http://www.gnu.org/software/autoconf/。安装命令如下:

cd ~
mkdir tmp
cd tmp
curl http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.bz2 -o autoconf-2.68.tar.bz2
tar -xvf autoconf-2.68.tar.bz2
cd autoconf-2.68
./configure && make
sudo make install

安装好autoconf,下面就可以开始安装memcache扩展了,安装命令如下:

cd ~
mkdir tmp
cd tmp
curl http://pecl.php.net/get/memcache-2.2.6.tgz -o memcache-2.2.6.tgz
tar -xvf memcache-2.2.6.tgz
cd memcache-2.2.6
sudo phpize
sudo ./configure
sudo make
sudo make install

如果看到类似如下输出:

Installing shared extensions:     /usr/lib/php/extensions/no-debug-non-zts-20090626/

表示编译成功。最后还需要修改php.ini,把如下信息添加进去:

extension=memcache.so

至此,php memcache扩展就编译安装成了,重启apache服务,就可以在php中使用memcache。

分类: Linux 标签:

mac os lion 编译安装 memcached 服务

2012年4月7日 3 条评论

由于采用源码编译安装的方式,所有先要确认机器上已经安装了gcc,关于gcc的安装,可以参考:http://www.netingcn.com/mac-os-lion-gcc.html

memcached依赖与libevent,所以要先安装libevent,听起来好像很麻烦的,但是有人写了一个shell脚本帮我们搞定了一切,只要执行该脚本,它就会自动下载、编译安装好。脚本的下载地址:http://topfunky.net/svn/shovel/memcached/install-memcached.sh 。打开终端,执行如下操作

cd ~
mkdir -pv tmp
cd tmp
curl http://topfunky.net/svn/shovel/memcached/install-memcached.sh -o install-memcached.sh
sh install-memcached.sh

不出意外的话,memcached就安装好了。注意:如果不是以root用户执行,期间可能需要提供当前用户的密码。memcached的版本定义在脚本中,如果想安装不同版本的memcached,可以自己修改一下下载地址即可。

启动memcached服务:

memcached -d -m 128 -l 127.0.0.1 -u root

其中
-d 以守护程序(daemon)方式运行 memcached;
-m 设置 memcached 可以使用的内存大小,单位为 M;
-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。

停止memcached服务:

killall memcached
分类: Linux 标签:

mac os lion 安装gcc备忘

2012年4月7日 1 条评论

OS 版本10.7.3,默认没有安装gcc的,搜索了一下,说只要安装xcode就会有gcc了,去app store下载安装了,此时在终端输入gcc,还是提示“command not found”,确认xcode也安装成功了,版本是4.3,网上搜索,基本上都是说安装就可以了,终于在一个不起眼的帖子中有人提到,还需要自己去下载安装command line tools。具体路径为:Xcode –> Preferences –> Downloads 的Components下,选择安装Command Line Tools 即可。

分类: Linux 标签:

bash shell中 := 含义

2012年4月6日 没有评论

今天看mac下mysql的启动脚本中有这么一行:

if [ "${MYSQLCOM:=-NO-}" = "-YES-" ] ; then

对其中的“:=”很是不解,开始使用“:=”作为关键字搜索,没有获得有用的信息,后来直接搜索冒号在shell中的用途,发现很多有人有这样的疑惑,我也搞明白上面表达式的意思。简单来说,就是当冒号前面的变量不存在或值为空时,就把等号后的值赋值给变量。举例来说:

#/bin/bash

#例1
var=1
echo $var
#输出 1
var=2
echo $var
#输出 2

#上述操作就是简单对变量赋值,后面的回覆盖前面的

#例2
unset var
#删除先前定义变量,防止对下面的操作产生影响
echo $var
#输出空

: ${var=1}
echo $var
#输出 1
: ${var=2}
echo $var
#输出 1

#上述操作也是对变量赋值,但与例1有些不同,赋值是放在${}中
#第一个输出很容易理解,第二个输出为什么还是 1 呢
#因为变量已经存在,所以不执行赋值操作
#注意:行首的冒号(:)是做什么呢,如果没有这个符号,那么在脚本中会把赋值后字符作为命令来执行,
#冒号是linux中一个内置的命令,相当于true,其实是啥也不做,空命令,
#冒号后的赋值作为命令的参数来解析,而不是执行

#例3
unset var
echo $var
: ${var:=1}
echo $var
 
: ${var:=2}
echo $var

#本例很例2差不多,得到的结果是一样,区别就是赋值一个用的是"=",
#另一个用的":=",看下面的例子就知道他们之间的区别了

unset var
echo $var
var=""
#赋值为空
: ${var=1}
echo $var
#输出空

unset var
echo $var
var=""
: ${var:=1}
echo $var
#输出1

#结论:使用"="时,当变量不存在(未申明)才对其复制,
#而":="是变量不存在或值为空时才对其赋值

阿里云服务器上使用iptables设置安全策略

2012年4月4日 1 条评论

公司的产品一直运行在云服务器上,从而有幸接触过aws的ec2,盛大的云服务器,最近准备有使用阿里云的弹性计算(云服务器)。前两种云服务器在安全策略这块做的比较好,提供简单明了的配置界面,而且给了默认的安全策略,反观阿里云服务器,安全策略需要自己去配置,甚至centos机器上都没有预装iptables(起码我们申请两台上都没有),算好可以使用yum来安装,安装命令如下:

yum install -y iptables

iptables安装好后就可以来配置规则了。由于作为web服务器来使用,所以对外要开放 80 端口,另外肯定要通过ssh进行服务器管理,22 端口也要对外开放,当然最好是把ssh服务的默认端口改掉,在公网上会有很多人试图破解密码的,如果修改端口,记得要把该端口对外开发,否则连不上就悲剧了。下面提供配置规则的详细说明:

第一步:清空所有规则

当Chain INPUT (policy DROP)时执行/sbin/iptables -F后,你将和服务器断开连接
所有在清空所有规则前把policy DROP该为INPUT,防止悲剧发生,小心小心再小心
/sbin/iptables -P INPUT ACCEPT
清空所有规则
/sbin/iptables -F
/sbin/iptables -X
计数器置0
/sbin/iptables -Z

第二步:设置规则

允许来自于lo接口的数据包,如果没有此规则,你将不能通过127.0.0.1访问本地服务,例如ping 127.0.0.1
/sbin/iptables -A INPUT -i lo -j ACCEPT 

开放TCP协议22端口,以便能ssh,如果你是在有固定ip的场所,可以使用 -s 来限定客户端的ip
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT

开放TCP协议80端口供web服务
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT

10.241.121.15是另外一台服务器的内网ip,由于之间有通信,接受所有来自10.241.121.15的TCP请求
/sbin/iptables -A INPUT -p tcp -s 10.241.121.15 -j ACCEPT

接受ping
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

这条规则参看:http://www.netingcn.com/iptables-localhost-not-access-internet.html
/sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

屏蔽上述规则以为的所有请求,不可缺少,否则防火墙没有任何过滤的功能
/sbin/iptables -P INPUT DROP

可以使用 iptables -L -n 查看规则是否生效

至此防火墙就算配置好,但是这是临时的,当重启iptables或重启机器,上述配置就会被清空,要想永久生效,还需要如下操作:

/etc/init.d/iptables save   
或
service iptables save

执行上述命令可以在文件 /etc/sysconfig/iptables 中看到配置

以下提供一个干净的配置脚本:

/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z

/sbin/iptables -A INPUT -i lo -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -s 10.241.121.15 -j ACCEPT
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
/sbin/iptables -P INPUT DROP

最后执行 service iptables save ,先确保ssh连接没有问题,防止规则错误,导致无法连上服务器,因为没有save,重启服务器规则都失效,否则就只有去机房才能修改规则了。也可以参考:ubuntu iptables 配置脚本来写一个脚本。

最后再次提醒,在清空规则之前一定要小心,确保Chain INPUT (policy ACCEPT)。

无觅相关文章插件,快速提升流量