Archive for the ‘ Uncategorized ’ Category

KVM – Linux 下最好的虚拟机

身边很多用linux的朋友,很奇怪的一个现象就是很多人跑虚拟机的时候是是用vmware或者virtual box的。先不说vmware本身如果是workstation版要收费的问题(因为自己是作电脑的,所以我一向拒绝任何盗版)就vmware跟virtual box的设计上,都是属于在user space作的虚拟。linux本身提供了免费的几乎是不用设定的内核级别的虚拟机(kvm)但是很是少人用的感觉。

 

kvm

内核的虚拟技术,本身在linux的kernel就已经是buildin,简单的说,任何的kernel的新技术,kvm都可以自动享受到,因为kvm本身就是内核的一部分。基本是不需要设定就可以用的。

 

机器要求:intel或者amd有支持虚拟技术的cpu (最近5年的cpu,基本买不到不支持的了)

 

安装:(fedora作为例子)

kvm本身是已经kernel中内建了,安装的只不过是user space的一些工具而一。Fedora本身的分组专门有个虚拟组,直接安装就好

yum groupinstall “Virtualization Client” -y

就这么简单。。。可以用了

 

图形界面,可以用virt-manager来管理,打开virt-manager就可以直接选择左边的Selection_005标志新建一个vm

Selection_004

 

给vm一个名字(我这里叫做testVM)

然后选择是从本地的ISO或者CD安装,还是网络安装,或者是PXE boot的安装,另外还可以直接读取虚拟硬盘的镜像(包括lvm)

选择需要安装的ISO,系统类型(Linux)系统个版本(Redhat Enterprise 6)然后下一步

New VM_007

 

 

选择VM的cpu跟内存

New VM_008

选择硬盘的大小:

New VM_009

 

 

Advanced Options可以设定不同的网络设定(后面我会说到bridge的设定)

然后结束,一个新的vm就设定好了

testVM Virtual Machine_011

 

 

需要更多的设置,可以在View的Detail中设定

testVM Virtual Machine_012

 

选择Add Hardware可以添加更多的硬件

Virtual Machine Manager_013

 

 

virt-manager本身已经给你了hostonly跟NAT的网络,唯一需要设定的就是Bridge(桥接)模式

安装以下bridge的工具: yum install bridge-utils -y

其实设定也很简单。我本身的机器的IP是10.1.41.21 我是用static IP(固定ip)的。

我本身的网路设定如下:(/etc/sysconfig/network-scripts/ifcfg-eth0)

 

Selection_014

 

 

如今作桥接模式,所以呢,首先是eth0变成桥接

Selection_015

 

 

然后在建立一个新的ifcfg-br0文件来设定br0这个设备(桥接)

Selection_016

 

 

重起一下网络就可以看到设备是桥接的了

service network restart

输入brctl show 这个指令,应该看到我们的桥接已经做好

Selection_017

 

跟libvirtd打个招呼,告诉libbirtd我们有了新的birdge的网络

service libvirtd restart

这样就可以在kvm(virt-manager)中用桥接的网络设备了。(要是不行,重起一下机器也可以)

为了桥接正常的运行,记得/etc/sysctl.conf最后加入这几行:

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

然后运行sysctl -p

其实整个kvm的设定下来,也就3-5分钟就能搞定。(估计还用不了)方便,快捷,高性能

 

对了,如果是需要用x的情况下(linux或者windows的虚拟)一定要用用redhat的spec协议。这个是个利器,好东西呀。

在虚拟机设定中,选择Display VNC那里,然后Type改称SPICE,然后apply

rli-dns Virtual Machine_018

 

SPIC的详情,可以看reedhat的介绍。

对了,还有一个我个人最喜欢的东西顺便说一下,就是virsh这个指令

这个是终端指令可以控制所有的vm的东东,包括复杂的HA等等,virsh –help可以看到所有virsh提供的功能。非常之强大,如果是做虚拟主机,所有指令所有东西都可以用virsh完成

Selection_019

 

 

GIT 源管理设定 (From SVN to GIT)

年底的时候常常不在公司的网络内,再次让我感受了SVN的局限,每次有东西要么都全部在自己的本本里面积攒着,等什么时候进了公司的网络去checkin,要么就专门为了检查code而进入公司网络。加之年底公司实行心的安全要求,不能好像从前那样直接几个密码就进vpn了,还要用硬件的RSA动态钥匙(麻烦加之麻烦)所以最终决定转换到GIT好了(其实好久之前就想转git了,不过一直在偷懒)

首先是给自己一个清单:

1)服务器: CENTOS 5.7

2)服务器现有:svn + trac

3)svn 中现有 project: 71

4) 架设 git + gitweb

5) 所有的 project 都要直接移植过去(包括所有的log,commit,branch)

6) git 提供:readonly 的 http 跟 git 的权限,commit权限走ssh

7) 因为之前是apache跑trac,所以还有一些我自己的python的code写的网页,全部需要保留。
开始之前,我首先在我自己的机器里面把所有的svn下面的project都update了一下,然后关闭服务器上的svn,这样设定期间就没有东西可以commit back回服务器了。
为了便于安装,我直接用rpmforge这个源里的git(也可以自己从source安装)

 

1. 安装rpmforge的源

http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

 

2. import GPG key

rpm –import http://apt.sw.be/RPM-GPG-KEY.dag.txt

 

3. 用gpg的key来检查下载包裹的完整性

rpm -K rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

4. 安装sourcefroge的源

sudo rpm -i rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

5. 安装所需要的套件: git, gitweb (网页), httpd (apache), git-daemon (gti 协议的 xinetd 启动)

sudo yum install git-all gitweb httpd git-daemon

6. 创建一个新的 git的用户:

sudo adduser git

7. 设定我自己的帐号到加入git的组,这样我自己可以commit

sudo usermod -G git -a rli

8. 创建git源的目录,我放在/var/lib/git 这个是redhat的default的git源的地方

sudo mkdir -p /var/lib/git

chown git.git /var/lib/git

9. 下面的动作已经不需要root了,更改用户到 git (之前创建的)

sudo su -l git

10. 创建一个随便的repo用来测试安装

mkdir /var/lib/git/test

cd /var/lib/git/test

git init –bare –share

上面的git init给了两个选项,一个是–bare这个就是建立一个空的repo,另外一个是–share这样所有的commit会自动继承本身repo的权限

11. 现在git的repo就已经做好了,就这么简单,可以用ssh来测试一下

cd /tmp

git clone rli@localhost:/var/lib/git/test

这里我们会看到test这个project会被checkout出来

12. 增加http的public access, 首先要enable一个post-update的hook

mv /var/lib/git/test/hooks/post-update.sample /var/lib/git/test/hooks/post-update

cd /var/lib/git/test

用 git update-server-info 来update以下gitweb所需要的文件

git update-server-info

可以随便给这个project一个介绍

echo “git test empty project” > description

13. 设定http来服务git的http checkout, url的path是可以随便给的,我这里给的名字是gitsource,所以就设定一个新的conf文件在/etc/httpd/conf.d/下面

sudo vim /etc/httpd/conf.d/gitsource.conf

Alias /gitsource /var/lib/git
<Directory /var/lib/git>
Order allow,deny
Allow from all
</Directory>
上面的设定什么都没有,就是说http://xxxxxxx/gitsource这个rul会去/var/lib/git里面找文件,http允许任何的地址访问(Allow from all)

设定好重新启动以下httpd

sudo service httpd restart

同时不要忘记设定httpd为开机启动

sudo chkconfig httpd start

 

14. 检查以下我们新设定的http源是否工作

cd /tmp/

rm -rf test

git clone http://localhost/gitsource/test

上面会看到checkout一个空的test的project出来

 

15. 增加git的协议,sourceforge的git rpm已经做好的xinetd的启动文件,只要开启就好了

sudo chkconfig git on

如果xinetd是已经启动的(这个看服务器而定)那么xinetd会自动开启你开启的东西,如果xinetd没有启动,可以设定启动

sudo chkconfig xinetd on

sudo service xinetd start

这里需要注意一下的是,如果你的git源不是放在/var/lib/git下面(default)那么你需要设定以下 /etc/xinetd.d/git这个文件中的server_args这个参数,server_args这里告诉git要去哪里找git的源,另外如果不想每个repo都自动export(控制单个的repo)那么,你可以去掉 –export-all这个选项,但是每个独立的git project就需要有一个 git-daemon-export-ok 的文件才可以

16. 再次测试git的git协议是否工作

cd /tmp

rm -rf test

git clone git://localhost/test

再次确定我们有checkout我们的project出来

17. 查看更改/etc/gitweb.conf来设定gitweb

这个就是个人偏好设定了,我是只有设定@git_base_url_list给了http,git跟ssh三个url(显示的时候用)

18. rpmforce  gitweb的安装套件已经帮你设定了apache所需要的东西,url是你服务器下面的 http://xxxxxx/git

Alias /git /usr/share/gitweb
<Directory /usr/share/gitweb>
Options +ExecCGI
AddHandler cgi-script .cgi
DirectoryIndex gitweb.cgi
</Directory>
这里看到套件已经设定好cgi是izai/usr/share/gitweb下面

打开游览器,http://localhost/git你就可以看到自己的test的project了

 

移植svn到git

这个就很简单了,可以用git svn这个指令

我svn里有71个project,在同一个文件夹下面已经checkout出来过了,现在用git svn再次checkout一次就好(所有svn的project名字在/tmp/svn/下面)

mkdir -p /tmp/git/git-svn

cd /tmp/git/git-svn

#也可以直接建立一个txt文件,里面写上所有的svn中的project的名字,然后直接for x in $(cat svn_name.txt)

for x in /tmp/svn/*; do git svn clone –no-metadata http://localhost/svn/$(echo $x|awk -F ‘/’ ‘{print $NF}’)

这样我就得到了71个git从svn中checkout的全部project(这个要跑很久,因为所有的commit,log都会check出来)

不确定是否一定需要,不过我还是再次从git svn中所checkout的东西用git再clone一下(纯粹的git)

mkdir -p /tmp/git/git

cd /tmp/git/git

for x in /tmp/git/git-svn/*; do git clont $x git clone $x; done

清空/var/lib/git,然后生成所有的project

for x in /tmp/git/git/*; do mkdir /var/lib/git/$(echo $x |awk -F ‘/’ ‘{print $NF}’); done

所有的git都需要init一下,就是之前我们init那个test的projet的指令

for x in /var/lib/git/*; do cd $x; git –bare –shared, mv hooks/post-update.sample hooks/post-update; git update-server-info; cd ../; done

这个时候所有的project都做好,源码也在/tmp/git/git下面了,我们直接用git的指令push回我们的git server就好

做之前,在自己的account设定好rsa的login,这样可以省去输入密码

下面步骤可以一起做,这里为了便于游览,我分开来

第一个是加入git服务器的源,这里随便起名字叫做mygit

for x in /tmp/git/git/*; do cd $x; git remote add mygit ssh@localhost:/var/lib/git/$(echo $x|awk -F ‘/’ ‘{print $NF}’); done

第二个是push我们的local的change回服务器

for x in /tmp/git/git/*; do cd $x;  git push mygit master; done

最后的步骤就是,以前还有些python写的网页工具什么的,要一起移植过来

安装mod_python

sudo yum install mod_python

把老的python的那些工具网页放在http://xxxx/tools下面,所以增加一个handler

sudo vim /etc/httpd/conf.d/tools

<Directory /var/www/html/tools>
SetHandler mod_python
PythonHandler mod_python.publisher
PythonDebug On
Options FollowSymLinks
AllowOverride None
</Directory>

从前的主页我直接放个index.html做redirect到我tools这个地方

sudo vim /var/www/html/index.html

<html>
<title></title>
<HEAD><meta HTTP-EQUIV=”REFRESH” content=”0; url=http://10.1.50.24/tools”></HEAD>
</html>

重新跑一下apache

sudo service httpd restart
就这么简单,就可以设定好一个git的服务器,另外所有的svn的源码都移植过去。不计算git svn在pull旧的svn源码的时间,整个设定过程不到30分钟就可以搞定了。

 

 

 

轻量级文件服务器 – 硬件篇 (lightweight NAS — hardware)

最近需要重新整理升级一下自己家里用的文件服务器。鉴于目前用的还是老的设备,IDE的硬盘,所以决定整个重新在做一台出来。

给自己的设计要求:

1. 因为是自己用,有需要常年开启(24/7)所以低耗电是第一考虑的事情

2. 性能不需要太好,毕竟只有自己的电脑用

3. 开始不准备作很大,一个小的NAS就可以,但是后面一定是要增加空间的,所以要维护简单,更改容易的

4. 当然是便宜点的好 。。。。 不然直接去买个现成的回来好了

5. 最便宜的架构当然是RAID5了

根据自己的设计要求,开始找硬件:

主板+CPU:

GIGABYTE GA-D525TUD + Atom D525的CPU。原因很简单,这个便宜。。。真的便宜,低耗。。。真的低耗(cpu 15W而已)有4个3G/s的sata外加一个IDE,也就是说最多可以上6个硬盘了(4个sata外加两个IDE)感觉1-2年内,应该差不多够用。网卡是1G的,也够了,还有多一个PCI 的接口,如果需要,要么可以再接一个SATA或者RAID的卡,或者可以再接一个1G的网卡跑bonding

内存

这个没什么好多挑的,随便都可以,我直接拿2 个2G 的 Kingston DDR3 1333MHz 这样4G的内存应该够用了


电源:
因为还是考虑到价钱问题,决定挑一个便宜的电源就好,虽然有那种机箱自带个电源的,总觉得不放心,所以还是买一个。 选择 Cooler Master Elite 460W 虽然没用过Cooler Master的电源,不过他们机箱还是做的不错的(个人比较爱好)所以试试看。400W足够用了,cpu只有15W的功耗,主板也用不了多少(mini atx),硬盘嘛,每个硬盘在6W左右。这个电源如果不挂,下次升级都应该可以用。
机箱:
当然是Cooler Master的了。选了Elite 330这个机箱,散热什么的感觉还是不错的,4个5.25, 7个3.5的空间,这样放满的话可以放11个硬盘了,如果2T一个。。。那么。。。反正足够用了
最后挑选的就是硬盘了,想了很久,决定为了省钱,还是买普通的个人用硬盘(商业服务器硬盘还是太贵,看了一下,基本是1到1.5倍的价钱)反正。。。几个硬盘同时坏掉的可能性还是小的,坏一个的话没事,真的太担心,最多从RAID5换成RAID6,还是便宜很多。空间就从最基本的开始,现在1T的硬盘很便宜了,所以大小定为1T,数量上,RAID5最低要3个,所以就3个开始。搜索了以下,发现West Digital有一款叫做Caviar Green的节能型硬盘不错,只有6W的功率。价格也非常便宜。于是果断下手:3个 Western Digital 1 TB Caviar Green SATA II 64 MB Cache
还要一个放系统的空间,也就是OS啦。这个根据以往的爱好,都是直接用USB的。这个随便找了一个8G的SanDisk的来用

所有东西都齐了就简单的,全部接起来,这里唯一的一个小地方就是,因为民用主办很少看到主板上直接带USB的插口的,所以只能自己从主板中USB那个界限口里接一个延长线出来,然后直接接上U盘,在把U盘固定在机箱里面,因为U盘是拿来作系统盘用的,所以直接在机箱里面。

软件部分,下次有时间在写吧。基本没什么激情的,普通的linux, 3.x的内核直接挂soft raid5,然后raid上面挂lvm,这样方便日后更改,不管是加硬盘(直接从raid上扩展)还是整个硬盘换掉从新做一个硬盘的array(lvm直接把旧的东西移到新的)。共享方面,提供:iSCSI, AoE, sshfs, NFS跟samba。 就我个人来说,够用了。苹果反正可以直接用NFS或者Samba,AFP就省掉了。

目前还没有考虑用btrfs或者zfs (可以作time machine的)理由如下:
1. btrfs今年年初我有用过一段时间,觉得还是有问题。有时候会有很高的IO peak,所有东西都在等硬盘,毕竟这个还是开发中,不够成熟
2. linux zfs只有在user space (fuse) 而且毕竟不是完整的zfs
有考虑过直接用open solaris跑ZFS,不过linux我熟悉的多,open solaris还是比较陌生,再说机器的硬件属于非常的低端,linux基本除了kernel跟必要的工具(100来个MB)其他的都没有跑。open solaris估计要用好点的硬件才可以

Hyper Threading

Hyper Threading让人头大。每次找cpu很是麻烦,要去看哪些跟哪些是实际在同一个core上,哪些有是在不同的cpu上

同一个core的,两个线程,等于还是两个线程在共用一个core的运算(所以有时候要避免)

不同cpu那么就不能共用L2的cache,就会多出context switch等等不必要的功耗

#!/usr/bin/python
import commands
physical=commands.getoutput(“cat /proc/cpuinfo |grep ‘physical id'”).split(‘\n’)
core=commands.getoutput(“cat /proc/cpuinfo |grep ‘core id'”).split(‘\n’)
processor=commands.getoutput(“cat /proc/cpuinfo |grep processor”).split(‘\n’)
CPU={}
for x in range(len(processor)):
if not CPU.has_key(physical[x].split()[-1]):
CPU[physical[x].split()[-1]]={}
if not CPU[physical[x].split()[-1]].has_key(core[x].split()[-1]):
CPU[physical[x].split()[-1]][core[x].split()[-1]]=[]
CPU[physical[x].split()[-1]][core[x].split()[-1]].append(processor[x].split()[-1])
for x in CPU.keys():
for y in CPU[x].keys():
print ‘CPU %s, core %s, id %s’ %(x, y, CPU[x][y])
print ”

mutt 发送邮件

这个不写下来自己一定会忘记。

用mutt发送邮件 html 邮件

mutt -e set content_type=text/html” -s “subject ” email@address.com < html_file

发送embedded图像的邮件(outlook可以直接看)

html中的image可以用cid的tag,这个tag可以直调用attachments里面的图片

<font size=4 color=black><center>%s</center></font><p><img src=”cid:file_name”</img><p>

例如产生以下html保存为xyz.mutt

<font size=6 color=blue><center>test </center></font><p><p>
<font size=4 color=black><center>test 1</center></font><p><img src=”cid:test_1.png”</img><p>
<font size=4 color=black><center>test 2</center></font><p><img src=”cid:test_2.png”</img><p>
<font size=4 color=black><center>test 3 </center></font><p><img src=”cid:test_3.png”</img><p>
<font size=4 color=black><center>test4 </center></font><p><img src=”cid:test_4.png”</img><p>

那么用muttl的时候加入如下的那些图片,就可以直接在outlook中显示出来(embedded)而不是以附件的形式出现

mutt -e set content_type=text/html” -s “subject ” email@address.com -a test_1.png -a test_2.png -a test_3.png -a test_4.png < html_file

outlook 本身不支持 base64直接做embedded (firefox家的就没有问题)

如果直接做base64的嵌入,用法如下

<html>
<font size=4 color=red><center>this is a test</font></center>
<p>
<center>
<img src=”data:image/gif;base64,R0lGODlhIAAgAPf+AAAAAFUAAIAAAKoAANUAAP8AAAArAFUrAIArAKorANUrAP8rAABVAFVVAIBV
AKpVANVVAP9VAACAAFWAAICAAKqAANWAAP+AAACqAFWqAICqAKqqANWqAP+qAADVAFXVAIDVAKrV
ANXVAP/VAAD/AFX/AID/AKr/ANX/AP//AAAAVVUAVYAAVaoAVdUAVf8AVQArVVUrVYArVaorVdUr
Vf8rVQBVVVVVVYBVVapVVdVVVf9VVQCAVVWAVYCAVaqAVdWAVf+AVQCqVVWqVYCqVaqqVdWqVf+q
VQDVVVXVVYDVVarVVdXVVf/VVQD/VVX/VYD/Var/VdX/Vf//VQAAgFUAgIAAgKoAgNUAgP8AgAAr
gFUrgIArgKorgNUrgP8rgABVgFVVgIBVgKpVgNVVgP9VgACAgFWAgICAgKqAgNWAgP+AgACqgFWq
gICqgKqqgNWqgP+qgADVgFXVgIDVgKrVgNXVgP/VgAD/gFX/gID/gKr/gNX/gP//gAAAqlUAqoAA
qqoAqtUAqv8AqgArqlUrqoArqqorqtUrqv8rqgBVqlVVqoBVqqpVqtVVqv9VqgCAqlWAqoCAqqqA
qtWAqv+AqgCqqlWqqoCqqqqqqtWqqv+qqgDVqlXVqoDVqqrVqtXVqv/VqgD/qlX/qoD/qqr/qtX/
qv//qgAA1VUA1YAA1aoA1dUA1f8A1QAr1VUr1YAr1aor1dUr1f8r1QBV1VVV1YBV1apV1dVV1f9V
1QCA1VWA1YCA1aqA1dWA1f+A1QCq1VWq1YCq1aqq1dWq1f+q1QDV1VXV1YDV1arV1dXV1f/V1QD/
1VX/1YD/1ar/1dX/1f//1QAA/1UA/4AA/6oA/9UA//8A/wAr/1Ur/4Ar/6or/9Ur//8r/wBV/1VV
/4BV/6pV/9VV//9V/wCA/1WA/4CA/6qA/9WA//+A/wCq/1Wq/4Cq/6qq/9Wq//+q/wDV/1XV/4DV
/6rV/9XV///V/wD//1X//4D//6r//9X//z8/P2tra5WVlcDAwP///yH5BAEAAP4ALAAAAAAgACAA
AAjTAP0JHEhQIICDCA8WXMhwIMIUECNCRNiw4UGJGDEqrOgwo0eNHP0B+EgyIoCKI0uqPLkw5USX
JC+aLAhzpMyPF2sShGmSZ0+PLEXizDkxxUOgBoEC+HfT6EGmSIVmTDj1KEifP5XGxKqya9OuYJ2G
HSuWLNivZoem9erTZsK3VNtKlSgTgIACAAroTYmWZVuTd/PuLTo1KU4BgfX+wxuzI9C7eBUzjmp4
KmTBgylXpntZMtagOx/vzQzSomjSdEN+tpo6pEiuVV3vRPsStOzZcF0HBAA7″ </img>
</center>
</html>

 

下面是outlook的截图

Apache Django Deployment

在apache下面deploy Django

 

不记下来就会忘记。下面是如何在apache 2.2+postgresql 下面deploy Django的项目

1. 需要的包裹

httpd, django, mod_wsgi, psycopg2
2. 设定mod_wsgi的handler (这里设定django.wsgi这个handler同时加载admin的css)

/etc/httpd/conf.d/python.conf

LooadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / /var/www/test/apache/django.wsgi
Alias /media/ “/usr/lib/python2.4/site-packages/django/contrib/admin/media/”
<Directory /var/www/cola>
Order allow,deny
Allow from all
</Directory>

3. 设定django.wsgi这个handler

import os
import sys
os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘模组名.settings’
import django.core.handlers.wsgi
application=django.core.handlers.wsgi.WSGIHandler()
sys.path.append(‘/var/www’)

4. 开启httpd 就可以了