-
KVM使用原生CPU - [Linux]
2012-01-10
默认情况下 CentOS 6 安装虚拟机后的CPU是:QEMU Virtual CPU,一般使用是没有问题的,只是性能低下,PHP一个10万次循环的脚本居然需要执行50多秒,而母系统执行只需2秒多,差距有点儿太大。
# virsh edit vm_name <domain type='kvm'> ...... <qemu:commandline> <qemu:arg value='-cpu'/> <qemu:arg value='host'/> </qemu:commandline> </domain>一般建议使用 virsh edit 编辑虚拟机配置文件,避免文件被破坏。
-
libvirt与qemu 几个常用命令 - [Linux]
2011-12-31
克隆一个虚拟机:
virt-clone -o formdomain -n todomain -f /path/filename.img
转换镜像格式:
qemu-img convert -O qcow2 filename.img filename.qcow2
支持的格式:raw、qcow、qcow2、vmdk、vdi
查看一个镜像的信息:
qcmu-img info filename.img
调整镜像大小
qemu-img resize filename.img +|-size
-
CentOS 6 安装配置KVM小记 - [Linux]
2011-12-10
作为一名半调子系统管理员,XEN那dom0,domU还要编译内核,这简直要了我的亲命,KVM作为一个CentOS 6开始唯一内置支持的虚拟化,安装配置简单,很适合我。
安装:
KVM需要CPU支持vmx(Intel)或svm(AMD)。
$ cat /proc/cpuinfo | egrep 'vmx|svm' flags: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt npt lbrv svm_lock nrip_save flags: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt npt lbrv svm_lock nrip_save
安装KVM组件
# yum groupinstall Virtualization # yum groupinstall "Virtualization Platform"
重启后检查是否安装成功,若使用Intel CPU会显示 kvm_intel。
# lsmod | grep kvm kvm_amd 37434 4 kvm 292815 1 kvm_amd
OK,就这么简单,KVM安装完成。
周边工具:
virt-manger与virt-viewer是基于X Window的图形化管理工具,优点呢就是操作简单、鼠标点点,坏处自然就是要装一堆图形组件,对于服务器来说这些东西有些太多余。
服务器上最好用的当然是命令行工具
yum install libvirt-client python-virtinst
libvirt-client 提供了 virsh,主要功能为:启动、重启、停止等管理功能。
python-virtinst 提供了 virt-install 安装工具。
安装虚拟机
# virt-install \ --name gentoo6 \ --ram 512 \ --vcpus=1 \ --disk path=/var/vps/gentoo6.img,size=4 \ --network network:default \ --os-variant=generic26 \ --accelerate \ --cdrom /var/vps/install-amd64-minimal-20111201.iso \ --vnc \ --vncport=5911 \ --vnclisten=0.0.0.0
--name 指定虚拟机名称,virsh操作指定虚拟机时所需要的参数,不可以重复。
--ram 分配内存大小,安装完成后可以用 virsh 调整。
--vcpus 分配CPU核心数,最大与实体机CPU核心数相同,安装完成后也可以用 virsh 调整。
--disk 指定虚拟机镜像, size 指定分配大小单位为G。
--network 网络类型,此处用的是默认,一般用的应该是 bridge 桥接,这个下次再说。
--os-variant 指定操作系统类型,此处使用的是标准Linux 2.6,其他的可以通过 man virt-install 详细查看。
--accelerate 呃,加速,具体什么原理还不太清楚。
--cdrom 指定安装镜像所在。
--vnc 启用VNC远程管理,一般安装系统都要启用。
--vncport 指定 VNC 监控端口,默认端口为 5900。
--vnclisten 指定 VNC 绑定IP,默认绑定127.0.0.1,这里将其改为 0.0.0.0 以便可以通过外部连接。
执行后如果没有安装 virt-viewer 或没有 X Window 系统可能会提示 virt-viewer 启动失败,不过没关系,使用 VNC Viewer 或者 MAC 下使用Chicken of the VNC连接到实体机,端口使用上面指定的就可以操作安装过程。另外需要注意的是,某些系统安装盘有等待输入时间,超过时间会自动使用硬盘启动,所以VNC连接一定要快,否则就需要 virsh destroy 然后 virsh start 再启动,因为系统尚未安装成功,此时的 virsh reboot 执行是无效的。
virsh 常用命令
virsh list 列出当前虚拟机列表,貌似不包括未启动的。
virsh start domain-name 启动指定虚拟机。
virsh shutdown domain-name 停止指定虚拟机,执行此命令后 virsh list 里将不出现。
virsh reboot domain-name 重新启动指定虚拟机,这个命令貌似必须系统安装完成后才有效。
virsh autostart domain-name 指定虚拟机开机自动启动,需要 libvirtd 服务默认启动。
还有更多,一时也没全搞明白,全写出来估计可以写本手册了。
其他
虚拟机配置存储在 /etc/libvirt/qemu 目录,配置文件为XML格式。
自动启动的虚拟机在 /etc/libvirt/qemu/autostart 目录。
-
纪念小猫
2011-05-30
前几天同事送我一只初生不久的小猫,白色,头顶一块黑色, 应该刚出生一周左右,整个身体还没有我的手掌大。
小猫还不会自己吃东西,需要人一点点喂牛奶,前两天每到半夜2-3点左右都会自己爬起来喵喵的叫我起床喂它吃东西,但是今天却没有爬起来,本来我以为它知道我今天要上班没有打扰我,谁知道它已经在窝里一动不动了......

刚来时的小猫,临时睡在一个很小的鞋盒里。

这只笨猫,大部分时间都在吃完睡,睡醒了吃,只拍了几张在外面的照片,只是我技术的确太差,都糊掉了。

刚买的新猫窝,只是它还太小,怕冷。

老婆大人的暖脚垫,本来朋友是用暖宝宝给它取暖,但是用完了,现在这个季节实在找不到那里有卖的,就征用了老婆冬天用的暖脚垫做它的临时窝,想等它大一些再搬去新家。但是就在这里它的生命结束了。

省下一半的小奶瓶,刚来时小猫一天只能吃掉一小眼药水瓶的奶,之前两天已经可以喝掉60ml牛奶,我还在开心它可以快快长大。

猫粮,你还没来得及吃。

奶粉,本来今天就要把牛奶给你换成奶粉,也不知道你喜不喜欢。

准备给你洗澡用的,你的确好脏啊,只是你现在这么小,不敢给你洗澡。

给你准备的新家,看起来蛮舒适的。
一路走好,其实我到现在都不知道为什么,昨天你还活蹦乱跳的,怎么说没就没有了呢?走好......
-
simplejson处理不严谨JSON一例 - [Python]
2010-12-19
一个标准、严谨的JSON应该如下:
{"title": "\u6587\u7ae0\u6807\u9898\n\u6362\u884c"}但是在某些情况下,特别是跨语言情况下,JSON可能是这个样子:
{"title": "文章标题 换行"}这种情况下直接使用 simplejson.loads(json) 有可能报如下错误:
Traceback (most recent call last): File "testjson.py", line 24, in <module> print simplejson.loads(json) File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/ site-packages/PIL/__init__.py", line 384, in loads File "build/bdist.macosx-10.5-i386/egg/simplejson/decoder.py", line 402, in decode File "build/bdist.macosx-10.5-i386/egg/simplejson/decoder.py", line 418, in raw_decode simplejson.decoder.JSONDecodeError: Invalid control character at: line 1 column 15 (char 15)simplejson.loads() 有一个手册上没有提及的参数“strict”,这其实是 JSONDecoder 的一个构造参数,即不严格检查JSON语法。
因此,兼容非标准格式的方法即:
simplejson.loads(json, strict=False)
-
SVN 总是在 Mac OS 下出现这句错误提示,一般出现在 Windows 下进行过 svn up 操作后,老外对此给出了解决方法,但是最近这个站点在国内经常打不开,在此记一笔为自己备记。
进入项目目录执行:
chflags -R nouchg .
老外给的方法是:
chflags -R nouchg *
但是有时会依然会无法解决问题,两种方法都试试吧。
-
Symfony + Doctrine Model 方法覆盖 - [PHP]
2010-01-26
Symfony 1.4 集成的 Doctrine 是一款超强的 ORM 组件,提供了很多方便的功能,如针对字段自动生成的 get、set 方法。
但是如果在子类直接覆盖 get 方法后,一般做法是 parent::getXXX() 来获取原始值,如:
class Comment extends BaseComment { public function getContent() { $content = parent::getContent(); return htmlspecialchars($content); } }但是这样的结果却是程序死循环,最终崩溃。
分析 sfDoctrineRecord 源代码后可发现,__call 方法实际调用的是 $this->get($method),这个方法来自更上一级的 Doctrine_Record 类,但是上面的 getContent 方法若直接调用 $this->get('content') 结果依然是死循环,原来 Doctrine 在这里自作聪明的判断了下本类是否拥有 getXXXX 方法,如上例则是 getContent,若存在则直接调用 getContent,如此就造成了死循环。
分析 Doctrine_Record::get 方法可得知,若不存在 getContent 方法则调用 Doctrine_Record::_get 这么一个 protected 方法,如此我们便可将上例改成如下形式:
class Comment extends BaseComment { public function getContent() { $content = $this->_get('content'); return htmlspecialchars($content); } }这样虽然看起来不太好看,但也只能这样先用着。
-
Apache使用mod_wsgi安装Trac
2010-01-23
Trac是一款使用Python开发的WEB项目管理系统,集SVN、文档、任务管理于一体,基于BSD协议发布。
Trac在Apache上的选择一般只有CGI、FastCGI、mod_python几种选择,CGI速度太慢,FastCGI在Apache上的表现又不够稳定,似乎只有一个mod_python的选择可用,而WSGI的出现改变了这一情况,这个2006年诞生的标准得到了Python WEB开发领域的一致欢迎,Trac也对此提供了支持。
mod_wsgi的下载安装请参考这里:http://code.google.com/p/modwsgi/
编译完成后,修改httpd.conf文件,确认如下选项是打开的:
LoadModule wsgi_module modules/mod_wsgi.so
创建trac.wsgi文件,这是一个Python文件:
import os os.environ['TRAC_ENV'] = '/path/to/trac' os.environ['PYTHON_EGG_CACHE'] = '/tmp' import trac.web.main application = trac.web.main.dispatch_request
Apache配置,请将以下代码放入httpd.conf:
WSGIScriptAlias /trac /paty/to/trac/trac.wsgi <Directory /paty/to/trac> WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory>配置完成后,若显示不正常,可将wsgi脚本改为如下内容,测试是否可输出“Hello World!”
def application(environ, start_response): start_response('200 OK',[('Content-type','text/html')]) return ['<html><body>Hello World!</body></html>']若以上脚本执行成功,则代表wsgi安装正确,但如果你使用的是Python 2.4以上版本可能会遇到另一个问题,那就是Trac始终显示白页,没有任何输出!
检查error.log文件
httpd: Objects/stringobject.c:105: PyString_FromString: Assertion `str != ((void *)0)' failed. [Fri Mar 20 20:39:03 2009] [notice] child pid 8734 exit signal Aborted (6)
由此可得知mod_wsgi线程崩溃掉了,Google一下,在这里得到一些资料,看来wsgi应用在Apache下崩溃的不止是Trac,Django也是有可能的。
根据作者的提示得知,这是由于Apache与Python的expat库版本不匹配导致。
Apache expat版本:
httpd-2.2.8/lib $ strings libexpat.so.0.1.0 | grep expat_ expat_1.95.2
Python expat版本:
/opt/httpd-2.2.8/lib $ python Python 2.4.3 (#1, May 24 2008, 13:47:28) [GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import pyexpat >>> pyexpat.EXPAT_VERSION 'expat_1.95.8'
找到原因后就好办了,但是作者只提了一句下载expat 2.0.1安装,却没说如何安装到Apache,Apache的configure本身并没有with-expat参数,只有apache_src/srclib/apr-util/configure有这个参数却不知如何关联,无奈之下另找方案。
检查httpd依赖的库:
/opt/httpd-2.2.8/bin $ ldd httpd linux-gate.so.1 => (0x002e6000) libm.so.6 => /lib/libm.so.6 (0x00cd8000) libaprutil-1.so.0 => /opt/httpd-2.2.8/lib/libaprutil-1.so.0 (0x00c1e000) libexpat.so.0 => /opt/httpd-2.2.8/lib/libexpat.so.0 (0x00925000) libapr-1.so.0 => /opt/httpd-2.2.8/lib/libapr-1.so.0 (0x003df000) libuuid.so.1 => /lib/libuuid.so.1 (0x00110000) librt.so.1 => /lib/librt.so.1 (0x00d91000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x0023d000) libpthread.so.0 => /lib/libpthread.so.0 (0x00d01000) libdl.so.2 => /lib/libdl.so.2 (0x00cd2000) libc.so.6 => /lib/libc.so.6 (0x00402000) /lib/ld-linux.so.2 (0x00b6f000)由此可知Apache使用的是/opt/httpd-2.2.8/lib/libexpat.so.0,而这个文件是一个软链接,尝试将其删除,重新指到2.0.1:
/opt/httpd-2.2.8/lib $ ln -s /opt/expat-2.0.1/lib/libexpat.so.1.5.2 libexpat.so.0
重新启动Apache, 测试成功!
参考资料:
-
Dreamweaver CS4 for Mac 解决过期问题
2010-01-23
本文原作于2008年12月8日,发布于BlogBus博客。当时仅测试了Mac版Dreamweaver,后来证实文中的方法适用于Adobe CS4系统所有版本,包括Flash、Photoshop等。
Dreamweaver CS4终于发布了, 界面风格重新设计,终于和Flash,PS等统一了, 兴冲冲找到一序列号下载安装后用了一个月就打不开了,提示:“cs4 Licensing for this product has expired”
唉,谁让咱装的时候没看清楚破解文档呢。 没办法,删掉重装吧,谁知换个序列号刚打开,还是给出“cs4 Licensing for this product has expire”这张破脸! 郁闷啦,难道我要重装系统才行!黑苹果耶,重装灰常麻烦的!!
死马当活马医,琢磨下既然是授权过期, 那就试着把时间往前调一下,搞个2007年,居然打开了,但是咱不能一直生活在2007年啊,这样不好!找找看有没有什么玄机。
居然真被我找着了,Help菜单下有一个Deactivate,勾选“Erase my serial number from this computer after deactivation completes”, 这样就清除了系统的激活序列号,OK,下面删除重装。
正确安装方法:
- 安装时以试用版安装,不要输入序列号。
- 安装完成后运行一下CS4,依然不输入序列号,退出
- 使用Block Adobe Activation屏蔽Adobe激活地址,按此下载
- 启动Dreamweaver CS4, 输入序列号,CS4序列号算号器下载
至些大功告成,将时间调到2009年,依然成功!
需要注意的是,算号器是exe格式的,要在虚拟机运行或windows计算成功后保存到文本文件中。
-
转载:mod_wsgi介绍中文翻译(一)
2010-01-23
本文转载自:奋斗足迹 作者:崔玉松 原文地址:http://fendou.org/2009/03/27/mod_scgi_description/
什么是mod_wsgi ?
mod_wsgi的目标是实现一个简单的Apache模块,支持任何Python WSGI的接口的Python应用程序的托管。该模块适用于高性能生产的WEB站点,同时也适用于自己维护站点的WEB 服务托管(虚拟主机环境–译者注)。
运行模式
用mod_wsgi来托管应用,有两个主要的模式可以使用,一种是“嵌入式”模式,Mod_wsgi与Mod_python运行方式相同,所有的 python代码都将在apache 子进程中执行。因此当WSGI应用在此模式下运行可以与其他的Apache托管的模块PHP和Perl共享形同进程。
另一个在UNIX Apache 2.*环境下可选替代的daemon模式,这种模式运作的方式在类似的FastCGI / SCGI解决方案,即在不同的进程运行WSGI应用。与FastCGI / SCGI解决方案不同的是,当执行WSGI程序时不需要单独的基础结构(infrastructure),一切都是自动处理的mod_wsgi。
一切都是自动处理的mod_wsgi,影响正常使用的Apache模块的PHP , Perl或其他语言的Apache子进程服务的静态文件和主机应用程序使用大大减少。守护(daemon)进程可能需要时也可以作为一个独特的用户运行以确保WSGI应用程序之间不能互相干扰或获取信息。
服务性能
该mod_wsgi模块是用C代码直接对内部的Apache和Python应用程序接口编程。因此,服务WSGI应用与Apache它具有较低的内存开销和性能优于现有的WSGI适配器mod_python或替代的FastCGI / SCGI / CGI或代理的解决方案。
虽然嵌入式技术模式能够表现得更好, daemon模式通常是最安全的选择使用。这是因为要嵌入模式高性能需要调整apache MPM设置,默认设置偏向于服务静态媒体和PHP应用。如果Apache 的MPM设置未与服务的应用相对应,将会表现出糟糕的性能而不是更好的性能。
因此,除非你非常熟悉Aapache的配置,否则推荐使用daemon模式,总体而言,大型Python Web程序,通常你不能看出嵌入式(embedded mode)和守护模式(daemon mode)明显的差异,因为瓶颈在Python Web和数据库访问上。
支持的应用
mod_wsgi遵循WSGI接口规范,任何符合WSGI接口规范的Python Web框架或者应用都可以被支持。
我们所熟悉的主要的Python web框架或工具,包括CherryPy, Django, Karrigell, Pylons, TurboGears, web.py, Werkzeug 和Zope 运行良好,我们所熟知的主要的Python web应用包括MoinMoin, PyBlosxom 和 Trac 能够很好的运行。
系统要求
mod_wsgi软件包可以编译和使用任何的Apache 1.3 , 2.0或2.2 UNIX系统(包括Linux ),以及Windows操作系统。无论是Apache MPM的单线程“prefork” 或者多线程的“worker”只能在unix/linux系统中使用。daemon模式的mod_wsgi仅限于运行于UNIX/LINUX环境的 Apache 2.0或2.2上,而且要求Apache的基本运行环境库已经编译并支持多线程。
需要Python 2.3以上版本并且已经编译支持多线程,如果你想尝试Python 3.0,需要从Subversion仓库中下载源代码编译 mod_wsgi。
使用入门
最新的版本,并建议mod_wsgi是2.3
确保您首先阅读“安装与配置”,指南为开发者提供了获得Mod_wsgi 最大产出指导,也可以提供问题调试的协助或者提出问题。
如果你不明白你的应用出了什么问题或者你觉得你发现了Mod_wsgi的问题,你可以在mod_wsgi群组论坛中提出问题
资助
开发开源软件往往被认为吃力不讨好的事情,如果您想展示你对实际上一直在帮助你的软件的赞赏,作为一种反馈,你可以将你成功或失败等要说明的任何问题张贴到用户组中,通过你的反馈,人们才可以知道软件是否正确的工作着,软件或者文档如何改进,以更好的满足你的需要,如果这些听起来非常辛苦,至少在考虑帮助我们提升声望排名。
还请注意,与一些论坛上的传闻相反,这个项目与Google没有任何关系,也没有接受Google(或其他公司)任何形式的资助,唯一与 Google有关系的是,该项目托管在代码自由和公开的Google代码托管服务商。这个项目的所有开发花费的都是我个人时间,如果你发现他对你有益,并且希望以更具体的方式捐助,请为我的Amazon上的愿望列表买单或者通过PayPal捐助,如果是作为公司的一笔小的捐款,可以提供报表或者发票用于会计。
祝用得愉快
Graham Dumpleton