React Native Ubuntu 简介

![](/data/attachment/album/201610/10/223040hwrbl6rq2bsaos36.jpg)

在 Canonical 的 Webapps 团队，我们总在寻找可以为开发者所用的 web 和 web 相关技术。我们想让每个人生活更轻松，让 web 开发者更加熟悉工具的使用，并且在 Ubuntu 上提供一个使用它们的简单途径。

我们提供对 web 应用以及创建和打包 Cordova 应用的支持，这使得在 Ubuntu 上使用任意 web 框架来创造美妙的应用体验成为可能。

其中一个可以在这些情景中使用的主流框架就是 React.js。React.js 是一个拥有声明式编程模型和强大的组件系统的 UI 框架，它主要侧重于 UI 的构建，所以你可以在你喜欢的任何地方用上它。

然而这些应用场景太广泛了，有时候你可能需要更高的性能，或者能够直接用原生 UI 组件来开发，但是在一个不太熟悉的场景中使用它可能不合时宜。如果你熟悉 React.js，那么通过 React Native 来开发可以毫不费力地将你所有现有的知识和工具迁移到完全的原生组件开发中。React Native 是 React.js 的姐妹项目，你可以用同样的方式和代码来创建一个直接使用原生组件并且拥有原生级别性能的应用，而且这就和你期待的一样轻松快捷。

![](/data/attachment/album/201610/10/223043p8uc5vmra0vuwryf.png)

我们很高兴地宣布随着我们对 HTML5 应用的支持，现在可以在 Ubuntu 平台上开发 React Native 应用了。你可以移植你现有的 iOS 或 Android 版本的 React Native 应用，或者利用你的 web 开发技能来创建一个新的应用。

你可以在 [这里](https://github.com/CanonicalLtd/react-native) 找到 React Native Ubuntu 的源代码，要开始使用时，跟随 [README-ubuntu.md](https://github.com/CanonicalLtd/react-native/blob/ubuntu/README-ubuntu.md) 的指导，并创建你的第一个应用吧。

Ubuntu 的支持包括生成软件包的功能。通过 React Native CLI，构建一个 snap 软件包只需要简单执行 `react-native package-ubuntu --snap` 这样的命令。还可以为 Ubuntu 设备构建一个 click 包，这意味着 React Native Ubuntu 应用从一开始就可以放到 Ubuntu 商店了。

在不久的将来会有很多关于在 Ubuntu 上开发一个 React Native 应用你所需要了解的东西的博文，例如创建应用、开发流程以及打包并发布到商店等等。还会有一些关于怎样开发新型的可复用的模块的信息，这些模块可以给运行时环境增加额外的功能，并且可以发布为 npm 模块。

赶快去实践一下吧，看看你能创造出些什么来。

---

via: <https://developer.ubuntu.com/en/blog/2016/08/05/introducing-react-native-ubuntu/>

作者：[Justin McPherson](https://developer.ubuntu.com/en/blog/authors/justinmcp/) 译者：[Mars Wong](https://github.com/OneNewLife) 校对：[wxy](https://github.com/wxy)

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


4 个你需要了解的容器网络工具

![](/data/attachment/album/201610/11/112511nq2olvqo9wkmssow.jpg)

有如此之多的各种新的云计算技术、工具和技术需要我们跟进，到底从哪里开始学习是一个艰难的决定。这一系列[下一代云计算技术](https://www.linux.com/news/5-next-gen-cloud-technologies-you-should-know)的文章旨在让你快速了解新兴和快速变化领域的重大项目和产品，比如软件定义网络（SDN）、容器，以及其交叉领域：容器网络。

对于企业容器部署，容器和网络之间的关系仍然是一个挑战。容器需要网络功能来连接分布式应用程序。根据一篇最新的[企业网络星球](http://www.enterprisenetworkingplanet.com/datacenter/datacenter-blog/container-networking-challenges-for-the-enterprise.html)的文章，一部分的挑战是“以隔离的方式部署容器，在提供隔离自己容器内数据的所需功能的同时，保持有效的连接性”。

流行的容器平台 [Docker](https://docs.docker.com/engine/userguide/networking/dockernetworks/)，使用了软件定义虚拟网络来连接容器与本地网络。此外，它使用 Linux 的桥接功能和虚拟可扩展局域网（VXLAN）技术，可以在同一 Swarm 或容器集群内互相沟通。Docker 的插件架构也支持其他网络管理工具来管理容器网络，比如下面的提到的工具。

容器网络上的创新使得容器可以跨主机连接到其他容器上。这使开发人员可以在开发环境中，在一个主机上部署一个容器来运行一个应用，然后可以过渡到测试环境中，进而到生产环境中，使应用可以持续集成，敏捷开发，快速部署。

容器网络工具有助于实现容器网络的可扩展性，主要是通过：

1. 使复杂的，多主机系统能够跨多个容器主机进行分发。
2. 允许构建跨越多个公有云和私有云平台上的大量主机的容器系统。

![](/data/attachment/album/201610/11/112512wssv5z5szvy5qds7.jpg)

*John Willis speaking 在 Open Networking Summit 2016.*

要获取更多信息，查看 [Docker 网络教程](https://youtu.be/Le0bEg4taak)，是由 Brent Salisbury 和 John Willis 在最近的 [Open Networking Summit (ONS)](http://events.linuxfoundation.org/events/open-networking-summit)讲演的。更多关于 ONS 的演讲内容可以在[这里](https://www.linux.com/watch-videos-from-ons2016)找到。

你应该知道的容器网络工具和项目包括下述：

* [Calico](https://www.projectcalico.org/) -- Calico 项目（源自 [Metaswitch](http://www.metaswitch.com/cloud-network-virtualization)）利用边界网关协议（BGP）和集成的云编排系统来保证虚拟机和容器之间的 IP 通信安全。
* [Flannel](https://coreos.com/blog/introducing-rudder/) -- Flannel (之前叫 rudder) 源自 [CoreOS](https://coreos.com/)，它提供了一个覆盖网络，可以作为一个现有的 SDN 解决方案的替代品。
* [Weaveworks](https://www.weave.works/) -- Weaveworks 项目管理容器的工具包括 [Weave Net](https://www.weave.works/products/weave-net/)、Weave Scope、Weave Flux。Weave Net 是一种用于构建和部署 Docker 容器的网络工具。
* [Canal](https://github.com/tigera/canal) -- 就在本周，CoreOS 和 Tigera 宣布了新的开源项目 Canal 的信息。据其声明，Canal 项目旨在结合部分 Calico 和 Flannel，“构造网络安全策略到网络架构和云管理平台之中”。

你可以通过 Linux 基金会的免费“云基础设施技术”课程来了解更多关于容器管理、软件定义网络和其他下一代云技术，这是一个在 edX 上提供的大规模公开在线课程。[课程注册目前已经开放](https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-cloud-infrastructure-technologies?utm_source=linuxcom&utm_medium=article&utm_campaign=cloud%20mooc%20article%201)，课程内容于 6 月开放。

---

via: <https://www.linux.com/news/4-container-networking-tools-know>

作者：[AMBER ANKERHOLZ](https://www.linux.com/users/aankerholz) 译者：[Bestony](https://github.com/Bestony) 校对：[wxy](https://github.com/wxy)

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


Terminator：一款一个窗口包含多个终端的 Linux 终端仿真器

这货很好用，虽然一般情况默认终端就能满足我，但也有手忙脚乱的时候，这时候Terminator就上场了，不过最多我只会分成四个窗口~

想问下有 T-1000 吗？

有 T-800 : https://linux.cn/article-6745-1.html

已用N年

不知道和screen/tmux相比有什么明显优势？

可以的，有空试试

用平铺wm就用不上terminator了,tmux也不错,选择蛮多的

题主，谢谢你的分享，但是我在使用的过程中遇到了一个问题：

我是下载的源码，然后运行[./setup.py install]，但是安装完成运行命令[terminator]之后，出现：

linux@ubuntu64-vm:/mnt/hgfs/vmshare/terminator-1.90$ terminator

Traceback (most recent call last):

  File "/usr/local/bin/terminator", line 23, in <module>

    import psutil

ImportError: No module named psutil

应该是少一个模块，请问应该如何解决这个问题？

再次感谢！

四个最棒了

![](/data/attachment/album/201610/11/114348clevcovwwcxgte0h.jpg)

为了通过命令行和系统互动，每一款 Linux 发行版都有一款默认的终端仿真器。但是，默认的终端应用可能不适合你。为了大幅提升你工作的速度，有好多款终端应用提供了更多的功能，可以同时执行更多的任务。这些有用的终端仿真器就包括 Terminator，这是一款 Linux 系统下支持多窗口的自由开源的终端仿真器。

### 什么是 Linux 终端仿真器

Linux 终端仿真器是一个让你和 shell 交互的程序。所有的 Linux 发行版都会自带一款 Linux 终端应用让你向 shell 传递命令。

### Terminator，一款自由开源的 Linux 终端应用

Terminator 是一款 Linux 终端模拟器，提供了你的默认的终端应用不支持的多个特性。它提供了在一个窗口创建多个终端的功能，以加快你的工作速度。除了多窗口外，它也允许你修改其它特性，例如字体、字体颜色、背景色等等。让我们看看我们如何安装它，并且如何在不同的 Linux 发行版下使用 Terminator。

### 如何在 Linux 下安装 Terminator？

#### 在基于 Ubuntu 的发行版上安装 Terminator

Terminator 在默认的 Ubuntu 仓库就可以使用。所以你不需要添加额外的 PPA。只需要使用 APT 或者“软件应用”在 Ubuntu 下直接安装。

```
sudo apt-get install terminator

```

假如你的默认的仓库中 Terminator 不可用，只需要使用源码编译 Terminator 即可。

* [下载源码](https://launchpad.net/terminator/+download)

下载 Terminator 源码并且解压到你的桌面。现在打开你的默认的终端，然后 `cd` 到解压的目录。

现在就可以使用下面的命令来安装 Terminator 了：

```
sudo ./setup.py install

```

#### 在 Fedora 及衍生的操作系统上安装 Terminator

```
dnf install terminator

```

#### 在 OpenSuse 上安装 Terminator

参见此文：[在 OPENSUSE 上安装](http://software.opensuse.org/download.html?project=home%3AKorbi123&package=terminator)。

### 如何在一个窗口使用多个终端？

安装好 Terminator 之后，你可以简单的在一个窗口打开多个终端。只需要右键点击并切分。

![](/data/attachment/album/201610/11/114334blapfyo3p2zl8mop.jpg)

![](/data/attachment/album/201610/11/114335bq971vlq9sqvzo16.jpg)

只要你愿意，你可以创建尽可能多的终端，只要你能管理得过来。

![](/data/attachment/album/201610/11/114335w5rsrngkkvpb83gz.jpg)

### 定制终端

右键点击终端，并单击属性。现在你可以定制字体、字体颜色、标题颜色和背景，还有终端字体颜色和背景。

![](/data/attachment/album/201610/11/114336rj4hgiihcg1cjc41.jpg)

![](/data/attachment/album/201610/11/114336lmlldsnycyl6tm4l.jpg)

### 结论：什么是你最喜欢的终端模拟器

Terminator 是一款先进的终端模拟器，它可以让你自定义界面。如果你还没有从你默认的终端模拟器中切换过来的话，你可以尝试一下它。我知道你将会喜欢上它。如果你正在使用其他的自由开源的终端模拟器的话，请让我们知道你最喜欢的那一款。不要忘了和你的朋友分享这篇文章。或许你的朋友正在寻找类似的东西。

---

via: <http://www.linuxandubuntu.com/home/terminator-a-linux-terminal-emulator-with-multiple-terminals-in-one-window>

作者：[linuxandubuntu](http://www.linuxandubuntu.com/home/terminator-a-linux-terminal-emulator-with-multiple-terminals-in-one-window) 译者：[yangmingming](https://github.com/yangmingming) 校对：[wxy](https://github.com/wxy)

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


当我有 6 百万时，就发布 Linux 5.0

Summary: 据 Linus Torvalds 最近的一则 Google+ 帖子，他开玩笑的说，当 Linux 项目有 6 百万个 Git 对象时就发布 Linux 5.0 内核。

改成 Linux Kernel 5.0 会更严谨些，单写 Linux 5.0 第一眼可能以为是发行版。

什么发行版... 只是那些人太片面

6 百万也是，咋一看以为是说钱。

严格来说，Linux 其实就只是内核而已，只是人们习惯把 Linux 发行版当成 Linux 罢了。

我也是，但是我又觉得600万元虽然很多，但脱瓦斯冒个泡应该很快就能筹够

我觉得那些能看成是发行版的人，可能根本都分不清发行版和内核的区别。。。

林纳斯缺钱了

未必，对于名为 Linux Lite 面向新人的发行版，确实容易让人把发行版和内核相混淆。

2.6系列有40个版本。3系列有20个版本，4系列有10个版本，按照这进度，估计5系列只有5个版本就到6系列了。

强势

小白路过

这货年薪一千万美金

可惜国内不能访问，否则肯定超过600w

据 Linus Torvalds [最近的一则 Google+ 帖子](https://plus.google.com/+LinusTorvalds/posts/hbdxizBNrYn)，他开玩笑的说，当 Linux 项目有 6 百万个 Git 对象时就发布 Linux 5.0 内核。

Linux 内核主要的里程碑版本，比如 Linux 3.0、[Linux 4.0](/article-5259-1.html) 都是发布于 Git 对象数量分别达到了 2 百万和 4 百万时，而在2016 年 10 月 8 日，当前的 Git 对象已经达到了 5 百万，所以，看起来到下一个百万数量线时，就会发布 Linux 5.0 了。

“现在我们正处于 Linux 4.0 和 5.0 中间，”Linus Torvalds 说，“换句话说： 3.0 发布于内核 Git 对象数据库有 2 百万个对象时，而 4.0 发布于 4 百万时。所以，很自然的，按数字来说，毫无疑问 5.0 应该在我们到达 6 百万对象时发布。”

![](/data/attachment/album/201610/11/125327b3343qilq2twei23.jpg)

正如你已经知道的， [Linux 4.8 内核已经于 2016 年 10 月 2 日发布](/article-7837-1.html)，而且由于一个[严重错误](http://lkml.iu.edu/hypermail/linux/kernel/1610.0/00878.html)，很快发布了第一个维护版本 4.8.1。这就代表目前已经进入了 Linux 4.9 内核的开发阶段，它也是下一个 LTS 分支。而就在下周 10 月 16 日，4.9 就会发布其第一个 RC 版本。

### Linux 5.0 内核的开发将于 2016 年 12 月开始

如果 Linux 4.9 内核能够正常发布，有 7 个 RC 版本的话，那它应该正式发布于 12 月 4 日。如果不幸的遇到了一些问题而延迟，那有可能要到 12 月中旬才能开启 Linux 5.0 内核的合并窗口，也许会在今年的圣诞节前发布第一个 RC 版本。

而且，如果 Linux 5.0 的开发也是常规的 7 个 RC 版本的话， 第二个 RC 版本应该出现在明年 1 月 8 日，而最后一个则会在 2017 年的 2 月中旬。不管怎么说，我们会在 2 月份见到 Linux 5.0 内核的正式发布——当然，如果 6 百万 Git 对象的线达到了的话。


如何使用 SSHFS 通过 SSH 挂载远程的 Linux 文件系统或者目录

sshfs 也是有不足的地方，不支持命令 chattr 或 lsattr 。

如果希望向远程主机追加内容，到启用了(chattr +a)的日志文件，这是我的变通解决方法。

declare exec='\su - copyist --command'

declare args="$'\ssh -fnt ${REMOTE_USER}@${REMOTE_HOST} \'echo \'${INFO}\' >> ${LOG_FILE}\''"

eval $exec $args &> /nul

/nul 是指向 /dev/null 的文件符号链接。

P.S. 其实我好想把 /nul 的 / 也给生略了，就像 Windows 那样，不过没有找到方法。

sshfs如何设置权限，才能实现只读挂载或读写挂载，

来自210.12.140.210的 QQ Browser 10.5|Windows 10 用户

写这篇文章的主要目的就是提供一步一步的指导，关于如何使用 SSHFS 通过 SSH 挂载远程的 Linux 文件系统或目录。

这篇文章对于那些无论出于什么目的，希望在他们本地的系统中挂载远程的文件系统的用户或者系统管理员有帮助。我们通过 Linux 系统中的一个安装了 SSHFS 客户端进行实际测试，并且成功的挂载了远程的文件系统。

在我们进一步安装之前，让我们了解一下 SSHFS 的相关内容，以及它是如何工作的。

![](/data/attachment/album/201610/12/095124vr9cmdgilii8rrwr.png)

*Sshfs 挂载远程的 Linux 文件系统或者目录*

### 什么是 SSHFS？

SSHFS（Secure SHell FileSystem）是一个客户端，可以让我们通过 SSH 文件传输协议（SFTP）挂载远程的文件系统并且在本地机器上和远程的目录和文件进行交互。

SFTP 是一种通过 SSH 协议提供文件访问、文件传输和文件管理功能的安全文件传输协议。因为 SSH 在网络中从一台电脑到另一台电脑传输文件的时候使用数据加密通道，并且 SSHFS 内置在 FUSE（用户空间的文件系统）内核模块，允许任何非特权用户在不修改内核代码的情况下创建他们自己的文件系统。

在这篇文章中，我们将会向你展示在任意 Linux 发行版上如何安装并且使用 SSHFS 客户端，在本地 Linux 机器上挂载远程的 Linux 文件系统或者目录。

#### 步骤 1：在 Linux 系统上安装 SSHFS

默认情况下，sshfs 包不存在所有的主流 Linux 发行版中，你需要在你的 Linux 系统中启用 [epel 仓库](/article-2324-1.html)，在 Yum 命令行的帮助下安装 SSHFS 及其依赖。

```
# yum install sshfs
# dnf install sshfs              【在 Fedora 22+ 发行版上】
$ sudo apt-get install sshfs     【基于 Debian/Ubuntu 的系统】

```

#### 步骤 2：创建 SSHFS 挂载目录

当你安装 SSHFS 包之后，你需要创建一个挂载点目录，在这儿你将要挂载你的远程文件系统。例如，我们在 /mnt/tecmint 下创建挂载目录。

```
# mkdir /mnt/tecmint
$ sudo mkdir /mnt/tecmint     【基于 Debian/Ubuntu 的系统】

```

#### 步骤 3：使用 SSHFS 挂载远程的文件系统

当你已经创建你的挂载点目录之后，现在使用 root 用户运行下面的命令行，在 /mnt/tecmint 目录下挂载远程的文件系统。视你的情况挂载目录可以是任何目录。

下面的命令行将会在本地的 /mnt/tecmint 目录下挂载一个叫远程的一个 /home/tecmint 目录。（不要忘了使用你的 IP 地址和挂载点替换 x.x.x.x）。

```
# sshfs tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint
$ sudo sshfs -o allow_other tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint      【基于 Debian/Ubuntu 的系统】

```

如果你的 Linux 服务器配置为基于 SSH 密钥授权，那么你将需要使用如下所示的命令行指定你的公共密钥的路径。

```
# sshfs -o IdentityFile=~/.ssh/id_rsa tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint
$ sudo sshfs -o allow_other,IdentityFile=~/.ssh/id_rsa tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint     【基于 Debian/Ubuntu 的系统】

```

#### 步骤 4：验证远程的文件系统挂载成功

如果你已经成功的运行了上面的命令并且没有任何错误，你将会看到挂载在 /mnt/tecmint 目录下的远程的文件和目录的列表

```
# cd /mnt/tecmint
# ls
[root@ tecmint]# ls
12345.jpg                       ffmpeg-php-0.6.0.tbz2                Linux                                           news-closeup.xsl     s3.jpg
cmslogs                         gmd-latest.sql.tar.bz2               Malware                                         newsletter1.html     sshdallow
epel-release-6-5.noarch.rpm     json-1.2.1                           movies_list.php                                 pollbeta.sql
ffmpeg-php-0.6.0                json-1.2.1.tgz                       my_next_artical_v2.php                          pollbeta.tar.bz2

```

#### 步骤 5：使用 df -hT 命令检查挂载点

如果你运行 df -hT命令，你将会看到远程文件系统的挂载点。

```
# df -hT

```

样本输出：

```
Filesystem                          Type        Size  Used Avail Use% Mounted on
udev                                devtmpfs    730M     0  730M   0% /dev
tmpfs                               tmpfs       150M  4.9M  145M   4% /run
/dev/sda1                           ext4         31G  5.5G   24G  19% /
tmpfs                               tmpfs       749M  216K  748M   1% /dev/shm
tmpfs                               tmpfs       5.0M  4.0K  5.0M   1% /run/lock
tmpfs                               tmpfs       749M     0  749M   0% /sys/fs/cgroup
tmpfs                               tmpfs       150M   44K  150M   1% /run/user/1000
tecmint@192.168.0.102:/home/tecmint fuse.sshfs  324G   55G  253G  18% /mnt/tecmint

```

#### 步骤 6：永久挂载远程文件系统

为了永久的挂载远程的文件系统，你需要修改一个叫 `/etc/fstab` 的文件。照着做，使用你最喜欢的编辑器打开文件。

```
# vi /etc/fstab
$ sudo vi /etc/fstab     【基于 Debian/Ubuntu 的系统】

```

移动到文件的底部并且添加下面的一行，保存文件并退出。下面条目表示使用默认的设置挂载远程的文件系统。

```
sshfs#tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint fuse.sshfs defaults 0 0

```

确保服务器之间允许 [SSH 无密码登录](/article-5444-1.html)，这样系统重启之后才能自动挂载文件系统。

如果你的服务器配置为基于 SSH 密钥的认证方式，请加入如下行：

```
sshfs#tecmint@x.x.x.x:/home/tecmint/ /mnt/tecmint fuse.sshfs IdentityFile=~/.ssh/id_rsa defaults 0 0

```

接下来，你需要更新 fstab 文件使修改生效。

```
# mount -a
$ sudo mount -a   【基于 Debian/Ubuntu 的系统】

```

#### 步骤 7：卸载远程的文件系统

为了卸载远程的文件系统，只需要发出以下的命令即可。

```
# umount /mnt/tecmint

```

目前为止就这样了，如果你在挂载远程文件系统的时候遇到任何问题或者需要任何帮助，请通过评论联系我们，如果你感觉这篇文章非常有用，请分享给你的朋友们。

---

via: <http://www.tecmint.com/sshfs-mount-remote-linux-filesystem-directory-using-ssh/>

作者：[Ravi Saive](http://www.tecmint.com/author/admin/) 译者：[yangmingming](https://github.com/yangmingming) 校对：[wxy](https://github.com/wxy)

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


在电脑和安卓设备之间使用 FTP 传输文件

Summary: 每一个使用安卓设备的人都知道可以使用 USB 线连接电脑来传输文件，但是不是所有人都知道可以使用自由开源软件（FOSS 软件）通过无线连接到安卓设备。

MIUI自带FTP服务

FTP sever我用Andro File Server（幾百KB size，迷你小巧，支持FTP和SSH，貌似已在Google Play Store下架？），FTP client我用nautilus

好麻烦，有数据线就够了啊，或者安装个邮箱就完了

这个现在就是这样使用，不过软件不是用这样的。。。。。

es文件管理器 打开远程服务 自己就建立了一个ftp了，然后你在linux桌面的文件管理器里面输入ft://xxxx（手机上那个网址）就可以了……<br />
话说一般传文件要么用telegram/pushbullet，要么用蓝牙（小文件） 方便啊……

![](/data/attachment/album/201610/12/220442i610th12tg6v0tnl.jpg)

每一个使用安卓设备的人都知道可以[使用 USB 线连接电脑来传输文件](https://itsfoss.com/how-to-connect-kindle-fire-hd-with-ubuntu-12-10/)，但是不是所有人都知道可以使用自由开源软件（FOSS 软件）通过无线连接到安卓设备。

我知道，这并非最简易的方式，但这样做的确很有趣而且感觉很极客。所有，如果你有一些 DIY 精神，让我为你展示如何在 Linux 和 安卓设备之间使用 FTP 来传输文件。

### 第一步：安装必要的软件

为了连接你的安卓设备，至少需要：一个 FTP 服务器和一个 FTP 客户端。这两者都有不少的选择，个人比较推荐 [Filezilla](https://filezilla-project.org/) 作为客户端，因为它是开源的，而且支持多种平台。

我最喜欢的 FOSS 安卓应用商店就是 [F-Droid](https://f-droid.org/)。F-Droid 有两个非常棒的 FTP 服务端应用：[primitive ftpd](https://f-droid.org/repository/browse/?fdfilter=ftp&fdid=org.primftpd) 和 [FTP Server (Free)](https://f-droid.org/repository/browse/?fdfilter=ftp&fdid=be.ppareit.swiftp_free)。这两者都只能运行在安卓 4.0 或者更高的版本中。本文我会集中介绍 primitive ftpd，如果使用 FTP Sever (free) 也是一样的步骤。

### 第二步：熟悉 FTP 服务器

安装好 FTP 客户端和服务端之后，就是设置两者之间的连接了。先从安卓设备的 FTP 服务端开始，首先，通过应用启动器打开 primitive ftpd。

![](/data/attachment/album/201610/12/220601zbqp3939fvg3vfvy.png)

打开应用之后，你将看到一大串的数字。不用紧张，你可以看到服务端已经分配到一个 IP 地址 (本文是 192.168.1.131)。往下看，将看到 FTP 和 SFTP 服务 (SFTP 是一个截然不同的协议，它通过 SSH 进行连接) 都是还未运行的。再往下就是用户名，本文设置为 user。

在屏幕顶端有两个按钮，一个用于开启 FTP 服务，另一个则是设置 FTP 服务。启动服务是不言自明的。

![](/data/attachment/album/201610/12/220648gjt8pcacppo4hpz2.png)

在设置菜单中，可以改变服务器的用户名、访问密码以及所使用的端口。并且你可以设置当服务器激活是阻止待机、服务开机自启或者变更主题。

![](/data/attachment/album/201610/12/220813e3m30h4pp10p0fez.png)

![](/data/attachment/album/201610/12/220836q4xyrx7rcu437wz7.png)

![](/data/attachment/album/201610/12/220948xo4rwyb49r448go2.png)

### 第三步：使用 Filezilla

现在打开对应你所用系统的 Filezilla。使用 Filezilla 有两种方法：在需要传输文件时输入 IP、用户名、密码和端口，或者在 Filezilla 中预先保存这些信息（值得注意的是：基本上，每次你打开 FTP 服务时，IP 都会不同的，所用需要更新保存在 Filezilla 中信息）。我会展示这两种方法。

如果你想要手动输入，直接在 Filezilla 窗口上方输入必要的信息然后点击“快速连接”即可。

![](/data/attachment/album/201610/12/221013nuwujiff710hazz5.png)

需要预先存储信息的话，点击文件菜单下方的按钮，这会打开“站点管理器”对话框，填写你想要保存的信息即可。通常，我设置“登录类型”为“询问密码”，安全为上。如果使用的是 FTP，保存默认选项即可；但如果使用的是 SFTP，必须在协议下拉选项框中进行协议的选择。

![](/data/attachment/album/201610/12/221030pfgjfuyfagniayiu.png)

点击连接，输入密码即可。你会看到一个连接新主机的警告，这是可以在此验证屏幕上显示的“指纹信息”是否与 Primitive FTPD 上的一致。如果一致 (也应该是一致的)，点击确认添加都已知主机列表，之后就不会出现该警告了。

![](/data/attachment/album/201610/12/221050m8zrrfpopjzpbvj5.png)

### 第四步：传输文件

现在，你会看到两个框，一个是“本地站点”，一个是“远程站点”，对应的呈现了你电脑和安装设备上的目录和文件信息。然后你就可以在电脑端浏览和传输文件到你的安卓设备上了。个人建议上传文件到你的 Download 文件夹，以便于文件跟踪管理。你可以右击某个文件，在弹出的菜单中选择上传或者下载以及移动操作，或者简单双击也行。

![](/data/attachment/album/201610/12/221116lwkbwppsixskfyzy.png)

### 第五步：停止服务

当你完成文件的传输之后，你需要做得就是停止安卓设备上的 FTP 服务和关闭 Filezilla，如此简单，不是吗？

### 结论

我相信会有人指出，FTP 并不安全。而我认为，本例不需要考虑这个问题，因为连接时间一般很短。并且多数情况下，都是在家庭私有网络环境中进行操作。

这就是我在 Linux 和安卓设备间最喜欢使用的方法。

觉得有用吗？或有又没觉得推荐的相似软件？请在评论中告诉我们。

如果觉得此文有用，请花几分钟分享到你常用的社交站点中。

---

via: <https://itsfoss.com/use-ftp-linux-android/>

作者：[John Paul](https://itsfoss.com/author/john/) 译者：[GHLandy](https://github.com/GHLandy) 校对：[wxy](https://github.com/wxy)

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


Windows 的 Linux 子系统之 Arch Linux

使用Linux的原因很大程度是因为windows无法满足需要才用了，这么弄有点无语了

linux兼容，是因为要用到一些linux bash下的命令，但这样感觉没有必要。很多时候真想装linux，不如弄一个虚拟机。

而bash命令行也有mysys和cygwin可以用。

真的感觉这么做有点多余

来自江苏南京的 Internet Explorer 11.0|Windows 7 用户

优势是原生。不是所有包都有对应的正对 Windows 重编译版。有这个子系统，已有包可以直接拿来用，方便。

我感觉这不是个好的想法和项目，它会造成Windows更大范围的垄断。

相反，继续发展Wine，弄个Widows on Linux，1024MB内存、5GB硬盘就可以运行Windows，那就可以不用完整安装Windows了。

发这种评论时，建议还是注意下细节。不然以评论的内容，结合显示出的 user-agent 看，会有些怪。

“就可以运行Windows”笔误了，应是程序，wine 的功能本来就是这个。但是限制是有的，一有系统 Windows 本身的复杂度，还有 Windows 应用自身的限制，比如拒绝以 wine 方式运行。还有现在微软主推 Windows 10 Store+UWP 方式，单单一个 wine 不好弄，因为 Store 这块不好模拟，既有技术上的限制，也有法律上的限制。

linux 吧很早前就有人这么做了

我不要这个，我要的是linux能完美兼容windows应用，不用windows就是嫌其慢，这样搞，我～～～

好消息，必须支持，一直都在用archlinux

微软做的不赖，在linux桌面的菊花上来一枪。以后给新手推荐linux桌面，除了推荐win10其它都特么害人！终于可以宣布“Linux占领了桌面系统”，biangbiang哒！希望win10永久终结其它linux桌面，说真的我已经受够他们了。

哈哈

没有深度探索wsl运行机制，稳定性。只能算是推广文，或神话文

来自广东广州的 Chrome Mobile 49.0|Android 6.0 用户

0.6版本在哪里呢，没有看到可以使用的版本下载呦

来自浙江杭州的 Chrome Mobile 45.0|Android 5.1 用户

我怎么觉得是Linux已经攻入windows内部，windows离终结不远了

好像是这个https://github.com/turbo/alwsl/releases

额...这个改进能吸引到多少用户呢？在那个自动升级机制以及不能卸载的 Xbox 等等问题存在的情况下。

萝卜白菜各有所爱

挺期待的,arch

![](/data/attachment/album/201610/12/224452hxxh8zhc4w449cm7.jpg)

Ubuntu 的制造商 [Canonical](http://www.canonical.com/) 早已和微软进行合作，让我们体验了极具争议的 [Bash on Windows](https://itsfoss.com/bash-on-windows/)。外界对此也是褒贬不一，许多 Linux 重度用户则是质疑其是否有用，以及更进一步认为 [Bash on Windows 是一个安全隐患](https://itsfoss.com/linux-bash-windows-security/)。

Unix 的 Bash 是通过 WSL (<ruby> Windows 的 Linux 子系统 <rp>  （ </rp> <rt>  Windows Subsystem for Linux </rt> <rp>  ） </rp></ruby>) 特性移植到了 Windows 中。早先，我们已经展示过 [安装 Bash 到 Windows](/article-7209-1.html)。

Canonical 和微软合作的 Bash on Windows 也仅仅是 Ubuntu 的命令行而已，并非是正规的图形用户界面。

不过，有个好现象是 Linux 爱好者开始在上面投入时间和精力，他们在 WSL 做到的成绩甚至让最初的开发者都吃惊，“等等，这真的可以吗？”。

这个正在逐步实现之中。

![](/data/attachment/album/201610/12/224512xok8kpkpw7qn48nc.jpg)

没错，上图所示就是运行在 Windows 中的 Ubuntu Unity 桌面。一位名为 Pablo Gonzalez （GitHub ID 为 [Guerra24](https://github.com/Guerra24) ）的程序员将这个完美实现了。随着这个实现，他向我们展示了 WSL 已经超越了当初构想之时的功能。

如果现在可以在 Windows 子系统之中运行 Ubuntu Unity，那么运行其他的 Linux 发行版还会远吗？

### Arch Linux 版的 Bash on Windows

在 WSL 本地运行完整的 Linux发行版，迟早是要实现的。而我最希望的就是 [Arch Linux](https://www.archlinux.org/) （[Antergos](https://itsfoss.com/tag/antergos/) 爱好者点击此处）。

![](/data/attachment/album/201610/12/224533q6pmprpm79398f3s.jpg)

Hold 住，Hold 住，该项目目前还在测试中。它由“mintxomat”在 GitHub 上开发的，最新为 0.6 版本。第一个稳定版将在今年的 12 月底发布。

那么，该项目的出台会有什么不同呢？

你可能早就知道，WSL 仅在 Windows 10 中可用。但是 Windows 的 Linux 子系统之 Arch Linux (AWSL) 早已成功的运行在 Windows 7、Windows 8、Windows 8.1 和 Windows Server 2012(R2)，当然还有 Windows 10。

我靠，他们是怎么做到的？！

其开发者曾说，AWSL 协议抽象归纳了不同 Windows 版本的各种框架。所以，当 AWSL 发布 1.0 应该会取得更大的成绩。如我们之前提到的移植性，该项目会先向所有 Windows 版本推出 Bash on Windows。

该项目很有雄心，并且很有看头。如果等不及 12 月底的稳定版，你可以先行尝试其测试版。但要记住，目前还是开发者预览版，此刻并不稳定。但是，我们什么时候停止过折腾的脚步？

你也可到 GitHub 查看此项目的进度：[Arch on Windows Subsystem](https://github.com/turbo/alwsl)

分享本文，以便大家都知道 Arch Linux 即将登陆 Windows 子系统。同时，也告诉我们，你希望 WSL 中有什么发行版。

---

via: <https://itsfoss.com/arch-linux-windows-subsystem/>

作者：[Aquil Roshan][a] 译者：[GHLandy](https://github.com/GHLandy) 校对：[wxy](https://github.com/wxy)

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


全平台最佳密码管理工具大全：支持 Windows、Linux、Mac、Android、iOS 以及企业应用

Summary: 密码是你抵御网络威胁的最后一道防线。虽然你不能控制数据泄露，但创建强壮的、可以抵御字典和暴力破解的密码仍然是重要的。

一直在用keepass,相信这种离线软件有更高的安全性

![](/data/attachment/album/201610/13/110753wzam9jju477ulhat.png)

当谈到网络安全的防护时，从各种网络威胁的角度来看，仅安装一个防病毒软件或运行一个[安全的 Linux 操作系统](http://thehackernews.com/2016/03/subgraph-secure-operating-system.html)，并不意味你就是足够安全的。

今天大多数网络用户都容易受到网络攻击，并不是因为他们没有使用最好的防病毒软件或其他安全措施，而是因为他们使用了[弱密码](http://thehackernews.com/2016/01/password-security-manager.html)来保护他们自己的网上帐号。

密码是你抵御网络威胁的最后一道防线。只要回顾一下最近的一些数据泄露和网络攻击，包括大众关注的 [OPM（美国联邦人事管理局）](http://thehackernews.com/2015/09/opm-hack-fingerprint.html)和婚外情网站 [Ashley Madison](http://thehackernews.com/2015/08/ashley-madison-accounts-leaked-online.html) 的数据泄露，都导致成千上万的记录的网上曝光。

虽然你不能控制数据泄露，但创建强壮的、可以抵御字典和[暴力破解](http://thehackernews.com/2013/05/cracking-16-character-strong-passwords.html)的密码仍然是重要的。

你知道，你的密码越长，它越难破解。

### 如何保证在线服务的安全？

安全研究人员喋喋不休地劝说在线用户为他们的各种网上账户创建长的、复杂和各异的密码。这样，如果一个网站被攻破，你在其他网站上的帐户是安全的，不会被黑客攻击。

理想的情况下，你的密码必须至少16个字符长，应该包含数字、符号、大写字母和小写字母，而最重要的是，甚至你都不知道的密码才是最安全的密码。

密码应该不重复，而且不包含任何字典中的词汇、代词，你的用户名或 ID 号，以及任何其它预定义的字母或数字序列。

我知道记住这样的复杂的密码字符串是一个实在痛苦的过程，除非我们是一个人型超级计算机，为不同的在线账户记住不同的密码并不是一个轻松的任务。

问题是，现在人们注册了大量的在线网站和服务，为每一个帐户创建和记住不同的密码通常是很难的。

不过，幸运的是，我们可以让这个事情变得很轻松，不断涌现的面向桌面计算机和智能电话的口令管理器可以显著地降低你密码记忆难度，从而治愈你设置弱密码的坏毛病。

### 密码管理器是什么？

![](/data/attachment/album/201610/13/111345ti66eyx6fgp2pqqx.jpg)

在过去的几年里，密码管理软件已经取得了长足的进展，它是一个很好的系统，不但可以让你为不同的网站创建复杂的密码，而且能让你记住它们。

密码管理器是一个为你的个人电脑、网站，应用程序和网络创建、存储和整理密码的软件。

密码管理器可以生成密码，也可以作为表单填充器，它可以自动在网站的登录表单中输入你的用户名和密码。

所以，如果你想为你的多个在线帐户设置超级安全的密码，但你又不想全部记住它们，密码管理器是你最好的选择。

### 密码管理器如何工作？

通常，密码管理器可以为您生成冗长、复杂，而且更重要的是唯一的密码字符串，然后以加密形式存储它们，以保护该机密数据免受黑客对您的 PC 或移动设备的物理访问。

加密的文件只能通过“主密码”访问。因此，所有你需要做的只是记住一个“主密码”，用来打开你的密码管理器或保险库，从而解锁你所有的其他密码。

然而，你需要确保你的主密码是超级安全的，至少 16 个字符。

### 哪个是最好的密码管理器？如何选择？

我一直在推荐密码管理器，但大多数读者总是问：

* 哪个密码管理器最好？
* 哪个密码管理器最安全？帮帮我！

所以，今天我要介绍给你一些最好的密码管理器，它们可在 Windows、Mac、Linux、Android、iOS 和企业中使用。

在为你的设备选择一个好的密码管理器之前，你应该检查以下功能：

* 跨平台应用
* 零知识模型
* 提供双因素认证（或者多因素身份验证）

注意：一旦采用，就要按照密码管理器的方式来用，因为如果你仍然为你的重要在线帐户使用弱密码的话，没有人可以从恶意黑客那里拯救你。

### Windows 最佳密码管理工具

![](/data/attachment/album/201610/13/110900yoaplp2gh4g7l4al.png)

Windows 用户最容易受到网络攻击，因为 Windows 操作系统一直是黑客最喜欢的目标。所以，对于 Windows 用户来说，使用一个好的密码管理器是重要的。

除了下述以外，Windows 其它的密码管理器还有：Password Safe、LockCrypt、1Password。

#### 1. Keeper 密码管理器（跨平台）

![](/data/attachment/album/201610/13/110922mrwcm0vr11zjvfsm.png)

Keeper 是一个安全、易用而稳健的密码管理器，支持 Windows、Mac、iPhone、iPad 和 iPod 设备。

通过使用军事级 256 位 AES 加密技术，Keeper 密码管理器可以让您的数据安全在窥探之下保持安全。

它的安全的数字保险柜，用于保护和管理您的密码，以及其他秘密信息。Keeper 密码管理器应用程序支持双因素身份验证，可用于各大主流操作系统。

它还有一个称为“自毁”的重要的安全功能，启用后，如果不正确的错误地输入主密码达五次以上，它将删除设备中的所有记录！

但您不必担心，因为此操作不会删除存储在 Keeper 上的云安全保险柜上的备份记录。

下载 Keeper 密码管理器: [Windows、Linux 和 Mac](https://keepersecurity.com/download.html) | [iOS](https://itunes.apple.com/us/app/keeper-password-manager-digital/id287170072?mt=8) | [Android](https://play.google.com/store/apps/details?id=com.callpod.android_apps.keeper) | [Kindle](http://www.amazon.com/gp/mas/dl/android?p=com.callpod.android_apps.keeper)

#### 2. Dashlane 密码管理器（跨平台）

![](/data/attachment/album/201610/13/111529kdzbub3v76u5nthc.jpg)

DashLane 密码管理器有点新，但它几乎为每个平台提供了极棒的功能。

DashLane 密码管理器通过在本地计算机上使用 AES-256 加密技术来加密您的个人信息和帐户密码，然后将其同步到其在线服务器，以便您可以从任何地方访问您的帐户数据库。

DashLane 最好的一点是它有一个自动密码更改器，可以自动更改您的帐户的密码，而不必自己处理。

DashLane 密码管理器 Android 版为您的 Android 手机提供了安全的密码管理工具：密码保险库和在线商店及其他网站的表单自动填充器。

Android 的 DashLane 密码管理器在单个设备上使用完全免费，如要在多个设备上访问，您可以购买该应用的收费的高级版本。

下载 DashLane 密码管理器: [Windows](https://www.dashlane.com/download) 和 [Mac](https://www.dashlane.com/passwordmanager/mac-password-manager) | [iOS](https://itunes.apple.com/in/app/dashlane-free-secure-password/id517914548?mt=8) | [Android](https://play.google.com/store/apps/details?id=com.dashlane&hl=en)

#### 3. LastPass 密码管理器（跨平台）

![](/data/attachment/album/201610/13/111011ygjr6t2rcngcggg3.png)

LastPass 是 Windows 用户最好的密码管理器之一，它可以通过扩展插件、移动应用程序，甚至桌面应用程序支持所有的浏览器和操作系统。

LastPass 是一个非常强大的基于云的密码管理器软件，它使用 AES-256 加密技术来加密您的个人信息和帐户密码，甚至提供各种双因素身份验证选项，以确保没有其他人可以登录您的密码保险柜中。

LastPass 密码管理器是免费的，收费的高级版本支持指纹读取器。

下载 LastPass 密码管理器: [Windows、Mac 和 Linux](https://lastpass.com/misc_download2.php) | [iOS](https://itunes.apple.com/us/app/lastpass-for-premium-customers/id324613447?mt=8&ign-mpt=uo%3D4) | [Android](https://play.google.com/store/apps/details?id=com.lastpass.lpandroid)

### Mac OS X 最佳密码管理器

![](/data/attachment/album/201610/13/111130gijwgltir9xgrmxj.jpg)

人们经常说，Mac 电脑比 Windows 更安全，“Mac 没有病毒”，但它是不完全正确的。

作为证据，你可以阅读我们以前的关于对 Mac 和 iOS 用户进行网络攻击的文章，然后自己决定需要不需要一个密码管理器。

除了下述以外，Mac OS X 其它的密码管理器还有：1Password，Dashlane，LastPass，OneSafe，PwSafe。

#### 1. LogMeOnce 密码管理器（跨平台）

![](/data/attachment/album/201610/13/111219qmfpmpmoepolf9bh.jpg)

LogMeOnce 密码管理套件是 Mac OS X 上的最佳密码管理器之一，并且可以在 Windows，iOS 和 Android 设备上同步您的密码。

LogMeOnce 是最好的收费的企业密码管理软件之一，提供各种功能和选项，包括 Mugshot（嫌犯照片）功能。

如果您的手机被盗，LogMeOnce Mugshot 功能可以跟踪小偷的位置，并秘密拍摄试图在未经许可访问您的帐户的入侵者的照片。

LogmeOnce 使用军用级 AES-256 加密技术保护您的密码，并提供双因素身份验证，以确保即使掌握了主密码，窃贼也无法窃取您的帐户。

下载 LogMeOnce 密码管理器: [Windows and Mac](https://www.logmeonce.com/download/) | [iOS](https://itunes.apple.com/us/app/logmeonce-free-password-manager/id972000703?ls=1&mt=8) | [Android](https://play.google.com/store/apps/details?id=log.me.once)

#### 2. KeePass 密码管理器（跨平台）

![](/data/attachment/album/201610/13/111651kyfhe8n4hvl5yhqf.jpg)

虽然 LastPass 是最好的密码管理器之一，有些人不喜欢基于云的密码管理器。

KeePass 是一个流行的 Windows 密码管理器应用程序，但也有浏览器扩展和 KeePass 的移动应用程序。

用于 Windows 的 KeePass 密码管理器将您的帐户密码存储在您的 PC 上，因此您仍然可以控制它们，也可以放在 Dropbox 上，因此您可以使用多个设备访问它。

KeePass 使用当前已知的最安全的加密技术加密您的密码和登录信息：默认情况下为 AES 256 位加密，或可选地用 Twofish 256 位加密技术。

KeePass 不仅仅是免费的，它也是开源的，这意味着它的代码和完整性可以被任何人检查，从而赢得了更多的信任度。

下载 KeePass 密码管理器: [Windows 和 Linux](http://keepass.info/download.html) | [Mac](https://itunes.apple.com/us/app/kypass-companion/id555293879?ls=1&mt=12) | [iOS](https://itunes.apple.com/de/app/ikeepass/id299697688?mt=8) | [Android](https://play.google.com/store/apps/details?id=keepass2android.keepass2android)

#### 3. 苹果 iCloud 钥匙串

![](/data/attachment/album/201610/13/111756k2l0qy3mle23yp3d.jpg)

苹果推出了 iCloud 钥匙串密码管理系统，提供了一种方便的、可以在您获准的 Apple 设备（包括 Mac OS X、iPhone 和 iPad）上安全地存储和自动同步所有登录凭据、Wi-Fi 密码和信用卡号码的方式。

您的钥匙串中的密码数据使用 256 位 AES 加密技术进行加密，并使用椭圆曲线非对称加密和密钥封装。

此外，iCloud 钥匙串还会生成新的、独特的和强大的密码，用于保护您的计算机和帐户。

主要限制：钥匙串不能与 Apple Safari 之外的其他浏览器一起使用。

参阅：[如何设置 iCloud 钥匙串？](https://support.apple.com/en-in/HT204085)

### Linux 最佳密码管理器

![](/data/attachment/album/201610/13/111829qhchbsob9z9nhpu9.png)

毫无疑问，一些 Linux 发行版是地球上最安全的操作系统，但正如我上面所说，采用 Linux 不能完全保护您的在线帐户免受黑客攻击。

有许多跨平台密码管理器可用于在所有设备上同步所有帐户的密码，例如 LastPass、KeePass、RoboForm 密码管理器。

下面我列出了两个 Linux 上流行和安全的开源密码管理器：

#### 1. SpiderOak 加密密码管理器（跨平台）

![](/data/attachment/album/201610/13/111902oed0llujp03mmlj6.jpg)

爱德华·斯诺登推荐的由 SpiderOak 开发的 Encryptr 密码管理器是一个零知识的基于云的密码管理器，使用 Crypton JavaScript 框架加密保护您的密码。

它是一个跨平台、开源和免费的密码管理器，使用端到端加密，可以完美地工作于 Ubuntu、Debian Linux Mint 和其它 Linux 发行版。

Encryptr 密码管理器应用程序本身非常简单，带有一些基本功能。

Encryptr 软件允许您加密三种类型的内容：密码、信用卡号码和常规的键值对。

下载 Encryptr 密码管理器: [Windows、Linux 和 Mac](https://spideroak.com/opendownload) | [iOS](https://itunes.apple.com/us/app/spideroak/id360584371?mt=8) | [Android](https://play.google.com/store/apps/details?id=com.spideroak.android)

#### 2. EnPass 密码管理器（跨平台）

![](/data/attachment/album/201610/13/111933zhkb4114ebkdeeh3.jpg)

Enpass 是一个优秀的安全导向的 Linux 密码管理器，在其它平台也能很好地工作。

Enpass 可让您使用第三方云服务（包括 Google 云端硬盘、Dropbox、OneDrive 或 OwnCloud）备份和恢复存储的密码。

它确保提供高级别的安全性，并通过主密码保护您的数据，在将备份上传到云上之前，使用开源加密引擎 SQLCipher 的 256 位 AES 加密技术进行加密。

>
> “我们不会在我们的服务器上托管您的 Enpass 数据，因此，我们不需要注册，您的数据只存储在您的设备上，”Enpass 说。
>
>
>

此外，默认情况下，当您离开计算机时，Enpass 会锁定自己，并且每隔 30 秒清除剪贴板内存，以防止您的密码被任何其他恶意软件窃取。

下载 EnPass 密码管理器： [Windows](https://www.enpass.io/download-enpass-for-windows/)、[Linux](https://www.enpass.io/download-enpass-linux/) | [Mac](https://itunes.apple.com/app/enpass-password-manager-best/id732710998?mt=12) | [iOS](https://itunes.apple.com/us/app/enpass-password-manager/id455566716?mt=8) | [Android](https://play.google.com/store/apps/details?id=io.enpass.app&hl=en)

#### 3. RoboForm 密码管理器（跨平台）

![](/data/attachment/album/201610/13/112007voll86hfm6838bo8.jpg)

你可以很容易地在 Windows 操作系统上找到好的密码管理器，但 RoboForm 免费密码管理器软件不止于此。

除了创建复杂的密码并记住它们，RoboForm 还提供了一个智能表单填充功能，以节省您在浏览网络的时间。

RoboForm 使用军用级 AES 加密技术来加密您的登录信息和帐户密码，密钥是通过您的 RoboForm 主密码获得的。

RoboForm 适用于 IE、Chrome 和 Firefox 等浏览器，以及适用于 iOS、Android 和 Windows Phone 等移动平台。

下载 RoboForm 密码管理器: [Windows 和 Mac](http://www.roboform.com/download) | [Linux](http://www.roboform.com/for-linux) | [iOS](https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=331787573&mt=8) | [Android](https://play.google.com/store/apps/details?id=com.siber.roboform)

### Android 最佳密码管理器

![](/data/attachment/album/201610/13/112032omdfxtabaqss9ox9.jpg)

目前全球有超过一半的人使用 Android 设备，因此 Android 用户保护他们的在线帐户、避免黑客总是试图访问这些设备成为一种必要。

Android 上一些最好的密码管理器应用程序包括 1Password、Keeper、DashLane、EnPass、OneSafe、mSecure 和 SplashID Safe。

#### 1. 1Password 密码管理器（跨平台）

![](/data/attachment/album/201610/13/112100jlxwlw81wolpgwwx.jpg)

1Password 密码管理器 Anroid 版是管理你的所有账户密码的最佳应用程序之一。

1Password 密码管理器为每个帐号创建强大、独特和安全的密码，并为你全部记住，你只需要轻轻一点即可登录。

1Password 密码管理器软件通过 AES-256 加密技术保护您的登录名和密码，并通过您的 Dropbox 帐户将其同步到所有设备，或者存储在本地，你可以用任何其他应用程序来进行同步。

最近，Android 版本的 1Password 密码管理器应用程序了添加指纹支持来解锁所有的密码，而不是使用您的主密码。

下载 1Password 密码管理器: [Windows 和 Mac](https://1password.com/downloads/) | [iOS](https://itunes.apple.com/in/app/1password-password-manager/id568903335?mt=8) | [Android](https://play.google.com/store/apps/details?id=com.agilebits.onepassword&hl=en)

#### 2. mSecure密码管理器（跨平台）

![](/data/attachment/album/201610/13/112129mnfexrqn70eezqsf.jpg)

就像其他流行的密码管理器解决方案，Android 下的 mSecure 密码管理器自动生成安全密码，并使用 256 位Blowfish 加密技术存储它们。

令人印象深刻的独特功能是 mSecure 密码管理器软件提供了在输入 5、10 或 20 次错误的密码后（根据您的设置）自毁数据库的功能。

您还可以使用 Dropbox 或通过专用 Wi-Fi 网络同步所有设备。不管什么情况下，无论您的云帐户的安全性如何，您的所有数据都会在设备之间安全而加密地传输。

下载 mSecure 密码管理软件: [Windows 和 Mac](https://www.msecure.com/desktop-app/) | [iOS](https://itunes.apple.com/in/app/msecure-password-manager/id292411902?mt=8) | [Android](https://play.google.com/store/apps/details?id=com.mseven.msecure&hl=en)

### iOS 最佳密码管理器

![](/data/attachment/album/201610/13/112156p49q08zq60251572.png)

正如我所说，苹果的 iOS 也很容易发生网络攻击，所以你可以使用一些 iOS 下最好的密码管理器应用程序来保护你的在线帐户，它们包括 Keeper、OneSafe、Enpass、mSecure、LastPass、RoboForm、SplashID Safe 和 LoginBox Pro 。

#### 1. OneSafe 密码管理器（跨平台）

![](/data/attachment/album/201610/13/112224vsq7czuczsemubsa.jpg)

OneSafe 是 iOS 设备最好的密码管理器应用程序之一，它不仅可以存储您的帐户密码，还可以存储敏感文档、信用卡详细信息、照片等。

iOS 的 OneSafe 密码管理器应用程序使用 AES-256 加密技术（移动设备上可用的最高级别）和 Touch ID 将您的数据用主密码加密。 你还可以为给定文件夹设置附加密码。

iOS 的 OneSafe 密码管理器还提供了一个支持自动填充登录的应用内浏览器，因此您无需每次都输入登录详细信息。

除此之外，OneSafe 还为您的帐户的密码提供了高级安全功能，如自动锁定、入侵检测、自毁模式、诱饵安全和双重保护。

下载 OneSafe 密码管理器：[iOS](https://itunes.apple.com/us/app/onesafe/id455190486?ls=1&mt=8) | [Mac](https://itunes.apple.com/us/app/onesafe-secure-password-manager/id595543758?ls=1&mt=12) | [Android](https://play.google.com/store/apps/details?id=com.lunabee.onesafe) | [Windows](https://www.microsoft.com/en-us/store/apps/onesafe/9wzdncrddtx9)

#### 2. SplashID 安全密码管理器（跨平台）

![](/data/attachment/album/201610/13/112256n00ub8m0pprpbe00.jpg)

SplashID Safe 是 iOS 中最古老、最好的密码管理工具之一，它允许用户将其登录数据和其他敏感信息安全地存储在加密记录中。

您的所有信息，包括网站登录信息、信用卡和社会保障数据、照片和文件附件，都受到 256 位的加密保护。

用于 iOS 的 SplashID Safe 密码管理器还提供了网络自动填充选项，这意味着您不必在登录时复制粘贴密码。

免费版本的 SplashID Safe 具有基本的记录存储功能，但您可以选择收费版本，提供跨设备同步以及其它收费功能。

下载 SplashID 安全密码管理器：[Windows 和 Mac](https://splashid.com/downloads.php) | [iOS](https://itunes.apple.com/app/splashid-safe-password-manager/id284334840?mt=8) | [Android](https://play.google.com/store/apps/details?id=com.splashidandroid&hl=en)

#### 3. LoginBox Pro 密码管理器

![](/data/attachment/album/201610/13/112358d88f08tt55t5ijqt.jpg)

LoginBox Pro 是另一个 iOS 设备上极棒的密码管理器应用程序。该应用程序提供了一个单击登录到你访问的任何网站的功能，使密码管理器应用程序成为登录密码保护的互联网网站的最安全和最快的方式。

iOS 的 LoginBox 密码管理器应用程序的把密码管理器和浏览器结合到一起。

从您下载那一刻起，所有登录操作（包括输入信息、点击按钮、复选框或回答安全提问）都会通过 LoginBox 密码管理器自动完成。

为了安全起见，LoginBox 密码管理器使用硬件加速的 AES 加密技术和密码来加密您的数据并将其保存在您的设备上。

下载 LoginBox 密码管理器：[iOS](https://itunes.apple.com/app/loginbox-pro/id579954762?mt=8) | [Android](https://play.google.com/store/apps/details?id=com.mygosoftware.android.loginbox)

### 最佳在线密码管理器

使用在线密码管理器工具是保护你的个人和私人信息安全，免于黑客和心怀恶意的人攻击的最简单方法。

在这里，我列出了一些最好的在线密码管理器，你可以依靠它们保持自己的线上安全：

#### 1. Google 在线密码管理器

![](/data/attachment/album/201610/13/112432v2rx830zt7l5rp2x.jpg)

你知道 Google 有自己的专用密码管理器吗？

Google Chrome 有一个内置的密码管理器工具，当你使用 Chrome 登录网站或网络服务时，你可以选择用它保存密码。

你所储存的所有帐户密码都会与你的 Google 帐户同步，方便你通过同一个 Google 帐户在所有装置上使用。

Chrome 密码管理器可让你通过网络管理你的所有帐户的密码。

因此，如果您喜欢使用其他浏览器，例如 Windows 10 上的 Microsoft Edge 或 iPhone 上的 Safari，只需访问[passwords.google.com](https://passwords.google.com/)，您就会看到一个列表，其中包含您保存在 Chrome 之中所有密码。Google 的双重身份验证会保护此列表。

#### 2. Clipperz 在线密码管理器

![](/data/attachment/album/201610/13/112457dc0687czb4ull7l7.jpg)

Clipperz 是一个免费的跨平台最佳在线密码管理器，不需要你下载任何软件。Clipperz 在线密码管理器使用书签栏或侧栏来直接登录。

Clipperz 还提供了其软件的密码管理器的离线版本，允许你将密码下载到一个[加密的磁盘](http://thehackernews.com/2014/01/Kali-linux-Self-Destruct-nuke-password.html)或 USB 盘里面，以便你在旅行时可以随身携带，并在离线时访问你的帐户密码。

Clipperz 在线密码管理器的一些功能还包括密码强度指示器、应用程序锁定、SSL 安全连接、一次性密码和密码生成器。

Clipperz 在线密码管理器可以在任何支持 JavaScript 的浏览器上工作。

#### 3. Passpack 在线密码管理器

![](/data/attachment/album/201610/13/112524t7sf1ck0pgqn7g18.jpg)

Passpack 是一个优秀的在线密码管理器，拥有一套极具竞争力的功能，可为你的不同在线帐户创建、存储和管理密码。

PassPack 在线密码管理器还允许你与你的家人或同事安全地共享你的密码，以轻松管理多个项目、团队成员、客户和员工。

你的各个帐户的用户名和密码使用 PassPack 服务器上的 AES-256 加密技术进行加密，即使黑客访问其服务器也无法读取你的登录信息。

将 PassPack 在线密码管理器工具栏下载到 Web 浏览器并正常浏览 Web。每当你登录任何受密码保护的网站时，PassPack 会保存你的登录数据，以便你不必在其网站上手动保存你的用户名和密码。

### 最佳企业密码管理器

在过去 12 个月的过程中，我们看到了互联网历史上最大的数据泄露，而且这种情况年复一年的增多。

据统计，大多数员工甚至不知道如何在线保护他们自己，这导致公司的业务处于风险之中。

为了在组织中保持密码共享机制安全，有一些专门为企业使用而设计的密码管理工具，例如 Vaultier、CommonKey、Meldium、PassWork 和 Zoho Vault。

#### 1. Meldium 企业密码管理软件

![](/data/attachment/album/201610/13/112554ar22fi4zcln4kulk.jpg)

LogMeIn 的 [Meldium 密码管理工具](https://www.meldium.com/)附带一个一键式单点登录解决方案，可帮助企业安全快速地访问网络应用。

它会自动将用户记录到应用和网站中，而无需输入用户名和密码，也可以跟踪组织内的密码使用情况。

Meldium 密码管理器非常适合在您的团队成员内共享帐户，而无需共享实际密码，这有助于组织保护自己免受网络钓鱼攻击。

#### 2. Zoho Vault 密码管理软件

![](/data/attachment/album/201610/13/112622yqd3hi3kqlt2t22h.png)

[Zoho Vault](https://www.zoho.com/vault/password-management-tools.html) 是企业用户最好的密码管理器之一，可帮助您的团队快速、安全地共享密码和其他敏感信息，同时监控每个用户的使用情况。

您所有的团队成员需要下载 Zoho 浏览器扩展。 Zoho Vault 密码管理器将自动填充您团队存储在共享保险柜中的密码。

Zoho Vault 还提供了一些功能，可让您监控团队的密码使用情况和安全级别，以便您可以知道谁在使用哪个登录。

Zoho Vault 企业级软件包甚至会在更改或访问密码时发出警告。

### 更多安全性，请使用双重身份验证

![](/data/attachment/album/201610/13/112649zxdmrb6gdzgrvz7t.png)

无论你的密码有多强大，黑客仍然有可能找到一些或其他方式侵入你的帐户。

双因素身份验证旨在解决这个问题。对一个密码取而代之的是，它要求你输入第二个口令，这会通过短信发送到你的手机上，或通过电子邮件发送到你的电子邮件地址上。

因此，我建议你启用[双因素身份验证](http://thehackernews.com/2016/07/two-factor-authentication.html)，并使用密码管理器软件来保护你的在线帐户和敏感信息免受黑客攻击。

---

via: <https://thehackernews.com/2016/07/best-password-manager.html>

作者：[Swati Khandelwal](https://thehackernews.com/2016/07/best-password-manager.html#author-info) 译者：[Bestony](https://github.com/Bestony) 校对：[wxy](https://github.com/wxy)

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


使用原子主机（Atomic Host）、Ansible 和 Cockpit 部署容器

Summary: 来自原子项目（Project Atomic）的原子主机（Atomic Host）是一个轻量级容器操作系统，可以以 Docker 格式运行 Linux 容器。它专门为提高效率而定制，使其成为用于云环境的 Docker 运行时系统的理想选择。

![](/data/attachment/album/201610/13/232927uyijz5xg4gx5hlf0.jpg)

我在[红帽](https://www.redhat.com/)工作的期间，每天在 [Fedora Atomic host](https://getfedora.org/en/cloud/download/atomic.html) 上使用 [Docker](https://www.docker.com/) 容器。 来自<ruby> <a href="http://www.projectatomic.io/">  原子项目 </a> <rp>  （ </rp> <rt>  Project Atomic </rt> <rp>  ） </rp></ruby>的<ruby> 原子主机 <rp>  （ </rp> <rt>  Atomic Host </rt> <rp>  ） </rp></ruby>是一个轻量级容器操作系统，可以以 Docker 格式运行 Linux 容器。它专门为提高效率而定制，使其成为用于云环境的 Docker 运行时系统的理想选择。

幸运的是，我发现一个很好的方式来管理在主机上运行的容器：[Cockpit](http://cockpit-project.org/)。 它是一个具有漂亮的 Web 界面的 GNU/Linux 服务器远程管理工具。它可以帮我管理在主机上运行的服务器和容器。你可以在从之前发布在这里的[这篇概述](https://fedoramagazine.org/cockpit-overview/)中了解 Cockpit 的更多信息。不过，我也希望在主机上可以自动运行容器，我可以使用 [Ansible](https://www.ansible.com/) 来完成这个工作。

请注意，我们不能在原子主机上使用 dnf 命令。原子主机并没有设计为通用操作系统，而是更适合容器和其他用途。但在原子主机上设置应用程序和服务仍然非常容易。这篇文章向您展示了如何自动化和简化这个过程。

### 设置组件

开始之前，请确保你的系统上安装了 Ansible。

```
sudo dnf -y install ansible

```

首先，我们需要在原子主机上运行 cockpit 容器。在你的机器上从 <https://github.com/trishnaguha/fedora-cloud-ansible> 下载它的源代码。

```
$ git clone https://github.com/trishnaguha/fedora-cloud-ansible.git

```

现在切换到 `cockpit` 的目录，并如下编辑 `inventory` 文件：

```
$ cd fedora-cloud-ansible
$ cd cockpit
$ vim inventory

```

完成如下修改：

1. 使用你的原子主机的 IP 替换掉 `IP_ADDRESS_OF_HOST`。
2. 用您的 SSH 私钥文件的路径替换 `ansible_ssh_private_key_file ='PRIVATE_KEY_FILE'` 行中的`PRIVATE_KEY_FILE`。

然后保存并退出 `inventory` 文件编辑。

接下来，编辑 ansible 配置文件：

```
$ vim ansible.cfg

```

替换 `remote_user=User` 中 `User` 为你的原子主机上的远程用户名。然后保存并退出文件编辑。

### 结合起来

现在是运行 Ansible 的 PlayBook 的时候了。此命令开始运行原子主机上的 Cockpit 容器：

```
$ ansible-playbook cockpit.yml

```

Cockpit 现在运行在原子主机上了。使用浏览器去访问你的实例的公网 IP 的 9090 端口——这是 Cockpit 的默认端口。举个例子，如果该实例的 IP 地址是 192.168.1.4，就去访问 192.168.1.4:9090，你将会看到如下的 Web 界面：

![](/data/attachment/album/201610/13/232955lo6melo1mp9kmpkk.jpg)

### 管理你的容器

使用原子主机的登录信息或以 root 用户身份登录。然后访问 Cockpit 管理器上的 Containers 部分来查看原子主机上运行的容器。在下面的示例中，您会看到我还设置了其他容器，如 [httpd](https://github.com/trishnaguha/fedora-cloud-ansible/tree/master/httpd) 和 [redis](https://github.com/trishnaguha/fedora-cloud-ansible/tree/master/redis)：

![](/data/attachment/album/201610/13/233023xcrcsj5gso5kkgpc.jpg)

注意，该界面允许您直接在 Cockpit 管理器中使用 Run 和 Stop 按钮启动和停止容器。您还可以使用 Cockpit 管理器管理您的原子主机。转到 Tools -> Terminals，在这里里你可以使用原子主机的终端：

![](/data/attachment/album/201610/13/233036g7hqvrg0386qr3qo.jpg)

如果您打算在原子主机上部署容器化的应用程序，则可以简单地为其编写一个 PlayBook。然后，您可以使用 `ansible-playbook` 命令进行部署，并使用 Cockpit 来管理容器。

![](/data/attachment/album/201610/13/233046racagpaabh7np8ap.jpg)

欢迎你对这个[仓库](https://github.com/trishnaguha/fedora-cloud-ansible)进行分支或添加容器的 PlayBook。

---

via: <https://fedoramagazine.org/deploy-containers-atomic-host-ansible-cockpit/>

作者：[trishnag](https://fedoramagazine.org/author/trishnag/) 译者：[Bestony](https://github.com/Bestony) 校对：[wxy](https://github.com/wxy)

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


Ubuntu 16.10 Yakkety Yak 正式发布

Summary: 估计是 Canonical 也觉得桌面版其实没什么值得大书特书的新变化吧，Mark Shuttleworth 在其发布公告中也主要提及的是一些服务器、虚拟化和容器方面的变化

等Debian Gnu/Linux发布新版！！！全组件ISO适合用户

Unity8到现在还没成熟，我也是服了。

试用过程中Unity8根本不能用，就一个浏览器和Terminal

路过,hah

没什么亮点，更新内核是每一个版本都有的，有什么值得说的吗

bug太多，比如删除文件到回收站，回收站里不显示;vpn拨一次后挂断再拨，网络会阻断...大家有遇到一样的问题吗

ubuntu 8.0 入门的，非常不错，转眼16版本了。

10 月 13 日，Canonical 如约[发布](http://insights.ubuntu.com/2016/10/13/canonical-releases-ubuntu-16-10)了 Ubuntu 16.10 （Yakkety Yak），喏，就是题图这只雪域高原上的牦牛。

![](/data/attachment/album/201610/13/234544n6b6lbbrvf6oilba.jpg)

按照惯例的开发周期， 这次历经半年开发的 16.10，并不是一个长期支持版本，支持期仅有 9 个月，所以，桌面用户可以考虑更新，而用于服务器和云环境的版本，在产品环境中想必没人会去升级吧。

虽然这样说，作为辛苦努力半年的成果，这个版本还是有不少的亮点值得关注的，毕竟，这个版本是为下一个长期支持版本做的铺垫。

### 16.10 桌面版的亮点

![](/data/attachment/album/201610/14/000620jrntzjgj0w0gl13n.jpg)

* Linux 4.8 内核
Ubuntu 是第一个使用 [Linux 4.8 内核](/article-7837-1.html)的主流发行版，而这距 Linux 4.8 内核发布还不到一周。显然最新的内核能带来对更多硬件的支持。
* GNOME 3.22
一些 GNOME 组件已经更新到了 GNOME 3.22，但是 Nautilus 文件管理器还是 GNOME 3.20 系列。
* GTK 3
LibreOffice 5.2 和 Mozilla Firefox 49.0 已经基于 GTK 3 构建。
* 试验性的 Unity 8 会话
Unity 8 会话目前还是一个试验性的桌面环境，不过已经默认安装了，可以在登录管理器中选择使用。但是由于 Unity 8 还不够成熟，因此主要的目的还是测试，希望用户可以提交更多反馈意见，或许有的桌面计算机并不能顺利运行它。

### 16.10 服务器版的亮点

![](/data/attachment/album/201610/14/004732r66kqdedb6ezolz4.jpg)

估计是 Canonical 也觉得桌面版其实没什么值得大书特书的新变化吧，Mark Shuttleworth 在其[发布公告](https://insights.ubuntu.com/2016/10/13/canonical-releases-ubuntu-16-10/)中也主要提及的是一些服务器、虚拟化和容器方面的变化：“世界上最快的虚拟机管理器 LXD，加上世界上最好的云操作系统 Ubuntu，以及最新的 OpenStack 和 Kubernetes 将为你提供世界上最快和最好的私有云架构。”

* [MAAS 2.0](http://maas.io/)
MAAS （“<ruby> 机器即服务 <rp>  （ </rp> <rt>  Metal as a Service </rt> <rp>  ） </rp></ruby>”）是 Canonical 推出的物理云服务概念，它可以让物理的数据中心“感觉就像云一样”，通过 Web 或 REST API 可以让物理机使用定制镜像马上就可以投入使用。它提供了稳健、高可用的 IPAM 和裸机供应。
* [Juju 2.0](https://jujucharms.com/docs/2.0/introducing-2) 支持混合云
最新发布的 Juju 2.0 可以以一致的、“模型驱动”的方式，跨多个公有云和私有基础设施来运行类似 Hadoop 和 Kubernetes 这样的大型软件。所谓的“模型驱动”操作提供了一种“开源 SAAS”体验。Juju 2.0 增加了 vSphere 架构的支持，支持架构于 OpenStack 和 VMware 上的私有云。
* OpenStack Newton
支持最新的 OpenStack Newton，提升了裸机和容器的安全性。但是如果要升级到最新的 OpenStack 架构，这不是一个轻松的过程，需要仔细计划和测试。
* Snapd 2.16
Snap 可以让更多的 Linux 服务器、设备和桌面更容易获取分发的应用，目前已经有 500 多个 snap 应用，它们将可以直接从软件开发者得到更新。
* 网络和虚拟化的性能提升
更新了 Data Plane Development Kit (DPDK) 、OpenVSwitch (OVS) 。
* 全方位的容器支持
支持各种类型的容器： 进程容器（Docker 1.12）、机器容器（LXD 2.4）和应用容器（Snapd 2.16）。
	+ [Canonical Distribution of Kubernetes](https://insights.ubuntu.com/2016/09/27/canonical-expands-enterprise-container-portfolio/) 对进程容器，如 Docker、OCID 和 Rkt 提供了更高层面的整合。
	+ 而 Canonical OpenStack 及 LXD 纯容器管理器提供了对成规模的轻量级机器容器的高级管理。
	+ 机器容器看起来就像虚拟机一样，可以让企业将虚拟机无须修改就可以转移到容器中。

### 下载

介绍完了各种新特性之后，你或许想实际体验和使用一下崭新发布的 Ubuntu 16.10 了。链接如下：

* 16.10 桌面版
	+ 64 位： [ubuntu-16.10-desktop-amd64.iso](http://releases.ubuntu.com/16.10/ubuntu-16.10-desktop-amd64.iso) （SHA1：aee0709d07d43494d7aa13457b4e255b0a12d1cf
	）
	+ 32 位： [ubuntu-16.10-desktop-i386.iso](http://releases.ubuntu.com/16.10/ubuntu-16.10-desktop-i386.iso) （SHA1：506c99577fc8c6a1899806e8b978490e028c2d9b）
* 16.10 服务器版
	+ 64 位： [ubuntu-16.10-server-amd64.iso](http://releases.ubuntu.com/16.10/ubuntu-16.10-server-amd64.iso) （SHA1：1da9ddc1d848a3f545de820ea9b4cd5a6c649b8c）
	+ 32 位： [ubuntu-16.10-server-i386.iso](http://releases.ubuntu.com/16.10/ubuntu-16.10-server-i386.iso) （SHA1：44e63796bb58db4a79268f625c95e1c212837602）


Canonical 正考虑移除 Ubuntu 的 32 位支持

Summary: 之前，Dimitri John Ledkov 在 Ubuntu 邮件列表 发送了一则消息，称将在 Ubuntu 18.10 中取消 32 位支持。他说越来越多的软件已经有了 64 位支持，而且为古老的 32 位架构提供安全支持将变得更加困难。

构建 32 位镜像并不是“免费的”，它的代价就是占用了我们的构建服务器资源、QQ 和校验时间。

QQ是什么鬼？

哈哈哈哈，QA，是我的锅。。

![](/data/attachment/album/201610/14/211034ayyd1dypppm22mom.jpg)

之前，[Dimitri John Ledkov](https://plus.google.com/+DimitriJohnLedkov) 在 [Ubuntu 邮件列表](https://lists.ubuntu.com/archives/ubuntu-devel-discuss/2016-June/016661.html) 发送了一则消息，称将在 Ubuntu 18.10 中取消 32 位支持。他说越来越多的软件已经有了 64 位支持，而且为古老的 32 位架构提供安全支持将变得更加困难。

Ledkov 同时表示，构建 32 位镜像并不是没有成本的，而要耗费 Canonical 不少的资源。

>
> 构建 32 位镜像并不是“免费的”，它的代价就是占用了我们的构建服务器资源、QA 和校验时间。尽管我我们有可扩展的构建环境，但 32 位支持还需要为所有包进行构建和自动测试，而且 ISO 也需要在我们的各种架构上进行测试。同时这还会占据大量的镜像空间和带宽。
>
>
>

Ledkov 计划着，Ubuntu 16.10、17.04、17.10 还会继续提供 32 位内核、网络安装器和云镜像，但移除桌面版和服务器版的 32 位 ISO 镜像。18.04 LTS 将会移除 32 位内核、网络安装器和云镜像，但在 64 位架构中兼容运行 32 位程序。然后在 18.10 中结束 32 位支持，并将传统的 32 位应用放在 snap、容器和虚拟机中。

但是，Ledkov 的这份计划还未被大家接受，但它表明了 32 位支持迟早要被遗弃。（LCTT 译注：我们已经知道 16.10 依旧有 32 为支持。）

### 好消息

当然，使用 32 位系统的用户也不必伤心。这个并不会影响用于拯救老式电脑的发行版。[Ubuntu MATE](http://ubuntu-mate.org/) 的创建者 [Martin Wimpress](https://twitter.com/m_wimpress) 在 Googl+ 的讨论中透露，这些改变这是影响着主线上的 Ubuntu 而已。

>
> 18.04 将继续存在 32 位架构支持，分支版本可以继续选择构建 32 位镜像。但还是会存在安全隐患，一些大型应用，如 Firefox、Chromium、LibreOffice，已经凸显了在一些旧版的 LTS 的更新安全问题。所以，这些分支版本需要注意其 32 位支持期限。
>
>
>

### 思考

从安全的角度，我可以理解他们为什么要移除 32 位支持，但是这可能会导致一部分人离开主线 Ubuntu 而投入另一个喜爱的发行版或者另一种架构的怀抱。值得庆幸的是，我们还可以选择 [轻量级 Linux 发行版](https://itsfoss.com/lightweight-linux-beginners/)。

---

via: <https://itsfoss.com/ubuntu-32-bit-support-drop/>

作者：[John Paul](https://itsfoss.com/author/john/) 译者：[GHLandy](https://github.com/GHLandy) 校对：[wxy](https://github.com/wxy)

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


制作你的第一个 Atom 文本编辑器插件

Summary: 我们将会制作一个山寨版的 Sourcerer，这是一个从 StackOverflow 查询并使用代码片段的插件。到教程结束时，你将会制作好一个将编程问题（用英语描述的）转换成获取自 StackOverflow 的代码片段的插件

等我换台新电脑再学习吧……

不用的，装个 Fedora 你就可以重获新生了

哈哈，那台装着Win7的电脑可不是我的。

哈哈，那台装着Win7的电脑可不是我的。

![](/data/attachment/album/201610/15/161556nz01buuwz1gq25zw.jpg)

### 序言

这篇教程将会教你怎么制作你的第一个 Atom 文本编辑器的插件。我们将会制作一个山寨版的 [Sourcerer](https://github.com/NickTikhonov/sourcerer)，这是一个从 StackOverflow 查询并使用代码片段的插件。到教程结束时，你将会制作好一个将编程问题（用英语描述的）转换成获取自 StackOverflow 的代码片段的插件，像这样：

![](/data/attachment/album/201610/15/154809kzgamoaygugu9nnp.gif)

#### 教程须知

Atom 文本编辑器是用 web 技术创造出来的。我们将完全使用 JavaScript 的 EcmaScript 6 规范来制作插件。你需要熟悉以下内容：

* 使用命令行
* JavaScript 编程
* [Promises](https://developers.google.com/web/fundamentals/getting-started/primers/promises)
* [HTTP](https://atom.io/)

#### 教程的仓库

你可以跟着教程一步一步走，或者看看 [放在 GitHub 上的仓库](https://github.com/NickTikhonov/sourcefetch-guide)，这里有插件的源代码。这个仓库的历史提交记录包含了这里每一个标题。

### 开始

#### 安装 Atom

根据 [Atom 官网](https://atom.io/) 的说明来下载 Atom。我们同时还要安装上 `apm`（Atom 包管理器的命令行工具）。你可以打开 Atom 并在应用菜单中导航到 `Atom > Install Shell Commands` 来安装。打开你的命令行终端，运行 `apm -v` 来检查 `apm` 是否已经正确安装好，安装成功的话打印出来的工具版本和相关环境信息应该是像这样的：

```
apm -v
> apm  1.9.2
> npm  2.13.3
> node 0.10.40
> python 2.7.10
> git 2.7.4

```

#### 生成骨架代码

让我们使用 Atom 提供的一个实用工具创建一个新的 **package**（软件包）来开始这篇教程。

* 启动编辑器，按下 `Cmd+Shift+P`（MacOS）或者 `Ctrl+Shift+P`（Windows/Linux）来打开<ruby> 命令面板 <rp>  （ </rp> <rt>  Command Palette </rt> <rp>  ） </rp></ruby>。
* 搜索“Package Generator: Generate Package”并点击列表中正确的条目，你会看到一个输入提示，输入软件包的名称：“sourcefetch”。
* 按下回车键来生成这个骨架代码包，它会自动在 Atom 中打开。

如果你在侧边栏没有看到软件包的文件，依次按下 `Cmd+K` `Cmd+B`（MacOS）或者 `Ctrl+K` `Ctrl+B`（Windows/Linux）。

![](/data/attachment/album/201610/15/154924xs3id22wnynulfoy.gif)

>
> <ruby> 命令面板 <rp>  （ </rp> <rt>  Command Palette </rt> <rp>  ） </rp></ruby>可以让你通过模糊搜索来找到并运行软件包。这是一个执行命令比较方便的途径，你不用去找导航菜单，也不用刻意去记快捷键。我们将会在整篇教程中使用这个方法。
>
>
>

#### 运行骨架代码包

在开始编程前让我们来试用一下这个骨架代码包。我们首先需要重启 Atom，这样它才可以识别我们新增的软件包。再次打开命令面板，执行 `Window: Reload` 命令。

重新加载当前窗口以确保 Atom 执行的是我们最新的源代码。每当需要测试我们对软件包的改动的时候，就需要运行这条命令。

通过导航到编辑器菜单的 `Packages > sourcefetch > Toggle` 或者在命令面板执行 `sourcefetch:toggle` 来运行软件包的 `toggle` 命令。你应该会看到屏幕的顶部出现了一个小黑窗。再次运行这条命令就可以隐藏它。

![](/data/attachment/album/201610/15/155008b7a0pgzv8rk8rcpb.gif)

#### “toggle”命令

打开 `lib/sourcefetch.js`，这个文件包含有软件包的逻辑和 `toggle` 命令的定义。

```
toggle() {
 console.log('Sourcefetch was toggled!');
 return (
   this.modalPanel.isVisible() ?
   this.modalPanel.hide() :
   this.modalPanel.show()
 );
}

```

`toggle` 是这个模块导出的一个函数。根据模态面板的可见性，它通过一个[三目运算符](https://en.wikipedia.org/wiki/%3F:) 来调用 `show` 和 `hide` 方法。`modalPanel` 是 [Panel](https://atom.io/docs/api/v1.9.4/Panel)（一个由 Atom API 提供的 UI 元素） 的一个实例。我们需要在 `export default` 内部声明 `modalPanel` 才可以让我们通过一个实例变量 `this` 来访问它。

```
this.subscriptions.add(atom.commands.add('atom-workspace', {
  'sourcefetch:toggle': () => this.toggle()
}));

```

上面的语句让 Atom 在用户运行 `sourcefetch:toggle` 的时候执行 `toggle` 方法。我们指定了一个 [匿名函数](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) `() => this.toggle()`，每次执行这条命令的时候都会执行这个函数。这是[事件驱动编程](https://en.wikipedia.org/wiki/Event-driven_programming)（一种常用的 JavaScript 模式）的一个范例。

#### Atom 命令

命令只是用户触发事件时使用的一些字符串标识符，它定义在软件包的命名空间内。我们已经用过的命令有：

* `package-generator:generate-package`
* `Window:reload`
* `sourcefetch:toggle`

软件包对应到命令，以执行代码来响应事件。

### 进行你的第一次代码更改

让我们来进行第一次代码更改——我们将通过改变 `toggle` 函数来实现逆转用户选中文本的功能。

#### 改变 “toggle” 函数

如下更改 `toggle` 函数。

```
toggle() {
  let editor
  if (editor = atom.workspace.getActiveTextEditor()) {
    let selection = editor.getSelectedText()
    let reversed = selection.split('').reverse().join('')
    editor.insertText(reversed)
  }
}

```

#### 测试你的改动

* 通过在命令面板运行 `Window: Reload` 来重新加载 Atom。
* 通过导航到 `File > New` 来创建一个新文件，随便写点什么并通过光标选中它。
* 通过命令面板、Atom 菜单或者右击文本然后选中 `Toggle sourcefetch` 来运行 `sourcefetch:toggle` 命令。

更新后的命令将会改变选中文本的顺序：

![](/data/attachment/album/201610/15/155103uthil87z17eu7shz.gif)

在 [sourcefetch 教程仓库](https://github.com/NickTikhonov/sourcefetch-tutorial/commit/89e174ab6ec6e270938338b34905f75bb74dbede) 查看这一步的全部代码更改。

### Atom 编辑器 API

我们添加的代码通过用 [TextEditor API](https://atom.io/docs/api/v1.11.1/TextEditor) 来访问编辑器内的文本并进行操作。让我们来仔细看看。

```
let editor
if (editor = atom.workspace.getActiveTextEditor()) { /* ... */ }

```

头两行代码获取了 [TextEditor](https://atom.io/docs/api/latest/TextEditor) 实例的一个引用。变量的赋值和后面的代码被包在一个条件结构里，这是为了处理没有可用的编辑器实例的情况，例如，当用户在设置菜单中运行该命令时。

```
let selection = editor.getSelectedText()

```

调用 `getSelectedText` 方法可以让我们访问到用户选中的文本。如果当前没有文本被选中，函数将返回一个空字符串。

```
let reversed = selection.split('').reverse().join('')
editor.insertText(reversed)

```

我们选中的文本通过一个 [JavaScript 字符串方法](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) 来逆转。最后，我们调用 `insertText` 方法来将选中的文本替换为逆转后的文本副本。通过阅读 [Atom API 文档](https://atom.io/docs/api/latest/TextEditor)，你可以学到更多关于 TextEditor 的不同的方法。

### 浏览骨架代码

现在我们已经完成第一次代码更改了，让我们浏览骨架代码包的代码来深入了解一下 Atom 的软件包是怎样构成的。

#### 主文件

主文件是 Atom 软件包的入口文件。Atom 通过 `package.json` 里的条目设置来找到主文件的位置：

```
"main": "./lib/sourcefetch",

```

这个文件导出一个带有生命周期函数（Atom 在特定的事件发生时调用的处理函数）的对象。

* **activate** 会在 Atom 初次加载软件包的时候调用。这个函数用来初始化一些诸如软件包所需的用户界面元素的对象，以及订阅软件包命令的处理函数。
* **deactivate** 会在软件包停用的时候调用，例如，当用户关闭或者刷新编辑器的时候。
* **serialize** Atom 调用它在使用软件包的过程中保存软件包的当前状态。它的返回值会在 Atom 下一次加载软件包的时候作为一个参数传递给 `activate`。

我们将会重命名我们的软件包命令为 `fetch`，并移除一些我们不再需要的用户界面元素。按照如下更改主文件：

```
'use babel';

import { CompositeDisposable } from 'atom'

export default {

  subscriptions: null,

  activate() {
    this.subscriptions = new CompositeDisposable()

    this.subscriptions.add(atom.commands.add('atom-workspace', {
      'sourcefetch:fetch': () => this.fetch()
    }))
  },

  deactivate() {
    this.subscriptions.dispose()
  },

  fetch() {
    let editor
    if (editor = atom.workspace.getActiveTextEditor()) {
      let selection = editor.getSelectedText()
      selection = selection.split('').reverse().join('')
      editor.insertText(selection)
    }
  }
};

```

### “启用”命令

为了提升性能，Atom 软件包可以用时加载。我们可以让 Atom 在用户执行特定的命令的时候才加载我们的软件包。这些命令被称为 **启用命令**，它们在 `package.json` 中定义：

```
"activationCommands": {
  "atom-workspace": "sourcefetch:toggle"
},

```

更新一下这个条目设置，让 `fetch` 成为一个启用命令。

```
"activationCommands": {
  "atom-workspace": "sourcefetch:fetch"
},

```

有一些软件包需要在 Atom 启动的时候被加载，例如那些改变 Atom 外观的软件包。在那样的情况下，`activationCommands` 会被完全忽略。

### “触发”命令

#### 菜单项

`menus` 目录下的 JSON 文件指定了哪些菜单项是为我们的软件包而建的。让我们看看 `menus/sourcefetch.json`：

```
"context-menu": {
  "atom-text-editor": [
    {
      "label": "Toggle sourcefetch",
      "command": "sourcefetch:toggle"
    }
  ]
},

```

这个 `context-menu` 对象可以让我们定义右击菜单的一些新条目。每一个条目都是通过一个显示在菜单的 `label` 属性和一个点击后执行的命令的 `command` 属性来定义的。

```
"context-menu": {
  "atom-text-editor": [
    {
      "label": "Fetch code",
      "command": "sourcefetch:fetch"
    }
  ]
},

```

同一个文件中的这个 `menu` 对象用来定义插件的自定义应用菜单。我们如下重命名它的条目：

```
"menu": [
  {
    "label": "Packages",
    "submenu": [
      {
        "label": "sourcefetch",
        "submenu": [
          {
            "label": "Fetch code",
            "command": "sourcefetch:fetch"
          }
        ]
      }
    ]
  }
]

```

#### 键盘快捷键

命令还可以通过键盘快捷键来触发。快捷键通过 `keymaps` 目录的 JSON 文件来定义：

```
{
  "atom-workspace": {
    "ctrl-alt-o": "sourcefetch:toggle"
  }
}

```

以上代码可以让用户通过 `Ctrl+Alt+O`（Windows/Linux） 或 `Cmd+Alt+O`（MacOS） 来触发 `toggle` 命令。

重命名引用的命令为 `fetch`：

```
"ctrl-alt-o": "sourcefetch:fetch"

```

通过执行 `Window: Reload` 命令来重启 Atom。你应该会看到 Atom 的右击菜单更新了，并且逆转文本的功能应该还可以像之前一样使用。

在 [sourcefetch 教程仓库](https://github.com/NickTikhonov/sourcefetch-tutorial/commit/aa3ec5585b0aa049393351a30be14590df09c29a) 查看这一步所有的代码更改。

### 使用 NodeJS 模块

现在我们已经完成了第一次代码更改并且了解了 Atom 软件包的结构，让我们介绍一下 [Node 包管理器（npm）](https://www.npmjs.com/) 中的第一个依赖项模块。我们将使用 **request** 模块发起 HTTP 请求来下载网站的 HTML 文件。稍后将会用到这个功能来扒 StackOverflow 的页面。

#### 安装依赖

打开你的命令行工具，切换到你的软件包的根目录并运行：

```
npm install --save request@2.73.0
apm install

```

这两条命令将 `request` 模块添加到我们软件包的依赖列表并将模块安装到 `node_modules` 目录。你应该会在 `package.json` 看到一个新条目。`@` 符号的作用是让 npm 安装我们这篇教程需要用到的特定版本的模块。运行 `apm install` 是为了让 Atom 知道使用我们新安装的模块。

```
"dependencies": {
  "request": "^2.73.0"
}

```

#### 下载 HTML 并将记录打印在开发者控制台

通过在 `lib/sourcefetch.js` 的顶部添加一条引用语句引入 `request` 模块到我们的主文件：

```
import { CompositeDisposable } from 'atom'
import request from 'request'

```

现在，在 `fetch` 函数下面添加一个新函数 `download` 作为模块的导出项：

```
export default {

  /* subscriptions, activate(), deactivate() */

  fetch() {
    ...
  },

  download(url) {
    request(url, (error, response, body) => {
      if (!error && response.statusCode == 200) {
        console.log(body)
      }
    })
  }
}

```

这个函数用 `request` 模块来下载一个页面的内容并将记录输出到控制台。当 HTTP 请求完成之后，我们的[回调函数](http://recurial.com/programming/understanding-callback-functions-in-javascript/)会将响应体作为参数来被调用。

最后一步是更新 `fetch` 函数以调用 `download` 函数：

```
fetch() {
  let editor
  if (editor = atom.workspace.getActiveTextEditor()) {
    let selection = editor.getSelectedText()
    this.download(selection)
  }
},

```

`fetch` 函数现在的功能是将 selection 当作一个 URL 传递给 `download` 函数，而不再是逆转选中的文本了。让我们来看看这次的更改：

* 通过执行 `Window: Reload` 命令来重新加载 Atom。
* 打开开发者工具。为此，导航到菜单中的 `View > Developer > Toggle Developer Tools`。
* 新建一个文件，导航到 `File > New`。
* 输入一个 URL 并选中它，例如：`http://www.atom.io`。
* 用上述的任意一种方法执行我们软件包的命令：

![](/data/attachment/album/201610/15/155404zh46j6658z46lz2u.gif)

>
> **开发者工具**让 Atom 软件包的调试更轻松。每个 `console.log` 语句都可以将信息打印到交互控制台，你还可以使用 `Elements` 选项卡来浏览整个应用的可视化结构——即 HTML 的[文本对象模型（DOM）](https://www.wikipedia.com/en/Document_Object_Model)。
>
>
>

在 [sourcefetch 教程仓库](https://github.com/NickTikhonov/sourcefetch-tutorial/commit/85992043e57c802ca71ff6e8a4f9c477fbfd13db) 查看这一步所有的代码更改。

### 用 Promises 来将下载好的 HTML 插入到编辑器中

理想情况下，我们希望 `download` 函数可以将 HTML 作为一个字符串来返回，而不仅仅是将页面的内容打印到控制台。然而，返回文本内容是无法实现的，因为我们要在回调函数里面访问内容而不是在 `download` 函数那里。

我们会通过返回一个 [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) 来解决这个问题，而不再是返回一个值。让我们改动 `download` 函数来返回一个 Promise：

```
download(url) {
  return new Promise((resolve, reject) => {
    request(url, (error, response, body) => {
      if (!error && response.statusCode == 200) {
        resolve(body)
      } else {
        reject({
          reason: 'Unable to download page'
        })
      }
    })
  })
}

```

Promises 允许我们通过将异步逻辑封装在一个提供两个回调方法的函数里来返回获得的值（`resolve` 用来处理请求成功的返回值，`reject` 用来向使用者报错）。如果请求返回了错误我们就调用 `reject`，否则就用 `resolve` 来处理 HTML。

让我们更改 `fetch` 函数来使用 `download` 返回的 Promise：

```
fetch() {
  let editor
  if (editor = atom.workspace.getActiveTextEditor()) {
    let selection = editor.getSelectedText()
    this.download(selection).then((html) => {
      editor.insertText(html)
    }).catch((error) => {
      atom.notifications.addWarning(error.reason)
    })
  }
},

```

在我们新版的 `fetch` 函数里，我们通过在 `download` 返回的 Promise 调用 `then` 方法来对 HTML 进行操作。这会将 HTML 插入到编辑器中。我们同样会通过调用 `catch` 方法来接收并处理所有的错误。我们通过用 [Atom Notification API](https://atom.io/docs/api/v1.11.1/NotificationManager) 来显示警告的形式来处理错误。

看看发生了什么变化。重新加载 Atom 并在一个选中的 URL 上执行软件包命令：

![](/data/attachment/album/201610/15/155458yaag3og5h9eoz96h.gif)

如果这个 URL 是无效的，一个警告通知将会弹出来：

![](/data/attachment/album/201610/15/160402qqfffspoxrcgdorw.gif)

在 [sourcefetch 教程仓库](https://github.com/NickTikhonov/sourcefetch-tutorial/commit/896d160dca711f4a53ff5b182018b39cf78d2774) 查看这一步所有的代码更改。

#### 编写一个爬虫来提取 StackOverflow 页面的代码片段

下一步涉及用我们前面扒到的 StackOverflow 的页面的 HTML 来提取代码片段。我们尤其关注那些来自采纳答案（提问者选择的一个正确答案）的代码。我们可以在假设这类答案都是相关且正确的前提下大大简化我们这个软件包的实现。

#### 使用 jQuery 和 Chrome 开发者工具来构建查询

这一部分假设你使用的是 [Chrome](https://www.google.com/chrome/) 浏览器。你接下来可以使用其它浏览器，但是提示可能会不一样。

让我们先看看一张典型的包含采纳答案和代码片段的 StackOverflow 页面。我们将会使用 Chrome 开发者工具来浏览 HTML：

* 打开 Chrome 并跳到任意一个带有采纳答案和代码的 StackOverflow 页面，比如像这个用 Python 写的 [hello world](http://stackoverflow.com/questions/1077347/hello-world-in-python) 的例子或者这个关于 [用 `C` 来读取文本内容的问题](http://stackoverflow.com/questions/3463426/in-c-how-should-i-read-a-text-file-and-print-all-strings)。
* 滚动窗口到采纳答案的位置并选中一部分代码。
* 右击选中文本并选择 `检查`。
* 使用元素侦察器来检查代码片段在 HTML 中的位置。

注意文本结构应该是这样的：

```
<div class="accepted-answer">
  ...
    ...
      <pre>
        <code>
          ...snippet elements...
        </code>
      </pre>
    ...
  ...
</div>

```

* 采纳的答案通过一个 class 为 `accepted-answer` 的 `div` 来表示
* 代码块位于 `pre` 元素的内部
* 呈现代码片段的元素就是里面那一对 `code` 标签

![](/data/attachment/album/201610/15/160428thz0g7i2n2hkan3q.gif)

现在让我们写一些 `jQuery` 代码来提取代码片段：

* 在开发者工具那里点击 **Console** 选项卡来访问 Javascript 控制台。
* 在控制台中输入 `$('div.accepted-answer pre code').text()` 并按下回车键。

你应该会看到控制台中打印出采纳答案的代码片段。我们刚刚运行的代码使用了一个 jQuery 提供的特别的 `$` 函数。`$` 接收要选择的**查询字符串**并返回网站中的某些 HTML 元素。让我们通过思考几个查询案例看看这段代码的工作原理：

```
$('div.accepted-answer')
> [<div id="answer-1077349" class="answer accepted-answer" ... ></div>]

```

上面的查询会匹配所有 class 为 `accepted-answer` 的 `<div>` 元素，在我们的案例中只有一个 div。

```
$('div.accepted-answer pre code')
> [<code>...</code>]

```

在前面的基础上改造了一下，这个查询会匹配所有在之前匹配的 `<div>` 内部的 `<pre>` 元素内部的 `<code>` 元素。

```
$('div.accepted-answer pre code').text()
> "print("Hello World!")"

```

`text` 函数提取并连接原本将由上一个查询返回的元素列表中的所有文本。这也从代码中去除了用来使语法高亮的元素。

### 介绍 Cheerio

我们的下一步涉及使用我们创建好的查询结合 [Cheerio](https://www.npmjs.com/package/cheerio)（一个服务器端实现的 jQuery）来实现扒页面的功能。

#### 安装 Cheerio

打开你的命令行工具，切换到你的软件包的根目录并执行：

```
npm install --save cheerio@0.20.0
apm install

```

#### 实现扒页面的功能

在 `lib/sourcefetch.js` 为 `cheerio` 添加一条引用语句：

```
import { CompositeDisposable } from 'atom'
import request from 'request'
import cheerio from 'cheerio'

```

现在创建一个新函数 `scrape`，它用来提取 StackOverflow HTML 里面的代码片段：

```
fetch() {
  ...
},

scrape(html) {
  $ = cheerio.load(html)
  return $('div.accepted-answer pre code').text()
},

download(url) {
  ...
}

```

最后，让我们更改 `fetch` 函数以传递下载好的 HTML 给 `scrape` 而不是将其插入到编辑器：

```
fetch() {
  let editor
  let self = this

  if (editor = atom.workspace.getActiveTextEditor()) {
    let selection = editor.getSelectedText()
    this.download(selection).then((html) => {
      let answer = self.scrape(html)
      if (answer === '') {
        atom.notifications.addWarning('No answer found :(')
      } else {
        editor.insertText(answer)
      }
    }).catch((error) => {
      console.log(error)
      atom.notifications.addWarning(error.reason)
    })
  }
},

```

我们扒取页面的功能仅仅用两行代码就实现了，因为 cheerio 已经替我们做好了所有的工作！我们通过调用 `load` 方法加载 HTML 字符串来创建一个 `$` 函数，然后用这个函数来执行 jQuery 语句并返回结果。你可以在官方 [开发者文档](https://github.com/cheeriojs/cheerio) 查看完整的 `Cheerio API`。

### 测试更新后的软件包

重新加载 Atom 并在一个选中的 StackOverflow URL 上运行 `soucefetch:fetch` 以查看到目前为止的进度。

如果我们在一个有采纳答案的页面上运行这条命令，代码片段将会被插入到编辑器中：

![](/data/attachment/album/201610/15/160534c1dq1d48twxshzzx.gif)

如果我们在一个没有采纳答案的页面上运行这条命令，将会弹出一个警告通知：

![](/data/attachment/album/201610/15/160612a2jj2226uuwq2qxu.gif)

我们最新的 `fetch` 函数给我们提供了一个 StackOverflow 页面的代码片段而不再是整个 HTML 内容。要注意我们更新的 `fetch` 函数会检查有没有答案并显示通知以提醒用户。

在 [sourcefetch 教程仓库](https://github.com/NickTikhonov/sourcefetch-tutorial/commit/039a1e1e976d029f7d6b061b4c0dac3eb4a3b5d2) 查看这一步所有的代码更改。

### 实现用来查找相关的 StackOverflow URL 的谷歌搜索功能

现在我们已经将 StackOverflow 的 URL 转化为代码片段了，让我们来实现最后一个函数——`search`，它应该要返回一个相关的 URL 并附加一些像“hello world”或者“快速排序”这样的描述。我们会通过一个非官方的 `google` npm 模块来使用谷歌搜索功能，这样可以让我们以编程的方式来搜索。

#### 安装这个 Google npm 模块

通过在软件包的根目录打开命令行工具并执行命令来安装 `google` 模块：

```
npm install --save google@2.0.0
apm install

```

#### 引入并配置模块

在 `lib/sourcefetch.js` 的顶部为 `google` 模块添加一条引用语句：

```
import google from "google"

```

我们将配置一下 `google` 以限制搜索期间返回的结果数。将下面这行代码添加到引用语句下面以限制搜索返回最热门的那个结果。

```
google.resultsPerPage = 1

```

#### 实现 search 函数

接下来让我们来实现我们的 `search` 函数：

```
fetch() {
  ...
},

search(query, language) {
  return new Promise((resolve, reject) => {
    let searchString = `${query} in ${language} site:stackoverflow.com`

    google(searchString, (err, res) => {
      if (err) {
        reject({
          reason: 'A search error has occured :('
        })
      } else if (res.links.length === 0) {
        reject({
          reason: 'No results found :('
        })
      } else {
        resolve(res.links[0].href)
      }
    })
  })
},

scrape() {
  ...
}

```

以上代码通过谷歌来搜索一个和指定的关键词以及编程语言相关的 StackOverflow 页面，并返回一个最热门的 URL。让我们看看这是怎样来实现的：

```
let searchString = `${query} in ${language} site:stackoverflow.com`

```

我们使用用户输入的查询和当前所选的语言来构造搜索字符串。比方说，当用户在写 Python 的时候输入“hello world”，查询语句就会变成 `hello world in python site:stackoverflow.com`。字符串的最后一部分是谷歌搜索提供的一个过滤器，它让我们可以将搜索结果的来源限制为 StackOverflow。

```
google(searchString, (err, res) => {
  if (err) {
    reject({
      reason: 'A search error has occured :('
    })
  } else if (res.links.length === 0) {
    reject({
      reason: 'No results found :('
    })
  } else {
    resolve(res.links[0].href)
  }
})

```

我们将 `google` 方法放在一个 `Promise` 里面，这样我们可以异步地返回我们的 URL。我们会传递由 `google` 返回的所有错误并且会在没有可用的搜索结果的时候返回一个错误。否则我们将通过 `resolve` 来解析最热门结果的 URL。

### 更新 fetch 来使用 search

我们的最后一步是更新 `fetch` 函数来使用 `search` 函数：

```
fetch() {
  let editor
  let self = this

  if (editor = atom.workspace.getActiveTextEditor()) {
    let query = editor.getSelectedText()
    let language = editor.getGrammar().name

    self.search(query, language).then((url) => {
      atom.notifications.addSuccess('Found google results!')
      return self.download(url)
    }).then((html) => {
      let answer = self.scrape(html)
      if (answer === '') {
        atom.notifications.addWarning('No answer found :(')
      } else {
        atom.notifications.addSuccess('Found snippet!')
        editor.insertText(answer)
      }
    }).catch((error) => {
      atom.notifications.addWarning(error.reason)
    })
  }
}

```

让我们看看发生了什么变化：

* 我们选中的文本现在变成了用户输入的 `query`
* 我们使用 [TextEditor API](https://atom.io/docs/api/v1.11.1/TextEditor) 来获取当前编辑器选项卡使用的 `language`
* 我们调用 `search` 方法来获取一个 URL，然后通过在得到的 Promise 上调用 `then` 方法来访问这个 URL

我们不在 `download` 返回的 Promise 上调用 `then` 方法，而是在前面 `search` 方法本身链式调用的另一个 `then` 方法返回的 Promise 上面接着调用 `then` 方法。这样可以帮助我们避免[回调地狱](http://callbackhell.com/)

在 [sourcefetch 教程仓库](https://github.com/NickTikhonov/sourcefetch-tutorial/commit/aa9d0b5fc4811a70292869730e0f60ddf0bcf2aa) 查看这一步所有的代码更改。

### 测试最终的插件

大功告成了！重新加载 Atom，对一个“问题描述”运行软件包的命令来看看我们最终的插件是否工作，不要忘了在编辑器右下角选择一种语言。

![](/data/attachment/album/201610/15/160818no9eml1fphvwg5df.gif)

### 下一步

现在你知道怎么去 “hack” Atom 的基本原理了，通过 [分叉 sourcefetch 这个仓库并添加你的特性](https://github.com/NickTikhonov/sourcefetch-tutorial) 来随心所欲地实践你所学到的知识。

---

via: <https://github.com/blog/2231-building-your-first-atom-plugin>

作者：[NickTikhonov](https://github.com/NickTikhonov) 译者：[OneNewLife](https://github.com/OneNewLife) 校对：[wxy](https://github.com/wxy)

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


Antergos：基于 Arch 发行版，想要尝试 Arch 的绝对值得一试

看着不错啊

所以，<br />
他和arch相比的优点是什么

这个系统用完之后你会感觉还不如直接装arch好

开篇就说明了是给新手用的，并不是每个人都会安装和配置Arch

archwiki 现在是不打算对新人友好了吗

虽然没有尝试过这个发行版，但根据这篇文章来看，可能是安装过程更加简便一些。但说真的，刚刚开始尝试要用 Archlinux 的时候，的确安装不成功。后来细细的解读了 archwiki 中的每一步安装细节之后，才成功安装 Archlinux。对于定制要求较高的用户，尝试过 Archlinux 之后应该都会着迷。我个人感觉这是一个“完全源码定制”和“完全傻瓜式”的一个平衡点。

这系统顶执行不如arch吧?很多应用已经集成进去了

字体特别丑，中文和英文都是。

这个shell主题不错，可以单独下载吗？

manjaro不服

不错,挺漂亮

玄学的发行版。。。。开机莫名logo一闪就黑屏，而且是有可能启动，也有可能启动不了

### 介绍

众所周知，Arch Linux 是最好的 Linux 发行版之一，我们可以随心所欲的进行定制。我们可以滚动式更新最新的软件，但它的安装和配置的过程对于初学者则相对困难。现在就让我来为你展示如何安装 Antergos，这个基于 Arch 的、给新手的最好发行版，要尝试 Arch 的用户可以试一试，我保证绝对值得一试。

Antergos 是一个滚动式更新的发行版，基于 Arch Linux 提供桌面环境，是集现代化、高雅和高效率于一体的操作系统。想要挑战一下安装 Arch Linux 的用户，都可以先试一试 Antergos。

![](/data/attachment/album/201610/15/222952tckavv922kevp4e8.jpg)

由于是滚动式更新，当上游发布更新，你的整个系统 (包括系统组件和你已安装的应用) 就会升级到最新的滚动版本，仅仅稍微延期一点时间以确保系统的稳定。

Antergos 有多个语言版本，包括英语、西班牙语等版本，在安装时你可以在语言栏选择预置语言。默认的配置确保了开箱即用，不需要安装额外的软件就可以直接浏览网页、听音乐、看视频以及做任何你想做的事情。

Antergos 项目最初名字是 Cinnarch，并且只提供一个桌面环境。现在它有多个桌面环境（包括 Cinnamon、Gnome、KDE、MATE、Openbox 和 Xfce）以供用户在安装之时进行选择。同时，它还默认包含了著名的 Numix GTK 主题和 Icon 主题。

### 安装

#### 下载 Antergos Linux

访问 [Antergos](https://antergos.com/try-it/) 下载页面，然后下载最新的 Live ISO 镜像。任何人都可以免费获取 Antergos 镜像，烧录到 CD/DVD 或者写到 USB 设备，开始 Antergos 之旅。

#### 创建可启动 USB

下载好最新的 Antergos Live ISO 镜像之后，你需要使用命令行或者图形界面的方法来制作一个可启动介质。

#### 使用 Antergos 安装介质来启动电脑

使用 Antergos 安装介质来启动电脑。成功启动到 Live ISO 之后，你会看到与下图相似的界面。

![](/data/attachment/album/201610/15/223003au99rl9j1f6ila9k.png)

点击 Install It 按钮开始 Angergos 的安装过程。

![](/data/attachment/album/201610/15/223005rw8huwu0wczjxr3z.png)

#### 选择语系

Antergos 的易于使用的图形安装器非常不错。此处选择你需要选用的语系并点击 Next 按钮继续下一步。

![](/data/attachment/album/201610/15/223007mogo40oug7j5q1o3.png)

#### 系统检测

请确保你有足够的磁盘空间，连接好电源以及连接到网络，点击 Next 按钮继续下一步。

![](/data/attachment/album/201610/15/223009z9ms4o657sstjx4u.png)

#### 选择地点

选择地点可以帮助决定系统所使用的本地化信息（locale）。通常是选择你所属的国家即可。这里有一个基于你选择的语言的位置的简短列表。点击 Next 按钮继续下一步。

![](/data/attachment/album/201610/15/223012h4t6tx00w0phhhb6.png)

#### 选择时区

选择使用的时区，然后点击 Next 按钮继续下一步。

![](/data/attachment/album/201610/15/223015nq11n5pk1qcsqcl3.png)

#### 选择键盘布局

选择你选用的键盘布局，然后点击 Next 按钮继续下一步。

![](/data/attachment/album/201610/15/223017sypcp21nc1rcincl.png)

#### 选择桌面环境

Antergos 提供了多个选择（包括 Cinnamon、Gnome、KDE、MATE、Openbox 和 Xfce），根据你的喜好进行选择即可。然后点击 Next 按钮继续下一步。

![](/data/attachment/album/201610/15/223019eneudwwmm6zuufdy.png)

#### Gnome – 特性选择

这里我选择了默认的 Gnome 桌面环境，此处你可以选择需要额外安装的软件以及正确的驱动程序。然后点击 Next 按钮继续下一步。

![](/data/attachment/album/201610/15/223022bihvwou9xhqfqih9.png)

#### 安装类型

初次安装可以选择第一个选项（ Erase disk and install Antergos ）。然后点击 Next 按钮继续下一步。（LCTT 译注，但是要注意这个选项会擦除你的整个硬盘数据，如果你是全新安装，则可以使用该选项。）

![](/data/attachment/album/201610/15/223024l7yoffoj06jkkxod.png)

#### 自动安装模式

这里会有一个檫除硬盘的警告，并选择安装 Grub 启动器，然后点击 Next 按钮继续下一步。

>
> WARNING ! This will overwrite everything currently on your drive !
>
>
>

![](/data/attachment/album/201610/15/223028cdubrazfj4tbdndf.png)

#### 安装设置综述

确认最后的安装设置概览，如地点、时区、键盘布局、桌面环境和特性，然后点击 Next 按钮继续下一步。

![](/data/attachment/album/201610/15/223033wnrb2zp6v2bii7nv.png)

#### 创建你的用户名

此时需要为你的系统创建一个新用户名和对应的密码，然后点击 Next 按钮继续下一步。

* 你的昵称
* 电脑名称
* 用户名
* 设置密码
* 密码二次确认
* 选择“登录系统需要密码”

![](/data/attachment/album/201610/15/223035bet6ak8629y6lkty.png)

#### 安装进程

此时就是等待 Antergos 安装完成。安装好之后，移除安装介质在点击“立刻重启”按钮。

![](/data/attachment/album/201610/15/223038qlpbdgpeb6llpd6p.png)

#### 输入用户名和密码

这是欢迎界面，输入密码即可登录：

![](/data/attachment/album/201610/15/223046g7alpl9ezpv5w1me.png)

发行信息截图：

![](/data/attachment/album/201610/15/223055njsj1h9yzvv07oyn.png)

我们还会提供了一些列循序渐进的 Linux 系统管理的相关文章。如果本文对你有用，请花费几分钟分享你得想法到评论区。

请于我们保持联系，祝君好运！

---

via: <http://www.2daygeek.com/how-to-install-antergos-linux/>

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

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


2016 杭州云栖大会随笔

这款咖啡有什么特别的地方吗？

老王！！！

事实是，阿里云最低配两档全部下架，然后说中高配买三年打折。<br />
重新定义了降价。

俺也去会场了，没啥不同。就是解题送一杯而已。

近日，老王获邀参加了阿里云举办的年度盛典 2016 杭州云栖大会，第一次赶赴了传说中的云栖小镇（这地方名字真的就叫这个，我一直以为只是个别称呢），参加这场前后持续了四天的盛会，也是第一次参加了还有夜间场次的技术会议。

![](/data/attachment/album/201610/16/214808wh48v7zdd8totf7b.jpg)

从五通一平，到人工智能 ET；从金融云，到互联网级操作系统，物联网，城市大脑。为期四天的会议真是带来了太多信息，以至于我只能选择性的参与一些场次，今天还有朋友问我，有没有记录会议笔记可以给她学习下。说实话，还真没专门记些什么，不过我把自己印象深刻的几个地方写出来，算是分享给大家吧。

在第一天的主论坛上，马云做了重头讲演，对他的讲演已经有了太多的媒体披露和阐述了，我就不赘述了。老王还是以一位专业技术人员的角色来谈谈自己的感受吧。

![](/data/attachment/album/201610/16/220111ffrzx6h3nbn535hr.jpg)

在主论坛上，阿里云资深总监李津回顾了从 2009 年开始，阿里云飞天系统写下第一行底层代码到今天，飞天给大数据，人工智能等领域带来的变化，并发布了一系列的新产品。

其中有几个谈到的地方值得关注，首先是一些趋势和数据的变化：

* 金融是传统 IT 产业皇冠上的明珠，也是云计算的金线。今天已经有 **2000+** 以上的金融机构跑在阿里云上。
* 阿里云在上一个季度实现了 **156%** 的增长，并发布了一站式软件交付系统，即将改变了技术生态与企业的连接模式。
* 阿里云的基础设施已经覆盖了全球 **600** 个节点。
* 传统 IT 存储市场急速下降，阿里云存储市场上升 **500%**。
* 云市场增速 **652%**，已经有数千万的 ISV 提供服务。
* 华北 3 数据中心即将开服，中国最大的绿色数据中心，数据中心能源效率（PUE）指标可达 **1.13**。
* 阿里云将国家地震局的分析计算从 **10 个月**降低到了 **18 个小时。**

这里面颇有几个令人吃惊的数据，不过我更关注的技术和开源领域的变化：

* 宣布[阿里云和 Docker 达成深度合作](/article-7859-1.html)。李津认为，只要中国云计算生态做的足够好，世界终将会拥抱中国云计算生态。
* 阿里云正式开源 AliSQL，后续会不断推进开源。我目睹了 [AliSQL 在 GitHub 上的代码库](https://github.com/alibaba/AliSQL)从“Private” 变成了“Public”的那一刻，想必开源界会有不少人会去亲自 review 代码看看。
* 计算和存储分离的架构带来更高效率。主流开源界开始拥抱中国云计算，OSS 被诸多开源软件原生支持。
* CDN 支持 HTTP/2，高速，安全，可靠的 CDN 时代来临。

此外，在网络安全方面，阿里云安全体系保障了 G20 期间 200 多家政务系统，应对了世界级的安全挑战。阿里云金融云平台通过公安部云计算等级保护四级，这是当前最高安全等级。

以及，Intel 首次为中国云计算定制 CPU，具有高主频高密度等特点，软硬件结合将改变底层生态。这挺让人震撼的。

当然，还有一个消息就是，降价了。技术让阿里云成本更低：核心产品降价10%。同时对于云服务，云数据库，云安全及云储存产品两年 7 折，三年 5 折。核心产品按量付费直接降价50%。据说，过去一年已经降价 17 次了！

除了主论坛，老王专门参加了开源技术专场，亏我去的早，坐到了第一排，亲见了 MySQL 之父 Michael Widenius （即 Monty）和 Docker 公司的生态开发总监 [John Willis](https://blog.docker.com/author/john-willis/) （他也是一位全球有名的 [DevOps 专家](http://itrevolution.com/devops-handbook)）。

![](/data/attachment/album/201610/16/223406ut53u8jj15opyj3w.jpg)

从右向左分别是：Michael Widenius、John Willis 及其随员。在讲演前后，一大批与会者纷纷与两位大神级程序员合影留念（没有人与美女随员合影，不知道她内心的感受是……）。

开源专场是由阿里云技术专家唐容主持的，并做了开篇演讲《阿里开源发展与生态》，算是比较系统的讲了阿里开源的发展和理念吧。

![](/data/attachment/album/201610/16/224351akgegk7ge76m8gbv.jpg)

其后两位国外大神的英文演讲还是干货满满，感觉不错，就是同声传译的女生好像对技术不太了然，翻译这种技术演讲感觉很辛苦。说到 AliSQL 开源仪式，还真是个仪式，现场为大家展示了如何将一个“Private”的 GitHub 仓库变成“Public”的。 ：D

次日，我去听了 YunOS IoT 峰会。YunOS 事业群总裁张春晖做了开篇演讲，其中有几个内容引起了我的注意，分享给大家：

![](/data/attachment/album/201610/16/231737x2b3qn7fbhwzcfhq.jpg)

* APP 的孤岛是无法用 APP 时代来打破的，所以一定要用一个新的方法来打破，那就是服务，那就是一个服务的世界、一个万物互联网的时代所带来的。
* 怎么才能打破设备的孤岛？什么是最根本的东西，那可能就是芯片，从芯片入手，可能就可以实现打破设备的孤岛。
* 当我们能打破APP的孤岛，设备的孤岛，最后就有可能演变到万物互联网。

除了演讲，在会场和展台也看到了很多 YunOS 的应用， 有机器人、智能家电、互联网汽车等等。不过，我更感兴趣的是，晚上举办的开发者之夜。说起来，我还从来没参加过晚上举办的技术大会——可见这场大会的信息密度有多大了。

![](/data/attachment/album/201610/16/234038c0oax6q006xxon00.jpg)

草草吃了一点晚饭后，就赶快去开发者夜场了，YunOS 技术专家讲到了 CAF， 据其介绍，这是一个开发框架，作为专为服务和互联而生的框架，它可以大幅降低开发门槛，无需安装即可使用，不仅可以快速提升应用分发能力，同时还可以全面覆盖多终端而无需单独开发。据其后讲演的掌阅副总裁贾生亭说，借助于 YunOS 大数据分析能力及精准的用户画像，人均阅读时间增长 40%，付费转化率提升 45%。

感觉 CAF 对 YunOS 的生态建设起到了很重要的作用，应该去试试： <http://open.yunos.com/> 。

最后，还有个小花絮，这场大会里， Costa 咖啡专门定制了飞天（APSARA）咖啡——“听说咖啡产代码”，喏就是这个：

![](/data/attachment/album/201610/16/234457yqip06dps5si5i1u.jpg)

作为一位老程序员，这一定得喝一杯啊。于是我就专门跑遍了整个会展中心，终于找到了 Costa 咖啡店，并出示了定制卡片。然而，我得到的是这样的：

![](/data/attachment/album/201610/16/234753but9tnabandouuom.jpg)

瞧人家的代码，再看看我的代码……

参加完 2016 杭州云栖大会之后，当飞机着陆到北京首都国际机场，走出机场时，我又见到了：

![](/data/attachment/album/201610/16/235558a43p8h7vlgc9414h.jpg)


现代 Linux 的五大初始化系统（1992-2015）

systemd模块化的话就更好了。不太认可SYSTEMD的试图搞定一切的理念，为巴黎提供面包的不是一家面包店！！！

苹果的mac OS 用的什么呢，BSD 和Unix 都含那些？？？

Darwin -> launchd, FreeBSE -> SysV

Upstart 不是已经被放弃了吗？

在 Linux 和其他类 Uniux 系统中，init（初始化）进程是系统启动时由内核执行的第一个进程，其进程 ID（PID）为 1，并静默运行在后台，直到系统关闭。

init 进程负责启动其他所有的进程，比如守护进程、服务和其他后台进程，因此，它是系统中其它所有进程之母（偏偏叫做“父进程”）。某个进程可以启动许多个子进程，但在这个过程中，某个子进程的父进程结束之后，该子进程的父进程会变成 init 进程。

![](/data/attachment/album/201610/18/101433ro35k433x1r88xx5.jpg)

这么多年过去了，许多的初始化系统在主流 Linux 脱颖而出，和本文中，我将你来看看在 Linux 操作系统最好的初始化系统。

### 1. System V Init

System V (SysV) 是一个在类 Unix 系统中最为成熟而且大受欢迎的初始化方案，是 Unix/Linux 系统中所有进程的父进程。SysV 是第一个商业 Unix 系统设计的初始化方案。

除了 Gentoo 使用自主的初始化系统、Slackware 使用 BSD 风格的初始化方案外，几乎所有的 Linux 发行版都率先使用 SysV 作为初始化方案。

随着时间的推移，由于一些设计上的缺陷，有几个 SysV 初始化替换方案已经开发出来，用以为 Linux 创建更加高效和完美的初始化系统。

尽管这些替代方案都超越了 SysV 并提供了更多新特性，但它们仍然和原始 SysV 初始化脚本保持兼容。

### 2. SystemD

SystemD 是一个 Linux 平台中相对较新的初始化方案。它由 Fedora 15 引入，集成了各类工具以便更好的管理系统。主要目的是：系统初始化、管理和跟踪引导进程中和系统运行时所有的系统进程。

Systemd 全面有别于其他传统的 Unix 初始化系统，特别是在启动系统和服务管理方面。它同样兼容 SysV 和 LBS 初始化脚本。

其中较为突出的特性如下：

* 纯粹、简单、高效的设计
* 启动时的并发和并行处理
* 更好的 API
* 开启可选进程的移除功能
* 使用 journald 来支持事件日志
* 使用 systemd calender timers 来支持任务计划
* 以二进制文件存储日志
* 保存 systemd 的状态以待今后查看
* 与 GNOME 更好整合实现等

查看 Systemd 初始化系统简介：<https://fedoraproject.org/wiki/Systemd>

### 3. Upstart

Upstart 是一个基于事件的初始化系统，由 Ubuntu 的制作团队开发的，用以替代 SysV。它可以启动不同的系统任务和进程、在系统运行时校验进程并在系统关闭时结束进程。

它是一个使用 SysV 和 Systemd 启动脚本的混合初始化系统，Upstart 中值得一提的特性如下：

* Ubuntu 的原生初始化系统，但可以运行在其他所有的发行版中
* 基于事件启动/结束的任务和服务
* 启动/结束任务和服务时生成事件
* 可以由其他系统进程发送事件
* 使用 D-Bus 和 init 进程通信
* 用户可以启动/结束其各自的进程
* 可以再现崩溃的进程等

访问 Upstart 主页：<http://upstart.ubuntu.com/index.html>

### 4. OpenRC

OpenRC 是一个基于依赖关系的类 Unix 系统初始化方案，兼容 SysV。基本可以说是 SysV 的升级版，但必须要清楚记住的是：OpenRC 并非只是完全替代 /sbin/init 文件。

它所提供的出色特性如下：

* 可运行在包括 Gentoo 和 BSD 在内的多数 Linux 系统之中
* 支持硬件触发的初始化脚本（LCTT 译注：如硬件热插拔所触发的）
* 支持单个配置文件
* 不支持单个服务配置文件
* 以守护进程的方式运行
* 并行服务启动等

访问 OpenRC 主页：<https://wiki.gentoo.org/wiki/OpenRC>

### 5. runit

runit 同样是一个跨平台初始化系统，可以运行在 GNU/Linux、Solaris、BSD 和 Mac OS X 中，用替代 SysV，同时提供服务监控。

相比于 SysV 和其他 Linux 初始化系统，它提供了一些好用和卓越的组件，如下：

* 服务监控：每个服务都关联一个服务目录
* 清理进程状态，以保证每个进程处于干净状态
* 可靠的日志机制
* 快速的系统启动和关闭
* 可移植
* 打包方便
* 代码体积小等

访问 runit 主页：<http://smarden.org/runit/>

正如我之前所说的，Linux 中的初始化系统负责启动和管理所有的进程。此外，SysV 是 Linux 系统中主要的初始化系统，但由于一些性能缺陷，系统开发者已经开发出几个替代品。

在这里，我已经介绍了几个可用的替代方案，但你可能觉得有一些其他的初始化系统值得在此提及。请在下方的评论区将你的想法告诉我们。

---

via: <http://www.tecmint.com/best-linux-init-systems/>

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

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


JS 基金会成立

Summary: Linux 基金会宣布成立了 JS 基金会（JS Foundation），该基金会是一个包容性项目，用于促进指导 JavaScript 生态中各种核心开源项目的发展，其主要任务是管理和资助这些项目，以及培育 JavaScript 生态。

Linux基金会确实好的很

gnome3 就用到了JS

Linux 基金会宣布成立了 <ruby> <a href="https://js.foundation/">  JS 基金会 </a> <rp>  （ </rp> <rt>  JS Foundation </rt> <rp>  ） </rp></ruby>，该基金会是一个包容性项目，用于促进指导 JavaScript 生态中各种核心开源项目的发展，其主要任务是管理和资助这些项目，以及培育 JavaScript 生态。

![](/data/attachment/album/201610/18/203733ibbn0ldz1gb0jnen.png)

### Linux 基金会已经对 JS 生态进行了大量投资

Node.js 社区内部分裂之后，Node.js 代码分成了两个不同的项目：io.js 和 Node.js。后来两个项目和好之后，在 2015 年， Linux 基金会帮助创立了 Node.js 基金会，两个项目合并代码并归于统一的 Node.js 基金会。

JS 基金会也遵循 Node.js 基金会的模式，基金会成员将会支持各种 JavaScript 项目，包括技术指导、人力资源和资金。

### IBM 和三星也是基金会成员

基金会的成员包括 Bocoup、IBM、Ripple、Samsung、Sauce Labs、Sense Tecnic Systems、SitePen、StackPath、University of Westminster 和 WebsiteSetup 等。

初始包括的项目有：Appium、 Chassis、 Dojo Toolkit、 ESLint、 Esprima、 Globalize、 Grunt、 Interledger.js、 Intern、 Jed、 JerryScript、 jQuery、 jQuery Mobile、 jQuery UI、 Lodash、 Mocha、 Moment、 Node-RED、 PEP、 QUnit、 RequireJS、 Sizzle 和 webpack。

这些大多数都是顶级的 JavaScript 项目，被成千上万的开发者们所使用。然而我们注意到， Node.js 项目由于有自己的基金会，并没有加入到 JS 基金会之中。

如果同意加入 JS 基金会，这些项目将会从公共开发战略中受益，以消除当今 JavaScript 社区中的混乱状况。基金会会设立所有项目共同遵循的目标，并为核心项目提供资金支持。这些核心项目现今用于服务器端应用、浏览器、云应用和物联网设备。

### jQuery 基金会变成了 JS 基金会

JS 基金会并不是凭空建立的，它的核心就是之前的 jQuery 基金会。虽然 jQuery 现在已经发展放缓，甚至很多开发者都[惊奇](http://developer.telerik.com/featured/is-jquery-still-relevant/) jQuery 仍然还活着，因为目前已经出现了各种更好的工具。 但是 jQuery 在某种意义上仍然是 JavaScript 的代名词。jQuery 基金会的很多成员在 JavaScript 领域内都很有影响力，所以成立新的 JS 基金会将有助于发挥它们的作用，促进 JavaScript 生态的进一步发展。


对 Chromium 去谷歌化

想要个是Qt壳的Chromium

“他分叉了 Chromium 的源代码”<br />
——翻译欠妥。

应该是fork。

那不是书签同步功能也没了

非得不翻译？这个词已经是非常普遍的一个词了，为何不能有个正式的译名?

我为什么不直接用srware iron

感觉没啥意思

### Chromium 没有你想象的自由

[UnGoogled Chromium](https://github.com/Eloston/ungoogled-chromium) 是一个 Chromium 浏览器的定制版本，但是不包括任何 Google 服务或功能。它不是一个 Google 的 Chrome 版本，而是一个 Chromium 版本——这是 Chrome、Vivaldi 和 Opera 等浏览器的开源代码母本。

虽然 Chromium 是一个开源项目，但是一直处于 Google 的影响之下，它的大多数贡献者都是 Google 工程师，因此 Chromium 的许多功能都包括了 Google 特有的服务。比如说，Chromium 预配置的搜索引擎是 Google、使用 Google 的 Safe Browsing API 来扫描每个你访问的 URL 的安全性，而且加载了一大堆的 Google 的二进制程序来提供各种内部服务。这意味着，许多用户数据仍然会被发往 Google 的服务器。

![](/data/attachment/album/201610/18/210534iuhoio5z0hhudu7e.jpg)

### 从 Chromium 中去除 Google 的部分

一位名为 Eloston 的开发者决定解决这个问题，他[分叉了 Chromium 的源代码](https://github.com/Eloston/ungoogled-chromium)，并移除了各种 Google 特有的服务。据其说，他移除了 Safe Browsing API、WebRTC、Omnibox 地址栏搜索功能，以及各种 Google 域名下的服务，比如 Google 主机检测器、Google URL 跟踪器、Google 云消息等等。他也移除了 Google 加入其中的所有闭源二进制，这会影响到一些功能，比如 URL 自动格式化（比如地址栏自动隐藏 https://）。

此外，UnGoogled Chromium 也会强制在新选项卡打开弹窗，并允许用户保存更多 URL 类型的数据。

从截图上，UnGoogled Chromium 和其它的基于 Chromium 的浏览器看起来差不多，但是底层有了不少变化。

### 下载和源代码

下载地址： <https://github.com/Eloston/ungoogled-chromium/releases/latest> ，支持 Debian、Ubuntu、Windows、macOS。

源代码：<https://github.com/Eloston/ungoogled-chromium>


谷歌的开源成绩单

Summary: 迄今为止，我们已经开源了超过 2 千万行的代码。现在谷歌在 GitHub 上已经有了 84 个组织和 3499 个项目仓库，而今年就创建了 773 个仓库！

testing good or bad,

test

Another test

开源软件让谷歌可以快速而有效地构建系统而不用重复造轮子，可以让我们专注于解决新问题。我们站在巨人的肩膀上，因此我们熟谙这一切。这就是为什么[我们支持开源](https://developers.google.com/open-source/)，而且让谷歌人可以轻松地将他们内部开发的项目以开源方式发布的原因。

![](/data/attachment/album/201610/19/132715wl44vfite6ipwc6b.jpg)

今天，我们发布了我们的第一个开源成绩单，展示我们最流行的项目、分享一些数据，并介绍一些我们在 2016 年发布的项目细节。

迄今为止，我们已经开源了超过 2 千万行的代码，你可以在我们的网站上找到[我们最知名的项目的列表](https://developers.google.com/open-source/projects)，下面是其中的一些：

* [Android](https://source.android.com/index.html) - 用于移动设备的软件族，包括操作系统、中间件和关键性应用。
* [Chromium](https://www.chromium.org/) - 它包括 Google Chrome 浏览器背后的 [Chromium](http://www.chromium.org/Home) 软件和 Google Chrome OS 设备背后的 [Chromium OS](http://www.chromium.org/chromium-os) 软件。
* [Angular](https://angular.io/) - 一个 JavaScript 和 Dart 的 web 应用框架，关注于开发者的生产力、开发速度和测试能力。
* [TensorFlow](https://www.tensorflow.org/) - 一个使用<ruby> 数据流图 <rp>  （ </rp> <rt>  data flow graphics </rt> <rp>  ） </rp></ruby>的数字计算库，支持从数据中心到嵌入式设备的跨平台的大规模机器学习。
* [Go](http://golang.org/) - 一种静态类型的编译型编程语言，富有表现力、简洁而高效。
* [Kubernetes](http://kubernetes.io/) - 一个可以自动分发、操作和缩放的容器化应用系统。
* [Polymer](https://www.polymer-project.org/) - 一个构建于 Web 组件 API 之上的轻量级库，用于构建在 Web 应用中可重用的封装元素。
* [Protobuf](https://developers.google.com/protocol-buffers/) - 一个可扩展的、语言无关和平台无关的串行化结构数据的机制。
* [Guava](https://github.com/google/guava) - 一套 Java 核心库，包括新的集合类型（比如 multimap 和 multiset）、<ruby> 不可变集合 <rp>  （ </rp> <rt>  immutable collections </rt> <rp>  ） </rp></ruby>、知识图谱库、<ruby> 函数类型 <rp>  （ </rp> <rt>  functional types </rt> <rp>  ） </rp></ruby>、内存缓存，以及并发 API/功能、I/O、哈希、<ruby> 基类型 <rp>  （ </rp> <rt>  primitives </rt> <rp>  ） </rp></ruby>、反射、字符串处理等等。
* [Yeoman](http://yeoman.io/) - 一个强壮而自足的框架工具集，它包括可以帮助开发者快速构建优美而引人入胜的 Web 应用的库和工作流。

统计谷歌开源的全部软件有点困难，不过我们可以从开源到 GitHub 上这部分软件获取一些有趣数据。现在谷歌在 GitHub 上已经有了 84 个组织和 3499 个项目仓库，而今年就创建了 773 个仓库！

谷歌人使用了从汇编到 XSLT 等等不计其数的各种编程语言，但是哪一个才是我们的最爱？GitHub 可以帮我们找到在这些软件仓库中我们使用最多的编程语言：

1. JavaScript
2. Java
3. C/C++
4. Go
5. Python
6. TypeScript
7. Dart
8. PHP
9. Objective-C
10. C#

我们可以通过 BigQuery 来了解各种 [GitHub 开源数据](https://opensource.googleblog.com/2016/06/github-on-bigquery-analyze-all-code.html)，比如[空格和制表符的使用对比](https://medium.com/@hoffa/400-000-github-repositories-1-billion-files-14-terabytes-of-code-spaces-or-tabs-7cfe0b5dd7fd)、[最流行的 Go 语言软件包](https://medium.com/google-cloud/analyzing-go-code-with-bigquery-485c70c3b451)等等。谷歌人在 GitHub 上的开源项目提交了多少次？我们可以通过搜索 Google.com 的邮件地址来知道谷歌人的最低限度的提交量，比如使用这样的查询：

```
SELECT count(*) as n
FROM [bigquery-public-data:github_repos.commits]
WHERE committer.date > '2016-01-01 00:00'
AND REGEXP_EXTRACT(author.email, r'.*@(.*)') = 'google.com'

```

用上面的查询，我们发现从今年开始，谷歌人在 GitHub 上的开源项目做了 142,527 次提交。这个数据集始于 2011 年，如果从那时开始统计，那么提交次数是 719,012。不过，这只是最低限度的数据，因为我们没有统计谷歌人使用其它邮件地址的提交。

让我们来看看 2016 年有哪些令人激动的地方。我们发布了开源[软件](https://opensource.googleblog.com/2016/04/cctz-v20-now-with-more-civil-time.html)、[硬件](https://opensource.googleblog.com/2016/07/announcing-open-source-adc-board-for.html)和[数据集](https://opensource.googleblog.com/2016/10/introducing-open-images-dataset.html)，今年发布的有这些：

#### Seesaw

[Seesaw](https://github.com/google/seesaw) 是一个基于 Linux 虚拟服务器（LVS）的负载平衡平台，是由我们的 SRE 工程师用 Go 语言开发的。就像其它的项目一样，它也是为了解决我们切身之痒而产生的。

在我们[发布它的公告](https://opensource.googleblog.com/2016/01/seesaw-scalable-and-robust-load.html)中提到：“我们需要有为<ruby> 单播 <rp>  （ </rp> <rt>  unicast </rt> <rp>  ） </rp></ruby>和<ruby> 选播 <rp>  （ </rp> <rt>  anycast </rt> <rp>  ） </rp></ruby> VIP 控制流量的能力，也需要对 NAT 和 DSR（也叫 DR）进行负载平衡，以及针对后端进行足够的健康检查。所有这些我们需要一个可以让我们轻松地管理的平台，包括自动分发改变的配置。”

#### <ruby> 供应商安全评估调查表 <rp>  （ </rp> <rt>  Vendor Security Assessment Questionnaire </rt> <rp>  ） </rp></ruby> (VSAQ)

每年我们需要评估几百个供应商的安全情况，并且我们开发了一个流程来通过 [VSAQ](https://github.com/google/vsaq) 自动化许多初始信息的收集。许多供应商发现我们的评估表直观而灵活，所以我们决定把它分享出来。VSAQ 框架包括可扩展的调查表模版，覆盖了 Web 应用、隐私程序、基础架构以及物理和数据中心安全。你可以在我们的[发布公告](https://opensource.googleblog.com/2016/03/scalable-vendor-security-reviews.html)中了解更多信息。

#### OpenThread

[OpenThread](http://github.com/openthread/openthread) 是由 [Nest](https://nest.com/) 发布的一个 [Thread](http://threadgroup.org/) 协议的完整实现，用于家庭连接设备。它非常重要，这是由于这个领域如我们所见是非常碎片化的。OpenThread 的开发得到了 ARM、微软、高通、德州仪器等主要厂商的支持。

#### Magenta

我们可以使用机器学习来创建吸引人的艺术和音乐吗？这个问题的答案就是动画 [Magenta](http://github.com/tensorflow/magenta)，这个项目来自于[谷歌大脑团队](https://research.google.com/teams/brain/)，基于 TensorFlow。它有助于推动机器智能在音乐和艺术创作中的发展，并为艺术家、程序员和机器学习研究人员构建了一个协作社区。阅读它的[发布公告](https://magenta.tensorflow.org/welcome-to-magenta)了解更多信息。

#### Omnitone

虚拟现实（VR）如果没有<ruby> 空域音频 <rp>  （ </rp> <rt>  spatial audio </rt> <rp>  ） </rp></ruby>还做不到身临其境，而许多的 VR 开发都是在专有平台上进行的。 [Omnitone](https://github.com/GoogleChrome/omnitone) 是一个由 Chrome 团队成员构建的开源库，它可以给该浏览器带来<ruby> 空域音频 <rp>  （ </rp> <rt>  spatial audio </rt> <rp>  ） </rp></ruby>。Omnitone 基于标准的 Web 音频 API 构建，可以提供具有现场感的体验，也被用于类似 [WebVR](https://webvr.info/) 这样的伴生项目。阅读该项目的[发布公告](http://google-opensource.blogspot.com/2016/07/omnitone-spatial-audio-on-web.html)了解更多信息。

#### <ruby> 科学日报 <rp>  （ </rp> <rt>  Science Journal </rt> <rp>  ） </rp></ruby>

当今的智能电话带有许多传感器，可以告诉我们周围很多有趣的信息。我们[启动](http://googleforeducation.blogspot.com/2016/05/inspiring-future-makers-and-scientists.html)了[科学](https://github.com/google/science-journal)[日报](https://github.com/google/science-journal-arduino)项目，以帮助教育工作者、学生和科学爱好者们利用这些传感器。更多信息可以参阅我们的[发布公告](http://google-opensource.blogspot.com/2016/08/opening-up-science-journal.html)。

#### Cartographer

[Cartographer](https://github.com/googlecartographer) 是一个以 2D 和 3D 方式即时定位与地图构建（SLAM）的库，支持<ruby> <a href="http://www.ros.org/about-ros/">  机器人操作系统 </a> <rp>  （ </rp> <rt>  Robot Operating System </rt> <rp>  ） </rp></ruby>（ROS）。它合并了多种传感器的数据，这个库可以计算位置和地图表面。这是自动驾驶汽车、UAV 和机器人的关键因素，并在[室内地图](https://www.zeitgeistminds.com/talk/5604289821016064/amit-sood-the-peoples-museum-amit-sood)方面做了很多努力。关于 Cartographer 的更多信息可以参阅其[发布公告](http://opensource.googleblog.com/2016/10/introducing-cartographer.html)。

这只是我们今年发布的一小部分例子，请继续关注谷歌开源博客，为谷歌的开源软件、硬件和数据而欢呼吧。


复刻：为 fork 的中文翻译定名

Summary: 据 Linux 中国翻译组（LCTT）的译者 dongfengweixiao 提议，可译作“复刻”，我们认为这是一个可取的译法，一方面照顾到了音译，另一方面其释义也形象直观。

复刻太正式，太正规， 希望搞一个轻快上口的翻译， 个人建议参考古义词

听着就很别扭，感觉就是为了翻译而翻译。

有时间折腾这些，不如多花掉时间翻译优秀资料，这样对社区贡献更大。而不是在纠结茴香豆有几种写法。

嗯，比昨天那个“分叉了”好听多了。

翻译啥，就用英语挺好的，都懂

请来参加 LCTT 。

古义词是什么？

我对此的看法是：

1、对于新出现的、使用频度较少的名词，可以暂时采用英文原文；

2、对于属于特定厂家的名词，比如 docker ，如果官方没有正式译名，就维持英文原文。而有了正式译名，比如红帽，就采用官方译名；

3、对于通用的名词，比如 Container，则进行翻译；

常用的，意义确定的名词，应该结合原意、发音来确定一个信雅达的翻译。

如果不翻译，何不保留所有英文名词？那就会和港台人说话一样，中英文混杂，还不如全用英文呢。

Star 是点赞？我呵呵。。。<br />
不懂就别瞎bb。。

复刻很好，就用这个

复刻有点说是一个年代很久的经典产品重新制造生产的意思。

您好, linux.cn 上一些术语标有英文对照. 是否有整理好的中英文对照表. 可否发布在 Github 上. 这样翻译的时候会方便一些, 谢谢

术语表是有，但是失于维护，并没有及时跟进文章中的翻译。事实上，大部分没有争议或常见的词汇，我们都不会单独标出，只有有争议，或没有约定俗称译法的，我们会以 ruby 标签的方式标出。

确实也有这个意思，而且两个意思相去有点远。

事实上，就是起到了这个作用。

不太建议用复刻，，git上的fork译成“派生”显然更好，unix函数里面那个fork译成复刻显然更加奇怪。。

事实上游戏行业早就大规模用复刻这个词了，通常指老游戏在不改变玩法和游戏性的前提下出新版本（一般是兼容新系统或者升级画面）。

派生不错，汉语博大精深，意译也是不错的选择！

好像以前一直翻译为‘派生’，不是已经很好了吗，‘’复刻‘’真难听。是不是实在没别的事做了，只能靠造词过日子了。

来自河北石家庄的 Chrome Mobile 54.0|Android 6.0 用户

“复刻”字面上看有不改变的意思，不适合这种翻译。“派生”字面上看没有不改变的意思。随着科技进步新名词不断出现，旧名词不断有新的含义，就让我为这个fork重新翻译一次吧！代码分支用“复开”！---------我在吹牛，请无视。

求你饶过这么一个简单的词吧！“香波”很好吗？

使用过 GitHub 的人大多知道它上面有个“Fork”的功能，用来将某个仓库克隆到你的账户之下，从而可以对其进行修改、衍生，也可以比较方便的将你的修改推回到原来的仓库（所谓的上游）。

随着 GitHub 的流行，我们经常能在各种文章中见到，“fork 某某项目”等说法，是的，“fork”这个一直没有一个正式的译名。

其实这个问题不独出现在 GitHub 中，fork 这个词更早的出现在 Unix/Linux 中的 C 语言编程之中。在 Unix/Linux 的进程模型中，fork 是指进程创建自身副本的操作，它通常是一个在内核中实现的系统调用。fork 是 Unix 类系统中进程创建的主要方式（历史上曾经是唯一的方式）。从那个时候起，fork 就一直没有一个确定的译名。

不过，我们认为，对于这样的一个经常使用的专业名词，有一个明确的译名比较适合，虽然大家都习惯了直接用 fork 一词。

![](/data/attachment/album/201610/19/231239zo9ouougoaxg72qq.jpg)

fork 一词在英文中的原意是“叉子”， 虽然翻译成“分叉”、“分支”似乎也可以，但是前者较少用做动词，后者则和 Branch 的译名重复混淆。

据 Linux 中国翻译组（LCTT）的译者 dongfengweixiao 提议，可译作“**复刻**”，我们认为这是一个可取的译法，一方面照顾到了音译，另一方面其释义也形象直观。

*补充 1，“复刻”这样的译法，在网络上已存在，包括[中文维基](https://zh.wikipedia.org/wiki/复刻_(软件工程))中也采用该译法，只是并未得到公认和流行。*

*补充 2，据 @爱开源魅影 称，[git 软件包里面](https://github.com/git/git/blob/master/po/zh_CN.po)，蒋新将“fork”译为“派生”。似也可取。*

既然说到这里，顺便我们对<ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby>做一个技术方面的简介吧。

### <ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby> GitHub 仓库

在 GitHub 上评价一个项目（仓库）是否流行，其中一个重要指标就是其<ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby>数。

>
> 在 GitHub 上参与一个开源项目的程度有三个阶段：
>
>
> * star（点赞），如果你觉得某个项目不错，可以为其点赞（star）
> * watch（关注），如果你希望进一步关注这个项目的进展，可以关注（watch）它
> * fork（复刻），如果你还想进一步为这个项目做一些贡献，可以复刻（fork）它到你自己的账户下，做出了修改之后通过 Pull-Request（PR）方式将你的改动推回给原仓库（上游），如果被接纳就会进入到原仓库之中
>
>
>

显然，一个项目的复刻数越高，代表着贡献者越多。

通过<ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby> + PR 的方式对开源项目进行贡献的流程类似下图：

![](/data/attachment/album/201610/19/224655weu0k5x8c8pz8r7e.png)

我们知道 GitHub 是运行在 Git 之上的，GitHub 中的<ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby>其本质上是 Git 中的<ruby> 克隆 <rp>  （ </rp> <rt>  clone </rt> <rp>  ） </rp></ruby>。关于 GitHub 中的复刻的进一步介绍，可以参考“[在 Github 和 Git 上 fork 之简单指南](/article-4292-1.html)”一文。

顺便说一句，我们的 [LCTT 翻译组](https://lctt.github.io/)就是通过<ruby> 复刻 <rt>  fork </rt></ruby> + PR 的方式运作的，这也是 GitHub 上绝大多数开源项目的运作方式。

### <ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby>子进程

在 Unix 下的 C 语言编程中，通过 fork() 系统调用来对进程本身进行复制，然后被复制出来的子进程就可以执行不同于父进程的操作，或通过 exec() 运行其它进程。典型的 C 代码如下：

```
fpid = fork();

if (fpid < 0)
    printf("error in fork!");
else if (fpid == 0) {
    printf("i am the child process, my process id is %d/n",getpid());
} else {
    printf("i am the parent process, my process id is %d/n",getpid());
}
```

所有的服务器守护进程，包括你所见到的 Web 服务、MySQL 数据库服务等，都是通过这种方式来产生子进程来提供服务的。甚至，整个 Linux/Unix 中的进程，除了 init 进程本身之外，都是由 init 进程<ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby>出来的。关于服务器编程方面的<ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby>的使用，可以进一步参阅“[搭个 Web 服务器（三）](/article-7847-2.html)”一文。

### <ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby>炸弹

其实，不只是 C 语言里面有<ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby>的功能，在 shell 里面也有，想必大家可能都听说过 “fork 炸弹”，这就是利用函数的迭代执行，无限<ruby> 复刻 <rp>  （ </rp> <rt>  fork </rt> <rp>  ） </rp></ruby>出许多子进程，从而耗尽系统资源，导致系统崩溃的一个恶意（玩笑）用法。

![](/data/attachment/album/201610/19/231727pyy9mq8y7ooyeeel.jpg)

复刻炸弹有很多种形式，不过最简洁的可能就是如上图的这个了，关于这个炸弹的具体解释，可以参阅“[经典的 Fork 炸弹解析](/article-5685-1.html)”，在此就不赘述了。

如果你对 fork 的翻译有不同的意见，欢迎留言评论。


当 Rust 遇上 Fedora

Summary: Rust 是一种系统编程语言，它运行速度惊人，并且可以避免几乎所有的崩溃、内存区块错误 以及数据竞争。你也许会质疑为什么我们还需要又一种这样的语言，因为已经有很多同类的语言了。这篇文章将会告诉你为什么。

Hello, Rust is running on Fedora 25 Alpha!<br />
真好，又学会一种编程语言！！！

哼，标题党~~~

好吧，其实，我就是觉得看了这篇，感觉 Rust 好棒啊！

那赶快来学习吧233

学习学习！

实际用过之后发现Rust并没有多好用，连var i; var j = (i = 1)都会得到意想不到结果

可以给项目组提 issue，还需改进 :)

问题是，你这样的语法是想表达什么？

![](/data/attachment/album/201610/20/084534czc55b701z8g36cl.jpg)

### Rust 是什么？

Rust 是一种系统编程语言，它运行速度惊人，并且可以避免几乎所有的崩溃、[内存区块错误](https://wikipedia.org/wiki/Segmentation_fault) 以及数据竞争。你也许会质疑为什么我们还需要又一种这样的语言，因为已经有很多同类的语言了。这篇文章将会告诉你为什么。

### 安全性 vs. 控制权

![](/data/attachment/album/201610/20/084548zqum564qt5848zkz.png)

你也许见过上面的图谱。一边是 C/C++，对运行的硬件拥有更多的控制权，因此它可以让开发者通过对所生成的机器代码进行更精细的控制来优化性能。然而这不是很安全，这很容易造成内存区块错误以及像 [心血漏洞](https://fedoramagazine.org/update-on-cve-2014-0160-aka-heartbleed/) 这样的安全漏洞。

另一边是像 Python、Ruby 和 JavaScript 这种没有给予开发者多少控制权但是可以创建出更安全的代码的语言。虽然这些代码可以生成相当安全并且可控的异常，但是它们不会造成内存区块错误。

在图谱中间的区域是 Java 和一些其它混合了这些特性的语言。它们提供对运行的硬件部分控制权，并且尝试尽量减少漏洞的出现。

Rust 有点不太一样，它并没有出现在这个图谱上。它同时提供给开发者安全性和控制权。

### Rust 的特性

Rust 是一种像 C/C++ 一样的系统编程语言，除此之外它还给予开发者对内存分配细粒度的控制。它不需要垃圾回收器。它的<ruby> 运行环境 <rp>  （ </rp> <rt>  runtime </rt> <rp>  ） </rp></ruby>很小，运行速度接近于在裸机上的运行。它为开发者提供了代码性能更大的保证。此外，任何了解 C/C++ 的人都能读懂以及编写 Rust 的代码。

Rust 的运行速度非常快，因为它是一种编译语言。它使用 LLVM 作为编译器的后端，并且还可以利用一大堆优化。在许多领域，它的性能都要高于 C/C++。它像 JavaScript、Ruby 和 Python 一样，与生俱来就是安全的，这意味着它们不会造成内存区块错误、<ruby> 野指针 <rp>  （ </rp> <rt>  dangling pointers </rt> <rp>  ） </rp></ruby>或者<ruby> 空指针 <rp>  （ </rp> <rt>  null pointers </rt> <rp>  ） </rp></ruby>。

另外一个很重要的特性就是消除数据竞争。如今，大多数计算机都具有多个核心，许多线程并发运行。然而，开发者很难编写好的并行代码，因此这个特性除去了他们的后顾之忧。Rust 使用两个关键概念来消除数据竞争：

* <ruby> 所有权 <rp>  （ </rp> <rt>  Ownership </rt> <rp>  ） </rp></ruby>。每一个变量都被移动到一个新的位置，并防止通过先前的位置来引用它。每一个数据块只有一个所有者。
* <ruby> 借用 <rp>  （ </rp> <rt>  Borrowing </rt> <rp>  ） </rp></ruby>。被拥有的值可以借用，以允许在一段时间内使用。

### 在 Fedora 24 和 25 上使用 Rust

若要开始使用，只需安装软件包：

```
sudo dnf install rust

```

示例代码 `helloworld.rs`：

```
fn main() {
    println!("Hello, Rust is running on Fedora 25 Alpha!");
}

```

 编译并执行：

```
rustc helloworld.rs
./helloworld

```

在 Fedora 上可以执行以下命令来安装最新的测试版本：

```
sudo dnf --enablerepo=updates-testing --refresh --best install rust

```

---

via: <https://fedoramagazine.org/rust-meets-fedora/>

作者：[Sumantro Mukherjee](https://fedoramagazine.org/author/sumantrom/) 译者：[OneNewLife](https://github.com/OneNewLife) 校对：[wxy](https://github.com/wxy)

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


概览最有前景的下一代嵌入式 Linux 软件更新机制

自由开源才重要，本地化源ISO同样重要。

![](/data/attachment/album/201610/20/090801m4eqwswbbb4wh5gb.jpg)

随着像 APT 和 Yum 等传统包管理解决方案渐渐老去，并且不适用于嵌入式和 IoT 等 Linux 的大量新兴领域，新一代的基于原子化的 Linux 软件升级方案应运而生。Konsulko Group 的 Matt Porter 在本周的 2016 年欧洲嵌入式 Linux 峰会（LCTT 译注：于 2016 年 10 月 11-13 日在德国柏林召开）为大家对比了这些新技术的不同点。

目前已有多个 Linux 软件商使用增量原子更新方式来传递更可靠的发行版更新，通过二进制差异实现更小体积的更新，假如出现意外状况也运行回退。这些新的发行版升级机制包含了 SWUpdate、Mender、OSTree 和 swupd。但有趣的是，幻灯片之中并没有提及 Ubuntu 的 Snappy。

SWUpdate 一种单/双镜像的模块化升级框架，支持镜像签名、可以使用 Kconfig 来进行配置、能够处理本地或者远程升级等。[SWUpdate](https://github.com/sbabic/swupdate) 简直就是为嵌入式系统设计的。

而 [Mender](https://github.com/mendersoftware/mender) 则是以无线传输进行升级位目标的升级方案。它是用 Go 编程语言编写的双镜像升级框架。

[OSTree](https://github.com/ostreedev/ostree) 是此次增量原子升级方案演示中最有名气的，它类似于 Git。Fedora 和 RedHat 都有它的身影，甚至 Gnome 的 Flatpak 容器系统也使用了 OSTree。

Swupd 是最后展示的一个升级系统，是由 Intel 的 Clear Linux 发行版率先使用的升级方案。它的代码放在 [GitHub](https://github.com/clearlinux/swupd-client)，而它的客户端和服务端则由 Clear Linux 托管。Swupd 与 OSTree 相似，但它不必重启就可以启用更新。

而那些在本次柏林召开的欧洲嵌入式 Linux 峰会中没有提及的，你也可以访问 [这些 PDF 讲演稿](http://events.linuxfoundation.org/sites/events/files/slides/Comparison%20of%20Linux%20Software%20Update%20Technologies.pdf) 来了解这些专注于嵌入式 Linux 的软件更新机制。

---

via: <http://phoronix.com/scan.php?page=news_item&px=ELC2016-Software-Updates>

作者：[Michael Larabel](http://www.michaellarabel.com/) 译者：[GHLandy](https://github.com/GHLandy) 校对：[wxy](https://github.com/wxy)

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


在手机上轻松安装 Ubuntu Touch OS

没有的手机型号在选择机型页面选哪个？

厉害了我的哥

同问

来自山东青岛青岛科技大学的 Microsoft Edge 14.14393|Windows 10 用户

同问

同问

同问

我也纳闷。

nexus 6p 用户表示不知所措

没有的就是没测试过，未必行。

之前看到有小米也刷过ubuntu

这个吊炸了

有没有可能通过这个方式去除YunOS这个垃圾，换装Android呢？

一加只有第一代支持，一样后续机型也能得到支持，特别是1+2

小米2应该能也刷！万能机皇！为什么没有小米2呢！！唉~ubuntu touch能快点嘛！我的手提已经换以mac pro了！！之前那一台键盘错了个J键！！！好郁闷！！vim 用不了！好辛苦！现在才跟我说！要ubuntu刷！！唉~！看来我要去修个键盘了！

adb devices 找得到设备

结果在刷的时候却提示

#Detecting device

#Device not found

#Back to menu

---

Mac 10.12下Ubuntu 16.04虚拟机

未必行也可以试试啊，家里有一个淘汰的旧手机想试试，不知道选哪个，还是随便选一个？

不可以搞双系统？

联发科手机看样子应该是不行了

然而一切都是假象，国内的网下载固件的时候各种被连接中断

哈哈，可以。然而...

Supported devices

BQ Aquaris E4.5 (krillin)

BQ Aquaris E5 HD (vegetahd)

BQ Aquaris M10 HD (cooler)

BQ Aquaris M10 FHD (frieza)

Meizu MX 4 (arale)

Meizu Pro 5 (turbo)

LG Nexus 4 (mako)

LG Nexus 5 (hammerhead)

Asus Nexus 7 2013 WiFi (flo)

Asus Nexus 7 2013 LTE (deb)

Asus Nexus 7 2012 3G (tilapia)

Asus Nexus 7 2012 WiFi (grouper)

Samsung Nexus 10 (manta)

OnePlus One (bacon)

Fairphone 2 (FP2) !!May not work!!

下载不了。。我ubuntu现在都没全局代理过，，郁闷，，，，求教程！全局代理  至少能用的，，，谷歌上搜索的 很多办法用不了呀～～～

下载不了这个工具啊

我的五儿子安装成功！！！谢谢！！！

恭喜！如果可以，写点东西出来分享分享~

完全按照本文写的操作就行，挺简单的，主要问题在于国内下载会被中断，弄了好几天才成功

可以写点使用感受之类的给大家分享下~

说实话，其实没有之前五儿子自带的原生系统好用，可能也是因为是手机不能像电脑操作那么方便的缘故。首先没有桌面，用着可能不太习惯；然后就是支持的软件少了点，而且我的手机上浏览器还不能用，总是闪退，这点比较蛋疼。有点就是显示很漂亮，细节处理的很好，很ubuntu，接打电话啥的没问题。总体来说能安装的尽量安装玩一玩，尝试一下，可以当作备用机使用，不建议当作主机使用。

UbuntuFun.de 的 Marius Quabeck 开发了一个名为 [magic-device-tool](https://github.com/MariusQuabeck/magic-device-tool) 的新工具，可以使用它在你的手机上轻松地安装 Ubuntu Touch 移动操作系统。这个工具刚刚发布了第一个稳定版本 magic-device-tool 1.0，现在任何人都可以用它将 Ubuntu Touch OS 安装到自己的设备上了，除此以外，也可以通过它来安装 Android、Cyanogenmod 或 Phoenix OS。

也就是说，你现在可以替换你的移动设备上的操作系统，无论是最新的 Ubuntu Touch OS、Cyanogenmod（GAPPS 有或没有）、原厂 Android 镜像，以及 Phoenix OS ，都可以在这个批处理工具的帮助下安装到你的移动设备上。不过要注意的是，你仅能运行上述的操作系统之一，当然你可以再次刷机。

![](/data/attachment/album/201610/20/094211x1szyqqrznb1llny.jpg)

### 所支持的设备

不是每种设备都能支持，这里是它所测试成功的设备：BQ Aquaris E4.5、 BQ Aquaris E5 HD、 BQ Aquaris M10 HD、 BQ Aquaris M10 FHD、 魅族 MX 4、 魅族 Pro 5、 LG Nexus 4、 LG Nexus 5、 Asus Nexus 7 2013 WiFi、 Asus Nexus 7 2013 LTE、 Asus Nexus 7 2012 3G、 三星 Nexus 10、 一加 One、以及 Fairphone 2 (FP2)。如果你在其它的设备上测试成功，欢迎反馈给作者。

这个工具也可以用于为你的设备创建备份、恢复备份，锁定或解锁 bootloader，安装 TWRP 恢复程序。

想试试吗？请使用如下命令从 GitHub 获取最新的版本并运行它，需要注意的是，它仅在 Ubuntu 16.04 和 Ubunut 16.10 下成功运行：

```
git clone https://github.com/MariusQuabeck/magic-device-tool.git
cd magic-device-tool
chmod +x launcher.sh
./launcher.sh
```

请观看视频：

刷机成功后，请来分享你的经验吧。


有理想，有追求的系统管理员会在 Linux 中成长

物理机直接上Debian Gnu/Linux已经很多年了，主要感觉Debian Gnu/Linux提供的全组件ISO创建本地源实在是非常方便，比任何一个发行版都好一点点，在单一发行版本中体现组件的模块化，需要什么功能直接装下就好了。APT-GET提供冲突监测，并保证安装组之间的不兼容冲突并进行选择。确实为用户想得多一点点。不用浪费无意义的流量和时间在寻找和设置源的问题上。不能自由下载其实本身就是一种不自由。也让用户感受到了某种未知的阻隔导致用户用脚投票

有优必有缺，本地源的方便抵消了及时更新

![](/data/attachment/album/201610/20/224937njkchsgixcknwtkj.png)

我第一次看到运行着的 Linux 操作系统是在我的首份工作时，大约是在 2001 年。当时我在澳大利亚的一家汽车业供应商担任客户经理，和公司的 IT 工程师共用一间办公室。他做了一台 CD 刻录工作站（一个可以同时刻录好几张 CD 的巨大的东西），然后我们可以把汽车零配件目录刻录到 CD 并送给客户。刻录工作站最初是为 Windows 设计的，但是他一直没能让刻录机正常工作。最终他放弃在 Windows 上使用的念头并且换成在 Linux 上使用，刻录机完美工作了。

对我来说，Linux 的一切都是晦涩难懂的。大部分工作都在看起来像 DOS（LCTT 译注：磁盘操作系统，早期的个人电脑操作系统） 的命令行下完成，但它更加强大（后来我才认识到这一点）。我从 1993 年就开始使用 Mac 电脑，在那个时候，在我看来命令行界面有点过时了。

直到几年后——我记得是 2009 年，我才真正的认识 Linux。那时我已经移民荷兰并且在一家零售供应商那里找到了工作。那是一个只有 20 人的小公司，我除了做一个关键客户经理的正常工作，还无意间成了个一线 IT 技术支持。只要东西有了故障，他们总是会在花大价钱请外部 IT 顾问之前先来询问我。

我的一个同事因为点击了一封似乎来自 DHL（LCTT 译注：全球著名的邮递和物流集团 Deutsche Post DHL 旗下公司） 的电子邮件所附带的一个 .exe 文件而受到了一次网络钓鱼攻击。（是的，这的确发生了。）他的电脑被完全入侵了，他什么事都做不了。甚至完全格式化电脑都不起作用，好像病毒只靠它丑陋的脑袋就能活下来。我在后来才了解到这种情况可能是病毒被复制到了 MBR（主引导记录）里。而此时，为了节约成本，公司已经终止了和外部 IT 顾问的合同。

于是我帮助同事安装了 Ubuntu 操作系统让他继续工作，这的确很有效。他的电脑再次嗡嗡的运转了，而且我找到了他们工作必需的所有应用。我承认，从某些方面来说这不是最优雅的解决方案，不过他（包括我）喜欢这个操作系统的流畅度和稳定性。

然而我的同事在 Windows 世界形成的观念根深蒂固，他无法习惯新的使用方式，开始不停的抱怨。（很耳熟吧？）

虽然我的同事不能忍受新的使用方式，但我发现到这对我这个 Mac 用户已经不是一个问题。它们之间有很多相似点，我被迷住了。所以我在我工作用的笔记本电脑上又安装了一个 Ubuntu 组成双系统，我的工作效率提高了，让机器做我想做的事也变得更容易。从那时起我有规律的使用了几个 Linux 发行版，但我最喜欢 Ubuntu 和 Elementary。

当时我失业了，因此我有大量的时间给自己充电。由于我一直对 IT 行业很感兴趣，所以我致力于研究对 Linux 操作系统的管理。但是目前得到一个展示学识的机会太难了，因为我多年来所学的 95% 都不能简单的通过邮寄一份简历展示出来。我需要一个入职面试来展示我所知道的东西，所以我进行了 Linux 认证得到证书，希望能给我一些帮助。

我对开源做贡献已经有好一阵子了。刚开始时是为 xTuple ERP（LCTT 译注：世界领先的开源 ERP 软件）做翻译工作（英语译德语），现在已经转为在 Twitter 上做 Mozilla 的“客户服务”，提交 bug 报告等。我为自由和开源软件做推广宣传（取得了不同程度的成功）并且尽我所能在财政方面支持一些 FOSS（LCTT 译注：自由及开源软件）倡导组织（DuckDuckGo、bof.nl、EFF、GIMP、LibreCAD、维基百科以及其他）。目前我也在准备设立一个本地的隐私咖啡馆（LCTT 译注：这是荷兰的一个旨在强化网上个人隐私安全的咖啡馆/志愿者组织，参见： <https://privacycafe.bof.nl/>）。

除此之外，我已经开始写我的第一本书。这应该是一本涉及计算机隐私和安全领域的简易实用手册，适用于普通计算机用户，我希望它能在今年年底自主出版。（这本书遵循知识共享许可协议 CC。）至于这本书的内容，正如你预料的那样我会详细解释为什么隐私如此重要，以及“我没有什么需要隐藏“这种思想错的有多么离谱。但是最主要的部分还是指导读者如何避免让人讨厌的广告追踪，加密你的硬盘和邮件，通过 OTR（LCTT 译注：一种安全协议，为即时通讯提供加密保护）网上聊天，如何使用 TOR（LCTT 译注：第二代洋葱路由，可以在因特网上进行匿名交流）等等。虽然起初说这是一个手册，但我尽量会使用随和的语调来叙述，并且会根据精彩的我亲身经历的故事让它更加通俗易懂。

我依然爱着我所有的 Mac，只要买得起（主要因为它那伟大的构造），我还会使用它们，但是我的 Linux 一直在虚拟机里完成我的几乎所有的日常工作。没有什么不可思议的，不是自夸：文档编辑（LibreOffice 和 Scribus），建立我的网页和博客（Wordpress 和 Jekyll），编辑图片（Shotwell 和 Gimp），听音乐（Rhythmbox），以及几乎其他任何工作。

不论我最后怎么找到工作，Linux 永远都是我必用的操作系统。

---

via: <https://opensource.com/life/16/5/my-linux-story-rene-raggl>

作者：[Rene Raggl](https://opensource.com/users/rraggl) 译者：[fuowang](https://github.com/fuowang) 校对：[wxy](https://github.com/wxy)


用 Ansible 来交付 Vagrant 实例

Summary: Ansible 是一款系统管理员进行自动化运维的强大工具。Ansible 让配置、交付、管理各种容器、软件部署变得非常简单。这篇文章介绍用 Ansible 来配置 Vagrant 实例，它是一个配置好的基础虚拟机映像，包含了开发环境中需要用到的工具。

![](/data/attachment/album/201610/21/091639zf4wsqslsz3g5002.jpg)

Ansible 是一款系统管理员进行自动化运维的强大工具。Ansible 让配置、交付、管理各种容器、软件部署[变得非常简单](https://ansible.com/)。基于轻量级模块的架构非常适合系统管理，一个优点就是如果某个节点没有被 Ansible 管理的话，它的资源就不会被使用。

这篇文章介绍用 Ansible 来配置 [Vagrant 实例](https://www.vagrantup.com/)，它是一个配置好的基础虚拟机映像，包含了开发环境中需要用到的工具。你可以用它来部署开发环境，然后和其他成员协同工作。用 Ansible，你可以用你的开发包自动化交付 Vagrant 实例。

我们用 Fedora 24 做主机，用 [CentOS](https://centos.org/) 7 来作 Vagrant 实例。

### 设置工作环境

在用 Ansible 配置 Vagrant 实例时，你需要做几件准备的事情。首先在宿主机上安装 Ansible 和 Vagrant，在你的主机上运行下面的命令来安装：

```
sudo dnf install ansible vagrant vagrant-libvirt

```

上面的命令将 Ansible 和 Vagrant 在你的宿主机上，以及包括 Vagrant 的 libvirt 接口。Vagrant 并没有提供托管你的虚拟机的功能，它需要第三方工具比如：libirt、VirtualBox、VMWare 等等。这些工具可以直接与你的 Fedora 系统上的 libvirt 和 KVM 协同工作。

接着确认你的账户在正确的 wheel 用户组当中，确保你可以运行系统管理员命令。如果你的账号在安装过程中就创建为管理员，那么你就肯定在这个用户组里。运行下面的命令查看：

```
id | grep wheel

```

如果你能看到输出，那么你的账户就在这个组里，可以进行下一步。如果没有的话，你需要运行下面的命令，这一步需要你提供 root 账户的密码，将 <username> 换成你的用户名：

```
su -c 'usermod -a -G wheel <username>'

```

然后，你需要注销然后重新登录，确保在用户组里。

现在要建立你的第一个 Vagrant 实例了，你需要用 Ansible 来配置它。

### 设置 Vagrant 实例

配置一个镜像实例之前，你需要先创建它。创建一个目录，存放 Vagrant 实例相关的文件，并且将它作为当前工作目录，用下面这条命令：

```
mkdir -p ~/lampbox && cd ~/lampbox

```

在创建镜像实例之前，你需要搞清楚目的，这个镜像实例是一个运行 CentOS 7 基础系统，模板包括 Apache 的 Web 服务，MariaDB（MySQL 原开发者创建的一个流行的开源数据库）数据库和 PHP 服务。

初始化 Vagrant 实例，用 `vagrant init` 命令：

```
vagrant init centos/7

```

这个命令初始化 Vagrant 实例，并创建一个名为 Vagrantfile 的文件，包含一些预先配置的变量。打开并编辑它，下面的命令显示了用于这次配置的基本镜像实例。

```
config.vm.box = "centos/7"

```

现在设置端口转发，以便你配置完毕 Vagrant 实例并让它运行起来之后可以测试它。将下述配置加入到 Vagrantfile 的最终的 `end` 语句之前：

```
config.vm.network "forwarded_port", guest: 80, host: 8080

```

这个命令将 Vagrant 实例 的 80 端口映射为主机的 8080 端口。

下一步是设置 Ansible 作为配置 Vagrant 实例的工具，将下述配置加入到 Vagrantfile 最终的 `end` 语句之前，将 Ansible 作为<ruby> 配置工具 <rp>  （ </rp> <rt>  provisioning provider </rt> <rp>  ） </rp></ruby>：

```
config.vm.provision :ansible do |ansible|
  ansible.playbook = "lamp.yml"
end

```

（必须将这三行在最后的 `end` 语句之前加入）注意 `ansible.playbook = "lamp.yml"` 这一句定义了配置镜像实例的 Ansible playbook 的名字。

### 创建 Ansible playbook

在 Ansible 之中，playbook 是指在你的远端节点执行的策略，换句话说，它管理远端节点的配置和部署。详细的说，playbook 是一个 Yaml 文件，在里面写入你要在远端节点上将要执行的任务。所以，你需要创建一个名为 lamp.yml 的 playbook 来配置镜像实例。

在 Vagrantfile 相同的目录里创建一个 lamp.yml 文件，将下面的内容粘贴到文件当中：

```
---
- hosts: all
  become: yes
  become_user: root
  tasks:
  - name: Install Apache
    yum: name=httpd state=latest
  - name: Install MariaDB
    yum: name=mariadb-server state=latest
  - name: Install PHP5
    yum: name=php state=latest
  - name: Start the Apache server
    service: name=httpd state=started
  - name: Install firewalld
    yum: name=firewalld state=latest
  - name: Start firewalld
    service: name=firewalld state=started
  - name: Open firewall
    command: firewall-cmd --add-service=http --permanent

```

每一行代表的意思：

* `hosts: all` 指定该 playbook 需要在 Ansible 配置文件中定义的所有主机上都执行，因为还没定义主机， playbook 将只在本地运行。
* `sudo: true` 表明该任务需要用 root 权限运行。（LCTT 译注：此语句上述配置中缺失。）
* `tasks:` 指定当 playbook 运行是需要执行的任务，在这一节之下：
	+ `name: ...` 描述任务的名字
	+ `yum: ...` 描述该任务应该由 yum 模块执行，可选的 key=value 键值对将由 yum 模块所使用。

当 playbook 运行时，它会安装最新的 Apache Web 服务（http），MariaDB 和 PHP。当安装完毕并启动防火墙 firewalld，给 Apache 打开一个端口。你可以通过编写 playbook 来完成这些。现在可以配置它了。

### 配置镜像 实例

用 Ansible 配置 Vagrant 实例只需要以下几步了：

```
vagrant up --provider libvirt

```

上面的命令运行 Vagrant 实例，将实例的基础镜像下载到宿主机当中（如果还没下载的话），然后运行 lamp.yml 来进行配置。

如果一切正常，输出应该和下面的例子类似：

![](/data/attachment/album/201610/21/091640ldafzermm4or34k8.png)

这个输出显示镜像实例已经被配置好了，现在检查服务是否可用，在宿主机上打开浏览器，输入 `http://localhost:8080`，记住本地主机的 8080 端口是 Vagrant 实例映射过来的 80 端口。你应该可以看到如下的 Apache 的欢迎界面。

![](/data/attachment/album/201610/21/091642qa5zk5xka6c6gw32.png)

要修改你的 Vagrant 实例，你可以修改 lamp.yml，你能从 Ansible 的[官网](http://docs.ansible.com/ansible/index.html)上找到很多文章。然后运行下面的命令来重新配置：

```
vagrant provision

```

### 总结

现在我们知道怎么用 Ansible 来配置 Vagrant 实例了。这只是一个基本的例子，但是你可以用这些工具来实现不同的例子。比如你可以用所需工具的最新版本来部署一个完整的应用。现在你可以用 Ansible 来配置你自己的远端服务器和容器了。

---

via: <https://fedoramagazine.org/using-ansible-provision-vagrant-boxes/>

作者：[Saurabh Badhwar](http://h4xr.id.fedoraproject.org/) 译者：[jiajia9linuxer](https://github.com/jiajia9linuxer) 校对：[wxy](https://github.com/wxy)

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