• 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 编辑虚拟机配置文件,避免文件被破坏。

  • 克隆一个虚拟机:

    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
  • 作为一名半调子系统管理员,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 安装工具。

    安装虚拟机

    #&nbsp;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牛奶,我还在开心它可以快快长大。

    猫粮

    猫粮,你还没来得及吃。

    奶粉

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

    香波

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

    小窝

    给你准备的新家,看起来蛮舒适的。

     

    一路走好,其实我到现在都不知道为什么,昨天你还活蹦乱跳的,怎么说没就没有了呢?走好......

  • 一个标准、严谨的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 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);
        }
    }

    这样虽然看起来不太好看,但也只能这样先用着。

  • 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, 测试成功!

    参考资料:

    expat下载地址

    Trac官方安装资料

    mos_wsgi官方对此问题的方案

  • 本文原作于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,下面删除重装。

    正确安装方法:

    1. 安装时以试用版安装,不要输入序列号。
    2. 安装完成后运行一下CS4,依然不输入序列号,退出
    3. 使用Block Adobe Activation屏蔽Adobe激活地址,按此下载
    4. 启动Dreamweaver CS4, 输入序列号,CS4序列号算号器下载

     至些大功告成,将时间调到2009年,依然成功!

    需要注意的是,算号器是exe格式的,要在虚拟机运行或windows计算成功后保存到文本文件中。

     

  • 本文转载自:奋斗足迹  作者:崔玉松 原文地址: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