GSoC final evaluation passed
收到Google的邮件,恭喜我通过了GSoC ’11的final evaluation。
其实我觉得我做的东西不是很多,我能做到的很多人也可以做到。我比别人多花了点时间去写application,所以把项目拿下。而平时又多得了Stefano、IanC和Konrad的帮助,才能够把prototype做出来。
虽然prototype出来了,但是能改进的地方还有很多。所有的东西,都写在Xen Wiki上了。希望我以后还有机会继续完善一下吧——为什么说“希望”呢,因为我马上就要job hunting了,做什么方面的工作还不清楚,也没有什么特别的喜好。要是以后没有机会搞虚拟化和Xen了,那么估计做下去的机会不是很多。
Stefano提出希望我去Citrix实习一下,成行的机会估计不大。但是我还是要感谢他一下(虽然他不懂中文,也不大可能看我的blog),感谢他的帮助和提供的各种各样的机会(从LPC到实习到工作机会)。有这样一个mentor兼朋友,还有什么遗憾的呢。
GSoC收获很多,有机会一定要鼓励学弟学妹们参加。技术方面的东西,会再写一个post发在Xen community blog和这里。
惊喜来得太迟,幸福走得太快
好吧,标题党了。
早起查邮件,收到Stefano的来信,大意就是说咱的GSoC做得还不错,想不想到Linux Plumbers Conference 2011上做个talk,旅费Citrix包了。这个会是9月7日在加州Santa Rosa,Citrix的总部搞的。
当时心里挺高兴的,心想我这土鳖也有机会去见见世面了。想到能看到很多大牛心里那个爽啊。
但是一查这个手续,先办护照,再加签证,这一个月的时间不大够啊。问了一下师兄这个事情要怎么办,很麻烦。
要办护照,要先到院里开证明,然后到研究生院开证明,然后到户籍科拿出户口,再然后到汉口的出入境管理处申请。运气好的话,10天搞定,运气不好,打回原籍审查,20天。我在武汉居住了6年,估计要回原籍。最吐血的是今天去研究生院鸟人没一个。明后天必然又不上班。所以户口拿出来还没个定数。
假如我运气够好,10天拿到护照,也已经是8月10日。然后向美国使馆预约面签(这里还得先花1k左右的钱),日前一般预约是一个月才能排到,所以没戏。
假如我运气还够好,申请到紧急签证,满打满算10天,8月20号。然后去广州或者上海面签,旅费至少1.5k。
好吧,得到面签机会了。按照我目前的情况,无工作,无收入证明,还去参加公司举办的技术会议,我要是说我不是过去找工作的,估计签证官也不会信,面完后估计马上拒掉。即使不拒,也可能要经过3到4周的审查期。到时候会都开完了。
所以这么多个步骤,我必须人品大爆发才有可能成行。对于我这个人品一向很差的人来说,mission impossible。
惊喜来得太晚,幸福走得太快。最后决定还是放弃了吧。虽然大家都为我惋惜,但是我觉得以后机会还是会有的,所以心里其实也没有太过郁闷。反而想想得到这个机会也是社区对目前工作的肯定--虽然这些工作还是很粗糙。
不过最后我还是决定把护照先办下来了,以后可能还是用得着的。机会总是给有准备的人的。
Xen虚拟机调试的小技巧
1. xenctx分析上下文
在VM的配置文件中加入
on_reboot="preserve" on_crash="preserve"
等配置。出问题之后可以用xenctx取得VM的上下文。
2. 调试QEMU
在VM配置文件中使用device_model_override指定一个脚本作为DM,这个DM中包括如下的语句
echo $@ > /tmp/qemu-dm sleep 1h
然后再手动用gdb启动QEMU后端。注意xl有一个timeout,所以动作要够快。或者自己把xl的timeout改一下。
无题
近来真是比较少写blog了。项目忙,没有时间学新东西,自然也就没什么好写的了。我的blog大部分情况下只是一个技术方面的笔记本。
GSoC做得差不多了。这个过程中学到了不少的东西,但是也让我觉得自己进入了一个新的瓶颈。在这三个月里面,我大部分时间都是在做工程性的东西,虽然很多时候也比较有成就感,但是却没有以前学着各种各样的新语言、新框架、新技巧那样的满足感。自己进入了一个相对平静的时期,可以用一直以来的积累做点实际点的事情了,这种情况并不坏。但是我的一个标准是不要自我设限。无论我做到什么程度,总会有更多更有趣的事情等待我去发掘。
GSoC快完了,是时间重新审视一下自己以后的路要怎么走了。除了钱之外,GSoC给我比较大的收获就是体验了一把查找问题、了解问题、分析问题到解决问题的过程,也提高了我的交流技巧。说实话,我可能不是一个很好的程序员,我只是希望追求新鲜感、满足感和成就感,而写程序是获得这些感觉的最廉价的方式。
为自己后面的日子再打打计划,一是帮另外一个team搞一下GPU计算,算是给自己开开眼;二是想办法买个Mac,体验一下Lion,也学一下一些APP开发方面的东西,以点带面地了解一下这个生态圈。九月之后就要找工作的,还真没什么想法,顺其自然吧,反正饿不死,呵呵。
Status update of Virtio on Xen project
Hi everybody, it’s midterm of Google Summer of Code now, let me tell you what I’ve done and learned during this period.
I started working on the project in the community bonding period. I took Virtio on Xen HVM as my warming up phase, which would help me understand QEMU and Virtio implementation better. Luckily, it did not require much work to get Virtio work on Xen HVM. At the end of the community bonding period, I wrote a patch to enable MSI injection for HVM guest, which has been applied to the tree.
Then I started to work on Virtio for pure PV. That’s not trivial. I spent lots of time trying to implement a Virtio transport layer with Xenbus, event channel and grant table, which is called virtio_xenbus (corresponding to current Virtio transport layer virtio_pci, which utilizes virtual PCI bus). The new transport layer must retain same behavior of the old one. However, one fundamental difference between evtchn and vpci is that, vpic works in a synchronous way while evtchn is born asynchronous. I got inspired by xen-pcifront and xen-pciback and finally solved this problem. Ah, a working transport layer finally.
But porting Virtio for pure PV needs more than a working transport layer. Vring, which is responsible for storing data, also needs some care. The original implementation uses kmalloc() to allocate the ring. It is OK to use kmalloc to get physical contiguous memory in HVM. However, Xen PV backend needs to access machine contiguous memory. So we have to enable Xen’s software IOTLB and replace kmalloc() with DMA API. Also, the physical address in scatter gather list should be replaced with machine address. So here we get a Vring implementation for pure PV guest.
Is that all? No. One feature we need to disable is the indirect buffer support. Because this feature causes specific driver to allocate buffers with kmalloc() in a much upper level. I tangled with this problem for sometime, finding that I would rather leave those drivers alone than break them. So I chosed to disable this feature at the moment. But this feature is critical to good performance, so I may try to enable it someday.
Good, we finally have our foundation ready! Let’s start to tangle with specific drivers. I chose Virtio net driver as a start. Every driver has its own features. As mentioned above, we should avoid allocating buffer with kmalloc() in driver level, so the CTRL_VQ feature needs to be disabled. In fact, I have no driver features enabled at the moment. What makes me really happy is that Virtio net almost works out of the box. I just want to make sure things work, pre-mature optimization is evil.
What to do next? Virtio blk is my next goal. Hopefully it would not take too long because I’m a bit behind schedule. Then I will start to port SPICE for Xen. Then try to enable more features of Virtio net/blk and gain better performance. That’s the plan. Time is very limited, I feel excited.
I’ve learned a lot during this period. I work together with the community. The interaction works out quite well. I discussed a lot with Xen developers and got a better understanding of Xen and QEMU, as well as Virtio itself.
Last but not least, I want to thank Stefano Stabellini, Ian Campbell, Konrad Wilk and those who helped me through my project in this hot summer. I would not have come so far without your help.
无题
2010年1月18日,我在校内上发了一条状态“我在想,假如现在要我在一年内赚一万五,那我该做点什么呢。”
当时就是想自己怎么样才能把学费和生活费挣回来。现在我已经做到了,还多挣了点。基本奖学金拿到了把学费抵了,Google Summer of Code中期过了,马上有$2250入账。钱微不足道,我对我自己的承诺和要求才是最重要的。
一年多的时间,不长也不短,也没什么好说的。太多的一时冲动,太少的持之以恒,我用我的行动,给自己一个交待。与大家共勉。
无题
一大早来到实验室,在天涯上看那个“人生低谷”的帖子。直接翻到最后一页,看到一位因为意外而高位截瘫的金先生讲述自己的经历,最后还附上了自己的手机号码。
心头一热,给他发了一条“金先生加油”的短信。也许我的问候不能给他带来什么实质性的帮助,但是希望他至少能感受到生活的希望和人间的温暖。
没想到他很快就回了一条“谢谢你”。让我倍感惊讶。
茫茫人海中,两素不相识的人,一瞬间的感动,让我觉得今天又有了意义。生活很操蛋,但是平凡和无奈之中的闪光点,总是那么的让人迷恋。
参加开源项目的一些经验和收获
现在算是正儿八经地参与到开源项目来了。一个多月的适应、学习,现在已经渐渐了解和习惯开源项目的开发模式。
在实验室写代码,是不用考虑太多的,写出的代码能用,能解决问题就好。这样做的原因很多,一是工期有限,二是知识不到位,三是没有支持,种种的限制让人很难写出满意的东西来。代码基本都是不能反馈给上游的。
而真正参加到项目中来,有明确的实现目标,一开始就做好设计——必须要反馈给上游,邮件列表的支持和讨论也很到位,所以做起事情虽然很累,反而还觉得舒服点。
过硬的代码能力是基本的要求,这个自不必多讲。但是编码没有想像中的那么重要,反而是一些设计上的取舍要花费大量的时间讨论。一段代码为什么要这样写不那样写,一个功能为什么要这样设计不那样设计,一个接口为什么要接受这个参数而不接受另外一个,这些讨论上花费的时间是很多的。最后编码的时间相对来说反而占的比例不是很高。一般来说key developer的见解都非常到位,他们可以指出代码和设计中的种种问题,还会考虑到兼容性、扩展性等等问题,和他们进行一番讨论会获益良多。不得不提的是,虽然key developer的意见比较重要,但是他们也不一定都是对的。作为开发者来说,大家完全是平等的,也不需要对他们完全盲从。
要引发高质量的讨论,首先要拿出来的就是patch。开源项目的geek们更喜欢用代码说话。连原型都没有就空谈,一般大家都不会理睬的。Linus说过“Talk is cheap. Show me the code.”大抵就是这个意思。一个patch,可能要根据讨论的结果改好多次。幸运的话,大家表示没意见了,不想再拍砖了,就有机会进仓库了。这个时候应该最有成就感了。
所以总结一下,开源项目的发展就是靠大量的代码加上大量的讨论来推动的。当然,真正趟过这滩水和只看不做,感受还是有所不同的。
再来聊聊工具。
一是版本控制工具。这个是软件开发中的必备品了。现在开源项目越来越流行分布式的版本控制工具了,像Xen就提供了Mercurial和Git的仓库。分布式的好处不言而喻,大家都可以专心于自己的代码,不用受限于中心仓库。我个人比较偏好Git,用熟悉了基本的命令就不会有什么大问题,高级的用法可玩性也很强。
二是编辑器。这个是个人喜好的问题,搞*NIX的人,无非就是Emacs或者Vim。我个人喜欢Emacs,因为它的缩进控制更加智能,多buffer支持也很方便;虽然一直被诟病体积大速度慢,但是这些问题在现在的机器上都不再是问题。Vim来写内核代码还是可以的,但是写Xen的代码有点难受。
三是邮件客户端。收发大量邮件的话,一个趁手的email client必不可少。Gmail的Web GUI用起来方便,但是不合适提交patch。现在我用Evolution和Mutt,其他的一些客户端可以看看Linux内核文档的email-clients.txt。
很久没有写过像样的文章了,凑出这篇防止blog长草。
(完)
配置mutt作为邮件客户端
我一直是使用Gmail的Web GUI来发邮件的,用起来倒也方便。但是现在要提交patch了,还是换一个常见点的客户端吧。在内核的Documentation/email-clients.txt里面列了一些常见的客户端,由于Gmail会自动把tab换成空格、默认format=flowed的设定以及based64编码的问题,它并不合适作为客户端使用。
上午折腾了一下Alpine和Mutt,最后还是选用Mutt了,觉得用起来还不错。把配置文件记一下。
set from = "YOUREMAIL" set realname = "YOURNAME" set imap_user = "YOUREMAIL" set imap_pass = "" set imap_keepalive = 900 set smtp_url = "smtp://YOUREMAIL@smtp.gmail.com:587/" set smtp_pass = "" set folder = "imaps://imap.gmail.com:993" set spoolfile = "+INBOX" set postponed = "+[Gmail]/Drafts" set trash = "imaps://imap.gmail.com/[Gmail]/Trash" set header_cache = ~/.mutt/cache/headers set message_cachedir = ~/.mutt/cache/bodies set certificate_file = ~/.mutt/certificates set move = no #set editor='vim + -c "set textwidth=80" -c "set wrap" -c "set nocp" -c "?^$"' set editor='emacs -nw -q' my_hdr Cc: YOUREMAIL set query_command = "goobook query '%s'" bind editor <Tab> complete-query
光有Mutt还不够,由于我的联系人都在Gmail上面,写邮件的没有没有address book也是很烦人的。我用的是goobook来同步Gmail联系人,在Mutt里面也能调用。配置文件的最后两行就是goobook在Mutt中的配置。
goobook的缺点就是在Mutt中password的提示不大好使,所以要在goobook配置文件中写入password。这不够安全。折中的办法就是,先同步一次,goobook会做好cache,然后再把配置文件中的password去掉。
实习啊实习
刚才接到TX工程师的电话,问起实习的事情,确实是对不起了。
原来863未验收的时候,老板是肯定不会放人的,所以就申请个GSoC玩玩。
后来863有确定的结果了,才考虑是不是去找个实习什么的。因为我知道TX有8月的实习时间,所以打算是先把GSoC做完,然后再去TX。
但是老板突然又说某个项目又来了,又要我带新人,下半年放人的可能性也很小了。
我觉得实习对于一个学习计算机的学生来说实在是太重要了。国内的研究生都是给导师打苦工,还是得毕业的。老板说一个“不”,谁又敢违逆呢。
发完牢骚,继续抠腚去……