qyb的博客

新的连续内存分配器

A reworked contiguous memory allocator
By Jonathan Corbet
June 14, 2011

翻译:王鑫/李潇

关于分配大块儿连续物理内存的问题经常在 LWN 讨论。虚拟内存,由其性质决定了它总会将页面分散到整个系统;内核长时间运行后,可供分配的页面极少会出现一个挨一个的情况。多年来,内核开发者们处理这个问题的方式就是尽可能地避免对大范围连续内存分配的依赖。内核代码很少会试图分配超过两个的连续物理页面。

近来,关于大范围连续内存分配的需求越来越多。需求之一是超大页面数,尤其是transparent huge pages feature。另一个则是老树开新花了:硬件不能执行分散/收集DMA。任何只能对连续物理内存区域做DMA的设备(缺少I/O内存管理单元)都要求一个物理上连续的缓冲区来协同工作。这个要求通常是相对低端(stupid)的硬件的一个标志;你可以祈求这样的硬件随着时间越来越少。而我们所关注的是获得一定的能力的同时仍然保留着连续DMA要求的那些设备。比如,视频采集引擎,它能够采集完全高清的数据,然后在其上进行一系列的转换,但是它仍然会需要一个连续的缓冲区用来保存结果。高清视频的出现加剧了这个问题,那些物理连续的缓冲区现在比原来需要分配得更多,而且更难被分配了。

大概一年前,LWN 就开始关注解决这个问题的连续内存分配补丁。这个补丁集遵循着在启动时保留一大块内存的神圣而又庄严的传统,而这个的唯一目的就是为了满足大范围的分配需求。多年以来,这个技术一直被“bigphysarea”补丁所使用,或者简单地在启动内核时使用一个mem=的参数,用来留下一段未使用的物理内存。Android pmem driver也是从保留区域中分配大块内存的。这个方法当然有效,将近20年的经验足以证明它。保留内存的不利之处则在于它对其他任何想使用它的东西都是无效的;如果设备没用使用这块内存,它就简单地被闲置起来。这种内存的浪费在内核开发者和用户之间变得越来越不得心。

基于上述及更多的原因,CMA补丁从未被加入进去。尽管问题并没有被解决而且也没有开发者在其上工作,最新版的CMA补丁集看起来十分不同,虽然仍然有些问题需要解决,但是看起来本补丁集有较大的机会加入到主线中。

这个CMA分配器仍然能够同保留内存区域的方式一起工作,但那很明显不是想要的操作模式。相反,新的CMA试图维护当需要时能够创建连续大块内存的内存区域。为了那个目的,CMA依靠“migration type”机制被深度构建进内存管理代码中。

在每一个区段内,成块的页面被标记为被那些可移动的或可回收的页面使用。可移动的页面主要是那些缓存页或者匿名内存页,它们通过页表和page cache radix tree来访问。这些页的内容可以随着页表和树的更新而相应地被移动到其它地方。可回收页,则是在需要时返回给内核;它们像inode cache一样保存数据结构。不可移动页通常是那些内核拥有直接指针的页面,比如,通过kmalloc()申请的内存不能在不破坏任何东西的情况下被移动。

内存管理子系统试图将可活动页面保持在一起。如果要通过移动页面来获得掉一整块空闲内存,一个单独的固定页面就可破坏整个过程。通过将可活动页面分组,内核希望能不用遇到这个障碍就释放更多的页面,内存压缩代码目前就是依靠这些可活动页面才能工作。

CMA通过增加一个新的“CMA”迁移类型来延伸这个机制;它很像”可活动“类型,但有几点不一样。“CMA”类型比较棘手,内核不能改变被标志为CMA的页面的迁移类型。内存分配器不会从CMA区域分配固定页面,对于其他任何用途,只有当没有其他选择的时候才会分配CMA页面。如果一切顺利的话,被标志为CMA用途的内存区域只会包含可活动页面,并且有数量可观的空闲页面。

换句话说,被标志为CMA用途的内存对系统其余地方保持可用,只有一条限制,那就是它只包含可活动页面。当驱动需要一片连续的内存时,CMA分配器就在它的一个特定范围挤出足够的页面创建一个适当大小的连续缓冲区。如果在这里面的页面真正是可活动,分配器就提供驱动所需要的缓冲区。当缓冲区不再需要的时候,内存也可以被用作其他用途。

有人可能好奇为什么需要这样的机制,因为内存压缩机制就已经能够给transparent huge page创建大片物理上连续的块。那样的代码是可用的:我自己的 Linux 系统,在写这篇文章前,有大约25%被分配为大页面。这个问题的答案就是DMA缓冲区相对大页面有一些不同的要求。DMA缓冲区可能更大,例如,transparent huge page几乎在所有架构里都是2MB大小,而DMA缓冲区能有10M或者更多。如果底层的硬件足够“奇怪”的话,可能有必要将DMA缓冲区放在特定内存范围内,而CMA开发者 Marek Szyprowski看起来似乎就有这种“奇怪”硬件的需求。最终,2MB的大页面必须也有2MB的对齐,而对DMA缓冲区的对齐要求就宽松的多。CMA分配器能取得被请求数量的内存而不用过度担心严格的对齐要求。

CMA补丁集为建立内存区域和创建特定范围的“上下文”提供了一个函数集。有简单的cm_alloc()和cm_free()函数来获取和释放缓冲区。虽然如此,但预期设备驱动将不会直接调用CMA,相反,对CMA的意识将被固定在DMA支持函数里。当驱动调用函数如dma_alloc_coherent()时,CMA将自动被使用来满足要求。在大多数情况下,它应该能“正常工作”。

另外一个CMA的关注点是关于特定区域是如何设置的。目前的补丁期望在系统的board file里面做一些特殊的调用。这是一个很ARM式的方法。接下来的目的是去掉board file,这样就会发现其他东西。正如 Arnd Bergmann所指出的那样,将该信息移到设备树也不是一个选择。这其实是一个策略决策。Arnd正努力争取一些能在大部分系统工作的合理默认设置,其它一些少数系统将在后续被加进来。

最终的结果可能是,patch set至少得经过一个迭代才能进入主线。但CMA满足了以前从未遇到过的一个需求。这部分代码有潜在的可能性能够在减小对其余系统的影响的同时,让分配物理地址连续的内存变得更加可靠。看起来它似乎值得拥有。

Topic: sohulinux

PHP 的各个实现

挖个坑,备忘

  • Zend, 这个就不多说了
  • Quercus,原本是 resin 3 的一个特性,现在好似是作为一个独立项目运行... 看论坛上有人已经把它运行在 jetty 上了
  • P8,又一个运行在 JVM 上的 PHP 引擎,是一个 IBM 的项目,相比较 Quercus 而言,传说它比较好的支持了 PHP C 扩展。但这个项目的页面严重过时。另外它不是开源的
  • Phalanger,PHP on .NET,看起来正在积极的开发中,而且还有商业支持
  • PIPP,运行在 Parrot 上的 PHP,这个项目看起来已经死了,而且 Parrot 离被证明还很遥远
  • PHP 编译器,这个概念和前面的 Zend/JVM/Parrot 不太一样,着眼于直接编译出可执行代码,脱离 VM
    1. HipHop,地球人都知道
    2. phc
    3. Roadsend的Raven/rphp,基于 llvm
Topic: 技术

都不容易

暑假过了一个月,达达的心前所无比的野。不爱写作业,想尽办法偷懒

于是最近有那么段时间,几乎每天她妈都和达达发生剧烈冲突

白天我们上班后,奶奶和达达聊天

奶奶:......你说你妈妈容易吗?

达达:那我容易吗?

奶奶:你有什么不容易的

达达:我得让大人高兴

====

是啊,太不容易了

Topic: dada

blk-throttle: Throttle buffered WRITE in balance_dirty_pages()

http://lwn.net/Articles/446121/
From: Vivek Goyal

翻译:王鑫

Hi,

我一直在尝试寻找关于 blog IO controller cgroups 的以下两个问题的解决办法:
  • IO controller 的当前 throttling 逻辑无法限制buffered WRITES。它的实现是在设备上限制所有的 WRITEs,但到那时,buffered WRITE 已经丢失了提交者的上下文,并且大多数的IO进入到设备上的 flusher 线程的上下文中。因此当前并不支持对buffered write的限制。

  • 所有的WRITEs都在设备级上进行限制,这就很容易导致文件系统的串行。

举一个简单的例子,如果一个进程往cache中写入一些页面,然后运行fsync(),这个时候进程才开始被 throttled ,于是它会锁定整个文件系统。在ext4中,我注意到甚至一个简单的“ls”都不会再继续进行了。这个原因可以归结为文件系统并不关注cgroups和以顺序模式的文件系统日志这件导致串行这件事。

因此即使我们获得提交者的cgroup信息到设备并且在设备那里做限制,它仍然会导致文件系统的串行,这并不是一个好主意。

因此怎样去修正这个问题呢?貌似有以下两种办法:
  • 仍然在设备级上去做限制。让文件系统关注cgroups使得多个事务可以以并行的方式(每一个cgroup)同时前进,并且在cgroups之间并不存在那些导致文件系统串行的共享资源。

  • 当WRITEs进入cache时进行限制而不是直到设备才开始 throttle。比如类似balance_dirty_pages()这样的函数。直接IO仍然是在设备级上进行限制的。按照这种方式,关于限制,我们可以避免文件系统日志导致串行

但是这个方法的很重要的一点就是我们控制进入cache的IO速率而不是设备上的IO速率。按照那样的方法则可能会发生flusher过后会提交许多WRITEs到设备,并且我们将会在终端节点上看到许多周期性的IO spike。

因此这个方法可能会有一点帮助,但远远不是一个完整的解决方案。它主要能够帮助那些拥有许多IO资源和有效IO带宽但是希望控制资源分配给低优先级的客户。

方法1看起来很难去修正。在往文件系统写东西的时候,文件系统从不关注cgroups。因此我很怀疑我能够说服文件系统的设计者来改动基础的文件系统和日志记录部分的代码来使得文件系统关注cgroup。

因此我在本系列补丁中仅实现了方法2。方法2并不是一个最好的解决方案,但是它至少给了我们一些在buffered write上的控制能力,这总比一点都不给要好。Andrea Righi也曾经做过一个类似的补丁:
https://lkml.org/lkml/2011/2/28/115

这个补丁是关于bio和任务限制之间的交互的,因此我重做了它。

设计

IO控制器已经有跟踪一个group的IO速率的能力,并且当group超过一定速率时会把bio插入内部队列,并在随后将这些bio分发出去。

本补丁也引入了balance_dirty_pages_ratelimited_nr()中限制dirtying task的能力。现在所有除直接WRITES外的所有WRITEs在设备级上都不会受限制。如果一个dirtying task超过其配置的速率,它将被放入等待队列,当它可以dirty更多页面的时候才被唤醒。

没有新的接口被引入,直接IO和buffered IO都是使用通用IO速率限制。

How To

- Create a cgroup and limit it to 1MB/s for writes.

echo "8:16 1024000" > /cgroup/blk/test1/blkio.throttle.write_bps_device

- Launch dd thread in the cgroup

dd if=/dev/zero of=zerofile bs=4K count=1K

1024+0 records in
1024+0 records out
4194304 bytes (4.2 MB) copied, 4.00428 s, 1.0 MB/s

Any feedback is welcome.

Thanks

Vivek

Topic: sohulinux

Haraka - a Node.js Mail Server

https://github.com/baudehlo/Haraka#readme

看作者的自述:Haraka is a project started by Matt Sergeant, a 10 year veteran of the email and anti-spam world. Previous projects have been the project leader for SpamAssassin and a hacker on Qpsmtpd, a perl based mail server which is quite similar to Haraka (but not as fast due to perl being slower than Javascript).

貌似不是一个蛋疼的项目... 刚刚发布 0.6.0 版本

Why Use Haraka?

Haraka's primary purpose is to provide you with a much easier to extend mail server than most available SMTP servers out there such as Postfix, Exim or Microsoft Exchange, yet while still running those systems for their excellent ability to deliver mail to users.

postfix 一直没有增加 libevent 的支持,对一个这么活跃的项目,以及这么被广泛使用的服务来说有点异乎寻常。从理论上来说,一个邮件系统的I/O能力是被其磁盘信件队列的I/O能力限制住了,所以网络I/O不追求高并发也可以理解。

但是考虑到垃圾邮件,潜在的DDoS攻击,在 postfix 之前弄一个这玩意确实值得考虑。

以前曾经想过用 twisted 做类似的东东,现在看来又多了一个新选择。

最后要说的是,node/v8 的 gc 确实很蛋疼

Phantom: 去中心化的匿名网络

By Jake Edge
June 8, 2011
Phantom: Decentralized anonymous networking

翻译:曾怀东/朱翊然

互联网上的匿名是一个值得关注的问题,为此,几种不同的解决方案已经实施(如Tor,Freenet)。创建这样的网络是一个蛮有意思的尝试,这种网络也在避免各种互联网活动监控方面大显身手。而在相对自由的国家的人可能会发现它很有用,可以用来避免他们的ISP和政府的监督,在更专制政权下生活的社会活动家可能会发现能利用它获得更多,在某些情况下,甚至是生存或死亡的区别。幻影( Phantom )是另一个具有很多有趣熟悉的提供互联网匿名性的机制。

Phantom 协议是由 Magnus Bråding 在 2008 年的 DEFCON16 引入的(幻灯片[PPT]),旨在提供去中心化的匿名性。其思想是不存在会由于关闭或攻击导致Phantom无法使用的中心薄弱点。不像Tor和其他协议,Phantom要求端到端的加密,所以不存在“exit node”的问题。该问题会导致泄密或恶意参与者窃听通讯。另外,Phantom是为了高性能设计的,所以可以支持大数据量的网络传输。

Phantom最有趣的特性之一是它不需要改变现存的internet应用。对于网络浏览器还是其他应用,似乎使用的还是一个标准的 IP 地址和外界通信。事实上,这些地址是由Phantom软件处理的匿名协议(AP)地址。 Phantom做出的假设之一是IP地址能够映射到真实生活身份(这是一个非常有意义的假设),所以它的最主要成果之一就是保证这些信息不会被泄漏。

Internet被用来承载所有的Phantom流量,这些流量是internet的一部分。提供匿名访问服务(例如web server)的服务提供商必须在Phantom网络内部注册。很明显,从去中心化的角度来看,注册是一个问题,但是Phantom使用了分布式哈希表(DHT)来保存信息。现在已经有很多大规模部署的DHT,例如eMule的Kademlia。

DHT被当作“网络数据库”并且包含了两个独立的表。一个表是当前已经连接入 Phantom 的节点的 IP 地址,端口和其它属性,另一个表包含连接入 Phantom 和注册入的节点 AP 地址和属性。显然,为了保证匿名性,这两个表没有直接关联。想要获得一份DHT的拷贝,一个新节点只需要同一个已经存在的节点连接并加入这个分布式数据库就可以。初始可用的IP地址列表可能源于各种途径:网址,邮箱,甚至是纸片。只要列表中有一个的节点存活,新的节点就能够加入。

希望在网络上通信的客户端必须建立自己的退出节点(exit node)。它通过选择网络中一定数量的其他节点建立路由路径,最后一个节点即为退出节点。不像Tor,Phantom中没有已有的退出节点集合,因为在Phantom中任何一个在网络中的系统都可以作为退出节点。还有一点与Tor的区别是,endpoint选择自己的路由路径,而不是由网络来做这些决策。Phantom design white paper [PDF]对产生路由路径的协议进行了详细的说明。路径的每一步都用SSL进行了加密,该文章还描述了生成退出节点的复杂过程的细节。

同样,网络上的任何服务需要为每一个“入口节点”创建一条路由路径。在某些情况下,服务本身并不需要匿名,只是为匿名用户提供访问,这时候入口节点可能是该服务本身。在任何情况下,服务都要利用入口节点的IP地址在DHT注册他们的AP-to-IP的地址映射。对那些希望保持匿名的服务,他们会隐藏在其入口节点的整条路径的后面。

建立exit node和entry node后,节点就依路径创建路由隧道。这些隧道在端点的控制下,而不是网络或者任何的中间节点(包括入口/出口节点)。建立一个连接包括把这两条路由隧道连接在一起,以及连接客户的出口节点和服务的入口节点。隧道连接是双向的,使用了防备中间人窃听的加密技术

该系统的重要特征之一是,节点不知道他们对话的对象是端点或者仅仅是路由路径上另外一个节点。路由路径可以是无限长,甚至可以根据需要再次链接起来去提供进一步的隔离。

虽然整个计划看起来恶魔般的复杂,它已经作为Johannes Schlumberger的一部分硕士学位的工作实现了。也许令人惊讶,性能被描绘为还不错的:“在多跳路的Phantom路由隧道上最大达到100Mb/s的数据传输速度,因此加密的开销似乎并不太重要”。该代码可以在Hacktiyismo 增强源软件许可协议(HESSLA)下使用,这似乎是带有一些额外“政治”目标的GPL-inspired 许可证。根据自述,用一个tun的虚拟网络设备实施,而且可能需要相当复杂的设置。

总体而言,Phantom看起来很有趣。像Tor以及其他的技术,为了真正的使用,需要相当多数量的节点参与进来。Tor的一个最大的障碍在于出口节点因为它们发出的通信习惯获得指责。这些通信不能进一步的追踪回出口节点(至少希望如此),任何犯罪的或者恶意的通信是同任何跑在Tor节点上的用户隔离开的。由于在Phantom上的服务支持匿名访问,这样问题可能比较少。这也可能导致采用Phantom的可能性较小。

虽然电子前沿基金会最近一直在推动Tor的使用,广泛的使用Phantom(或者任何其他的匿名网络协议)还是有点困难的。有些方案显然是必要的,但是目前为止,后勤和法律的障碍似乎是许多人无法克服的。不幸的是,匿名网络可能会陷入“直到太晚的时候才开始成立”的困境。但是,很高兴看到人们仍在思考并且一直在为这个问题工作。

Topic: sohulinux

Android, forking, and control

By Jonathan Corbet
June 6, 2011
http://lwn.net/Articles/446297/

翻译:马少兵/刘晓佳/李潇

关于 Android 和 Linux 主线开发的关系已经被谈论很久了。在日本的 LinuxCon,James Bottomley 又就此阐述了很多观点。他说,从两个项目之间缺乏联系和交流可以学到很多教训,如果社区能关注这些往事,未来我们应该能做得更好

James 首先认可了 Android,这是最为成功的 Linux 发行版。风头超过所有的 Linux 桌面发行,以及服务器安装。Android 的成功是有目共睹的,但它同时也是:
  • Forking the kernel

  • 重写了 C 库和工具链

  • 开发了一个 Java 应用框架(JVM定制)

  • 项目启动的时候,对 GPL 极为排斥

换句话说,Android 是一个不同社区合作的典型代表。它们做了无数社区觉得不该做的事情,但是最后成功。尽管我们觉得 Android 的开发团队需要有所改变,但它的成功也说明,社区也需要有所改变。也许社区需要重新权衡代码质量以及市场成功,社区是否需要更加面向商业一些??

一个最大的争论就是 forking,不仅仅是 kernel,Android 从零编写了整套用户空间,社区对此特别愤怒。但我们得理解这个事情的历史过程。最开始 Android 是期望它的变更能被主线采纳的,但在开始实现系统的过程中,时间压力很大,不得不尽早往前赶进度。我们都知道关于内核社区的补丁复查和接纳过程有很多议论,总之Google 无法等待社区接受后再发行它的 Android。但也许,除了 forking 内核外我们还能有其它选择

“难道内核分支是一种错误吗?”,在某种意义上来说,James说,那不是错误:毕竟有 GPL 担保。分支有时候是必须的,如果android系统不能被应用,原来那种正确也是无意义的。在此特殊情况下,如果不采用分支,android系统的商业的开发与应用将会处于一个艰难的时刻,很难实现其目标(关于电源管理以及其他)。最终将会导致android代码被推迟,而这一切,会使目前市场缺少很多产品,或许因为错过市场时机项目就悲剧了。分支,换句话来说,也是一个好的事情——相比较于内核社区的固定流程,不同的团队可以做更多的事情

James问到,分支化等同于分裂化吗?这是个很重要的问题:上世纪九十年代分裂化几乎杀死了Unix的市场。他声称失败的分支化并不会分裂Linux社团;相反,他们只是简简单单的消失而已。那些合并后回到父工程的分支化并不代表着分裂化;他们将代码和开发者带回了原始的工程。真正有害的分支化,是那些取得成功并带走了一部分社团的分支,它们不会再回到父工程了。从这个角度讲,很有必要让社团帮助分支合并回来。

除了分支化了内核,Android的开发者,曾经认为GPL对于商业化并无益处。该工程最初避免任何GPL-licenced的代码;本来计划是写一个全新的内核。最后,由于某些原因,采用了GPL-licenced的Linux内核;同时还保留一些其他GPL-licenced的组件。所以,James说,我们应该谢谢Andy Rubin – 是他最初讨厌从GPL来的代码 – 最后决定性的证明了一款含有GPL-licensed代码的手机在市场上是可以成功的。结果就是下游销售商不用关心他们设备里代码的许可证;只需要关注清晰一致即可。

关于Android特别应用框架呢?James说基于Java的应用程序框架是Android系统最大的创新;它将平台细节抽离出来,使得应用层尽可能地远离了内核。该框架限制了应用程序可用的API,对应用所能做的以更强的控制。给定该结构后,貌似重写C库是一件完全没必要的事情;在该框架下没有人会尝试直接使用C库的。

所以,Android并没有做错一切。但是还是犯了一些错误:从James角度看,最大的错误就在于一开始它缺乏支持SyncML的日历应用。这使得Android很难吸引商业人士。黑莓成功的关键之处就是它优秀的日历。摩托罗拉看到了该问题,并为Droid系列手机实现了它自己专有的SyncML日历系统;这实际上使得事情更糟了,因为商业人士购买Android手机的出发点就变成了它能够支持日历系统。如果除了Droid之外别无他选,就会非常令人失望,最终转投iPhone平台。直到一年后,2.1版本,Android才支持SyncML,也是从零开始重头编写。

Android的另外一个问题是它的“walled garden”开发手段。Android本来是个开源工程,但是谷歌却对基本的发行维持总控制;在谷歌把代码扔出墙外前没有别人可以看到代码。没有一个变化是来自第三方提供的,所以没有社团来维护该代码,没有共享的创新。举个例子,如果愿意接受来自外界的帮助的话也许早就解决了日历的问题了。谷歌对代码的总控制是因为需要给工程以市场焦点。这是达到市场统治的先决条件,但是对社团来说并无益处,并且迫使谷歌重复了许多已有的创新。

另一个大问题是来自甲骨文的起诉。该控告基于Android对Java语言的重写,这完全是因为 Android 害怕GPL所至。要是Android建立在甲骨文的GPL-licensed的Java代码基础上,应该不会有法律问题;按照GPL暗示的专利许可,Google本该被保护。如果甲骨文赢得这场官司,重写Java将意味着在许可证逃避方面极其昂贵的实践。令人悲痛的是该license是完全无关紧要的:Java runtime API 将应用同 GPL 隔离

学习到的教训

我们能从这些里面学到什么?James重申,只有最终合并回去,创建分支才是一件好事。虽然做出了大量的努力,但Android分支还未合并回去。也不清楚Android开发者是否已经开始实施内核社区提出的解决方案。他说,也说我们需要想出一种方法让合并更容易。尤其是在创建的分支壮大的情况下,社区应该有一种更好的方法来处理当前这个有可能在审查中陷入困境的过程。

创建分支的项目还要考虑一下这些过程。子分支开发团队容易产生“非我发明”的心态(指反感或拒绝使用不是自己发明的技术),这反而会导致他们不愿意展示自己的最终代码。把自己都知道贴出来就要被社区严厉批评的代码贴出来一点都不有趣。子分支发展越久,这种状况越糟糕;修正基础的设计错误(正如社区眼里wakelocks的作用)就会越困难。要防止这个问题就要求分支团队更加包容,更频繁的贴出他们的代码,并寻求社区的建议—即使他们并不打算接受这些建议。打开围墙并让双方交流各自的想法是很重要的。

James谈到了“授权恐惧”,说GPL是我们特别感到FUD的地方。我们在社区里的一些关于“授权”的讨论在行业界人士看来就像是一个令人害怕的问题。而社区里关于这个话题的讨论不像那样激烈,这反而大有好处。对GPL的恐惧是由外界的兴趣驱动的,但我们趋向于让事情简单。社区应当更加前瞻性的去缓和这种恐惧;将Android看作在GPL授权下如何运转的一个范例,这是缓和恐惧的一种可能性。Linux基金会做过一些这样的工作,但是James觉得社区该出手帮助。他说,GPL比起那些最具商业性的授权,遵守起来容易得多,这是我们需要更加明白的一点。

我们应该设计更加“bright line”的系统,这会让GPL问题变得更加明确。内核用户空间ABI就是这样的一个系统;开发者知道用户空间代码被认为不会被内核的 GPL 所污染。让这个界限更容易的理解,会有助于减少对GPL的恐惧。

社区应该在提倡和发展多样性,鼓励创建分支(这会创造更多显著地成就)并帮助他们合并回去。James说,如今内核最多能得一个“C”的成绩。我们只从看起来跟我们相似的人那里接受代码,Android的合并尝试比原本想象的更加痛苦。

企业们应当靠获得社区拥护而不是绝对所有权来控制代码。Linus Torvalds就是一个例子;他有许多控制权,但那是因为社区信任他能做正确的决定。一般来说,如果社区信任你,它就会交出大量的控制权;那就是为什么仁慈的独裁者模型如此平常的原因了。另一方面,那些试图通过设置开发壁垒或者通过要求贡献者转让版权来声明控制权的企业们与社区相处得更加困难。

James说,总之,Android对任何参与进来的人而言都是一个惨败;我们都需要想清楚怎么去做的更好。我们需要找出更好的鼓励和管理分支并减轻授权恐惧的方法。创建分支的项目从一开始就应该仔细考虑合并回去的事情。这样,那些商业成功的项目(如Android)能同样是社区的成功

Topic: sohulinux

Webian: 基于 Mozilla 技术的 Web 桌面

June 8, 2011
This article was contributed by Nathan Willis
Webian: A Mozilla-based web desktop

翻译:李凯/林业

第一眼看到的时候像一个打字错误,但是webian的确是一个实验性的,开源的利用Mozilla和gecko做为它的内核的桌面环境。开发者Ben Francis上周第一次公开发布它,立即产生了与Google的ChromeOS项目的对比,并且引起了Mozilla将会激怒搜索巨人并试图进入其领域的猜想。但是Webian是Francis的私人项目,并没有被Mozilla认可或赞助。但是,它的确展示了一些浏览器制造商感兴趣想要宣扬的关键概念,那就是Mozilla的HTML5和开源的web标准将会是未来开发平台的信念。

实质上,Webian是一个在Mozilla的Chromeless工具包之上写的一个应用程序的小集合,这个 Chromeless 和 Google 的浏览器无关,Mozilla 用Chrome来称呼自己的用户界面层已经很长时间了(早在 Google 发布浏览器之前)。Webian 去除了整个的浏览器界面(包括firefox使用的XUL和XPCOM)并且用一个HTML,CSS和Javascript写出的层取代了它。Chromeless是一个Mozilla的几年前的Prism项目的演变,现在的版本和Firefox4有相同的 runtime。利用Javascript APIs calling浏览器的功能。Mozilla实验室已经发布了其他的基于Chromeless的项目,包括基本浏览器和从一个SkyWriter collaborative editor 取得的代码编辑工具。

0.1 release

上周,Mozilla实验室为 Francis的0.1版本webian shell——Weibian的简单桌面——发布,刊发了一篇 guest blog post。这个shell是一个集成的且不需要其它任何窗口管理和桌面装饰的网页浏览器。它在全屏模式下运行,提供了一个主界面和在底部的一排标签以及一个在顶部的URL-and-title-bar。Francis从2009年就开始活跃的开发Webian,基于他在大学期间所编制的设计概念。其设计概念文档阐述了比该项目wiki更多的关于范围和架构选择方面的细节:浏览器是唯一的应用程序,它包含了简装的工具去访问其它的功能(比如硬件和设置),而且只有从几年前的thick client桌面metaphor很小的借鉴。

0.1发布版本包括源代码,以及Linux,Windows和Mac OS X下的2进制格式。并不是所有的设计文档中描述的功能都已被实现;Webian Shell在一个全屏浏览器中工作,但是主界面目前只有时钟和一个关机按钮。并且仍然没有Francis的"stripe" UI元素:通知和查询水平的互相堆叠,将浏览器窗口内容往下压而不是放在最顶层。根据设计文档,其目标是在可能的地方移除2.5 Dimensions 概念并且真正的以2D的方式对待2D。

值得注意的是,设计的Webian Shell在你的已存在操作系统之上运行,虽然它的确是全屏运行的(对Linux来说,意味着它在X之上运行,并且不与窗口管理组件交互),它并不像ChromeOS一样是一个完整的OS,并且,如今,你可以把它作为浏览器和作为最终桌面系统的UI demo来运行,但并不是你当前环境的完全取代。作为一个浏览器,它运行的非常快,对我来说比Firefox 4更快。一方面是由于不载入Firefox插件,摆脱Firefox自身的界面似乎提供了一个值得注意的速度提升(安装了plug-ins,必须注意在Chromeless和Webian Shell中运行)。

Webian继承了来自于Chromeless的安全模式。最新的版本在out-of-process plugins和out-of-process tabs方面有所改进。所以一个页面崩溃不会造成整个程序崩溃。但是,Flash和Java在一个页面的中断会迫使用户为了重启一个崩溃的plug-in而重新载入其它页面。隐私管理是另外的一个问题,Chromeless和Webian可以像Firefox那样技术性的维护单独用户的数据,但是管理数据的界面在Webian Shell里尚没有实现。

令人不爽的是,现在一些high-profile Google web服务并不在Webian Shell里运行,这是由于一个Chromeless的攻击合并了X-Frame-Options HTTP header的页面的上游漏洞引起的。当然这个世界上有许多的web应用,所以使用(测试)Webian Shell进行日常浏览没啥问题。http://lwn.net/Articles/446614/

长期的计划涉及了在Shell之外的单独的应用程序。但是,这个项目是基于W3C小部件规范工作在主界面的桌面小部件之上的,但是,一个实现了标记和组织内容的本地接口的照片管理应用,仍然是一个连接的远程的,基于web的发布与存储的服务。这个选择最初是难以习惯的:类似ChromeOS的方法宁愿去写一个完整的服务器投递照片管理工具胜过去利用浏览器来投递它。

尽管Webian是作为浏览器和(潜在的)桌面环境,其范围非常有限,但还是不可避免的要和ChromeOS进行比较。Fancis发在Mozilla Labs上的帖子,其导致一些网络媒体把Webian描述成Mozilla项目----Francis很快把这个错误改正过来了。他曾经得到过Chromeless团队的帮助(包括运行在X-Frame-Options上的bug),但是这个项目没有加入到Mozilla里面去,他也不是里面的员工。

这个项目仍然紧密的和Mozilla的许多目标保持一致。Mozilla已经宣布终止对Gecko嵌入API的支持,它作为Chromeless的一个独立展示案例,为了保持平衡而扮演着越来越重要的角色(承担更多的任务)。

Mozilla也在抓紧推行前端的“可安装web应用”(通过apps.mozillalabs.com网站)。Firefox通过扩展来提供应用程序支持,嵌入瘦客户端桌面系统(比如Webian)的原生支持可以说是对其价值的更好的展示。Google Chrome团队已经独立开发出可安装的网络应用程序架构,但是给浏览器处理的是一个相似的但是并不兼容的表单格式....Francis说两个他都将支持,虽然他更倾向于把这两种统一为一种格式。

在Webian设计文档中讨论的另一个特点运行在Shell URL bar/text-line 部件里的命令行接口:支持搜索查询是其首要任务,但是算法,应用程序启动以及自然语言的问题也已经在邮件列表以及论坛里讨论过了。正如一些Webian社区的人指出的那样,这项功能已经在Mozilla Ubiquity中实现,所以在这里再一次与另一个基于Mozilla的项目进行交互,这看起来是件很自然的事情。

但是摆在chrome系统面前最直接的挑战是,Webian需要绑定底层OS。但此刻,Chromeless并没有与下层系统硬件建立链接,它必须提供Webian Shell计划中描述的硬件控制(尽管Mozilla' Rainbow在此领域还没有显示出一点“生命”的迹象)。因此,如果想要发展成为完全用操作系统替代的模式,Webian就必须要几乎完全舍弃跨平台兼容性的问题,选择一个单一的stack,建立于此。

显然Linux是首选,Francis在一封电子邮件中委婉地指出了这一未来方向。“Webian将有多少跨平台的功能在此刻尚属未知,优先考虑的事情将会是建立基于Linux的版本,不过如果能够实现某些程度上跨平台性能的话,那将会是很棒的。”

当然,完全基于Webian的OS offering在与ChromeOS竞争中,其是否胜利是完全不同的问题。Francis与其他编者不会将Webian看作Google与ChromeOS之间那样的商业关系。一些编者在邮件列表中争论到,Webian的非商业策略使它在使用者眼中更加可信,他们对Google的用户跟踪活动表示担心,或者对ChromeOS缺乏透明度及建立精英管理层的过程表示不满。

毫无疑问,对于很多自由软件的提倡者而言,其立场意义重大,但是它没有以基于Linux的内核来建立Webian并以可安装映像的方式将其提供出来。邮件列表中另外一种普遍的争论为,同Mozilla一样,Webian专注于对开放标准的完全支持。因此,它将使得HTML5 video有免费回放格式的特点,而非只支持收费的格式。

坦白地讲,那种思考无论如何带着高度的猜测性,并有可能此时此刻影响到Webian Shell的展示。此刻,它展示的是无Chrome的Mozilla——这个主意是浏览器开发商争取了很多年还没有被展示的产品。桌面是静止的而网络是新的交换平台这一概念在舆论界得到了相当大的回应,此概念常常包括了这种理念:当桌面战争持续不断时,开放资源群体落后于时代。但是迄今为止,ChromeOS是仅有的以终端使用者为目标试图建立“网页桌面”的系统,它与Google提供网页服务的所有权紧紧地缠绕在一起。

因此,Webian是值得密切关注的,因为如果没有其他的原因,将要提出的“web桌面”的构想,在没有Google的环境中试验。就我个人而言,我真心希望此过程继续下去,并同时加速发展一些Mozilla的“试验环境”项目。这些可以作为web服务方面,自由软件群体很有价值的动力。但如果没有其他因素,一旦所有chrome都去除掉,将会显示出基于Mozilla的浏览器有多么小巧和快速。

Topic: sohulinux
订阅 RSS - qyb的博客