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 就可以了

linux command (不常用的常用指令)

一些不常用的指令似乎会忘记掉。今天早上需要把一个进程从cpu1转去cpu21,突然间脑子打结死活忘记了哪个指令是可以把运行的进程换到其他的cpu上。

google看了一下结果发现搜索方式不对,没找到我要的。还好想起可以直接找man page,问了一下man总算找到。所以决定把一些容易忘记的指令自己记下来,以后直接来这里找就好。

1. 改变进程的cpu

taskset – retrieve or set a process’s CPU affinity

2. 每次都用每次都忘的ps指令

  • 可以把thread当作fork来看待,同时显示每个process在哪个cpu上

ps H -eo user,pid,ppid,pcpu,ni,pmem,vsize,rss,nlwp,pri,rtprio,stat,psr,comm

  • 另一个常用ps指令

ps -eo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,policy,nice,pri,psr,sgi_p,utime,stime,minflt,majflt,wchan:14,args

3. postgresql 里面的一个query. table mytable里面的column: mycolumn 这里假设是varchar的

需要的是用mycolumn里面的值对比自己输入的值,并且返回最match的一个。

select mycolumn from mytable where position(mycolumn in (cast(‘%s’ as varchar)))=1 order by length(mycolumn) desc limit 1″ %my_string

4. curl直接带auth去网页(每次都记不住-d跟-L 。。)

HTML=$($CURL -d “j_username=$users_login&j_password=$users_password” -L $URL 2>/dev/null)
LOCK=$(echo $HTML | $GREP $LOCK_STRING | $WC -l)
LOGIN=$(echo $HTML | $GREP “$LOGIN_STRING” | $WC -l)

5.  硬盘读写方式改变(每次记不住路径的)

cat /sys/block/cciss\!c0d0/queue/scheduler
noop anticipatory [deadline] cfq

6. process group

getpgid (2)          – set/get process group
getpgrp (2)          – set/get process group
killpg (2)           – send signal to a process group
setpgid (2)          – set/get process group
setpgrp (2)          – set/get process group
setsid (2)           – creates a session and sets the process group ID
tcgetpgrp (3)        – get and set terminal foreground process group
tcsetpgrp (3)        – get and set terminal foreground process group

vim: remove empty line

:%s/^[\ \t]*\n//g

or

:v/./d

wireshark

rtp分析

#capture only udp
#-a duration:10 set to only capture 10 seconds
#-o rtp.heuristic_rtp:TRUE to decode anything as rtp
#-s 65: only capture 65 (header)
#-q quite
#-z : Collect statistics for all RTP streams and calculate max. delta, max. and mean jitter and packet loss percentages

[root@asg1-mb7.nyc rli]# tshark udp -a duration:10 -s 65 -o rtp.heuristic_rtp:TRUE -q -z rtp,streams

dump function out of postgresql db.

example of dump colaproxygetip from opensips db (also change create function to create or replace function)

pg_dump -Upostgres -Fc -C -s opensips | pg_restore -P “colaproxygetip(character, character)” | sed ‘s/CREATE FUNCTION /CREATE OR REPLACE FUNCTION /’ > colaproxygetip.sql

 

wireshark: voip中需要根据打入电话(callerani)来抓sip跟rtp的包。

所以首先需要抓sip,然后找sdp中的rtp的port的值,再抓rtp出来:

tshark -i bond0 -d udp.port==5060,sip -T fields -e sip.Contact -e sdp.media.port -e sip.Status-Code -e sdp -R “sip.Status-Code==200 and sdp and sip.from.addr contains 123456789”
真正script的时候,fields只要 sdp.media.port 就够了, debug的时候,可以顺便要 sip.Contact, status-code, sdp 出来。filter中定义要200的status code号码搜索是123456789

第一个线程做sip的dump,同时分析rtp的端口,第二个线程做rtp的dump,这样就有一个完整的VoIP了。 这里没有考虑reinvite的时候的media change,做工具的时候还要把reinvite的media change(可以更改rtp的port或者ip)也算进去,然后就应该差不多能用了。

随时想起来什么再加吧。

简单的 Firefox 性能优化

增加firefox的游览速度

地址栏输入:about:config

更改以下值

network.http.pipelining = true
network.http.pipelining.maxrequests=128
network.dns.disableIPv6 = true
plugin.expose_full_path=true

添加下面几个值 (integer)

nglayout.initialpaint.delay=0
content.notify.backoffcount=5
ui.submenuDelay=0
browser.cache.memory.capacity=16384

上面的16384是16M的设置(通常足够)

如果想多点cache的话,可以设定成32768  (32M)

putty 知多少

最常用的windows下的ssh客户端,也许就是putty了。至少我不知道还有其他的。但是对于putty,似乎很多人只知道下载回来之后,双击,输入ip,然后登陆使用。其实putty有很多地方设定一下,就可以让你的生活变得轻松很多。这里介绍一下常用的log系统,如何免密码登陆机器,如果在windows上直接通过putty显示linux中的xwindow中的图形界面程序。以及如何使用加密通道给自己做代理,也包含了如何防止SSL中的man in the middle 攻击。还有基本的如何在cmd的指令模式中使用ssh,scp等等功能

下载:

putty的官网大家随便google百度bing都能找到:http://www.chiark.greenend.org.uk/~sgtatham/putty/

建议直接下载widnows的安装包(包括所有工具)至于为何除了putty.exe本身我们还需要其他的工具呢?这个看到后面就会揭晓

完整包的下载在这里: http://the.earth.li/~sgtatham/putty/latest/x86/putty-0.60-installer.exe
建议直接安装在c:\putty这个目录下。因为这样等下添加目录path的时候会比较省事。如果您安装在其他地方,后面请将文章中所有出现c:\putty\的地方替换成你自己的安装途径[内建是Program Files或者Program Files (x86)]这个文件夹。

完整的安装包会给我们提供以下几个程序

pageant: 钥匙管理程序

plink: putty的指令模式(cmd下用)

pscp: 等于是linux下的scp (安全的传送文件的协议)

psftp: sftp客户端

putty: 这个就是大家用的最多的主程序了

puttygen: ssh 的钥匙成产/转换程序。

putty

从主程序putty开始吧。putty是我用过的最好的windows上的ssh客户端了。secureCRT我们公司有买,所以我也用过,总觉得没有putty来的顺手。另外secureCRT价格不菲。(我严重不提倡做电脑的人用盗版)

主程序开启很容易,双击就好,废话,这个谁都知道。。。

这里讲解一putty的设定为主。

第一段是logging,也就是记录。你可以把你每次开启putty的东西全部都记录到log里面去。这样做有两个好处,第一是你自己可以看。第二是可以给别人看。

putty的内定设定是不记录log的。在Session logging这里,你可以选择

  • None: 不记录
  • Printable output: 适合打印的log记录
  • All Session output:所以putty的窗口的显示
  • SSH packets: ssh 封包级别的记录
  • SSH packets and raw data:  ssh的封包级记录以及所有的raw数据(原始数据

通常来说,如果准备记录,那么 All session output就可以了

下一个选择是log file name: 你的log的名称,这个看个人爱好。我认为内建的putty.log就可以了。如果你想根据时间来记录,putty也可以提供好像linux中的log名称记录方式。

  • &Y=年
  • &M=月
  • &D=日
  • &T=时间
  • &H=连接的主机名称 (linux那个机器)

例如我设定log为: putty-&H-&Y-&M-&D.log 然后我在2010年4月3日早上6点连接到机器maclinux,那么我的log名称将会是: putty-maclinux-2010-04-03-18.log

之后的选项是让putty设定如果已经有了这个log的文件名,那么putty应该如何处理。

  • Always overwrite it
  • Always append to the end of it
  • Ask the user every time

这里提供3种方式,第一个是覆盖之前的log,重新写,第二个是接着之前的log继续写下去。第三个是每次询问使用者应该如何处理。

Flush log file frequently: putty内建是开启这个选项的。这个选项开启putty会第一时间把log写入硬盘。如果你做的东西有很多的显示,这个可能会影响到putty的效率(要不停的写硬盘)如果不选择这个选项,那么putty将会间隔一段时间才写进log。

log中最后的设定是 Options specific to SSH packet logging

一同提供两个选项: Ommit know password field: 这里选择后,putty不会记录跟密码相关的东西,另外一个是Omit session data: 这个选项会将会不记录 session 数据。 包括终端中的session data跟 forward (TCP, X11, 验证) 关于forward的东西后面会讲到。

Terminal

Terminal 主设定,基本不需要改动

键盘设定 (keyboard)没特殊要求,也是不用动的就好。Bell 也是一样(除非你爱好听声音)

这里说一下Features里面的设定。Features里面有一个设定需要更改(我只知道需要这一个)

就是 Disable application keypad mode

如果这个不选择,那么你在vim这类程序中,小键盘(数字键)就没法正常使用。只要选择了Disable application keypad mode那么小键盘就可以正常的在vim中使用了。

window

windows中我通常会加大Lines of scrollback 的值。这样的putty会找窗口的记录的时候,会保持很多行的记录。方便查找之前的资料。我个人来说,设定在200000行记录,基本一个星期内的东西,只要我putty窗口不关闭,都能找回来看到(我没开log的)

Appearance: 这里里面可能唯一需要改动的就是字体跟大小了。我是用 Courier New 10号字-12号之间(根据屏幕大小决定)

Translation: 这里注意一个Character set的设定。如果你想中文显示无误,最好设定你的显示字符。我是用UTF-8 (我linux跟windows都是UTF-8的)这样不管输入显示中文就都没有问题了。

下面是个测试:我首先用UTF-8的编码,然后去显示一个文件。这里看到中文没有问题,然后我更改putty设定用VSCII编码,去显示同一个文件,中文就是乱码了。

Colours: 这里设定终端的颜色。如果选择的 Use system colours那么就是白底黑字的。把这个选项不要打钩,你就可以设定任何你喜欢的颜色(我通常用颜色区分不同类型的窗口)颜变设定很简单,RGB值,可以直接手动输入,也可以点击Modify那个按键从色谱中选择

Default Foregound: 前景颜色

Default Bold Foreground: Bold时的前景颜色

Default Background: 背景颜色

Default Bold Background: Bold时的背景颜色

Cursor Text:光标文字颜色

Cursor Colour: 光标颜色

至于后面的,就是详细的,你可以把某个颜色显示成另外的颜色。假设我把 ANSI Red (187,0,0)给成其他颜色(0,255,0)那么红色就成了绿色了。基本来说,最常用的就是Default Foreground颜色了。很少看到某个BT的人去单独每个颜色都换换的。

下面是随便的几个颜色

connection

这里需要设定一下。有人问,为什么我putty连接着过一段时间没用就自己断了呢?因为linux系统可以判断你一段时间没有任何动作就把你T出去。就好像群里太久不说话,群主就会T你一样。

这里有个选项是: Seconds between keepalives (0 to turn off) 这里设定发送 keepalive的封包时间。0就代表关闭(这个就是一段时间不用会断线的原因)这里可以随便设定一个值。我自己是放5,就是说每5秒发送一个keepalive 封包告诉主机,我还活着。

SSH

ssh 下面有几个选项的,这个也应该是大家最关注的东西。

在ssh主选项上,没什么必须要动的。不过我自己是设定:只用 ssh v2 协议并且优先的演算用 AES,通常来说这里保持不动就可以。

Auth 这里有几个地方关注一下:

  1. Attempt authentication using pageant : 这个就是说允许我们用 Pagenant 来做免密码的 ssh key 登陆 (后面会说)
  2. Attempt “Keyboard-interactive” auth: 允许键盘做互动登陆
  3. Allow agent forwarding: 这个很有用。就是说可以把你的ssh 的 key 直接 forward 到你连接的主机去。(就是linux 中 ssh -A 的作用)
  4. Allow attempted changes of username in SSH-2: 大家都是知道,正常情况如果你ssh连接一个机器,可以有几次输入密码的机会,但是只有一次输入用户名的机会。在ssh-2中,你设定有多次输入用户名的机会。防止。。。用户名输错了,只好关闭putty重新开一个窗口。

这里解释一下 (3) 的 Agent forwarding: 正常情况,如果你用ssh key登陆,是不问你密码的。直接就可以进入主机了。例如我有2台主机A跟B,两台主机我都放了我的ssh key,可以免密码登陆。从putty登陆到A,这个时候是不问我密码的,直接就登陆了,但是在A里面,如果我直接从linux中用ssh登陆B,则需要密码。开启了Agent forwarding之后的作用就是,你从putty登陆A不需要密码,从A登陆B也不需要密码。你的ssh key被传给了A

X11

这个也是我的最爱。开启Enable X11 forwarding

有些时候,需要偶尔跑个linux的窗口程序,或者有时候需要用到。那么在windows上如何显示linux中的window呢?用linux的都知道,linux的X是server-client的模式。也就是说,你用任何一个linux连接到其他linux中,都可以直接在本地显示远端的linux窗口界面。ssh本身也提供这样的功能,在linux中,你给ssh -X的选项,就可以直接做X11的forward了。

putty中也有这个功能,当然了,你的window要有个X才可以,好在有免费的可以用。

windows下面有个叫做xming的程序(2.2MB)可以让你用,下面的地址可以下载到。直接安装就好。

http://sourceforge.net/projects/xming/

安装后开启xming,你是看不到什么东西的,只有在你windows的右下多个X的小图标,但是你已经有了一个windows上的X了。

ssh到你的服务器,直接输入你想跑的程序,显示就会出现在你的widnows上了

先来看看linux中最出名的xeye吧

gnome的about,没错,我是在windows上显示的

当然了,你要是够BT,整个gnome桌面用ssh跑去windows都可以(我曾经做过)不过如果跑很多图像的东西,最好是局域网,走internet的话,速度不怎么样。
关于putty,最后还有一个不能不说的东西,就是ssh通道。相信知道这个并且用这个的人一定很多了。ssh通道有几个最大的用处。

防止网页MIM(man in the middle)攻击

MIM也算是臭名昭著了,也许有些人不是很了解,但是介绍MIM已经超出putty的内容了。这里简单说一下,MIM就是一个机器在你跟服务器之间,对你来说,它假装是服务器,对服务器它又假装是你。这样就可以在中间窃取你的信息(例如密码)无线网尤其危险(很多人上无线不会去真的看是否有2个同样的ip在arp里面吧)有线网络虽然没有无线那么容易做(在你家隔壁放个无线路由就行)但是也可以做到。甚至可以直接从dhcp开始下手。但是有一点所有的MIM都没有办法的,那就是ssh。ssh有finger pirnt的key。这个至少目前我不知道有什么方法可以假冒。如果别人在ssh中就做MIN的话,你连接一眼就能看到,你主机的finger print变了。如果是使用ssh key连接,密码都不会送出去的。所以安全很多。我本本上网的时候,只要是看需要保密的网页(银行,股票等等)100%一定是走ssh tunnel的。不然。。。搞不好那天就看到银行空了

让你可以游览公司内网网页(如果公司对外不开网页只开ssh)

我们公司内部有很多网页,外面无法看到。内网的东西,只能通过vpn挂公司网络才可以。我是懒人,不是那么系统vpn,再说公司有几个进入点(刚好我喜欢的那个)还是IPsec的vpn,众所周知,cisco为了让大家多花钱,根本不支持也不打算支持64位windows的IPsec。(ssl vpn版权单算的)linux下面还好,随便都能上去。windows就是个头痛的问题了。好在ssh无所不在,我可以把网页都走ssh通道从公司内部去看。

增加游览速度

这个看具体网络设定。通常大公司的网络中有很多QoS的设定,那么大家都是知道,普遍的QoS中,http跟ftp都是尾巴,ssh优先级别高多了。所以如果外面还有个不受QoS限制的机器,那么我们可以把网页通过ssh通道跑去那台不受QoS的机器,再通过那台机器来上网。这个也是我们公司的实例了,公司因为统一的管理要求,有一些管理的页面在美国加州。正常情况,在网页输入网址,你就http通过公司的vpn一路到了加州那边,然后再显示给你。可是http在QoS里面是尾巴的东西,游览速度那个慢呀。好在我有全球ssh的账号。找个公司加州的机器ssh过去,然后网页走ssh的通道,ssh在我们部门(我们是系统管理)的QoS级别是非常高的(保证系统管理的流畅性)所以网页速度提升5-10倍!

废话了这么多,开始说设定。最简单的设定,开一个dynamic port做tunnel。

在Tunnels选项里面,Source port输入一个随便的port(给1024以上比较好)我这里输入5555

然后点Add,就这么简单。正常登陆你的ssh吧,你已经给自己开了一个tunnel了。

如何使用呢?这里firefox为例(IE或者其他的一样)就是设定代理那里。选择socks代理就可以

代理ip是你的本机(127.0.0.1)代理端口就是你上面输入的地方,然后确定就可以。这样你所有的网页,会从ssh走到你登陆的那个主机去,然后通过那个主机再做网页请求再发送回来。

这里还有一个地方(IE我不知道怎么改,从来不用那个)就是DNS,如果你为了方式MIM攻击,或者要看公司内部网页(公司有自己的DNS呀)那么DNS怎么办呢?firefox可以有个设定,然你所有的DNS请求也从SOCKS去做。

在firefox的地址栏输入about:config

然后更改network.proxy.socks.remote_dnstrue就好了。这样dns也就都从你的ssh到目标机器去做了。

putty 图形界面部分,大致就这么多吧。以后有什么想到的,再补上去。 对了差点忘记,所有的东西设定好之后,记得再putty的左边中点一下Session,然后点右边的Default Settings然后点Save,这样就保存了。不然你设定的所有东西,关闭后下次开启就没有了

更加方便高效的使用putty套件

首先来设定一下windows的环境。我的电脑,鼠标右键单击,选择属性,然后设定环境变量,在path中添加c:\putty\

这样我们就可以在cmd中直接使用putty了。

先说putty吧,putty可以直接从cmd里面开启的,也就是说你可以直接给 putty user@ip 就打开putty然后连接过去了。如果你用ssh,密码什么都不用,直接进入。多方便。

想给密码也可以,如果不介意密码用明文打出来 puty -pw 密码 user@ip 就可以

例如我有个用户 test 密码是 12345在192.168.100.2这台机器上

putty -pw 12345 test@192.168.100.2

这样直接就开启了putty连接到192.168.100.2以用户test登陆密码是12345

puttygen 以及 pageant: 使用ssh key 无密码登陆系统

linux下面的ssh-keygen大家应该都熟悉。puttygen就是做这个用的

使用很简单,打开程序,点选 Generate 就可以了。

完成后你会看到这样的一个屏幕。

key passphrase: 这里输入你私钥匙的密码,后面的confrim passphrase再次输入密码缺人

如果你不输入密码也可以,这样加载钥匙的时候不会问你密码,好处,加载的时候省掉输入密码,坏处。。。任何人得到你的私钥匙都可以无密码进入你所有的有公钥匙的机器

选择save public key把公共钥匙保存在一个文件

选择save private key把私钥匙保存在一个文件中

开启私钥匙很简单,双击那个文件就可以,如果你输入了密码,这里会问你一次密码。如果没有输入,就。。。什么也不到(windowws右下窗口会多个蓝色小标志而已)

不同的机器你可以存不同的钥匙,pageant会帮你管理这些钥匙。

puttygen还有一个功能,就是把你的key转化成openssh所有的钥匙格式。因为putty跟openssh(你linux中的ssh)所用的格式不同。putty直接产生的私钥匙在linux中是无法用的。所以puttygen提供一个转换程序,这里只要选择Export OpenSSH key就可以了。这样就会帮你生成一个openssh可以使用的钥匙。

顺便说一下对linux不了解的人。你公钥匙是要复制到你linux自己账号下面的.ssh/authorized_keys 这个文件中。

例如root的就在 /root/.ssh/authorized_keys

如果是用户 test的,就在  /home/test/.ssh/authorized_keys

权限要600才可以

pageant基本没什么特殊的用法。打开后看到你在pagent里面的钥匙。可以增加或者删除。增加钥匙也可以直接在新的钥匙文件双击。

添加了钥匙之后,进入有公钥匙的机器就不需要密码了

上面的图是我直接从windows的cmd里面用plink以root账号去192.168.100.1里面开一个xclock到我windows上的结果

中间就没有密码询问了。

同理,上面开启ssh通道

Plink -> putty的纯指令无界面模式

是否很多人想念linux中的ssh可以直接给指令的?通常最长见到的就是有时候为了方便,一个for loop然后直接用ssh然后给一堆指令过去

这个就是plink的存在了。基本来说跟putty指令用法一样,但是不给你那个多余的窗口界面,最大的功能有2个

一个是远端直接跑脚本或者指令,另外一个就是我们前面提到的ssh通道,用putty开多麻烦,pink直接可以搞定

还是用上面的test那个用户

plink -pw 12345 test@192.168.100.2 “cat /etc/issue”

直接返回结果到你的cmd,跟linux中的ssh是一样的

再来个例子,直接在widnows开启一个linux下的窗口程序(这里用xclock为例)

plink -X -pw 12345 test@192.1687.100.2 “xclock”

这样就直接在windows显示你主机下面的xclock程序了。那个-X就是说我们要做ssh fordward的意思

另外一个例子,这个是我常用的

plink -D 5555 -N -pw 12345 test@192.168.100.2

这样就开启了一个ssh的通道在5555这个端口,-D 5555是说我们在5555开dynamic通道,至于这个-N,这个是告诉系统说,我们并不需要login的shell,只要通道就好

做成一个bat文件,双击就直接开启通道了,你还可以有一堆的bat,确定开通道去不同的机器等等。这个自己玩玩都会找到个子最适合自己的方法

pscp & psftp

两个个没啥好多说的,一个是scp一个是sftp的程序。都是指令的。用法跟plink一样的。参数基本跟linux的差不多

装个linux

今天突然想起,我的苹果都好久没用了。换回linux吧。

这个以前就是linux的,上次为了做iphone的东西,没办法又换回了osx。结果就是,iphone做完了,就再也没有怎么开机过。

所以决定,换回linux,也给自己找点事情做。从新熟悉一下linux的系统。
希望。。。半个月内能搞定!

经过6小时奋战,终于把内核搞定了。真的很好奇这个内核在现在这个年代的机器上到底要多久。立刻开个虚拟机,给4个cpu,4G内存。同样的内核,汗呀,12分钟就搞定了。看来这个小mac是跟gnome无缘了。插曲。。。忘记编ATA进去。。。。unable to mount root device,驴了一回。还好重编内核很快。赶快加进去ata跟cdrom。

那么是xfce呢还是wmaker?其实个人一直挺喜欢wmaker的。看了下wmaker的ftp,最后一个上传时间是2008年6月,先偷笑一个,原来还有在开发,还没有停。再一看。。。最后一个release是给redhat9的。也就是说。。。最近7-8年都没有更新过了。脑子里面开始搜索还有哪些轻量级的windows manager可以用,openbox?iceWM,afterstep (这个以前也喜欢),blackbox? fluxbox?fvwm?xfce?(个不错,但是应该算是轻量级中的重量级)linux里面东西太多了。。。有时候好难挑噢。基本顺序。。vmaker, blackbox(或者fluxbox),xfce 这样来做吧。如果vmaker感觉还可以,就它了,不行就走blackbox或者fluxbox再不行。。。只好上xfce了。