Thursday, July 31, 2008

QQ for linux, for the future

QQ for linux logo

QQ for linux 终是放出了。

腾讯多年来一直没有开发基于 linux 版的 QQ,linux 用户以前只能使用 gaim QQ/LumaQQ/eva 等开源 QQ 实现。腾讯做为一家商业公司,从纯粹的短期利益角度出发,这么做无可厚非,也无关道德,不过,只是当年施加压力给分析 QQ 协议的 gaim qq 老爹以及三天两头修改协议未免显得无耻和小气。无论如何,今天 QQ for linux 的推出,还是非常正面的,至少我在给 MM 推荐linux 的时候,可以很放心的说,linux 下也可有 QQ。

用腾讯自己的话说:

Tencent QQ for Linux是腾讯公司把握市场需求,针对日渐增多的Linux用户,推出的基于Linux的即时通讯软件。

可见市场占有率才是硬道理,geek 们即便在这个全球化了的新经济时代也永远只能是小众。很有意思的是,QQ for linux 的 logo 上的宣传口号是 “for linux, for the future!",Ubuntu 老爹毅然决然的杀入 Linux 市场,看中的也就是这个 future, 微软被迫拥抱开源同样如此,没有人能够战胜未来,在趋势面前,你会发现垂死抵抗直如螳臂挡车,最后剩下的只会是历史车轮后躁动的飞灰,而那,是留给历史学家的。

废话不多说,放两张截图

Tuesday, July 15, 2008

Ubuntu hardy 上安装 CouchDB

下载

wget http://www.apache.org/dist/incubator/couchdb/0.8.0-incubating/apache-couchdb-0.8.0-incubating.tar.gz
tar zxvf apache-couchdb-0.8.0-incubating.tar.gz
cd apache-couchdb-0.8.0-incubating.tar.gz
sudo aptitude install automake autoconf libtool build-essential erlang libicu libicu-dev libreadline5-dev checkinstall libmozjs-dev
./configure --sysconfdir=/etc --localstatedir=/var
make && sudo make install 
sudo adduser couchdb --home /var/lib/couchdb/ --disabled-password
sudo chown -R couchdb /var/lib/couchdb
sudo chown -R couchdb /var/log/couchdb
sudo /etc/init.d/couchdb start

浏览器打开 http://localhost:5984/_utils/index.html,访问 CouchDB 自带的管理工具。

开源和商业模式

原文发布于 szlug,是szlug聚会时和 xning 兄讨论后的一些思考。

szlug周末聚会回来后,回来之后一直在想开源软件和商业模式这档子事情。

首先自由不是免费,Richard Stallman 说:

"Free software is a matter of liberty, not price. To understand the
concept, you should think of 'free' as in 'free speech', not as in
'free beer'"。

自由不是免费,理解偏差不代表原意的异化。

自由软件允许任何人在同样自由的条款下使用,学习,修改,拷贝,重发布。开源和商业模式并不冲突,开源从来不排斥商业模式。如何建立开源的商业模式呢,一般都是基于软件附加价值,如支持,培训,定制,集成,认证等。基于软件授权的商业模式和开源是不相容的。基于此比较成功的公司有,MySQL, Zend。国外也有很有小型顾问公司提供开源支持,像 MySQL、rails 特别多。

除去自由软件,我们日常接触最多的是开源软件,自由软件是开源软件的子集。在我看来,自由软件和商业更近,自由软件最主要的特点是开发模式的变化,所谓集市和教堂,围绕软件社区的建立,带来的效用很明显,加速软件开发,节省宣传费用,自由软件背后的公司可以基于开源成果建立商业版本或者是解决方案,成功案例有,XFree86,eclipse, Zope 等。

MichaelBibby 的 iredmail 就属于邮件类别的解决方案,而yahoo 收购 Zimbra(同样也是做邮件整体解决方案的) 可是花了 350M 美刀。

所以,我的关点是,开源从来不排斥商业模式,如果你开源的目的是未来利润(利润从没有贬意),而开源后并未带来预期的成功,那么我想需要考虑的更多的是产品的定位,而不是因此否决开源不适合商业。

另外我同意李的低利润说,对于很多软件来说是如此的,所以 IBM 才会早早转向服务,google 做平台,靠长尾的量赚钱。从 1983 自由软件至今,软件行业已经被改变,门槛也已经拔高,软件生产的趋势一定和传统产业的生产线没有太大区别,单纯靠产品赚钱,需要的恐怕是大智慧。

Monday, July 14, 2008

KVM guest 连接 USB 设备临时解决办法

默认的 kvm guest 启动并未模拟 usb, 模拟 usb,需要启动时加上 -usb 参数,qemu 为 guest模拟一个 8 port 的 Intel SB82371 UHCI USB 控制器。

kvm -hda /path/to/your/kvm/image/hda.qcow2

在使用 USB 之前,需要找出 USB 的设备 ID,如:

$lsusb
Bus 007 Device 002: ID 05ac:8502 Apple Computer, Inc.

输出中的 05ac:8502,分别为 <VendorID>:<ProductID>

启动 guest 系统后, CTRL + ALT + 2 转到 Monitor ,手工加载 usb 设备(用上面的输出替换):

#usb_add host:<VendorID>:<ProductID>
Could not open /proc/bus/usb/devices

回到 host 系统发现 /proc/bus/usb/devices 文件不存在,google 后发现相关的 Ubuntu BUG report。Ubuntu 等发行版早将 /proc/bus/usb/devices deprecated 一年之久,hardy 已经完全转向 /dev/bus/usb/devices,相比较 proc 获得有更灵活的权限控制、安全性更高。Ubuntu bug report 中给出了 workaround。

编辑 '/etc/init.d/mountdevsubfs.sh' 取消 40 行后的相应注视:

 # Magic to make /proc/bus/usb work
  #
  mkdir -p /dev/bus/usb/.usbfs
  domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
  ln -s .usbfs/devices /dev/bus/usb/devices
  mount --rbind /dev/bus/usb /proc/bus/usb

执行这个脚本。

$ sudo /etc/init.d/mountdevsubfs.sh start

用此法成功加在招行 USB key,可以进入专业版,实际实验查帐等操作正常,转帐验证时候失败。

Saturday, July 12, 2008

手工配置 Ubuntu hardy KVM 网络

Ubuntu hardy 中安装 KVM 速记中网络配置采用 KVM 默认方式,此法简单易用。

用户网络

使用情形

  • 最简易的从虚拟机访问宿主,Internet,和其它本地网络资源
  • 你不需要从一个 guest 访问另外一个 guest
  • 你不追求最高性能

警告:用户网络不支持部分网络特性如 ICMPP,影响一些程序(如 ping) 无法完全正常工作。

前置需求

  • 你需要 kvm 启动并运行
  • 非 root 用户运行需要拥有 /dev/kvm rw 权限
  • 如果你需要访问 Internet 或本地网络,你的宿主系统必须可以访问 Internet 和本地网络

解决方案

以参数 "-net nic -net user" 运行 kvm , 例如:

kvm -hda /path/to/hda.img -net nic -net user

注意

  • IP地址由qemu 自带的 DHCP 服务自动分配
  • 如果你在一个宿主上运行多 guest 系统,你无法为每个 guest 指定不同的 MAC 地址
  • 你仍可访问一个指定的端口,你可以使用 "redir" 选项(译者按:启动 kvm 时)

公共网桥

警告: 下面的方法,不适用于大部分的无限驱动,因为他们不支持 bridging 功能。

使用案例

  • 你不想指定 IP 地址到你的虚拟机器并且使它们可以从本地网络访问
  • 希望性能于虚拟机无关

前置需求

  • kvm 已启动并运行
  • 非 root 用户运行需要拥有 /dev/kvm rw 权限

停止当前网络接口

sudo /etc/init.d/networking restart

编辑 /etc/network/interfaces 设置 bridge 接口,注释或替换原配置为(修改为对应你网络的配置):

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.0.10
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

或使用 DHCP(对 laptop 比较有用,但不能使用无线,囧)

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

这将用来创建虚拟接口 br0

重启网络

sudo /etc/init.d/networking restart

手工或用下面的脚本创建 MAC 地址

#!/bin/bash
# generate a random mac address for the qemu nic
# shell script borrowed from user pheldens @ qemu forum
echo $(echo -n DE:AD:BE:EF ; for i in `seq 1 2` ;
do echo -n `echo ":$RANDOM$RANDOM" | cut -n -c -3` ;done)

注:原脚本用的环境为 /bin/sh,ubuntu 上出错,所以这里我替换为 /bin/bash

用生成的 MAC 地址替换下面的 $macaddress 启动 KVM

kvm -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap

现在可以 ping 通本地网络了,:-)

Wednesday, July 09, 2008

校内网的“开放”平台

2007 年六月24 日,Facebook推出Facebook Open Platform,大获成功,被媒体誉为网络操作系统,截至到目前,已经有超过 14,000 个应用。一年零一周后,被称为中国版的Facebook校内网推出其校内开放平台,校内一贯以模仿Facebook著称,此次却迈出大胆的一步,在协议上勇敢的创新,或者称之为本土化。

此协议将中文互联网巨头们的一贯作风和嘴脸表现的淋漓尽致,达到了梦寐已久的高潮,特摘录存照。

  • 2.3 其已经取得开发作品(即应用程序)其他权利人(如有)的书面授权,并已与前述权利人就权益分配达成内部协议,保证其在将应用程序提交、上传至校内网前对开发作品拥有充分、完整、排他的所有权及知识产权,并可通过校内网插件应用程序开发许可,将上述产品及产品权利转让给校内网;
  • 校内网保留对以下类型的插件应用程序自有开发和应用权利,即开发者所设计、开发的插件应用程序不得涉及一下领域,否则校内网有权不对该类程序给予审核通过,直至取消该开发者开发许可资格: 1、和校内网主营业务有冲突的; 2、通过校内插件应用程序引导用户注册第三方网站或服务的; 3、在校内插件应用程序内包含外部链接的; 4、涉及以下领域的插件应用程序:招聘、旅游、音乐、个人相册。
  • 六、插件应用程序的权利归属 1. 开发者在活动校内网插件应用程序开发许可证、且将其开发的作品提供给校内网,即视为其已经将基于作品的全部权利,包括但不限于所有权及知识产权永久性、不可撤销的、独家让渡给校内网。 2. 经开发者创作完成并提交给校内网的应用程序,校内网在全世界范围内享有免费的、永久性的、不可撤销的权利和许可,以使用、复制、出版、发行、以原有或其他形式进行改编、转载、翻译、传播、表演和展示此等内容(整体或部分)。同时开发者承诺,不就上述作品以及上述作品的改编作品对任何第三方进行任何形式的许可或授权使用。 3. 经开发者创作而产生的文本、图片、图形、音频和/ 或视频等资料的所有权及知识产权归属于校内网,未经校内网同意,开发者保证不以任何形式直接或间接发布、播放、出于播放或发布目的而改编或再发行,或者用于其他任何商业目的。同时保证不许可任何第三方从事上述行为。

李大维说的好,签个卖身契至少有主人养,签了校内网开放平台开发者协议后呢?

Update: 2008-07-09 14:35, 校内已对协议中最引人争议的条款进行了修订,080709版第六条:

六、插件应用程序的权利归属
插件应用程序的权利归属于开发者或开发商。 

感谢为此做出努力的朋友,你们让我看到中文互联网走向开放的勇气和义无反顾的态度。

Tuesday, July 08, 2008

重新调整 qemu 镜像文件大小一法

qemu 的镜像文件格式 raw, qcow2 采用了文件系统的打孔技术,镜像文件实际大小同实际写入的数据扇节相关。因为担心硬盘空间不足,之前创建的镜像文件仅为 2G,现在看来完全没有必要,尝试重新调整到 10G。

qemu 没有提供调整硬盘镜像文件的工具,google "qemu disk resize" 说法各异。我的 guest 文件系统为 NTFS,按照此法调整成功,记录一下:

转换为 raw 格式

$qemu-img convert hda.qcow2 -O raw hda.raw

增大raw镜像文件到 10G

$dd if=/dev/zero of=hda.raw seek=10 obs=1GB count=0

修正 NTFS BPB

$hexedit hda.raw

转到 7E00: 7E00
替换 7E1A 的 80 为 FF
保存退出:Ctrl-x --> y

gparted livecd 启动 guest 重新调整 NTFS 分区大小

$kvm -hda hda.raw -cdrom gparted-livecd-0.3.4-11.iso -boot d

重启 windows,windows 将进入自检

 
$qemu hda system.raw

重新转换为 qcow2 格式

$qemu-img convert hda.raw -O qcow2 hda.qcow2

Monday, July 07, 2008

Ubuntu hardy 中安装 KVM 速记

kvm hit the road

介绍

KVM(Kernel-based Virtual Machine) 是 X86 平台上基于 linux kernel 的全虚拟化技术,通过 Intel-VTAMD-V 技术实现全虚拟化。Linux kernel 自 2.6.20 已经包含了 KVM,各大发行版也陆续提供支持。

准备工作

本文以 Ubuntu hardy 为例记录安装过程。

系统环境

OS: Ubuntu hardy 8.04 64bit
Kernel: 2.6.24-19-generic SMP x86_64 GNU/Linux
Hardware: Macbook Pro 3rd(Santa rose), Intel(R) Core(TM)2 Duo CPU     T7500  @ 2.20GHz

检查 CPU

KVM 需要 CPU 支持原生虚拟以得到最佳性能,官方文档称当 CPU 不支持原生虚拟时,将自动回退到 qemu 模拟方式。Ubuntu 中如果系统不支持原生虚拟,KVM 将拒绝启动,检查 CPU 是否支持原生虚拟:

$egrep '(vmx|svm)' /proc/cpuinfo

有输出即说明 CPU 支持原生虚拟。

安装 KVM

$sudo aptitude install kvm

安装 guest 系统

#mkdir -p /media/work/kvm/
#qemu-img create -f qcow2 /media/work/kvm/hda.qcow2 10G
#kvm -hda /media/work/kvm/hda.qcow2 -m 256 -vnc :0 -daemonize -cdrom /media/ENT/iso/Windows.XP.Professional.VLK.CN.SP2.full.iso -boot d
  • qcow2 是 qemu 支持的硬盘镜像格式之一,支持 snapshots 以及 AES 加密,zlib 压缩,其它格式可以参考 man qemu-img
  • ext3、NTFS 文件系统支持打孔,只有实际写入的扇区才会占用存储空间
  • KVM 启动参数指定 guest 内存为 256M,以 CDROM 启动

kvm 以 daemon 方式运行,通过 vnc 访问:

$xvncviewer localhost:5900

Windows 安装完成后,关闭系统kvm 进程会自动关闭。如需重启:

#kvm -hda /media/work/kvm/hda.qcow2 -m 256 -vnc :0 -daemonize

系统同样可以通过 VNC 来访问。

网络

默认启动 kvm 或者参数 kvm -net nic -net user 将创建一个 10.0.2.0/24 的网络:

         QEMU VLAN      <------>  Firewall/DHCP server <-----> Internet
                           |          (10.0.2.2)
                           |
                           ---->  DNS server (10.0.2.3)
                           |
                           ---->  SMB server (10.0.2.4)

guest 系统从 10.0.2.15 开始依次分配 IP 地址,VNC 登入 Windows,系统已通过 DHCP 分配到 10.0.2.15 IP地址,Windows 系统此时已经可以正常访问网络。如果不需要提供外部服务的话,默认的网络方式已经可以,非常简便。

links

ext3 文件系统上恢复误删除文件

最近手很贱,骡子辛辛苦苦驼来的 2G 文件被自杀(rm -f)了。

为了表现我们还是很专业的,第一时间,保护现场:

#umount /media/work

没有人含泪劝告,所以我还是要找回这个文件的,没错,即便是放弃做俯卧撑和打酱油的时间。

google 如何恢复 ext3 文件系统中已删除的文件,感谢 Carlo Wood,写了如此强大的 ext3grep。 这里有个 How to。鉴于我一贯不求甚解,How To 中 BLAH BLAH BLAH 的技术细节直接掠过。

安装ext3grep

ext3grep 当前最新版本是 0.7.0, 编译依赖于 e2fslibs-dev 开发库。

#aptitude install e2fslibs-dev
#cd /tmp
#wget http://ext3grep.googlecode.com/files/ext3grep-0.7.0.tar.gz
#tar zxvf ext3grep-0.7.0.tar.gz
#cd ext3grep-0.7.0
#./configure
#make
#make install

恢复过程:

#ext3grep /dev/sdb2 --restore-file mule/Incoming/XXXX.mkv

检查当前目录,文件已经在 RESTORED_FILES 中,简单到死。

我痛哭流涕,我要再次感谢 Carlo Wood 手贱删除了他的 ~/home 目录,由此诞生了如此强大的 ext3grep,也正是因此,我才有了继续打酱油的时间。