Linux 与 Windows 的设备驱动模型对比：架构、API 和开发环境比较

这篇文章的作者肯定是被Linux驱动弄疯了，但是还是很政治正确的拍Linux马屁。----win万岁！

终于知道为什么有些驱动linux的源码烂遍大街，windows版的却找死了都找不到

![](/data/attachment/album/201611/09/130601brm3lwzy3vyphslp.jpg)

>
> 名词缩写：
>
>
> * <ruby> API 应用程序接口 <rp>  （ </rp> <rt>  Application Program Interface </rt> <rp>  ） </rp></ruby>
> * <ruby> ABI 应用系统二进制接口 <rp>  （ </rp> <rt>  Application Binary Interface </rt> <rp>  ） </rp></ruby>
>
>
>

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

![](/data/attachment/album/201611/09/130632sl88zs2lt080t272.jpg)

驱动开发的第一步是理解每个操作系统处理它的驱动的不同方式、底层驱动模型、它使用的架构、以及可用的开发工具。例如，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 管理器的作用是是转换这些请求到<ruby> I/O 请求数据包 <rp>  （ </rp> <rt>  IO Request Packets </rt> <rp>  ） </rp></ruby>（IRP），IRP 可以被用来在驱动层识别请求并且传输数据。

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

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

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

#### 1.2. Linux 驱动架构

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

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

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

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

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

### 2. 设备驱动 API

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

#### 2.1. 初始化

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

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

#### 2.2. 命名和声明设备

##### 在 Windows 上注册设备

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

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

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

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

##### 在 Linux 上注册设备

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

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

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

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

#### 2.3. 交换数据

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

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

##### Windows 上的驱动程序 I/O 模式

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

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

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

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

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

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

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

### 3. 设备驱动开发环境

#### 3.1. 设备驱动框架

##### Windows 驱动程序工具包

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

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

##### Linux 源代码

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

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

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

#### 3.2. 为设备驱动构建系统

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

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

#### 3.3. 文档支持

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

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

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

#### 3.4. 调试支持

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

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

Linux 还支持通过 `KDB` 和 `KGDB` 进行的交互式调试。调试支持可以内置到内核，并可在启动时启用。之后，可以直接通过物理键盘调试系统，或通过串行端口从另一台计算机连接到它。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](http://xmodulo.com/build-kernel-module-dkms-linux.html) 来解决：这是一个当安装新的内核版本时自动重建所有注册的内核模块的服务。

#### 4.3. 安全方面的考虑

所有 Windows 设备驱动程序在 Windows 加载它们之前必须被数字签名。在开发期间可以使用自签名证书，但是分发给终端用户的驱动程序包必须使用 Microsoft 信任的有效证书进行签名。供应商可以从 Microsoft 授权的任何受信任的证书颁发机构获取<ruby> 软件出版商证书 <rp>  （ </rp> <rt>  Software Publisher Certificate </rt> <rp>  ） </rp></ruby>。然后，此证书由 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](http://xmodulo.com/author/dennis) 译者：[FrankXinqi &YangYang](https://github.com/FrankXinqi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


一周开源新闻：Debian GNU/Linux 9 "Stretch" 将于 2017 年初发布

Summary:
更多：
- SLES for Raspberry Pi 支持树莓派 3
- Ubuntu Budgie 正式成为官方流派
- Mythbuntu Linux 宣告结束

![](/data/attachment/album/201611/10/113517pcoezzxuxwwhclxu.jpg)

2016 年 11 月 5 日，Debian 发布经理 Emilio Pozuelo Monfort 和 Niels Thykier 高兴地[宣布](https://lists.debian.org/debian-devel-announce/2016/11/msg00002.html) 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](http://tinyurl.com/slespi) 是 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 被正式[接纳](https://budgie-remix.org/2016/11/08/its-official/)为 Ubuntu 官方流派发行版，称为 Ubuntu Budgie。

Ubuntu Budgie (之前称为 budgie-remix ）是使用 [Budgie](https://solus-project.com/budgie/) 作为默认桌面环境的 Ubuntu 发行版。它与其它Ubuntu 版本相似，只是更轻型，友好，简易。

![](/data/attachment/album/201611/10/113518jbmpyp664x40p63z.jpg)

*运行 Budgie Desktop 10.2.8 的Ubuntu Budgie 16.10*

### Mythbuntu Linux 正式宣布不再继续

而另一方面，与 Ubuntu Budgie 成功成为官方流派不同，2016 年 11 月 5 日，Mythbuntu GNU/Linux 团队[宣布](https://sites.google.com/a/mythbuntu.org/website/home/news/mythbuntusolongandthanksforallthefish)该项目中止，不再有新的发布。

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

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

2016 年 11 月 7 日，[Cinnamon 3.2.0](https://github.com/linuxmint/Cinnamon/releases/tag/3.2.0) 桌面环境即将发布，用户如想提前体验可在[这里下载](http://linux.softpedia.com/get/Desktop-Environment/Window-Managers/Cinnamon-98277.shtml)。不过如果发现 bug 的话， Linux Mint 18.1 可能最终使用一个不同的 Cinnamon 3.2 版本，如 3.2.1 或 3.2.2。

![](/data/attachment/album/201611/10/113518lqzoqaq7n4wd1a8w.jpg)

*带有垂直面板的 Cinnamon 3.2*


Adobe 的新任首席信息官（CIO）对于开始一个新领导职位的建议

![](/data/attachment/album/201611/10/135626jrr1s5exzgw0ytpg.png)

我目前的几个月在一家十分受人尊敬的基于云的技术公司担任新的 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](https://enterprisersproject.com/user/cynthia-stoddard) 译者：[Chao-zhi](https://github.com/Chao-zhi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


病毒过后，系统管理员投向了 Linux

Summary: 我爱上了 distro-hopping 和第一时间尝试新发行版的感觉。

用户还是要首先支持自由开源软件平台和支持自由软件的硬件平台系统。支持自由开源软件就是争取自己失去的用户自由和权利！！！

好老的文章啊，Mandrake GNU/Linux五年前就停止更新新版了，现在的Mageia GNU/Linux是这个项目的继承者，我尝试过Mageia，原汁原味的法兰西风情，默认KDE桌面，很华丽、流畅、友善的发行版，可喜对中文支持不是很友好，需要比较多的折腾，有兴趣的同学可以加入他们的中文本地化项目~

这文章是十年前的吧！现在你想让Windows 10蓝屏一次都不太容易。

好老的鸡汤文了

鸡汤随时喝着点，有助于身心健康，:D

哈哈，然而这篇真是 Opensource 最近发出来的。。。我承认里面提到的事情是很古老了。。

不不，上次因为连接kindle导致蓝屏让我重回了win7.这说明win10蓝屏也不像你说的那样不太容易。

不不，寝室的电脑还常常见他们蓝，不然就是“冰取之于水，而寒与水”:b

我爱上了 distro-hopping 和第一时间尝试新发行版的感觉。

![](/data/attachment/album/201611/10/143359vql2do0k2pm1ez25.jpg)

我开源事业的第一笔，是我在 2001 年作为一名兼职系统管理员，为大学工作的时候。成为了那个以教学为目的，不仅仅在大学中，还在学术界的其他领域建立商业案例研究的小组的一份子。

随着团队的发展，渐渐地开始需要一个由文件服务、intranet 应用，域登录等功能构建而成的健壮的局域网。 我们的 IT 基础设施主要由跑着 Windows 98 的计算机组成，这些计算机对于大学的 IT 实验室来说已经太老了，就重新分配给了我们部门。

### 初探 Linux

一天，作为大学IT采购计划的一部分，我们部门收到了一台 IBM 服务器。 我们计划将其用作 Internet 网关，域控制站，文件服务器和备份服务器，以及 intranet 应用程序主机。

拆封后，我们注意到它附带了红帽 Linux 的 CD。 我们的 22 人团队（包括我）对 Linux 一无所知。 经过几天的研究，我找到了一位朋友的朋友，一位以 Linux RTOS （Linux 的实时操作系统领域）编程为生的人，求助他如何安装。

光看着那朋友用 CD 驱动器载入第一张安装 CD 并进入 Anaconda 安装系统，我的头都晕了。 大约一个小时，我们完成了基本的安装，但仍然没有可用的 internet 连接。

又花了一个小时的折腾才使我们连接到互联网，但仍没有域登录或 Internet 网关功能。 经过一个周末的折腾，我们可以让我们的 Windows 98 机器作为 Linux PC 的代理，终于构出了一个正常工作的共享互联环境。 但域登录还需要一段时间。

我们用龟速的电话调制解调器下载了 [Samba](https://www.samba.org/)，并手动配置它作为域控制站。文件服务也通过 NFS Kernel Server 开启了，随后为 Windows 98 的网络邻居创建了用户目录并进行了必要的调整和配置。

这个设置完美运行了一段时间，直到最终我们决定开始使用 Intranet 应用管理时间表和一些别的东西。 这个时候，我已经离开了该组织，并把大部分系统管理员的东西交给了接替我的人。

### 再遇 Linux

2004 年，我又重新装回了 Linux。我的妻子经营的一份独立员工安置业务，使用来自 Monster.com 等服务的数据来打通客户与求职者的交流渠道。

作为我们两人中的计算机好点的那个，在计算机和互联网出故障的时候，维修就成了我的分内之事。我们还需要用许多工具尝试，从堆积如山的简历中筛选出她每天必须看的。

Windows [BSoD](https://en.wikipedia.org/wiki/Blue_Screen_of_Death)（蓝屏） 早已司空见惯，但只要我们的付费数据是安全的，那就还算可以容忍。为此我将不得不每周花几个小时去做备份。

一天，我们的电脑中了毒，并且通过简单的方法无法清除。我们并不了解磁盘上的数据发生了些什么。当磁盘彻底挂掉后，我们插入了一周前的辅助备份磁盘，但是一周后它也挂了。我们的第二个备份直接拒绝启动。是时候寻求专业帮助了，所以我们把电脑送到一家靠谱的维修店。两天以后，我们被告知一些恶意软件或病毒已经将某些种类的文件擦除殆尽，其中包括我们的付费数据。

这是对我妻子的商业计划的一个巨大的打击，同时意味着丢失合同并耽误了账单。我曾短期出国工作，并在台湾的 [Computex 2004](https://en.wikipedia.org/wiki/Computex_Taipei) 购买了我的第一台笔记本电脑。 预装的是 Windows XP，但我还是想换成 Linux。 我知道 Linux 已经为桌面端做好了准备，[Mandrake Linux](https://en.wikipedia.org/wiki/Mandriva_Linux) （曼德拉草） 是一个很不错的选择。 我第一次安装就很顺利。所有工作都执行的非常漂亮。我使用 [OpenOffice](http://www.openoffice.org/) 来满足我写作，演示文稿和电子表格的需求。

我们为我们的计算机买了新的硬盘驱动器，并为其安装了 Mandrake Linux。用 OpenOffice 替换了 Microsoft Office。 我们依靠 Web 邮件来满足邮件需求，并在 2004 年的 11 月迎来了 [Mozilla Firefox](https://www.mozilla.org/en-US/firefox/new/)。我的妻子马上从中看到了好处，因为没有崩溃或病毒/恶意软件感染！更重要的是，我们告别了困扰 Windows 98 和 XP 的频繁崩溃问题。 她一直使用这个发行版。

而我，开始尝试其他的发行版。 我爱上了 distro-hopping （LCTT 译注：指在不同版本的 Linux 发行版之间频繁切换的 Linux 用户）和第一时间尝试新发行版的感觉。我也经常会在 Apache 和 NGINX 上尝试和测试 Web 应用程序，如 Drupal、Joomla 和 WordPress。现在我们 2006 年出生的儿子，在 Linux 下成长。 也对 Tux Paint，Gcompris 和 SMPlayer 非常满意。

---

via: <https://opensource.com/life/16/3/my-linux-story-soumya-sarkar>

作者：[Soumya Sarkar](https://opensource.com/users/ssarkarhyd) 译者：[martin2011qi](https://github.com/martin2011qi) 校对：[wxy](https://github.com/wxy)


怎样用 Tar 和 OpenSSL 给文件和目录加密及解密

杀鸡焉用牛刀，用 7z 会方便的多。

嗯，我也是喜欢用7z，很方便

7z -p123 -mhe -mx0 a test.7z a.txt

-p 123 密码

-mx 0 压缩级别：仅储存

不过话说回来，在安装或编译包受限的环境这不失为一种加密方法。<br />
P.S. 我在 Windows 中也利用类似的方法，使用本来用于数字证书方面的命令 certutil 实现对任意文件的 base64 编码/解码。这个命令其实主要是用在域控环境中，Workstation 上用途则受限制。

certuitl -encode demo.7z txt

type txt | clip

用这个命令可以方便的将几十 MiB 的二进制文件转换为文本文件，通过剪贴板经由 RDP 远程桌面协议复制到其他机器上。

sed '1d;$d' txt | base64 --decode

sed '1d;$d' txt | base64 --decode | xxd

在 linux 下的解码。 注意第一个命令组合没有考虑文字编码。

当你有重要的敏感数据的时候，给你的文件和目录额外加一层保护是至关重要的，特别是当你需要通过网络与他人传输数据的时候。

由于这个原因，我在寻找一个可疑在 Linux 上加密及解密文件和目录的实用程序，幸运的是我找到了一个用 tar（Linux 的一个压缩打包工具）和 OpenSSL 来解决的方案。借助这两个工具，你真的可以毫不费力地创建和加密 tar 归档文件。

![](/data/attachment/album/201611/10/180146b03p0ddq0pc9ipx3.jpg)

在这篇文章中，我们将了解如何使用 OpenSSL 创建和加密 tar 或 gz（gzip，另一种压缩文件）归档文件：

牢记使用 OpenSSL 的常规方式是：

```
# openssl command command-options arguments

```

### 在 Linux 中加密文件

要加密当前工作目录的内容（根据文件的大小，这可能需要一点时间）：

```
# tar -czf - * | openssl enc -e -aes256 -out secured.tar.gz

```

上述命令的解释：

1. `enc` - openssl 命令使用加密进行编码
2. `-e` – 用来加密输入文件的 `enc` 命令选项，这里是指前一个 tar 命令的输出
3. `-aes256` – 加密用的算法
4. `-out` – 用于指定输出文件名的 `enc` 命令选项，这里文件名是 `secured.tar.gz`

### 在 Linux 中解密文件

要解密上述 tar 归档内容，使用以下命令。

```
# openssl enc -d -aes256 -in secured.tar.gz | tar xz -C test

```

上述命令的解释：

1. `-d` – 用于解密文件
2. `-C` – 提取内容到 `test` 子目录

下图展示了加解密过程，以及当你尝试执行以下操作时会发生什么：

1. 以传统方式提取 tar 包的内容
2. 使用了错误的密码的时候
3. 当你输入正确的密码的时候

![在 Linux 中加密和解密 Tar 归档文件](/data/attachment/album/201611/10/180159fz5mmdqtesh33m3q.png)

*在 Linux 中加密和解密 Tar 归档文件*

当你在本地网络或因特网工作的时候，你可以随时通过加密来保护你和他人共享的重要文本或文件，这有助于降低将其暴露给恶意攻击者的风险。

我们研究了一种使用 OpenSSL（一个 openssl 命令行工具）加密 tar 包的简单技术，你可以参考它的<ruby> 手册页 <rp>  （ </rp> <rt>  man page </rt> <rp>  ） </rp></ruby>来获取更多信息和有用的命令。

---

via: <http://www.tecmint.com/encrypt-decrypt-files-tar-openssl-linux/>

作者：[Gabriel Cánepa](http://www.tecmint.com/author/gacanepa/) 译者：[OneNewLife](https://github.com/OneNewLife) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 下使用 TCP 封装器来加强网络服务安全

Summary: 你可以把这个工具看作是一个基于主机的访问控制列表，而且并不能作为你的系统的终极安全措施。通过使用一个防火墙和 TCP 封装器，而不是只偏爱其中的一个，你将会确保你的服务不会被出现单点故障。

不错，很有用

在这篇文章中，我们将会讲述什么是 <ruby> TCP 封装器 <rp>  （ </rp> <rt>  TCP wrappers </rt> <rp>  ） </rp></ruby>以及如何在一台 Linux 服务器上配置他们来[限制网络服务的权限](/article-7719-1.html)。在开始之前，我们必须澄清 TCP 封装器并不能消除对于正确[配置防火墙](/article-4425-1.html)的需要。

就这一点而言，你可以把这个工具看作是一个[基于主机的访问控制列表](/article-3966-1.html)，而且并不能作为你的系统的[终极安全措施](http://www.tecmint.com/linux-server-hardening-security-tips/)。通过使用一个防火墙和 TCP 封装器，而不是只偏爱其中的一个，你将会确保你的服务不会被出现单点故障。

![](/data/attachment/album/201611/11/102405n1zpux1ezn00q91u.jpg)

### 正确理解 hosts.allow 和 hosts.deny 文件

当一个网络请求到达你的主机的时候，TCP 封装器会使用 `hosts.allow` 和 `hosts.deny` （按照这样的顺序）来决定客户端是否应该被允许使用一个提供的服务。.

在默认情况下，这些文件内容是空的，或者被注释掉，或者根本不存在。所以，任何请求都会被允许通过 TCP 过滤器而且你的系统被置于依靠防火墙来提供所有的保护。因为这并不是我们想要的。由于在一开始我们就介绍过的原因，清确保下面两个文件都存在：

```
# ls -l /etc/hosts.allow /etc/hosts.deny

```

两个文件的编写语法规则是一样的：

```
<services> : <clients> [: <option1> : <option2> : ...]
```

在文件中，

1. `services` 指当前规则对应的服务，是一个逗号分割的列表。
2. `clients` 指被规则影响的主机名或者 IP 地址，逗号分割的。下面的通配符也可以接受：
	1. `ALL` 表示所有事物，应用于`clients`和`services`。
	2. `LOCAL` 表示匹配在正式域名中没有完全限定主机名（FQDN）的机器，例如 `localhost`。
	3. `KNOWN` 表示主机名，主机地址，或者用户是已知的（即可以通过 DNS 或其它服务解析到）。
	4. `UNKNOWN` 和 `KNOWN` 相反。
	5. `PARANOID` 如果进行反向 DNS 查找彼此返回了不同的地址，那么连接就会被断开（首先根据 IP 去解析主机名，然后根据主机名去获得 IP 地址）。
3. 最后，一个冒号分割的动作列表表示了当一个规则被触发的时候会采取什么操作。

你应该记住 `/etc/hosts.allow` 文件中允许一个服务接入的规则要优先于 `/etc/hosts.deny` 中的规则。另外还有，如果两个规则应用于同一个服务，只有第一个规则会被纳入考虑。

不幸的是，不是所有的网络服务都支持 TCP 过滤器，为了查看一个给定的服务是否支持他们，可以执行以下命令：

```
# ldd /path/to/binary | grep libwrap
```

如果以上命令执行以后得到了以下结果，那么它就可以支持 TCP 过滤器，`sshd` 和 `vsftpd` 作为例子，输出如下所示。

![Find Supported Services in TCP Wrapper](/data/attachment/album/201611/11/102419o0r0kzmn82oh8zil.png)

*查找 TCP 过滤器支持的服务*

### 如何使用 TCP 过滤器来限制服务的权限

当你编辑 `/etc/hosts.allow` 和 `/etc/hosts.deny` 的时候，确保你在最后一个非空行后面通过回车键来添加一个新的行。

为了使得 [SSH 和 FTP](http://www.tecmint.com/block-ssh-and-ftp-access-to-specific-ip-and-network-range/) 服务只允许 `localhost` 和 `192.168.0.102` 并且拒绝所有其他用户，在 `/etc/hosts.deny` 添加如下内容：

```
sshd,vsftpd : ALL
ALL : ALL
```

而且在 `/etc/hosts.allow` 文件中添加如下内容：

```
sshd,vsftpd : 192.168.0.102,LOCAL

```

这些更改会立刻生效并且不需要重新启动。

在下图中你会看到，在最后一行中删掉 `LOCAL` 后，FTP 服务器会对于 `localhost` 不可用。在我们添加了通配符以后，服务又变得可用了。

![确认 FTP 权限 ](/data/attachment/album/201611/11/102419y5ap6tae6wpptn8p.png)

*确认 FTP 权限*

为了允许所有服务对于主机名中含有 `example.com` 都可用，在 `hosts.allow` 中添加如下一行：

```
ALL : .example.com

```

而为了禁止 `10.0.1.0/24` 的机器访问 `vsftpd` 服务，在 `hosts.deny` 文件中添加如下一行：

```
vsftpd : 10.0.1.

```

在最后的两个例子中，注意到客户端列表每行开头和结尾的**点**。这是用来表示 “所有名字或者 IP 中含有那个字符串的主机或客户端”

这篇文章对你有用吗？你有什么问题或者评论吗？请你尽情在下面留言交流。

---

via: <http://www.tecmint.com/secure-linux-tcp-wrappers-hosts-allow-deny-restrict-access/>

作者：[Gabriel Cánepa](http://www.tecmint.com/author/gacanepa/) 译者：[LinuxBars](https://linuxbar.org/) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


拥有开源项目部门的公司可以从四个方面获益

Summary: 在我的第一篇关于开源项目部门的系列文章中，我深入剖析了什么是开源项目部门，为什么你的公司需要一个开源项目部门。接着我又说到了谷歌是如何创建一种新的开源项目部门的。而这篇文章，我将阐述拥有一个开源项目部门的好处。

可以向360学习啊，免费的逼死一大票收费的

收费才是正常的盈利模式。钱是第一生产力。[无奈]

![](/data/attachment/album/201611/11/124802k437372f00fg23ue.png)

在我的第一篇关于<ruby> 开源项目部门 <rp>  （ </rp> <rt>  program office </rt> <rp>  ） </rp></ruby>的系列文章中，我深入剖析了[什么是开源项目部门，为什么你的公司需要一个开源项目部门](https://opensource.com/business/16/5/whats-open-source-program-office)。接着我又说到了[谷歌是如何创建一种新的开源项目部门的](https://opensource.com/business/16/8/google-open-source-program-office)。而这篇文章，我将阐述拥有一个开源项目部门的好处。

乍一看，非软件开发公司会更加热情的去拥抱开源项目部门的一个重要原因是他们并没有什么损失。毕竟，他们并不需要依靠这些软件产品来获得收益。比如，Facebook 可以很轻易的释放出一个 “分布式键值数据存储” 作为开源项目，是因为他们并没有售卖一个叫做 “企业级键值数据存储” 的产品。这回答了关于风险的问题，但是并没有回答他们如何通过向开源生态共献代码而获益的问题。让我们逐个来推测和探讨其中可能的原因。你会发现开源项目供应商的许多动机都是相同的，但是也有些许不同。

### 招聘

招聘可能是一个将开源项目部门推销给上层管理部门的最容易方法。向他们展示与招聘相关的成本，以及投资回报率，然后解释如何与天才工程师发展关系，从而与那些对这些项目感兴趣并且十分乐意在其中工作的天才开发者们建立联系。不需要我多说了，你懂的！

### 技术影响

曾几何时，那些没有专门从事软件销售的公司是难以直接对他们软件供应商的开发周期施加影响力的，尤其当他们并不是一个大客户时。开源完全改变了这一点，它将用户与供应商放在了一个更公平的竞争环境中。随着开源开发的兴起，任何人，假如他们愿意投入时间和资源的话，都可以将技术推向一个选定的方向。但是这些公司发现，虽然将投资用于开发上会带来丰硕的成果，但是总体战略的努力却更加有效——对比一下 bug 的修复和软件的构建——大多数公司都将 bug 的修复推给上游的开源项目，但是一些公司开始认识到通过更深层次的回报承诺和更快的功能开发来协调持久的工作，将会更有利于业务。通过开源项目部门模式，公司的职员能够从开源社区中准确嗅出战略重心，然后投入开发资源。

对于快速增长的公司，如 Google 和 Facebook，其对现有的开源项目提供的领导力仍然不足以满足业务的膨胀。面对激烈的增长和建立超大规模系统所带来的挑战，许多大型企业开始构建仅供内部使用的高度定制的软件栈。除非他们能说服别人在一些基础设施项目上达成合作。因此，虽然他们保持在诸如 Linux 内核，Apache 和其他现有项目领域的投资，他们也开始推出自己的大型项目。Facebook 发布了 Cassandra，Twitter 创造了 Mesos，并且甚至谷歌也创建了 Kubernetes 项目。这些项目已成为行业创新的主要平台，证实了该举措是相关公司引人注目的成功。（请注意，Facebook 在它需要创造一个新软件项目来解决更大规模的问题之后，已经在内部停止使用 Cassandra 了，但是，这时 Cassandra 已经变得流行，而 DataStax 公司接过了开发任务）。所有这些项目已经促使了开发商、相关的项目、以及最终用户构成的整个生态加速增长和发展。

没有与公司战略举措取得一致的开源项目部门不可能成功的。不这样做的话，这些公司依然会试图单独地解决这些问题，而且更慢。不仅拥有这些项目可以帮助内部解决业务问题，它们也帮助这些公司逐渐成为行业巨头。当然，谷歌成为行业巨头好多年了，但是 Kubernetes 的发展确保了软件的质量，并且在容器技术未来的发展方向上有着直接的话语权，并且远超之前就有的话语权。这些公司目前还是闻名于他们超大规模的基础设施和硅谷的中坚份子。鲜为人知，但是更为重要的是它们与技术生产人员的亲密度。开源项目部门凭借技术建议和与有影响力的开发者的关系，再加上在社区治理和人员管理方面深厚的专业知识来引领这些工作，并最大限度地发挥其影响力，

### 市场营销能力

与技术的影响齐头并进的是每个公司谈论他们在开源方面的努力。通过传播这些与项目和社区有关的消息，一个开源项目部门能够通过有针对性的营销活动来提供最大的影响。营销在开放源码领域一直是一个肮脏的词汇，因为每个人都有一个由企业营销造成的糟糕的经历。在开源社区中，营销呈现出一种与传统方法截然不同的形式，它会更注重于我们的社区已经在战略方向上做了什么。因此，一个开源项目部门不可能去宣传一些根本还没有发布任何代码的项目，但是他们会讨论他们创造什么软件和参与了其他什么举措。基本上，不会有“雾件（vaporware）”。

想想谷歌的开源项目部门作出的第一份工作。他们不只是简单的贡献代码给 Linux 内核或其他项目，他们更多的是谈论它，并经常在开源会议主题演讲。他们不仅仅是把钱给写开源代码的代码的学生，他们还创建了一个全球计划——“Google Summer of Code”，现在已经成为一种开源发展的文化试金石。这些市场营销的作用在 Kubernetes 开发完成之前就奠定了谷歌在开源世界巨头的地位。最终使得，谷歌在创建 GPLv3 授权协议期间拥有重要影响力，并且在科技活动中公司的发言人和开源项目部门的代表人成为了主要人物。开源项目部门是协调这些工作的最好的实体，并可以为母公司提供真正的价值。

### 改善内部流程

改善内部流程听起来不像一个大好处，但克服混乱的内部流程对于每一个开源项目部门都是一个挑战，不论是对软件供应商还是公司内的部门。而软件供应商必须确保他们的流程不与他们发布的产品重叠（例如，不小心开源了他们的商业售卖软件），用户更关心的是侵犯了知识产权（IP）法：专利、版权和商标。没有人想只是因为释放软件而被起诉。没有一个活跃的开源项目部门去管理和协调这些许可和其他法律问题的话，大公司在开源流程和管理上会面临着巨大的困难。为什么这个很重要呢？如果不同的团队释放的软件是在不兼容的许可证下，那么这不仅是一个坑爹的尴尬，它还将对实现最基本的目标改良协作产生巨大的障碍。

考虑到还有许多这样的公司仍在飞快的增长，如果无法建立基本流程规则的话，将可以预见到它们将会遇到阻力。我见过一个罗列着批准、未经批准的许可证的巨大的电子表格，以及指导如何（或如何不）创建开源社区而遵守法律限制。关键是当开发者需要做出决定时要有一个可以依据的东西，并且每次当开发人员想要为一个开源社区贡献代码时，可以不产生大量的法律开销，和效率低下的知识产权检查。

有一个活跃的开放源码项目部门，负责维护许可规则和源的贡献，以及建立培训项目工程师，有助于避免潜在的法律缺陷和昂贵的诉讼。毕竟，良好的开源项目合作可以减少由于某人没有看许可证而导致公司赔钱这样的事件。好消息是，公司已经可以较少的担心关于专有的知识产权与软件供应商冲突的事。坏消息是，它们的法律问题不够复杂，尤其是当他们需要直接面对软件供应商的阻力时。

你的组织是如何受益于拥有一个开源项目部门的？可以在评论中与我们分享。

*本文作者 John Mark Walker 是 Dell EMC 的产品管理总监，负责管理 ViPR 控制器产品及 CoprHD 开源社区。他领导过包括 ManageIQ 在内的许多开源社区。*

---

via: <https://opensource.com/business/16/9/4-big-ways-companies-benefit-having-open-source-program-offices>

作者：[John Mark Walker](https://opensource.com/users/johnmark) 译者：[chao-zhi](https://github.com/chao-zhi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


轻轻几个点击，在 AWS 和 Azure 上搭建 Docker 数据中心

通过几个点击即可在 “AWS 快速起步”和“Azure 市场”上高效搭建产品级 Docker 数据中心。

通过 AWS 快速起步的 CloudFormation 模板和在 Azure 市场上的预编译模板来部署 Docker 数据中心使得比以往在公有云基础设施下的部署企业级的 CaaS Docker 环境更加容易。

Docker 数据中心 CaaS 平台为各种规模的企业的敏捷应用部署提供了容器和集群的编排和管理，使之更简单、安全和可伸缩。使用新为 Docker 数据中心预编译的云模板，开发者和 IT 运维人员可以无缝的把容器化的应用迁移到亚马逊 EC2 或者微软的 Azure 环境而无需修改任何代码。现在，企业可以快速实现更高的计算和运营效率，可以通过短短几步操作实现支持 Docker 的容器管理和编排。

![](/data/attachment/album/201611/11/180127d5eyx3ep59e1lvks.png)

### 什么是 Docker 数据中心？

Docker 数据中心包括了 <ruby> Docker 通用控制面板 <rp>  （ </rp> <rt>  Docker Universal Control Plane </rt> <rp>  ） </rp></ruby>（UCP），<ruby> Docker 可信注册库 <rp>  （ </rp> <rt>  Docker Trusted Registry </rt> <rp>  ） </rp></ruby>（UTR）和<ruby> 商用版 Docker 引擎 <rp>  （ </rp> <rt>  CS Docker Engine </rt> <rp>  ） </rp></ruby>，并带有与客户的应用服务等级协议相匹配的商业支持服务。

* Docker 通用控制面板（UCP），一种企业级的集群管理方案，帮助客户通过单个管理面板管理整个集群
* Docker 可信注册库（DTR）， 一种镜像存储管理方案，帮助客户安全存储和管理 Docker 镜像
* 商用版的 Docker 引擎

![](/data/attachment/album/201611/11/180240u541ohms1ywhsmh3.png)

### 在 AWS 上快速布置 Docker 数据中心

秉承 Docker 与 AWS 最佳实践，参照 AWS 快速起步教程来，你可以在 AWS 云上快速部署 Docker 容器。Docker 数据中心快速起步基于模块化和可定制的 CloudFormation 模板，客户可以在其之上增加额外功能或者为自己的 Docker 部署修改模板。

* [AWS 的 Docker 数据中心应用说明](https://youtu.be/aUx7ZdFSkXU)

#### 架构

![](/data/attachment/album/201611/11/180216o50xqa0gqzemhehf.png)

AWS Cloudformation 的安装过程始于创建 AWS 资源，这些 AWS 需要的资源包括：VPC、安全组、公有与私有子网、因特网网关、NAT 网关与 S3 bucket。

然后，AWS Cloudformation 启动第一个 UCP 控制器实例，紧接着，安装 Docker 引擎和 UCP 容器。它把第一个 UCP 控制器创建的根证书备份到 S3。一旦第一个 UCP 控制器成功运行，其他 UCP 控制器、UCP 集群节点和第一个 DTR 复制的进程就会被触发。和第一个 UCP 控制器节点类似，其他所有节点创建进程也都由商用版 Docker 引擎开始，然后安装并运行 UCP 和 DTR 容器以加入集群。两个弹性负载均衡器（ELB），一个分配给 UCP，另外一个为 DTR 服务，它们启动并自动完成配置来在两个可用区（AZ）之间提供弹性负载均衡。

除这些之外，如有需要，UCP 控制器和节点在 ASG 中启动并提供扩展功能。这种架构确保 UCP 和 DTR 两者都部署在两个 AZ 上以增强弹性与高可靠性。在公有或者私有 HostedZone 上，Route53 用来动态注册或者配置 UCP 和 DTR。

![](/data/attachment/album/201611/11/180217rxhxqyhuxzlaqq38.png)

#### 快速起步模板的核心功能如下：

* 创建 VPC、不同 AZ 上的私有和公有子网、ELB、NAT 网关、因特网网关、自动伸缩组，它们全部基于 AWS 最佳实践
* 为 DDC 创建一个 S3 bucket，其用于证书备份和 DTR 映像存储（DTR 需要额外配置）
* 在客户的 VPC 范畴，跨多 AZ 部署 3 个 UCP 控制器
* 创建预配置正常检测的 UCP ELB
* 创建一个 DNS 记录并关联到 UCP ELB
* 创建可伸缩的 UCP 节点集群
* 在 VPC 范畴内，跨多 AZ 创建 3 个 DTR 副本
* 创建一个预配置正常检测的 DTR
* 创建一个 DNS 记录，并关联到 DTR ELB

* [下载 AWS 快速指南](https://s3.amazonaws.com/quickstart-reference/docker/latest/doc/docker-datacenter-on-the-aws-cloud.pdf)

### 在 AWS 使用 Docker 数据中心

1. 登录 [Docker Store](https://store.docker.com/login?next=%2Fbundles%2Fdocker-datacenter%2Fpurchase?plan=free-trial) 获取 [30 天免费试用](https://store.docker.com/login?next=%2Fbundles%2Fdocker-datacenter%2Fpurchase?plan=free-trial)或者[联系销售](https://goto.docker.com/contact-us.html)
2. 确认之后，看到提示“Launch Stack”后，客户会被重定向到 AWS Cloudformation 入口
3. 确认启动 Docker 的 AWS 区域
4. 提供启动参数
5. 确认并启动
6. 启动完成之后，点击输出标签可以看到 UCP/DTR 的 URL、缺省用户名、密码和 S3 bucket 的名称

* [Docker 数据中心需要 2000 美刀信用担保](https://aws.amazon.com/mp/contactdocker/)

### 在 Azure 使用 Azure 市场的预编译模板部署

在 Azure 市场上，Docker 数据中心是一个预先编译的模板，客户可以在 Azure 横跨全球的数据中心即起即用。客户可以根据自己需求从 Azure 提供的各种 VM 中选择适合自己的 VM 部署 Docker 数据中心。

#### 架构

![](/data/attachment/album/201611/11/180218hgnhr6ahrd6btcgc.png)

Azure 部署过程始于输入一些基本用户信息，如 ssh 登录的管理员用户名（系统级管理员）和资源组名称。你可以把资源组理解为一组有生命周期和部署边界的资源集合。你可以在这个链接了解更多关于资源组的信息：<http://azure.microsoft.com/en-us/documentation/articles/resource-group-overview/> 。

下一步，输入集群详细信息，包括：UCP 控制器 VM 大小、控制器个数（缺省为 3 个）、UCP 节点 VM 大小、UCP 节点个数（缺省 1，最大值为 10）、DTR 节点 VM 大小、DTR 节点个数、虚拟网络名和地址（例如：10.0.0.1/19）。关于网络，客户可以配置 2 个子网：第一个子网分配给 UCP 控制器 ，第二个分配给 DTC 和 UCP 节点。

最后，点击 OK 完成部署。对于小集群，服务开通需要大约 15-19 分钟，大集群更久些。

![](/data/attachment/album/201611/11/180220a4sq43o4411i1d44.png)

![](/data/attachment/album/201611/11/180221dmxr93c79zrs1cu1.png)

#### 如何在 Azure 部署

1. 注册 [Docker 数据中心 30 天试用](https://store.docker.com/login?next=%2Fbundles%2Fdocker-datacenter%2Fpurchase?plan=free-trial)许可或者[联系销售](https://goto.docker.com/contact-us.html)
2. [跳转到微软 Azure 市场的 Docker 数据中心](https://azure.microsoft.com/en-us/marketplace/partners/docker/dockerdatacenterdocker-datacenter/)
3. [查看部署文档](https://success.docker.com/Datacenter/Apply/Docker_Datacenter_on_Azure)

---

通过注册获取 Docker 数据中心许可证开始，然后你就能够通过 AWS 或者 Azure 模板搭建自己的数据中心。

* [获取 30 天试用许可证](http://www.docker.com/trial)
* [通过视频理解 Docker 数据中心架构](https://www.youtube.com/playlist?list=PLkA60AVN3hh8tFH7xzI5Y-vP48wUiuXfH)
* [观看演示视频](https://www.youtube.com/playlist?list=PLkA60AVN3hh8a8JaIOA5Q757KiqEjPKWr)
* [获取 AWS 提供的部署 Docker 数据中心的 75 美元红包奖励](https://aws.amazon.com/quickstart/promo/)

了解有关 Docker 的更多信息：

* 初识 Docker? 尝试一下 10 分钟[在线学习课程](https://docs.docker.com/engine/understanding-docker/)
* 分享镜像，自动构建，或用一个[免费的 Docker Hub 账号](https://hub.docker.com/)尝试更多
* 阅读 [Docker 1.12 发行说明](https://docs.docker.com/release-notes/)
* 订阅 [Docker Weekly](https://www.docker.com/subscribe_newsletter/)
* 报名参加即将到来的 [Docker Online Meetups](http://www.meetup.com/Docker-Online-Meetup/)
* 参加即将发生的 [Docker Meetups](https://www.docker.com/community/meetup-groups)
* 观看 [DockerCon EU2015](https://www.youtube.com/playlist?list=PLkA60AVN3hh87OoVra6MHf2L4UR9xwJkv)视频
* 开始为 [Docker](https://docs.docker.com/contributing/contributing/) 贡献力量

---

via: <https://blog.docker.com/2016/06/docker-datacenter-aws-azure-cloud/>

作者：[Trisha McCanna](https://blog.docker.com/author/trisha/) 译者：[firstadream](https://github.com/firstadream) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


98% 的开发者在工作中使用了开源软件

Summary: Git 仓库管理软件 GitLab 进行了一项调查披露了一些关于开源接受度的有趣事实。针对开发人员群体的调查表明 98% 的开发者更喜欢在工作中使用开源。

很显然，参与这份调查的51%的人是前端，整天就知道在网上瞎转悠

不科学，竟然没有C/C++

我很好奇，那2%完全不用开源软件的都是用的什么

MS or Oracle 全套？

不知道，我不是开发者

![developer using open source](/data/attachment/album/201611/12/163841xh9z0bclexlpt0n0.jpg)

开源每天都会达到新的高度。但是一个新的研究表明超过 98% 的开发者在工作中使用开源工具。

Git 仓库管理软件 [GitLab](https://about.gitlab.com/2016/11/02/global-developer-survey-2016/) 进行了一项调查披露了一些关于开源接受度的有趣事实。针对开发人员群体的调查表明 98% 的开发者更喜欢在工作中使用开源，91% 选择在工作和个人项目中选择使用相同的开发工具。此外，92% 的人认为分布式版本控制系统（Git 仓库）在工作中很重要。

在所有的偏好编程语言中，JavaScript 占了 51% 的受访者比例。它后面是 Python、PHP、Java、Swift 和Objective-C。86% 的开发者认为安全是代码的主要判断标准。

GitLab 首席执行官兼联合创始人 Sid Sijbrandij 在一次声明中表示：“尽管过程驱动的开发技术在过去已经取得了成功，但开发人员正在寻找一种更自然的软件开发革新以促进项目生命周期内的协作和信息共享。”

这份报告来自 GitLab 在 7 月 6 日和 27 日之间对使用其存储库平台的 362 家初创企业和企业的 CTO、开发人员和 DevOps 专业人士的调查。

---

via: <http://opensourceforu.com/2016/11/98-percent-developers-use-open-source-at-work/>

作者：[JAGMEET SINGH](http://opensourceforu.com/author/jagmeet-singh/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


用 dpkg 命令在 Debian 系的 Linux系统中管理软件包

Summary: dpkg 是一个可以安装、构建、删除及管理 Debian 软件包的命令行工具。

红帽系对应的是 rpm。

dpkg -l | grep linux-image

先列出所有已安裝packages然後再用grep擷取關鍵詞

gdebi path-to-.deb-file

命令列安裝.deb檔案

gdebi-gtk path-to-.deb-file

GUI安裝.deb檔案

dpkg 是一个可以安装、构建、删除及管理 Debian 软件包的命令行工具。

[dpkg](https://wiki.debian.org/Teams/Dpkg) 意即 <ruby> Debian 包管理器 <rp>  （ </rp> <rt>  Debian PacKaGe manager </rt> <rp>  ） </rp></ruby>。dpkg 是一个可以安装、构建、删除及管理 Debian 软件包的命令行工具。dpkg 将 Aptitude（首选而更用户友好）作为执行所有操作的前端界面。

![](/data/attachment/album/201611/12/174052l7qt9x7pbx1zbrox.jpg)

其它的一些工具如 dpkg-deb 和 dpkg-query 等也使用 dpkg 作为执行某些操作的前端。

现在大多数系统管理员使用 Apt、[Apt-Get](http://www.2daygeek.com/apt-get-apt-cache-command-examples/) 及 Aptitude 等工具，不用费心就可以轻松地管理软件。

尽管如此，必要的时候还是需要用 dpkg 来安装某些软件。其它的一些在 Linux 系统上广泛使用的包管理工具还有 [yum](/article-2272-1.html)、[dnf](/article-5718-1.html)、[apt-get](/article-4933-1.html)、[rpm](/article-7455-1.html)、[Zypper](/article-5606-1.html)、pacman、urpmi 等等。

现在，我要在装有 Ubuntu 15.10 的机器上用一些实例讲解最常用的 dpkg 命令。

### 1) dpkg 常见命令的语法及 dpkg 文件位置

下面是 dpkg 常见命令的语法及 dpkg 相关文件的位置，如果想深入了解，这些对你肯定大有益处。

```
### dpkg 命令的语法
$ dpkg -[command] [.deb package name]

$ dpkg -[command] [package name]

### dpkg 相关文件的位置
$ /var/lib/dpkg

### 这个文件包含了被 dpkg 命令（install、remove 等）所修改的包的信息
$ /var/lib/dpkg/status

### 这个文件包含了可用包的列表
$ /var/lib/dpkg/status

```

### 2) 安装/升级软件

在基于 Debian 的系统里，比如 Debian、Mint、Ubuntu 和 elementryOS，用以下命令来安装/升级 .deb 软件包。这里我要用 `atom-amd64.deb` 文件安装 Atom。要是已经安装了 Atom，就会升级它。要么就会安装一个新的 Atom。

```
### 安装或升级 dpkg 软件包
$ sudo dpkg -i atom-amd64.deb
Selecting previously unselected package atom.
(Reading database ... 426102 files and directories currently installed.)
Preparing to unpack atom-amd64.deb ...
Unpacking atom (1.5.3) over (1.5.3) ...
Setting up atom (1.5.3) ...
Processing triggers for gnome-menus (3.13.3-6ubuntu1) ...
Processing triggers for bamfdaemon (0.5.2~bzr0+15.10.20150627.1-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Processing triggers for desktop-file-utils (0.22-1ubuntu3) ...
Processing triggers for mime-support (3.58ubuntu1) ...

```

### 3) 从文件夹里安装软件

在基于 Debian 的系统里，用下列命令从目录中逐个安装软件。这会安装 `/opt/software` 目录下的所有以 .deb 为后缀的软件。

```
$ sudo dpkg -iR /opt/software
Selecting previously unselected package atom.
(Reading database ... 423303 files and directories currently installed.)
Preparing to unpack /opt/software/atom-amd64.deb ...
Unpacking atom (1.5.3) ...
Setting up atom (1.5.3) ...
Processing triggers for gnome-menus (3.13.3-6ubuntu1) ...
Processing triggers for bamfdaemon (0.5.2~bzr0+15.10.20150627.1-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Processing triggers for desktop-file-utils (0.22-1ubuntu3) ...
Processing triggers for mime-support (3.58ubuntu1) ...
```

### 4) 显示已安装软件列表

以下命令可以列出 Debian 系的系统中所有已安装的软件，同时会显示软件版本和描述信息。

```
$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                        Version                            Architecture Description
+++-===========================-==================================-============-================================================================
ii  account-plugin-aim          3.12.10-0ubuntu2                   amd64        Messaging account plugin for AIM
ii  account-plugin-facebook     0.12+15.10.20150723-0ubuntu1       all          GNOME Control Center account plugin for single signon - facebook
ii  account-plugin-flickr       0.12+15.10.20150723-0ubuntu1       all          GNOME Control Center account plugin for single signon - flickr
ii  account-plugin-google       0.12+15.10.20150723-0ubuntu1       all          GNOME Control Center account plugin for single signon
ii  account-plugin-jabber       3.12.10-0ubuntu2                   amd64        Messaging account plugin for Jabber/XMPP
ii  account-plugin-salut        3.12.10-0ubuntu2                   amd64        Messaging account plugin for Local XMPP (Salut)
.
.

```

### 5) 查看指定的已安装软件

用以下命令列出指定的一个已安装软件，同时会显示软件版本和描述信息。

```
$ dpkg -l atom
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name       Version   Architecture        Description
+++-==========-=========-===================-============================================
ii  atom       1.5.3     amd64               A hackable text editor for the 21st Century.

```

### 6) 查看软件安装目录

以下命令可以在基于 Debian 的系统上查看软件的安装路径。

```
$ dpkg -L atom
/.
/usr
/usr/bin
/usr/bin/atom
/usr/share
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/atom
/usr/share/pixmaps
/usr/share/pixmaps/atom.png
/usr/share/doc

```

### 7) 查看 deb 包内容

下列命令可以查看 deb 包内容。它会显示 .deb 包中的一系列文件。

```
$ dpkg -c atom-amd64.deb
drwxr-xr-x root/root         0 2016-02-13 02:13 ./
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/bin/
-rwxr-xr-x root/root      3067 2016-02-13 02:13 ./usr/bin/atom
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/lintian/
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/lintian/overrides/
-rw-r--r-- root/root       299 2016-02-13 02:13 ./usr/share/lintian/overrides/atom
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/pixmaps/
-rw-r--r-- root/root    643183 2016-02-13 02:13 ./usr/share/pixmaps/atom.png
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/doc/
.
.
```

### 8) 显示软件的详细信息

以下命令可以显示软件的详细信息，如软件名、软件类别、版本、维护者、软件架构、依赖的软件、软件描述等等。

```
$ dpkg -s atom
Package: atom
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 213496
Maintainer: GitHub <atom@github.com>Architecture: amd64
Version: 1.5.3
Depends: git, gconf2, gconf-service, libgtk2.0-0, libudev0 | libudev1, libgcrypt11 | libgcrypt20, libnotify4, libxtst6, libnss3, python, gvfs-bin, xdg-utils, libcap2
Recommends: lsb-release
Suggests: libgnome-keyring0, gir1.2-gnomekeyring-1.0
Description: A hackable text editor for the 21st Century.
 Atom is a free and open source text editor that is modern, approachable, and hackable to the core.</atom@github.com>
```

### 9) 查看文件属于哪个软件

用以下命令来查看文件属于哪个软件。

```
$ dpkg -S /usr/bin/atom
atom: /usr/bin/atom

```

### 10) 移除/删除软件

以下命令可以用来移除/删除一个已经安装的软件，但不删除配置文件。

```
$ sudo dpkg -r atom
(Reading database ... 426404 files and directories currently installed.)
Removing atom (1.5.3) ...
Processing triggers for gnome-menus (3.13.3-6ubuntu1) ...
Processing triggers for bamfdaemon (0.5.2~bzr0+15.10.20150627.1-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Processing triggers for desktop-file-utils (0.22-1ubuntu3) ...
Processing triggers for mime-support (3.58ubuntu1) ...

```

### 11) 清除软件

以下命令可以用来移除/删除包括配置文件在内的所有文件。

```
$ sudo dpkg -P atom
(Reading database ... 426404 files and directories currently installed.)
Removing atom (1.5.3) ...
Processing triggers for gnome-menus (3.13.3-6ubuntu1) ...
Processing triggers for bamfdaemon (0.5.2~bzr0+15.10.20150627.1-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Processing triggers for desktop-file-utils (0.22-1ubuntu3) ...
Processing triggers for mime-support (3.58ubuntu1) ...

```

### 12) 了解更多

用以下命令来查看更多关于 dpkg 的信息。

```
$ dpkg -help
或
$ man dpkg

```

开始体验 dpkg 吧。

---

via: <http://www.2daygeek.com/dpkg-command-examples/>

作者：[MAGESH MARUTHAMUTHU](http://www.2daygeek.com/author/magesh/) 译者：[GitFuture](https://github.com/GitFuture) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


删除一个目录下部分类型之外的所有文件的三种方法

Summary: 我们将会向你展现如何通过 rm、 find 和 globignore 命令删除一个目录下除了指定文件扩展名或者类型的之外的文件。

顶起

xargs (1)            - build and execute command lines from standard input

有的时候，你可能会遇到这种情况，你需要删除一个目录下的所有文件，或者只是简单的通过删除除了一些指定类型（以指定扩展名结尾）之外的文件来清理一个目录。

在这篇文章，我们将会向你展现如何通过 `rm`、 `find` 和 `globignore` 命令删除一个目录下除了指定文件扩展名或者类型的之外的文件。

![](/data/attachment/album/201611/13/170813l8e9l278tqa2we2w.jpg)

在我们进一步深入之前，让我们开始简要的了解一下 Linux 中的一个重要的概念 —— 文件名模式匹配，它可以让我们解决眼前的问题。

在 Linux 下，一个 shell 模式是一个包含以下特殊字符的字符串，称为通配符或者元字符：

1. `*` – 匹配 0 个或者多个字符
2. `?` – 匹配任意单个字符
3. `[序列]` – 匹配序列中的任意一个字符
4. `[!序列]` – 匹配任意一个不在序列中的字符

我们将在这儿探索三种可能的办法，包括：

### 使用扩展模式匹配操作符删除文件

下来列出了不同的扩展模式匹配操作符，这些模式列表是一个用 `|` 分割包含一个或者多个文件名的列表：

1. `*(模式列表)` – 匹配 0 个或者多个出现的指定模式
2. `?(模式列表)` – 匹配 0 个或者 1 个出现的指定模式
3. `@(模式列表)` – 匹配 1 个或者多个出现的指定模式
4. `!(模式列表)` – 匹配除了一个指定模式之外的任何内容

为了使用它们，需要像下面一样打开 extglob shell 选项：

```
# shopt -s extglob

```

**1. 输入以下命令，删除一个目录下除了 filename 之外的所有文件**

```
$ rm -v !("filename")

```

![删除 Linux 下除了一个文件之外的所有文件](/data/attachment/album/201611/13/170829j9ezheet19q9e3eq.png)

*删除 Linux 下除了一个文件之外的所有文件*

**2. 删除除了 filename1 和 filename2 之外的所有文件**

```
$ rm -v !("filename1"|"filename2")

```

![在 Linux 下删除除了一些文件之外的所有文件](/data/attachment/album/201611/13/170830kbxc2b22jgagb2bj.png)

*在 Linux 下删除除了一些文件之外的所有文件*

**3. 下面的例子显示如何通过交互模式删除除了 `.zip` 之外的所有文件**

```
$ rm -i !(*.zip)

```

![在 Linux 下删除除了 Zip 文件之外的所有文件](/data/attachment/album/201611/13/170830dpaham5pphf6mdk7.png)

*在 Linux 下删除除了 Zip 文件之外的所有文件*

**4. 接下来，通过如下的方式你可以删除一个目录下除了所有的`.zip` 和 `.odt` 文件的所有文件，并且在删除的时候，显示正在删除的文件：**

```
$ rm -v !(*.zip|*.odt)

```

![删除除了指定文件扩展的所有文件](/data/attachment/album/201611/13/170830vk8nfm9dp3ncobfx.png)

*删除除了指定文件扩展的所有文件*

一旦你已经执行了所有需要的命令，你还可以使用如下的方式关闭 extglob shell 选项。

```
$ shopt -u extglob

```

### 使用 Linux 下的 find 命令删除文件

在这种方法下，我们可以[只使用 find 命令](http://www.tecmint.com/35-practical-examples-of-linux-find-command/)的适当的选项或者采用管道配合 `xargs` 命令，如下所示：

```
$ find /directory/ -type f -not -name 'PATTERN' -delete
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

```

**5. 下面的命令将会删除当前目录下除了 `.gz` 之外的所有文件**

```
$ find . -type f -not -name '*.gz' -delete

```

![find 命令 —— 删除 .gz 之外的所有文件](/data/attachment/album/201611/13/170831phk3zvvnvpnnkbkk.png)

*find 命令 —— 删除 .gz 之外的所有文件*

**6. 使用管道和 xargs，你可以通过如下的方式修改上面的例子：**

```
$ find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

```

![使用 find 和 xargs 命令删除文件](/data/attachment/album/201611/13/170831jv3qgi5oz35jmum4.png)

*使用 find 和 xargs 命令删除文件*

**7. 让我们看一个额外的例子，下面的命令行将会删除掉当前目录下除了 `.gz`、 `.odt` 和 `.jpg` 之外的所有文件：**

```
$ find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

```

![删除除了指定扩展文件的所有文件](/data/attachment/album/201611/13/170832nhod55zzo5002lbd.png)

*删除除了指定扩展文件的所有文件*

### 通过 bash 中的 GLOBIGNORE 变量删除文件

然而，最后的方法，只适用于 bash。 `GLOBIGNORE` 变量存储了一个<ruby> 路径名展开 <rp>  （ </rp> <rt>  pathname expansion </rt> <rp>  ） </rp></ruby>功能的忽略模式（或文件名）列表，以冒号分隔。

为了使用这种方法，切换到要删除文件的目录，像下面这样设置 `GLOBIGNORE` 变量：

```
$ cd test
$ GLOBIGNORE=*.odt:*.iso:*.txt

```

在这种情况下，除了 `.odt`、 `.iso` 和 `.txt` 之外的所有文件，都将从当前目录删除。

现在，运行如下的命令清空这个目录：

```
$ rm -v *

```

之后，关闭 `GLOBIGNORE` 变量：

```
$ unset GLOBIGNORE

```

![使用 bash 变量 GLOBIGNORE 删除文件](/data/attachment/album/201611/13/170832qevf33o6onytybhe.png)

*使用 bash 变量 GLOBIGNORE 删除文件*

注：为了理解上面的命令行采用的标识的意思，请参考我们在每一个插图中使用的命令对应的 man 手册。

就这些了！如果你知道有实现相同目录的其他命令行技术，不要忘了通过下面的反馈部分分享给我们。

---

via: <http://www.tecmint.com/delete-all-files-in-directory-except-one-few-file-extensions/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[yangmingming](https://github.com/yangmingming) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


2016 年 Linux 下五个最佳视频编辑软件

Summary: 如果你需要一个简单的视频编辑器，OpenShot、Kdenlive 和 Flowblade 是一个不错的选择。这些软件是适合初学者的，并且带有标准规范的系统。如果你有一个高性能的计算机，并且需要高级功能，你可以使用 Lightworks。如果你正在寻找更高级的功能， Blender 可以帮助你。

作者居然混淆了非线软件和3D软件,,,,

一声叹息....

还有Lightworks  真心不好用.......

还有shotcut也还不错~

还是Lightworks 好

Blender当然可以编辑视频，功能强大得很 。

Blender拿来处理视频很专业，我在Xubuntu中用的就是Blender

我个人感觉，相对Blender而言，Kdenlive、OpenShot、Shotcut、Flowblade Movie Editor就是玩具而已。

Lightworks我没用过，免费版功能很有限；付费升级成Lightworks Pro价格不菲。

喉，不才请教下大虾关于Blender的视频编辑

1.怎么在Blender视频编辑器的时间线上添加音频轨道或者视频轨道？是要转到序列编辑器？

2.怎么把一段视频的音频和视频分开？

3.怎么在两端视频之间做淡入淡出？

4.怎么裁切一段视频？比如把1280x720裁成1000x720，而不是缩放？

5.怎么导出webm？

6.怎么导入flv或f4v?

7.怎么在视频一角做动态马赛克效果？

本人小白，还望不吝赐教～拜谢

何必在这问这么多问题<br />
网上铺天盖地的教程你可以去看看

正是因为找不到教程，软件设置成了中文也还是不会用才请教高手的阿

![](/data/attachment/album/201611/14/085314z8tuetr20esqlnun.jpg)

概要: 在这篇文章中，Tiwo 讨论了 Linux 下最佳视频编辑器的优缺点和在基于 Ubuntu 的发行版中的安装方法。

在过去，我们已经在类似的文章中讨论了 [Linux 下最佳图像管理应用软件](/article-7462-1.html)，[Linux 上四个最佳的现代开源代码编辑器](/article-7468-1.html)。今天，我们来看看 Linux 下的最佳视频编辑软件。

当谈及免费的视频编辑软件，Windows Movie Maker 和 iMovie 是大多数人经常推荐的。

不幸的是，它们在 GNU/Linux 下都是不可用的。但是你不必担心这个，因为我们已经为你收集了一系列最佳的视频编辑器。

### Linux下最佳的视频编辑应用程序

接下来，让我们来看看 Linux 下排名前五的最佳视频编辑软件：

#### 1. Kdenlive

![](/data/attachment/album/201611/14/085331rthfq2wkbdtdvk30.jpg)

[Kdenlive](https://kdenlive.org/) 是一款来自于 KDE 的自由而开源的视频编辑软件，它提供双视频监视器、多轨时间轴、剪辑列表、可自定义的布局支持、基本效果和基本转换的功能。

它支持各种文件格式和各种摄像机和相机，包括低分辨率摄像机（Raw 和 AVI DV 编辑）：mpeg2、mpeg4 和 h264 AVCHD（小型摄像机和摄像机）；高分辨率摄像机文件，包括 HDV 和 AVCHD 摄像机；专业摄像机，包括 XDCAM-HD TM 流、IMX TM （D10）流、DVCAM（D10）、DVCAM、DVCPRO TM 、DVCPRO50 TM 流和 DNxHD TM 流等等。

你可以在命令行下运行下面的命令安装 :

```
sudo apt-get install kdenlive

```

或者，打开 Ubuntu 软件中心，然后搜索 Kdenlive。

#### 2. OpenShot

![](/data/attachment/album/201611/14/085400w16ll7lzjrnl1vn9.jpg)

[OpenShot](http://www.openshot.org/) 是我们这个 Linux 视频编辑软件列表中的第二选择。 OpenShot 可以帮助您创建支持过渡、效果、调整音频电平的电影，当然，它也支持大多数格式和编解码器。

您还可以将电影导出到 DVD，上传到 YouTube、Vimeo、Xbox 360 和许多其他常见的格式。 OpenShot 比 Kdenlive 更简单。 所以如果你需要一个简单界面的视频编辑器，OpenShot 会是一个不错的选择。

最新的版本是 2.0.7。您可以从终端窗口运行以下命令安装 OpenShot 视频编辑器：

```
sudo apt-get install openshot

```

它需要下载 25 MB，安装后需要 70 MB 硬盘空间。

#### 3. Flowblade Movie Editor

![](/data/attachment/album/201611/14/085421dor5vs0hiisizsv2.jpg)

[Flowblade Movie Editor](http://jliljebl.github.io/flowblade/) 是一个用于 Linux 的多轨非线性视频编辑器。它是自由而开源的。 它配备了一个时尚而现代的用户界面。

它是用 Python 编写的，旨在提供一个快速、精确的功能。 Flowblade 致力于在 Linux 和其他自由平台上提供最好的体验。 所以现在没有 Windows 和 OS X 版本。

要在 Ubuntu 和其他基于 Ubuntu 的系统上安装 Flowblade，请使用以下命令：

```
sudo apt-get install flowblade

```

#### 4. Lightworks

![](/data/attachment/album/201611/14/085449djoo0on96nd66z9s.jpg)

如果你要寻找一个有更多功能的视频编辑软件，这会是答案。 [Lightworks](https://www.lwks.com/) 是一个跨平台的专业的视频编辑器，在 Linux、Mac OS X 和 Windows 系统下都可用。

它是一个获奖的专业的[非线性编辑](https://en.wikipedia.org/wiki/Non-linear_editing_system)（NLE）软件，支持高达 4K 的分辨率以及标清和高清格式的视频。

该应用程序有两个版本：Lightworks 免费版和 Lightworks 专业版。不过免费版本不支持 Vimeo（H.264 / MPEG-4）和 YouTube（H.264 / MPEG-4） - 高达 2160p（4K UHD）、蓝光和 H.264 / MP4 导出选项，以及可配置的位速率设置，但是专业版本支持。

* Lightworks 免费版
* Lightworks 专业版

专业版本有更多的功能，例如更高的分辨率支持，4K 和蓝光支持等。

##### 怎么安装Lightworks？

不同于其他的视频编辑器，安装 Lightwork 不像运行单个命令那么直接。别担心，这不会很复杂。

* 第1步 – 你可以从 [Lightworks 下载页面](https://www.lwks.com/index.php?option=com_lwks&view=download&Itemid=206)下载安装包。这个安装包大约 79.5MB。*请注意：这里没有32 位 Linux 的支持。*
* 第2步 – 一旦下载，你可以使用 [Gdebi 软件包安装器](https://itsfoss.com/gdebi-default-ubuntu-software-center/)来安装。Gdebi 会自动下载依赖关系 : ![](/data/attachment/album/201611/14/085519zewfq4444hv4w4jf.jpg)
* 第3步 – 现在你可以从 Ubuntu 仪表板或您的 Linux 发行版菜单中打开它。
* 第4步 – 当你第一次使用它时，需要一个账号。点击 “Not Registerd?” 按钮来注册。别担心，它是免费的。
* 第5步 – 在你的账号通过验证后，就可以登录了。

现在，Lightworks 可以使用了。

需要 Lightworks 的视频教程？ 在 [Lightworks 视频教程页](https://www.lwks.com/videotutorials)得到它们。

#### 5. Blender

![](/data/attachment/album/201611/14/085626nb1v8zb7z81237t1.jpg)

Blender 是一个专业的，工业级的开源、跨平台的视频编辑器。在 3D 作品的制作中，是非常受欢迎的。 Blender 已被用于几部好莱坞电影的制作，包括蜘蛛侠系列。

虽然最初是设计用于制作 3D 模型，但它也可以用于各种格式的视频编辑和输入能力。 该视频编辑器包括：

* 实时预览、亮度波形、色度矢量示波器和直方图显示
* 音频混合、同步、擦除和波形可视化
* 多达 32 个插槽用于添加视频、图像、音频、场景、面具和效果
* 速度控制、调整图层、过渡、关键帧、过滤器等

最新的版本可以从 [Blender 下载页](https://www.blender.org/download/)下载.

### 哪一个是最好的视频编辑软件？

如果你需要一个简单的视频编辑器，OpenShot、Kdenlive 和 Flowblade 是一个不错的选择。这些软件是适合初学者的，并且带有标准规范的系统。

如果你有一个高性能的计算机，并且需要高级功能，你可以使用 Lightworks。如果你正在寻找更高级的功能， Blender 可以帮助你。

这就是我写的 5 个最佳的视频编辑软件，它们可以在 Ubuntu、Linux Mint、Elementary 和其他 Linux 发行版下使用。 请与我们分享您最喜欢的视频编辑器。

---

via: <https://itsfoss.com/best-video-editing-software-linux/>

作者：[Tiwo Satriatama](https://itsfoss.com/author/tiwo/) 译者：[DockerChen](https://github.com/DockerChen) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


为满足当今和未来 IT 需求，培训员工还是雇佣新人？

![](/data/attachment/album/201611/14/162557lqjbq5cybdmmjycd.png)

在数字化时代，由于 IT 工具不断更新，技术公司紧随其后，对 IT 技能的需求也不断变化。对于企业来说，寻找和雇佣那些拥有令人垂涎能力的创新人才，是非常不容易的。同时，培训内部员工来使他们接受新的技能和挑战，需要一定的时间，而时间要求常常是紧迫的。

[Sandy Hill](https://enterprisersproject.com/user/sandy-hill) 对 IT 涉及到的多项技术都很熟悉。她作为 [Pegasystems](https://www.pega.com/pega-can?&utm_source=google&utm_medium=cpc&utm_campaign=900.US.Evaluate&utm_term=pegasystems&gloc=9009726&utm_content=smAXuLA4U%7Cpcrid%7C102822102849%7Cpkw%7Cpegasystems%7Cpmt%7Ce%7Cpdv%7Cc%7C) 项目的 IT 总监，负责多个 IT 团队，从应用的部署到数据中心的运营都要涉及。更重要的是，Pegasystems 开发帮助销售、市场、服务以及运营团队流水化操作，以及客户联络的应用。这意味着她需要掌握使用 IT 内部资源的最佳方法，面对公司客户遇到的 IT 挑战。

![](/data/attachment/album/201611/14/162558pjzwfa35laa3kale.png)

**TEP（企业家项目）：这些年你是如何调整培训重心的？**

**Hill**：在过去的几年中，我们经历了爆炸式的发展，现在我们要实现更多的全球化进程。因此，培训目标是确保每个人都在同一起跑线上。

我们主要的关注点在培养员工使用新产品和工具上，这些新产品和工具能够推动创新，提高工作效率。例如，我们使用了之前没有的资产管理系统。因此我们需要为全部员工做培训，而不是雇佣那些已经知道该产品的人。当我们正在发展的时候，我们也试图保持紧张的预算和稳定的职员总数。所以，我们更愿意在内部培训而不是雇佣新人。

**TEP：说说培训方法吧，怎样帮助你的员工发展他们的技能？**

**Hill**：我要求每一位员工制定一个技术性的和非技术性的训练目标。这作为他们绩效评估的一部分。他们的技术性目标需要与他们的工作职能相符，非技术岗目标则随意，比如着重发展一项软技能，或是学一些专业领域之外的东西。我每年对职员进行一次评估，看看差距和不足之处，以使团队保持全面发展。

**TEP：你的训练计划能够在多大程度上减轻招聘工作量, 保持职员的稳定性？**

**Hill**：使我们的职员保持学习新技术的兴趣，可以让他们不断提高技能。让职员知道我们重视他们并且让他们在擅长的领域成长和发展，以此激励他们。

**TEP：你们发现哪些培训是最有效的？**

**HILL**：我们使用几种不同的培训方法，认为效果很好。对新的或特殊的项目，我们会由供应商提供培训课程，作为项目的一部分。要是这个方法不能实现，我们将进行脱产培训。我们也会购买一些在线的培训课程。我也鼓励职员每年参加至少一次会议，以了解行业的动向。

**TEP：哪些技能需求，更适合雇佣新人而不是培训现有员工？**

**Hill**：这和项目有关。最近有一个项目，需要使用 OpenStack，而我们根本没有这方面的专家。所以我们与一家从事这一领域的咨询公司合作。我们利用他们的专业人员运行该项目，并现场培训我们的内部团队成员。让内部员工学习他们需要的技能，同时还要完成他们的日常工作，是一项艰巨的任务。

顾问帮助我们确定我们需要的员工人数。这样我们就可以对员工进行评估，看是否存在缺口。如果存在人员上的缺口，我们还需要额外的培训或是员工招聘。我们也确实雇佣了一些合同工。另一个选择是对一些全职员工进行为期六至八周的培训，但我们的项目模式不容许这么做。

**TEP：最近雇佣的员工，他们的那些技能特别能够吸引到你？**

**Hill**：在最近的招聘中，我更看重软技能。除了扎实的技术能力外，他们需要能够在团队中进行有效的沟通和工作，要有说服他人，谈判和解决冲突的能力。

IT 人常常独来独往，不擅社交。然而如今IT 与整个组织结合越来越紧密，为其他业务部门提供有用的更新和状态报告的能力至关重要，可展示 IT 部门存在的重要性。

---

via: <https://enterprisersproject.com/article/2016/6/training-vs-hiring-meet-it-needs-today-and-tomorrow>

作者：[Paul Desmond](https://enterprisersproject.com/user/paul-desmond) 译者：[Cathon](https://github.com/Cathon) 校对：[jasminepeng](https://github.com/jasminepeng)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


宽松开源许可证的崛起意味着什么

Summary: 为什么像 GNU GPL 这样的限制性许可证越来越不受青睐。

GPL可以用隔离层隔离开来，就不用开源了

好东西为什么一定要开源： 第一：你的创造很可能被别人剽窃，而你却被埋没了。 第二，发布记录就是自己的成长记录。 第三，帮助自己找到更好的协作者和团队，而且是无成本的。 第四，你的发布将像生命一样进化

(⊙o⊙)…

不行的,除非你所谓的隔离层是单独的一个应用程序.

但99%可能用到的的GPL协议的库,这个有违你使用它的初衷.

你用到GPL的还得单独打包.

是可以用隔离层，将 GPL 代码封装起来，然后隔离层和你的程序采用 RPC、WS 等 API 方式来通讯。分发的时候，单独分发。<br />
Android 的 HAL 就是类似解决了 GPL 的传染性。

为什么像 GNU GPL 这样的限制性许可证越来越不受青睐。

为什么像 GNU GPL 这样的限制性许可证越来越不受青睐。

![](/data/attachment/album/201611/15/085553cywmkrlwnhztoml7.jpg)

“如果你用了任何开源软件， 那么你软件的其他部分也必须开源。” 这是微软前 CEO 巴尔默 2001 年说的， 尽管他说的不对， 还是引发了人们对自由软件的 FUD （<ruby> 恐惧， 不确定和怀疑 <rp>  （ </rp> <rt>  fear, uncertainty and doubt </rt> <rp>  ） </rp></ruby>）。 大概这才是他的意图。

对开源软件的这些 FUD 主要与开源许可有关。 现在有许多不同的许可证， 当中有些限制比其他的更严格（也有人称“更具保护性”）。 诸如 GNU 通用公共许可证 （GPL） 这样的限制性许可证使用了 copyleft 的概念。 copyleft 赋予人们自由发布软件副本和修改版的权力， 只要衍生工作保留同样的权力。 bash 和 GIMP 等开源项目就是使用了 GPL(v3)。 还有一个 AGPL（ Affero GPL） 许可证， 它为网络上的软件（如 web service）提供了 copyleft 许可。

这意味着， 如果你使用了这种许可的代码， 然后加入了你自己的专有代码， 那么在一些情况下， 整个代码， 包括你的代码也就遵从这种限制性开源许可证。 Ballmer 说的大概就是这类的许可证。

但宽松许可证不同。 比如， 只要保留版权声明和许可声明且不要求开发者承担责任， MIT 许可证允许任何人任意使用开源代码， 包括修改和出售。 另一个比较流行的宽松开源许可证是 Apache 许可证 2.0，它还包含了贡献者向用户提供专利授权相关的条款。 使用 MIT 许可证的有 JQuery、.NET Core 和 Rails ， 使用 Apache 许可证 2.0 的软件包括安卓， Apache 和 Swift。

两种许可证类型最终都是为了让软件更有用。 限制性许可证促进了参与和分享的开源理念， 使每一个人都能从软件中得到最大化的利益。 而宽松许可证通过允许人们任意使用软件来确保人们能从软件中得到最多的利益， 即使这意味着他们可以使用代码， 修改它， 据为己有，甚至以专有软件出售，而不做任何回报。

开源许可证管理公司黑鸭子软件的数据显示， 去年使用最多的开源许可证是限制性许可证 GPL 2.0，份额大约 25%。 宽松许可证 MIT 和 Apache 2.0 次之， 份额分别为 18% 和 16%， 再后面是 GPL 3.0, 份额大约 10%。 这样来看， 限制性许可证占 35%， 宽松许可证占 34%， 几乎是平手。

但这份当下的数据没有揭示发展趋势。黑鸭子软件的数据显示， 从 2009 年到 2015 年的六年间， MIT 许可证的份额上升了 15.7%， Apache 的份额上升了 12.4%。 在这段时期， GPL v2 和 v3 的份额惊人地下降了 21.4%。 换言之， 在这段时期里， 大量软件从限制性许可证转到宽松许可证。

这个趋势还在继续。 黑鸭子软件的[最新数据](https://www.blackducksoftware.com/top-open-source-licenses)显示， MIT 现在的份额为 26%， GPL v2 为 21%， Apache 2 为 16%， GPL v3 为 9%。 即 30% 的限制性许可证和 42% 的宽松许可证－－与前一年的 35% 的限制许可证和 34% 的宽松许可证相比， 发生了重大的转变。 对 GitHub 上使用许可证的[调查研究](https://github.com/blog/1964-open-source-license-usage-on-github-com)证实了这种转变。 它显示 MIT 以压倒性的 45% 占有率成为最流行的许可证， 与之相比， GPL v2 只有 13%， Apache 11%。

![](/data/attachment/album/201611/15/085606q6aspppp336pwg6a.jpg)

### 引领趋势

从限制性许可证到宽松许可证，这么大的转变背后是什么呢？ 是公司害怕如果使用了限制性许可证的软件，他们就会像巴尔默说的那样，失去自己私有软件的控制权了吗？ 事实上， 可能就是如此。 比如， Google 就[禁用了 Affero GPL 软件](http://www.theregister.co.uk/2011/03/31/google_on_open_source_licenses/)。

[Instructional Media + Magic](http://immagic.com/) 的主席 Jim Farmer， 是一个教育开源技术的开发者。 他认为很多公司为避免法律问题而不使用限制性许可证。 “问题就在于复杂性。 许可证的复杂性越高， 被他人因为某行为而告上法庭的可能性越高。 高复杂性更可能带来诉讼”， 他说。

他补充说， 这种对限制性许可证的恐惧正被律师们驱动着， 许多律师建议自己的客户使用 MIT 或 Apache 2.0 许可证的软件， 并明确反对使用 Affero 许可证的软件。

他说， 这会对软件开发者产生影响， 因为如果公司都避开限制性许可证软件的使用，开发者想要自己的软件被使用， 就更会把新的软件使用宽松许可证。

但 SalesAgility（开源 SuiteCRM 背后的公司）的 CEO Greg Soper 认为这种到宽松许可证的转变也是由一些开发者驱动的。 “看看像 Rocket.Chat 这样的应用。 开发者本可以选择 GPL 2.0 或 Affero 许可证， 但他们选择了宽松许可证，” 他说。 “这样可以给这个应用最大的机会， 因为专有软件厂商可以使用它， 不会伤害到他们的产品， 且不需要把他们的产品也使用开源许可证。 这样如果开发者想要让第三方应用使用他的应用的话， 他有理由选择宽松许可证。”

Soper 指出， 限制性许可证致力于帮助开源项目获得成功，方式是阻止开发者拿了别人的代码、做了修改，但不把结果回报给社区。 “Affero 许可证对我们的产品健康发展很重要， 因为如果有人利用了我们的代码开发，做得比我们好， 却又不把代码回报回来， 就会扼杀掉我们的产品，” 他说。 “ 对 Rocket.Chat 则不同， 因为如果它使用 Affero， 那么它会污染公司的知识产权， 所以公司不会使用它。 不同的许可证有不同的使用案例。”

曾在 Gnome、OpenOffice 工作过，现在是 LibreOffice 的开源开发者的 Michael Meeks 同意 Jim Farmer 的观点，认为许多公司确实出于对法律的担心，而选择使用宽松许可证的软件。 “copyleft 许可证有风险， 但同样也有巨大的益处。 遗憾的是人们都听从律师的， 而律师只是讲风险， 却从不告诉你有些事是安全的。”

巴尔默发表他的错误言论已经过去 15 年了， 但它产生的 FUD 还是有影响－－即使从限制性许可证到宽松许可证的转变并不是他的目的。

---

via: <http://www.cio.com/article/3120235/open-source-tools/what-the-rise-of-permissive-open-source-licenses-means.html>

作者：[Paul Rubens](http://www.cio.com/author/Paul-Rubens/) 译者：[willcoderwang](https://github.com/willcoderwang) 校对：[jasminepeng](https://github.com/jasminepeng)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Linux 中将文件编码转换为 UTF-8

经测试，windows notepad 保存的中文文件 (默认的ASCII码保存)，

在linux下使用 file -i 检测到为ISO-8859-1的编码，

但是如果直接使用 iconv -f ISO-8859-1 -t UTF-8 转换后仍然是乱码，

而指定为 -f GBK 或者 -f GB18030 或者 -f cp936 则都是可以成功转换的为中文显示；

那是因为这篇文章是外国人写的，他们的windows编码是8859-1

在这篇教程中，我们将解释字符编码的含义，然后给出一些使用命令行工具将使用某种字符编码的文件转化为另一种编码的例子。最后，我们将一起看一看如何在 Linux 下将使用各种字符编码的文件转化为 UTF-8 编码。

![](/data/attachment/album/201611/15/094212ozmfxgxmewtcz6at.png)

你可能已经知道，计算机除了二进制数据，是不会理解和存储字符、数字或者任何人类能够理解的东西的。一个二进制位只有两种可能的值，也就是 `0` 或 `1`，`真`或`假`，`是`或`否`。其它的任何事物，比如字符、数据和图片，必须要以二进制的形式来表现，以供计算机处理。

简单来说，字符编码是一种可以指示电脑来将原始的 0 和 1 解释成实际字符的方式，在这些字符编码中，字符都以一串数字来表示。

字符编码方案有很多种，比如 ASCII、ANCI、Unicode 等等。下面是 ASCII 编码的一个例子。

```
字符            二进制
A               01000001
B               01000010

```

在 Linux 中，命令行工具 `iconv` 用来将使用一种编码的文本转化为另一种编码。

你可以使用 `file` 命令，并添加 `-i` 或 `--mime` 参数来查看一个文件的字符编码，这个参数可以让程序像下面的例子一样输出字符串的 mime (Multipurpose Internet Mail Extensions) 数据：

```
$ file -i Car.java
$ file -i CarDriver.java

```

![在 Linux 中查看文件的编码](/data/attachment/album/201611/15/094225gn0z3fttp33bpzbc.png)

*在 Linux 中查看文件的编码*

iconv 工具的使用方法如下：

```
$ iconv option
$ iconv options -f from-encoding -t to-encoding inputfile(s) -o outputfile

```

在这里，`-f` 或 `--from-code` 表明了输入编码，而 `-t` 或 `--to-encoding` 指定了输出编码。

为了列出所有已有编码的字符集，你可以使用以下命令：

```
$ iconv -l

```

![列出所有已有编码字符集](/data/attachment/album/201611/15/094226dmn4vabfnovl9z54.png)

*列出所有已有编码字符集*

### 将文件从 ISO-8859-1 编码转换为 UTF-8 编码

下面，我们将学习如何将一种编码方案转换为另一种编码方案。下面的命令将会将 ISO-8859-1 编码转换为 UTF-8 编码。

考虑如下文件 `input.file`，其中包含这几个字符：

```
� � � �

```

我们从查看这个文件的编码开始，然后来查看文件内容。最后，我们可以把所有字符转换为 UTF-8 编码。

在运行 `iconv` 命令之后，我们可以像下面这样检查输出文件的内容，和它使用的字符编码。

```
$ file -i input.file
$ cat input.file
$ iconv -f ISO-8859-1 -t UTF-8//TRANSLIT input.file -o out.file
$ cat out.file
$ file -i out.file

```

![在 Linux 中将 ISO-8859-1 转化为 UTF-8](/data/attachment/album/201611/15/094226nzsi0ozr14dgc2oo.png)

*在 Linux 中将 ISO-8859-1 转化为 UTF-8*

注意：如果输出编码后面添加了 `//IGNORE` 字符串，那些不能被转换的字符将不会被转换，并且在转换后，程序会显示一条错误信息。

好，如果字符串 `//TRANSLIT` 被添加到了上面例子中的输出编码之后 (`UTF-8//TRANSLIT`)，待转换的字符会尽量采用形译原则。也就是说，如果某个字符在输出编码方案中不能被表示的话，它将会被替换为一个形状比较相似的字符。

而且，如果一个字符不在输出编码中，而且不能被形译，它将会在输出文件中被一个问号标记 `?` 代替。

### 将多个文件转换为 UTF-8 编码

回到我们的主题。如果你想将多个文件甚至某目录下所有文件转化为 UTF-8 编码，你可以像下面一样，编写一个简单的 shell 脚本，并将其命名为 `encoding.sh`：

```
#!/bin/bash
### 将 values_here 替换为输入编码
FROM_ENCODING="value_here"
### 输出编码 (UTF-8)
TO_ENCODING="UTF-8"
### 转换命令
CONVERT=" iconv  -f   $FROM_ENCODING  -t   $TO_ENCODING"
### 使用循环转换多个文件
for  file  in  *.txt; do
$CONVERT   "$file"   -o  "${file%.txt}.utf8.converted"
done
exit 0

```

保存文件，然后为它添加可执行权限。在待转换文件 (\*.txt) 所在的目录中运行这个脚本。

```
$ chmod  +x  encoding.sh
$ ./encoding.sh

```

重要事项：你也可以使这个脚本变得更通用，比如转换任意特定的字符编码到另一种编码。为了达到这个目的，你只需要改变 `FROM_ENCODING` 及 `TO_ENCODING` 变量的值。别忘了改一下输出文件的文件名 `"${file%.txt}.utf8.converted"`.

若要了解更多信息，可以查看 `iconv` 的<ruby> 手册页 <rp>  （ </rp> <rt>  man page </rt> <rp>  ） </rp></ruby>。

```
$ man iconv

```

将这篇指南总结一下，理解字符编码的概念、了解如何将一种编码方案转换为另一种，是一个电脑用户处理文本时必须要掌握的知识，程序员更甚。

最后，你可以在下面的评论部分中与我们联系，提出问题或反馈。

---

via: <http://www.tecmint.com/convert-files-to-utf-8-encoding-in-linux/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[StdioA](https://github.com/StdioA) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Kali Linux 下实战 Nmap（网络安全扫描器）

挺好的，有zmap的吗？

有的。 https://linux.cn/article-5860-1.html

不错，收藏了

挺好，分享了

good test weiba

学习一下

在这第二篇 Kali Linux 文章中, 将讨论称为 ‘[nmap](http://www.tecmint.com/nmap-command-examples/)‘ 的网络工具。虽然 nmap 不是 Kali 下唯一的一个工具，但它是最[有用的网络映射工具](http://www.tecmint.com/bcc-best-linux-performance-monitoring-tools/)之一。

* [第一部分-为初学者准备的 Kali Linux 安装指南](/article-7986-1.html)

![](/data/attachment/album/201611/16/111112g4gqrupqgqglzdsz.png)

Nmap， 是 Network Mapper 的缩写，由 Gordon Lyon 维护(更多关于 Mr. Lyon 的信息在这里: <http://insecure.org/fyodor/>) ，并被世界各地许多的安全专业人员使用。

这个工具在 Linux 和 Windows 下都能使用，并且是用命令行驱动的。相对于那些令人害怕的命令行，对于 nmap，在这里有一个美妙的图形化前端叫做 zenmap。

强烈建议个人去学习 nmap 的命令行版本，因为与图形化版本 zenmap 相比，它提供了更多的灵活性。

对服务器进行 nmap 扫描的目的是什么？很好的问题。Nmap 允许管理员快速彻底地了解网络上的系统，因此，它的名字叫 Network MAPper 或者 nmap。

Nmap 能够快速找到活动的主机和与该主机相关联的服务。Nmap 的功能还可以通过结合 Nmap 脚本引擎（通常缩写为 NSE）进一步被扩展。

这个脚本引擎允许管理员快速创建可用于确定其网络上是否存在新发现的漏洞的脚本。已经有许多脚本被开发出来并且包含在大多数的 nmap 安装中。

提醒一句 - 使用 nmap 的人既可能是善意的，也可能是恶意的。应该非常小心，确保你不要使用 nmap 对没有明确得到书面许可的系统进行扫描。请在使用 nmap 工具的时候注意！

#### 系统要求

1. [Kali Linux](/article-7986-1.html) (nmap 可以用于其他操作系统，并且功能也和这个指南里面讲的类似)。
2. 另一台计算机，并且装有 nmap 的计算机有权限扫描它 - 这通常很容易通过软件来实现，例如通过 [VirtualBox](http://www.tecmint.com/install-virtualbox-on-redhat-centos-fedora/) 创建虚拟机。
	1. 想要有一个好的机器来练习一下，可以了解一下 Metasploitable 2。
	2. 下载 MS2 ：[Metasploitable2](https://sourceforge.net/projects/metasploitable/files/Metasploitable2/)。
3. 一个可以工作的网络连接，或者是使用虚拟机就可以为这两台计算机建立有效的内部网络连接。

### Kali Linux – 使用 Nmap

使用 nmap 的第一步是登录 Kali Linux，如果需要，就启动一个图形会话（本系列的第一篇文章安装了 [Kali Linux 的 Enlightenment 桌面环境](/article-7986-1.html)）。

在安装过程中，安装程序将提示用户输入用来登录的“root”用户和密码。 一旦登录到 Kali Linux 机器，使用命令`startx`就可以启动 Enlightenment 桌面环境 - 值得注意的是 nmap 不需要运行桌面环境。

```
# startx

```

![Start Desktop Environment in Kali Linux](/data/attachment/album/201611/16/111159p8wiih2hrpr9bzwh.png)

*在 Kali Linux 中启动桌面环境*

一旦登录到 Enlightenment，将需要打开终端窗口。通过点击桌面背景，将会出现一个菜单。导航到终端可以进行如下操作：应用程序 -> 系统 -> 'Xterm' 或 'UXterm' 或 '根终端'。

作者是名为 '[Terminator](http://www.tecmint.com/terminator-a-linux-terminal-emulator-to-manage-multiple-terminal-windows/)' 的 shell 程序的粉丝，但是这可能不会显示在 Kali Linux 的默认安装中。这里列出的所有 shell 程序都可用于使用 nmap 。

![Launch Terminal in Kali Linux](/data/attachment/album/201611/16/111159b8ctwlwt0zla7lat.png)

*在 Kali Linux 下启动终端*

一旦终端启动，nmap 的乐趣就开始了。 对于这个特定的教程，将会创建一个 Kali 机器和 Metasploitable机器之间的私有网络。

这会使事情变得更容易和更安全，因为私有的网络范围将确保扫描保持在安全的机器上，防止易受攻击的 Metasploitable 机器被其他人攻击。

### 怎样在我的网络上找到活动主机

在此示例中，这两台计算机都位于专用的 192.168.56.0/24 网络上。 Kali 机器的 IP 地址为 192.168.56.101，要扫描的 Metasploitable 机器的 IP 地址为 192.168.56.102。

假如我们不知道 IP 地址信息，但是可以通过快速 nmap 扫描来帮助确定在特定网络上哪些是活动主机。这种扫描称为 “简单列表” 扫描，将 `-sL`参数传递给 nmap 命令。

```
# nmap -sL 192.168.56.0/24
```

![Nmap - Scan Network for Live Hosts](/data/attachment/album/201611/16/111200a7p81uh35vfvh18d.png)

*Nmap – 扫描网络上的活动主机*

悲伤的是，这个初始扫描没有返回任何活动主机。 有时，这是某些操作系统处理[端口扫描网络流量](http://www.tecmint.com/audit-network-performance-security-and-troubleshooting-in-linux/)的一个方法。

### 在我的网络中找到并 ping 所有活动主机

不用担心，在这里有一些技巧可以使 nmap 尝试找到这些机器。 下一个技巧会告诉 nmap 尝试去 ping 192.168.56.0/24 网络中的所有地址。

```
# nmap -sn 192.168.56.0/24

```

![Nmap - Ping All Connected Live Network Hosts](/data/attachment/album/201611/16/111200c9jhxydyj0n0yfgk.png)

*Nmap – Ping 所有已连接的活动网络主机*

这次 nmap 会返回一些潜在的主机来进行扫描！ 在此命令中，`-sn` 禁用 nmap 的尝试对主机端口扫描的默认行为，只是让 nmap 尝试 ping 主机。

### 找到主机上的开放端口

让我们尝试让 nmap 端口扫描这些特定的主机，看看会出现什么。

```
# nmap 192.168.56.1,100-102

```

![Nmap - Network Ports Scan on Host](/data/attachment/album/201611/16/111201u4pr93f74i73d949.png)

*Nmap – 在主机上扫描网络端口*

哇! 这一次 nmap 挖到了一个金矿。 这个特定的主机有相当多的[开放网络端口](http://www.tecmint.com/find-open-ports-in-linux/)。

这些端口全都代表着在此特定机器上的某种监听服务。 我们前面说过，192.168.56.102 的 IP 地址会分配给一台易受攻击的机器，这就是为什么在这个主机上会有这么多[开放端口](http://www.tecmint.com/find-open-ports-in-linux/)。

在大多数机器上打开这么多端口是非常不正常的，所以赶快调查这台机器是个明智的想法。管理员可以检查下网络上的物理机器，并在本地查看这些机器，但这不会很有趣，特别是当 nmap 可以为我们更快地做到时！

### 找到主机上监听端口的服务

下一个扫描是服务扫描，通常用于尝试确定机器上什么[服务监听在特定的端口](http://www.tecmint.com/find-linux-processes-memory-ram-cpu-usage/)。

Nmap 将探测所有打开的端口，并尝试从每个端口上运行的服务中获取信息。

```
# nmap -sV 192.168.56.102

```

![Nmap - Scan Network Services Listening of Ports](/data/attachment/album/201611/16/111201frx5x7ssknb4jhkd.png)

*Nmap – 扫描网络服务监听端口*

请注意这次 nmap 提供了一些关于 nmap 在特定端口运行的建议（在白框中突出显示），而且 nmap 也试图确认运行在这台机器上的[这个操作系统的信息](http://www.tecmint.com/commands-to-collect-system-and-hardware-information-in-linux/)和它的主机名（也非常成功！）。

查看这个输出，应该引起网络管理员相当多的关注。 第一行声称 VSftpd 版本 2.3.4 正在这台机器上运行！ 这是一个真正的旧版本的 VSftpd。

通过查找 ExploitDB，对于这个版本早在 2001 年就发现了一个非常严重的漏洞（ExploitDB ID – 17491）。

### 发现主机上上匿名 ftp 登录

让我们使用 nmap 更加清楚的查看这个端口，并且看看可以确认什么。

```
# nmap -sC 192.168.56.102 -p 21
```

![Nmap - Scan Particular Post on Machine](/data/attachment/album/201611/16/111202jfmd00l4z45ddv9s.png)

*Nmap – 扫描机器上的特定端口*

使用此命令，让 nmap 在主机上的 FTP 端口（`-p 21`）上运行其默认脚本（`-sC`）。 虽然它可能是、也可能不是一个问题，但是 nmap 确实发现在这个特定的服务器[是允许匿名 FTP 登录的](http://www.tecmint.com/setup-ftp-anonymous-logins-in-linux/)。

### 检查主机上的漏洞

这与我们早先知道 VSftd 有旧漏洞的知识相匹配，应该引起一些关注。 让我们看看 nmap有没有脚本来尝试检查 VSftpd 漏洞。

```
# locate .nse | grep ftp
```

![Nmap - Scan VSftpd Vulnerability](/data/attachment/album/201611/16/111202nn7nnxq7212rhfz1.png)

*Nmap – 扫描 VSftpd 漏洞*

注意 nmap 已有一个 NSE 脚本已经用来处理 VSftpd 后门问题！让我们尝试对这个主机运行这个脚本，看看会发生什么，但首先知道如何使用脚本可能是很重要的。

```
# nmap --script-help=ftp-vsftd-backdoor.nse
```

![Learn Nmap NSE Script Usage](/data/attachment/album/201611/16/111203j1877yi86kifk1wv.png)

*了解 Nmap NSE 脚本使用*

通过这个描述，很明显，这个脚本可以用来试图查看这个特定的机器是否容易受到先前识别的 ExploitDB 问题的影响。

让我们运行这个脚本，看看会发生什么。

```
# nmap --script=ftp-vsftpd-backdoor.nse 192.168.56.102 -p 21
```

![Nmap - Scan Host for Vulnerable](/data/attachment/album/201611/16/111203c2t3k66sjytv2vmy.png)

*Nmap – 扫描易受攻击的主机*

耶！Nmap 的脚本返回了一些危险的消息。 这台机器可能面临风险，之后可以进行更加详细的调查。虽然这并不意味着机器缺乏对风险的抵抗力和可以被用于做一些可怕/糟糕的事情，但它应该给网络/安全团队带来一些关注。

Nmap 具有极高的选择性，非常平稳。 到目前为止已经做的大多数扫描， nmap 的网络流量都保持适度平稳，然而以这种方式扫描对个人拥有的网络可能是非常耗时的。

Nmap 有能力做一个更积极的扫描，往往一个命令就会产生之前几个命令一样的信息。 让我们来看看积极的扫描的输出（注意 - 积极的扫描会触发[入侵检测/预防系统](http://www.tecmint.com/protect-apache-using-mod_security-and-mod_evasive-on-rhel-centos-fedora/)!）。

```
# nmap -A 192.168.56.102

```

![Nmap - Complete Network Scan on Host](/data/attachment/album/201611/16/111204tkyqlook0olk46l0.png)

*Nmap – 在主机上完成网络扫描*

注意这一次，使用一个命令，nmap 返回了很多关于在这台特定机器上运行的开放端口、服务和配置的信息。 这些信息中的大部分可用于帮助确定[如何保护本机](http://www.tecmint.com/security-and-hardening-centos-7-guide/)以及评估网络上可能运行的软件。

这只是 nmap 可用于在主机或网段上找到的许多有用信息的很短的一个列表。强烈敦促个人在个人拥有的网络上继续[以nmap](http://www.tecmint.com/nmap-command-examples/) 进行实验。（不要通过扫描其他主机来练习！）。

有一个关于 Nmap 网络扫描的官方指南，作者 Gordon Lyon，可从[亚马逊](http://amzn.to/2eFNYrD)上获得。

方便的话可以留下你的评论和问题（或者使用 nmap 扫描器的技巧）。

---

via: <http://www.tecmint.com/nmap-network-security-scanner-in-kali-linux/>

作者：[Rob Turner](http://www.tecmint.com/author/robturner/) 译者：[DockerChen](https://github.com/DockerChen) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 上检测硬盘上的坏道和坏块

Summary: 我们通过几个必要的步骤，使用特定的磁盘扫描工具让你能够判断 Linux 磁盘或闪存是否存在坏道。

学习学习

又是一项系统管理技能。

good !!

非常赞，收藏了。

GOOD

让我们从坏道和坏块的定义开始说起，它们是一块磁盘或闪存上不再能够被读写的部分，一般是由于磁盘表面特定的[物理损坏](http://www.tecmint.com/defragment-linux-system-partitions-and-directories/)或闪存晶体管失效导致的。

随着坏道的继续积累，它们会对你的磁盘或闪存容量产生令人不快或破坏性的影响，甚至可能会导致硬件失效。

同时还需要注意的是坏块的存在警示你应该开始考虑买块新磁盘了，或者简单地将坏块标记为不可用。

因此，在这篇文章中，我们通过几个必要的步骤，使用特定的[磁盘扫描工具](http://www.tecmint.com/ncdu-a-ncurses-based-disk-usage-analyzer-and-tracker/)让你能够判断 Linux 磁盘或闪存是否存在坏道。

![](/data/attachment/album/201611/16/161511pz1odz8o1z1fmh8d.jpg)

以下就是步骤：

### 在 Linux 上使用坏块工具检查坏道

坏块工具可以让用户扫描设备检查坏道或坏块。设备可以是一个磁盘或外置磁盘，由一个如 `/dev/sdc` 这样的文件代表。

首先，通过超级用户权限执行 [fdisk 命令](http://www.tecmint.com/fdisk-commands-to-manage-linux-disk-partitions/)来显示你的所有磁盘或闪存的信息以及它们的分区信息：

```
$ sudo fdisk -l<br>
```

![列出 Linux 文件系统分区](/data/attachment/album/201611/16/161522zvofgpg5atqaz66q.png)

*列出 Linux 文件系统分区*

然后用如下命令检查你的 Linux 硬盘上的坏道/坏块：

```
$ sudo badblocks -v /dev/sda10 > badsectors.txt

```

![在 Linux 上扫描硬盘坏道](/data/attachment/album/201611/16/161523ae1f9efev9zmpa44.png)

*在 Linux 上扫描硬盘坏道*

上面的命令中，badblocks 扫描设备 `/dev/sda10`（记得指定你的实际设备），`-v` 选项让它显示操作的详情。另外，这里使用了输出重定向将操作结果重定向到了文件 `badsectors.txt`。

如果你在你的磁盘上发现任何坏道，卸载磁盘并像下面这样让系统不要将数据写入回报的扇区中。

你需要执行 `e2fsck`（针对 ext2/ext3/ext4 文件系统）或 `fsck` 命令，命令中还需要用到 `badsectors.txt` 文件和设备文件。

`-l` 选项告诉命令将在指定的文件 `badsectors.txt` 中列出的扇区号码加入坏块列表。

```
------------ 针对 for ext2/ext3/ext4 文件系统 ------------
$ sudo e2fsck -l badsectors.txt /dev/sda10

或

------------ 针对其它文件系统 ------------
$ sudo fsck -l badsectors.txt /dev/sda10

```

### 在 Linux 上使用 Smartmontools 工具扫描坏道

这个方法对带有 S.M.A.R.T（<ruby> 自我监控分析报告技术 <rp>  （ </rp> <rt>  Self-Monitoring, Analysis and Reporting Technology </rt> <rp>  ） </rp></ruby>）系统的现代磁盘（ATA/SATA 和 SCSI/SAS 硬盘以及固态硬盘）更加的可靠和高效。S.M.A.R.T 系统能够帮助检测，报告，以及可能记录它们的健康状况，这样你就可以找出任何可能出现的硬件失效。

你可以使用以下命令安装 `smartmontools`：

```
------------ 在基于 Debian/Ubuntu 的系统上 ------------
$ sudo apt-get install smartmontools

------------ 在基于 RHEL/CentOS 的系统上 ------------
$ sudo yum install smartmontools

```

安装完成之后，使用 `smartctl` 控制磁盘集成的 S.M.A.R.T 系统。你可以这样查看它的手册或帮助：

```
$ man smartctl
$ smartctl -h

```

然后执行 `smartctrl` 命令并在命令中指定你的设备作为参数，以下命令包含了参数 `-H` 或 `--health` 以显示 SMART 整体健康自我评估测试结果。

```
$ sudo smartctl -H /dev/sda10

```

![检查 Linux 硬盘健康](/data/attachment/album/201611/16/161523ycc1n841ncat1zz2.png)

*检查 Linux 硬盘健康*

上面的结果指出你的硬盘很健康，近期内不大可能发生硬件失效。

要获取磁盘信息总览，使用 `-a` 或 `--all` 选项来显示关于磁盘所有的 SMART 信息，`-x` 或 `--xall` 来显示所有关于磁盘的 SMART 信息以及非 SMART 信息。

在这个教程中，我们涉及了有关[磁盘健康诊断](http://www.tecmint.com/defragment-linux-system-partitions-and-directories/)的重要话题，你可以下面的反馈区来分享你的想法或提问，并且记得多回来看看。

---

via: <http://www.tecmint.com/check-linux-hard-disk-bad-sectors-bad-blocks/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[alim0x](https://github.com/alim0x) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Linux 中压缩及解压缩 .bz2 文件

不知道这种文章有什么价值所在？

tar就好了,   高那么多麻烦的东西干嘛!

最基础的也是最重要的!

tar -j 也是调用的 bzip2，多了解点没坏处

对于你这类大神来说没啥用，但是对于刚使用gun／linux系统的用户来说帮助很大。

请多些理解多些关爱小白用户。

有的人不要懂得些皮毛就自以为是(请勿对号入坐）

没事，我们这里从小白到大神，都是我们的读者。我们选题广泛，永远不会高高在上不发面对初学者的内容。

对文件进行压缩，可以通过使用较少的字节对文件中的数据进行编码来显著地减小文件的大小，并且在跨网络的[文件的备份和传送](/article-4503-1.html)时很有用。 另一方面，解压文件意味着将文件中的数据恢复到初始状态。

![](/data/attachment/album/201611/17/112020lsdqw22lbwtfgvq2.png)

Linux 中有几个[文件压缩和解压缩工具](http://www.tecmint.com/command-line-archive-tools-for-linux/)，比如gzip、7-zip、Lrzip、[PeaZip](http://www.tecmint.com/peazip-linux-file-manager-and-file-archive-tool/) 等等。

本篇教程中，我们将介绍如何在 Linux 中使用 bzip2 工具压缩及解压缩`.bz2`文件。

bzip2 是一个非常有名的压缩工具，并且在大多数主流 Linux 发行版上都有，你可以在你的发行版上用合适的命令来安装它。

```
$ sudo apt install bzip2     [On Debian/Ubuntu]
$ sudo yum install  bzip2    [On CentOS/RHEL]
$ sudo dnf install bzip2     [On Fedora 22+]

```

使用 bzip2 的常规语法是：

```
$ bzip2 option(s) filenames

```

### 如何在 Linux 中使用“bzip2”压缩文件

你可以如下压缩一个文件，使用`-z`标志启用压缩：

```
$ bzip2 filename
或者
$ bzip2 -z filename

```

要压缩一个`.tar`文件，使用的命令为：

```
$ bzip2 -z backup.tar

```

重要：bzip2 默认会在压缩及解压缩文件时删除输入文件（原文件），要保留输入文件，使用`-k`或者`--keep`选项。

此外，`-f`或者`--force`标志会强制让 bzip2 覆盖已有的输出文件。

```
------ 要保留输入文件  ------
$ bzip2 -zk filename
$ bzip2 -zk backup.tar

```

你也可以设置块的大小，从 100k 到 900k，分别使用`-1`或者`--fast`到`-9`或者`--best`：

```
$ bzip2 -k1  Etcher-linux-x64.AppImage
$ ls -lh  Etcher-linux-x64.AppImage.bz2
$ bzip2 -k9  Etcher-linux-x64.AppImage
$ bzip2 -kf9  Etcher-linux-x64.AppImage
$ ls -lh Etcher-linux-x64.AppImage.bz2

```

下面的截屏展示了如何使用选项来保留输入文件，强制 bzip2 覆盖输出文件，并且在压缩中设置块的大小。

![Compress Files Using bzip2 in Linux](/data/attachment/album/201611/17/112036jc9a3hhrtf05ca10.png)

*在 Linux 中使用 bzip2 压缩文件*

### 如何在 Linux 中使用“bzip2”解压缩文件

要解压缩`.bz2`文件，确保使用`-d`或者`--decompress`选项：

```
$ bzip2 -d filename.bz2

```

注意：这个文件必须是`.bz2`的扩展名，上面的命令才能使用。

```
$ bzip2 -vd Etcher-linux-x64.AppImage.bz2
$ bzip2 -vfd Etcher-linux-x64.AppImage.bz2
$ ls -l Etcher-linux-x64.AppImage

```

![Decompress bzip2 File in Linux](/data/attachment/album/201611/17/112037k5htj2500hil8oi8.png)

*在 Linux 中解压 bzip2 文件*

要浏览 bzip2 的帮助及 man 页面，输入下面的命令：

```
$ bzip2  -h
$ man bzip2

```

最后，通过上面简单的阐述，我相信你现在已经可以在 Linux 中压缩及解压缩`bz2`文件了。然而，有任何的问题和反馈，可以在评论区中留言。

重要的是，你可能想在 Linux 中查看一些重要的 [tar 命令示例](/article-7802-1.html)，以便学习使用 tar 命令来[创建压缩归档文件](http://www.tecmint.com/compress-files-and-finding-files-in-linux/)。

---

via: <http://www.tecmint.com/linux-compress-decompress-bz2-files-using-bzip2>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


JavaScript 小模块的开销

Summary: 一个大的 JavaScript 包比一百个小 JavaScript 模块要快。尽管这是事实，我依旧希望我们社区能最终发现我们所处的困境————提倡小模块的原则对开发者有利，但是对用户不利。同时希望能优化我们的工具，使得我们可以对两方面都有利。

**更新（2016/10/30）**：我写完这篇文章之后，我在[这个基准测试中发了一个错误](https://github.com/nolanlawson/cost-of-small-modules/pull/8)，会导致 Rollup 比它预期的看起来要好一些。不过，整体结果并没有明显的不同（Rollup 仍然击败了 Browserify 和 Webpack，虽然它并没有像 Closure 十分好），所以我只是更新了图表。该基准测试包括了 [RequireJS 和 RequireJS Almond 打包器](https://github.com/nolanlawson/cost-of-small-modules/pull/5)，所以文章中现在也包括了它们。要看原始帖子，可以查看[历史版本](https://web.archive.org/web/20160822181421/https://nolanlawson.com/2016/08/15/the-cost-of-small-modules/)。

![](/data/attachment/album/201611/17/134402w3zq9odzzd5sfmh0.jpg)

大约一年之前，我在将一个大型 JavaScript 代码库重构为更小的模块时发现了 Browserify 和 Webpack 中一个令人沮丧的事实：

>
> “代码越模块化，代码体积就越大。:< ”
>
>
> - Nolan Lawson
>
>
>

过了一段时间，Sam Saccone 发布了一些关于 [Tumblr](https://docs.google.com/document/d/1E2w0UQ4RhId5cMYsDcdcNwsgL0gP_S6SDv27yi1mCEY/edit) 和 [Imgur](https://github.com/perfs/audits/issues/1) 页面加载性能的出色的研究。其中指出：

>
> “超过 400 ms 的时间单纯的花费在了遍历 Browserify 树上。”
>
>
> - Sam Saccone
>
>
>

在本篇文章中，我将演示小模块可能会根据你选择的<ruby> 打包器 <rp>  （ </rp> <rt>  bundler </rt> <rp>  ） </rp></ruby>和<ruby> 模块系统 <rp>  （ </rp> <rt>  module system </rt> <rp>  ） </rp></ruby>而出现高得惊人的性能开销。此外，我还将解释为什么这种方法不但影响你自己代码的模块，也会影响依赖项中的模块，这也正是第三方代码在性能开销上很少提及的方面。

### 网页性能

一个页面中包含的 JavaScript 脚本越多，页面加载也将越慢。庞大的 JavaScript 包会导致浏览器花费更多的时间去下载、解析和执行，这些都将加长载入时间。

即使当你使用如 Webpack [code splitting](https://webpack.github.io/docs/code-splitting.html)、Browserify [factor bundles](https://github.com/substack/factor-bundle) 等工具将代码分解为多个包，该开销也仅仅是被延迟到页面生命周期的晚些时候。JavaScript 迟早都将有一笔开销。

此外，由于 JavaScript 是一门动态语言，同时流行的 [CommonJS](http://www.commonjs.org/) 模块也是动态的，所以这就使得在最终分发给用户的代码中剔除无用的代码变得异常困难。譬如你可能只使用到 jQuery 中的 $.ajax，但是通过载入 jQuery 包，你将付出整个包的代价。

JavaScript 社区对这个问题提出的解决办法是提倡 [小模块](http://substack.net/how_I_write_modules) 的使用。小模块不仅有许多 [美好且实用的好处](http://dailyjs.com/2015/07/02/small-modules-complexity-over-size/) 如易于维护，易于理解，易于集成等，而且还可以通过鼓励包含小巧的功能而不是庞大的库来解决之前提到的 jQuery 的问题。

所以在小模块下，你将不需要这样：

```
var _ = require('lodash')
_.uniq([1,2,2,3])

```

而是可以如此：

```
var uniq = require('lodash.uniq')
uniq([1,2,2,3])

```

### 包与模块

需要强调的是这里我提到的“模块”并不同于 npm 中的“包”的概念。当你从 npm 安装一个包时，它会将该模块通过公用 API 展现出来，但是在这之下其实是一个许多模块的聚合物。

例如，我们来看一个包 [is-array](https://www.npmjs.com/package/is-array)，它没有别的依赖，并且只包含 [一个 JavaScript 文件](https://github.com/retrofox/is-array/blob/d79f1c90c824416b60517c04f0568b5cd3f8271d/index.js#L6-L33)，所以它只有一个模块。这算是足够简单的。

现在来看一个稍微复杂一点的包，如 [once](https://www.npmjs.com/package/once)。它有一个依赖的包 [wrappy](https://www.npmjs.com/package/wrappy)。[两](https://github.com/isaacs/once/blob/2ad558657e17fafd24803217ba854762842e4178/once.js#L1-L21) [个](https://github.com/npm/wrappy/blob/71d91b6dc5bdeac37e218c2cf03f9ab55b60d214/wrappy.js#L6-L33) 包都各自包含一个模块，所以总模块数为 2。至此，也还算好。

现在来一起看一个更为令人迷惑的例子：[qs](https://www.npmjs.com/package/qs)。因为它没有依赖的包，所以你可能就认为它只有一个模块，然而事实上，它有四个模块！

你可以用一个我写的工具 [browserify-count-modules](https://www.npmjs.com/package/browserify-count-modules) 来统计一个 Browserify 包的总模块数：

```
$ npm install qs
$ browserify node_modules/qs | browserify-count-modules
4

```

这说明了一个包可以包含一个或者多个模块。这些模块也可以依赖于其他的包，而这些包又将附带其自己所依赖的包与模块。由此可以确定的事就是任何一个包将包含至少一个模块。

### 模块膨胀

一个典型的网页应用中会包含多少个模块呢？我在一些流行的使用 Browserify 的网站上运行 browserify-count-moduleson 并且得到了以下结果：

* [requirebin.com](http://requirebin.com/): 91 个模块
* [keybase.io](https://keybase.io/): 365 个模块
* [m.reddit.com](http://m.reddit.com/): 1050 个模块
* [Apple.com](http://images.apple.com/ipad-air-2/): 1060 个模块 (新增。 [感谢 Max！](https://twitter.com/denormalize/status/765300194078437376))

顺带一提，我写过的最大的开源站点 [Pokedex.org](https://pokedex.org/) 包含了 4 个包，共 311 个模块。

让我们先暂时忽略这些 JavaScript 包的实际大小，我认为去探索一下一定数量的模块本身开销会是一件有意思的事。虽然 Sam Saccone 的文章 [“2016 年 ES2015 转译的开销”](https://github.com/samccone/The-cost-of-transpiling-es2015-in-2016#the-cost-of-transpiling-es2015-in-2016) 已经广为流传，但是我认为他的结论还未到达足够深度，所以让我们挖掘的稍微再深一点吧。

### 测试环节！

我构造了一个能导入 100、1000 和 5000 个其他小模块的测试模块，其中每个小模块仅仅导出一个数字。而父模块则将这些数字求和并记录结果：

```
// index.js
var total = 0
total += require('./module_0')
total += require('./module_1')
total += require('./module_2')
// etc.
console.log(total)

// module_1.js
module.exports = 1

```

我测试了五种打包方法：Browserify、带 [bundle-collapser](https://www.npmjs.com/package/bundle-collapser) 插件的 Browserify、Webpack、Rollup 和 Closure Compiler。对于 Rollup 和 Closure Compiler 我使用了 ES6 模块，而对于 Browserify 和 Webpack 则用的是 CommonJS，目的是为了不涉及其各自缺点而导致测试的不公平（由于它们可能需要做一些转译工作，如 Babel 一样，而这些工作将会增加其自身的运行时间）。

为了更好地模拟一个生产环境，我对所有的包采用带 `-mangle` 和 `-compress` 参数的 `Uglify` ，并且使用 gzip 压缩后通过 GitHub Pages 用 HTTPS 协议进行传输。对于每个包，我一共下载并执行 15 次，然后取其平均值，并使用 `performance.now()` 函数来记录载入时间（未使用缓存）与执行时间。

### 包大小

在我们查看测试结果之前，我们有必要先来看一眼我们要测试的包文件。以下是每个包最小处理后但并未使用 gzip 压缩时的体积大小（单位：Byte）：

|  | 100 个模块 | 1000 个模块 | 5000 个模块 |
| --- | --- | --- | --- |
| browserify | 7982 | 79987 | 419985 |
| browserify-collapsed | 5786 | 57991 | 309982 |
| webpack | 3954 | 39055 | 203052 |
| rollup | 671 | 6971 | 38968 |
| closure | 758 | 7958 | 43955 |

|  | 100 个模块 | 1000 个模块 | 5000 个模块 |
| --- | --- | --- | --- |
| browserify | 1649 | 13800 | 64513 |
| browserify-collapsed | 1464 | 11903 | 56335 |
| webpack | 693 | 5027 | 26363 |
| rollup | 300 | 2145 | 11510 |
| closure | 302 | 2140 | 11789 |

Browserify 和 Webpack 的工作方式是隔离各个模块到各自的函数空间，然后声明一个全局载入器，并在每次 `require()` 函数调用时定位到正确的模块处。下面是我们的 Browserify 包的样子：

```
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o

```

而 Rollup 和 Closure 包看上去则更像你亲手写的一个大模块。这是 Rollup 打包的包：

```
(function () {
        'use strict';
        var total = 0
        total += 0
        total += 1
        total += 2
// etc.

```

如果你清楚在 JavaScript 中使用嵌套函数与在关联数组查找一个值的固有开销， 那么你将很容易理解出现以下测试的结果的原因。

### 测试结果

我选择在搭载 Android 5.1.1 与 Chrome 52 的 Nexus 5（代表中低端设备）和运行 iOS 9 的第 6 代 iPod Touch（代表高端设备）上进行测试。

这是 Nexus 5 下的测试结果（[查看表格](https://gist.github.com/nolanlawson/e84ad060a20f0cb7a7c32308b6b46abe)）：

![Nexus 5 结果](/data/attachment/album/201611/17/134420nmg9cz2kls9gn7ti.png)

这是 iPod Touch 下的测试结果（[查看表格](https://gist.github.com/nolanlawson/45ed2c7fa53da035dfc1e153763b9f93)）：

![iPod Touch 结果](/data/attachment/album/201611/17/134421nkjli3ijm8wimn3h.png)

在 100 个模块时，各包的差异是微不足道的，但是一旦模块数量达到 1000 个甚至 5000 个时，差异将会变得非常巨大。iPod Touch 在不同包上的差异并不明显，而对于具有一定年代的 Nexus 5 来说，Browserify 和 Webpack 明显耗时更多。

与此同时，我发现有意思的是 Rollup 和 Closure 的运行开销对于 iPod 而言几乎可以忽略，并且与模块的数量关系也不大。而对于 Nexus 5 来说，运行的开销并非完全可以忽略，但 Rollup/Closure 仍比 Browserify/Webpack 低很多。后者若未在几百毫秒内完成加载则将会占用主线程的好几帧的时间，这就意味着用户界面将冻结并且等待直到模块载入完成。

值得注意的是前面这些测试都是在千兆网速下进行的，所以在网络情况来看，这只是一个最理想的状况。借助 Chrome 开发者工具，我们可以认为地将 Nexus 5 的网速限制到 3G 水平，然后来看一眼这对测试产生的影响（[查看表格](https://gist.github.com/nolanlawson/6269d304c970174c21164288808392ea)）：

![Nexus 5 3G 结果](/data/attachment/album/201611/17/134422ew2s38af8t7ba0e7.png)

一旦我们将网速考虑进来，Browserify/Webpack 和 Rollup/Closure 的差异将变得更为显著。在 1000 个模块规模（接近于 Reddit 1050 个模块的规模）时，Browserify 花费的时间比 Rollup 长大约 400 毫秒。然而 400 毫秒已经不是一个小数目了，正如 Google 和 Bing 指出的，亚秒级的延迟都会 [对用户的参与产生明显的影响](http://radar.oreilly.com/2009/06/bing-and-google-agree-slow-pag.html) 。

还有一件事需要指出，那就是这个测试并非测量 100 个、1000 个或者 5000 个模块的每个模块的精确运行时间。因为这还与你对 `require()` 函数的使用有关。在这些包中，我采用的是对每个模块调用一次 `require()` 函数。但如果你每个模块调用了多次 `require()` 函数（这在代码库中非常常见）或者你多次动态调用 `require()` 函数（例如在子函数中调用 `require()` 函数），那么你将发现明显的性能退化。

Reddit 的移动站点就是一个很好的例子。虽然该站点有 1050 个模块，但是我测量了它们使用 Browserify 的实际执行时间后发现比“1000 个模块”的测试结果差好多。当使用那台运行 Chrome 的 Nexus 5 时，我测出 Reddit 的 Browserify require() 函数耗时 2.14 秒。而那个“1000 个模块”脚本中的等效函数只需要 197 毫秒（在搭载 i7 处理器的 Surface Book 上的桌面版 Chrome，我测出的结果分别为 559 毫秒与 37 毫秒，虽然给出桌面平台的结果有些令人惊讶）。

这结果提示我们有必要对每个模块使用多个 `require()` 函数的情况再进行一次测试。不过，我并不认为这对 Browserify 和 Webpack 会是一个公平的测试，因为 Rollup 和 Closure 都会将重复的 ES6 库导入处理为一个的顶级变量声明，同时也阻止了顶层空间以外的其他区域的导入。所以根本上来说，Rollup 和 Closure 中一个导入和多个导入的开销是相同的，而对于 Browserify 和 Webpack，运行开销随 `require()` 函数的数量线性增长。

为了我们这个分析的目的，我认为最好假设模块的数量是性能的短板。而事实上，“5000 个模块”也是一个比“5000 个 `require()` 函数调用”更好的度量标准。

### 结论

首先，bundle-collapser 对 Browserify 来说是一个非常有用的插件。如果你在产品中还没使用它，那么你的包将相对来说会略大且运行略慢（虽然我得承认这之间的差异非常小）。另一方面，你还可以转换到 Webpack 以获得更快的包而不需要额外的配置（其实我非常不愿意这么说，因为我是个顽固的 Browserify 粉）。

不管怎样，这些结果都明确地指出 Webpack 和 Browserify 相较 Rollup 和 Closure Compiler 而言表现都稍差，并且性能差异随着模块大小的增大而增大。不幸的是，我并不确定 [Webpack 2](https://gist.github.com/sokra/27b24881210b56bbaff7) 是否能解决这些问题，因为尽管他们将 [从 Rollup 中借鉴一些想法](http://www.2ality.com/2015/12/webpack-tree-shaking.html)，但是看起来他们的关注点更多在于 [tree-shaking 方面](http://www.2ality.com/2015/12/bundling-modules-future.html) 而不是在于 scope-hoisting 方面。（更新：一个更好的名字称为<ruby> 内联 <rp>  （ </rp> <rt>  inlining </rt> <rp>  ） </rp></ruby>，并且 Webpack 团队 [正在做这方面的工作](https://github.com/webpack/webpack/issues/2873#issuecomment-240067865)。）

给出这些结果之后，我对 Closure Compiler 和 Rollup 在 JavaScript 社区并没有得到过多关注而感到惊讶。我猜测或许是因为（前者）需要依赖 Java，而（后者）仍然相当不成熟并且未能做到开箱即用（详见 [Calvin’s Metcalf 的评论](https://github.com/rollup/rollup/issues/552) 中作的不错的总结）。

即使没有足够数量的 JavaScript 开发者加入到 Rollup 或 Closure 的队伍中，我认为 npm 包作者们也已准备好了去帮助解决这些问题。如果你使用 npm 安装 lodash，你将会发其现主要的导入是一个巨大的 JavaScript 模块，而不是你期望的 Lodash 的<ruby> 超模块 <rp>  （ </rp> <rt>  hyper-modular </rt> <rp>  ） </rp></ruby>特性（`require('lodash/uniq')`，`require('lodash.uniq')` 等等）。对于 PouchDB，我们做了一个类似的声明以 [使用 Rollup 作为预发布步骤](http://pouchdb.com/2016/01/13/pouchdb-5.2.0-a-better-build-system-with-rollup.html)，这将产生对于用户而言尽可能小的包。

同时，我创建了 [rollupify](https://github.com/nolanlawson/rollupify) 来尝试将这过程变得更为简单一些，只需拖动到已存在的 Browserify 工程中即可。其基本思想是在你自己的项目中使用<ruby> 导入 <rp>  （ </rp> <rt>  import </rt> <rp>  ） </rp></ruby>和<ruby> 导出 <rp>  （ </rp> <rt>  export </rt> <rp>  ） </rp></ruby>（可以使用 [cjs-to-es6](https://github.com/nolanlawson/cjs-to-es6) 来帮助迁移），然后使用 `require()` 函数来载入第三方包。这样一来，你依旧可以在你自己的代码库中享受所有模块化的优点，同时能导出一个适当大小的大模块来发布给你的用户。不幸的是，你依旧得为第三方库付出一些代价，但是我发现这是对于当前 npm 生态系统的一个很好的折中方案。

所以结论如下：**一个大的 JavaScript 包比一百个小 JavaScript 模块要快**。尽管这是事实，我依旧希望我们社区能最终发现我们所处的困境————提倡小模块的原则对开发者有利，但是对用户不利。同时希望能优化我们的工具，使得我们可以对两方面都有利。

### 福利时间！三款桌面浏览器

通常来说我喜欢在移动设备上运行性能测试，因为在这里我们能更清楚的看到差异。但是出于好奇，我也分别在一台搭载 i7 的 Surface Book 上的 Chrome 52、Edge 14 和 Firefox 48 上运行了测试。这分别是它们的测试结果：

Chrome 52 ([查看表格](https://gist.github.com/nolanlawson/4f79258dc05bbd2c14b85cf2196c6ef0))

![Chrome 结果](/data/attachment/album/201611/17/134424qyud93usgzlk955d.png)

Edge 14 ([查看表格](https://gist.github.com/nolanlawson/726fa47e0723b45e4ee9ecf0cf2fcddb))

![Edge 结果](/data/attachment/album/201611/17/134425i17dsrmmki7isi24.png)

Firefox 48 ([查看表格](https://gist.github.com/nolanlawson/7eed17e6ffa18752bf99a9d4bff2941f))

![Firefox 结果](/data/attachment/album/201611/17/134427bwwhmywtmghttgw8.png)

我在这些结果中发现的有趣的地方如下：

1. bundle-collapser 总是与 slam-dunk 完全不同。
2. Rollup 和 Closure 的下载时间与运行时间之比总是非常高，它们的运行时间基本上微不足道。ChakraCore 和 SpiderMonkey 运行最快，V8 紧随其后。

如果你的 JavaScript 非常大并且是延迟加载，那么第二点将非常重要。因为如果你可以接受等待网络下载的时间，那么使用 Rollup 和 Closure 将会有避免界面线程冻结的优点。也就是说，它们将比 Browserify 和 Webpack 更少出现界面阻塞。

更新：在这篇文章的回应中，JDD 已经 [给 Webpack 提交了一个 issue](https://github.com/webpack/webpack/issues/2873)。还有 [一个是给 Browserify 的](https://github.com/substack/node-browserify/issues/1379)。

更新 2：[Ryan Fitzer](https://github.com/nolanlawson/cost-of-small-modules/pull/5) 慷慨地增加了 RequireJS 和包含 [Almond](https://github.com/requirejs/almond) 的 RequireJS 的测试结果，两者都是使用 AMD 而不是 CommonJS 或者 ES6。

测试结果表明 RequireJS 具有 [最大的包大小](https://gist.github.com/nolanlawson/511e0ce09fed29fed040bb8673777ec5) 但是令人惊讶的是它的运行开销 [与 Rollup 和 Closure 非常接近](https://gist.github.com/nolanlawson/4e725df00cd1bc9673b25ef72b831c8b)。这是在运行 Chrome 52 的 Nexus 5 下限制网速为 3G 的测试结果：

![Nexus 5 (3G) RequireJS 结果](/data/attachment/album/201611/17/134429p49g90bu999nuf9n.png)

更新 3: 我写了一个 [optimize-js](http://github.com/nolanlawson/optimize-js) ，它会减少一些函数内的函数的解析成本。

---

via: <https://nolanlawson.com/2016/08/15/the-cost-of-small-modules/>

作者：[Nolan](https://nolanlawson.com/) 译者：[Yinr](https://github.com/Yinr) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


将真爱贯彻到底，微软加入 Linux 基金会

世界在变,战略也在变

另外 SQL Server for Linux 版也出來了。

packages.microsoft.com 同時支持 http 和 https

放在 Linux 上 httpD 是 nginx

curl --head packages.microsoft.com

HTTP/1.1 200 OK

Server: nginx/1.10.0 (Ubuntu)

Date: Thu, 17 Nov 2016 09:23:42 GMT

Content-Type: text/html

Connection: keep-alive

hahah

自由软件运动的最终胜利又近了一步

我可不认为 RMS 或者说 FSF 那帮人对这个事情会感到高兴。

自由软件又取得了胜利

简约是一种时尚 [Chrome Mobile 54.0|Android 5.1]

没有商业化就没有发展。。。Linux一样需要商业化的

是的，你没看错，这不是洋葱新闻，也不是愚人节笑话。

微软自从其新 CEO 萨提亚·纳德拉上台后，逐渐增加了对 Linux 和开源的投入，而现在，更是以白金会员的身份加入到了 Linux 基金会。

![](/data/attachment/album/201611/17/163813zkykjl4y1jl50wki.png)

Linux 基金会官员表示欢迎微软的加入。“成为 Linux 基金会白金成员后，微软可以更好的与开源社区合作，为更多人提供变革性的移动及云的体验，”Linux 基金会执行董事 Jim Zemlin 说。“微软是很多项目的关键贡献者，而且我们看到该公司在开放开发方面一直在加强其投入和深化承诺。”

![](/data/attachment/album/201611/17/163827dup9xua1usj2mufs.jpg)

你应该记得，十几年前，微软前 CEO 巴尔默将开源称之为“癌症”，而且，微软到现在还[要求 Android 厂商向其缴纳专利费](/article-3207-1.html)，以及，微软一直想夺回慕尼黑的桌面市场，但是，那又怎么样呢？

现在，微软逐渐加大了对开源和 Linux 方面的关注和投入，诸如 [PowerShell](/article-7699-1.html)、[Visual Studio Code](/article-6604-1.html) 以及 [Edge JavaScript 引擎](/article-6698-1.html)这样的项目，已经逐个开源化，将微软推近这个它曾经憎恨过的开源世界。而且，通过 Windows 10，[微软开始走进 Linux](/article-7177-1.html)，因为该操作系统内置了 Ubuntu。 在收购了 Xamarin 之后，还[开源了其软件开发工具包](/article-7181-1.html)。以及，和 [Red Hat](/article-7020-1.html) 和 [SUSE](/article-1593-1.html) 合作在它的 Azure 云上推出了 Linux 镜像。而今年初，微软还发布了 [Linux 上的 SQL Server](/article-7082-1.html)，甚至得到了[巴尔默的赞誉](/article-7095-1.html)。

这并不是微软加入的第一个行业领袖级的 Linux 团体，微软已经参与贡献了几个 Linux 基金会项目，包括 Node.js 基金会、 OpenDaylight、<ruby> 开放容器促进联盟 <rp>  （ </rp> <rt>  Open Container Initiative </rt> <rp>  ） </rp></ruby>、<ruby> R 社团 <rp>  （ </rp> <rt>  R Consortium </rt> <rp>  ） </rp></ruby>和<ruby> 开放 API 促进联盟 <rp>  （ </rp> <rt>  Open API Initiative </rt> <rp>  ） </rp></ruby>。

为什么微软会这样呢？因为，Linux 赢了。

微软只在桌面端继续保持着优势，Windows 已经不是最流行的终端用户操作系统了，你知道的，那是 Android。而其它的，比如云、超算，以及服务器，那也都是 Linux 的天下。微软只有两条路，要么死战到底，要么转身拥抱——显然，微软选择了后者。

说来你可能不信，比如说 Azure 云上，有 1/3 的服务器运行着 Linux，而且越来越多。

另外，还有一条与之相呼应的消息也相当的令人意外。

同样是今天，Google 在 Connect()’ 开发者大会上宣布它将加入 .NET 基金会的领导团队。

“周三，Google 加入到 .NET 基金会的技术领导团队，加强了 .NET 开发者社区的生机， 以及 Google 对支持 .NET 业务和开发者的开放平台的责任，” Microsoft 总结到。

是不是感觉这个世界变得快呢？


微软发布 Linux 下的 SQL Server 公众预览版

Summary: SQL Server for Linux 的公众预览版支持 Ubuntu、Red Hat 的 RHEL、SUSE 的 SLES，也将很快出现在 Azure 虚拟机中和 Docker Hub 上。不过，微软依旧说，支持 Linux 和 Windows 的 SQL Server 的正式版仍然会要到明年中期才能发布。

SQL Server for Linux安装包138M，安装完之后656M，比oracle小很多。安装配置很简单，这个给一个赞。

最近站里微软的新闻比较多啊

什么时候，发布个 LINUX MS OFFICE 呢？

使用linux桌面的用户能达到10%的话，估计就有戏了！

发了office<br />
win的份额就真的危险了

从商业角度， SQL Server 还是比较厉害的

你想多了，打铁还需自身硬，Linux先把图形界面的体验做了再说。

主要是微软动静大啊！

真正比较喜欢的，是微软的数据库图形管理软件，真心赞

测试表明，windows里面的数据可以直接附加到linux版的里面，这 是要跨平台的节奏？

微软发布了它的下一个版本的 SQL Server 数据库的公众预览版，同时支持 Linux 和 Windows。

![](/data/attachment/album/201611/17/213226blpr367yaaafzaaw.jpg)

在今年 3 月，微软发布过 SQL Server for Linux 的一个[内部预览版](/article-7082-1.html)。同时，微软官方说 SQL Server for Linux 是 SQL Server for Windows 版本的一个子集，将可以运行在 Ubuntu 上或作为 Docker 镜像运行（后来补充说内部预览也支持 Red Hat 的 RHEL）。该公司官方称用户购买的 SQL Server 将可以用在 Windows 服务器或 Linux 上，此后不久还说该版本的 SQL Server for Linux 和 for Windows 实际上是同一个。

不过，就在今天（美国时间 11 月 16 日），微软将 SQL Server Next 定位为既可以运行在 Linux ，也可以运行在 Windows 上的一个产品。

微软官方称，运行在 Linux 上和运行在 Windows 上的 SQL Server Next 基于同一份代码基，“有些功能存在平台差异，比如说 Linux 上的文件路径不同于 Windows”，但是这不是两个完全不同的产品。运行在 Linux 上的 SQL Server Next 拥有“关系型数据库引擎的所有主要功能”，这包括堆内在线事务处理（OLTP）、堆内列存储、透明数据加密、全程加密、行级安全等等。

SQL Server for Linux 的公众预览版支持 Ubuntu、Red Hat 的 RHEL、SUSE 的 SLES，也将很快出现在 Azure 虚拟机中和 [Docker Hub](http://hub.docker.com/r/microsoft/mssql-server-linux) 上。不过，微软依旧说，支持 Linux 和 Windows 的 SQL Server 的正式版仍然会要到明年中期才能发布。

Linux 下的 SQL Server 公众预览版可以从微软的 [SQL Server on Linux 网站](https://www.microsoft.com/en-us/sql-server/sql-server-vnext-including-Linux)上下载到。

众所周知，使用开源软件的公司不会将其自由而强大的 MariaDB 或 MySQL 数据库方案用 SQL Server 来替代，但是微软的 SQL Server 承诺支持 Docker 容器，并允许选择数据类型和开发语言，对于某些场景来说，使用 SQL Server 可以节省成本，提升性能，并增强灵活性。在今年 3 月份发布内部预览版之后，微软宣布有超过 8000 家公司已经在第一周内注册尝试了 SQL Server for Linux，其中位列财富 500 强里的公司超过一半都参与了试用。


一周开源新闻：微软的大动作、Ubuntu 17.04 的消息和 Firefox 50

Summary:
更多：
- X.Org Server 1.19.0 官方发布，Linux 版本不久后来到

真正让我感觉到意外的是X.Org Server 新版~

### Ubuntu 17.04 将提供增强的 Unity 8 会话，以及越来越多的 snaps 应用

Canonical 于 11 月 15 日至 16 日举办 Ubuntu 线上峰会 (UOS) ，期间 Ubuntu 社区成员可以了解到更 Ubuntu 17.04 Linux的进展。

![](/data/attachment/album/201611/18/203056yqdqps4qiq5ep25p.jpg)

线上峰会期间，Canonical 透露，Ubuntu 17.04 将带来一个大大增强的 Unity 8 会话。Ubuntu 17.04 （Zesty Zapus）计划于 2017 年 4 月发布，Canonical 将为用户提供增强的Unity 8 Session，并通过 snaps 方式支持移动和桌面平台。此外， Snappy Store 将完全配置为运行 snaps，因为 Snappy 正在成为 Ubuntu 的操作系统的默认选择。

### 微软作为白金会员加入 Linux 基金会

![](/data/attachment/album/201611/17/163813zkykjl4y1jl50wki.png)

微软公司 16 日宣布，它正在以白金会员身份加入 Linux 基金会，这距离其前 CEO 巴尔默将开源平台称为“癌症”还不到 15 年。

同一天，Google 在 Connect()’ 开发者大会上宣布它将加入 .NET 基金会的领导团队。

具体请参加我们的[报道](/article-7966-1.html)。

### Canonical 宣布推出 Ubuntu Linux 上的 Microsoft SQL Server 公众预览版

11 月 16 日， Canonical 宣布 Ubuntu 系统上 Microsoft's SQL server的公众预览版推出。

如果想试用 Microsoft SQL Server on Ubuntu，可以在 Microsoft's SQL Server on Linux 网站以及 Microsoft Azure 和 [Docker Hub](http://hub.docker.com/r/microsoft/mssql-server-linux) 下载公众预览版镜像。 请访问 [www.sqlserveronlinux.com](https://www.microsoft.com/en-us/sql-server/sql-server-vnext-including-Linux) 开始了解 Microsoft SQL Server on Ubuntu。在那里，有很多有用的资料和文档帮助用户更好的了解 SQL Server on Ubuntu 的优势。

具体信息,请参见我们的[报道](/article-7967-1.html)。

![](/data/attachment/album/201611/17/213226blpr367yaaafzaaw.jpg)

### X.Org Server 1.19.0 官方发布，Linux 版本不久后来到

xorg-server 1.19 显示服务器有巨大改进。

2016 年 11 月 15 日，X Window 系统开发者 Keith Packard 宣布 X.Org Server 1.19.0 发布，不久可以下载 X.Org Server 1.19.0 显示服务器的 GNU/Linux 版本。

要了解 X.Org Server 1.19.0 的改动的具体技术细节，建议阅读 [xorg-server 1.18.99.2](https://lists.x.org/archives/xorg-announce/2016-September/002709.html)、[xorg-server 1.18.99.901](https://lists.x.org/archives/xorg-announce/2016-September/002711.html) 和 [xorg-server 1.18.99.902](https://lists.x.org/archives/xorg-announce/2016-October/002734.html) 的改动日志，了解开发里程碑。

### Firefox 50.0 for Linux、Mac 和 Windows 版本发布

不是一个大改版，但有很多有趣的变化。

2016 年 11 月 15 日，Mozilla 发布 Firefox 50.0 浏览器，支持 GNU/Linux、macOS 以及 Microsoft Windows 系统。Mozilla 发布的[发行版公告](https://www.mozilla.org/en-US/firefox/50.0/releasenotes/)包含在此版本中所有大的变化。


我成为软件工程师的原因和经历

如果白人把我们叫有色人种，那我们就叫他们无色人种好了。

![](/data/attachment/album/201611/19/095104xi5tghdsdxea0mad.png)

1989 年乌干达首都，坎帕拉。

我明智的父母决定与其将我留在家里添麻烦，不如把我送到叔叔的办公室学学电脑。几天后，我和另外六、七个小孩，还有一台放置在课桌上的崭新电脑，一起置身于 21 层楼的一间狭小房屋中。很明显我们还不够格去碰那家伙。在长达三周无趣的 DOS 命令学习后，美好时光来到，终于轮到我来输 **copy doc.txt d:** 啦。

那将文件写入五英寸软盘的奇怪的声音，听起来却像音乐般美妙。那段时间，这块软盘简直成为了我的至宝。我把所有可以拷贝的东西都放在上面了。然而，1989 年的乌干达，人们的生活十分“正统”，相比较而言，捣鼓电脑、拷贝文件还有格式化磁盘就称不上“正统”。于是我不得不专注于自己接受的教育，远离计算机科学，走入建筑工程学。

之后几年里，我和同龄人一样，干过很多份工作也学到了许多技能。我教过幼儿园的小朋友，也教过大人如何使用软件，在服装店工作过，还在教堂中担任过引座员。在我获取堪萨斯大学的学位时，我正在技术管理员的手下做技术助理，听上去比较神气，其实也就是搞搞学生数据库而已。

当我 2007 年毕业时，计算机技术已经变得不可或缺。建筑工程学的方方面面都与计算机科学深深的交织在一起，所以我们不经意间学了些简单的编程知识。我对于这方面一直很着迷，但我不得不成为一位“正统”的工程师，由此我发展了一项秘密的私人爱好：写科幻小说。

在我的故事中，我以我笔下的女主角的形式存在。她们都是编程能力出众的科学家，总是卷入冒险，并用自己的技术发明战胜那些渣渣们，有时甚至要在现场发明新方法。我提到的这些“新技术”，有的是基于真实世界中的发明，也有些是从科幻小说中读到的。这就意味着我需要了解这些技术的原理，而且我的研究使我关注了许多有趣的 reddit 版块和电子杂志。

### 开源：巨大的宝库

那几周在 DOS 命令上花费的经历对我影响巨大，我在一些非专业的项目上耗费心血，并占据了宝贵的学习时间。Geocities 刚向所有 Yahoo! 用户开放时，我就创建了一个网站，用于发布一些用小型数码相机拍摄的个人图片。我建立多个免费网站，帮助家人和朋友解决一些他们所遇到的电脑问题，还为教堂搭建了一个图书馆数据库。

这意味着，我需要一直研究并尝试获取更多的信息，使它们变得更棒。互联网上帝保佑我，让开源进入我的视野。突然之间，30 天试用期和 license 限制对我而言就变成了过去式。我可以完全不受这些限制，继续使用 GIMP、Inkscape 和 OpenOffice。

### 是正经做些事情的时候了

我很幸运，有商业伙伴喜欢我的经历。她也是个想象力丰富的人，期待更高效、更便捷的互联世界。我们根据我们以往成功道路中经历的弱点制定了解决方案，但执行却成了一个问题。我们都缺乏给产品带来活力的能力，每当我们试图将想法带到投资人面前时，这表现的尤为突出。

我们需要学习编程。于是 2015 年夏末，我们来到 Holberton 学校。那是一所座落于旧金山，由社区推进，基于项目教学的学校。

一天早晨我的商业伙伴来找我，以她独有的方式（每当她有疯狂想法想要拉我入伙时），进行一场对话。

**Zee**: Gloria，我想和你说点事，在你说“不”前能先听我说完吗？

**Me**: 不行。

**Zee**: 为做全栈工程师，咱们申请上一所学校吧。

**Me**: 什么？

**Zee**: 就是这，看！就是这所学校，我们要申请这所学校来学习编程。

**Me**: 我不明白。我们不是正在网上学 Python 和…

**Zee**: 这不一样。相信我。

**Me**: 那…

**Zee**: 这就是不信任我了。

**Me**: 好吧 … 给我看看。

### 抛开偏见

我读到的和我们在网上看的的似乎很相似。这简直太棒了，以至于让人觉得不太真实，但我们还是决定尝试一下，全力以赴，看看结果如何。

要成为学生，我们需要经历四步选择，不过选择的依据仅仅是天赋和动机，而不是学历和编程经历。筛选便是课程的开始，通过它我们开始学习与合作。

根据我和我伙伴的经验， Holberton 学校的申请流程比其他的申请流程有趣太多了，就像场游戏。如果你完成了一项挑战，就能通往下一关，在那里有别的有趣的挑战正等着你。我们创建了 Twitter 账号，在 Medium 上写博客，为创建网站而学习 HTML 和 CSS， 打造了一个充满活力的在线社区，虽然在此之前我们并不知晓有谁会来。

在线社区最吸引人的就是大家有多种多样的使用电脑的经验，而背景和性别不是社区创始人（我们私下里称他们为“The Trinity”）做出选择的因素。大家只是喜欢聚在一块儿交流。我们都行进在通过学习编程来提升自己计算机技术的旅途上。

相较于其他的的申请流程，我们不需要泄露很多的身份信息。就像我的伙伴，她的名字里看不出她的性别和种族。直到最后一个步骤，在视频聊天的时候， The Trinity 才知道她是一位有色人种女性。迄今为止，促使她达到这个级别的只是她的热情和才华。肤色和性别并没有妨碍或者帮助到她。还有比这更酷的吗？

获得录取通知书的晚上，我们知道生活将向我们的梦想转变。2016 年 1 月 22 日，我们来到巴特瑞大街 98 号，去见我们的同学们 [Hippokampoiers](https://twitter.com/hippokampoiers)，这是我们的初次见面。很明显，在见面之前，“The Trinity”已经做了很多工作，聚集了一批形形色色的人，他们充满激情与热情，致力于成长为全栈工程师。

这所学校有种与众不同的体验。每天都是向某一方面编程的一次竭力的冲锋。交给我们的工程，并不会有很多指导，我们需要使用一切可以使用的资源找出解决方案。[Holberton 学校](https://www.holbertonschool.com/) 认为信息来源相较于以前已经大大丰富了。MOOC（大型开放式课程）、教程、可用的开源软件和项目，以及线上社区等等，为我们完成项目提供了足够的知识。加之宝贵的导师团队来指导我们制定解决方案，这所学校变得并不仅仅是一所学校；我们已经成为了求学者的团体。任何对软件工程感兴趣并对这种学习方法感兴趣的人，我都强烈推荐这所学校。在这里的经历会让人有些悲喜交加，但是绝对值得。

### 开源问题

我最早使用的开源系统是 [Fedora](https://en.wikipedia.org/wiki/Fedora_(operating_system))，一个 [Red Hat](https://www.redhat.com/) 赞助的项目。与 一名IRC 成员交流时，她推荐了这款免费的操作系统。 虽然在此之前，我还未独自安装过操作系统，但是这激起了我对开源的兴趣和日常使用计算机时对开源软件的依赖性。我们提倡为开源贡献代码，创造并使用开源的项目。我们的项目就在 Github 上，任何人都可以使用或是向它贡献出自己的力量。我们也会使用或以自己的方式为一些既存的开源项目做出贡献。在学校里，我们使用的大部分工具是开源的，例如 Fedora、[Vagrant](https://www.vagrantup.com/)、[VirtualBox](https://www.virtualbox.org/)、[GCC](https://gcc.gnu.org/) 和 [Discourse](https://www.discourse.org/)，仅举几例。

在向软件工程师行进的路上，我始终憧憬着有朝一日能为开源社区做出一份贡献，能与他人分享我所掌握的知识。

### 多样性问题

站在教室里，和 29 位求学者交流心得，真是令人陶醉。学员中 40% 是女性， 44% 是有色人种。当你是一位有色人种且为女性，并身处于这个以缺乏多样性而著名的领域时，这些数字就变得非常重要了。这是高科技圣地麦加上的绿洲，我到达了。

想要成为一个全栈工程师是十分困难的，你甚至很难了解这意味着什么。这是一条充满挑战但又有丰富回报的旅途。科技推动着未来飞速发展，而你也是美好未来很重要的一部分。虽然媒体在持续的关注解决科技公司的多样化的问题，但是如果能认清自己，清楚自己的背景，知道自己为什么想成为一名全栈工程师，你便能在某一方面迅速成长。

不过可能最重要的是，告诉大家，女性在计算机的发展史上扮演过多么重要的角色，以帮助更多的女性回归到科技界，而且在给予就业机会时，不会因性别等因素而感到犹豫。女性的才能将会共同影响科技的未来，以及整个世界的未来。

---

via: <https://opensource.com/life/16/4/my-open-source-story-gloria-bwandungi>

作者：[Gloria Bwandungi](https://opensource.com/users/nappybrain) 译者：[martin2011qi](https://github.com/martin2011qi) 校对：[jasminepeng](https://github.com/jasminepeng)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 中查看你的时区

cat /etc/timezone timezone这个文件已经不存在了。。现在应该是localtime这个文件吧

在这篇短文中，我们将向你简单介绍几种 Linux 下查看系统时区的简单方法。在 Linux 机器中，尤其是生产服务器上的时间管理技能，是在系统管理中一个极其重要的方面。

Linux 包含多种可用的时间管理工具，比如 `date` 或 `timedatectlcommands`，你可以用它们来获取当前系统时区，也可以[将系统时间与 NTP 服务器同步](http://www.tecmint.com/install-ntp-server-in-centos/)，来自动地、更精确地进行时间管理。

好，我们一起来看几种查看我们的 Linux 系统时区的不同方法。

![](/data/attachment/album/201611/19/100211cd4llxld46xlqex6.jpg)

### 1、我们从使用传统的 `date` 命令开始

使用下面的命令，来看一看我们的当前时区：

```
$ date

```

或者，你也可以使用下面的命令。其中 `%Z` 格式可以输出字符形式的时区，而 `%z` 输出数字形式的时区：

```
$ date +”%Z %z”

```

![Find Linux Timezone](/data/attachment/album/201611/19/100008maywickztn1iyvic.png)

*查看 Linux 时区*

注意：`date` 的手册页中包含很多输出格式，你可以利用它们，来替换你的 `date` 命令的输出内容：

```
$ man date

```

### 2、接下来，你同样可以用 `timedatectl` 命令

当你不带任何参数运行它时，这条命令可以像下图一样，输出系统时间概览，其中包含当前时区：

```
$ timedatectl

```

然后，你可以在命令中提供一条管道，然后用 [grep 命令](http://www.tecmint.com/12-practical-examples-of-linux-grep-command/) 来像下面一样，只过滤出时区信息：

```
$ timedatectl | grep “Time zone”

```

![Find Current Linux Timezone](/data/attachment/album/201611/19/100010vtxlxmmo5obxbiio.png)

*查看当前 Linux 时区*

同样，我们可以学习如何使用 timedatectl 来[设置 Linux 时区](http://www.tecmint.com/set-time-timezone-and-synchronize-time-using-timedatectl-command/)。

### 3、进一步，显示文件 /etc/timezone 的内容

使用 [cat 工具](http://www.tecmint.com/13-basic-cat-command-examples-in-linux/)显示文件 `/etc/timezone` 的内容，来查看你的时区：

```
$ cat /etc/timezone

```

![Check Timezone of Linux](/data/attachment/album/201611/19/100010xs2n4c4qbmzmgej8.png)

*在 Linux 中查看时区*

对于 RHEL/CentOS/Fedora 用户，这里还有一条可以起到同样效果的命令：

```
$ grep ZONE /etc/sysconfig/clock

```

就这些了！别忘了在下面的反馈栏中分享你对于这篇文章中的看法。重要的是：你应该通过这篇 Linux 时区管理指南来学习更多系统时间管理的知识，因为它含有很多易于操作的实例。

---

via: <http://www.tecmint.com/check-linux-timezone>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[StdioA](https://github.com/StdioA) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Linux 基金会主席说，微软还弄不死 Linux

Summary: Linux 基金会主席 Jim Zemlin 在一次“计算机世界”的采访解释说，微软现在是一家完全不同的公司，它对摧毁 Linux 根本不感兴趣。

Windows和Linux不是竞争的关系，是互补的关系。

桌面一点长进也没有，问题多多，还是比不上xp

有点道理!

win用户，你有用过吗？有点想骂你的感觉～～～

虽然linux桌面软件不少，但是大多很粗糙，体验不佳，限制了它在桌面方面的发展；当然精品也有，只是不多。

废话，当然用过，我公司客户天天骂linux的桌面环境。

我觉得就是竞争关系，现在微软已经在“呼吁所有的Linux开发者转到Windows10平台”了。这就说明微软想要慢慢吞掉Linux。因为Windows10中已经集成了Linux子系统，所以只要安装了Windows10，就不用安装Linux了（对一般的用户来说是一举两得），无论Linux以后发展的多出色，都会被微软吸收（它可以直接拿来集成到win10子系统中），而Linux却得不到多大好处，最后Windows10会越来越壮大，Linux会因为Windows10的排挤死掉很多发行版（包括Ubuntu）。

本周，[微软宣布它成为了 Linux 基金会的白金成员](/article-7966-1.html)，这距其前 CEO 巴尔默将 Linux 称之为“癌症”才 15 年。

虽然此举对微软来说意义重大，但是并不是开源界的每个人都认为这对于 Linux 来说是好的变化，特别是这家位于雷德蒙的软件巨头向来被视作开源和 Linux 的敌人。

对于微软在开源领域的扩张中，业界有各种不同的观点，但就反对者而言，其最终的看法可以归结为微软试图减慢 Linux 的发展速度并最终扼杀它。

![](/data/attachment/album/201611/19/105137el3g3dah2asaag6r.jpg)

### Jim 说，没啥阴谋

虽然这看起来像是一个巨大的阴谋，但是 Linux 基金会主席 Jim Zemlin 在“[计算机世界](http://www.computerworld.com/article/3142453/open-source-tools/microsoft-really-has-changed-linux-foundation-chief-says.html#tk.rss_all)”的采访中解释说，微软现在是一家完全不同的公司，它对摧毁 Linux 根本不感兴趣。

“首先，当你加入到 Linux 基金会当中，你就负有支持我们的组织的使命的责任，也就是说支持 Linux 和开源的发展”，他说道，“微软不仅致力于成为我们的组织成员，而且我可以告诉你，他们已经在做很多事情了。”

“现在一切都在云上，每个人都有计算机，有太多的软件，即使是微软这样的巨头也不可能以一己之力全部搞定。这不可能。”

以白金会员加入 Linux 基金会并不是微软唯一做的事情，该软件巨头之前就一直通过开源其产品来尝试接近 Linux，比如 .NET、PowerShell 和新的 Edge 浏览器的引擎部分。

甚至，连微软的拳头产品 Windows 10 都带有 Ubuntu 子系统，这被视作该公司努力将两个世界融合在一起的举措。

当然，如果微软继续在 Linux 世界继续扩展，这将是一个大的机遇，所以让我们期待将来有更多的新的变化。