2016年7月

这是 LXD 2.0 系列介绍文章的第一篇。

  1. LXD 入门
  2. 安装与配置
  3. 你的第一个 LXD 容器
  4. 资源控制
  5. 镜像管理
  6. 远程主机及容器迁移
  7. LXD 中的 Docker
  8. LXD 中的 LXD
  9. 实时迁移
  10. LXD 和 Juju
  11. LXD 和 OpenStack
  12. 调试,及给 LXD 做贡献

关于 LXD 几个常见问题

什么是 LXD ?

简单地说, LXD 就是一个提供了 REST API 的 LXC 容器管理器。

LXD 最主要的目标就是使用 Linux 容器而不是硬件虚拟化向用户提供一种接近虚拟机的使用体验。

LXD 和 Docker/Rkt 又有什么关系呢 ?

这是一个最常被问起的问题,现在就让我们直接指出其中的不同吧。

LXD 聚焦于系统容器,通常也被称为架构容器。这就是说 LXD 容器实际上如在裸机或虚拟机上运行一般运行了一个完整的 Linux 操作系统。

这些容器一般基于一个干净的发布镜像并会长时间运行。传统的配置管理工具和部署工具可以如在虚拟机、云实例和物理机器上一样与 LXD 一起使用。

相对的, Docker 关注于短期的、无状态的、最小化的容器,这些容器通常并不会升级或者重新配置,而是作为一个整体被替换掉。这就使得 Docker 及类似项目更像是一种软件发布机制,而不是一个机器管理工具。

这两种模型并不是完全互斥的。你完全可以使用 LXD 为你的用户提供一个完整的 Linux 系统,然后他们可以在 LXD 内安装 Docker 来运行他们想要的软件。

为什么要用 LXD?

我们已经持续开发并改进 LXC 好几年了。 LXC 成功的实现了它的目标,它提供了一系列很棒的用于创建和管理容器的底层工具和库。

然而这些底层工具的使用界面对用户并不是很友好。使用它们需要用户有很多的基础知识以理解它们的工作方式和目的。同时,向后兼容旧的容器和部署策略也使得 LXC 无法默认使用一些安全特性,这导致用户需要进行更多人工操作来实现本可以自动完成的工作。

我们把 LXD 作为解决这些缺陷的一个很好的机会。作为一个长时间运行的守护进程, LXD 可以绕开 LXC 的许多限制,比如动态资源限制、无法进行容器迁移和高效的在线迁移;同时,它也为创造新的默认体验提供了机会:默认开启安全特性,对用户更加友好。

LXD 的主要组件

LXD 是由几个主要组件构成的,这些组件都出现在 LXD 目录结构、命令行客户端和 API 结构体里。

容器

LXD 中的容器包括以下及部分:

  • 根文件系统(rootfs)
  • 配置选项列表,包括资源限制、环境、安全选项等等
  • 设备:包括磁盘、unix 字符/块设备、网络接口
  • 一组继承而来的容器配置文件
  • 属性(容器架构、暂时的还是持久的、容器名)
  • 运行时状态(当用 CRIU 来中断/恢复时)

快照

容器快照和容器是一回事,只不过快照是不可修改的,只能被重命名,销毁或者用来恢复系统,但是无论如何都不能被修改。

值得注意的是,因为我们允许用户保存容器的运行时状态,这就有效的为我们提供了“有状态”的快照的功能。这就是说我们可以使用快照回滚容器的状态,包括快照当时的 CPU 和内存状态。

镜像

LXD 是基于镜像实现的,所有的 LXD 容器都是来自于镜像。容器镜像通常是一些纯净的 Linux 发行版的镜像,类似于你们在虚拟机和云实例上使用的镜像。

所以可以「发布」一个容器:使用容器制作一个镜像并在本地或者远程 LXD 主机上使用。

镜像通常使用全部或部分 sha256 哈希码来区分。因为输入长长的哈希码对用户来说不方便,所以镜像可以使用几个自身的属性来区分,这就使得用户在镜像商店里方便搜索镜像。也可以使用别名来一对一地将一个用户好记的名字映射到某个镜像的哈希码上。

LXD 安装时已经配置好了三个远程镜像服务器(参见下面的远程一节):

  • “ubuntu”:提供稳定版的 Ubuntu 镜像
  • “ubuntu-daily”:提供 Ubuntu 的每日构建镜像
  • “images”: 社区维护的镜像服务器,提供一系列的其它 Linux 发布版,使用的是上游 LXC 的模板

LXD 守护进程会从镜像上次被使用开始自动缓存远程镜像一段时间(默认是 10 天),超过时限后这些镜像才会失效。

此外, LXD 还会自动更新远程镜像(除非指明不更新),所以本地的镜像会一直是最新版的。

配置

配置文件是一种在一个地方定义容器配置和容器设备,然后将其应用到一系列容器的方法。

一个容器可以被应用多个配置文件。当构建最终容器配置时(即通常的扩展配置),这些配置文件都会按照他们定义顺序被应用到容器上,当有重名的配置键或设备时,新的会覆盖掉旧的。然后本地容器设置会在这些基础上应用,覆盖所有来自配置文件的选项。

LXD 自带两种预配置的配置文件:

  • “default”配置是自动应用在所有容器之上,除非用户提供了一系列替代的配置文件。目前这个配置文件只做一件事,为容器定义 eth0 网络设备。
  • “docker”配置是一个允许你在容器里运行 Docker 容器的配置文件。它会要求 LXD 加载一些需要的内核模块以支持容器嵌套并创建一些设备。

远程

如我之前提到的, LXD 是一个基于网络的守护进程。附带的命令行客户端可以与多个远程 LXD 服务器、镜像服务器通信。

默认情况下,我们的命令行客户端会与下面几个预定义的远程服务器通信:

  • local:默认的远程服务器,使用 UNIX socket 和本地的 LXD 守护进程通信
  • ubuntu:Ubuntu 镜像服务器,提供稳定版的 Ubuntu 镜像
  • ubuntu-daily:Ubuntu 镜像服务器,提供 Ubuntu 的每日构建版
  • images:images.linuxcontainers.org 的镜像服务器

所有这些远程服务器的组合都可以在命令行客户端里使用。

你也可以添加任意数量的远程 LXD 主机,并配置它们监听网络。匿名的开放镜像服务器,或者通过认证可以管理远程容器的镜像服务器,都可以添加进来。

正是这种远程机制使得与远程镜像服务器交互及在主机间复制、移动容器成为可能。

安全性

我们设计 LXD 时的一个核心要求,就是在不修改现代 Linux 发行版的前提下,使容器尽可能的安全。

LXD 通过使用 LXC 库实现的主要安全特性有:

  • 内核名字空间。尤其是用户名字空间,它让容器和系统剩余部分完全分离。LXD 默认使用用户名字空间(和 LXC 相反),并允许用户在需要的时候以容器为单位关闭(将容器标为“特权的”)。
  • Seccomp 系统调用。用来隔离潜在危险的系统调用。
  • AppArmor。对 mount、socket、ptrace 和文件访问提供额外的限制。特别是限制跨容器通信。
  • Capabilities。阻止容器加载内核模块,修改主机系统时间,等等。
  • CGroups。限制资源使用,防止针对主机的 DoS 攻击。

为了对用户友好,LXD 构建了一个新的配置语言把大部分的这些特性都抽象封装起来,而不是如 LXC 一般直接将这些特性暴露出来。举了例子,一个用户可以告诉 LXD 把主机设备放进容器而不需要手动检查他们的主/次设备号来手动更新 CGroup 策略。

和 LXD 本身通信是基于使用 TLS 1.2 保护的链路,只允许使用有限的几个被允许的密钥算法。当和那些经过系统证书认证之外的主机通信时, LXD 会提示用户验证主机的远程指纹(SSH 方式),然后把指纹缓存起来以供以后使用。

REST 接口

LXD 的工作都是通过 REST 接口实现的。在客户端和守护进程之间并没有其他的通讯渠道。

REST 接口可以通过本地的 unix socket 访问,这只需要经过用户组认证,或者经过 HTTP 套接字使用客户端认证进行通信。

REST 接口的结构能够和上文所说的不同的组件匹配,是一种简单、直观的使用方法。

当需要一种复杂的通信机制时, LXD 将会进行 websocket 协商完成剩余的通信工作。这主要用于交互式终端会话、容器迁移和事件通知。

LXD 2.0 附带了 1.0 版的稳定 API。虽然我们在 1.0 版 API 添加了额外的特性,但是这不会在 1.0 版 API 端点里破坏向后兼容性,因为我们会声明额外的 API 扩展使得客户端可以找到新的接口。

容器规模化

虽然 LXD 提供了一个很好的命令行客户端,但是这个客户端并不能管理多个主机上大量的容器。在这种使用情况下,我们可以使用 OpenStack 的 nova-lxd 插件,它可以使 OpenStack 像使用虚拟机一样使用 LXD 容器。

这就允许在大量的主机上部署大量的 LXD 容器,然后使用 OpenStack 的 API 来管理网络、存储以及负载均衡。

额外信息

LXD 的主站在: https://linuxcontainers.org/lxd

LXD 的 GitHub 仓库: https://github.com/lxc/lxd

LXD 的邮件列表: https://lists.linuxcontainers.org

LXD 的 IRC 频道: #lxcontainers on irc.freenode.net

如果你不想或者不能在你的机器上安装 LXD ,你可以在 web 上试试在线版的 LXD


作者简介:我是 Stéphane Graber。我是 LXC 和 LXD 项目的领导者,目前在加拿大魁北克蒙特利尔的家所在的Canonical 有限公司担任 LXD 的技术主管。


via: https://www.stgraber.org/2016/03/11/lxd-2-0-introduction-to-lxd-112/

作者:Stéphane Graber 译者:ezio 校对:PurlingNayuki

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

世界上编程方面的最大的出版商 Packt Publishing 最近对 11000 名访客进行了调查,根据调查结果,Python 和 JavaScript 是当今最流行的编程语言,而 Java 紧随其后,排名第三。

调查内容包括开发者使用的编程语言、喜欢的框架、薪酬信息等。调查显示,如果就编程人员每天都要使用的语言来看,当今前10名的编程语言排名是 Python、JavaScript、Java、PHP、HTML(虽然不算编程语言)、 C#、SQL、CSS(也不算) 、C++ 和 R。

从之前的类似调查中可以发现,所有的调查均显示 Python 和 JavaScript 得到了极大流行。

Packt Publishing 的调查发现,编程人员薪水和以上排名完全不同,诸如 bash、Perl 和 Scala 语言编程人员获得的年薪平均超过了 8 万美元,甚至 Bash 编程语言人员的薪酬达到了 10 万美元,而 PHP 和 C 语言编程人员年薪几乎没有到达 4 万美元。

而在 Web 开发人员使用的工具方面,AngularJS 取得了第一,其次是 Facebook 的 React.js 框架、Node.js、Docker、Laravel、 Bootstrap、WordPress 和 AWS。

过去几年最流行的新编程语言排行榜当中,毫无疑问 Swift 高居榜首,其次是 C#、Go、Rust 和 Elixir。

新的框架方面, Docker 也如预期的那样得到第一,Apache Spark 和 AWS 分列二、三名。

更多的调查结果,可以看看 Packt Publishing 的报告(需注册)。

今日关注

Canonical 宣布 Ubuntu 16.04 LTS (Xenial Xerus) 的第一个维护版本 16.04.1 发布,包括 Kubuntu 、Xubuntu、 Lubuntu、Mythbuntu、Ubuntu Studio、Ubuntu MATE、Ubuntu GNOME、Ubuntu Kylin 等分支也同样更新其安装镜像。如果你还在使用旧的 Ubuntu 14.04.4 等版本,你会收到一个升级提示——这是最后的安全地升级到 16.04 的机会了。

图文摘要

VirtualBox 5.1.2 发布,对 RedHat 企业版 Linux 5 提供了更好支持。

在出去玩了一周之后,Linus 正式宣布 Linux Kernel 4.7 的发布。这一版本最大的新功能是提供了对 AMD 新发布的 Radeon RX 480 GPU 的支持。

经过漫长时间的等待,Mozilla Thunderbird 45 终于登陆 Ubuntu 了,你现在可以从 Ubuntu 官方仓库中下载安装了。

Google 本周以前都是用 TypeScript 来编写其著名的 AngularJS JavaScript 框架,不过从现在开始,它创建了一个使用 Dart 语言开发的 AngularJS 分支 AngularDart,用于内部的 AdWords 等。这种分拆对于 AngularJS 和 AngularDart 来说应该都是个好消息。

在今年的 Build 2016 上,微软向全世界介绍了他们还处于 Beta 阶段的 Windows 下的 Linux 子系统 Windows Subsystem for Linux (WSL),它可以让开发者们在 Windows 10 下通过 Bash shell 运行原生的 Ubuntu 用户态二进制程序。如果你参与了 Windows Insider 计划,你就可以在最新的 Windows 10 年度升级版的 Insider 构建版中体验这个功能了。

Web 开发人员们不用再苦恼所用的 Windows 开发平台上没有合适的 Linux 工具和库了。WSL 是由 Windows 内核团队与 Canonical 合作设计和开发的,可以让 Windows 10 下的开发者们在拥有 Windows 中那些强力支持之外,还能使用 Linux 下丰富的开发环境与工具,而不用启动到另外的操作系统或者使用虚拟机。这绝对是一个“来自开发者,服务开发者”的 Windows 10 特色,它的目的是让开发者们每天的开发工作都变得顺畅而便捷。

在本文中,我会展示给你一些我认为非常有趣的功能,以及告诉你一些可以让你找到更多信息的资源。首先,我会展示 WSL 所集成的那些主要命令(比如 ssh)是如何操作服务器和设备的。其次,我会演示使用 Bash 脚本是如何以简明的方式来自动化执行任务的。其三,我会利用极棒的命令行编译器、一些其它工具以及对 *nix 兼容的能力来玩一个轻量级的古典黑客级游戏: NetHack。最后,我会展示如何使用已有的 Python 脚本和其它来自网上的脚本。

从我的第一台 286 上运行的 Windows 3.0 开始,Windows 就一直是我的主要操作系统和开发环境。不过,我身边也有很多 Linux 服务器和设备。从树莓派和路由器/网关设备这样的物联网设备,到 Minecraft 服务器,它们堆满了我的办公室的每个角落。而我经常要从我的主工作站中去管理和配置这些 Linux 计算机。

管理服务器和设备

我在我的家中运行着一台无显示器的 Ubuntu Minecraft 服务器,这是我去年给我十岁大的儿子的圣诞礼物,但是它已经变成了我的玩具而不是他的(好吧,主要是我的玩具)。我以前在我的 Windows 10 电脑上使用几个客户端来管理它,不过我现在想使用 Windows 中的 Bash 里面的 ssh 命令行来管理它。使用类似 PuTTY 或来自 Cygwin 的 Tera Term 这样的应用当然也可以,但是我想试试真正原生而自然的体验也是一种不错的选择。Cygwin 就像是在披萨店订购的披萨一样,好吃,但是没有那种氛围。

我已经使用 WSL 中的 ssh-keygenssh-copy-id 设置好了公私密钥对,所以使用 ssh 只需要如下简单输入即可:

$ ssh <username>@<server>

我还为此创建了一个别名,以便更快一些。这是一个标准的 Linux/Bash 功能:

$ alias mc='ssh <user>@<server>'

现在,我要访问我的 Minecraft 服务器只需要在 Windows 10 下的 Bash 中输入“mc”即可。

当然,同样的方法你也可以用于任何 Linux 上的 Web 或数据库服务器上,甚至树莓派或其它的物联网设备也可以。

在终端里面进行 ssh 只是为了方便而已,不过当你在 shell 中工作时,如果还有类似 apt、node、Ruby、Python 等等工具时,你就有了自动化各种工作的可能。

远程脚本

假如说你有一大堆 Linux 服务器和设备,而你要在它们上面执行一个远程命令的话,如果已经配置好公私密钥对,你就可以在 Bash 中直接远程执行命令。

举个例子说,想知道远程服务器自从上次重启后已经运行了多长时间了,你只需要输入:

$ ssh <user>@<server> 'last -x|grep reboot'

ssh 会连接到该服务器并执行 last -x 命令,然后搜索包含“reboot”的一行。我在我的 Ubuntu Minecraft 服务器上运行的结果如下:

reboot   system boot  4.4.0-28-generic Thu Jul  7 08:14   still running

这只是一台服务器,如果你有许多服务器的话,你可以自动化这个过程。我在 WSL 里我的主目录下创建了一个名为 servers.txt 的文件,它包含了一系列 Linux 服务器/设备的名称,每个一行。然后我就可以创建一个脚本来读取这个文件。

在使用了很多年像树莓派这样的设备之后,我已经变成了一个 nano 人(在 VMS 上我是一个 LSEdit 人),下面是我用我喜爱的 nano 编辑器打开的脚本。

当然,你也可以使用 vim 、 emacs 或者其它可以用在 Ubuntu 终端上的编辑器。

该脚本是 Bash 脚本,要执行该脚本,输入:

$ ./foreachserver.sh 'last -x|grep reboot'

它将迭代输出文件中的每个服务器/设备,然后通过 ssh 远程执行该命令。当然,这个例子非常简单,但是你可以像这样把你的本地脚本或其它命令变成远程的。Bash 脚本语言足够丰富,所以你可以使用它来完成你的大多数远程管理任务。你可以用你下载到 WSL 或远程系统中的其它应用来扩展它的使用。

你是否需要在工作中把本地的 Windows 文件或资源用于其它的 Linux 计算机吗?或者,你根本不使用 Linux ?Bash 可以操作本地的 Windows 文件或资源,还是说它就是一个完全独立的环境?

使用 Windows 文件

WSL 系统可以通过 /mnt/<盘号>/ 目录(挂载点)来访问你计算机上的文件系统。举个例子,你的 Windows 上的 C:\ 和 D:\ 根目录可以在 WSL 中相应地通过 /mnt/c 和 /mnt/d 访问。当你要把你的 Windows 下的项目文件、下载的内容和其它文件用到 Linux/Bash 之中时这很有用。

上图显示的两个目录分别对应于我的计算机上的 SSD 和硬盘:

这是逻辑挂载,所以当你在 shell 中使用类似 mount 这样的命令时它们不会显示。但是它们可以如你预期的那样工作。举个例子,在 Windows 中,我在我的 C 盘根目录下放了一个名为 test.txt 的文件,我可以在 WSL 中如下访问它:

在 Build Tour 大会期间,我们要确保所有的演示都可以在没有互联网时也能正常工作(你绝不会知道会场的网络是什么样子的) ,所以为了让 Bash/WSL 可以演示 Git 操作,该演示访问的是本地计算机上的 Windows 文件,我在 Windows 上的 C:\git\NetHack 下设置一个本地仓库。 要在 WSL 中进行 clone 操作,我执行了如下命令:

$ git –clone file:///mnt/c/git/NetHack

该命令告诉 git 使用 file:// 协议,并 clone 了位于 /mnt/c/git/NetHack 下的仓库。你可以以类似的方式来访问你的 Windows 下的所有文件。

警示:就像在其它终端中一样,如果你不小心的话,你可以在 Bash 中修改/删除 Windows 文件系统中的文件。举个例子,你可以像下面这样来干掉你的 Windows ,假如你有合适的权限的话。

$ rm -rf /mnt/c/  [千万别试!][千万别试!][千万别试!]

我之所以郑重提醒是因为我们很多人都是刚刚接触 Linux 命令,它们不是 Windows 命令。

这种可以让文件系统集成到一起的魔法来自 DrvFs。如果你希望了解该文件系统的更多细节,以及它是如何工作在 WSL 中的,WSL 团队为此写了一篇详细的文章

当然, 文件系统访问只是 WSL 其中的一部分功能而已,许多开发任务还需要通过 HTTP 或其它网络协议访问远程资源。

发起 HTTP 请求

从脚本或命令行而不是从一个编译好的程序或 Web 页面上发起 REST 或其它 HTTP(或 FTP)请求是很有用的。就像在大多数 Linux 发行版一样,WSL 也包括了类似 curl 或 wget 获取资源这样的标准功能,它们可以用来发起 HTTP 或者其它网络请求。举个例子,下面是使用 curl 对 Github 发起 REST 请求来获取我个人的属性信息:

$ curl -i https://api.github.com/users/Psychlist1972
HTTP/1.1 200 OK
Server: GitHub.com
Date: Wed, 13 Jul 2016 02:38:08 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1319
Status: 200 OK
...
{
  "login": "Psychlist1972",
  "avatar_url": "https://avatars.githubusercontent.com/u/1421146?v=3",
  "url": "https://api.github.com/users/Psychlist1972",
  "name": "Pete Brown",
  "company": "Microsoft",
   ...
}
$

你可以用它和 Bash 脚本来创建一个 REST API 的快速测试客户端,也可以用来探测一个 Web 页面或服务器并报告其返回的状态。它用来从网上下载文件也很棒,你可以简单地重定向输出到一个文件而不是在屏幕上显示它:

$ curl -i https://api.github.com/users/Psychlist1972 > pete.json

我也是一个 PowerShell 用户,甚至还使用 Windows 10 MIDI in PowerShell 创建了一些有趣的扩展,也修复过出现在特定的录音硬件设备上的一些文件问题。作为长时间的 .NET 开发者和爱好者,我经常使用和扩展 PowerShell 以满足我的项目需求。但是 PowerShell 并不是一个可以运行所有的那些 Bash 脚本和针对 Linux 的开源工具的地方。我希望以一种最简单、最舒服的方式来完成这些任务,在某种意义上,这意味着我们需要在 Bash 中完成它们。

我已经一掠而过的介绍了 Bash、Bash 脚本以及你可以在 shell 中完成的任务。到目前为止,我谈论的都是有助于开发工作的那些功能。但是在 WSL 中实际的开发和编译工作是怎样的?我在 Build Tour 大会上演示了下面这个部分。

Build Tour 大会上的演示:NetHack

这个夏初,来自微软的讲演者们向大家演示了一些来自 Windows 和微软云上的很酷的开发者新功能。作为其中的一部分,我以一种好玩的方式来演示了 WSL,而且这是一种和开发者们相关的方式。

我个人想要展示使用 git 和一些传统的终端开发工具,我已经写好了 Bash 的演示程序,包括了这些基础的东西(用 Python 和 Ruby 写的“Hello World”),不过我还是想要更有冲击力一些。

我回想起我在大学的时光,那时我们在 Unix(DEC Ultrix 及 SunOS)和 VAX/VMS 之间折腾,Unix 几乎全是命令行环境。在我们学校,绝大多数使用图形工作站的用户只是为了在不同的窗口打开多个终端会话而已,当然,会在桌面背景放上一张超酷的月相图。大部分学生都是使用 VT-220 终端来打开他们的会话(学校离波士顿不远,所以我们有很多 DEC 设备)。

那时,计算机系的学生们主要玩两大游戏:MUD (主要是 lpMUD 和当时刚出的 DikuMUD)和 NetHack。NetHack 和其它的 Roguelikes 类游戏被视为历史上最有影响力的游戏之一,它们是许多现在流行的地牢冒险和角色扮演类游戏的鼻祖。

NetHack 有很长的历史,现在的它包含了来自几十年前的几十万行 *nix 代码,以及后来补充的一些代码。该游戏使用 curses) (及其替代品)作为终端交互方式,需要通过 lex、 yacc(或 flex 和 bison)和 cc(或 gcc),以及一堆其它的开发工具构建。

它是由 C 语言编写的,并包括了一些用 Bourne shell 编写的复杂的脚本配置功能。我觉得它是一个体现 WSL 和 Bash on Windows 10 的开发者能力的不错而有趣的方式。由于使用了 curses(在 Linux 和 WSL 中是 libncurses 库),它也可以用来展示 Windows 10 中命令行窗口中的终端模拟能力。

以前,在我们的分时 Ultrix 服务器上从源代码构建 NetHack 要花费掉我们很多时间,而现在我的个人计算机上只需要几分钟就可以搞定。我喜欢这种技术进步。在 Linux 或 WSL 上配置和编译 NetHack 有容易和复杂两种方式。为了节省时间,我们会以容易的方式来进行。

前置需求

首先,更新你的 WSL 环境,确保你的软件是最新的。在安装新的软件包之前,这是一个好的做法。

$ sudo apt update
$ sudo apt upgrade

然后,安装必须的开发工具。最简单的办法就是使用 build-essential 软件包,它包括了 Linux 开发者构建以 C/C++ 开发的软件时所需的绝大部分程序。

$ sudo apt install build-essential

这要花几分钟。如果你想更加深入地了解,你可以分别安装 gcc、gdb、make、flex、bison 以及 NetHack 文档中提到的其它工具。不过如果你是一位开发者,有时候你可能还需要一些其它工具。 build-essential 基本上提供了你所需的工具集。

然后,安装 git。如你所想,很容易:

$ sudo apt install git

就像在 Linux 中一样,你可以添加一个 git 的 PPA 来获取较新的版本,不过这里我们有一个就行了。

最后,我们需要安装 curses(实际上是 ncurses)来进行终端屏幕交互。

$ sudo apt install libncurses-dev

当我们完成这些步骤之后,就可以开始构建 NetHack 了。

构建 NetHack

官方的 NetHack 仓库放在 GitHub 上,首先我们需要把它抓取下来放到我们的主目录里面。

$ cd ~$ git clone http://github.com/NetHack/NetHack

因为 NetHack 支持很多种操作系统,所以我们需要做一些基础配置来告诉它我们使用的是 Linux,并且用开源的 gcc 代替了了 Unix 上 cc 的作用。

如我所提到的,这有好几种办法可以实现。有些人想很周到,将这些配置信息放到了 hints 文件中。相信我,使用 hints 文件会避免遇到该 GitHub 仓库中提到的很多麻烦。在 README 文件和其它文档中并没有着重提到如何使用 hints 文件,我们可以这样做:

$ cd NetHack/sys/unix
$ ./setup.sh hints/linux

这将会设置 Makefile 正确的使用 Linux 下的工具、库及其路径。这个设置脚本很强大,它做了大量的配置工作,很高兴它在 WSL 中工作的也很好。如果你很好奇这个脚本是如何写的,你可以使用你的编辑器打开它一窥究竟。

然后,开始最终的构建:

$ cd ~/NetHack
$ make all

构建完成之后,你需要安装它。这其实就是将可执行文件复制到目标位置:

$ make install

它会安装到你的 ~/nh 文件夹下, NetHack 放在 ~/nh/install/games 目录,名为 nethack。要运行它,切换到该目录(或输入完整路径)并输入:

$ cd ~/nh/install/games
$ nethack

然后,屏幕会清屏并显示你可以玩 NetHack 了。注意,所有的东西都是在这个 Ubuntu Linux 环境中完成的,根本不需要任何 Windows 特有的东西。

玩 NetHack

由于终端游戏的局限性和 NetHack 的复杂性,这里只能一带而过。对于初次接触它的人来说,还有一些神秘的地方,不过我觉得我们程序员们从来不怕挑战未知。

方向键和 vi(vim)中的一样,HJKL 是左、下、上、右。要退出游戏,你可以在地下城顶层找到楼梯出口然后使用它就可以,或者直接按下 CTRL-C 强制退出。

在 NetHack 中, @ 符号代表你自己,每一层都由房间、走廊、门,和向上及向下的楼梯组成。怪物宝箱和物品以各种 ASCII 字符组成,你慢慢就会熟悉它们。为了符合 Roguelikes 游戏规范,并没有存盘功能,你只有一条命。如果你死了就只能重玩,地下城环境是随机生成的,各种物品也是打乱放置的。

NetHack 游戏的目的是在地下城生存,收集金子和物品,尽可能的干掉各种怪物。除了这些目的之外,你就是不断在其中玩来找它们。规则大致遵循“龙与地下城(DnD)”的武器、技能等规则。

下面的 NetHack 截屏上可以看到有三个房间和两个走廊。向上的楼梯在左上角的房间里,我现在在右上角的房间,还有一些宝箱和其它物品。

如果在你的游戏中没有显示颜色,可以创建一个名为 ~/.nethackrc 的文件,并放入如下内容:

OPTIONS=color:true,dark_room:true,menucolors:true

注:如果 ASCII 字符图形不是你的菜,但是你喜欢这种类型的游戏,你可以在微软商店搜索“roguelike”来找到视觉上更好看的这种游戏。

当然,NetHack 很古老了,可能只有特定年龄段的人们喜欢它。不过,构建它用到了大量重要的开发工具和 *nix 操作系统功能,也包括终端模拟功能。从这里可以看到,从 gcc、gdb、make、bison 和 flex 到更现代一些的 git,都在 WSL 里面工作的很好。

如果你想看看 Build Tour 大会上的演示,你可以在 Build Tour 加拿大大会上看到这个讲演。WSL 的这部分演示在 6:20 开始。

希望你能喜欢在 NetHack 地下城中的探险。

C 和 C++ 都很伟大,就像其他的那些经典的开发工具一样。你甚至还可以用普通的 Bash 脚本做到很多。不过,也有很多开发者喜欢用 Python 做为他们的脚本语言。

Python

你可以在网上找到很多 Python 脚本的例子,这意味着 Python 越来越流行,也越来越有用了。当然,大多数情况下这些例子都是运行在 Linux 下的。在过去,这就需要我们有另外一台安装着 Linux 的机器来运行它们,或者使用虚拟机和多引导,否则就需要修改一些东西才能让他们运行在 Windows 下的 Python 环境中。

这是都不是无法解决的问题,但是它会日渐消磨开发人员每天的生活。通过 WSL,不用折腾你就拥有了一个兼容的、具有 Python 功能和 shell 变量的子系统。

要安装最新的 Python 开发版本和 Python 包安装器 pip,在 Bash 中执行如下命令:

$ sudo apt install python-pip python-dev
$ sudo pip install --upgrade pip

现在 Python 安装好了,我要展示给你如何从网上获取一个典型的 Linux 下的 Python 例子并让它直接工作起来。我去 Activestate Python 菜谱站找一个排名第一的 Python 例子。好吧,我走眼了,排名第一的是打印出整数名称的脚本,这看起来没啥意思,所以我选择了第二名:俄罗斯方块。我们每天都能看到 Python 出现在各种地方,所以这次让我们去玩另外一个游戏。

我打开了 nano 编辑器,从 Windows 上的浏览器中打开的页面上复制了这 275 行 Python 代码,然后粘贴到我的 WSL 终端窗口终端中的 nano 中,并保存为 tetris.py ,然后执行它:

$ python tetris.py

它马上就清屏并出现了俄罗斯方块的游戏。同 NetHack 一样,你可以使用同样的 vi 标准的方向键来移动(以前是使用鼠标和 WSAD 键来移动,而右手使用 HJKL 键更方便)。

如我所提到的,你当然可以不用 WSL 就在 Windows 中运行 Python。然而,要想快速简便,不用修改 Linux 下的 Python 代码,只需要简单的复制粘贴代码即可运行,则可以极大的提高开发者的效率。

这是真的。这并不是要替代 Windows 原生的工具,比如 Python、PowerShell、C# 等等,而是当你需要在现代的开发工作流程中快速而有效地完成一些事情时,可以避免种种折腾。

包括 Bash、Python 以及其它所有的 Linux 原生的命令行开发工具,WSL 为我的开发工作提供了所有需要的工具。这不是一个 Linux 服务器,甚至也不是一个完整的客户端,相反,它就是一个可以让我避免每天折腾,让我在 Windows 上开发更有效率、更有快感的一个东西!


重置你的 WSL 环境

随便去试吧,如果你搞坏了你的 WSL 环境,它很容易重新安装。在进行之前,请确保做好了任何重要内容的备份。

C:\> lxrun.exe /uninstall /full
C:\> lxrun.exe /install

你使用 Bash 和 WSL 的感觉如何?

我们希望 WSL ,特别是 Bash 可以在 Windows 10 中帮你带来更高的效率,减少每天的开发中的折腾。

你对 Windows 10 上的 WSL 怎么看?你喜欢使用它吗?

开发团队做了大量的工作希望让 WSL 成为一个为开发者提供的强大的终端工具。如果你有任何反馈或运行出现问题,我们推荐你查看一下 GitHub 反馈页面,以及 用户之声的反馈和投票站点。我们真的希望听到你的声音。

更多参考与延伸阅读

Linux shell 编程是一个庞大的话题,在网上有很多这方面的内容。如果你还不够熟悉它们,想要了解更多,可以看看各种 Bash 教程。可以从这一份开始

还有一些其他的参考资料也许对你有用:

哦,当然,要更多的了解 NetHack,请访问 NetHack 主站

在 awk 系列的前几节,我们看到大多数操作都是从一个文件或多个文件读取输入,或者你想要把标准输入作为 awk 的输入。

在 awk 系列的第七节中,我们将会看到几个例子,你可以筛选其他命令的输出代替从一个文件读取输入作为 awk 的输入。

我们首先从使用 dir 命令开始,它类似于 ls 命令,在第一个例子下面,我们使用 dir -l 命令的输出作为 awk 命令的输入,这样就可以打印出文件拥有者的用户名,所属组组名以及在当前路径下他/她拥有的文件。

# dir -l | awk '{print $3, $4, $9;}'

列出当前路径下的用户文件

再来看另一个例子,我们使用 awk 表达式 ,在这里,我们想要在 awk 命令里使用一个表达式筛选出字符串来打印出属于 root 用户的文件。命令如下:

# dir -l | awk '$3=="root" {print $1,$3,$4, $9;} '

列出 root 用户的文件

上面的命令包含了 (==) 来进行比较操作,这帮助我们在当前路径下筛选出 root 用户的文件。这是通过使用 $3=="root" 表达式实现的。

让我们再看另一个例子,我们使用一个 awk 比较运算符 来匹配一个确定的字符串。

这里,我们使用了 cat 命令 来浏览文件名为 tecmint\_deals.txt 的文件内容,并且我们想要仅仅查看有字符串 Tech 的部分,所以我们会运行下列命令:

# cat tecmint_deals.txt
# cat tecmint_deals.txt | awk '$4 ~ /tech/{print}'
# cat tecmint_deals.txt | awk '$4 ~ /Tech/{print}'

用 Awk 比较运算符匹配字符串

在上面的例子中,我们已经用了参数为 ~ /匹配字符/ 的比较操作,但是上面的两个命令给我们展示了一些很重要的问题。

当你运行带有 tech 字符串的命令时终端没有输出,因为在文件中没有 tech 这种字符串,但是运行带有 Tech 字符串的命令,你却会得到包含 Tech 的输出。

所以你应该在进行这种比较操作的时候时刻注意这种问题,正如我们在上面看到的那样,awk 对大小写很敏感。

你总是可以使用另一个命令的输出作为 awk 命令的输入来代替从一个文件中读取输入,这就像我们在上面看到的那样简单。

希望这些例子足够简单到可以使你理解 awk 的用法,如果你有任何问题,你可以在下面的评论区提问,记得查看 awk 系列接下来的章节内容,我们将关注 awk 的一些功能,比如变量,数字表达式以及赋值运算符。


via: http://www.tecmint.com/read-awk-input-from-stdin-in-linux/

作者:Aaron Kili 译者:vim-kakali 校对:wxy

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

由于 2016 年 2 月 2 号开始启用了新的 LFCS 考试要求, 我们在 LFCS 系列系列添加了一些必要的内容。为了考试的需要,我们强烈建议你看一下LFCE 系列

LFCS: 了解 Linux 的帮助文档和工具

当你习惯了在命令行下进行工作,你会发现 Linux 已经有了许多使用和配置 Linux 系统所需要的文档。

另一个你必须熟悉命令行帮助工具的理由是,在LFCSLFCE 考试中,它们是你唯一能够使用的信息来源,没有互联网也没有百度。你只能依靠你自己和命令行。

基于上面的理由,在这一章里我们将给你一些建议来可以让你有效的使用这些安装的文档和工具,以帮助你通过Linux 基金会认证考试。

Linux 帮助手册 man

man 手册是 manual 手册的缩写,就是其名字所揭示的那样:一个给定工具的帮助手册。它包含了命令所支持的选项列表(以及解释),有些工具甚至还提供一些使用范例。

我们用 man 命令 跟上你想要了解的工具名称来打开一个帮助手册。例如:

# man diff

这将打开diff的手册页,这个工具将逐行对比文本文件(如你想退出只需要轻轻的点一下 q 键)。

下面我来比较两个文本文件 file1file2。这两个文本文件包含了使用同一个 Linux 发行版相同版本安装的两台机器上的的安装包列表。

输入diff 命令它将告诉我们 file1file2 有什么不同:

# diff file1 file2

在Linux中比较两个文本文件

< 这个符号是说file2缺失的行。如果是 file1缺失,我们将用 > 符号来替代指示。

另外,7d6 意思是说file1的第7行要删除了才能和file2一致(24d2241d38 也是同样的意思) 65,67d61 告诉需要删除从第 65 行到 67 行。我们完成了以上步骤,那么这两个文件将完全一致。

此外,根据 man 手册说明,你还可以通过 -y 选项来以两路的方式显示文件。你可以发现这对于你找到两个文件间的不同根据方便容易。

# diff -y file1 file2

比较并列出两个文件的不同

此外,你也可以用diff来比较两个二进制文件。如果它们完全一样,diff 将什么也不会输出。否则,它将会返回如下信息:“Binary files X and Y differ”。

–help 选项

--help选项,大多数命令都支持它(并不是所有), 它可以理解为一个命令的简短帮助手册。尽管它没有提供工具的详细介绍,但是确实是一个能够快速列出程序的所支持的选项的不错的方法。

例如,

# sed --help

将显示 sed (流编辑器)的每个支持的选项。

sed命令的一个典型用法是替换文件中的字符。用 -i 选项(意思是 “原地编辑编辑文件”),你可以编辑一个文件而且并不需要打开它。 如果你想要同时备份一个原始文件,用 -i 选项加后缀来创建一个原始文件的副本。

例如,替换 lorem.txt 中的LoremTecmint(忽略大小写),并且创建一个原文件的备份副本,命令如下:

# less lorem.txt | grep -i lorem
# sed -i.orig 's/Lorem/Tecmint/gI' lorem.txt
# less lorem.txt | grep -i lorem
# less lorem.txt.orig | grep -i lorem

请注意lorem.txt文件中Lorem 都已经替换为 Tecmint,并且原文件 lorem.txt 被保存为lorem.txt.orig

替换文件中的文本

/usr/share/doc 内的文档

这可能是我最喜欢的方法。如果你进入 /usr/share/doc 目录,并列出该目录,你可以看到许多以安装在你的 Linux 上的工具为名称的文件夹。

根据 文件系统层级标准,这些文件夹包含了许多帮助手册没有的信息,还有一些可以使配置更方便的模板和配置文件。

例如,让我们来看一下 squid-3.3.8 (不同发行版的版本可能会不同),这还是一个非常受欢迎的 HTTP 代理和 squid 缓存服务器

让我们用cd命令进入目录:

# cd /usr/share/doc/squid-3.3.8

列出当前文件夹列表:

# ls

使用 ls 列出目录

你应该特别注意 QUICKSTARTsquid.conf.documented。这些文件分别包含了 Squid 详细文档及其经过详细备注的配置文件。对于别的安装包来说,具体的名字可能不同(有可能是 QuickRef 或者00QUICKSTART),但意思是一样的。

对于另外一些安装包,比如 Apache web 服务器,在/usr/share/doc目录提供了配置模板,当你配置独立服务器或者虚拟主机的时候会非常有用。

GNU 信息文档

你可以把它看做帮助手册的“开挂版”。它不仅仅提供工具的帮助信息,而且还是超级链接的形式(没错,在命令行中的超级链接),你可以通过箭头按钮从一个章节导航到另外章节,并按下回车按钮来确认。

一个典型的例子是:

# info coreutils

因为 coreutils 包含了每个系统中都有的基本文件、shell 和文本处理工具,你自然可以从 coreutils 的 info 文档中得到它们的详细介绍。

Info Coreutils

和帮助手册一样,你可以按 q 键退出。

此外,GNU info 还可以显示标准的帮助手册。 例如:

# info tune2fs

它将显示 tune2fs的帮助手册, 这是一个 ext2/3/4 文件系统管理工具。

我们现在看到了,让我们来试试怎么用tune2fs

显示 /dev/mapper/vg00-vol\_backups 文件系统信息:

# tune2fs -l /dev/mapper/vg00-vol_backups

修改文件系统标签(修改为 Backups):

# tune2fs -L Backups /dev/mapper/vg00-vol_backups

设置文件系统的自检间隔及挂载计数(用-c 选项设置挂载计数间隔, 用 -i 选项设置自检时间间隔,这里 d 表示天,w 表示周,m 表示月)。

# tune2fs -c 150 /dev/mapper/vg00-vol_backups # 每 150 次挂载检查一次
# tune2fs -i 6w /dev/mapper/vg00-vol_backups # 每 6 周检查一次

以上这些内容也可以通过 --help 选项找到,或者查看帮助手册。

摘要

不管你选择哪种方法,知道并且会使用它们在考试中对你是非常有用的。你知道其它的一些方法吗? 欢迎给我们留言。


via: http://www.tecmint.com/explore-linux-installed-help-documentation-and-tools/

作者:Gabriel Cánepa 译者:kokialoves 校对:wxy

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