Linus Torvalds 说：谈论技术创新是愚蠢的，闭上嘴把事情做好

Summary: 来自 Linux 内核首领的最佳生活提示。

大神不是我说你，拿好你的2千万，多做实事，多把版本号跳跳级，少乱说话，不要成为 IT 界的贝利。

大神你好，你有什么资格说linus，万一别人采访你闭口不谈直接让ta滚蛋

没毛病

jinga50334 [BlackBerry Browser|BlackBerry Tablet OS 2.1]

说得很对。

我是不赞成标题这种说法 创新极其重要 那1%的创新比300%的汗水都重要

来自辽宁本溪的 Chrome Mobile 59.0|Android 5.1 用户

能说啊，因为我有口。

很好

没有对所在专业的熟悉，何来的创新

创新也是在汗水的基础上的。

操作系统和应用APP不相同。

日常APP和游戏APP也不相同。

不同的场景有不同的需要。

操作系统要的稳定。游戏APP，没有好的创意，就没有销路。

脚踏实地才能有突破，空谈创新，还不如脚踏实地．

你快闭嘴吧！没Linus，你现在估计连饭碗都没有！我们感谢Linus，至少他的创新让这个世界有了Linux，让无数人有了饭碗！

Linus 只要没有违法, 他有嚣张的资本与资格.

他发表的看法, 是指在内核OS开发上,

并不代表适合指其它情形,

毕竟大家的情况不同, 也不能说他是错的, 这是他的看法, 而你无法完全了解他的情况.

所以，别人说的如果觉得可用的, 就收入脑袋中,

觉得没用的就没必要较真.

站在鄙视链顶端的男人

来自 Linux 内核首领的最佳生活提示。

>
> 来自 Linux 内核首领的最佳生活提示。
>
>
>

![Linus Torvalds at Open Source Leadership Summit](/data/attachment/album/201707/24/190251gpa8syj8aqs7aawp.jpg)

**OSLS 报道：** Linus Torvalds 认为，技术行业的创新庆祝活动是沾沾自喜，自我陶醉和自私自利的。

他所使用的艺术化术语更为直率：“行业的创新如此之多都是胡说。” 他说：“人人创新——不要做这种‘不同思考’，这是无意义的，它们有百分之九十九只是工作而已。”

周三在加利福尼亚州召开的[开源领袖峰会（OSLS）](https://www.theregister.co.uk/2017/02/14/the_government_is_coming_for_your_code/)中，Linux 基金会执行总监 Jim Zemlin 采访了 Linus，讨论了他如何管理 Linux 内核的开发和他对工作的态度。

Torvalds 说：“所有的炒作都不是真正的工作，真正的工作是在细节之中。”

Torvalds 表示赞成这样一个观点，即成功的项目是 99％ 的汗水，百分之一的创新。

作为[开源 Linux 内核](https://www.kernel.org/)的创造者和仁慈独裁者，不用提还是 Git 分布式版本控制系统的发明者，Torvalds 已经证明他的方法产生了结果。Linux 对技术行业的影响已经不用再夸大了。Linux 是服务器的主要操作系统，几乎所有的高性能计算都运行在 Linux 上，而大多数移动设备和嵌入式设备都依赖于 Linux。

Linux 内核可能是 PC 时代最成功的技术协作项目。根据 Zemlin 的说法，内核贡献者自 2005 年以来总共增加了 13500 多个，其中每天大约增加 10000 行代码，移除 8000 行代码，修改 1500 到 1800 行代码，而且这一直在继续 —— 虽然不是一直以目前的速度 —— 但这已经超过了二十五年。

Torvalds 说：“我们已经这样做了 25 年，而且我们遇到的一个常见问题是人们彼此需要磨合。所以组织代码、组织代码流、[以及]组织我们的维护关系构成了我们的历史，最终那些痛点，我说的是代码争议，基本上消失了。”

Torvalds 解释说，该项目的结构使人们能够独立工作。他说：“我们已经能够真正模块化代码和开发模式，所以我们可以并行做很多事情。”

Torvalds 说，技术起着明显的作用，但流程至少是同样重要的。

Torvalds 说：“这是一个社会化项目。这是技术层面的东西，而技术是让人们能够就问题达成一致的东西，因为……它通常有非常明确的对和错。”

但是现在 Torvalds 并没有像 20 年前一样对每一个变化进行审查，而是依靠贡献者的社交网络。他说：“这是社交网络和信任，并且我们有一个非常强大的网络，这就是为什么我们可以有一千人参与到每个发布当中。”

对信任的重视解释了参与内核开发的困难，因为人们不可以登录、提交代码然后消失不见。Torvalds 说：“你要提交很多小的补丁直到维护者信任你才行，在这一点上，你不仅仅是一个提交补丁的人，而是成为信任网络的一部分。”

十年前，Torvalds 表示，他告诉其他内核贡献者，他希望有一个八周的发布时间表，而不是可能拖延几年的发布周期。内核开发人员设法将其发布周期减少到大约两个半月。从那时起，开发工作就一直很平稳。

Torvalds 说：“说我们的流程有多么好很无聊。对于我来说，所有真正紧张的时刻都是关于流程的，它们和代码无关，当代码不工作时，这实际上是令人高兴的……流程问题是很痛苦的。你永远不会想有流程问题……尤其是当人们开始彼此生气时。”

---

via: <http://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/>

作者：[Thomas Claburn](http://www.theregister.co.uk/Author/3190) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


6 个学习 OpenStack 的新指南和教程

Summary: 云基础设施是一个非常需要的技能。如果你正在为你的云基础架构需求寻找开源解决方案，那么 OpenStack 就是其中之一。

>
> 想了解更多关于 OpenStack 的内容？这些免费资源可能只是你所需要的。
>
>
>

![](/data/attachment/album/201707/25/001553ekf9k8it93racj8a.jpg)

云基础设施是一个非常需要的技能。如果你正在为你的云基础架构需求寻找开源解决方案，那么 [OpenStack](https://opensource.com/resources/what-is-openstack) 就是其中之一。

OpenStack 是一个巨大的项目集合，为云服务的几乎每一个部分都提供了解决方案和集成。虽然这个巨大范围使得它成为一个强大的工具，但这也意味着可能很难跟上并了解整个项目，了解如何使用它们、如何自定义它们以及如何向其提供代码。

幸运的是，有很多选择可以帮助你。除了[官方项目文档](http://docs.openstack.org/)、纸质书籍和认证培训计划外，还有大量社区创造的优秀资源。我们每个月可以在 Opensource.com 上查看它在博客和其他网站上最近发布的指南和教程，这会给你启发。我们来看看这次我们发现了什么。

* 首先在本月的这一批中，我们有一篇来自 Antony Messerli 的指南，介绍如何通过 Ansible [设置 OpenStack 云](https://www.reversengineered.com/2016/05/09/setting-up-an-openstack-cloud-using-ansible/)。Messerli 将引导我们完成实验室环境中的配置以及在集群上运行 OpenStack 所需的 playbook，还有添加镜像、设置网络等的基础知识。如果你正在考虑使用 Ansible 安装 OpenStack 小型本地测试环境，这是一篇很好的文章。
* 接下来，你有没有想过 Neutron 网络如何在 OpenStack 中的工作的？应用程序中发生的事情如何对应于底层代码？Arie Bregman 在[这篇文章](http://abregman.com/2017/05/29/openstack-neutron-service-code-deep-dive/)中提供了一段 OpenStack Neutron 代码。你需要熟悉一般的网络原理，至少有一点 OpenStack 代码基础才能跟上。
* Gerrit是 OpenStack 使用的开源代码审查项目，用于管理上传的修补程序，并允许在将更改合并到主 OpenStack 代码库之前进行反馈和测试。对于那些习惯于不同的代码审查系统（或根本没有的），Gerrit 可能会有点混乱，尽管它具有很好的仪表板功能，因此你只能看到对你很重要的信息。Dougal Matthews 在[这篇文章](http://www.dougalmatthews.com/2017/May/19/how-i-gerrit/)中带我们看了他的 Gerrit 仪表板设置，这可能会帮助你设置自己的。
* 上个月在波士顿举办的 OpenStack 峰会的[视频](https://www.openstack.org/videos/)已经发布了，无论你是否参加过上个月的活动，这都包含了技术和非技术专题的宝库。不知道从哪里开始？这有个来自 Julio Villarreal Pelegrino 关于如何规划、构建、运行一个成功的 OpenStack 云计算的[演讲](http://www.juliosblog.com/dont-fail-at-scale-how-to-plan-for-build-and-operate-a-successful-openstack-cloud-video-openstack-summit2017/)。
* 任何云管理员都应该担心安全问题。但你从哪里开始？Naveen Joy 发布了一个很好的十个安全问题的[清单](https://blogs.cisco.com/cloud/securing-openstack-networking)，用于加固你的 OpenStack 网络；你可以在上个月的同一主题演讲中查看[这个视频](https://www.openstack.org/videos/boston-2017/securing-openstack-networking)。
* OpenStack 中的内部消息服务在一个公共库中进行管理，该库存在于一个称为 Oslo 的项目中，自然它被称为 Oslo.Messenging。要了解这个库的基础知识，它在这个分为[两个](https://pigdogweb.wordpress.com/2017/05/22/intro-to-oslo-messaging/)[部分](https://pigdogweb.wordpress.com/2017/06/02/oslo-messaging-the-cloud-is-calling/)的博客中提到。

想要了解更多？可以从这三年来社区说提供的内容中找到我们完整的 [OpenStack 指南、如何做和教程](https://opensource.com/resources/openstack-tutorials)，以帮助你学习成为一名高效的 OpenStack 开发人员或管理员。

有很棒教程、指导或者如何做需要我们分享的么？在下面的评论中分享。

---

作者简介：

Jason Baker - Jason 热衷于使用技术使世界更加开放，从软件开发到阳光政府行动。Linux 桌面爱好者、地图/地理空间爱好者、树莓派工匠、数据分析和可视化极客、偶尔的码农、云本土主义者。在 Twitter 上关注他。

via: <https://opensource.com/article/17/6/openstack-guides-and-tutorials>

作者：[Jason Baker](https://opensource.com/users/jason-baker) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


教你如何比谷歌搜索更快速有效地利用 man

Summary: Linux 的帮助手册其实拥有很多有用的信息，而且比你想象中更容易使用

或许两个男人更合适。 man man<br />
如果还是不行，那可能需要一直找，直到第八个。 debug

nice

Linux 的帮助手册其实拥有很多有用的信息，而且比你想象中更容易使用

>
> Linux 的帮助手册其实拥有很多有用的信息，而且比你想象中更容易使用
>
>
>

![](/data/attachment/album/201707/25/005939nz9tlil3l5ofil54.jpg)

我们通常通过 google 来查询 Linux 中的命令说明，但是其实还有一个更好的办法：那就是通过 Linux 自带的 **man 帮助页**来查询命令详尽完整的使用说明。

man 页面的历史本身比 Linux 还长，可以追溯到 Unix 早期那个年代。 通过[这个 Wikipedia](https://en.wikipedia.org/wiki/Man_page) 可以知道，Dennis Ritchie 和 Ken Thompson 在 1971 年写了第一个 man 帮助页，那个年代的计算器使用的还是像烤箱一样的计算机，个人电脑还未出世。man 帮助页也有它自己的一套设计精炼的语法，和 Unix 与 Linux 一样，man 帮助页也不是一成不变的，它就像 Linux 内核一样不停地发展更新。

Man 帮助页通过数字标识符来分成不同类型的内容：

1. 一般用户命令
2. 系统调用命令
3. 库函数
4. 特殊的文件和驱动程序
5. 文件格式
6. 游戏和屏保
7. 杂项
8. 系统管理命令和守护进程

尽管如此，用户一般也不需要知道他们想查询的命令是属于哪一个类型的。

这些文件格式化的方式在当今许多用户看来有点古怪。因为最开始他们是用 **trooff** 的方式，通过 PostScript 打印机来打印，所以包含了头部和布局方面的格式化信息。在 Linux 中，取而代之使用了一种叫做 [groff](https://en.wikipedia.org/wiki/Groff_(software)) 的方法。

在我的 Fedora 系统中，man 帮助页相关的文件存储在 `/usr/share/man` 下的子目录中（比如 `man1` 存储第一部分的命令），还有进一步的子目录用于存储 man 帮助页的翻译。

如果你在 Shell 中查找 `man` 命令的 man 帮助页，你时间看到将是 gzip 工具压缩的 `man.1.gz` 文件。想要查询 man 帮助页，需要输入类似如下命令：

```
man man

```

这个例子会显示 `man` 命令的 man 帮助页，这将先解压 man 帮助页文件，然后解释格式化指令并用 `less` 显示结果，所以导航操作和在 `less` 中一样。

所有的 man 帮助页都应该显示这些子段落：**Name**、 **Synopsis**、 **Description**、**Examples**、**See**、**Also**。有些还会添加一些额外的子段落，比如 **Options**、 **Exit**、**Status**、 **Environment**、**Bugs**、**Files**、**Author**、**Reporting**、**Bugs**、**History**、**Copyright**。

### 详细说明一个 man 帮助页

为了更详细地介绍一个典型的 man 帮助页，就用 ls 命令的帮助页来分析吧，在 **Name** 分段下，我们可以看到如下内容：

```
ls - list directory contents

```

它会简要地告诉我 `ls` 这条命令的作用.

在 `Synopsis` 分段下，我们可以看到如下的内容:

```
ls [OPTION]... [FILE]…

```

任何在中括号中的元素都是可选的。你可以只输入 `ls` 命令，后面不接任何参数。参数后面的省略号表示你可以添加任意多个彼此兼容的参数，以及许多文件名。对于 `[FILE]` 参数，你可以指定具体的目录名，或者可以使用通配符 `*`，比如这个例子，它会显示 `Documents` 文件夹下的 `.txt` 文件：

```
ls Documents/*.txt

```

在 **Description** 分段下, 我们可以看到关于这条命令更加详细的信息，还有关于这条命令各个参数作用的详细介绍的列表，比如说 `ls` 命令第一个选项 `-a` 参数，它的作用是显示包括隐藏文件/目录在内的所有文件：

```
-a, --all

```

如果我们想用这些参数，要么用它们的别名，比如 `-a`，要么用它们的全名，比如 `--all`（两条中划线）。然而并不是所有参数都有全名和别名（比如 `--author` 只有一种），而且两者的名字并不总是相互关联的（`-F` 和 `--classify`）。当你想用多个参数时，要么以空格隔开，要么共用一个连字符 `-`，在连字符后连续输入你需要的参数（不要添加空格）。比如下面两个等价的例子：

```
ls -a -d -l

```

```
ls -adl

```

但是 `tar` 这个命令有些例外，由于一些历史遗留原因，当参数使用别名时可以不用添加连字符 `-`，因此以下两种命令都是合法的：

```
tar -cvf filearchive.tar thisdirectory/

tar cvf filearchive.tar thisdirectory/

```

**ls** 的 **Description** 分段后是 **Author**、**Reporting Bugs**、**Copyright**、 **See Also** 等分段。

**See Also** 分段会提供一些相关的 man 帮助页，没事的话可以看看。毕竟除了命令外还有许多其他类型的 man 帮助页。

有一些命令不是系统命令，而是 Bash 特有的，比如 `alias` 和 `cd`。这些 Bash 特有的命令可以在 **BASH\_BUILTINS** man 帮助页中查看，和上面的比起来它们的描述更加精炼，不过内容都是类似的。

其实通过 man 帮助页让你可以获得大量有用的信息，特别是当你想用一个已经很久没用过的命令，需要复习下这条命令的作用时。这个时候 man 帮助页饱受非议的简洁性反而对你来说是更好的。

---

作者简介：

Greg Pittman - Greg 是住在肯塔基州路易斯维尔的一位退休神经学家，但是却对计算机和编程保持着长久的兴趣，从二十世纪六十年代就开始捣腾 Fortran IV 了。随着 Linux 和开源软件的到来，更加激起了他去学习的兴趣并投身于这项事业中，并成为 Scribus 组织的一员。

---

via: <https://opensource.com/article/17/7/using-man-pages>

作者：[Greg Pittman](https://opensource.com/users/greg-p) 译者：[吴霄/toyijiu](https://github.com/toyijiu) 校对：[wxy](https://github.com/wxy)

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


那些乌央乌央的、普普通通的 Ubuntu 用户们

Summary: “不要光挠自己的痒痒，也帮你女朋友解决一下啊！还有你的同事，以及那些你最喜欢的饭店的厨子们，还有你的医生。难道你不希望你的医生专注于医治病人，而是在 apt get 以及 grep 里心烦意乱？”

我确实挺cool

好用

ubuntu用户来了，推荐过，被拒绝

还真的不清楚到底哪个发行版用的人多，各家自己也没个统计数据

一直在用mint，确实好用

hnsncxy [Chrome Mobile 45.0|Android 5.1]

我虽然是个写程序代码的，但是我也开始慢慢不再太关心操作系统层面的东西了，我用win10和ubuntu，win10为了office，ubuntu为了rstudio，其他的只要系统能够稳定的工作就可以了，我的笔记本也6年了，运行良好……老实说，unity还是gnome都无所谓，只是unity已经用习惯了，换成gnome可能会有很多迁移的问题，这是我对将来18.04最大的担忧，我可能会去KDE，毕竟我曾经用过，而且用的很好……

我一直认为哪个系统自己用的舒服就用哪个，一个系统再cool再先进再NB自己用不顺手，对自己来说就没任何意义

mac用户路过，并向你扔了一个ubuntu

对于国内的新手，觉得deepin更友好一些！

Deepin 的+1

同感。前段时间试了下gnome，各种不爽，所以换成kde了。。kubuntu17.04，还不错。

fedora还是不错的

我不是一个重度依赖Linux的用户，出于兴趣尝试了各种版本。总的来说没有十全十美的版本，或多或少每个版本你都会遇到一丁点问题，有时候还难以解决，但换一个版本又很好解决了。就桌面来说，比较讨厌unity和现在的Gnome3，感觉体验简直是退步。Mint的cinnamon，还有mate、kde现在都不错。

有些专做给 unity 的 indicators 不能用了, 因在 gnome 显示会有问题

但可用 gnome shell extensions 取代, 一般小工具都可找到替代的,

所以就算 ubuntu 18.04 来临, 转用 Gnome 3 问题也不大

Gnome 3 简单, 比其它界面灵活度高, 想用什么就自己加 Gnome Shell Extensions

https://extensions.gnome.org

资源需求也低, 这是为啥那么多 Linux 分发版选择 Gnome 的原因

KDE Plasma 虽然也有 widgets 可用，

但做得不够好, 适用与实用的工具也很少.

https://store.kde.org/browse/cat/105/ord/latest/

有很多用户用了 Gnome 3,

可惜还是不知什么是 Gnome Shell Extensions

(其实就是 Gnome 上运行的 Java Script 小工具程序, 也就是插件)

http://jasonmun.blogspot.my/2017/05/gnome-shell-extension-gnome-shell.html

自从转了kde，就没再换过

所以说只有我一个人注意到了题图是此方酱在打游戏么

来自内蒙古包头的 Chrome Mobile 40.0|Android 7.1 用户

>
> “更好的捕鼠器“ 并不是一个合格生物学家的专用谚语。就像 Ubuntu，它只需要好好工作，而不会让我惊着。
>
>
>

（LCTT 译注，“做个更好的捕鼠器”是个国外的谚语，意指不断有人发明更好的捕鼠器，然而其实没什么大的意义。）

![](/data/attachment/album/201707/25/170648izovezsne5l55nnj.jpg)

### Roblimo 的藏身处

我从来就不是一个计算机极客。事实上，我在网上第一次小有名气是为 Time/Life 写一个每周专栏的时候，这个专栏的名字是“这台老电脑”。它介绍的是一台古老的设备能够做什么——通常是在上面安装 Linux——在那之后，我又在Andover.net 上开设了一个相同的专栏，名字叫做“廉价计算”，是关于如何在这个世界省钱的——而其它那些大部分在线计算机专栏都是在让你花钱花到你没饭吃（LCTT 译者注：作者的意思是“我算是一股清流了”）。

据我所知的那些大部分的 Linux 的早期使用者，都痴迷于他们的电脑，还有那些让他们电脑有用的软件。他们乐于仔细研读源代码并且做出一点小小的修改。最关键的是，他们大多是学计算机的，或者是从事 IT 行业的。他们的计算机和计算机网络迷住了他们，就像他们本该那样似的。

我过去是（现在也是）一个作者，不是一个搞计算机的。于我而言，计算机一直都只是一个工具而已。我希望它们能够老老实实的听话，我让它们做啥就做啥，最多可以出一点点小毛病。我喜欢图形化界面，因为我记不住那么长的命令行来管理我的电脑和网络。当然，我能找到它们，也能输入它们，但是我可不想费劲。

在 Linux 这个圈子里，有那么一段时间用户很少。“你什么意思？你只是想要你的电脑去写点文章，或者最多添加点 HTML 么？”开发者和管理员这样询问道，好像所有除了编写代码之外的奉献者们都不如他们所贡献的。

但是尽管面临这些讥笑和嘲讽，我在一次又一次的宣讲和谈话中提出一个像这样的主题：“不要光挠自己的痒痒，也帮你女朋友解决一下啊！还有你的同事，以及那些你最喜欢的饭店的厨子们，还有你的医生。难道你不希望你的医生专注于医治病人，而是在 `apt get` 以及 `grep` 里心烦意乱？”

所以，是的，因为我希望能够更简单的使用 Linux，我是一个[早期的曼德拉草用户](https://linux.slashdot.org/story/00/11/02/2324224/mandrake-72-in-wal-mart-a-good-idea)，而现在，我是一个快乐的 Ubuntu 使用者。

为什么是 Ubuntu？你一定是在逗我？为什么不是呢？它是 Linux 发行版中的丰田凯美瑞（或者本田思域）！平凡而卓越。它是如此的流行，你可以在 IRC、LinuxQuestion 社区、 Ubuntu 自己的论坛，以及许许多多的地方得到帮助。

当然，使用 Debian 或者 Fedora 也是很酷的，还有 Mint 也是开箱即用又华丽万分。但是我依然感兴趣于写一些文章和添加一点点 HTML，以及在浏览器中随时看点什么、在 Google Docs 为一两个公司客气写点什么，随时接收我的邮件，用一张过去或者现在的图片做这做那……基本上我就在电脑上干点这些。

当这一切都正常的时候，我的桌面是什么样子就没有意义了。我又看不见它！它整个被应用窗口覆盖了！然后我使用了两个显示器，不仅仅是一个。我有……让我数数，17 个标签页打开在两个 Chrome 窗口中。并且 GIMP 在运行中，[Bluefish](http://bluefish.openoffice.nl/index.html)，这个我刚才在使用的东西，用来书写这篇文章。

所以对我而言，Ubuntu 是我的阻力最小的道路。Mint 或许比较可爱，但是当你使用它的时候去掉它的那些边边角角的修饰，它不就是 Ubuntu 吗？所以如果我是用一个个相同的程序，并且不能看见桌面环境，所以谁还在意它长什么样子？

有些研究表明 Mint 正在变得更加流行，而有些人说 Debian 更甚。但是在他们的研究中，Ubuntu 永远都是居于最上位的，尽管这一年又一年过去了。

所以称我为大多数人吧！说我乏味吧！称我为乌央乌央的、普普通通的 Ubuntu 用户吧——至少从现在开始……

---

作者简介：

![](/data/attachment/album/201707/25/170704lheae7vev9xh0qgm.jpg)

Robin "Roblimo" Miller 是一个自由职业作者，并且是开源技术集团的前主编，该公司旗下有 SourceForge、 freshmeat、Linux.com、NewForge、ThinkGeek 以及 Slashdot，并且他直到最近依然在 Slashdot 担任视频编辑。虽然他现在基本上退休了，但他仍然兼任 Grid Dynamics 的社论顾问，而且（显然）在为 FOSS Force 在写文章。

---

via: <http://fossforce.com/2017/01/many-humble-ubuntu-users/>

作者：[Robin "Roblimo" Miller](http://www.roblimo.com/) 译者：[svtter](https://github.com/svtter) 校对：[wxy](https://github.com/wxy)

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


开放组织公开追踪问题的好处

Summary: 在开放组织中，在线追踪问题可以将客户转变成伙伴。

在开放组织中，在线追踪问题可以将客户转变成伙伴。

>
> 在开放组织中，在线追踪问题可以将客户转变成伙伴。
>
>
>

![](/data/attachment/album/201707/25/222600rksw4zp98nswnvnk.jpg)

一个公开的问题追踪器是开放组织的重要沟通工具，和在公开渠道中开展工作相比，没有比这种方式更[透明和包容](https://opensource.com/open-organization/resources/open-org-definition)的方式了。因此，让我们来探讨一下在开放组织中使用问题跟踪器的一些最佳实践。

在开始之前，我们先来定义“<ruby> 问题追踪器 <rt>  issue tracker </rt></ruby>”的含义。简单地说，问题跟踪器是**一个共享的待办事项列表**。想象一下一张胡乱写的待办事项列表：购买面包、邮件打包、归还图书馆书籍。当你在城里开车时，把列表上的每一项划掉的感觉很好。现在，将它扩展到你需要在组织中完成的工作，并增加合适的软件协作能力。这样你就有一个问题追踪器了！

无论你使用的是 GitHub 还是其他的，如 Bitbucket、GitLab 或 Trello，问题跟踪器都是与你的伙伴进行协调的正确工具。这对将外部人员*变成*伙伴是至关重要的，这是开放组织的特征之一。那么这是如何工作的？我很高兴你问了这个问题。

### 使用问题追踪器的最佳实践

使用公共问题跟踪器将外部人员转换为伙伴的最佳实践是基于过去五年来我们在 [Gratipay](https://gratipay.com/) 的经验。我们帮助公司和其他组织为开源买单，我们喜欢使用我们的问题跟踪器与我们的社区合作。这就是我们所学到的。

**0、 隐私优先。** 在这篇文章中谈论公共问题追踪器的隐私看上去是一个奇怪的开始。但是我们必须记住，[开放本身并不是目的](https://opensource.com/open-organization/16/9/openness-means-to-what-end)，任何真诚和真正的开放是建立在安全和认可的坚实基础之上的。不要公开发布客户或其他第三方私下给你的信息，除非你明确提出了要求并且得到了他们的明确同意。采纳一个隐私政策并培训你的人员。[这篇 Gratipay 的政策](http://inside.gratipay.com/howto/seek-consent)可供参考。好的！现在这部分清楚之后，让我们继续。

**1、 默认采用公开决策。** 如果你私下做决策，你就会失去运行一个开放组织的好处，比如表达多样化的想法、招募有活力的人才、实现更大的责任感。即使你的全职员工是最初使用你的公共问题跟踪器的唯一员工，那也要这么做。 避免将你的公共问题追踪器视为二等公民。如果你在办公室进行对话，请在公共问题跟踪器上发布摘要，并在最终决策之前给你的社区留出时间来响应。这是使用问题跟踪器解锁你组织开放权力的第一步：如果它不在问题追踪器中，那就没用！

**2、 关联其他工具。** 我们许多人都喜欢 IRC 和 Slack，这并不是什么秘密。或者你的组织已经使用 Trello，但是你也想开始使用 GitHub。这没问题！在 GitHub issue 中放入 Trello 卡片的链接很容易，反之亦然。交叉关联保证了被一个或另一个问题困住的外部人员能够发现帮助它们充分理解这个问题的更多相关信息。对于聊天服务，你可能需要配置公共日志记录才能维护关联（隐私注意事项：当你这么做时，请务必在你的频道描述中宣传该事实）。也就是说，你应该在私人 Slack 或其他私人渠道中对话，就像在办公室里面对面的对话一样。换句话说，一定要总结公众问题跟踪器上的对话。看看上面说的：无论离线或在线，如果不在问题跟踪器中，那就没用！

**3、 将谈话导向追踪器中。** 社交媒体很快就能获得很多反馈，尤其是发现问题，但这不是解决问题的地方。问题跟踪器为深入的对话和分析根本原因留出了空间。更重要的是，它们是为了完成任务而优化的，而不是无限拖延。当问题解决后点击“关闭”按钮的感觉真的很好！现在将公共问题跟踪器作为你的主要工作场所，你可以开始邀请在社交媒体上与你接触的外部人员在追踪器中进一步地讨论。简单的如，“感谢您的反馈！听起来像是（某个公共问题的链接）？” ，这可以在很大程度上向外界传达你的组织没有隐藏的内容，并欢迎他们的参与。

**4、 设置一个“元”追踪器。** 在一开始，你的问题追踪器很自然聚焦在*具体产品*上。当你准备好开放到一个新的水平时，考虑设置一个关于你的*组织*本身的问题跟踪。在 Gratipay，我们有一个称之为 “Inside Gratipay”的公共问题追踪器，我们愿意在其中讨论我们组织的任何方面，从[我们的预算](https://github.com/gratipay/inside.gratipay.com/issues/928)到[我们的法律结构](https://github.com/gratipay/inside.gratipay.com/issues/72)到[我们的名字](https://github.com/gratipay/inside.gratipay.com/issues/73)。 是的，这有时有点混乱 —— 重命名组织是一个特别激烈的[争议话题](http://bikeshed.com/)！但对我们来说，在社区参与方面的好处是值得的。

**5、 将你的元追踪器用于加入过程。** 一旦你有一个元问题追踪器，就有了一个新的加入过程：邀请潜在的伙伴创建自己的入场券。如果他们以前从未使用过你的特定的问题追踪器，那么这将是他们学习的极好机会。注册帐号并提交问题应该很简单（如果不是，请考虑切换工具！）。这将让你的新伙伴尽早跨过门槛，开始分享参与感，并在组织内部拥有一席之地。当然，没有问题是愚蠢的，尤其是在某个人的入场券中更是如此。这是你的新伙伴熟悉组织工作方式时询问任何问题的地方。你需要确保快速回复他们的问题，让他们参与并帮助他们融入你的组织。这也是一个很好的方法来记录你最终授予这个人的各种系统的访问权限。至关重要的是，这可以[在雇佣他们之前](https://opensource.com/open-organization/16/5/employees-let-them-hire-themselves)开始。

**6、 雷达项目。** 大多数问题跟踪器包括一些组织和排序任务的方法。例如，GitHub 有[里程碑](https://help.github.com/articles/creating-and-editing-milestones-for-issues-and-pull-requests/)和[项目](https://help.github.com/articles/about-projects/)。这些通常旨在使组织成员的工作重点相一致。在 Gratipay，我们发现使用这些工具可以帮助协作者拥有并排序各自的工作重点。与其它的问题跟踪器通常提供的将问题分配给特定个人的做法不同，我们发现这一点提供了不同的价值。 我可能会关心别人正在积极工作的问题，或者我可能有兴趣开始某些事情，但别人先提出来我也很高兴。拥有自己的项目空间来组织我对该组织的工作的看法是与我的伙伴们沟通“我的雷达上有什么”的强大方式。

**7、 使用机器人自动化任务。** 最终，你可能会发现某些任务会一再出现。这表明自动化可以简化你的工作流程。在 Gratipay，我们[构建](https://github.com/gratipay/bot)了一个[机器人](https://github.com/gratipay-bot)帮助我们完成一些重复的任务。诚然，这是一个有点高级的用法。如果你达到了这一点，你能完全使用公共问题追踪器来开放你的组织！

如 Jim Whitehurst 所说 “吸引社区内外参与” ，这些是我们在 Gratipay 内使用我们的问题跟踪器的一些最有用的做法。也就是说，我们一直在学习。如果你有自己的经验分享，请发表评论！

---

作者简介：

Chad Whitacre - 我是 Gratipay 的创始人，Gratipay 是一个开放组织，致力于培育一个感恩、慷慨和爱的经济。我们帮助公司和其它组织为开源买单，以及赞助我们的平台。在线下，我居住在美国宾夕法尼亚州匹兹堡，在线上，我活跃在 GitHub。

---

via: <https://opensource.com/open-organization/17/2/tracking-issues-publicly>

作者：[Chad Whitacre](https://opensource.com/users/whit537) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


安卓编年史（32）：安卓 6.0 棉花糖（2）

”如果不格式化的话，你没法取出存储卡  茶道  其它地方使用“此处有误

谢谢！

![](/data/attachment/album/201707/25/232427fnfexnznirnbfnni.jpg)

#### 幕后变化

棉花糖对自棒棒糖引入的节电任务调度器 API 进行了扩展。任务调度器将应用后台进程从随意唤醒设备规整成一个有组织的系统。任务调度器基本上就是一个后台进程的交通警察。

在棉花糖中，谷歌还添加了一个 “Doze（休眠）”模式来在设备闲置的时候节约更多电量。如果设备静止不动，未接入电源，并且屏幕处于关闭状态，它会慢慢进入低功耗离线模式，锁定后台进程。在一段时间之后，网络连接会被禁用。唤醒会被锁定——应用会请求唤醒手机来运行后台进程——而它会被忽略。系统警报（不含用户设置的闹钟）以及[任务调度器](http://arstechnica.com/gadgets/2014/11/android-5-0-lollipop-thoroughly-reviewed/6/#h2)也会被关闭。

如果你曾经发现把设备设置为飞行模式，并且注意到电池续航延长了许多，Doze 就像是一个自动的飞行模式，在你手机不用的时候介入——它真的延长了电池续航。它对于整天或整夜放在桌子上的手机很有效，对于平板就更好了，因为它常常被遗忘在咖啡桌上。

唯一能把设备从 Doze 模式唤醒的来自谷歌云消息推送服务的“高优先级消息”。这是为信息服务准备的，所以即使设备处于休眠状态，也能够收取信息。

![](/data/attachment/album/201707/25/232556gd68dfhsdzs6pblt.jpg)

“应用待机”是另一项或多或少有用的节电特性，它在后台静默运行。这背后的逻辑很简单：如果你和应用停止交互一段时间，安卓就认为它是不重要的，并取消它访问网络和后台进程的权力。

![](/data/attachment/album/201707/25/232635vpk6u6fvv33tvfks.jpg)

对于应用待机而言，和一个应用“交互”意味着打开一个应用，开始一项前台服务，或者生成一条通知。任何其中的一条操作就会重置该应用的待机计时器。对于每种其它边界情况，谷歌在设置里添加了一个名字意味模糊的“电池优化”界面。用户可以在这里设置应用白名单让它免疫应用待机。至于开发者，他们在开发者设置中有个“不活跃应用”选项可以手动设置应用到待机状态来测试。

应用待机主要是自动禁用你不用的应用，这是个对抗垃圾应用或被遗忘的应用消耗电量的好方法。因为它是完全静默且后台自动执行的，它还能让新手也能拥有一部精心调教过的设备。

![](/data/attachment/album/201707/25/232719pztltpz0uuw4mvt0.jpg)

谷歌在过去几年尝试了很多应用备份方案，在棉花糖中它又[换了个方案](http://arstechnica.com/gadgets/2015/10/android-6-0-marshmallow-thoroughly-reviewed/6/#h2)。棉花糖的暴力应用备份系统的目标是保存整个应用数据文件夹到云端。这是可能的并且在技术上是可行的，但即便是谷歌自己的应用对它的支持都不怎么好。设置好一部新安卓手机依然是个大麻烦，要处理无数的登录和弹出教程。

![](/data/attachment/album/201707/25/232755bhzowigegggwghhz.jpg)

到界面这里，棉花糖的备份系统使用了谷歌 Drive 应用。在谷歌 Drive 的设置中有一个“管理备份”界面，不仅会显示新备份系统的应用数据，还有谷歌过去几年尝试的其它应用备份方案的数据。

![](/data/attachment/album/201707/25/232826kmu42uwx857dpn4u.jpg)

藏在设置里的还有一个新的“应用关联”功能，它可以将应用“链接”到网站。在应用关联出现之前，在全新安装的机器上打开一个谷歌地图链接通常会弹出一个“使用以下方式打开”的对话框，来获知你是想在浏览器还是在谷歌地图应用中打开这个链接。

这是个愚蠢的问题，因为你当然是想用应用而不是网站——这不就是你安装这个应用的原因嘛。应用关联让网站拥有者可以将他们的应用和网页相关联。如果用户安装了应用，安卓会跳过“使用以下方式打开”直接使用应用。要激活应用关联，开发者只需要在网站放一些安卓会识别的 json 代码。

应用关联对拥有指定客户端应用的站点来说很棒，比如谷歌地图、Instagram、Facebook。对于有 API 以及多种客户端的站点，比如 Twitter，应用关联界面让用户可以设置任意地址的默认关联应用。不过默认应用关联覆盖了百分之九十的用例，在新手机上大大减少了烦人的弹窗。

![](/data/attachment/album/201707/25/232904vog0jjwjjcg7jrj7.jpg)

可选存储是棉花糖的最佳特性之一。它将 SD 卡从一个二级存储池转换成一个完美的合并存储方案。插入 SD 卡，将它格式化，然后你就有了更多的存储空间，而这是你从来没有想过的事情。

![](/data/attachment/album/201707/25/232938c6h3g7ahaqczhh33.jpg)

插入 SD 卡会弹出一条设置通知，用户可以选择将卡格式化成“外置”或“内置”存储。“内置”存储选项就是新的可选存储模式，它会将存储卡格式化为 ext4 文件系统。唯一的缺点？那就是存储卡和数据都被“锁定”到你的手机上了。如果不格式化的话，你没法取出存储卡插到其它地方使用。谷歌对于内置存储的使用场景判断就是一旦设置就不再更改。

![](/data/attachment/album/201707/25/233014oa5mr4vvawx114vn.jpg)

如果你强行拔出了 SD 卡，安卓会尽它最大的努力处理好。它会弹出一条消息“建议最好将 SD 卡插回”和一个“忘记”这张卡的选项。当然“忘记”这张卡将会导致各种数据丢失，建议最好不要这么做。

不幸的是实际上可以使用可选存储的设备很长时间都没有出现。Nexus 设备不支持存储卡，所以为了测试我们插上了一个 U 盘作为我们的可选存储。OEM 厂商最初抵制这项功能，[LG 和三星](http://arstechnica.com/gadgets/2016/02/the-lg-g5-and-galaxy-s7-wont-support-android-6-0s-adoptable-storage/)都在他们 2016 年初的旗舰机上禁用了它。三星说“我们相信我们的用户需要 microSD 卡是用来在手机和其它设备之间转移数据的”，一旦卡被格式化成 ext4 这就不可能了。

谷歌的实现让用户可以在外置和内置存储选项之间选择。但 OEM 厂商完全拿掉了内置存储功能，不给用户选择的机会。高级用户们对此很不高兴，并且安卓定制组们很快就重启启用了可选存储。在 Galaxy S7 上，第三方定制组甚至在官方发布的[的前一天](http://www.androidpolice.com/2016/03/10/modaco-manages-to-get-adoptable-sd-card-storage-working-on-the-galaxy-s7-and-galaxy-s7-edge-no-root-required/)解除了三星的 SD 卡锁定。

#### 音量和通知

![](/data/attachment/album/201707/25/233049grpxdr58j3qg8c7l.jpg)

为了更简洁的设计，谷歌将通知优先级控制从音量弹窗中移除了。按下音量键会弹出一个单独的滑动条，对应当前音源控制，还有一个下拉按钮可以展开控制面板，显示所有的三个声音控制条：通知，媒体和闹钟。所有的通知优先级控制还在——它们现在在一个“勿扰模式”的快速设置方块中。

![](/data/attachment/album/201707/25/233131z491zog8byjxby88.jpg)

通知控制最有用的新功能之一是允许用户控制抬头通知——现在叫“预览”通知。这项功能让通知在屏幕顶部弹出，就像 iOS 那样。谷歌认为最重要的通知应该提升到高于你普通日常通知的地位。

![](/data/attachment/album/201707/25/233204rgi7l55ia5gggiic.jpg)

但是，在棒棒糖中，这项特性引入的时候，谷歌糟糕地让开发者来决定他们的应用是否“重要”。毫无疑问，所有开发者都认为他的应用是世界上最重要的东西。所以尽管最初这项特性是为你亲密联系人的即时消息设计的，最后变成了被 Facebook 的点赞通知所操控。在棉花糖中，每个应用在通知设置都有一个“设置为优先”复选框，给了用户一把大锤来收拾不守规矩的应用。

---

![](/data/attachment/album/201706/24/162535j8ke2nu4ccvw44g9.jpg)

[Ron Amadeo](http://arstechnica.com/author/ronamadeo) / Ron 是 Ars Technica 的评论编缉，专注于安卓系统和谷歌产品。他总是在追寻新鲜事物，还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo](https://twitter.com/RonAmadeo)

---

via: <http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/32/>

作者：[RON AMADEO](http://arstechnica.com/author/ronamadeo) 译者：[alim0x](https://github.com/alim0x) 校对：[wxy](https://github.com/wxy)

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


安卓编年史（33）：安卓 7.0 牛轧糖，Pixel 手机，以及未来

Summary: 见证这这些改变，我们可能正处在安卓历史上最不确定的点上。但在安卓最近的 2016 年 10 月活动前，安卓、Chrome OS以及谷歌 Play 的 SVP Hiroshi Lockheimer 说，他相信我们将来都会动情回顾这些最新的安卓更新。

这个系列文章暂告一段落啦？

没错，结束了！

![](/data/attachment/album/201707/25/234357jg7i9lkllrmop9dh.jpg)

#### 每月安全更新

![](/data/attachment/album/201707/25/235023dh7hy9zxhoovztgx.jpg)

在棉花糖发布的几个月前，安卓的“Stagefright”媒体服务器漏洞被披露给了公众，这个漏洞允许在旧版本安卓上远程执行代码。由于这个漏洞影响到了数十亿安卓设备，安卓受到了媒体广泛的批评。

谷歌则以开始一项月度安卓安全更新项目作为回应。每个月它都会收集 bug，修复它们，然后推送新代码给 AOSP 和 Nexus 设备。OEM 厂商——它们已经在更新的泥潭中挣扎（也许是因为不关心）——基本上就是被告知“面对现实”然后跟上步伐。每个其它的主流操作系统有经常的安全更新——这就是成为这么大的平台的代价。为了协调 OEM 厂商，谷歌让他们提前一个月可以获取到更新。30 天之后，发布安全公告并将更新推送给谷歌设备。

月度更新项目是在棉花糖发布的两个月前开始的，但在这个主要的系统更新中谷歌添加了一栏“安卓安全补丁程序级别”到关于手机界面中。这里没有使用晦涩难懂的版本号，就用了日期来表示。这让任何人都能轻松看懂手机系统过时了多久，是个很好的让动作缓慢的 OEM 厂商羞愧的方式。

![](/data/attachment/album/201707/25/234601dsbdbk8bi3r062ud.jpg)

文本选择菜单现在是个浮动工具条，会在你选择的时候在文本旁边弹出。这里也不止是常规的“剪切/复制/粘贴”命令。应用可以在工具栏上放置特殊选项，比如谷歌文档里的“添加链接”。

在标准的文本命令之后，一个省略号按钮会显示一个二级菜单，应用可以在这里给文本选择菜单添加额外的功能。使用新的“文本处理”API，直接给其它应用传递文本现在变得非常轻松。如果你装了谷歌翻译，在这个菜单上会显示一个“翻译”选项。谷歌搜索也在这个工具栏里为谷歌 Now on Tap 添加了一个“助理”选项。

![](/data/attachment/album/201707/25/234636innnohx72nfqf71w.jpg)

棉花糖添加了一个隐藏的设置，叫做“系统界面调谐器”。这个部分包含了全方位的高级用户特性和试验性项目。要访问这个设置，你需要下拉通知中心，按住“设置”按钮几秒钟。设置齿轮会旋转，然后最终你会看到一条消息显示系统界面调谐器已解锁。一旦它被打开，你就可以在系统设置的底部，开发者选项附近找到它了。

![](/data/attachment/album/201707/25/234712uengdnssrplz9gee.jpg)

在系统界面调谐器的第一部分，用户可以在快速设置面板添加自定义瓷片，这项特性后来被重制成了应用可以使用的 API。此时这项特性还很粗糙，基本就是允许用户在文本框里输入一条自定义命令。系统状态图标可以单独打开或关闭，所以如果你真的很讨厌知道你已经连接到另外无线网络，你可以把这个图标关闭。这里有一项受欢迎的电源显示新增特性，可以将电池电量百分比显示嵌入到电池图标中。还有个用来截屏的“演示”模式，它会将正常的状态栏替换成一个假的，干净的版本。

![](/data/attachment/album/201707/25/234748xm9k41hdd7p9f2oa.jpg)

### 安卓 7.0 牛轧糖，Pixel 手机，以及未来

[安卓 7.0 牛轧糖](http://arstechnica.com/gadgets/2016/08/android-7-0-nougat-review-do-more-on-your-gigantic-smartphone/)和 [Pixel 手机](http://arstechnica.com/gadgets/2016/10/google-pixel-review-bland-pricey-but-still-best-android-phone/)几个月前刚刚发布，你可以读读我们对它们的完整评测。二者都有无数我们还没看到最终效果的特性和影响，所以我们暂且搁置，等它真正成为“历史”之后再进行评说。

牛轧糖为了 Daydream VR 对[图形和传感器](http://arstechnica.com/gadgets/2016/08/android-7-0-nougat-review-do-more-on-your-gigantic-smartphone/11/#h1)做出了很大的改动，Daydream VR 是谷歌即将来临的智能手机驱动 VR 体验，[我们已经尝试过了](http://arstechnica.com/gadgets/2016/10/daydream-vr-hands-on-googles-dumb-vr-headset-is-actually-very-clever/)但还没花时间写下点什么。从 Chrome OS 借鉴来了新的“无缝升级”功能，系统拥有两个系统分区，可以在你使用其中一个的时候，对另一个在后台进行静默升级。考虑到 Pixel 是这个功能的唯一首发设备，并且还没有收到更新，我们也不确定这个功能是什么样子的。

![](/data/attachment/album/201707/25/234828lvgyzx3093n0ssr3.jpg)

牛轧糖最有趣的新功能之一是改进的应用框架，它允许改变应用尺寸大小。这让谷歌可以在手机和平板上实现分屏，在安卓 TV 上实现画中画，以及一个神秘的浮动窗口模式。我们已经能够通过一些软件技巧来访问浮动窗口模式，但还没有看到谷歌在实际产品中使用它。难道它的目标是桌面计算？

安卓和 Chrome OS 则继续走在共同成长的道路上。安卓应用现在已经能够在一些 Chromebook 上[运行了](http://arstechnica.com/gadgets/2016/05/if-you-want-to-run-android-apps-on-chromebooks-youll-need-a-newer-model/)，给了这个“仅 Web”的系统 Play 商店以及一系列的应用生态。有传言称 Chrome OS 和安卓未来将会更加紧密结合成“[Andromeda](http://arstechnica.com/gadgets/2016/09/android-chrome-andromeda-merged-os-reportedly-coming-to-the-pixel-3/)”——一个“Android”和“Chrome”混合而成的词——它可能是一个融合的 Chrome/安卓系统的代号。

我们还没有看到 Pixel 手机会创造怎样的历史。谷歌最近发布了两部新旗舰机 Pixel 和 Pixel XL，加入了硬件竞争之中。谷歌之前和合作伙伴合作生产联名的 Nexus 手机，但 Pixel 产品线用的是“Google”品牌。谷歌声明这是一个完全的硬件 OEM，HTC 是合同制造商，就类似苹果把富士康作为合同制造商那样。

拥有自己的硬件改变了谷歌制造软件的方式。谷歌发布了“谷歌助理”作为未来版的“OK Google”语音命令系统。但助理是 Pixel 的独占特性，谷歌没有把它推送给所有安卓设备。谷歌对界面做了一些改变，一个定制版的“Pixel 启动器”主屏应用和一套新的系统界面，这些都是 Pixel 独占的。我们需要时间来见证未来功能点在“安卓”和“Pixel”之间的平衡。

见证这这些改变，我们可能正处在安卓历史上最不确定的点上。但在安卓最近的 2016 年 10 月活动前，安卓、Chrome OS以及谷歌 Play 的 SVP [Hiroshi Lockheimer](http://arstechnica.com/gadgets/2016/10/chatting-with-googles-hiroshi-lockheimer-about-pixel-android-oems-and-more/) 说，他相信我们将来都会动情回顾这些最新的安卓更新。Lockheimer 是现在谷歌事实上的软件统治者，他认为最新的更新会是自安卓八年前亮相以来最有意义的事件。尽管在发布会后他没有对这个观点进行详细阐述，但事实表明明年这时候我们*可能*都不会讨论安卓了——它可能已经是一个安卓/Chrome OS 结合体了！正如 2008 年以来那样，安卓历史的下一篇章一定会更加有趣。

---

![](/data/attachment/album/201706/24/162535j8ke2nu4ccvw44g9.jpg)

[Ron Amadeo](http://arstechnica.com/author/ronamadeo) / Ron 是 Ars Technica 的评论编缉，专注于安卓系统和谷歌产品。他总是在追寻新鲜事物，还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo](https://twitter.com/RonAmadeo)

---

via: <http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/33/>

作者：[RON AMADEO](http://arstechnica.com/author/ronamadeo) 译者：[alim0x](https://github.com/alim0x) 校对：[wxy](https://github.com/wxy)

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


ss：查看网络连接的另一种方法

Summary: ss，它是 iproute2 包附带的另一个工具，允许你查询 socket 的有关统计信息。可以完成 netstat 同样的任务，但是，ss 稍微快一点而且命令更简短。

netstat 是 BSD 的项目 net-tools，已经不适合 Linux 了。要说不好，就是 ss 也是纳粹党卫军的缩写。

感觉可以哦昂

![](/data/attachment/album/201707/27/143650z3odo3rem3ndoeln.jpg)

在之前的文章中，我提到过 `ss`，它是 iproute2 包附带的另一个工具，允许你查询 socket 的有关统计信息。可以完成 `netstat` 同样的任务，但是，`ss` 稍微快一点而且命令更简短。

直接输入 `ss`，默认会显示与 `netstat` 同样的内容，并且输入类似的参数可以获取你想要的类似输出。例如：

```
$ ss -t
State       Recv-Q Send-Q       Local Address:Port                        Peer Address:Port
ESTAB       0      0                127.0.0.1:postgresql                     127.0.0.1:48154
ESTAB       0      0            192.168.0.136:35296                      192.168.0.120:8009
ESTAB       0      0            192.168.0.136:47574                     173.194.74.189:https
[…]
```

`ss -t` 只显示 TCP 连接。`ss -u` 用于显示 UDP 连接，`-l` 参数只会显示监听的端口，而且可以进一步过滤到任何想要的信息。

我并没有测试所有可用参数，但是你甚至可以使用 `-K` 强制关闭 socket。

`ss` 真正耀眼的地方是其内置的过滤能力。让我们列出所有端口为 22（ssh）的连接：

```
$ ss state all sport = :ssh
Netid State      Recv-Q Send-Q     Local Address:Port                      Peer Address:Port
tcp   LISTEN     0      128                    *:ssh                                  *:*
tcp   ESTAB      0      0          192.168.0.136:ssh                      192.168.0.102:46540
tcp   LISTEN     0      128                   :::ssh                                 :::*
```

如果只想看已建立的 socket（排除了 *listening* 和 *closed* ）：

```
$ ss state connected sport = :ssh
Netid State      Recv-Q Send-Q     Local Address:Port                      Peer Address:Port
tcp   ESTAB      0      0          192.168.0.136:ssh                      192.168.0.102:46540
```

类似的，可以列出指定的 host 或者 ip 段。例如，列出到达 74.125.0.0/16 子网的连接，这个子网属于 Google：

```
$ ss state all dst 74.125.0.0/16
Netid State      Recv-Q Send-Q     Local Address:Port                      Peer Address:Port
tcp   ESTAB      0      0          192.168.0.136:33616                   74.125.142.189:https
tcp   ESTAB      0      0          192.168.0.136:42034                    74.125.70.189:https
tcp   ESTAB      0      0          192.168.0.136:57408                   74.125.202.189:https
```

`ss`与 iptables 的语法非常相同，如果已经熟悉了其语法，`ss` 非常容易上手。也可以安装 iproute2-doc 包， 通过 `/usr/share/doc/iproute2-doc/ss.html` 获得完整文档。

还不快试试! 你就可以知道它有多棒。无论如何，让我输入的字符越少我越高兴。

---

via: <https://insights.ubuntu.com/2017/07/25/ss-another-way-to-get-socket-statistics/>

作者：[Mathieu Trudel-Lapierre](https://insights.ubuntu.com/author/mathieu-trudel-lapierre/) 译者：[VicYu](https://vicyu.com) 校对：[wxy](https://github.com/wxy)

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


Neo4j 图数据库基础

Summary: 对于海量的各种非结构化信息来说，图数据库已经成为帮助收集、管理和搜索大量数据的技术。在本文中，我将向你展示图数据库的基础知识，帮助你快速了解概念模型。

>
> 在这个三篇系列文章的第一篇文章中，我们将学习<ruby> 图数据库 <rp>  （ </rp> <rt>  graph database </rt> <rp>  ） </rp></ruby>的基础知识，它支持了这地球上最大的一些数据池。
>
>
>

![](/data/attachment/album/201707/27/151320s28j8eep22rxee3x.jpg)

对于海量的各种非结构化信息来说，图数据库已经成为帮助收集、管理和搜索大量数据的技术。在这三篇系列文章中，我们将使用开源图数据库软件 [Neo4j](https://neo4j.com/) 来研究图数据库。

在本文中，我将向你展示图数据库的基础知识，帮助你快速了解概念模型。在第二篇中，我将向你展示如何启动 Neo4j 数据库，并使用内置的浏览器工具填充一些数据。而且，在本系列的最后一篇文章中，我们将探讨一些在开发工作中使用的 Neo4j 编程库。

掌握图数据库的概念模型是有用的，所以我们从那里开始。图数据库中只存储两种数据：<ruby> 节点 <rt>  node </rt></ruby>和<ruby> 边 <rt>  edge </rt></ruby>。

* **节点是实体：**诸如人物、发票、电影、书籍或其他具体事物。这些有些等同于关系数据库中的记录或行。
* **边名关系：**连接节点的概念、事件或事物。在关系数据库中，这些关系通常存储在具有链接字段的数据库行中。在图数据库中，它们本身就是有用的，是可以以其自己的权限搜索的对象。

节点和边都可以拥有可搜索的*属性*。例如，如果你的节点代表人，他们可能拥有名字、性别、出生日期、身高等属性。而边的属性可能描述了两个人之间的关系何时建立，见面的情况或关系的性质。

这是一个帮助你可视化的图表：

![Graph database image 1](/data/attachment/album/201707/27/151332zo25dcsscdy42z7d.jpg "Graph database image 1")

在这张图中，你知道 Jane Doe 有一个新的丈夫 John；一个女儿（来自她以前的夫妻关系）Mary Smith 和朋友 Robert 和 Rhonda Roe。Roes 有一个儿子 Ryan，他正在与 Mary Smith 约会。

看看它怎么工作？每个节点代表一个独立于其他节点的人。你需要找到关于*那个*人的一切都可以存储在节点的属性中。边描述了人们之间的关系，这与你在程序中需要的一样多。

关系是单向的，且不能是无向的，但这没有问题。由于数据库可以以相同的速度遍历两个方向，并且方向可以忽略，你只需要定义一次此关系。如果你的程序需要定向关系，则可以自由使用它们，但如果双向性是暗含的，则不需要。

另外需要注意的是，图数据库本质上是无 schema 的。这与关系数据库不同，关系数据库每行都有一组列表，并且添加新的字段会给开发和升级带来很多工作。

每个节点都可以拥有一个<ruby> 标签 <rt>  label </rt></ruby>；对于大多数程序你需要“输入”这个标签，是对典型的关系数据库中的表名的模拟。标签可以让你区分不同的节点类型。如果你需要添加新的标签或属性，修改程序来用它就行！

使用图数据库，你可以直接开始使用新的属性和标签，节点将在创建或编辑时获取它们。不需要转换东西；只需在你的代码中使用它们即可。在这里的例子中，你可以看到，我们知道 Jane 和 Mary 最喜欢的颜色和 Mary 的出生日期，但是别人没有（这些属性）。这个系统不需要知道它；用户可以在正常使用程序的过程中访问节点时为其添加信息（属性）。

作为一名开发人员，这是一个有用的特性。你可以将新的标签或属性添加到由节点处理的表单中并开始使用它，而不必进行数据库 schema 的修改。对于没有该属性的节点，将不显示任何内容。你可以使用任何一种类型的数据库来为表单进行编码，但是你可以放下在关系型数据库中要进行的许多后端工作了。

让我们添加一些新的信息：

![Graph database image 2, defining a new type of node](/data/attachment/album/201707/27/151333ikbaaegwkpdb7vxa.jpg "Graph database image 2, defining a new type of node")

这是一个新的节点类型，它代表一个位置，以及一些相关关系。现在我们看到 John Doe 出生在加利福尼亚州的 Petaluma，而他的妻子 Jane 则出生在德克萨斯州的 Grand Prairie。 他们现在住在得克萨斯州的赛普拉斯，因为 Jane 在附近的休斯顿工作。Ryan Roe 缺乏城市关系对数据库来说没有什么大不了的事情，我们*不知道*那些信息而已。当用户输入更多数据时，数据库可以轻松获取新数据并添加新数据，并根据需要创建新的节点和关系。

了解节点和边应该足以让你开始使用图形数据库。如果你像我一样，已经在考虑如何在一个图中重组你的程序。在本系列的下一篇文章中，我将向你展示如何安装 Neo4j、插入数据，并进行一些基本的搜索。

---

via: <https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j>

作者：[Ruth Holloway](https://opensource.com/users/druthb) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


热烈祝贺！LCTT 第一位达成翻译 500 篇成就的译者 geekpi ！

默默顶一个

强势点赞！！！！！！！！

thank you guys

点赞！感谢！

辛苦了，大侠们，有了你们在下面挖井，我们菜鸟们才有水喝。辛苦了

这就是开源精神的真正体现啊！

谢谢贡献！

谢谢贡献

非常感谢！

膜拜大神，非常感谢！

谢谢啦～

good job. appreciate the contributions.

这必须支持啊，辛苦了！

资磁。。

感谢！

感谢

为一切美好，辛苦了。

十分感谢

支持

有积极打造各种轮子的 bestony 的 vizv

:D

![](/data/attachment/album/201707/27/164802tifmlruifdad77wu.jpg)

**今天，Linux 中国开源社区很高兴地宣布，我们旗下的翻译组织 LCTT 的译者 geekpi 在对社区持续贡献了 1371 天之后，胜利达成了 500 篇翻译的成就！**

Linux 中国发展至今，得到了社区各界的鼎力支持，其中支持我们走到今天的一大基础就是成立于 2013 年 9 月 10 日的 LCTT。在这将近四年间，LCTT 为 Linux 中国和开源世界贡献了近 3000 篇文章，其中不乏精心打造的诚意之作，也有颇多的文章值得再三回味品读。

这期间，涌现出了许许多多的贡献者，他们其中有年轻的学生，也有从业多年的专家；有从事嵌入式开发的，也有从事系统运维的；有从事互联网工作的，也有从事医疗行业的。几年来，LCTT 像个大家庭一样，来了很多朋友，也送走了一些兄弟；有因病故去的前选题负责人 DeadFire， 也有勇接重任挑起选题工作的 oska874；有默默承担起 LFS 主要翻译的 martin2011qi 和技术支持的 vizv，也有将漫画翻译推动上线的 bestony 和 GHLandy；有积极打造各种轮子的 bestony 和 vizv，也有默默持之以恒翻译的 geekpi。

今天，我要着重向大家介绍的就是这位 geekpi ！

据 geekpi 的 [LCTT 专页](https://linux.cn/lctt/geekpi)，他于 LCTT 成立一个月后加入了我们，并一直持续活动到今天。他极少出现在我们内部沟通的 QQ 群内，甚至，几乎没有人知道他的名字、年龄、样貌和职业，甚至，连我也只知道一个可以联系到他的快递地址而已。

在 LCTT 里，他是翻译贡献遥遥领先的第一译者，其翻译数量几乎是第二名的三倍、第三名的四倍，其翻译数量是第二名到第七名的总和，占到了 LCTT 翻译总量的 1/6！

![](/data/attachment/album/201707/27/164415blqkkltm042v0imv.jpg)

*Top 10 of LCTT Translators*

可以说，在我们每年惯例制作的 LCTT 仓库活动的视频中，他是除了作为校对、发布的我和选题 oska874 之外活动最多的人。

让我们向这位默默奉献的译者 geekpi 致敬！或许，这种不为名，不为利，才是一种纯粹的开源贡献精神吧！

这是他的 LCTT 专页成就，请大家膜拜：

![](/data/attachment/album/201707/27/164449gzq68jzqu226hzzh.jpg)

*geekpi's profile of LCTT*

最后，有志于加入我们 LCTT 的朋友，[请点此了解 LCTT](https://linux.cn/lctt/)。


在 Linux Mint 安装 Linux Kernel 4.12（稳定版）

Summary: Linus Torvalds 发布了 Linux 内核 4.12。你可以从这里直接下载相关的 deb 包来安装。或者，继续阅读本文，按下面的步骤安装新内核。

![](/data/attachment/album/201707/27/230446qhytdigtz2t6kfn0.jpg)

**Linus Torvalds** 发布了 **Linux 内核 4.12**。你可以从**[这里](https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL2tlcm5lbC51YnVudHUuY29tL35rZXJuZWwtcHBhL21haW5saW5lL3Y0LjEyLw%3D%3D)**直接下载相关的 **deb** 包来安装。或者，继续阅读本文，按下面的步骤安装新内核。

**警告：Linux 内核是系统的关键元素。在某个硬件设备不正常工作时，可以尝试执行升级，新的内核可能会解决此问题。 但同样的，非必须地更新一个新的内核也可能导致不必要的回滚，例如，无网络连接， 没有声音，甚至是无法正常启动系统，所以安装一个新的内核，请正确认识风险。**

最简单的安装任意内核方法 - 在**Linux Mint** 使用 [UKUU](https://mintguide.org/tools/691-ukuu-ubuntu-kernel-upgrade-utility.html)。

```
TerminalShekin@mylinuxmintpc~$sudo apt-add-repository -y ppa:teejee2008/ppa
sudo apt-get update
sudo apt-get install ukuu

```

**提醒：所有的 Nvidia/AMD 电脑用户， 在安装内核之前，建议切换到 free 版本的驱动。**

**如果决定删除内核 4.12，**

1. 首先，重启计算机，选择 GRUB 菜单中的旧内核启动。系统引导完成之后，通过以下命令删除新的内核：
2. 然后，使用 [UKUU](https://mintguide.org/tools/691-ukuu-ubuntu-kernel-upgrade-utility.html) 程序，或者命令：`sudo apt purge linux-image-4.12-*`
3. 最后，更新 **GRUB** 或者 **[BURG](https://mintguide.org/effects/716-burg-graphical-bootloader-install-to-linux-mint.html)**：`sudo update-grub`

在启动 **GRUB** 的时候，选择**以前的 Linux 版本**即可回到以前版本的内核。

Good Luck!!!

---

via: <https://mintguide.org/system/798-install-linux-kernel-4-12-stable-on-linux-mint.html>

作者：[Shekin](https://mintguide.org/user/Shekin/) 译者：[VicYu](https://vicyu.com) 校对：[wxy](https://github.com/wxy)

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


漏洞修复八个月后，仍有超过七万台 memcached 服务器面临危险

![](/data/attachment/album/201707/28/121131nhlbbn7byalcak6k.jpg)

在开源缓存软件 memcached 修复了三个关键漏洞的八个月之后，仍有超过 70000 台未打补丁的缓存服务器直接暴露在互联网上。安全研究员警告说，黑客可能会在服务器上执行恶意代码或从其缓存中窃取潜在的敏感数据。

[memcached](https://memcached.org/) 是一个实现了高性能缓存服务的软件包，用于在内存中存储从数据库和 API 调用中获取的数据块。这有助于提高动态 Web 应用程序的响应速度，使其更加适合大型网站和大数据项目。

虽然 memcached 不是数据库的替代品，但它存储在内存中的数据包括了来自数据库查询的用户会话和其他敏感信息。因此，该服务器在设计上并不能直接暴露在互联网等不受信任的环境中，其最新的版本已经支持了基本身份验证。

去年 10 月份，memcached 的开发者修复了由 [思科 Talos 部门](https://www.talosintelligence.com/) 安全研究员发现并报告的三个远程代码执行漏洞（[CVE-2016-8704](https://www.talosintelligence.com/reports/TALOS-2016-0219/)、[CVE-2016-8705](https://www.talosintelligence.com/reports/TALOS-2016-0220/) 和 [CVE-2016-8706](https://www.talosintelligence.com/reports/TALOS-2016-0221/)）。所有这些漏洞都影响到了 memcached 用于存储和检索数据的二进制协议，其中一个漏洞出现在 [Simple Authentication and Security Layer](https://tools.ietf.org/html/rfc4422) （SASL）的实现中。

在去年 12 月到今年 1 月期间，成队的攻击者从数万个公开的数据库中擦除数据，这包括 MongoDB、CouchDB、Hadoop 和 Elasticsearch 集群。在很多情况下，攻击者勒索想要恢复数据的服务器管理员，然而没有任何证据表明他们的确对所删除的数据进行了复制。

Talos 的研究人员认为， memcached 服务器可能是下一个被攻击的目标，特别是在几个月前发现了漏洞之后。所以在二月份他们决定进行一系列的互联网扫描来确定潜在的攻击面。

扫描结果显示，大约有 108000 个 memcached 服务器直接暴露在互联网上，其中只有 24000 个服务器需要身份验证。如此多的服务器在没有身份验证的情况下可以公开访问已经足够糟糕，但是当他们对所提交的三个漏洞进行测试时，他们发现只有 200 台需要身份验证的服务器部署了 10 月的补丁，其它的所有服务器都可能通过 SASL 漏洞进行攻击。

总的来说，暴露于互联网上的 memcached 服务器有大约 80%，即 85000 个都没有对 10 月份的三个关键漏洞进行安全修复。

由于补丁的采用率不佳，Talos 的研究人员决定对所有这些服务器的 IP 地址进行 whois 查询，并向其所有者发送电子邮件通知。

本月初，研究人员决定再次进行扫描。他们发现，虽然有 28500 台服务器的 IP 地址与 2 月份时的地址不同，但仍然有 106000 台 memcached 服务器暴露在因特网上。

在这 106000 台服务器中，有大约 70%，即 73400 台服务器在 10 月份修复的三个漏洞的测试中仍然受到攻击。超过 18000 个已识别的服务器需要身份验证，其中 99% 的服务器仍然存在 SASL 漏洞。

即便是发送了成千上万封电子邮件进行通知，补丁的采用率也仅仅提高了 10%。

Talos 研究人员在周一的[博客](http://blog.talosintelligence.com/2017/07/memcached-patch-failure.html)中表示：“这些漏洞的严重程度不能被低估。这些漏洞可能会影响到小型和大型企业在互联网上部署的平台，随着最近大量的蠕虫利用漏洞进行攻击，应该为全世界的服务器管理员敲响警钟。如果这些漏洞没有修复，就可能被利用，对组织和业务造成严重的影响。”

这项工作的结论表明，许多网络应用程序的所有者在保护用户数据方面做得不好。首先，大量的 Memcached 服务器直接暴露在互联网上，其中大多数都没有使用身份验证。即使没有任何漏洞，这些服务器上缓存的数据也存在着安全风险。

其次，即使提供了关键漏洞的补丁，许多服务器管理员也不会及时地进行修复。

在这种情况下，看到 memcached 服务器像 MongoDB 数据库一样被大规模攻击也并不奇怪。

---

via: <https://thenewstack.io/70000-memcached-servers-can-hacked-using-eight-month-old-flaws/>

作者：[Lucian Constantin](https://thenewstack.io/author/lucian/) 译者：[firmianay](https://github.com/firmianay) 校对：[wxy](https://github.com/wxy)

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


Linux “天气预报”

Summary: 本页面是为了跟踪在不久的将来某个时间内有可能出现在主线内核和/或主要发行版中的 Linux 开发社区的进展情况。你的“首席气象学家”是 LWN.net 执行主编 Jonathan Corbet。

希望能报道Linux API Headers的变化

![](/data/attachment/album/201707/28/123643m3x536ztt153g0tk.jpg)

### 欢迎来到 Linux 天气预报

本页面是为了跟踪在不久的将来某个时间内有可能出现在主线内核和/或主要发行版中的 Linux 开发社区的进展情况。你的“首席气象学家”是 [LWN.net](http://www.lwn.net/) 执行主编 Jonathan Corbet。如果你有改进预测的建议（特别是如果你有一个你认为应该跟踪的项目或修补程序的情况下），请在下面补充你的意见。

### 预测摘要

**当前情况**：内核 4.12 于 7 月 2 日发布。它包含了许多新功能，包括：

* [BFQ 和 Kyber 块 I/O 调度器](https://lwn.net/Articles/720675/)。已经开发多年的 BFQ 在交互式系统上表现更好，这引起了移动设备领域的兴趣。相反，Kyber 是一个更简单的调度程序，旨在用于通常出现在企业配置中的快速设备。
* epoll\_wait() 系统调用现在可以执行网络套接字的繁忙轮询。
* 实时修补机制已经实现了[混合一致性模型](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d83a7cb375eec21f04c83542395d08b2f6641da2)，这将可以把更复杂的补丁应用于运行中的内核。
* [可信执行框架](https://lwn.net/Articles/717125/)应该使得内核与在 ARM TrustZone 安全世界中运行的代码之间的交互更加容易。

4.12 是最繁忙的内核开发周期之一，合并了近 15000 次更新。有关这些变化来源的概述，请参阅[这里](https://lwn.net/Articles/726950/)。

**短期预测**：4.13 内核预期在 2017 年 9 月初发布。这个内核中会出现的一些变化是：

* 更好地支持非阻塞直接块 I/O 操作。
* [结构布局随机化机制](https://lwn.net/Articles/722293/)是正在进行的内核加固防攻击项目的下一步。
* 内核现在已经[原生支持 TLS 网络协议](https://lwn.net/Articles/666509/)。
* 采取[透明大页交换](https://lwn.net/Articles/717707/)，这使得有更好的内存管理性能。
* 块子系统中回写错误的处理[已经改进](https://lwn.net/Articles/724307/)，这使得错误不太可能不告知程序而写入数据。

4.13 内核现在处于稳定时期，所以在这个开发周期的剩余时间内只会接受修复补丁。

这篇[文章](http://purl.org/dc/elements/1.1/)根据[知识共享署名 - 共享 3.0 许可证](http://creativecommons.org/licenses/by-sa/3.0/)获得许可。

---

via: <https://www.linux.com/news/2017/7/linux-weather-forecast>

作者：[JONATHAN CORBET](https://www.linux.com/users/corbet) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


一年之后，React.js 许可协议再起争端

这个博客主题真是太难看了

这很不facebook

有很多公司都開始用轉用Vue

>
> 在 2016 年 7 月，Facebook 公司的 React.js 开源许可协议曾引起激烈争论。一年过后，该协议再次成为开源社区的头条新闻。
>
>
>

![](/data/attachment/album/201707/28/210036ozbse4fr1y1sofrb.jpg)

### 背景介绍

React.js 是 Facebook 推出的一个用来构建用户界面的 JavaScript 库，起源于 Facebook 的内部项目，用来架设 Instagram 的网站。

* 2013 年 5 月，[Facebook 将 React.js 开源](https://code.facebook.com/projects/176988925806765/react/)。
* 2016 年 7月，React.js 开源许可协议中的附加专利条款引发争议。
* 2016 年 11 月，Facebook [发布官方问答](https://react-etc.net/entry/react-patents-facebook-license-faq-adoption-by-apple-and-microsoft)，对附加专利条款进行澄清。
* 2017 年 7 月，Apache 基金会禁止使用遵循 BSD 许可证 + 专利开源协议的 JAR 包。

### Apache 基金会的立场

2017 年 7 月，针对 Facebook 公司的 BSD 许可证 + 专利开源协议，Apache 基金会提出了如下建议：

1. 任何新项目、子项目或代码库都不允许使用遵循 Facebook 公司 “BSD 许可证 + 专利开源协议”的 jar 包。换句话说，如果你之前没有使用过，之后也不允许去使用。这种许可协议被 Apache 基金会列为 X 类别（Cat-X）。
2. 如果你一直在使用，并且在 **release** 中已经这么做了，那么在 2017 年 8 月 31 日之前，你将暂时从 X 类别中被排除。在此之后，任何和所有使用 Facebook 公司 “BSD 许可证+专利开源协议”的产品都将被 Apache 基金会禁止使用，你必须找到采用了合适许可证的替代品，或者放弃使用。这种情况没有例外。
3. 上述条款没有涵盖的任何其他情形也禁止使用。

X 类别被定义为“Apache 产品中可能不允许的许可证”，目前包括 GNU GPL、GNU LGPL、BCL、BSD-4-Clause 等许可证。有关[禁用许可证列表](https://www.apache.org/legal/resolved.html#category-x)可以在 Apache 基金会网站上[查询](https://www.apache.org/legal/resolved.html#category-x)。

### Facebook 的 “BSD 许可证 + 专利开源协议”

React 是一种流行的用于创建丰富用户界面的 JavaScript 技术，最初来源于 Facebook，并被广泛使用。该技术依据 BSD 许可证进行开源，但是，它的附加专利条款需要特别注意（以下为节选）。

>
> Facebook, Inc.（Facebook）特此授予软件的每个接收人（“你”）基于任何<ruby> “必要权利要求” <rp>  （ </rp> <rt>  Necessary Claims </rt> <rp>  ） </rp></ruby>的永久的、全球范围的、免版税的、非排他的、不可撤销的许可（遵守以下终止条款），可以制造、曾经制造、使用、销售、许诺销售、进口以及转移软件。
>
>
> 如果您（或任何您的子公司、关联方或代理商）直接或间接地启动了专利主张，或从专利主张中直接获取经济利益，本协议授予的许可将自动终止，恕不另行通知：（i）针对 Facebook 或其任何子公司或关联方；（ii）全部或部分来自于 Facebook 或其任何子公司或关联方的任何软件、技术、产品或服务的专利主张针对任何一方；或（iii）与软件相关的任何一方。尽管如此，如果 Facebook 或其任何子公司或关联方首先对你提起专利侵权诉讼指控，你在该诉讼中针对与软件无关的一方提起专利侵权反诉，你所被授予的许可不会因反诉而在本段第（i）款的规定下终止。
>
>
>

如果你的项目中正在使用或打算使用 React，你可能需要去咨询律师了。由于专利条款的限制，你不能做任何构成与 Facebook 竞争的事情。如果你采取法律行动或者以其他方式挑战 Facebook，那么你使用 React 的许可会被立即撤销。

如果你与其他使用 React 的公司发生法律纠纷，那你使用 React 的许可也会被撤销。Aurelia 框架创建者、Angular 2 开发团队前成员 [Rob Eisenberg 表示](https://react-etc.net/entry/rob-eisenberg-compares-angularjs-angular-2-aurelia-ember-polymer-and-react)，这就是 Google 公司和 Microsoft 公司的员工在工作中不允许使用 React.js 的原因。

虽然这只是在理论上对大多数采用 React 的项目可能产生的影响，但仍然值得特别注意，并且，类似 WordPress Calypso 这种已经与 React.js 建立了深刻联系的项目，可能会受到限制。运营 WordPress 的 Automattic 公司对一些小官司并不陌生，但这次很可能成为 Facebook 这个大公司的诉讼对象。

Drupal 和 WordPress 等许多开源产品都在采用 Facebook 公司的 React.js 技术。对于 Automattic 公司这种拥有开源产品的公司来说，未来如果被 Facebook 认定与 Facebook 构成竞争，将会是一个棘手的问题。

目前 Facebook 正如日中天，以上可能性发生的几率比较小，但如同 Yahoo 公司一样，Facebook 总有一天会从神坛跌落。到那时，Facebook 公司很有可能会从竞争角度充分利用许可协议所赋予的权利。所以，如果你打算利用 React.js 创建一个有可能终结 Facebook 神话的产品，最好先咨询你的律师。

但是，美国专利法非常复杂，尤其是在知识产权相关问题上，往往难以解释。从 Google 和 Oracle 公司有关安卓使用 Java 的争议可以看出，解决此类问题往往需要好几年时间。这意味着你必须要财大气粗，即使是你最后赢了官司。

### Facebook 公司的官方问答

React 的技术优势难以挑战。从开发者构建 web 用户界面方面来说，React 引发了一场变革。Facebook 在某些方面不太清楚的许可协议（BSD 许可证+专利）在开源开发者中间引发了激烈争论。开源社区继续坚持对“邪恶公司”的抵制，而 Facebook 很容易被归为此类公司。

2016 年 11 月，Facebook 澄清了其在 React、React Native 和其他许多项目中广泛采用的开源许可协议方面的立场。与任何法律文本一样，软件许可协议非常难以解释。Facebook 提供了一个 [FAQ](https://code.facebook.com/pages/850928938376556) 来回应经常被问到的问题。其中包括：

1. 如果我创建了一个竞争性产品，那么 Facebook 公司 “BSD 许可证+专利许可协议”中的附加专利授权是否会被终止？
2. 如果我用专利侵权以外的理由起诉 Facebook，那么 Facebook 公司 “BSD许可证+专利许可协议”中的附加专利授权是否会被终止？
3. 如果 Facebook 公司首先起诉我专利侵权，而我反诉 Facebook 公司专利侵权，那么 Facebook 公司 “BSD许可证+专利许可协议”中的附加专利授权是否会被终止？
4. Facebook 公司 “BSD 许可证+专利许可协议”中的附加专利授权的终止是否也会导致版权许可的终止？

对 1、2、4 的回答是明确的“**否**”，而对于第 3 个问题，FAQ 中规定，反诉主张不得与 Facebook 任何专利相关。上述官方说法比较可靠，在这个 Facebook 即便成为专利流氓也所获甚微的时刻，Facebook 仍然坚持其对 React 许可协议的看法。

### 使用 React.js 的开发者怎么办？

Apple 和 Microsoft 等行业巨头对于采用 React 的态度令人关注。有报道称，由于担心法律纠纷，这些巨头们已经禁止在项目中使用 React UI 库。但显然这是一个引发争议的问题，因为两家巨头都发布了使用 React 的网络资源或库。

Microsoft 提供了一个用于扩展 PowerPoint 和其他 Office365 产品的 React UI 组件库。Apple 开发者网站上的 API 文档采用 React.js 构建。

以上两款产品都不是两家公司的核心产品，Apple 也不太可能发布一款利用 React Native 编写的 iOS 邮件客户端。值得注意的是，虽然两家公司都看到了利用 React 创建 web 用户界面的价值，但它们的法律部门也没有因此遇到麻烦。

所以对大多数应用案例来说，似乎专利诉讼被严格限制在使用中的具体工具上，在这种情况下无需过分担心。由于使用了宽松的 BSD 许可证，对于开发者来说，React 实际上比使用传染性的 GPL 许可证的库更为安全。

Facebook 公司的数据库引擎 RocksDB 正准备[将许可证更改为 Apache 2.0](https://github.com/facebook/rocksdb/commit/3c327ac2d0fd50bbd82fe1f1af5de909dad769e6)。但 React.js 是一个特殊的项目，Facebook 公司似乎有意继续保留专利条款。

虽然商业实体很乐意在产品中使用 React 授权代码，尽管 WordPress 等许多受欢迎的开源项目仍将继续采用 React，但开源社区对 Facebook 不断捍卫和澄清这种特殊授权感到了厌倦。

因此，如果你想找到类似 [Solr](https://lucene.apache.org/solr/) 这种采用 React UI 的 Apache 项目，可能还需要很长时间。幸运的是，React 本身并非独一无二，你的项目可以采用与 React 类似的替代品，例如 [Preact](https://preactjs.com/) 或 [Inferno](https://infernojs.org/)，而不用担心遇到 React 的专利授权问题。

### 参考来源

* <https://react-etc.net/entry/your-license-to-use-react-js-can-be-revoked-if-you-compete-with-facebook>
* <https://react-etc.net/entry/react-patents-facebook-license-faq-adoption-by-apple-and-microsoft>
* <https://react-etc.net/entry/apache-foundation-bans-use-of-facebook-bsd-patents-licensed-libraries-like-react-js>
* <https://github.com/facebook/react/blob/master/PATENTS>

 （题图：facebook.github.io）

---

编译：

薛亮，北京集慧智佳知识产权管理咨询股份有限公司互联网事业部 高级咨询师，擅长专利检索，专利分析，竞争对手跟踪，FTO分析，开源软件知识产权风险分析，致力于为互联网企业，高科技公司提供知识产权咨询服务。


GPL 没落了吗？

主要是GPL可以绕过去了

发重了。

关键最大的GPL2支持者还有linux，所以不可能没落的

![](/data/attachment/album/201707/29/230852j2fdf4cvjvf6fxf7.jpg)

不久之前我看到了 RedMonk 的 Stephen O'Grady 发了一个[关于开源协议](https://twitter.com/sogrady/status/820001441733607424)的有趣的推特，那个推特里面有这张图。

![Redmonk Black Duck Licensing](/data/attachment/album/201707/29/230908krkkt282kc031p3b.png "Redmonk Black Duck Licensing")

这张图片显示了从 2010 到 2017 年间各种开源协议之间的使用率的变化。在这张图片里，显然 GPL 2.0 —— 最纯净的 copyleft 协议之一 —— 的使用率降低了一多半。该图表表明，开源项目中 [MIT](https://opensource.org/licenses/MIT) 协议和 [Apache](http://apache.org/licenses/) 协议开始受欢迎。[GPL 3.0](https://www.gnu.org/licenses/gpl-3.0.en.html) 的使用率也有所上涨。

这些意味着什么？

为什么 GPL 2.0 的使用率跌的这么多但是 GPL 3.0 仅仅是涨了一丁点？为什么 MIT 协议和 Apache 协议的使用率涨了那么多?

当然，有很多原因可以解释这件事情，但是我想这是因为商业开源项目的增多，以及商业社会对于 GPL 协议的担心导致的，我们细细掰扯。

### GPL 协议与商业社会

我知道我要说的可能会激怒一些 GPL 粉，所以在你们开始喷之前，我想说明的是：我支持 GPL，我也是 GPL 粉丝。

我写过的所有软件都使用的是 GPL 协议，我也是一直是积极出资支持 [自由软件基金会](http://www.fsf.org/) 以及 [软件自由保护组织](https://sfconservancy.org/) 以及他们的工作的，我支持使用 GPL 协议。我在这说的无关 GPL 的合法性或者 GPL 的巨大价值 —— 毫无疑问这是一个好协议 —— 我在这要说的是业内对于这个协议的看法。

大概四年之前，我参加了一个叫做<ruby> 开源智库 <rt>  Open Source Think Tank </rt></ruby>的峰会。这个峰会是一个私人小型峰会，每年都会把各大开源企业的管理人员请到加利福尼亚的酒庄。这个峰会聚焦于建立关系、构建联盟，找到并解决行业问题。

在这个峰会上，有一个分组研究，在其中，与会者被分成小组，被要求给一个真实存在的核心的开源技术推荐一个开源协议。每个小组都给出了回应。不到十分之一的小组推荐了宽容许可证，没有人推荐 GPL 许可证。

我看到了开源行业对于 Apache 协议以及 MIT 协议的逐步认可，但是他们却对花时间理解、接受和熟悉 GPL 这件事高高挂起。

在这几年里，这种趋势仍在蔓延。除了 Black Duck 的调查之外， 2015 年 [GitHub 上的开源协议调查](https://github.com/blog/1964-open-source-license-usage-on-github-com) 也显示 MIT 是人们的首选。我还能看到，在我工作的 XPRIZE （我们为我们的 [Global Learning XPRIZE](http://learning.xprize.org/) 选择了开源协议），在我作为[社区领导顾问](http://www.jonobacon.org/consulting)的工作方面，我也能感觉到那种倾向，因为越来越多的客户觉得把他们的代码用 GPL 发布不舒服。

随着 [大约 65% 的公司对开源事业做贡献](https://opensource.com/business/16/5/2016-future-open-source-survey) ，自从 2010 年以后显然开源行业已经引来了不少商业兴趣和投资。我相信，我之前说的那些趋势，已经表明这行业不认为 GPL 适合搞开源生意。

### 连接社区和公司

说真的，GPL 的没落不太让人吃惊，因为有如下原因。

首先，开源行业已经转型升级，它要在社区发展以及……你懂的……真正能赚钱的商业模型中做出均衡，这是它们要做的最重要的决策。在开源思想发展之初，人们有种误解说，“如果你搞出来了，他们就会用”，他们确实会来使用你的软件，但是在很多情况下，都是“如果你搞出来了，他们不是一定要给你钱。”

随着历史的进程，我们看到了许多公司，比如 Red Hat、Automattic、Docker、Canonical、Digital Ocean 等等等等，探索着在开源领域中赚钱的法子。他们探索过分发模式、服务模式，核心开源模式等等。现在可以确定的是，传统的商业软件赚钱的方式已经不再适用开源软件；因此，你得选择一个能够支持你的公司的经营方式的开源协议。在赚钱和免费提供你的技术之间找到平衡在很多情况下是很困难的一件事。

这就是我们看到那些变化的原因。尽管 GPL 是一个开源协议，但是它根本上是个自由软件协议，作为自由软件协议，它的管理以及支持是由自由软件基金会提供的。

我喜欢自由软件基金会的作品，但是他们已经把观点局限于软件必须 100% 绝对自由。对于自由软件基金会没有多少可以妥协的余地，甚至很多出名的开源项目（比如很多 Linux 发行版）仅仅是因为一丁点二进制固件就被认为是 “非自由” 软件。

对于商业来说，最复杂的是它不是非黑即白的，更多的时候是两者混合的灰色，很少有公司有自由软件基金会（或者类似的组织，比如软件自由保护组织）的那种纯粹的理念，因此我想那些公司也不喜欢选择和那些理念相关的协议。

我需要说明，我不是在这是说自由软件基金会以及类似的组织（比如软件自由保护组织）的错。他们有着打造完全自由的软件的目标，对于他们来说，走它们选择的路十分合理。自由软件基金会以及软件自由保护组织做了*了不起*的工作，我将继续支持这些组织以及为他们工作的人们。我只是觉得这种对纯粹性的高要求的一个后果就是让那些公司认为自己难以达到要求，因此，他们使用了非 GPL 的其他协议。

我怀疑 GPL 的使用是随着开源软件增长而变化的。在以前，启动（开源）项目的根本原因之一是对开放性和软件自由的伦理因素的严格关注。GPL 无疑是项目的自然选择，Debian、Ubuntu、Fedora 和 Linux 内核以及很多都是例子。

近年来，尽管我们已经看到了不再那么挑剔的一代开发者的出现，但是如果我说的过激一些，他们缺少对于自由的关注。对于他们来说开源软件是构建软件的务实、实用的一部分，而无关伦理。我想，这就是为什么我们发现 MIT 和 Apache 协议的流行的原因。

### 未来 ?

这对于 GPL 意味着什么？

我的猜想是 GPL 依然将是一个主要选项，但是开发者将将之视为纯粹的自由软件协议。我想对于软件的纯粹性有高要求的项目会优先选择 GPL 协议。但是对于商业软件，为了保持我们之前讨论过的那种平衡，他们不会那么做。我猜测， MIT 以及 Apache 依然会继续流行下去。

不管怎样，好消息是开源/自由软件行业确实在增长。无论使用的协议会发生怎样的变化，技术确实变得更加开放，可以接触，人人都能使用。

---

作者简介：

Jono Bacon - Jono Bacon 是一位领袖级的社区管理者、演讲者、作者和播客主。他是 Jono Bacon 咨询公司的创始人，提供社区战略和执行、开发者流程和其它的服务。他之前任职于 GitHub、Canonical 和 XPRIZE、OpenAdvantage 的社区总监，并为大量的组织提供咨询和顾问服务。

---

via: <https://opensource.com/article/17/2/decline-gpl>

作者：[Jono Bacon](https://opensource.com/users/jonobacon) 译者：[name1e5s](https://github.com/name1e5s) 校对：[wxy](https://github.com/wxy)

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


网络分析利器：在 Ubuntu 16.04 上安装 Bro

[![Bro Network Analysis Logo](/data/attachment/album/201707/30/110852kjgkm5pkdygk5jep.jpg "brologo")](https://www.unixmen.com/wp-content/uploads/2017/07/brologo.jpg)

### 简介：Bro 网络分析框架

Bro 是一个开源的网络分析框架，侧重于网络安全监控。这是一项长达 15 年的研究成果，被各大学、研究实验室、超级计算机中心和许多开放科学界广泛使用。它主要由伯克利国际计算机科学研究所和伊利诺伊大学厄巴纳-香槟分校的国家超级计算机应用中心开发。

Bro 的功能包括：

* Bro 的脚本语言支持针对站点定制监控策略
* 针对高性能网络
* 分析器支持许多协议，可以在应用层面实现高级语义分析
* 它保留了其所监控的网络的丰富的应用层统计信息
* Bro 能够与其他应用程序接口实时地交换信息
* 它的日志全面地记录了一切信息，并提供网络活动的高级存档

本教程将介绍如何从源代码构建，并在 Ubuntu 16.04 服务器上安装 Bro。

### 准备工作

Bro 有许多依赖文件:

* Libpcap ([http://www.tcpdump.org](http://www.tcpdump.org/))
* OpenSSL 库 ([http://www.openssl.org](http://www.openssl.org/))
* BIND8 库
* Libz
* Bash (BroControl 所需要)
* Python 2.6+ (BroControl 所需要)

从源代码构建还需要：

* CMake 2.8+
* Make
* GCC 4.8+ or Clang 3.3+
* SWIG
* GNU Bison
* Flex
* Libpcap headers
* OpenSSL headers
* zlib headers

### 起步

首先，通过执行以下命令来安装所有必需的依赖项：

```
# apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python-dev swig zlib1g-dev

```

#### 安装定位 IP 地理位置的 GeoIP 数据库

Bro 使用 GeoIP 的定位地理位置。安装 IPv4 和 IPv6 版本：

```
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
$wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz

```

解压这两个压缩包：

```
$ gzip -d GeoLiteCity.dat.gz
$ gzip -d GeoLiteCityv6.dat.gz

```

将解压后的文件移动到 `/usr/share/GeoIP` 目录下：

```
# mvGeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
# mv GeoLiteCityv6.dat /usr/share/GeoIP/GeoIPCityv6.dat

```

现在，可以从源代码构建 Bro 了。

### 构建 Bro

最新的 Bro 开发版本可以通过 `git` 仓库获得。执行以下命令：

```
$ git clone --recursive git://git.bro.org/bro

```

转到克隆下来的目录，然后使用以下命令就可以简单地构建 Bro：

```
$ cd bro
$ ./configure
$ make

```

`make` 命令需要一些时间来构建一切。确切的时间取决于服务器的性能。

可以使用一些参数来执行 `configure` 脚本，以指定要构建的依赖关系，特别是 `--with-*` 选项。

### 安装 Bro

在克隆的 `bro` 目录中执行：

```
# make install

```

默认安装路径为 `/usr/local/bro`。

### 配置 Bro

Bro 的配置文件位于 `/usr/local/bro/etc` 目录下。 这里有三个文件:

* `node.cfg`，用于配置要监视的单个节点（或多个节点）。
* `broctl.cfg`，BroControl 的配置文件。
* `networks.cgf`，包含一个使用 CIDR 标记法表示的网络列表。

#### 配置邮件设置

打开 `broctl.cfg` 配置文件:

```
# $EDITOR /usr/local/bro/etc/broctl.cfg

```

查看 `Mail Options` 选项，并编辑 `MailTo` 行如下:

```
# Recipient address for emails sent out by Bro and BroControl
MailTo = admin@example.com

```

保存并关闭。还有许多其他选项，但在大多数情况下，默认值就足够好了。

#### 选择要监视的节点

开箱即用，Bro 被配置为以独立模式运行。在本教程中，我们就是做一个独立的安装，所以没有必要改变。但是，也请查看 `node.cfg` 配置文件：

```
# $EDITOR /usr/local/bro/etc/node.cfg

```

在 `[bro]` 部分，你应该看到这样的东西：

```
[bro]
type=standalone
host=localhost
interface=eth0

```

请确保 `inferface` 与 Ubuntu 16.04 服务器的公网接口相匹配。

保存并退出。

#### 配置监视节点的网络

最后一个要编辑的文件是 `network.cfg`。使用文本编辑器打开它：

```
# $EDITOR /usr/local/bro/etc/networks.cfg

```

默认情况下，你应该看到以下内容：

```
# List of local networks in CIDR notation, optionally followed by a
# descriptive tag.
# For example, "10.0.0.0/8" or "fe80::/64" are valid prefixes.

10.0.0.0/8          Private IP space
172.16.0.0/12       Private IP space
192.168.0.0/16      Private IP space

```

删除这三个条目（这只是如何使用此文件的示例），并输入服务器的公用和专用 IP 空间，格式如下：

```
X.X.X.X/X        Public IP space
X.X.X.X/X        Private IP space

```

保存并退出。

### 使用 BroControl 管理 Bro 的安装

管理 Bro 需要使用 BroControl，它支持交互式 shell 和命令行工具两种形式。启动该 shell：

```
# /usr/local/bro/bin/broctl

```

要想使用命令行工具，只需将参数传递给上一个命令，例如：

```
# /usr/local/bro/bin/broctl status

```

这将通过显示以下的输出来检查 Bro 的状态：

```
Name         Type       Host          Status    Pid    Started
bro          standalone localhost     running   6807   20 Jul 12:30:50

```

### 结论

这是一篇 Bro 的安装教程。我们使用基于源代码的安装，因为它是获得可用的最新版本的最有效的方法，但是该网络分析框架也可以下载预构建的二进制格式文件。

下次见！

---

via: <https://www.unixmen.com/how-to-install-bro-ubuntu-1604/>

作者：[Giuseppe Molica](https://www.unixmen.com/author/tutan/) 译者：[firmianay](https://github.com/firmianay) 校对：[wxy](https://github.com/wxy)

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


使用 Kdump 检查 Linux 内核崩溃

命令都是错的，"kexec -p /boot/vmlinux --initrd=/boot/initramfs-4.19.190-12.el8.x86_64kdump.img  --reuse-cmdline -d" 是--reuse-cmdline，用心点啊编辑。

>
> 让我们先看一下 kdump 的基本使用方法，和 kdump/kexec 在内核中是如何实现。
>
>
>

![Using Kdump for examining Linux Kernel crashes](/data/attachment/album/201707/30/150208olgsbdcbyyzxhc50.png "Using Kdump for examining Linux Kernel crashes")

[kdump](https://www.kernel.org/doc/Documentation/kdump/kdump.txt) 是获取崩溃的 Linux 内核转储的一种方法，但是想找到解释其使用和内部结构的文档可能有点困难。在本文中，我将研究 kdump 的基本使用方法，和 kdump/kexec 在内核中是如何实现。

[kexec](https://linux.die.net/man/8/kexec) 是一个 Linux 内核到内核的引导加载程序，可以帮助从第一个内核的上下文引导到第二个内核。kexec 会关闭第一个内核，绕过 BIOS 或固件阶段，并跳转到第二个内核。因此，在没有 BIOS 阶段的情况下，重新启动变得更快。

kdump 可以与 kexec 应用程序一起使用 —— 例如，当第一个内核崩溃时第二个内核启动，第二个内核用于复制第一个内核的内存转储，可以使用 `gdb` 和 `crash` 等工具分析崩溃的原因。（在本文中，我将使用术语“第一内核”作为当前运行的内核，“第二内核” 作为使用 kexec 运行的内核，“捕获内核” 表示在当前内核崩溃时运行的内核。）

kexec 机制在内核以及用户空间中都有组件。内核提供了几个用于 kexec 重启功能的系统调用。名为 kexec-tools 的用户空间工具使用这些调用，并提供可执行文件来加载和引导“第二内核”。有的发行版还会在 kexec-tools 上添加封装器，这有助于捕获并保存各种转储目标配置的转储。在本文中，我将使用名为 distro-kexec-tools 的工具来避免上游 kexec 工具和特定于发行版的 kexec-tools 代码之间的混淆。我的例子将使用 Fedora Linux 发行版。

### Fedora kexec-tools 工具

使用 `dnf install kexec-tools` 命令在 Fedora 机器上安装 fedora-kexec-tools。在安装 fedora-kexec-tools 后可以执行 `systemctl start kdump` 命令来启动 kdump 服务。当此服务启动时，它将创建一个根文件系统（initramfs），其中包含了要挂载到目标位置的资源，以保存 vmcore，以及用来复制和转储 vmcore 到目标位置的命令。然后，该服务将内核和 initramfs 加载到崩溃内核区域内的合适位置，以便在内核崩溃时可以执行它们。

Fedora 封装器提供了两个用户配置文件：

1. `/etc/kdump.conf` 指定修改后需要重建 initramfs 的配置参数。例如，如果将转储目标从本地磁盘更改为 NFS 挂载的磁盘，则需要由“捕获内核”所加载的 NFS 相关的内核模块。
2. `/etc/sysconfig/kdump` 指定修改后不需要重新构建 initramfs 的配置参数。例如，如果只需修改传递给“捕获内核”的命令行参数，则不需要重新构建 initramfs。

如果内核在 kdump 服务启动之后出现故障，那么“捕获内核”就会执行，其将进一步执行 initramfs 中的 vmcore 保存过程，然后重新启动到稳定的内核。

### kexec-tools 工具

编译 kexec-tools 的源代码得到了一个名为 `kexec` 的可执行文件。这个同名的可执行文件可用于加载和执行“第二内核”，或加载“捕获内核”，它可以在内核崩溃时执行。

加载“第二内核”的命令：

```
# kexec -l kernel.img --initrd=initramfs-image.img –reuse-cmdline

```

`--reuse-command` 参数表示使用与“第一内核”相同的命令行。使用 `--initrd` 传递 initramfs。 `-l` 表明你正在加载“第二内核”，其可以由 `kexec` 应用程序本身执行（`kexec -e`）。使用 `-l` 加载的内核不能在内核崩溃时执行。为了加载可以在内核崩溃时执行的“捕获内核”，必须传递参数 `-p` 取代 `-l`。

加载捕获内核的命令：

```
# kexec -p kernel.img --initrd=initramfs-image.img –reuse-cmdline

```

`echo c > /pros/sysrq-trigger` 可用于使内核崩溃以进行测试。有关 kexec-tools 提供的选项的详细信息，请参阅 `man kexec`。在转到下一个部分之前，请看这个 kexec\_dump 的演示：

### kdump: 端到端流

下图展示了流程图。必须在引导“第一内核”期间为捕获内核保留 crashkernel 的内存。您可以在内核命令行中传递 `crashkernel=Y@X`，其中 `@X` 是可选的。`crashkernel=256M` 适用于大多数 x86\_64 系统；然而，为崩溃内核选择适当的内存取决于许多因素，如内核大小和 initramfs，以及 initramfs 中包含的模块和应用程序运行时的内存需求。有关传递崩溃内核参数的更多方法，请参阅 [kernel-parameters 文档](https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt)。

![pratyush_f1.png](/data/attachment/album/201707/30/150208ofl4lmrnimr0fij0.png)

您可以将内核和 initramfs 镜像传递给 `kexec` 可执行文件，如（`kexec-tools`）部分的命令所示。“捕获内核”可以与“第一内核”相同，也可以不同。通常，一样即可。Initramfs 是可选的；例如，当内核使用 `CONFIG_INITRAMFS_SOURCE` 编译时，您不需要它。通常，从第一个 initramfs 中保存一个不一样的捕获 initramfs，因为在捕获 initramfs 中自动执行 vmcore 的副本能获得更好的效果。当执行 `kexec` 时，它还加载了 `elfcorehdr` 数据和 purgatory 可执行文件（LCTT 译注：purgatory 就是一个引导加载程序，是为 kdump 定作的。它被赋予了“炼狱”这样一个古怪的名字应该只是一种调侃）。 `elfcorehdr` 具有关于系统内存组织的信息，而 purgatory 可以在“捕获内核”执行之前执行并验证第二阶段的二进制或数据是否具有正确的 SHA。purgatory 也是可选的。

当“第一内核”崩溃时，它执行必要的退出过程并切换到 purgatory（如果存在）。purgatory 验证加载二进制文件的 SHA256，如果是正确的，则将控制权传递给“捕获内核”。“捕获内核”根据从 `elfcorehdr` 接收到的系统内存信息创建 vmcore。因此，“捕获内核”启动后，您将看到 `/proc/vmcore` 中“第一内核”的转储。根据您使用的 initramfs，您现在可以分析转储，将其复制到任何磁盘，也可以是自动复制的，然后重新启动到稳定的内核。

### 内核系统调用

内核提供了两个系统调用：`kexec_load()` 和 `kexec_file_load()`，可以用于在执行 `kexec -l` 时加载“第二内核”。它还为 `reboot()` 系统调用提供了一个额外的标志，可用于使用 `kexec -e` 引导到“第二内核”。

`kexec_load()`：`kexec_load()` 系统调用加载一个可以在之后通过 `reboot()` 执行的新的内核。其原型定义如下：

```
long kexec_load(unsigned long entry, unsigned long nr_segments,
struct kexec_segment *segments, unsigned long flags);

```

用户空间需要为不同的组件传递不同的段，如内核，initramfs 等。因此，`kexec` 可执行文件有助于准备这些段。`kexec_segment` 的结构如下所示：

```
struct kexec_segment {
    void *buf;
    /* 用户空间缓冲区 */
    size_t bufsz;
    /* 用户空间中的缓冲区长度 */
    void *mem;
    /* 内核的物理地址 */
    size_t memsz;
    /* 物理地址长度 */
};

```

当使用 `LINUX_REBOOT_CMD_KEXEC` 调用 `reboot()` 时，它会引导进入由 `kexec_load` 加载的内核。如果标志 `KEXEC_ON_CRASH` 被传递给 `kexec_load()`，则加载的内核将不会使用 `reboot(LINUX_REBOOT_CMD_KEXEC)` 来启动；相反，这将在内核崩溃中执行。必须定义 `CONFIG_KEXEC` 才能使用 `kexec`，并且为 `kdump` 定义 `CONFIG_CRASH_DUMP`。

`kexec_file_load()`：作为用户，你只需传递两个参数（即 `kernel` 和 `initramfs`）到 `kexec` 可执行文件。然后，`kexec` 从 sysfs 或其他内核信息源中读取数据，并创建所有段。所以使用 `kexec_file_load()` 可以简化用户空间，只传递内核和 initramfs 的文件描述符。其余部分由内核本身完成。使用此系统调用时应该启用 `CONFIG_KEXEC_FILE`。它的原型如下：

```
long kexec_file_load(int kernel_fd, int initrd_fd, unsigned long
cmdline_len, const char __user * cmdline_ptr, unsigned long
flags);

```

请注意，`kexec_file_load` 也可以接受命令行，而 `kexec_load()` 不行。内核根据不同的系统架构来接受和执行命令行。因此，在 `kexec_load()` 的情况下，`kexec-tools` 将通过其中一个段（如在 dtb 或 ELF 引导注释等）中传递命令行。

目前，`kexec_file_load()` 仅支持 x86 和 PowerPC。

#### 当内核崩溃时会发生什么

当第一个内核崩溃时，在控制权传递给 purgatory 或“捕获内核”之前，会执行以下操作：

* 准备 CPU 寄存器（参见内核代码中的 `crash_setup_regs()`）;
* 更新 vmcoreinfo 备注（请参阅 `crash_save_vmcoreinfo()`）;
* 关闭非崩溃的 CPU 并保存准备好的寄存器（请参阅 `machine_crash_shutdown()` 和 `crash_save_cpu()`）;
* 您可能需要在此处禁用中断控制器；
* 最后，它执行 kexec 重新启动（请参阅 `machine_kexec()`），它将加载或刷新 kexec 段到内存，并将控制权传递给进入段的执行文件。输入段可以是下一个内核的 purgatory 或开始地址。

#### ELF 程序头

kdump 中涉及的大多数转储核心都是 ELF 格式。因此，理解 ELF 程序头部很重要，特别是当您想要找到 vmcore 准备的问题。每个 ELF 文件都有一个程序头：

* 由系统加载器读取，
* 描述如何将程序加载到内存中，
* 可以使用 `Objdump -p elf_file` 来查看程序头。

vmcore 的 ELF 程序头的示例如下：

```
# objdump -p vmcore
vmcore:
file format elf64-littleaarch64
Program Header:
NOTE off 0x0000000000010000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**0 filesz
0x00000000000013e8 memsz 0x00000000000013e8 flags ---
LOAD off 0x0000000000020000 vaddr 0xffff000008080000 paddr 0x0000004000280000 align 2**0 filesz
0x0000000001460000 memsz 0x0000000001460000 flags rwx
LOAD off 0x0000000001480000 vaddr 0xffff800000200000 paddr 0x0000004000200000 align 2**0 filesz
0x000000007fc00000 memsz 0x000000007fc00000 flags rwx
LOAD off 0x0000000081080000 vaddr 0xffff8000ffe00000 paddr 0x00000040ffe00000 align 2**0 filesz
0x00000002fa7a0000 memsz 0x00000002fa7a0000 flags rwx
LOAD off 0x000000037b820000 vaddr 0xffff8003fa9e0000 paddr 0x00000043fa9e0000 align 2**0 filesz
0x0000000004fc0000 memsz 0x0000000004fc0000 flags rwx
LOAD off 0x00000003807e0000 vaddr 0xffff8003ff9b0000 paddr 0x00000043ff9b0000 align 2**0 filesz
0x0000000000010000 memsz 0x0000000000010000 flags rwx
LOAD off 0x00000003807f0000 vaddr 0xffff8003ff9f0000 paddr 0x00000043ff9f0000 align 2**0 filesz
0x0000000000610000 memsz 0x0000000000610000 flags rwx

```

在这个例子中，有一个 note 段，其余的是 load 段。note 段提供了有关 CPU 信息，load 段提供了关于复制的系统内存组件的信息。

vmcore 从 `elfcorehdr` 开始，它具有与 ELF 程序头相同的结构。参见下图中 `elfcorehdr` 的表示：

![pratyush_f2.png](/data/attachment/album/201707/30/150209a7ezs1e7cf75fcgg.png)

`kexec-tools` 读取 `/sys/devices/system/cpu/cpu%d/crash_notes` 并准备 `CPU PT_NOTE` 的标头。同样，它读取 `/sys/kernel/vmcoreinfo` 并准备 `vmcoreinfo PT_NOTE` 的标头，从 `/proc/iomem` 读取系统内存并准备存储器 `PT_LOAD` 标头。当“捕获内核”接收到 `elfcorehdr` 时，它从标头中提到的地址中读取数据，并准备 vmcore。

#### Crash note

Crash notes 是每个 CPU 中用于在系统崩溃的情况下存储 CPU 状态的区域；它有关于当前 PID 和 CPU 寄存器的信息。

#### vmcoreinfo

该 note 段具有各种内核调试信息，如结构体大小、符号值、页面大小等。这些值由捕获内核解析并嵌入到 `/proc/vmcore` 中。 `vmcoreinfo` 主要由 `makedumpfile` 应用程序使用。在 Linux 内核，`include/linux/kexec.h` 宏定义了一个新的 `vmcoreinfo`。 一些示例宏如下所示：

* `VMCOREINFO_PAGESIZE()`
* `VMCOREINFO_SYMBOL()`
* `VMCOREINFO_SIZE()`
* `VMCOREINFO_STRUCT_SIZE()`

#### makedumpfile

vmcore 中的许多信息（如可用页面）都没有用处。`makedumpfile` 是一个用于排除不必要的页面的应用程序，如：

* 填满零的页面；
* 没有私有标志的缓存页面（非专用缓存）;
* 具有私有标志的缓存页面（专用缓存）;
* 用户进程数据页；
* 可用页面。

此外，`makedumpfile` 在复制时压缩 `/proc/vmcore` 的数据。它也可以从转储中删除敏感的符号信息； 然而，为了做到这一点，它首先需要内核的调试信息。该调试信息来自 `VMLINUX` 或 `vmcoreinfo`，其输出可以是 ELF 格式或 kdump 压缩格式。

典型用法：

```
# makedumpfile -l --message-level 1 -d 31 /proc/vmcore makedumpfilecore

```

详细信息请参阅 `man makedumpfile`。

### kdump 调试

新手在使用 kdump 时可能会遇到的问题：

#### `kexec -p kernel_image` 没有成功

* 检查是否分配了崩溃内存。
* `cat /sys/kernel/kexec_crash_size` 不应该有零值。
* `cat /proc/iomem | grep "Crash kernel"` 应该有一个分配的范围。
* 如果未分配，则在命令行中传递正确的 `crashkernel=` 参数。
* 如果没有显示，则在 `kexec` 命令中传递参数 `-d`，并将输出信息发送到 kexec-tools 邮件列表。

#### 在“第一内核”的最后一个消息之后，在控制台上看不到任何东西（比如“bye”）

* 检查 `kexec -e` 之后的 `kexec -l kernel_image` 命令是否工作。
* 可能缺少支持的体系结构或特定机器的选项。
* 可能是 purgatory 的 SHA 验证失败。如果您的体系结构不支持 purgatory 中的控制台，则很难进行调试。
* 可能是“第二内核”早已崩溃。
* 将您的系统的 `earlycon` 或 `earlyprintk` 选项传递给“第二内核”的命令行。
* 使用 kexec-tools 邮件列表共享第一个内核和捕获内核的 `dmesg` 日志。

### 资源

#### fedora-kexec-tools

* GitHub 仓库：`git://pkgs.fedoraproject.org/kexec-tools`
* 邮件列表：[kexec@lists.fedoraproject.org](mailto:kexec@lists.fedoraproject.org)
* 说明：Specs 文件和脚本提供了用户友好的命令和服务，以便 `kexec-tools` 可以在不同的用户场景下实现自动化。

#### kexec-tools

* GitHub 仓库：git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
* 邮件列表：[kexec@lists.infradead.org](mailto:kexec@lists.infradead.org)
* 说明：使用内核系统调用并提供用户命令 `kexec`。

#### Linux kernel

* GitHub 仓库： `git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git`
* 邮件列表：[kexec@lists.infradead.org](mailto:kexec@lists.infradead.org)
* 说明：实现了 `kexec_load()`、`kexec_file_load()`、`reboot()` 系统调用和特定体系结构的代码，例如 `machine_kexec()` 和 `machine_crash_shutdown()`。

#### Makedumpfile

* GitHub 仓库： `git://git.code.sf.net/p/makedumpfile/code`
* 邮件列表：[kexec@lists.infradead.org](mailto:kexec@lists.infradead.org)
* 说明：从转储文件中压缩和过滤不必要的组件。

（题图：[Penguin](https://pixabay.com/en/penguins-emperor-antarctic-life-429136/)、 [Boot](https://pixabay.com/en/shoe-boots-home-boots-house-1519804/)，修改：Opensource.com. [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)）

---

作者简介：

Pratyush Anand - Pratyush 正在以以为 Linux 内核专家的身份与 Red Hat 合作。他主要负责 Red Hat 产品和上游所面临的几个 kexec/kdump 问题。他还处理 Red Hat 支持的 ARM64 平台周围的其他内核调试、跟踪和性能问题。除了 Linux 内核，他还在上游的 kexec-tools 和 makedumpfile 项目中做出了贡献。他是一名开源爱好者，并在教育机构举办志愿者讲座，促进了 FOSS。

---

via: <https://opensource.com/article/17/6/kdump-usage-and-internals>

作者：[Pratyush Anand](https://opensource.com/users/pratyushanand) 译者：[firmianay](https://github.com/firmianay) 校对：[wxy](https://github.com/wxy)

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


使用统一阻止列表和白名单来更新主机文件

这个机翻也是醉了

![](/data/attachment/album/201707/30/155717leiystiieyuu8cie.jpg)

网上有许多持续维护的含有不同垃圾域的有用列表。将这些列表复制到你的主机文件中可以轻松阻止大量的域，你的系统将根本不用去连接它们。此方法可以在不安装浏览器插件的情况下工作，并且将为系统上任何浏览器（和任何其他程序）提供阻止操作。

在本教程中，我将向你展示如何在 Linux 中启动并运行 Steven Black 的[统一主机脚本](https://github.com/StevenBlack/hosts)。该脚本将使用来自多个来源的最新已知的广告服务器、网络钓鱼网站和其他网络垃圾的地址来更新你的计算机主机文件，同时提供一个漂亮、干净的方式来管理你自己的黑名单/白名单，其分别来自于该脚本管理的各个列表。

在将 30,000 个域放入主机文件之前，需要注意两点。首先，这些巨大的列表包含可能需要解除封锁的服务器，以便进行在线购买或其他一些临时情况。如果你弄乱了你的主机文件，你要知道网上的某些东西可能会出现问题。为了解决这个问题，我将向你展示如何使用方便的打开/关闭开关，以便你可以快速禁用你的阻止列表来购买喜马拉雅盐雾灯（它是等离子灯）。我仍然认为这些列表的目的之一是将所有的一切都封锁（有点烦人，直到我想到了做一个关闭开关）。如果你经常遇到你需要的服务器被阻止的问题，只需将其添加到白名单文件中即可。

第二个问题是性能受到了轻微的影响, 因为每次调用一个域时, 系统都必须检查整个列表。只是有一点点影响, 而没有大到让我因此而放弃黑名单，让每一个连接都通过。你具体要怎么选择自己看着办。

主机文件通过将请求定向到 127.0.0.1 或 0.0.0.0（换句话说定向到空地址）来阻止请求。有人说使用 0.0.0.0 是更快，问题更少的方法。你可以将脚本配置为使用 `-ip nnn.nnn.nnn.nnn` 这样的 ip 选项来作为阻止 ip，但默认值是 0.0.0.0，这是我使用的值。

我曾经将 Steven Black 的脚本做的事每隔一段时间就手动做一遍，进到每一个站点，将他们的列表拷贝/粘贴到我的主机文件中，做一个查找替换将其中的 127 变成 0 等等。我知道整件事情可以自动化，这样做有点傻，但我从来没有花时间解决这个问题。直到我找到这个脚本，现在这事已经是一个被遗忘的杂务。

让我们先下载一份最新的 Steven Black 的代码拷贝（大约 150MB），以便我们可以进行下一步。你需要安装 git，因此如果还没安装，进入到终端输入：

```
sudo apt-get install git

```

安装完之后，输入：

```
mkdir unifiedhosts
cd unifiedhosts
git clone https://github.com/StevenBlack/hosts.git
cd hosts

```

当你打开了 Steven 的脚本时，让我们来看看有什么选项。该脚本有几个选项和扩展，但扩展我不会在这里提交，但如果你到了这一步并且你有兴趣，[readme.md](https://github.com/StevenBlack/hosts/blob/master/readme.md) 可以告诉你所有你需要知道的。

你需要安装 python 来运行此脚本，并且与版本有关。要找到你安装的 Python 版本，请输入：

```
python --version

```

如果你还没安装 Python:

```
sudo apt-get install python

```

对于 Python 2.7，如下所示，输入 `python` 来执行脚本。对于 Python 3，在命令中的 `python` 替换成 `python3`。执行后，该脚本会确保它具有每个列表的最新版本，如果没有，它会抓取一个新的副本。然后，它会写入一个新的主机文件，包括了你的黑名单/白名单中的任何内容。让我们尝试使用 `-r` 选项来替换我们的当前的主机文件，而 `-a` 选项可以脚本不会问我们任何问题。回到终端：

```
python updateHostsFile.py -r -a

```

该命令将询问你的 root 密码，以便能够写入 `/etc/`。为了使新更新的列表处于激活状态，某些系统需要清除 DNS 缓存。在同一个硬件设备上，我观察到不同的操作系统表现出非常不同的行为，在没有刷新缓存的情况下不同的服务器变为可访问/不可访问所需的时间长度都不同。我已经看到了从即时更新（Slackware）到重启更新（Windows）的各种情况。有一些命令可以刷新 DNS 缓存，但是它们在每个操作系统甚至每个发行版上都不同，所以如果没有生效，只需要重新启动就行了。

现在，只要将你的个人例外添加到黑名单/白名单中，并且只要你想要更新主机文件，运行该脚本就好。该脚本将根据你的要求调整生成的主机文件，每次运行文件时会自动追加你额外的列表。

最后，我们来创建一个打开/关闭开关，对于打开和关闭功能每个都创建一个脚本，所以回到终端输入下面的内容创建关闭开关（用你自己的文本编辑器替换 leafpad）：

```
leafpad hosts-off.sh

```

在新文件中输入下面的内容：

```
#!/bin/sh
sudo mv /etc/hosts /etc/hostsDISABLED

```

接着让它可执行：

```
chmod +x hosts-off.sh

```

相似地，对于打开开关：

```
leafpad hosts-on.sh

```

在新文件中输入下面的内容：

```
#!/bin/sh
sudo mv /etc/hostsDISABLED /etc/hosts

```

最后让它可执行：

```
chmod +x hosts-on.sh

```

你所需要做的是为每个脚本创建一个快捷方式，标记为 HOSTS-ON 和 HOSTS-OFF，放在你能找到它们的地方。

---

via: <https://www.darrentoback.com/this-script-updates-hosts-files-using-a-multi-source-unified-block-list-with-whitelisting>

作者：[dmt](https://www.darrentoback.com/about-me) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


LKU：一套在 Ubuntu/LinuxMint 上编译、安装和更新最新内核的 Shell 脚本

搞成通用组件才好玩！！！

![](/data/attachment/album/201707/30/162756kpkrpmm07p1llkl8.jpg)

以手动方式安装和升级最新的 Linux 内核对于每个人来说都不是一件小事，甚至包括一些有经验的人也是如此。它需要对 Linux 内核有深入的了解。过去我们已经介绍了 UKUU（Ubuntu Kernel Upgrade Utility），它可以从 kernel.ubuntu.com 网站上自动检测最新的主线内核，并弹出一个不错的窗口界面进行安装。

[Linux Kernel Utilities](https://github.com/mtompkins/linux-kernel-utilities) （LKU）提供一组 shell 脚本（三个 Shell 脚本），可以帮助用户从 kernel.org 获取并编译和安装最新的 Linux 内核，也可以从 kernel.ubuntu.com 获取安装最新的预编译的 Ubuntu 内核。甚至可以根据需要选择所需的内核（手动内核选择）。

该脚本还将根据 PGP 签名文件检查下载的归档文件，并且可以选择通用和低延迟版内核。

建议阅读：[ukuu：一种在基于 Ubuntu 的系统上轻松安装升级 Linux 内核的方式](http://www.2daygeek.com/ukuu-install-upgrade-linux-kernel-in-linux-mint-ubuntu-debian-elementary-os/)

它可以删除或清除所有非活动的内核，并且不会为了安全目的留下备份的内核。强烈建议在执行此脚本之前重新启动一次。

* `compile_linux_kernel.sh` ：用户可以从 kernel.org 编译和安装所需的或最新的内核
* `update_ubuntu_kernel.sh` ：用户可以从 kernel.ubuntu.com 安装并更新所需或最新的预编译 Ubuntu 内核
* `remove_old_kernels.sh` ：这将删除或清除所有非活动内核，并且只保留当前加载的版本

kernel.org 有固定的发布周期（每三个月一次），发布的内核包括了新的功能，改进了硬件和系统性能。由于它具有标准的发布周期，除了滚动发布的版本（如 Arch Linux，openSUSE Tumbleweed 等），大多数发行版都不提供最新的内核。

### 如何安装 Linux Kernel Utilities (LKU)

正如我们在文章的开头所说的，它的 shell 脚本集只是克隆开发人员的 github 仓库并运行相应的 shell 文件来执行这个过程。

```
$ git clone https://github.com/mtompkins/linux-kernel-utilities.git && cd linux-kernel-utilities

```

### 安装指定版本内核

为了测试的目的，我们将安装 Linux v4.4.10-xenial 内核。在安装新内核之前，我们需要通过 `uanme -a` 命令检查当前安装的内核版本，以便我们可以检查新内核是否可以安装。

```
$ uname -a
Linux magi-VirtualBox 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

```

根据上面的输出，我们的系统使用的是 4.4.0-21 通用内核。

只需运行 `update_ubuntu_kernel.sh` shell 脚本。第一次运行脚本时会检查是否满足所有的依赖关系，然后自动安装缺少的依赖项。它会检测系统使用的发行版，并检索 kernel.ubuntu.com 中可用的预编译内核。现在，从列表中选择你需要的内核并输入序号，然后按回车键，它将下载内核映像（linux-headers-4.4.10，linux-headers-4.4.10-xxx-generic　和 linux-image-4.4.10-xxx-generic）。

一旦内核镜像被下载，它将要求输入 `sudo` 密码来启动新内核的安装。

```
$ ./update_ubuntu_kernel.sh

[+] Checking Distro
 \_ Distro identified as LinuxMint.

[+] Checking Dependencies
    curl                    Found
    dkms                    Found
    git                     Found
    sudo                    Found
    wget                    Found
    whiptail                Found
    lynx                    Not Found

-- Installing Dependencies --

[!] The first time this script is run missing dependencies will be installed.
    For compiling a kernel this may take a bit of time. Feedback will be provided.

[+] Dependencies
 \_Elevating permissions as necessary . . .
[%] Elevated

[+] Testing for previous held packages and trying to correct any found.
 \_Passed

[+] Updating package cache . . .
 \_Complete

[+] Installing dependencies . . .
 \_Complete

    curl                    Found
    dkms                    Found
    git                     Found
    sudo                    Found
    wget                    Found
    whiptail                Found
    lynx                    Found

[+] Changing to temporary directory to work in . . .
 \_ Temporary directory access granted: /tmp/tmp.97eHDsmg2K

[+] Removing any conflicting remnants . . .
 \_ Done

[+] Retrieving available kernel choices . . .
 \_ Precompiled kernels available from kernel.ubuntu.com:

 1)  Linux v4.11                2)  Linux v4.11.3              3)  Linux v4.11.2              4)  Linux v4.11.1
 5)  Linux v4.10                6)  Linux v4.10.17             7)  Linux v4.10.16             8)  Linux v4.10.15
 9)  Linux v4.10.14             10) Linux v4.10.13             11) Linux v4.10.12
[ 节略 ……]
 249) Linux v4.0.3-wily          250) Linux v4.0.2-wily          251) Linux v4.0.1-wily          252) Linux v4.0-vivid

Select your desired kernel: 158

Do you want the lowlatency kernel? (y/[n]):

[+] Processing selection
 \_ Determining CPU type: amd64
 \_ Locating source of v4.4.10-xenial generic kernel packages.
 \_ Done

[+] Checking AntiVirus flag and disabling if necessary
[+] Installing kernel . . .
[sudo] password for magi:
Selecting previously unselected package linux-headers-4.4.10-040410.
(Reading database ... 230647 files and directories currently installed.)
Preparing to unpack linux-headers-4.4.10-040410_4.4.10-040410.201605110631_all.deb ...
Unpacking linux-headers-4.4.10-040410 (4.4.10-040410.201605110631) ...
Selecting previously unselected package linux-headers-4.4.10-040410-generic.
Preparing to unpack linux-headers-4.4.10-040410-generic_4.4.10-040410.201605110631_amd64.deb ...
Unpacking linux-headers-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
Selecting previously unselected package linux-image-4.4.10-040410-generic.
Preparing to unpack linux-image-4.4.10-040410-generic_4.4.10-040410.201605110631_amd64.deb ...
Done.
Unpacking linux-image-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
Setting up linux-headers-4.4.10-040410 (4.4.10-040410.201605110631) ...
Setting up linux-headers-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
Examining /etc/kernel/header_postinst.d.
run-parts: executing /etc/kernel/header_postinst.d/dkms 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
Setting up linux-image-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
Running depmod.
update-initramfs: deferring update (hook will be called later)
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
run-parts: executing /etc/kernel/postinst.d/dkms 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
update-initramfs: Generating /boot/initrd.img-4.4.10-040410-generic
Warning: No support for locale: en_IN
run-parts: executing /etc/kernel/postinst.d/pm-utils 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-4.4.10-040410-generic
Found initrd image: /boot/initrd.img-4.4.10-040410-generic
Found linux image: /boot/vmlinuz-4.4.9-040409-lowlatency
Found initrd image: /boot/initrd.img-4.4.9-040409-lowlatency
Found linux image: /boot/vmlinuz-4.4.0-21-generic
Found initrd image: /boot/initrd.img-4.4.0-21-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done
 \_ Done

```

安装后需要重新启动以使用新安装的内核。

```
$ sudo reboot now

```

现在，你正在使用的就是新安装的 4.4.10-040410-generic 版本内核。

```
$ uname -a
Linux magi-VirtualBox 4.4.10-040410-generic #201605110631 SMP Wed May 11 10:33:23 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

```

### 安装最新版本内核

过程与上述相同，它将自动安装最新版本的内核。

```
$ ./update_ubuntu_kernel.sh --latest

[+] Checking Distro
 \_ Distro identified as LinuxMint.

[+] Checking Dependencies
    curl                    Found
    dkms                    Found
    git                     Found
    sudo                    Found
    wget                    Found
    whiptail                Found
    lynx                    Found

[+] Changing to temporary directory to work in . . .
 \_ Temporary directory access granted: /tmp/tmp.pLPYmCze6S

[+] Removing any conflicting remnants . . .
 \_ Done

[+] Retrieving available kernel choices . . .
 \_ Precompiled kernels available from kernel.ubuntu.com:
.
.
.
.
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-4.11.3-041103-generic
Found initrd image: /boot/initrd.img-4.11.3-041103-generic
Found linux image: /boot/vmlinuz-4.4.10-040410-generic
Found initrd image: /boot/initrd.img-4.4.10-040410-generic
Found linux image: /boot/vmlinuz-4.4.9-040409-lowlatency
Found initrd image: /boot/initrd.img-4.4.9-040409-lowlatency
Found linux image: /boot/vmlinuz-4.4.0-21-generic
Found initrd image: /boot/initrd.img-4.4.0-21-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done
 \_ Done

```

安装后需要重新启动以使用新安装的内核。

```
$ sudo reboot now

```

现在，你正在使用的就是最新版本 4.11.3-041103-generic 的内核。

```
$ uname -a
Linux magi-VirtualBox 4.11.3-041103-generic #201705251233 SMP Thu May 25 16:34:52 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

```

### 删除或清除旧内核

只需要运行 `remove_old_kernels.sh` shell 脚本即可删除或清除所有非活动状态的内核。

```
$ ./remove_old_kernels.sh

        ++++++++++++++++++++++++++++++++
        +++       W A R N I N G      +++
        ++++++++++++++++++++++++++++++++

A reboot is recommended before running this script to ensure the current kernel tagged
as the boot kernel is indeed registered and old kernels properly marked for removal.
If you have just installed or modified your existing kernel and do not reboot before
running this script it may render you system INOPERABLE and that would indeed suck.

You have been warned.
~the Mgmt

[?]Continue to automagically remove ALL old kernels? (y/N)y
\_ Removing ALL old kernels . . .
[sudo] password for magi:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.4.0-21* linux-headers-4.4.0-21-generic* linux-headers-4.4.10-040410*
  linux-headers-4.4.10-040410-generic* linux-headers-4.4.9-040409* linux-headers-4.4.9-040409-lowlatency*
  linux-image-4.4.0-21-generic* linux-image-4.4.10-040410-generic* linux-image-4.4.9-040409-lowlatency*
  linux-image-extra-4.4.0-21-generic* linux-kernel-generic*
0 upgraded, 0 newly installed, 11 to remove and 547 not upgraded.
After this operation, 864 MB disk space will be freed.
(Reading database ... 296860 files and directories currently installed.)
Removing linux-kernel-generic (4.4.0-21) ...
Removing linux-headers-4.4.0-21-generic (4.4.0-21.37) ...
Removing linux-headers-4.4.0-21 (4.4.0-21.37) ...
Removing linux-headers-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
Removing linux-headers-4.4.10-040410 (4.4.10-040410.201605110631) ...
Removing linux-headers-4.4.9-040409-lowlatency (4.4.9-040409.201605041832) ...
Removing linux-headers-4.4.9-040409 (4.4.9-040409.201605041832) ...
Removing linux-image-extra-4.4.0-21-generic (4.4.0-21.37) ...
.
.
.
done
Purging configuration files for linux-image-4.4.9-040409-lowlatency (4.4.9-040409.201605041832) ...
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 4.4.9-040409-lowlatency /boot/vmlinuz-4.4.9-040409-lowlatency
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 4.4.9-040409-lowlatency /boot/vmlinuz-4.4.9-040409-lowlatency

```

---

via: <http://www.2daygeek.com/lku-linux-kernel-utilities-compile-install-update-latest-kernel-in-linux-mint-ubuntu/>

作者：[2DAYGEEK](http://www.2daygeek.com/author/2daygeek/) 译者：[firmianay](https://github.com/firmianay) 校对：[wxy](https://github.com/wxy)

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


使用开源代码构建机器人时需要考虑的事项

Summary: 或许你正在考虑（或正在进行）将机器人使用开源软件推向市场。这个机器人是基于 linux 构建的。也许你正在使用机器人操作系统（ROS）或任务导向操作套件（MOOS），或者是另外一个可以帮助你简化开发过程的开源中间件。

![](/data/attachment/album/201707/31/000554yitsityp1zh59ehe.jpg)

或许你正在考虑（或正在进行）将机器人使用开源软件推向市场。这个机器人是基于 linux 构建的。也许你正在使用[机器人操作系统](http://www.ros.org/)（ROS）或[任务导向操作套件](http://www.robots.ox.ac.uk/%7Emobile/MOOS/wiki/pmwiki.php/Main/HomePage)（MOOS），或者是另外一个可以帮助你简化开发过程的开源中间件。当开发接近实用化，对回报的期望开始给你带来一些压力。你可能会被问到“我们的产品什么时候可以开始销售？”，这时你将面临重要的抉择。

你可以做下面两件事之一：

1. 对现有的产品开始出货
2. 回过头去，把产品化当做一个全新的问题来解决，并处理新的问题

不需要看很远，就可以找到采用方式（1）的例子。事实上，在物联网设备市场上，到处都是这样的设备。由于急于将设备推向市场，这些可以在设备中找到硬编码证书、开发密钥、各种安全漏洞和没有更新方式的产品并不少见。

想想 Mirai 僵尸网络，通过该僵尸网络发起的流量超过 1Tbps 的分布式拒绝服务攻击（DDos），导致一些互联网上最大的网站停止服务。这个僵尸网络主要由物联网设备组成。这种攻破设备的防御机制进而控制设备所开发的僵尸程序，是采用了超级酷的黑魔法在一个没有窗户的实验室（或地下基地）开发的吗？不是，默认（通常是硬编码）证书而已。这些设备的制造商是否快速反应并发布所有这些设备的更新，以确保设备的安全？不，很多制造商根本没有更新方法。[他们召回设备而不是发布更新](https://krebsonsecurity.com/2016/10/iot-device-maker-vows-product-recall-legal-action-against-western-accusers/)。

不要急于将产品推向市场，而是退后一步。只要多思考几点，就可以使你自己和你所在公司避免痛苦。

例如，**你的软件如何更新？**你*必须*能回答这个问题。你的软件不是完美的。只要几个星期你就会发现，当你在加利福尼亚使用自主的高机动性多用途轮式车辆（HMMWV）时，它把小灌木识别为一棵橡树。或者你不小心在软件中包含了你的 SSH 密钥。

**基础操作系统如何更新？**也许这仍然是你的产品的一部分，也是你回答上一个问题的答案。但也许你使用的操作系统来自于另外一个供应商。你如何从供应商那里得到更新并提供给客户？这就是安全漏洞真正让你头痛的地方：从来不更新的内核，或者严重过时的 openssl。

当你解决了更新问题，**在更新过程出现问题时，机器人怎么恢复？**我的示例是对前面问题的一个常见解决方案：自动安全更新。对于服务器和台式机以及显然是计算机的东西来说，这是一个很好的做法，因为大多数人意识到有一个可接受的方法来关闭它，而*不是*按住电源按钮 5 秒钟。机器人系统（以及大多数物联网系统）有一个问题，有时它们根本不被认为是计算机。如果您的机器人表现奇怪，有可能会被强制关闭。如果你的机器人行为奇怪是因为它正在快速安装一个内核更新，那么，现在你就有一个安装了半个内核的机器人镇纸了。你需要能够处理这种情况。

最后，**你的工厂流程是什么？**你如何安装 Linux，ROS（或者你使用的中间件），以及你要安装在设备上的你自己的东西？小的工厂可能会手工操作，但这种方法不成规模，也容易出错。其他厂商可能会制作一个定制化的初始发行版 ISO，但这是个不小的任务，在更新软件时也不容易维护。还有一些厂商会使用 Chef 或者有陡峭学习曲线的自动化工具，不久你就会意识到，你把大量的工程精力投入到了本来应该很简单的工作中。

所有这些问题都很重要。针对这些问题，如果你发现自己没有任何明确的答案，你应该加入我们的[网络研讨会](https://www.brighttalk.com/webcast/6793/268763?utm_source=insights)，在研讨会上我们讨论如何使用开放源代码构建一个商业化机器人。我们会帮助你思考这些问题，并可以回答你更多问题。

---

作者简介：

Kyle 是 Snapcraft 团队的一员，也是 Canonical 公司的常驻机器人专家，他专注于 snaps 和 snap 开发实践，以及 snaps 和 Ubuntu Core 的机器人技术实现。

---

via: <https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/>

作者：[Kyle Fazzari](https://insights.ubuntu.com/author/kyrofa/) 译者：[SunWave](https://github.com/SunWave) 校对：[wxy](https://github.com/wxy)

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


NoSQL： 如何在 Ubuntu 16.04 上安装 OrientDB

Summary: OrientDB 是一个多模式的非关系型数据库管理系统。正如开发它的公司所说的“它是一个将图形关系与文档、键值对、反应性、面向对象和地理空间模型结合在一起的可扩展的、高性能的数据库”。

![OrientDB NoSQL DBMS](/data/attachment/album/201707/31/222237hrpp3jzjn3f3nvpk.png "orientdb")

### 说明 - 非关系型数据库（NoSQL）和 OrientDB

通常在我们提及数据库的时候，想到的是两个主要的分类：使用用于用户和应用程序之间进行对接的一种被称为结构化查询语言（**S**tructured **Q**uery **L**anguage ，缩写 SQL）的关系型数据库管理系统（**R**elational **D**ata **b**ase **M**anagement **S**ystem，缩写 RDBMS） 以及非关系型数据库管理系统（non-relational database management systems 或称 NoSQL 数据库）。

这两种模型在如何处理（存储）数据的方面存在着巨大的差异。

#### 关系数据库管理系统

在关系模型中（如 MySQL，或者其分支 MariaDB），一个数据库是一个表的集合，其中每个表包含一个或多个以列组织的数据分类。数据库的每行包含一个唯一的数据实例，其分类由列定义。

举个例子，想象一个包含客户的表。每一行相当于一个客户，而其中的每一列分别对应名字、地址以及其他所必须的信息。

而另一个表可能是包含订单、产品、客户、日期以及其它的种种。而这个数据库的使用者则可以获得一个满足其需要的视图，例如一个客户在一个特定的价格范围购买产品的报告。

#### 非关系型数据库管理系统

在非关系型数据库（或称为<ruby> 不仅仅是数据库 <rt>  Not only SQL </rt></ruby>）管理系统中，数据库被设计为使用不同的方式存储数据，比如文档存储、键值对存储、图形关系存储以及其他方式存储。使用此种形式实现的数据库系统专门被用于大型数据库集群和大型 Web 应用。现今，非关系型数据库被用于某些大公司，如谷歌和亚马逊。

##### 文档存储数据库

文档存储数据库是将数据用文档的形式存储。这种类型的运用通常表现为 JavaScript 和 JSON，实际上，XML 和其他形式的存储也是可以被采用的。这里的一个例子就是 MongoDB。

##### 键值对存储数据库

这是一个由唯一的<ruby> 键 <rt>  key </rt></ruby>配对一个<ruby> 值 <rt>  value </rt></ruby>的简单模型。这个系统在高速缓存方面具有高性能和高度可扩展性。这里的例子包括 BerkeleyDB 和 MemacacheDB。

##### 图形关系数据库

正如其名，这种数据库通过使用<ruby> 图 <rt>  graph </rt></ruby>模型存储数据，这意味着数据通过节点和节点之间的互连进行组织。这是一个可以随着时间的推移和使用而发展的灵活模型。这个系统应用于那些强调映射关系的地方。这里的例子有 IBM Graphs、Neo4j 以及 **OrientDB**。

### OrientDB

[OrientDB](https://orientdb.com/) 是一个多模式的非关系型数据库管理系统。正如开发它的公司所说的“*它是一个将图形关系与文档、键值对、反应性、面向对象和地理空间模型结合在一起的**可扩展的、高性能的数据库***”。

OrientDB 还支持 SQL ，经过扩展可以用来操作树和图。

### 目标

这个教程旨在教会大家如何在运行 Ubuntu 16.04 的服务器上下载并配置 OrientDB 社区版。

### 下载 OrientDB

我们可以从最新的服务端上通过输入下面的指令来下载最新版本的 OrientDB。

```
$ wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux

```

这里下载的是一个包含预编译二进制文件的压缩包，所以我们可以使用 `tar` 指令来操作解压它：

```
$ tar -zxf orientdb-community-2.2.22.tar.gz

```

将从中提取出来的文件夹整体移动到 `/opt`：

```
# mv orientdb-community-2.2.22 /opt/orientdb

```

### 启动 OrientDB 服务器

启动 OrientDB 服务器需要运行 `orientdb/bin/` 目录下的 shell 脚本：

```
# /opt/orientdb/bin/server.sh

```

如果你是第一次开启 OrientDB 服务器，安装程序还会显示一些提示信息，以及提醒你设置 OrientDB 的 root 用户密码：

```
+---------------------------------------------------------------+
| WARNING: FIRST RUN CONFIGURATION |
+---------------------------------------------------------------+
| This is the first time the server is running. Please type a |
| password of your choice for the 'root' user or leave it blank |
| to auto-generate it. |
| |
| To avoid this message set the environment variable or JVM |
| setting ORIENTDB_ROOT_PASSWORD to the root password to use. |
+---------------------------------------------------------------+

Root password [BLANK=auto generate it]: ********
Please confirm the root password: ********

```

在完成这些后，OrientDB 数据库服务器将成功启动：

```
INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer]

```

从现在开始，我们需要用第二个终端来与 OrientDB 服务器进行交互。

若要强制停止 OrientDB 执行 `Ctrl+C` 即可。

### 配置守护进程

此时，我们可以认为 OrientDB 仅仅是一串 shell 脚本，可以用编辑器打开 `/opt/orientdb/bin/orientdb.sh`：

```
# $EDITOR /opt/orientdb/bin/orientdb.sh

```

在它的首段，我们可以看到：

```
#!/bin/sh
# OrientDB service script
#
# Copyright (c) OrientDB LTD (http://orientdb.com/)

# chkconfig: 2345 20 80
# description: OrientDb init script
# processname: orientdb.sh

# You have to SET the OrientDB installation directory here
ORIENTDB_DIR="YOUR_ORIENTDB_INSTALLATION_PATH"
ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH"

```

我们需要配置`ORIENTDB_DIR` 以及 `ORIENTDB_USER`.

然后创建一个用户，例如我们创建一个名为 `orientdb` 的用户，我们需要输入下面的指令：

```
# useradd -r orientdb -s /sbin/nologin

```

`orientdb` 就是我们在 `ORIENTDB_USER` 处输入的用户。

再更改 `/opt/orientdb` 目录的所有权：

```
# chown -R orientdb:orientdb /opt/orientdb

```

改变服务器配置文件的权限：

```
# chmod 640 /opt/orientdb/config/orientdb-server-config.xml

```

#### 下载系统守护进程服务

OrientDB 的压缩包包含一个服务文件 `/opt/orientdb/bin/orientdb.service`。我们将其复制到 `/etc/systemd/system` 文件夹下：

```
# cp /opt/orientdb/bin/orientdb.service /etc/systemd/system

```

编辑该服务文件：

```
# $EDITOR /etc/systemd/system/orientdb.service

```

其中 `[service]` 内容块看起来应该是这样的：

```
[Service]
User=ORIENTDB_USER
Group=ORIENTDB_GROUP
ExecStart=$ORIENTDB_HOME/bin/server.sh

```

将其改成如下样式：

```
[Service]
User=orientdb
Group=orientdb
ExecStart=/opt/orientdb/bin/server.sh

```

保存并退出。

重新加载系统守护进程：

```
# systemctl daemon-reload

```

启动 OrientDB 并使其开机自启动：

```
# systemctl start orientdb
# systemctl enable orientdb

```

确认 OrientDB 的状态：

```
# systemctl status orientdb

```

上述指令应该会输出：

```
● orientdb.service - OrientDB Server
 Loaded: loaded (/etc/systemd/system/orientdb.service; disabled; vendor preset: enabled)
 Active: active (running) ...

```

流程就是这样了！OrientDB 社区版成功安装并且正确运行在我们的服务器上了。

### 总结

在这个指导中，我们看到了一些关系型数据库管理系统（RDBMS）以及非关系型数据库管理系统（NoSQL DBMS）的简单对照。我们也安装 OrientDB 社区版的服务器端并完成了其基础的配置。

这是我们部署完全的 OrientDB 基础设施的第一步，也是我们用于管理大型系统数据的起步。

---

via: <https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/>

作者：[Giuseppe Molica](https://www.unixmen.com/author/tutan/) 译者：[a972667237](https://github.com/a972667237) 校对：[wxy](https://github.com/wxy)

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


我选择 dwm 作为窗口管理器的 4 大理由

和i3wm的主要区别是？

尝试了一下， 确实很棒！

请教一个问题， 桌面平铺方式，窗口与窗口之间留有一条空边，没有紧挨着。

请问楼主这样的效果是怎么实现的呢？

不知道汉化了没

为什么使用已经停产的仅有1G内存的EeePC做生产力工具？我总觉得花时间在选择试用各种窗口管理工具上是种浪费，就像我们经常DIY废物利用上引以为豪一样，难道花钱买更强的工具以提高效率，不比这更“理智”些么？毕竟时间是最宝贵的资源。

js很炫酷，但是依然有人反对使用js，因为它让海平面上身了（逃

请问一下标题的背景图，那个登陆程序谁有，我特别喜欢这个极简风格，不知道能不分享给我或者给我原作者联系方式。<br />
       ——Mr.Chen<zggzcgy@163.com>

>
> <ruby> 窗口管理器 <rt>  window manager </rt></ruby>负责管理打开窗口的大小、布置以及其它相关的方面。
>
>
>

![](/data/attachment/album/201707/31/225336rtq4f2g2iylgw4s2.jpg)

我喜欢极简。如果可能，我会尽量在一个终端下运行所有需要的程序。这避免了一些浮夸的特效占用我的资源或者分散我的注意力。而且，无论怎么调整窗口大小和位置却依旧无法使它们完美地对齐，这也让我感到厌烦。

出于对极简化的追求，我喜欢上了 [Xfce](https://xfce.org/) 并且把它作为我主要的 Linux [桌面环境](https://en.wikipedia.org/wiki/Desktop_environment)好几年了。直到后来我看了 [Bryan Lunduke](http://lunduke.com/) 关于他所使用的名为 [Awesome](https://awesomewm.org/) 的[窗口管理器](https://en.wikipedia.org/wiki/Window_manager)的视频。Awesome 为用户整齐地布置好他们的窗口，看起来就是我想要的效果。但在我尝试之后却发现我难以把它配置成我喜欢的样子。于是我继续搜寻，发现了 [xmonad](http://xmonad.org/)，然而我遇到了同样的问题。[xmonad](http://xmonad.org/) 可以良好运作但为了把它配置成我理想中的样子我却不得不先通过 Haskell 语言这关。（LCTT 译注： AwesomeWM 使用 lua 语言作为配置语言，而 xmonad 使用 Haskell 语言）

几年后，我无意间发现了 [suckless.org](http://suckless.org/) 和他们的窗口管理器 [dwm](http://dwm.suckless.org/)。

简而言之，一个窗口管理器，例如 KDE，Gnome 或者 Xfce，包括了许多部件，其中除了窗口管理器还有其它应用程序。窗口管理器负责管理打开窗口的大小、布置（以及其它窗口相关的方面）。不同的桌面环境使用不同的窗口管理器，KDE 使用 KWin，Gnome 2 使用 Metacity， Gnome 3 使用 Mutter， 以及 Xfce 使用 Xfwm。当然，你可以方便地替换这些桌面环境的默认窗口管理器。我已经把我的窗口管理器替换成 dwm，下面我说说我喜欢 dwm 的理因。

### 动态窗口管理

与 Awesome 及 xmonad 一样，dwm 的杀手锏是它能利用屏幕的所有空间为你自动排布好窗口。当然，在现在的大多数桌面环境中，你也可以设置相应的快捷键把你的窗口放置在屏幕的上下左右或者是全屏，但是有了 dwm 我们就不需要考虑这么多了。

dwm 把屏幕分为主区域和栈区域。它包含三种布局：平铺，单片镜（monocle）和浮动。平铺模式是我最常使用的，它把一个主要的窗口放置在主区域来获取最大关注力，而将其余窗口平铺在栈区域中。在单片镜模式中，所有窗口都会被最大化，你可以在它们之间相互切换。浮动模式允许你自由调整窗口大小（就像在大多数窗口管理器下那样），这在你使用像 Gimp 这类需要自定义窗口大小的应用时更为方便。

一般情况下，在你的桌面环境下你可以使用不同的工作空间（workspace）来分类你的窗口，把相近的应用程序放置在计划好的工作空间中。在工作时，我会使用一个工作空间来进行工作，同时使用另一个工作空间来浏览网页。dwm 有一个相似的功能叫标签。你可以使用标签给窗口分组，当你选中一个标签时，就能显示具有相应标签的窗口。

### 高效

dwm 能让你的计算机尽量地节省电量。Xfce 和其它轻量桌面环境在较旧或者较低性能的机器上很受欢迎，但是相比于 Xfce，dwm 在登录后只使用了它们 1/3 的资源（在我的例子中）。当我在使用一台 1 GB 内存的 Eee PC （LCTT 译注：华硕生产的一款上网本，已停产）时，占用 660 MB 和 230MB 的差别就很大了。这让我有足够的内存空间运行我的编辑器和浏览器。

### 极简

通常，我让我的应用程序彼此相邻：作为主窗口的终端（通常运行着 Vim）、用来查阅邮件的浏览器，和另外一个用来查阅资料或者打开 [Trello](https://opensource.com/node/22546) 的浏览器窗口。对于临时的网页浏览，我会在另一个工作空间或者说是另一个 *标签* 中开启一个 Chromium 窗口。

![](/data/attachment/album/201707/31/225716joxxzxxxeuxo5axn.png)

*来自作者的屏幕截图。*

在标准的桌面环境下，通常会有一或两个面板占据着屏幕上下或者两侧的空间。我尝试过使用自动隐藏功能，但当光标太靠近边缘导致面板弹出造成的不便实在让我很厌烦。你也可以把它们设置得更小，但我还是更喜欢 dwm 的极简状态栏。

### 速度

评判速度时，我比较看重 dwm 在登录后的加载速度和启动程序的速度。如果使用更快、更新的计算机，你可能不会在意这些细节，但是对我来说，不同的桌面环境和窗口管理器会有明显的差距。我实在不想连这种简单的操作也要等待，它们应该一下子就完成。另外，使用键盘快捷键来启动程序比起用鼠标或者触控板要快一些，而且我不想让双手离开键盘。

### 小结

即便如此，我也不会向新手用户推荐 dwm。研究如何配置它需要耗费一些时间（除非你对你的发行版提供的默认配置感到满意）。我发现要让一些你想要的补丁正常工作可能会有点棘手，而且相应的社区也比较小（其 IRC 频道明确表示不提供补丁的手把手帮助）。所以，为了得到你想要的效果，你得有些付出才行。不过，这也是值得的。

而且你看，它就像 Awesome 一样 awesome。

（题图：cinderwick.ca）

---

作者简介：

Jimmy Sjölund - 他是 Telia Company 的高级 IT 服务经理，关注团队开发、探索敏捷工作流和精益工作流的创新导师，以及可视化方向爱好者。他同时也是一名开源布道者，先前从事于 Ubuntu Studio 和 Plume Creator。

---

via: <https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager>

作者：[Jimmy Sjölund](https://opensource.com/users/jimmysjolund) 译者：[haoqixu](https://github.com/haoqixu) 校对：[wxy](https://github.com/wxy)

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


为什么你应该成为一名系统管理员？

Summary: 网络和系统管理工作工资高、岗位多。

薪水翻译错了，原文写的是Annual，年度而不是季度

原文写的是7万刀一年，到你这怎么是7万刀一个季度了？<br />
US$ 70,000 annual income

啊啊，谢谢，确实疏忽了。

网络和系统管理工作工资高、岗位多。

>
> 网络和系统管理工作工资高、岗位多。
>
>
>

![为什么你应该成为一名系统管理员](/data/attachment/album/201708/02/101836qg6w6iiokqx68zfk.jpg "Why you should be a sysadmin")

我们为秩序而战，而服务器大叔则需要你成为系统管理员。

这是个很好的机会，因为你已经管理过你有的那些系统，你本可以不需酬劳地管理那些日逐一日地运行的系统。但还是有一些面试官，愿意拿一笔很不错的薪水来找一些人去管理他们的系统。目前，系统和网络管理的失业率几乎为零，但是美国劳工统计局估计到 2024 年该领域将持续 [9% 的增长](https://www.bls.gov/ooh/Computer-and-Information-Technology/Network-and-computer-systems-administrators.htm#tab-1)。

你可能会问，自动化运维怎么样？大概你已经听一些系统管理员说过，他们打算如何来自动化他们所有的工作，或者，他们如何在一个 shell 脚本里自动化完成他们前任者的工作。你听过的有多少成功的？自动化了某个任务，就会有更多的东西需要自动化。

如果你参加过系统管理者会议或观看过他们的视频，你会发现这是一个需要新鲜血液的领域。不仅仅是明显的缺少年轻人，而且相当地性别和种族不平等。虽然有点儿跑题，但是多样性已经被证明可以提高系统管理员非常感兴趣的自我恢复力、解决问题的能力，创新力和决策力。

### 我要成为一名系统管理员吗？

有人要你，但是你要做系统管理工作吗？如果你生活在一个第一世界国家，每年 70,000 美元的收入看上去是一个可以感到幸福的标准收入，或者说至少减少了大部分的与钱相关的压力。系统和网络管理员的中位年度收入是 80,000 美元，很容易达标，尽管明显有些人赚的更少或更多。

你曾经免费做过一些系统管理工作吗？我们大多数人都多多少少地管理一些设备，但是那并不代表你喜欢管理它。如果你曾经在你家的网络中添加了一些服务器，你就是一个备选的系统管理员。你想要为自己的孩子添加一个“我的世界”的游戏服务器么，所以你用树莓派搭建了一个？也许是时候来考虑通过做这样的工作来获取报酬了。

作为一份需要全面知识的工作，系统管理工作有很大的跨度。各种行业和各种规模的公司都需要系统管理员。大多数的位于市区里的公司需要一些现场上班的人员，但是远程办公也有很大的可能性。

每个人都是免费地用开源软件工作，但是，作为系统管理员，你也可以计酬工作。系统管理员经常把对开源项目做贡献、支持开源供应商、使用各种各样的有趣而强大的开源软件为他们日常工作的一部分。

最后，谈一下社区。以我多年的经验来看，找到一个欢迎新人的、鼓励参与的、气氛友好的、彼此帮助的社区是非常难的。系统管理员给人的刻板印象就是性情乖戾，但是我感觉现在这只不过是个过时的笑话。现在大多数的系统管理员积极地回应各种形式的有建设性的反馈，尤其是欢迎新手。我们总是能敏锐的察觉到各种各样的入门级问题，并且热心于解决它们。我们是一个有深度的、兴趣广泛的社区。问一下一个系统管理员在工作之余都干了些什么，你肯定会感到吃惊。

### 那么，我要从哪儿开始？

如果你被说服了，首先有个好消息。与许多技术类职业相比，从不是直接相关的四年制学历转为系统管理员是可能的。事实上，全世界有四年本科学历的系统管理员相对较少，所以不用太担心这个。对于现在的白领工作，学历确实有用，而且越相关越好。与其他的技术类职业相比，这儿有一个很自然的入门级别的职位：技术支持。

对系统管理工作的候选人来说有个坏消息是真的，在技术类领域（甚至非技术类领域）：雇主在寻找有多年经验的和有高学历的人，即便是在入门级别的岗位上。雇主是刻薄的，雇主不会花钱给你培训。不过稍嫌安慰的是，这些问题在人才市场上是非常普遍的，所以不管你找什么工作都得面对这种问题。

系统管理工作可以作为其他 IT 领域的起点。比如：网络管理、数据库管理、网站可靠性工程师（SRE），再远一些的也有，软件工程师、质量保证（QA）、IT 管理。

系统管理工作的具体情况，包括其刻板的印象和一些明显的方面以及不明显的方面，是未来我们的文章的主题。我们也会涵盖这个领域可能会改变的重要方面，提供一些方法来评估和比较系统管理职位，以及在面试中问到的一些重要问题。

如果你对加入这个领域有兴趣，可以考虑加入[专业系统管理者联盟](https://lopsa.org/)（LOPSA），我在这个组织任董事会成员。会员资格是你负担得起的（可能由您的雇主负责），而学生免费。成为 LOPSA 会员，是找到同行们和与有各种经验、各种行业和工作环境中的人员讨论职业生涯的绝佳方式。

（题图 : Jason Baker, CC BY-SA 4.0）

---

作者简介：

Paul English - 他是 PreOS 安全公司的首席执行官，也是专业系统管理员联盟的董事会成员，该专业系统管理员联盟是一个非营利性专业协会，从 2015 年至今致力于提升系统管理工作实践。 Paul 在 1998 年获得了伍斯特理工学院的计算机学士学位。自 1996 年以来，Paul 一直是 UNIX 和 Linux 系统管理员和许多场合冠以 IT 之名的那个人。最近他在管理一些系统管理员。

---

via: <https://opensource.com/article/17/7/why-become-sysadmin>

作者：[Paul English](https://opensource.com/users/penglish) 译者：[sugarfillet](https://github.com/sugarfillet) 校对：[wxy](https://github.com/wxy)

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


在 Ubuntu 16.04 中使用 Docker Compose

Summary: Docker Compose 是一个运行多容器 Docker 应用的工具。Compose 通过一个配置文件来配置一个应用的服务，然后通过一个命令创建并启动所有在配置文件中指定的服务。

好久没来了，文章不错

![](/data/attachment/album/201708/02/140524jlue8l55rlerttnn.png)

### 什么是 Docker Compose

[Docker Compose](https://docs.docker.com/compose/overview/) 是一个运行多容器 Docker 应用的工具。Compose 通过一个配置文件来配置一个应用的服务，然后通过一个命令创建并启动所有在配置文件中指定的服务。

Docker Compose 适用于许多不同的项目，如：

* **开发**：利用 Compose 命令行工具，我们可以创建一个隔离（而可交互）的环境来承载正在开发中的应用程序。通过使用 [Compose 文件](https://docs.docker.com/compose/compose-file/)，开发者可以记录和配置所有应用程序的服务依赖关系。
* **自动测试**：此用例需求一个测试运行环境。Compose 提供了一种方便的方式来管理测试套件的隔离测试环境。完整的环境在 Compose 文件中定义。

Docker Compose 是在 [Fig](http://www.fig.sh/) 的源码上构建的，这个社区项目现在已经没有使用了。

在本教程中，我们将看到如何在 Ubuntn 16.04 上安装 Docker Compose。

### 安装 Docker

我们需要安装 Docker 来安装 Docker Compose。首先为官方 Docker 仓库添加公钥。

```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

```

接下来，添加 Docker 仓库到 `apt` 源列表：

```
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

```

更新包数据库，并使用 `apt` 安装 Docker

```
$ sudo apt-get update
$ sudo apt install docker-ce

```

在安装进程结束后，Docker 守护程序应该已经启动并设为开机自动启动。我们可以通过下面的命令来查看它的状态：

```
$ sudo systemctl status docker
---------------------------------

● docker.service - Docker Application Container Engine
 Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
 Active: active (running)

```

### 安装 Docker Compose

现在可以安装 Docker Compose 了。通过执行以下命令下载当前版本。

```
# curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

```

为二进制文件添加执行权限：

```
# chmod +x /usr/local/bin/docker-compose

```

检查 Docker Compose 版本：

```
$ docker-compose -v

```

输出应该如下：

```
docker-compose version 1.14.0, build c7bdf9e

```

### 测试 Docker Compose

Docker Hub 包含了一个用于演示的 Hello World 镜像，可以用来说明使用 Docker Compose 来运行一个容器所需的配置。

创建并打开一个目录：

```
$ mkdir hello-world
$ cd hello-world

```

创建一个新的 YAML 文件：

```
$ $EDITOR docker-compose.yml

```

在文件中粘贴如下内容：

```
unixmen-compose-test:
 image: hello-world

```

***注意:** 第一行是容器名称的一部分。*

保存并退出。

### 运行容器

接下来，在 `hello-world` 目录执行以下命令：

```
$ sudo docker-compose up

```

如果一切正常，Compose 输出应该如下：

```
Pulling unixmen-compose-test (hello-world:latest)...
latest: Pulling from library/hello-world
b04784fba78d: Pull complete
Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f
Status: Downloaded newer image for hello-world:latest
Creating helloworld_unixmen-compose-test_1 ...
Creating helloworld_unixmen-compose-test_1 ... done
Attaching to helloworld_unixmen-compose-test_1
unixmen-compose-test_1 |
unixmen-compose-test_1 | Hello from Docker!
unixmen-compose-test_1 | This message shows that your installation appears to be working correctly.
unixmen-compose-test_1 |
unixmen-compose-test_1 | To generate this message, Docker took the following steps:
unixmen-compose-test_1 | 1\. The Docker client contacted the Docker daemon.
unixmen-compose-test_1 | 2\. The Docker daemon pulled the "hello-world" image from the Docker Hub.
unixmen-compose-test_1 | 3\. The Docker daemon created a new container from that image which runs the
unixmen-compose-test_1 | executable that produces the output you are currently reading.
unixmen-compose-test_1 | 4\. The Docker daemon streamed that output to the Docker client, which sent it
unixmen-compose-test_1 | to your terminal.
unixmen-compose-test_1 |
unixmen-compose-test_1 | To try something more ambitious, you can run an Ubuntu container with:
unixmen-compose-test_1 | $ docker run -it ubuntu bash
unixmen-compose-test_1 |
unixmen-compose-test_1 | Share images, automate workflows, and more with a free Docker ID:
unixmen-compose-test_1 | https://cloud.docker.com/
unixmen-compose-test_1 |
unixmen-compose-test_1 | For more examples and ideas, visit:
unixmen-compose-test_1 | https://docs.docker.com/engine/userguide/
unixmen-compose-test_1 |
helloworld_unixmen-compose-test_1 exited with code 0

```

Docker 容器只能在命令（LCTT 译注：此处应为容器中的命令）还处于活动状态时运行，因此当测试完成运行时，容器将停止运行。

### 结论

本文是关于在 Ubuntu 16.04 中安装 Docker Compose 的教程。我们还看到了如何通过一个 YAML 格式的 Compose 文件构建一个简单的项目。

---

via: <https://www.unixmen.com/container-docker-compose-ubuntu-16-04/>

作者：[Giuseppe Molica](https://www.unixmen.com/author/tutan/) 译者：[Locez](https://github.com/locez) 校对：[wxy](https://github.com/wxy)

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


如何保护 Ubuntu 16.04 上的 NGINX Web 服务器

Summary: Let’s Encrypt 是互联网安全研究组织 （ISRG） 提供的免费证书认证机构。它提供了一种轻松自动的方式来获取免费的 SSL/TLS 证书 - 这是在 Web 服务器上启用加密和 HTTPS 流量的必要步骤。获取和安装证书的大多数步骤可以通过使用名为 Certbot 的工具进行自动化。

![](/data/attachment/album/201708/02/143330iaahap07p77wubho.png)

### 什么是 Let’s Encrypt

[Let’s Encrypt](https://letsencrypt.org/) 是互联网安全研究组织 （ISRG） 提供的免费证书认证机构。它提供了一种轻松自动的方式来获取免费的 SSL/TLS 证书 - 这是在 Web 服务器上启用加密和 HTTPS 流量的必要步骤。获取和安装证书的大多数步骤可以通过使用名为 [Certbot](https://certbot.eff.org/) 的工具进行自动化。

特别地，该软件可在可以使用 shell 的服务器上使用：换句话说，它可以通过 SSH 连接使用。

在本教程中，我们将看到如何使用 `certbot` 获取免费的 SSL 证书，并在 Ubuntu 16.04 服务器上使用 Nginx。

### 安装 Certbot

第一步是安装 `certbot`，该软件客户端可以几乎自动化所有的过程。 Certbot 开发人员维护自己的 Ubuntu 仓库，其中包含比 Ubuntu 仓库中存在的软件更新的软件。

添加 Certbot 仓库：

```
# add-apt-repository ppa:certbot/certbot

```

接下来，更新 APT 源列表：

```
# apt-get update

```

此时，可以使用以下 `apt` 命令安装 `certbot`：

```
# apt-get install certbot

```

Certbot 现已安装并可使用。

### 获得证书

有各种 Certbot 插件可用于获取 SSL 证书。这些插件有助于获取证书，而证书的安装和 Web 服务器配置都留给管理员。

我们使用一个名为 **Webroot** 的插件来获取 SSL 证书。

在有能力修改正在提供的内容的情况下，建议使用此插件。在证书颁发过程中不需要停止 Web 服务器。

#### 配置 NGINX

Webroot 会在 Web 根目录下的 `.well-known` 目录中为每个域创建一个临时文件。在我们的例子中，Web 根目录是 `/var/www/html`。确保该目录在 Let’s Encrypt 验证时可访问。为此，请编辑 NGINX 配置。使用文本编辑器打开 `/etc/nginx/sites-available/default`：

```
# $EDITOR /etc/nginx/sites-available/default

```

在该文件中，在 `server` 块内，输入以下内容：

```
 location ~ /.well-known {
    allow all;
 }

```

保存，退出并检查 NGINX 配置：

```
# nginx -t

```

没有错误的话应该会显示如下：

```
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

```

重启 NGINX：

```
# systemctl restart nginx

```

#### 使用 Certbot 获取证书

下一步是使用 Certbot 的 Webroot 插件获取新证书。在本教程中，我们将保护示例域 www.example.com。需要指定应由证书保护的每个域。执行以下命令：

```
# certbot certonly --webroot --webroot-path=/var/www/html -d www.example.com

```

在此过程中，Cerbot 将询问有效的电子邮件地址，用于进行通知。还会要求与 EFF 分享，但这不是必需的。在同意服务条款之后，它将获得一个新的证书。

最后，目录 `/etc/letsencrypt/archive` 将包含以下文件：

* `chain.pem`：Let’s Encrypt 加密链证书。
* `cert.pem`：域名证书。
* `fullchain.pem`：`cert.pem`和 `chain.pem` 的组合。
* `privkey.pem`：证书的私钥。

Certbot 还将创建符号链接到 `/etc/letsencrypt/live/domain_name/` 中的最新证书文件。这是我们将在服务器配置中使用的路径。

### 在 NGINX 上配置 SSL/TLS

下一步是服务器配置。在 `/etc/nginx/snippets/` 中创建一个新的代码段。 **snippet** 是指一段配置，可以包含在虚拟主机配置文件中。如下创建一个新的文件：

```
# $EDITOR /etc/nginx/snippets/secure-example.conf

```

该文件的内容将指定证书和密钥位置。粘贴以下内容：

```
ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem;

```

在我们的例子中，`domain_name` 是 `example.com`。

#### 编辑 NGINX 配置

编辑默认虚拟主机文件：

```
# $EDITOR /etc/nginx/sites-available/default

```

如下：

```
server {
 listen 80 default_server;
 listen [::]:80 default_server;
 server_name www.example.com
 return 301 https://$server_name$request_uri;

 # SSL configuration
 #
 listen 443 ssl default_server;
 listen [::]:443 ssl default_server;
 include snippets/secure-example.conf
 #
 # Note: You should disable gzip for SSL traffic.
 # See: https://bugs.debian.org/773332
 # ...
}
```

这将启用 NGINX 加密功能。

保存、退出并检查 NGINX 配置文件：

```
# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

```

重启 NGINX：

```
# systemctl restart nginx

```

### 总结

按照上述步骤，此时我们已经拥有了一个安全的基于 NGINX 的 Web 服务器，它由 Certbot 和 Let’s Encrypt 提供加密。这只是一个基本配置，当然你可以使用许多 NGINX 配置参数来个性化所有东西，但这取决于特定的 Web 服务器要求。

---

via: <https://www.unixmen.com/encryption-secure-nginx-web-server-ubuntu-16-04/>

作者：[Giuseppe Molica](https://www.unixmen.com/author/tutan/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


运行 Ubuntu 的 Husarion CORE2-ROS 使得机器人开发变得容易

这篇整个是在做广告啊:)

>
> 这是游客投稿的本系列两篇中的第一篇；作者：Dominik Nowak，Husarion 的 CEO
>
>
>

过去十年，我们见证了 IT 行业的许多突破。可以说对消费者最有意义的一个方面是智能手机和移动开发的普及。接下来的大事件是什么，现在智能手机是如此常见，我们天天对着它，是不是有点无聊吗？所以，我们猜是：机器人。

众所周知，许多生产线完全由机器人运行。但在消费者和服务方面，还没有看到巨大的突破。我们认为这是一个可达性和降低开发人员进入的门槛的问题。只需要有好的、简单的工具来快速做出原型和开发机器人。为了测试新的想法并赋予工程师们更多能力，以便他们可以解决许多人类仍然面临的问题，那些比在应用中的点按一下更棘手的问题。

构建机器人是一个具有挑战性的任务，[Husarion](https://husarion.com/) 团队正在努力使其更容易。Husarion 是一家从事于机器人快速开发平台的机器人公司。该公司的产品是 CORE2 机器人控制器和用于管理所有基于 CORE2 的机器人的云平台。CORE2 是第二代 Husarion 机器人控制器，它可在[这里](https://www.crowdsupply.com/husarion/core2)找到。

CORE2 结合了实时微控制器板和运行 Ubuntu 的单板计算机。Ubuntu 是最受欢迎的 Linux 发行版，不仅适用于[桌面](https://www.ubuntu.com/desktop)，还适用于物联网和 [机器人](https://www.ubuntu.com/internet-of-things/robotics)程序中的嵌入式硬件。

![](/data/attachment/album/201708/03/181721kajottt4qsus666t.png)

CORE2 控制器有两种配置。第一款是采用 ESP32 Wi-Fi 模块的，专用于需要低功耗和实时、安全遥控的机器人应用。第二款，称为 CORE2-ROS，基本上是将两块板子集成到了一起：

* 使用实时操作系统（RTOS）的实时微控制器并集成电机、编码器和传感器接口的电路板
* 带有 ROS（[Robot Operating System](http://www.ros.org/)）包的运行 Linux 的单板计算机（SBC）和其他软件工具。

“实时”电路板做底层工作。它包含高效的 STM32F4 系列微控制器，非常适用于驱动电机、读码器、与传感器通信，并控制整个机电或机器人系统。在大多数应用中，CPU 负载不超过几个百分点，实时操作由基于 RTOS 的专用编程框架支持。我们还保证与 Arduino 库的兼容性。大多数任务都在微控制器外设中处理，如定时器、通信接口、ADC 等，它具有中断和 DMA 通道的强大支持。简而言之，对于具有其他任务的单板计算机来说，这不是一项任务。

另一方面，很显然，现代先进的机器人程序不能仅仅基于微控制器，原因如下：

* 自动机器人需要大量的处理能力来执行导航、图像和声音识别、移动等等，
* 编写先进的软件需要标准化才能有效 - SBC 在行业中越来越受欢迎，而对于为 SBC 编写的软件也是如此，这与 PC 电脑非常相似
* SBC 每年都变得越来越便宜 – Husarion 认为，结合这两个世界在机器人技术方面是非常有益的。

CORE2-ROS 控制器有两种配置：[Raspberry Pi 3](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/) 或 [ASUS Tinker Board](https://www.asus.com/uk/Single-Board-Computer/Tinker-Board/)。CORE-ROS 运行于 Ubuntu、Husarion 开发和管理工具以及 ROS 软件包上。

下篇文章将介绍为何 Husarion 决定使用 Ubuntu 。

---

via: <https://insights.ubuntu.com/2017/07/12/robot-development-made-easy-with-husarion-core2-ros-running-ubuntu/>

作者：[Dominik Nowak](https://insights.ubuntu.com/author/guest/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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