2016年11月

我目前的几个月在一家十分受人尊敬的基于云的技术公司担任新的 CIO 一职。我的首要任务之一就是熟悉组织的人、文化和当务之急的事件。

作为这一目标的一部分,我访问了所有主要的网站。而在印度,上任不到两个月时,我被问道:“你打算做什么?你的计划是什么?” 我回答道,这个问题不会让经验丰富的 CIO 们感到吃惊:我现在仍然处于探索模式,我在做的主要是聆听和学习。

我从来没有在入职时制定一份蓝图说我要做什么。我知道一些 CIO 们拥有一本关于他要怎么做的”剧本“。他会煽动整个组织将他的计划付诸行动。

是的,在有些地方是完全崩坏了并无法发挥作用的情况下,这种行动可能是有意义的。但是,当我进入到一个公司时,我的策略是先开始一个探索的过程。我不想带入任何先入为主的观念,比如什么事应该是什么样子的,哪些工作和哪些是有冲突的,而哪些不是。

以下是我作为新任命的领导人的指导原则:

了解你的人

这意味着建立关系,它包括你的 IT 职员,你的客户和你的销售人员。他们的清单上最重要的是什么?他们想要你关注什么?什么产品受到好评?什么产品不好?客户体验是怎样的?了解如何帮助每一个人变得更好将决定你提供服务的方式。

如果你的部门就像我的一样,是分布在几层楼中的,你可以考虑召开一个见面会,利用午餐或者小型技术研讨会的时间,让大家可以进行自我介绍并讨论下他们正在进行的工作,如果他们愿意的话还可以分享一些他们的家庭小故事。如果你有一个公开的办公室政策,你得确保每一个人都很好的了解它了。如果你有跨国跨州的的员工,你应该尽快的去拜访一下。

了解你的产品和公司文化

来到 Adobe 后最让我震惊的是我们的产品组合是如此的广泛。我们有一个横贯三个云的提供解决方案和服务的平台——Adobe 创新云、文档云和营销云——和对每一个产品的丰富的组合。除非你去了解你的产品和学会如何为他们提供支持,否则你永远也不知道你的新公司有着多么多的机会。在 Adobe 我们给我们的零号客户使用许多数字媒体和数字市场解决方案,所以我们可以将我们的第一手经验分享给我们的客户。

了解客户

从很早开始,我们就收到客户的会面请求。与客户会面是一种很好的方式来启发你对 IT 机构未来的的思考,包括各种我们可以改进的地方,如技术、客户和消费者。

对未来的计划

作为一个新上任的领导者,我有一个全新的视角用以考虑组织的未来,而不会有挑战和障碍来干扰我。

CIO 们所需要做的就是推动 IT 进化到下一代。当我会见我的员工时,我问他们我们三到五年后的未来可以做什么,以便我们可以开始尽早定位。这意味着开始讨论方案和当务之急的事。

从那以后,它使领导小组团结在一起,所以我们能够共同来组建我们的下一代体系——它的使命、愿景、组织模式和操作规范。如果你开始从内而外的改变,那么它会渗透到业务和其他你所做的一切事情上。

贯穿整个过程,我对他人都表现一种开明的态度,这不是一个自上而下的命令。也许我对我们当前要做的事有一个自己的看法,但是我们必须使看法保持一致,我们是一个团队,我们应该共同找出我们需要做的事。


via: https://enterprisersproject.com/article/2016/9/adobes-new-cio-shares-leadership-advice-starting-new-role

作者:Cynthia Stoddard 译者:Chao-zhi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

2016 年 11 月 5 日,Debian 发布经理 Emilio Pozuelo Monfort 和 Niels Thykier 高兴地宣布 Debian GNU/Linux 9 "Stretch" 操作系统进入冻结开发阶段。

在一个开发周期中,GNU/Linux 有多个里程碑,如 Alpha、Beta、RC、Beta Freeze、Feature Freeze,等等, Debian GNU/Linux 9 "Stretch" 即 Debian OS 的下一个重大发布,此版本已经是功能完善的版本。

"这意味着不再有新的库或包的大变化。不过之后几天还会有小的改变,我们尽量使其工作更流畅,所以请耐心等待最后的调整。"通知中写道。

按 Debian 开发周期,下一步是 2017 年 1 月 5 日进入 Soft Freeze 阶段。这意味着,此日期前所有更新必须纳入 Debian 测试计划中。

2017 年 2 月 5 日进入 Full Freeze 阶段,意味着所有更新需要获批。也意味着,此系统离最终发布不远了,预计是 2 月末或者 3 月初。

SUSE Linux Enterprise Server for Raspberry Pi 3推出,支持蓝牙 & Wi-Fi

SLES for Raspberry Pi 是 SUSE Linux Enterprise Server 支持树莓派的单板计算机的官方版本,支持树莓派 2 和新的树莓派 3 设备。

SLES for the Raspberry Pi 支持 Broadcom BCM2837 64-bit A53 ARM 处理器,以及集成的蓝牙和 Wi-Fi。

Ubuntu Budgie 成为 Ubuntu 官方流派发行版

在 11 月 8 日 Ubuntu 技术会议投票中,budgie-remix 被正式接纳为 Ubuntu 官方流派发行版,称为 Ubuntu Budgie。

Ubuntu Budgie (之前称为 budgie-remix )是使用 Budgie 作为默认桌面环境的 Ubuntu 发行版。它与其它Ubuntu 版本相似,只是更轻型,友好,简易。

运行 Budgie Desktop 10.2.8 的Ubuntu Budgie 16.10

Mythbuntu Linux 正式宣布不再继续

而另一方面,与 Ubuntu Budgie 成功成为官方流派不同,2016 年 11 月 5 日,Mythbuntu GNU/Linux 团队宣布该项目中止,不再有新的发布。

团队建议希望使用 Mythbuntu 的用户安装 Xubuntu Linux 最新版本,然后增加 Mythbuntu PPA (Personal Package Archive),提供最新 MythTV 发布和相关包。如有人想接管此项目,可通过官网联系原团队。

支持垂直面板的 Cinnamon 3.2 桌面环境现已可用

2016 年 11 月 7 日,Cinnamon 3.2.0 桌面环境即将发布,用户如想提前体验可在这里下载。不过如果发现 bug 的话, Linux Mint 18.1 可能最终使用一个不同的 Cinnamon 3.2 版本,如 3.2.1 或 3.2.2。

带有垂直面板的 Cinnamon 3.2

名词缩写:

  • API 应用程序接口 Application Program Interface
  • ABI 应用系统二进制接口 Application Binary Interface

设备驱动是操作系统的一部分,它能够通过一些特定的编程接口便于硬件设备的使用,这样软件就可以控制并且运行那些设备了。因为每个驱动都对应不同的操作系统,所以你就需要不同的 Linux、Windows 或 Unix 设备驱动,以便能够在不同的计算机上使用你的设备。这就是为什么当你雇佣一个驱动开发者或者选择一个研发服务商提供者的时候,查看他们为各种操作系统平台开发驱动的经验是非常重要的。

驱动开发的第一步是理解每个操作系统处理它的驱动的不同方式、底层驱动模型、它使用的架构、以及可用的开发工具。例如,Linux 驱动程序模型就与 Windows 非常不同。虽然 Windows 提倡驱动程序开发和操作系统开发分别进行,并通过一组 ABI 调用来结合驱动程序和操作系统,但是 Linux 设备驱动程序开发不依赖任何稳定的 ABI 或 API,所以它的驱动代码并没有被纳入内核中。每一种模型都有自己的优点和缺点,但是如果你想为你的设备提供全面支持,那么重要的是要全面的了解它们。

在本文中,我们将比较 Windows 和 Linux 设备驱动程序,探索不同的架构,API,构建开发和分发,希望让您比较深入的理解如何开始为每一个操作系统编写设备驱动程序。

1. 设备驱动架构

Windows 设备驱动程序的体系结构和 Linux 中使用的不同,它们各有优缺点。差异主要受以下原因的影响:Windows 是闭源操作系统,而 Linux 是开源操作系统。比较 Linux 和 Windows 设备驱动程序架构将帮助我们理解 Windows 和 Linux 驱动程序背后的核心差异。

1.1. Windows 驱动架构

虽然 Linux 内核分发时带着 Linux 驱动,而 Windows 内核则不包括设备驱动程序。与之不同的是,现代 Windows 设备驱动程序编写使用 Windows 驱动模型(WDM),这是一种完全支持即插即用和电源管理的模型,所以可以根据需要加载和卸载驱动程序。

处理来自应用的请求,是由 Windows 内核的中被称为 I/O 管理器的部分来完成的。I/O 管理器的作用是是转换这些请求到 I/O 请求数据包 IO Request Packets (IRP),IRP 可以被用来在驱动层识别请求并且传输数据。

Windows 驱动模型 WDM 提供三种驱动, 它们形成了三个层:

  • 过滤 Filter 驱动提供关于 IRP 的可选附加处理。
  • 功能 Function 驱动是实现接口和每个设备通信的主要驱动。
  • 总线 Bus 驱动服务不同的配适器和不同的总线控制器,来实现主机模式控制设备。

一个 IRP 通过这些层就像它们经过 I/O 管理器到达底层硬件那样。每个层能够独立的处理一个 IRP 并且把它们送回 I/O 管理器。在硬件底层中有硬件抽象层(HAL),它提供一个通用的接口到物理设备。

1.2. Linux 驱动架构

相比于 Windows 设备驱动,Linux 设备驱动架构根本性的不同就是 Linux 没有一个标准的驱动模型也没有一个干净分隔的层。每一个设备驱动都被当做一个能够自动的从内核中加载和卸载的模块来实现。Linux 为即插即用设备和电源管理设备提供一些方式,以便那些驱动可以使用它们来正确地管理这些设备,但这并不是必须的。

模式输出那些它们提供的函数,并通过调用这些函数和传入随意定义的数据结构来沟通。请求来自文件系统或网络层的用户应用,并被转化为需要的数据结构。模块能够按层堆叠,在一个模块进行处理之后,另外一个再处理,有些模块提供了对一类设备的公共调用接口,例如 USB 设备。

Linux 设备驱动程序支持三种设备:

  • 实现一个字节流接口的 字符 Character 设备。
  • 用于存放文件系统和处理多字节数据块 IO 的 Block 设备。
  • 用于通过网络传输数据包的 网络 Network 接口。

Linux 也有一个硬件抽象层(HAL),它实际扮演了物理硬件的设备驱动接口。

2. 设备驱动 API

Linux 和 Windows 驱动 API 都属于事件驱动类型:只有当某些事件发生的时候,驱动代码才执行——当用户的应用程序希望从设备获取一些东西,或者当设备有某些请求需要告知操作系统。

2.1. 初始化

在 Windows 上,驱动被表示为 DriverObject 结构,它在 DriverEntry 函数的执行过程中被初始化。这些入口点也注册一些回调函数,用来响应设备的添加和移除、驱动卸载和处理新进入的 IRP。当一个设备连接的时候,Windows 创建一个设备对象,这个设备对象在设备驱动后面处理所有应用请求。

相比于 Windows,Linux 设备驱动生命周期由内核模块的 module_initmodule_exit 函数负责管理,它们分别用于模块的加载和卸载。它们负责注册模块来通过使用内核接口来处理设备的请求。这个模块需要创建一个设备文件(或者一个网络接口),为其所希望管理的设备指定一个数字识别号,并注册一些当用户与设备文件交互的时候所使用的回调函数。

2.2. 命名和声明设备

在 Windows 上注册设备

Windows 设备驱动在新连接设备时是由回调函数 AddDevice 通知的。它接下来就去创建一个 设备对象 device object ,用于识别该设备的特定的驱动实例。取决于驱动的类型,设备对象可以是 物理设备对象 Physical Device Object (PDO), 功能设备对象 Function Device Object (FDO),或者 过滤设备对象 Filter Device Object (FIDO)。设备对象能够堆叠,PDO 在底层。

设备对象在这个设备连接在计算机期间一直存在。DeviceExtension 结构能够被用于关联到一个设备对象的全局数据。

设备对象可以有如下形式的名字 \Device\DeviceName,这被系统用来识别和定位它们。应用可以使用 CreateFile API 函数来打开一个有上述名字的文件,获得一个可以用于和设备交互的句柄。

然而,通常只有 PDO 有自己的名字。未命名的设备能够通过设备级接口来访问。设备驱动注册一个或多个接口,以 128 位全局唯一标识符(GUID)来标示它们。用户应用能够使用已知的 GUID 来获取一个设备的句柄。

在 Linux 上注册设备

在 Linux 平台上,用户应用通过文件系统入口访问设备,它通常位于 /dev 目录。在模块初始化的时候,它通过调用内核函数 register_chrdev 创建了所有需要的入口。应用可以发起 open 系统调用来获取一个文件描述符来与设备进行交互。这个调用后来被发送到回调函数,这个调用(以及将来对该返回的文件描述符的进一步调用,例如 readwriteclose)会被分配到由该模块安装到 file_operations 或者 block_device_operations这样的数据结构中的回调函数。

设备驱动模块负责分配和保持任何需要用于操作的数据结构。传送进文件系统回调函数的 file 结构有一个 private_data 字段,它可以被用来存放指向具体驱动数据的指针。块设备和网络接口 API 也提供类似的字段。

虽然应用使用文件系统的节点来定位设备,但是 Linux 在内部使用一个 主设备号 major numbers 次设备号 minor numbers 的概念来识别设备及其驱动。主设备号被用来识别设备驱动,而次设备号由驱动使用来识别它所管理的设备。驱动为了去管理一个或多个固定的主设备号,必须首先注册自己或者让系统来分配未使用的设备号给它。

目前,Linux 为 主次设备对 major-minor pairs 使用一个 32 位的值,其中 12 位分配主设备号,并允许多达 4096 个不同的设备。主次设备对对于字符设备和块设备是不同的,所以一个字符设备和一个块设备能使用相同的设备对而不导致冲突。网络接口是通过像 eth0 的符号名来识别,这些又是区别于主次设备的字符设备和块设备的。

2.3. 交换数据

Linux 和 Windows 都支持在用户级应用程序和内核级驱动程序之间传输数据的三种方式:

  • 缓冲型输入输出 Buffered Input-Output 它使用由内核管理的缓冲区。对于写操作,内核从用户空间缓冲区中拷贝数据到内核分配的缓冲区,并且把它传送到设备驱动中。读操作也一样,由内核将数据从内核缓冲区中拷贝到应用提供的缓冲区中。
  • 直接型输入输出 Direct Input-Output 它不使用拷贝功能。代替它的是,内核在物理内存中钉死一块用户分配的缓冲区以便它可以一直留在那里,以便在数据传输过程中不被交换出去。
  • 内存映射 Memory mapping 它也能够由内核管理,这样内核和用户空间应用就能够通过不同的地址访问同样的内存页。
Windows 上的驱动程序 I/O 模式

支持缓冲型 I/O 是 WDM 的内置功能。缓冲区能够被设备驱动通过在 IRP 结构中的 AssociatedIrp.SystemBuffer 字段访问。当需要和用户空间通讯的时候,驱动只需从这个缓冲区中进行读写操作。

Windows 上的直接 I/O 由 内存描述符列表 memory descriptor lists (MDL)介导。这种半透明的结构是通过在 IRP 中的 MdlAddress 字段来访问的。它们被用来定位由用户应用程序分配的缓冲区的物理地址,并在 I/O 请求期间钉死不动。

在 Windows 上进行数据传输的第三个选项称为 METHOD_NEITHER。 在这种情况下,内核需要传送用户空间的输入输出缓冲区的虚拟地址给驱动,而不需要确定它们有效或者保证它们映射到一个可以由设备驱动访问的物理内存地址。设备驱动负责处理这些数据传输的细节。

Linux 上的驱动程序 I/O 模式

Linux 提供许多函数例如,clear_usercopy_to_userstrncpy_from_user 和一些其它的用来在内核和用户内存之间进行缓冲区数据传输的函数。这些函数保证了指向数据缓存区指针的有效,并且通过在内存区域之间安全地拷贝数据缓冲区来处理数据传输的所有细节。

然而,块设备的驱动对已知大小的整个数据块进行操作,它可以在内核和用户地址区域之间被快速移动而不需要拷贝它们。这种情况是由 Linux 内核来自动处理所有的块设备驱动。块请求队列处理传送数据块而不用多余的拷贝,而 Linux 系统调用接口来转换文件系统请求到块请求中。

最终,设备驱动能够从内核地址区域分配一些存储页面(不可交换的)并且使用 remap_pfn_range 函数来直接映射这些页面到用户进程的地址空间。然后应用能获取这些缓冲区的虚拟地址并且使用它来和设备驱动交流。

3. 设备驱动开发环境

3.1. 设备驱动框架

Windows 驱动程序工具包

Windows 是一个闭源操作系统。Microsoft 提供 Windows 驱动程序工具包以方便非 Microsoft 供应商开发 Windows 设备驱动。工具包中包含开发、调试、检验和打包 Windows 设备驱动等所需的所有内容。

Windows 驱动模型 Windows Driver Model (WDM)为设备驱动定义了一个干净的接口框架。Windows 保持这些接口的源代码和二进制的兼容性。编译好的 WDM 驱动通常是前向兼容性:也就是说,一个较旧的驱动能够在没有重新编译的情况下在较新的系统上运行,但是它当然不能够访问系统提供的新功能。但是,驱动不保证后向兼容性。

Linux 源代码

和 Windows 相对比,Linux 是一个开源操作系统,因此 Linux 的整个源代码是用于驱动开发的 SDK。没有驱动设备的正式框架,但是 Linux 内核包含许多提供了如驱动注册这样的通用服务的子系统。这些子系统的接口在内核头文件中描述。

尽管 Linux 有定义接口,但这些接口在设计上并不稳定。Linux 不提供有关前向和后向兼容的任何保证。设备驱动对于不同的内核版本需要重新编译。没有稳定性的保证可以让 Linux 内核进行快速开发,因为开发人员不必去支持旧的接口,并且能够使用最好的方法解决手头的这些问题。

当为 Linux 写 树内 in-tree (指当前 Linux 内核开发主干)驱动程序时,这种不断变化的环境不会造成任何问题,因为它们作为内核源代码的一部分,与内核本身同步更新。然而,闭源驱动必须单独开发,并且在 树外 out-of-tree ,必须维护它们以支持不同的内核版本。因此,Linux 鼓励设备驱动程序开发人员在树内维护他们的驱动。

3.2. 为设备驱动构建系统

Windows 驱动程序工具包为 Microsoft Visual Studio 添加了驱动开发支持,并包括用来构建驱动程序代码的编译器。开发 Windows 设备驱动程序与在 IDE 中开发用户空间应用程序没有太大的区别。Microsoft 提供了一个企业 Windows 驱动程序工具包,提供了类似于 Linux 命令行的构建环境。

Linux 使用 Makefile 作为树内和树外系统设备驱动程序的构建系统。Linux 构建系统非常发达,通常是一个设备驱动程序只需要少数行就产生一个可工作的二进制代码。开发人员可以使用任何 IDE,只要它可以处理 Linux 源代码库和运行 make ,他们也可以很容易地从终端手动编译驱动程序。

3.3. 文档支持

Windows 对于驱动程序的开发有良好的文档支持。Windows 驱动程序工具包包括文档和示例驱动程序代码,通过 MSDN 可获得关于内核接口的大量信息,并存在大量的有关驱动程序开发和 Windows 底层的参考和指南。

Linux 文档不是描述性的,但整个 Linux 源代码可供驱动开发人员使用缓解了这一问题。源代码树中的 Documentation 目录描述了一些 Linux 的子系统,但是有几本书介绍了关于 Linux 设备驱动程序开发和 Linux 内核概览,它们更详细。

Linux 没有提供设备驱动程序的指定样本,但现有生产级驱动程序的源代码可用,可以用作开发新设备驱动程序的参考。

3.4. 调试支持

Linux 和 Windows 都有可用于追踪调试驱动程序代码的日志机制。在 Windows 上将使用 DbgPrint 函数,而在 Linux 上使用的函数称为 printk。然而,并不是每个问题都可以通过只使用日志记录和源代码来解决。有时断点更有用,因为它们允许检查驱动代码的动态行为。交互式调试对于研究崩溃的原因也是必不可少的。

Windows 通过其内核级调试器 WinDbg 支持交互式调试。这需要通过一个串行端口连接两台机器:一台计算机运行被调试的内核,另一台运行调试器和控制被调试的操作系统。Windows 驱动程序工具包包括 Windows 内核的调试符号,因此 Windows 的数据结构将在调试器中部分可见。

Linux 还支持通过 KDBKGDB 进行的交互式调试。调试支持可以内置到内核,并可在启动时启用。之后,可以直接通过物理键盘调试系统,或通过串行端口从另一台计算机连接到它。KDB 提供了一个简单的命令行界面,这是唯一的在同一台机器上来调试内核的方法。然而,KDB 缺乏源代码级调试支持。KGDB 通过串行端口提供了一个更复杂的接口。它允许使用像 GDB 这样标准的应用程序调试器来调试 Linux 内核,就像任何其它用户空间应用程序一样。

4. 设备驱动分发

4.1. 安装设备驱动

在 Windows 上安装的驱动程序,是由被称为为 INF 的文本文件描述的,通常存储在 C:\Windows\INF 目录中。这些文件由驱动供应商提供,并且定义哪些设备由该驱动程序服务,哪里可以找到驱动程序的二进制文件,和驱动程序的版本等。

当一个新设备插入计算机时,Windows 通过查看已经安装的驱动程序并且选择适当的一个加载。当设备被移除的时候,驱动会自动卸载它。

在 Linux 上,一些驱动被构建到内核中并且保持永久的加载。非必要的驱动被构建为内核模块,它们通常是存储在 /lib/modules/kernel-version 目录中。这个目录还包含各种配置文件,如 modules.dep,用于描述内核模块之间的依赖关系。

虽然 Linux 内核可以在自身启动时加载一些模块,但通常模块加载由用户空间应用程序监督。例如,init 进程可能在系统初始化期间加载一些模块,udev 守护程序负责跟踪新插入的设备并为它们加载适当的模块。

4.2. 更新设备驱动

Windows 为设备驱动程序提供了稳定的二进制接口,因此在某些情况下,无需与系统一起更新驱动程序二进制文件。任何必要的更新由 Windows Update 服务处理,它负责定位、下载和安装适用于系统的最新版本的驱动程序。

然而,Linux 不提供稳定的二进制接口,因此有必要在每次内核更新时重新编译和更新所有必需的设备驱动程序。显然,内置在内核中的设备驱动程序会自动更新,但是树外模块会产生轻微的问题。 维护最新的模块二进制文件的任务通常用 DKMS 来解决:这是一个当安装新的内核版本时自动重建所有注册的内核模块的服务。

4.3. 安全方面的考虑

所有 Windows 设备驱动程序在 Windows 加载它们之前必须被数字签名。在开发期间可以使用自签名证书,但是分发给终端用户的驱动程序包必须使用 Microsoft 信任的有效证书进行签名。供应商可以从 Microsoft 授权的任何受信任的证书颁发机构获取 软件出版商证书 Software Publisher Certificate 。然后,此证书由 Microsoft 交叉签名,并且生成的交叉证书用于在发行之前签署驱动程序包。

Linux 内核也能配置为在内核模块被加载前校验签名,并禁止不可信的内核模块。被内核所信任的公钥集在构建时是固定的,并且是完全可配置的。由内核执行的检查,这个检查严格性在构建时也是可配置的,范围从简单地为不可信模块发出警告,到拒绝加载有效性可疑的任何东西。

5. 结论

如上所示,Windows 和 Linux 设备驱动程序基础设施有一些共同点,例如调用 API 的方法,但更多的细节是相当不同的。最突出的差异源于 Windows 是由商业公司开发的封闭源操作系统这个事实。这使得 Windows 上有好的、文档化的、稳定的驱动 ABI 和正式框架,而在 Linux 上,更多的是源代码做了一个有益的补充。文档支持也在 Windows 环境中更加发达,因为 Microsoft 具有维护它所需的资源。

另一方面,Linux 不会使用框架来限制设备驱动程序开发人员,并且内核和产品级设备驱动程序的源代码可以在需要的时候有所帮助。缺乏接口稳定性也有其作用,因为它意味着最新的设备驱动程序总是使用最新的接口,内核本身承载较小的后向兼容性负担,这带来了更干净的代码。

了解这些差异以及每个系统的具体情况是为您的设备提供有效的驱动程序开发和支持的关键的第一步。我们希望这篇文章对 Windows 和 Linux 设备驱动程序开发做的对比,有助于您理解它们,并在设备驱动程序开发过程的研究中,将此作为一个伟大的起点。


via: http://xmodulo.com/linux-vs-windows-device-driver-model.html

作者:Dennis Turpitka 译者:FrankXinqi &YangYang 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

How To Setup A WiFi In Arch Linux Using Terminal

如果你使用的是其他 Linux 发行版 而不是 Arch CLI,那么可能会不习惯在终端里设置 WiFi。尽管整个过程有点简单,不过我还是要讲一下。在这篇文章里,我将带领新手们通过一步步的设置向导,把你们的 Arch Linux 接入到你的 WiFi 网络里。

在 Linux 里有很多程序来设置无线连接,我们可以用 ipiw 来配置因特网连接,但是对于新手来说有点复杂。所以我们会使用 netctl 命令,这是一个基于命令行的工具,用来通过配置文件来设置和管理网络连接。

注意:所有的设定都需要 root 权限,或者你也可以使用 sudo 命令来完成。

搜索网络

运行下面的命令来查看你的网络接口:

iwconfig

运行如下命令启用你的网络接口,如果没有启用的话:

ip link set  interface up

运行下面的命令搜索可用的 WiFi 网络。可以向下翻页来查看。

iwlist interface scan | less

注意: 命令里的 interface 是之前用 iwconfig 获取到的实际网络接口。

扫描完,如果不使用该接口可以运行如下命令关闭:

ip link set interface down

使用 netctl 配置 Wi-Fi:

在使用 netctl 设置连接之前,你必须先检查一下你的网卡在 Linux 下的兼容性。

运行命令:

lspci -k

这条命令是用来检查内核是否加载了你的无线网卡驱动。输出必须是像这样的:

如果内核没有加载驱动,你就必须使用有线连接来安装一下。这里是 Linux 无线网络的官方维基页面:https://wireless.wiki.kernel.org/

如果你的无线网卡和 Linux 兼容,你可以使用 netctl configuration

netctl 使用配置文件,这是一个包含连接信息的文件。创建这个文件有简单和困难两种方式。

简单方式 – Wifi-menu

如果你想用 wifi-menu,必须安装 dialog

  1. 运行命令: wifi-menu
  2. 选择你的网络

wifi-menu to setup wifi in arch

  1. 输入正确的密码并等待

wifi-menu setup wifi password in arch

如果没有连接失败的信息,你可以用下面的命令确认下:

ping -c 3 www.google.com

哇!如果你看到正在 ping,意味着网络设置成功。你现在已经在 Arch Linux 下连上 WiFi 了。如果有任何问题,可以倒回去重来。也许漏了什么。

困难方式

比起上面的 wifi-menu 命令,这种方式会难一点点,所以我叫做困难方式。在上面的命令里,网络配置会自动生成。而在困难方式里,我们将手动修改配置文件。不过不要担心,也没那么难。那我们开始吧!

  1. 首先第一件事,你必须要知道网络接口的名字,通常会是 wlan0wlp2s0,但是也有很多例外。要确认你自己的网络接口,输入 iwconfig 命令并记下来。

scan wifi networks in arch linux cli

  1. 运行命令:
cd /etc/netctl/examples

在这个目录里,有很多不同的配置文件例子。

  1. 拷贝将用到的配置文件例子到 /etc/netctl/your_profile
cp /etc/netctl/examples/wireless-wpa /etc/netctl/your_profile
  1. 你可以用这个命令来查看配置文件内容: cat /etc/netctl/your_profile

view network profile in arch linux

  1. vi 或者 nano 编辑你的配置文件的下面几个部分:
nano /etc/netctl/your_profile
- `Interface`:比如说 `wlan0`
- `ESSID`:你的无线网络名字
- `key`:你的无线网络密码

注意:

如果你不知道怎么用 nano,打开文件后,编辑要修改的地方,完了按 ctrl+o,然后回车,然后按 ctrl+x

edit network profile in arch

运行 netctl

  1. 运行命令:
cd /etc/netctl
ls

你一定会看到 wifi-menu 生成的配置文件,比如 wlan0-SSID;或者你选择了困难方式,你一定会看到你自己创建的配置文件。

  1. 运行命令启动连接配置:netctl start your_profile
  2. 用下面的命令测试连接:
ping -c 3 www.google.com

输出看上去像这样: check internet connection in arch linux

  1. 最后,你必须运行下面的命令:netctl enable your_profile
netctl enable your_profile

这样将创建并激活一个 systemd 服务,然后开机时自动启动。然后欢呼吧!你在你的 Arch Linux 里配置好 wifi 网络啦。

其他工具

你还可以使用其他程序来设置无线连接:

iw:

  1. iw dev wlan0 link – 状态
  2. iw dev wlan0 scan – 搜索网络
  3. iw dev wlan0 connect your_essid – 连接到开放网络
  4. iw dev wlan0 connect your_essid key your_key - 使用 16 进制密钥连接到 WEP 加密的网络

wpa\_supplicant

Wicd

NetworkManager

总结

会了吧!我提供了在 Arch Linux 里接入 WiFI 网络的三种方式。这里有一件事我再强调一下,当你执行第一条命令的时候,请记住你的网络接口名字。在接下来搜索网络的命令里,请使用你的网络接口名字比如 wlan0wlp2s0(上一个命令里得到的),而不是用 interface 这个词。如果你碰到任何问题,可以在下面的评论区里直接留言给我。然后别忘了在你的朋友圈里和大家分享这篇文章哦。谢谢!


via: http://www.linuxandubuntu.com/home/how-to-setup-a-wifi-in-arch-linux-using-terminal

作者:Mohd Sohail 译者:zpl1025 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

让我们把时钟往回拨一点。不,别停…再来一点……好了!在 25 年前,当你的某些专家同事还在蹒跚学步时,Bram Moolenaar 已经开始为他的 Amiga 计算机开发一款文本编辑器。他曾经是 Unix 上的 vi 用户,但 Amiga 上却没有与其类似的编辑器。在三年的开发之后,1991 年 11 月 2 日,他发布了“ 仿 vi 编辑器 Vi IMitation ”(也就是 Vim)的第一个版本。

两年之后,随着 2.0 版本的发布,Vim 的功能集已经超过了 vi,所以这款编辑器的全称也被改为了“ vi 增强版 Vi IMproved ”。现在,刚刚度过 25 岁生日的 Vim,已经可以在绝大部分平台上运行——Windows、OS/2、OpenVMS、BSD、Android、iOS——并且已在 OS X 及很多 Linux 发行版上成为标配软件。它受到了许多赞誉,也受到了许多批评,不同组织或开发者也会围绕它来发起争论,甚至有些面试官会问:“你用 Emacs 还是 Vim?”Vim 已拥有自由许可证,它基于 慈善软件证书 charityware license (“帮助乌干达的可怜儿童”)发布,该证书与 GPL 兼容。

Vim 是一个灵活的、可扩展的编辑器,带有一个强大的插件系统,被深入集成到许多开发工具,并且可以编辑上百种编程语言或文件类型的文件。 在 Vim 诞生二十五年后,Bram Moolenaar 仍然在主导开发并维护它——这真是一个壮举!Vim 曾经在超过 20 年的时间里数次间歇中断开发,但在 2016 年 9 月,它发布了 8.0 版本,添加了许多新功能,为现代程序员用户提供了更多方便。很多年来,Vim 在官网上售卖 T 恤及 logo 贴纸,所得的销售款为支持 ICCF——一个帮助乌干达儿童的德国慈善机构做出了巨大贡献。Vim 所支持的慈善项目深受 Moolenaar 喜爱,Mooleaar 本人也去过乌干达,在基巴莱的一个儿童中心做志愿者。

Vim 在开源历史上记下了有趣的一笔:一个工程,在 25 年中,坚持由一个稳定的核心贡献者维护,拥有超多的用户,但很多人从未了解过它的历史。如果你想简单的了解 Vim,请访问它的网站,或者你可以读一读 Vim 入门的一些小技巧,或者在 Opensource.com 阅读一位 Vim 新用户的故事


via: https://opensource.com/life/16/11/happy-birthday-vim-25

作者:D Ruth Bavousett 译者:StdioA 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在这篇文章中,我们将考察一个 Node.js 开发原型,该原型用于从英国三个主要折扣网店查找“Raspberry PI Zero”的库存。

我写好了代码,然后经过一晚的鼓捣把它部署在 Aure 上的 Ubuntu 虚拟机上。Docker 和 docker-compose 工具使得部署和更新过程非常快。

还记得链接指令(link)吗?

如果你已经阅读过 Hands-on Docker tutorial,那么你应该已经可以使用命令行链接 Docker 容器。通过命令行将 Node.js 的计数器链接到 Redis 服务器,其命令可能如下所示:

$ docker run -d -P --name redis1
$ docker run -d hit_counter -p 3000:3000 --link redis1:redis

现在假设你的应用程序分为三层:

  • Web 前端
  • 处理长时间运行任务的批处理层
  • Redis 或者 mongo 数据库

通过--link的显式链接只是管理几个容器是可以的,但是可能会因为我们向应用程序添加更多层或容器而失控。

加入 docker-compose

Docker Compose logo

docker-compose 工具是标准 Docker 工具箱的一部分,也可以单独下载。 它提供了一组丰富的功能,通过纯文本 YAML 文件配置所有应用程序的部件。

上面的例子看起来像这样:

version: "2.0"
services:
  redis1:
    image: redis
  hit_counter:
    build: ./hit_counter
    ports:
     - 3000:3000

从 Docker 1.10 开始,我们可以利用网络覆盖(network overlays)来帮助我们在多个主机上进行扩展。 在此之前,链接仅能工作在单个主机上。 docker-compose scale 命令可以用来在需要时带来更多的计算能力。

查看 docker.com 上的 docker-compose 参考

 真实工作示例:Raspberry PI 库存警示

新的 Raspberry PI Zero v1.3 图片,由 Pimoroni 提供

Raspberry PI Zero 嗡嗡作响 - 它是一个极小的微型计算机,具有 1GHz CPU 和 512MB RAM,可以运行完整的Linux、Docker、Node.js、Ruby 和其他许多流行的开源工具。 PI Zero 最好的优点之一就是它成本只有 5 美元。 这也意味着它销售的速度非常之快。

如果你想在 PI 上尝试 Docker 和 Swarm,请查看下面的教程:Docker Swarm on the PI Zero

原始网站:whereismypizero.com

我发现一个网页,它使用屏幕抓取以找出 4-5 个最受欢迎的折扣网店是否有库存。

  • 网站包含静态 HTML 网页
  • 向每个折扣网店发出一个 XMLHttpRequest 访问 /public/api/
  • 服务器向每个网店发出 HTTP 请求并执行抓屏

每一次对 /public/api/ 的调用,其执行花 3 秒钟,而使用 Apache Bench(ab),我每秒只能完成 0.25 个请求。

重新发明轮子

零售商似乎并不介意 whereismypizero.com 抓取他们的网站的商品库存信息,所以我开始从头写一个类似的工具。 我尝试通过缓存和解耦 web 层来处理更多的抓取请求。 Redis 是执行这项工作的完美工具。 它允许我设置一个自动过期的键/值对(即一个简单的缓存),还可以通过 pub/sub 在 Node.js 进程之间传输消息。

复刻或者追踪放在 github 上的代码: alexellis/pizerostock

如果之前使用过 Node.js,你肯定知道它是单线程的,并且任何 CPU 密集型任务,如解析 HTML 或 JSON 都可能导致速度放缓。一种缓解这种情况的方法是使用一个工作进程和 Redis 消息通道作为它和 web 层之间的连接组织。

  • Web 层

    • 使用 200 代表缓冲命中(该商店的 Redis 键存在)
    • 使用 202 代表高速缓存未命中(该商店的 Redis 键不存在,因此发出消息)
    • 因为我们只是读一个 Redis 键,响应时间非常快。
  • 库存抓取器

    • 执行 HTTP 请求
    • 用于在不同类型的网店上抓屏
    • 更新 Redis 键的缓存失效时间为 60 秒
    • 另外,锁定一个 Redis 键,以防止对网店过多的 HTTP 请求。
version: "2.0"  
services:  
  web:
    build: ./web/
    ports:
     - "3000:3000"
  stock_fetch:
    build: ./stock_fetch/
  redis:
    image: redis

来自示例的 docker-compose.yml 文件

一旦本地正常工作,再向 Azure 的 Ubuntu 16.04 镜像云部署就轻车熟路,只花了不到 5 分钟。 我登录、克隆仓库并键入docker-compose up -d, 这就是所有的工作 - 快速实现整个系统的原型不会比这几个步骤更多。 任何人(包括 whereismypizero.com 的所有者)只需两行命令就可以部署新解决方案:

$ git clone https://github.com/alexellis/pi_zero_stock
$ docker-compose up -d

更新网站很容易,只需要一个git pull命令,然后执行docker-compose up -d命令,该命令需要带上--build参数。

如果你仍然手动链接你的 Docker 容器,请自己或使用如下我的代码尝试 Docker Compose:

复刻或者追踪在 github 上的代码: alexellis/pizerostock

一睹测试网站芳容

目前测试网站使用 docker-compose 部署:stockalert.alexellis.io

预览于 2016 年 5 月 16 日


via: http://blog.alexellis.io/rapid-prototype-docker-compose/

作者:Alex Ellis 译者:firstadream 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出