乌托邦计划
在过去的十年中,Linux 爱好者们一直在滔滔不绝地谈论桌面 Linux 的内在伟大和即将到来的成功。我们的内核非常强大!我们的应用程序具有无限的可配置性!今年是桌面 Linux 年!谁还会使用 Microsoft Windows?这些说法以及类似的说法——尤其是在 20 世纪提出的那些——现在看来是如此的陈词滥调。并不是说我自诩为正确——哦不,我和其他任何人一样大肆赞扬。我也曾是一个皈依者。
至少,在我意识到 Linux 中的硬件支持非常糟糕之前是这样的。就像一副纸牌一样,我对桌面 Linux 的美好愿景崩溃了,从光彩夺目 180 度转变为可怕。我心碎了,每天晚上哭着入睡,并开始了一种莫名其妙的只吃奶酪和布丁的饮食。
但这并没有持续多久。有一天,Linux 社区决定为此做点什么。我们制定了一项计划,不仅要达到与其他桌面操作系统的功能对等,还要超越它们。在过去的一年半里,硬件支持取得了长足的进步。这就是关于进步了多少的故事。
在 Mac 上安装新的硬件外围设备的步骤可能如下所示
步骤 1:将硬件插入 Mac。
步骤 2:开始使用硬件。
我们大多数人甚至不会将这两项列为步骤。第一项是物理上的必需品;第二项是最初和最终的目标。在步骤一和步骤二之间,遗失了 39 个其他步骤,对吗?内核模块?配置文件?重启?对 sed 和 awk 的广泛掌握?
在 Linux 历史上的某个时刻,对新硬件的支持很容易需要编译一个新的内核模块,成为 root 用户,编辑配置文件,加载所述模块,检查 dmesg,咒骂,删除模块,拔下硬件,重新插入硬件,重新加载模块等等。
被遗忘的,也许是被对自由软件的热爱和自己动手的活力所掩盖的,是东西应该能正常工作的观念。尽管编写我自己的内核模块可能很有趣——我在这里宽松地使用了“有趣”这个词——但有时我只是想插入我的相机,获取我的照片并完成任务。
在 2003 年末,Linux 系统已经为桌面硬件管理新架构的出现做好了充分准备。2.6 Linux 内核已经发布并迅速获得采用。它带来了许多其他新特性和改进,包括一种用于处理设备驱动程序的新机制,称为设备模型。设备模型首次允许内核构建其支持的设备的内存树。例如,我的鼠标和键盘都连接到我的 USB 集线器,该集线器连接到我的第三个 USB 端口,该端口位于我的第一个 PCI 总线上。如此丰富的层次结构为内核提供了各种各样的机会。然而,其中最有希望的一个是 sysfs。
sysfs 将此设备层次结构导出为文件系统。一个目录列出了系统上的所有总线。对于每个总线,另一个目录列出了给定总线上的所有设备。给定设备的文件可以链接到关联的模块。因此,遍历 sysfs 树将允许用户空间构建系统物理设备层次结构的完整图景,正如内核所看到的那样。
仅此一项就非常有用。但另一个内核功能 hotplug 进一步拓宽了视野。内核的 hotplug 基础设施在设备添加到系统或从系统中移除时通知用户空间。这允许应用程序实时了解 sysfs 的更改。它也允许创建 udev。
udev 是 devfs 的用户空间实现——devfs 是一种自动化的、动态的设备节点管理器。udev 不是一次性静态创建 /dev,而是响应系统可用的确切硬件,动态更新 /dev。然而,更重要的是,udev 将设备的内部知识及其设备节点置于用户空间中。hotplug、sysfs 和 udev 一起允许用户空间完全了解系统的硬件。
现在用户空间需要抓住这个机会。
那是 2003 年。那年夏天,我参加了渥太华 Linux 研讨会上由 Robert Sanford Havoc Pennington 主持的关于改进 Linux 桌面的 BOF 会议。在 BOF 会议上,Havoc 引用了他的题为“让硬件正常工作”的白皮书,其中他揭示了 Linux 桌面硬件管理的乌托邦愿景。我被吸引了,并做了笔记——见图 1。
我们最终向小组介绍了这个乌托邦,并讨论了可能的实现方案。BOF 会议在没有得到观众太多关注的情况下结束了,但 Havoc 和我 对情况和潜在的解决方案有了坚定的理解。其他责任阻止了我立即根据我的粗略草图采取行动,因此它们闲置在我的笔记本页面上。
两件事发生了,在没有我立即意识到的情况下,使这些页面变得生动起来。
首先,当时住在哥本哈根的 David Zeuthen 决定将 Havoc 的文档变为现实,开始 HAL 项目。HAL,最初是硬件抽象层,但现在不是任何东西的抽象,是一个系统级守护程序,它将 hotplug、sysfs 和 udev 捆绑在一起,以便为 Linux 系统提供一个单一的、全面的硬件视图,可以通过标准化接口访问。HAL 使应用程序可以发出“给我所有输入设备的设备节点”或询问“这台计算机是否连接了摄像头?”之类的请求。有了 HAL,曾经需要数百行黑科技,在硬编码的设备节点上操作,并深入了解 Linux 内部原理的东西,现在变成了一个简单的、优雅的 HAL 请求。实际上,David 的 HAL 为 Linux 带来了 21 世纪的硬件基础设施。
第二个具有颠覆性的事件发生在同年 12 月,当时我接受了 Ximian(最近被 Novell 收购)的工作,担任专门从事桌面的内核黑客。我的首要任务是弄清楚硬件情况。我与一位同事,来自俄亥俄州的无与伦比的 Joey Shaw 合作,我们坐下来讨论了我们对硬件管理的乌托邦愿景。
Joey 和我都认识到 2.6 Linux 内核、sysfs、hotplug、udev 以及现在的 HAL 提供的强大基础。我们得出结论,缺失的部分是 HAL 之上的层。我们已经有了一个丰富的基础设施;我们只是需要用它做点什么。
HAL 使用当时新兴但始终很有前景的项目 D-BUS 作为其通信机制。一方面,D-BUS 是一个普通的进程间通信 (IPC) 系统——类似于 CORBA,但更容易使用。另一方面,D-BUS 引入了系统范围消息总线的概念。除了每个用户的进程到进程通信之外,D-BUS 还允许 Linux 系统中的组件发送信号,宣布事件或向所有关心的人提供信息。信号可以宣布何时获得网络连接或笔记本电脑电池电量何时不足。堆栈中更高层的感兴趣的应用程序可以监听这些信号,并在收到信号后做出反应。
我们的计划实际上是用 D-BUS 信号淹没系统。让 HAL 和 Linux 系统的其他较低级别组件生成大量有用的信号,并让更高级别的组件响应、演变和反应。实际上,使 Linux 系统更加动态,并最终使硬件正常工作。
Joey 和我决定创建一个总括项目——一个元项目。该计划旨在刺激开发 HAL 感知的应用程序,这些应用程序可以在桌面上提供硬件策略。用户永远不需要配置硬件。它应该在用户插入硬件时自动发生。用户(甚至程序员)永远不必摆弄设备节点和深奥的设置。HAL 应该动态地为应用程序提供所有这些。用户永远不必猜测如何使用新硬件。如果我插入相机,我的照片应用程序应该运行。如果我插入 DVD,它应该开始播放。所有这些都应该神奇地、自动地和干净地发生。
我创造了“乌托邦计划”这个名字。毕竟,这有点乌托邦式。
我们没有中央网站或源代码存储库或可爱的徽标。“乌托邦计划”是一种事业和一种思维方式。我们有一个目标和一组用例,以及对事物无法正常工作的日益增长的反感。我们在博客上撰写文章,在会议上发言,并编写代码。我们一步一步地开始在 HAL 之上构建一组策略,并遵循以下规则
让硬件开箱即用。
使用 HAL、udev、sysfs 和 2.6 Linux 内核作为我们的基础。
用 D-BUS 将它们全部连接起来。
没有轮询,没有黑科技——一切都应该是事件驱动和自动的。
仔细地将基础设施划分为系统级和用户级。
系统级应该是平台无关的;用户级,基于 GNOME。
我在 2003 年 12 月下旬开始编写 GNOME 卷管理器。它最初是一个概念验证——一个测试我的想法的试验台。我想看看在 HAL 之上进行硬件管理的可行性。该计划是响应诸如“新硬件”或“插入音频 CD”之类的事件,并采取特定操作。GNOME 卷管理器只是一个简单的有限状态机,在一端接收与硬件相关的事件,并在另一端回复硬件引起的动作。棘手的部分是完全使用 HAL 来完成所有操作:没有轮询,没有黑科技。
GNOME 卷管理器实现了与块设备相关的乌托邦计划策略。当用户插入音频 CD 时,GNOME 卷管理器会播放它。当用户插入 USB 钥匙链设备时,GNOME 卷管理器会挂载它并打开一个 Nautilus 窗口。当用户插入相机时,GNOME 卷管理器会询问是否应自动将照片导入用户的照片管理应用程序(图 2 和图 3)。最近添加的功能甚至发现 GNOME 卷管理器正在管理 iPod!

图 2. GNOME 卷管理器在发现新照片时提示
下一步是将 HAL 支持引入更多应用程序,Joey 和我将此过程称为 halification。接下来的几个月见证了额外的策略部分,例如自动打印机配置和无缝网络管理(图 4)。

图 4. NetworkManager 的网络切换小程序
对于打印机,Joey 为 CUPS(通用 UNIX 打印系统)编写了一个 HAL 后端,允许 CUPS 查询 HAL 以了解打印机的可用性。结果:插入打印机并当场自动配置它。
由 Red Hat 的黑客发起的雄心勃勃的 NetworkManager 项目旨在解决网络难题。该项目的早期设计师 Seth Nickell 将预期用例描述为电源插座:“你插上它,[它] 就通电了。” 例如,将笔记本电脑插入扩展坞,它会立即切换到扩展坞的以太网。走进你最喜欢的咖啡店,立即开始使用无线网络。NetworkManager 使联网变得简单,自动选择联网连接的最佳解决方案。
NetworkManager 的架构分为两部分。首先,一个 root 级别的守护程序与 HAL 并行运行,响应 HAL 事件并与系统的网络硬件通信。其次,一个或多个用户级组件实现策略并提供用户界面。这些组件共同为联网提供完整的解决方案。图 5 是该架构的图示。

图 5. NetworkManager 架构
今天,“乌托邦计划”的思维方式继续促进新的应用程序、有趣的黑科技和旨在使硬件正常工作的新项目。Novell、Red Hat 和其他公司的 Linux 发行版都采用了强大的基于 HAL 的基础设施。GNOME 项目正在全面集成 HAL 和 D-BUS。“乌托邦计划”的事业也正在 GNOME 之外传播,因为其他平台也在以类似的方式实施基于 HAL 的解决方案。
然而,Linux 开发从未停止。就像一只狂犬病的猎豹一样,开发工作向前冲刺,朝着更好、更快、更简单的解决方案迈进。对新硬件的支持不断涌入,并且不断实施符合“乌托邦计划”精神的解决方案,以提供无缝的用户体验。
当您的支持蓝牙的手机接到电话时,让您的音乐播放器静音等可爱的黑科技不是梦想,而是我们生活的现实。明天会带来什么可爱的黑科技?接下来我们将支持什么新硬件?下一个将被 halified 的应用程序是什么?加入我们并亲自回答这些问题吧!
本文资源: /article/8459。
Robert Love 是 Novell Ximian 桌面组的内核黑客,也是Linux 内核开发(SAMS 2005)的作者,该书现在已出第二版。他拥有佛罗里达大学的计算机科学和数学学位。Robert 住在马萨诸塞州剑桥市。