程序员如何学习编码

# 程序员如何学习编码

[](https://mybroadband.co.za/news/smartphones/246583-how-programmers-learn-to-code.html)

HackerRank 最近公布了 2018 年开发者技能报告的结果，其中向程序员询问了他们何时开始编码。

39,441 名专业人员和学生开发者于 2016 年 10 月 16 日至 11 月 1 日完成了在线调查，超过 25％ 的被调查的开发者在 16 岁前编写了他们的第一段代码。（LCTT 译注：日期恐有误）

### 程序员是如何学习的

报告称，就程序员如何学习编码而言，自学是所有年龄段开发者的常态。

“尽管 67％ 的开发者拥有计算机科学学位，但大约 74％ 的人表示他们至少一部分是自学的。”

开发者平均了解四种语言，但他们想学习更多语言。

对学习的渴望因人而异 —— 18 至 24 岁的开发者计划学习 6 种语言，而 35 岁以上的开发者只计划学习 3 种语言。

[](https://mybroadband.co.za/news/wp-content/uploads/2018/01/HackerRank-2018-how-did-you-learn-to-code.jpg)

### 程序员想要什么

HackerRank 还研究了开发者最想从雇主那里得到什么。

平均而言，良好的工作与生活平衡，紧随其后的是专业成长与学习，是最理想的要求。

按地区划分的数据显示，美国人比亚洲和欧洲的开发者更渴望工作与生活的平衡。

学生倾向于将成长和学习列在工作与生活的平衡之上，而专业人员对薪酬的排名比学生高得多。

在小公司工作的人倾向于降低工作与生活的平衡，但仍处于前三名。

年龄也制造了不同，25 岁以上的开发者将工作与生活的平衡评为最重要的，而 18 岁至 24 岁的人们则认为其重要性较低。

HackerRank 说：“在某些方面，我们发现了一个小矛盾。开发人员需要工作与生活的平衡，但他们也渴望学习“。

它建议，专注于做你喜欢的事情，而不是试图学习一切，这可以帮助实现更好的工作与生活的平衡。

[](https://mybroadband.co.za/news/wp-content/uploads/2018/01/HackerRank-2018-what-do-developers-want-most.jpg)

[](https://mybroadband.co.za/news/wp-content/uploads/2018/01/HackerRank-2018-how-to-improve-work-life-balance.jpg)

---

via: <https://mybroadband.co.za/news/smartphones/246583-how-programmers-learn-to-code.html>

作者：[Staff Writer](https://mybroadband.co.za/news/author/staff-writer) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 中轻松修正拼写错误的 Bash 命令

感觉这小技巧也不轻松啊。

# 如何在 Linux 中轻松修正拼写错误的 Bash 命令

我知道你可以按下向上箭头来调出你运行过的命令，然后使用左/右键移动到拼写错误的单词，并更正拼写错误的单词，最后按回车键再次运行它，对吗？可是等等。还有一种更简单的方法可以纠正 GNU/Linux 中拼写错误的 Bash 命令。这个教程解释了如何做到这一点。请继续阅读。

### 在 Linux 中纠正拼写错误的 Bash 命令

你有没有运行过类似于下面的错误输入命令？

```
$ unme -r
bash: unme: command not found

```

你注意到了吗？上面的命令中有一个错误。我在 `uname` 命令缺少了字母 `a`。

我在很多时候犯过这种愚蠢的错误。在我知道这个技巧之前，我习惯按下向上箭头来调出命令，并转到命令中拼写错误的单词，纠正拼写错误，然后按回车键再次运行该命令。但相信我。下面的技巧非常易于纠正你刚刚运行的命令中的任何拼写错误。

要轻松更正上述拼写错误的命令，只需运行：

```
$ ^nm^nam^

```

这会将 `uname` 命令中将 `nm` 替换为 `nam`。很酷，是吗？它不仅纠正错别字，而且还能运行命令。查看下面的截图。

当你在命令中输入错字时使用这个技巧。请注意，它仅适用于 Bash shell。

**额外提示：**

你有没有想过在使用 `cd` 命令时如何自动纠正拼写错误？没有么？没关系！下面的技巧将解释如何做到这一点。

这个技巧只能纠正使用 `cd` 命令时的拼写错误。

比如说，你想使用命令切换到 `Downloads` 目录：

```
$ cd Donloads
bash: cd: Donloads: No such file or directory

```

哎呀！没有名称为 `Donloads` 的文件或目录。是的，正确的名称是 `Downloads`。上面的命令中缺少 `w`。

要解决此问题并在使用 `cd` 命令时自动更正错误，请编辑你的 `.bashrc` 文件：

```
$ vi ~/.bashrc

```

最后添加以下行。

```
[...]
shopt -s cdspell

```

输入 `:wq` 保存并退出文件。

最后，运行以下命令更新更改。

```
$ source ~/.bashrc

```

现在，如果在使用 `cd` 命令时路径中存在任何拼写错误，它将自动更正并进入正确的目录。

正如你在上面的命令中看到的那样，我故意输错（`Donloads` 而不是 `Downloads`），但 Bash 自动检测到正确的目录名并 `cd` 进入它。

[Fish](https://www.ostechnix.com/install-fish-friendly-interactive-shell-linux/) 和 Zsh shell 内置的此功能。所以，如果你使用的是它们，那么你不需要这个技巧。

然而，这个技巧有一些局限性。它只适用于使用正确的大小写。在上面的例子中，如果你输入的是 `cd donloads` 而不是 `cd Donloads`，它将无法识别正确的路径。另外，如果路径中缺少多个字母，它也不起作用。

---

via: <https://www.ostechnix.com/easily-correct-misspelled-bash-commands-linux/>

作者：[SK](https://www.ostechnix.com/author/sk/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 上使用 snap 安装 Spotify（声破天）

# 如何在 Linux 上使用 snap 安装 Spotify（声破天）

如何在 Ubuntu Linux 桌面上安装 spotify 来在线听音乐？

Spotify 是一个可让你访问大量歌曲的数字音乐流服务。你可以免费收听或者购买订阅，可以创建播放列表。订阅用户可以免广告收听音乐，你会得到更好的音质。本教程展示如何使用在 Ubuntu、Mint、Debian、Fedora、Arch 和其他更多发行版上的 snap 包管理器安装 Spotify。

### 在 Linux 上安装 spotify

在 Linux 上安装 spotify 的步骤如下：

1. 安装 snapd
2. 打开 snapd
3. 找到 Spotify snap：`snap find spotify`
4. 安装 spotify：`sudo snap install spotify`
5. 运行：`spotify &`

让我们详细看看所有的步骤和例子。

### 步骤 1 - 安装 snapd

你需要安装 snapd 包。它是一个守护进程（服务），并能在 Linux 系统上启用 snap 包管理。

#### Debian/Ubuntu/Mint Linux 上的 snapd

输入以下 [apt 命令](https://www.cyberciti.biz/faq/ubuntu-lts-debian-linux-apt-command-examples/ "See Linux/Unix apt command examples for more info")/ [apt-get 命令](https://www.cyberciti.biz/tips/linux-debian-package-management-cheat-sheet.html "See Linux/Unix apt-get command examples for more info")：

```
$ sudo apt install snapd

```

#### 在 Arch Linux 上安装 snapd

snapd 只包含在 Arch User Repository（AUR）中。运行 `yaourt` 命令（参见[如何在 Archlinux 上安装 yaourt](https://www.cyberciti.biz/faq/how-to-install-yaourt-in-arch-linux/)）：

```
$ sudo yaourt -S snapd
$ sudo systemctl enable --now snapd.socket

```

#### 在 Fedora 上获取 snapd

运行 snapd 命令：

```
sudo dnf install snapd
sudo ln -s /var/lib/snapd/snap /snap

```

#### OpenSUSE 安装 snapd

执行如下的 `zypper` 命令：

```
### Tumbleweed verson ###
$ sudo zypper addrepo http://download.opensuse.org/repositories/system:/snappy/openSUSE_Tumbleweed/ snappy
### Leap version ##
$ sudo zypper addrepo http://download.opensuse.org/repositories/system:/snappy/openSUSE_Leap_42.3/ snappy

```

安装：

```
$ sudo zypper install snapd
$ sudo systemctl enable --now snapd.socket

```

### 步骤 2 - 在 Linux 上使用 snap 安装 spofity

执行 snap 命令：

```
$ snap find spotify

```

[](https://www.cyberciti.biz/media/new/faq/2018/01/snap-search-for-spotify-app-command.jpg)

安装它：

```
$ sudo snap install spotify

```

[](https://www.cyberciti.biz/media/new/faq/2018/01/How-to-install-Spotify-application-on-Linux-using-snap-command.jpg)

### 步骤 3 - 运行 spotify 并享受它

从 GUI 运行它，或者只需输入：

```
$ spotify

```

在启动时自动登录你的帐户：

```
$ spotify --username vivek@nixcraft.com
$ spotify --username vivek@nixcraft.com --password 'myPasswordHere'

```

在初始化时使用给定的 URI 启动 Spotify 客户端：

```
$ spotify --uri=<uri>

```

以指定的网址启动：

```
$ spotify --url=<url>

```

[](https://www.cyberciti.biz/media/new/faq/2018/01/Spotify-client-app-running-on-my-Ubuntu-Linux-desktop.jpg)

### 关于作者

作者是 nixCraft 的创建者，是经验丰富的系统管理员，也是 Linux 操作系统/Unix shell 脚本的培训师。他曾与全球客户以及 IT、教育、国防和太空研究以及非营利部门等多个行业合作。在 [Twitter](https://twitter.com/nixcraft)、[Facebook](https://facebook.com/nixcraft)、[Google +](https://plus.google.com/+CybercitiBiz) 上关注他。

---

via: <https://www.cyberciti.biz/faq/how-to-install-spotify-application-on-linux/>

作者：[Vivek Gite](https://www.cyberciti.biz) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 上使用 Vundle 管理 Vim 插件

很nice; 一点通

# 如何在 Linux 上使用 Vundle 管理 Vim 插件

毋庸置疑，Vim 是一款强大的文本文件处理的通用工具，能够管理系统配置文件和编写代码。通过插件，Vim 可以被拓展出不同层次的功能。通常，所有的插件和附属的配置文件都会存放在 `~/.vim` 目录中。由于所有的插件文件都被存储在同一个目录下，所以当你安装更多插件时，不同的插件文件之间相互混淆。因而，跟踪和管理它们将是一个恐怖的任务。然而，这正是 Vundle 所能处理的。Vundle，分别是 **V**im 和 B**undle** 的缩写，它是一款能够管理 Vim 插件的极其实用的工具。

Vundle 为每一个你安装的插件创建一个独立的目录树，并在相应的插件目录中存储附加的配置文件。因此，相互之间没有混淆的文件。简言之，Vundle 允许你安装新的插件、配置已有的插件、更新插件配置、搜索安装的插件和清理不使用的插件。所有的操作都可以在一键交互模式下完成。在这个简易的教程中，让我告诉你如何安装 Vundle，如何在 GNU/Linux 中使用它来管理 Vim 插件。

### Vundle 安装

如果你需要 Vundle，那我就当作你的系统中，已将安装好了 Vim。如果没有，请安装 Vim 和 git（以下载 Vundle）。在大部分 GNU/Linux 发行版中的官方仓库中都可以获取到这两个包。比如，在 Debian 系列系统中，你可以使用下面的命令安装这两个包。

```
sudo apt-get install vim git

```

#### 下载 Vundle

复制 Vundle 的 GitHub 仓库地址:

```
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

```

#### 配置 Vundle

创建 `~/.vimrc` 文件，以通知 Vim 使用新的插件管理器。安装、更新、配置和移除插件需要这个文件。

```
vim ~/.vimrc

```

在此文件顶部，加入如下若干行内容：

```
set nocompatible " be iMproved, required
filetype off " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
" plugin from http://vim-scripts.org/vim/scripts.html
" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" git repos on your local machine (i.e. when working on your own plugin)
Plugin 'file:///home/gmarik/path/to/plugin'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/L9', {'name': 'newL9'}

" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

```

被标记为 “required” 的行是 Vundle 的所需配置。其余行仅是一些例子。如果你不想安装那些特定的插件，可以移除它们。完成后，键入 `:wq` 保存退出。

最后，打开 Vim：

```
vim

```

然后键入下列命令安装插件：

```
:PluginInstall

```

将会弹出一个新的分窗口，我们加在 `.vimrc` 文件中的所有插件都会自动安装。

安装完毕之后，键入下列命令，可以删除高速缓存区缓存并关闭窗口：

```
:bdelete

```

你也可以在终端上使用下面命令安装插件，而不用打开 Vim：

```
vim +PluginInstall +qall

```

使用 [fish shell](https://www.ostechnix.com/install-fish-friendly-interactive-shell-linux/) 的朋友，添加下面这行到你的 `.vimrc` 文件中。

```
set shell=/bin/bash

```

### 使用 Vundle 管理 Vim 插件

#### 添加新的插件

首先，使用下面的命令搜索可以使用的插件：

```
:PluginSearch

```

要从 vimscripts 网站刷新本地的列表，请在命令之后添加 `!`。

```
:PluginSearch!

```

会弹出一个列出可用插件列表的新分窗口：

你还可以通过直接指定插件名的方式，缩小搜索范围。

```
:PluginSearch vim

```

这样将会列出包含关键词 “vim” 的插件。

当然你也可以指定确切的插件名，比如：

```
:PluginSearch vim-dasm

```

移动焦点到正确的一行上，按下 `i` 键来安装插件。现在，被选择的插件将会被安装。

类似的，在你的系统中安装所有想要的插件。一旦安装成功，使用下列命令删除 Vundle 缓存：

```
:bdelete

```

现在，插件已经安装完成。为了让插件正确的自动加载，我们需要在 `.vimrc` 文件中添加安装好的插件名。

这样做：

```
:e ~/.vimrc

```

添加这一行：

```
[...]
Plugin 'vim-dasm'
[...]

```

用自己的插件名替换 vim-dasm。然后，敲击 `ESC`，键入 `:wq` 保存退出。

请注意，所有插件都必须在 `.vimrc` 文件中追加如下内容。

```
[...]
filetype plugin indent on

```

#### 列出已安装的插件

键入下面命令列出所有已安装的插件：

```
:PluginList

```

#### 更新插件

键入下列命令更新插件：

```
:PluginUpdate

```

键入下列命令重新安装所有插件：

```
:PluginInstall!

```

#### 卸载插件

首先，列出所有已安装的插件：

```
:PluginList

```

之后将焦点置于正确的一行上，按下 `SHITF+d` 组合键。

然后编辑你的 `.vimrc` 文件：

```
:e ~/.vimrc

```

删除插件入口。最后，键入 `:wq` 保存退出。

或者，你可以通过移除插件所在 `.vimrc` 文件行，并且执行下列命令，卸载插件：

```
:PluginClean

```

这个命令将会移除所有不在你的 `.vimrc` 文件中但是存在于 bundle 目录中的插件。

你应该已经掌握了 Vundle 管理插件的基本方法了。在 Vim 中使用下列命令，查询帮助文档，获取更多细节。

```
:h vundle

```

现在我已经把所有内容都告诉你了。很快，我就会出下一篇教程。保持关注！

干杯！

### 资源

[Vundle GitHub 仓库](https://github.com/VundleVim/Vundle.vim)

---

via: <https://www.ostechnix.com/manage-vim-plugins-using-vundle-linux/>

作者：[SK](https://www.ostechnix.com/author/sk/) 译者：[CYLeft](https://github.com/CYLeft) 校对：[wxy](https://github.com/wxy)

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


并发服务器（五）：Redis 案例研究

Summary: 在前四部分中我们讨论了并发服务器的结构，这篇文章我们将去研究一个在生产系统中大量使用的服务器的案例—— Redis。

# 并发服务器（五）：Redis 案例研究

这是我写的并发网络服务器系列文章的第五部分。在前四部分中我们讨论了并发服务器的结构，这篇文章我们将去研究一个在生产系统中大量使用的服务器的案例—— [Redis](https://redis.io/)。

Redis 是一个非常有魅力的项目，我关注它很久了。它最让我着迷的一点就是它的 C 源代码非常清晰。它也是一个高性能、大并发的内存数据库服务器的非常好的例子，它是研究网络并发服务器的一个非常好的案例，因此，我们不能错过这个好机会。

我们来看看前四部分讨论的概念在真实世界中的应用程序。

本系列的所有文章有：

* [第一节 - 简介](/article-8993-1.html)
* [第二节 - 线程](/article-9002-1.html)
* [第三节 - 事件驱动](/article-9117-1.html)
* [第四节 - libuv](/article-9397-1.html)
* [第五节 - Redis 案例研究](http://eli.thegreenplace.net/2017/concurrent-servers-part-5-redis-case-study/)

### 事件处理库

Redis 最初发布于 2009 年，它最牛逼的一件事情大概就是它的速度 —— 它能够处理大量的并发客户端连接。需要特别指出的是，它是用*一个单线程*来完成的，而且还不对保存在内存中的数据使用任何复杂的锁或者同步机制。

Redis 之所以如此牛逼是因为，它在给定的系统上使用了其可用的最快的事件循环，并将它们封装成由它实现的事件循环库（在 Linux 上是 epoll，在 BSD 上是 kqueue，等等）。这个库的名字叫做 [ae](https://redis.io/topics/internals-rediseventlib)。ae 使得编写一个快速服务器变得很容易，只要在它内部没有阻塞即可，而 Redis 则保证  注1 了这一点。

在这里，我们的兴趣点主要是它对*文件事件*的支持 —— 当文件描述符（如网络套接字）有一些有趣的未决事情时将调用注册的回调函数。与 libuv 类似，ae 支持多路事件循环（参阅本系列的[第三节](/article-9117-1.html)和[第四节](/article-9397-1.html)）和不应该感到意外的 `aeCreateFileEvent` 信号：

```
int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,
                      aeFileProc *proc, void *clientData);

```

它在 `fd` 上使用一个给定的事件循环，为新的文件事件注册一个回调（`proc`）函数。当使用的是 epoll 时，它将调用 `epoll_ctl` 在文件描述符上添加一个事件（可能是 `EPOLLIN`、`EPOLLOUT`、也或许两者都有，取决于 `mask` 参数）。ae 的 `aeProcessEvents` 功能是 “运行事件循环和发送回调函数”，它在底层调用了 `epoll_wait`。

### 处理客户端请求

我们通过跟踪 Redis 服务器代码来看一下，ae 如何为客户端事件注册回调函数的。`initServer` 启动时，通过注册一个回调函数来读取正在监听的套接字上的事件，通过使用回调函数 `acceptTcpHandler` 来调用 `aeCreateFileEvent`。当新的连接可用时，这个回调函数被调用。它调用 `accept`  注2 ，接下来是 `acceptCommonHandler`，它转而去调用 `createClient` 以初始化新客户端连接所需要的数据结构。

`createClient` 的工作是去监听来自客户端的入站数据。它将套接字设置为非阻塞模式（一个异步事件循环中的关键因素）并使用 `aeCreateFileEvent` 去注册另外一个文件事件回调函数以读取事件 —— `readQueryFromClient`。每当客户端发送数据，这个函数将被事件循环调用。

`readQueryFromClient` 就让我们期望的那样 —— 解析客户端命令和动作，并通过查询和/或操作数据来回复。因为客户端套接字是非阻塞的，所以这个函数必须能够处理 `EAGAIN`，以及部分数据；从客户端中读取的数据是累积在客户端专用的缓冲区中，而完整的查询可能被分割在回调函数的多个调用当中。

### 将数据发送回客户端

在前面的内容中，我说到了 `readQueryFromClient` 结束了发送给客户端的回复。这在逻辑上是正确的，因为 `readQueryFromClient` *准备*要发送回复，但它不真正去做实质的发送 —— 因为这里并不能保证客户端套接字已经准备好写入/发送数据。我们必须为此使用事件循环机制。

Redis 是这样做的，它注册一个 `beforeSleep` 函数，每次事件循环即将进入休眠时，调用它去等待套接字变得可以读取/写入。`beforeSleep` 做的其中一件事情就是调用 `handleClientsWithPendingWrites`。它的作用是通过调用 `writeToClient` 去尝试立即发送所有可用的回复；如果一些套接字不可用时，那么*当*套接字可用时，它将注册一个事件循环去调用 `sendReplyToClient`。这可以被看作为一种优化 —— 如果套接字可用于立即发送数据（一般是 TCP 套接字），这时并不需要注册事件 ——直接发送数据。因为套接字是非阻塞的，它从不会去阻塞循环。

### 为什么 Redis 要实现它自己的事件库？

在 [第四节](/article-9397-1.html) 中我们讨论了使用 libuv 来构建一个异步并发服务器。需要注意的是，Redis 并没有使用 libuv，或者任何类似的事件库，而是它去实现自己的事件库 —— ae，用 ae 来封装 epoll、kqueue 和 select。事实上，Antirez（Redis 的创建者）恰好在 [2011 年的一篇文章](http://oldblog.antirez.com/post/redis-win32-msft-patch.html) 中回答了这个问题。他的回答的要点是：ae 只有大约 770 行他理解的非常透彻的代码；而 libuv 代码量非常巨大，也没有提供 Redis 所需的额外功能。

现在，ae 的代码大约增长到 1300 多行，比起 libuv 的 26000 行（这是在没有 Windows、测试、示例、文档的情况下的数据）来说那是小巫见大巫了。libuv 是一个非常综合的库，这使它更复杂，并且很难去适应其它项目的特殊需求；另一方面，ae 是专门为 Redis 设计的，与 Redis 共同演进，只包含 Redis 所需要的东西。

这是我 [前些年在一篇文章中](http://eli.thegreenplace.net/2017/benefits-of-dependencies-in-software-projects-as-a-function-of-effort/) 提到的软件项目依赖关系的另一个很好的示例：

>
> 依赖的优势与在软件项目上花费的工作量成反比。
>
>
>

在某种程度上，Antirez 在他的文章中也提到了这一点。他提到，提供大量附加价值（在我的文章中的“基础” 依赖）的依赖比像 libuv 这样的依赖更有意义（它的例子是 jemalloc 和 Lua），对于 Redis 特定需求，其功能的实现相当容易。

### Redis 中的多线程

[在 Redis 的绝大多数历史中](http://antirez.com/news/93)，它都是一个不折不扣的单线程的东西。一些人觉得这太不可思议了，有这种想法完全可以理解。Redis 本质上是受网络束缚的 —— 只要数据库大小合理，对于任何给定的客户端请求，其大部分延时都是浪费在网络等待上，而不是在 Redis 的数据结构上。

然而，现在事情已经不再那么简单了。Redis 现在有几个新功能都用到了线程：

1. “惰性” [内存释放](http://antirez.com/news/93)。
2. 在后台线程中使用 fsync 调用写一个 [持久化日志](https://redis.io/topics/persistence)。
3. 运行需要执行一个长周期运行的操作的用户定义模块。

对于前两个特性，Redis 使用它自己的一个简单的 bio（它是 “Background I/O" 的首字母缩写）库。这个库是根据 Redis 的需要进行了硬编码，它不能用到其它的地方 —— 它运行预设数量的线程，每个 Redis 后台作业类型需要一个线程。

而对于第三个特性，[Redis 模块](https://redis.io/topics/modules-intro) 可以定义新的 Redis 命令，并且遵循与普通 Redis 命令相同的标准，包括不阻塞主线程。如果在模块中自定义的一个 Redis 命令，希望去执行一个长周期运行的操作，这将创建一个线程在后台去运行它。在 Redis 源码树中的 `src/modules/helloblock.c` 提供了这样的一个示例。

有了这些特性，Redis 使用线程将一个事件循环结合起来，在一般的案例中，Redis 具有了更快的速度和弹性，这有点类似于在本系统文章中 [第四节](/article-9397-1.html) 讨论的工作队列。

* 注1： Redis 的一个核心部分是：它是一个 *内存中* 数据库；因此，查询从不会运行太长的时间。当然了，这将会带来各种各样的其它问题。在使用分区的情况下，服务器可能最终路由一个请求到另一个实例上；在这种情况下，将使用异步 I/O 来避免阻塞其它客户端。
* 注2： 使用 `anetAccept`；`anet` 是 Redis 对 TCP 套接字代码的封装。

---

via: <https://eli.thegreenplace.net/2017/concurrent-servers-part-5-redis-case-study/>

作者：[Eli Bendersky](https://eli.thegreenplace.net/pages/about) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


搭建私有云：OwnCloud

安装部署其实比较简单，生成环境用的话，整体的架构与优化才是重点。  还有就是结合onlineoffice在线编辑插件的资料多一些也不错。

请问一下，官网上有一种方式是 apt-get 安装，和源码安装有什么区别吗？

apt-get 就是现成的软件包，安装即可，而源码需要编译配置。

我现在都没用owncloud了，改用可道云kodexplorer，类windows操作风格我很喜欢，看起高大上的感觉。哈哈哈

我也在用kodexplorer，要不要加个好友。分享点资源给我

来自浙江杭州的 Microsoft Edge 17.17134|Windows 10 用户

个人用户免费试用吗，收费什么标准

个人用户永久免费，也是个开源网盘程序

大神您好，我按照您的文档部署，登入后，不是动态界面，而是index.php的代码，怎么回事

# 搭建私有云：OwnCloud

所有人都在讨论云。尽管市面上有很多为我们提供云存储和其他云服务的主要服务商，但是我们还是可以为自己搭建一个私有云。

在本教程中，我们将讨论如何利用 OwnCloud 搭建私有云。OwnCloud 是一个可以安装在我们 Linux 设备上的 web 应用程序，能够存储和用我们的数据提供服务。OwnCloud 可以分享日历、联系人和书签，共享音/视频流等等。

本教程中，我们使用的是 CentOS 7 系统，但是本教程同样适用于其他 Linux 发行版中安装 OwnCloud。让我们开始安装 OwnCloud 并且做一些准备工作，

* 推荐阅读：[如何在 CentOS & RHEL 上使用 Apache 作为反向代理服务器](http://linuxtechlab.com/apache-as-reverse-proxy-centos-rhel/)
* 同时推荐：[实时 Linux 服务器监测和 GLANCES 监测工具](http://linuxtechlab.com/linux-server-glances-monitoring-tool/)

### 预备

* 我们需要在机器上配置 LAMP。参照阅读我们的文章《[在 CentOS/RHEL 上配置 LAMP 服务器最简单的教程](http://linuxtechlab.com/easiest-guide-creating-lamp-server/)》 & 《[在 Ubuntu 搭建 LAMP](http://linuxtechlab.com/install-lamp-stack-on-ubuntu/)》。
* 我们需要在自己的设备里安装这些包，`php-mysql`、 `php-json`、 `php-xml`、 `php-mbstring`、 `php-zip`、 `php-gd`、 `curl、`php-curl`、`php-pdo`。使用包管理器安装它们。

```
$ sudo yum install php-mysql php-json php-xml php-mbstring php-zip php-gd curl php-curl php-pdo

```

### 安装

安装 OwnCloud，我们现在需要在服务器上下载 OwnCloud 安装包。使用下面的命令从官方网站下载最新的安装包（10.0.4-1）：

```
$ wget https://download.owncloud.org/community/owncloud-10.0.4.tar.bz2

```

使用下面的命令解压：

```
$ tar -xvf owncloud-10.0.4.tar.bz2

```

现在，将所有解压后的文件移动至 `/var/www/html`：

```
$ mv owncloud/* /var/www/html

```

下一步，我们需要在 Apache 的配置文件 `httpd.conf` 上做些修改：

```
$ sudo vim /etc/httpd/conf/httpd.conf

```

更改下面的选项：

```
AllowOverride All

```

保存该文件，并修改 OwnCloud 文件夹的文件权限：

```
$ sudo chown -R apache:apache /var/www/html/
$ sudo chmod 777 /var/www/html/config/

```

然后重启 Apache 服务器执行修改：

```
$ sudo systemctl restart httpd

```

现在，我们需要在 MariaDB 上创建一个数据库，保存来自 OwnCloud 的数据。使用下面的命令创建数据库和数据库用户：

```
$ mysql -u root -p
MariaDB [(none)] > create database owncloud;
MariaDB [(none)] > GRANT ALL ON owncloud.* TO ocuser@localhost IDENTIFIED BY 'owncloud';
MariaDB [(none)] > flush privileges;
MariaDB [(none)] > exit

```

服务器配置部分完成后，现在我们可以在网页浏览器上访问 OwnCloud。打开浏览器，输入您的服务器 IP 地址，我这边的服务器是 10.20.30.100：

一旦 URL 加载完毕，我们将呈现上述页面。这里，我们将创建管理员用户同时提供数据库信息。当所有信息提供完毕，点击“Finish setup”。

我们将被重定向到登录页面，在这里，我们需要输入先前创建的凭据：

认证成功之后，我们将进入 OwnCloud 面板：

我们可以使用手机应用程序，同样也可以使用网页界面更新我们的数据。现在，我们已经有自己的私有云了，同时，关于如何安装 OwnCloud 创建私有云的教程也进入尾声。请在评论区留下自己的问题或建议。

---

via: <http://linuxtechlab.com/create-personal-cloud-install-owncloud/>

作者：[SHUSAIN](http://linuxtechlab.com/author/shsuain/) 译者：[CYLeft](https://github.com/CYLeft) 校对：[wxy](https://github.com/wxy)

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


区块链的商用之道

# 区块链的商用之道

区块链之所以被称之为一种“颠覆性”的新兴技术，因为尽管其成名于比特币，但未来区块链的用武之地将远远超过加密货币。区块链的分布式共享账本这一技术本质能够在商业网络中使更多的参与方得以更加广泛的参与，并为商业网络或行业业务带来更低的沟通或整合成本，以及更高的业务效率。可以预见，区块链作为一个独立的技术板块，会在商业领域得到广泛应用。

### 1、区块链的 2.0 时代：商用区块链

自 2009 年比特币在交易领域迅速崛起以来，这种加密币受到了广泛关注，但也颇受争议。不过比特币的底层技术——区块链，由于能够快速改进银行、供应链以及其他的交易网络，在降低与业务运营相关的成本和风险的同时，创造新的创新和增长机会，是比较无争议的新兴技术模式，得到了商业世界的鼎力支持。

传统的商业业务模式存在很难在一个互信的网络中监视跨机构的交易执行的问题：每个参与方都有自己的账本，在交易发生时各自更改；协同各方导致的额外工作及中介等附加成本；由于业务条件，“合同”重复分散在各个参与方造成整体业务流程的不有效性；整个业务网络依赖于一个或几个中心系统，整个商业网络十分脆弱。

而区块链提供了共享的、复制的、授权的账本这样一个解决方案。区块链架构带来以下改变：区块链架构使每一个商业网络的参与方都具有一个共享的账本，当交易发生时，通过点对点的复制更改所有账本；使用密码算法确保网络上的参与者仅仅可以看到和他们相关的账本内容，交易是安全的、授权的和验证的；区块链也将资产转移交易相关的合同条款嵌入交易数据库以做到满足商务条件下交易才发生；网络参与者基于共识机制或类似的机制来保证交易时共同验证的，商业网络满足政府监管、合规及审计。总体而言，区块链在提高业务效率和简化流程上确实具有优势。

当前国内外区块链产业生态发展迅猛，产业链层次逐渐清晰，无论从底层基础架构和平台，还是细分产业板块的区块链应用，以及风险资本投资都已初具规模。综合来看，全球区块链在商业行业发展具有三大趋势：

1）从比特币向更丰富的应用场景发展。区块链 2.0 把之前“区块链就是比特币”的意义向前推进了一大步，区块链也不再是比特币的专有技术和代名词，而且在更加广泛的应用场景中，成为资产流转的价值表述。区块链当下不再依赖数字货币或资产这一类的单一场景，而是发展到支付汇兑、电子商务、移动社交、众筹、慈善、互助保险等面向终端用户的应用，以及数字资产、IP版权和交易、金融清算和结算、商品溯源等企业级应用领域。

2）全球区块链生态日益丰富，参与方开始出现明显的产业分工。从全球的视角来看，随着参与者越来越多，区块链形成了不同技术平台、行业以及发展路径的产业生态。对全球的区块链从业者来说，更看重区块链作为未来<ruby> 金融科技 <rp>  （ </rp> <rt>  FinTech </rt> <rp>  ） </rp></ruby>的一个领域而提前布局，大胆尝试实践区块链在金融及其他行业中的各类业务场景。同时，高科技龙头企业也希望在区块链技术框架的建立上尽早发力，通过支持全球开源社区建立更扎实的底层区块链平台和更广泛的应用场景。区块链的热潮带动了更多创业者的热情，众多初创公司如雨后春笋般的应运而生。从行业角度来看，区块链初创公司覆盖了银行和保险服务、供应链、医疗、物联网、外贸等众多行业背景，可谓是百花齐放。

3）全球投资正在快速注入，重点关注企业级应用落地。区块链项目融资正呈现井喷式增长，从 2012 年到 2015 年，区块链领域吸引的风险投资从 200 万美元增长到 4.69 亿美元，增长超过了 200 倍，累计投资已达 10 亿美元左右。2016 年仅在金融领域，区块链技术投资额就占整体投资的七成以上。从全球的投资情况来看，由于越来越多的行业已经开始实践区块链，使得更多的投资人开始关注在行业内的区块链应用场景，投资上趋于理性，但更注重利用投资者自身资源帮助投资标的进行深度的行业孵化。

总之，市场，行业，投资等多方对于商用区块链的发展诉求十分强烈，作为“颠覆性创新”技术的区块链前景光明。

### 2、超级账本：商用区块链的“第五元素”

企业级区块链四大平台要素包括：共享账簿，共识，隐私和保密，智能合约。此外，还有第五要素，即商业网络。企业级的区块链一定是围绕业务场景展开的，因此在第五元素商业网络当中需要包含市场参与者的对等架构以及伙伴间的一个共识协议。

目前，以比特币为代表的公有链有一些加密货币之外的新型应用，但是却无法克服自身固有的一些问题，例如交易效率低，区块没有<ruby> 最终确定性 <rp>  （ </rp> <rt>  finality </rt> <rp>  ） </rp></ruby>等，而且是由极客主导的，不符合商业主流趋势。为了克服上述不足，满足大多数商业应用的要求，设计开发适合商用的区块链平台迫在眉睫。

Linux 基金会于 2015 年 12 月启动了名为“超级账本”（Hyperledger）的开源项目应运而生。该项目旨在推动各方协作，共同打造基于区块链的企业级分布式账本底层技术，用于构建支撑业务的行业应用和平台，以便支持各种各样的商业应用场景。超级账本是代码数量最大社区参与度最高的区块链开源项目。

企业级商用区块链网络比较适合使用联盟链和许可制。这样在一个限定的范围内，只有授权的节点和用户才能参与到交易和智能合约的执行中来，而任何的匿名节点或非授权用户均被拒绝服务。从团体联盟的角度增加了区块链网络的安全可靠。当前，欧美主流的区块链应用大部分是行业链或者是联盟链，也就是某一个行业的上下游，或者是核心企业大家联合起来，一起来构建的半公开化的区块链。从这个角度讲，超级账本具备成为未来最主要的商用区块链技术平台的潜力，值得技术开发人员花时间和精力进行学习研究。

由于超级账本有个重要的设计原则就是按照<ruby> “用例驱动” <rp>  （ </rp> <rt>  use case driven </rt> <rp>  ） </rp></ruby>的方式来实现的，所有功能都应该有对应的用例需求，因此学习研究的过程并不一定十分辛苦。此外，鉴于超级账本是个通用型框架，无法预先确定将来所有的应用场景，因此，定义出部分典型的用例，可使超级账本先满足这部分代表性的区块链应用需求，然后再用可替换模块满足其他需求。

### 3、区块链的商业应用场景

区块链的商业应用才刚刚起步，一般都将金融业应用作为切入口，很多其他领域的应用还在探索或试水阶段。最重要的是，不能为了技术而技术，为了区块链而区块链。商用区块链技术要解决企业的痛点，为客户创造新的价值。可喜的是，在金融和金融以外的各个细分领域，区块链都在加速落地。以下为一些应用实例和构想。

1）金融领域。21 世纪是金融的“大航海时代”，区块链在银行、保险、清算、股权登记交易、信用评级、公证等领域，既需要绝对的可信任，也需要隐私保密，特别适合区块链应用。举例来说，金融行业关心的资产分布式管存，可以把资产（如证券等）数据存放在区块链网络后，资产的利益相关人可以直接访问资产数据，而无需经过传统的中间人，可大幅提高效率和节约成本。区块链股权登记和交易平台脱胎于加密币交易所，也是比较合适、比较容易实现的应用。

2）产业互联网领域。供应链溯源和共享经济可以应用区块链。在供应链中，所有的参与者都通过区块链记录、追踪和共享各种数据，这些数据记录在区块链里面并贯穿货物的生产、运输和销售等环节，从而提供深度回溯查询等核心功能，实现信息公开透明，出了问题可以用来追责。附加值较高的食品、药品和疫苗、零部件生产检测结果等都可以使用区块链。

例如，现在市场上号称是北大荒地区生产的大米，特别是五常大米，是当地实际产量的很多倍，造成良莠不齐。消费者希望花比较高的价钱购买真正的北大荒大米，却苦于根本无法分辨哪些大米是真的。此处可以提现区块链在供应链溯源上的价值，就是利用区块链的数据记录的真实性或者是有效性。如果通过在原产地和各个流通环节中设置的传感设备在区块链上签名盖戳，一旦进入到区块链里面，每个人的签名就不能抵赖了。含有被区块链标记的时间戳、地理戳、品质戳的放心粮从源头上杜绝各个环节作弊的动机，市场上才能销售与当地产量相匹配的大米。

1）传统行业的转型创新。区块链的应用绝不仅局限于金融和互联网等前沿领域，还可以与能源，零售，电商、房地产等传统领域接轨，因此区块链不是个摆设。例如，高盛公司就提出，对于资产所有权需经过谨慎识别的房地产交易，如果能够利用区块链技术建立安全、共享的所有权数据库，那么房产交易纠纷和交易成本将大大缩小。

2）FinTech 2.0 的三驾马车：区块链、认知物联网和人工智能。未来，世界将进入人工智能、认知物联网和区块链三足鼎立的时期，如果能将三者有机结合将创造巨大的价值。例如，如果将闲置或未充分利用的资产（汽车、仓库、医疗设备等）接入物联网，那么区块链技术则可以帮助互不相识的这些资产的所有者进行资产使用的交易谈判。在共享经济的模式下，最需要解决的就是陌生人之间的信任问题，即资源的提供方和资源的租用者，如何在缺乏信任的基础上安全地完成交易。分布式区块链将是全新的一种去信任的方式，不使用任何中间平台，达到各方参与者的可靠交易的目的。这有点类似于分时用车和分时用房，将引爆以前隐藏在深处的过剩资产容量。

——本文摘自《深度探索区块链：Hyperledger 技术与应用》

---

想学习区块链知识的同学可以参加由 华章书院、智链 ChainNova 主办，Linux 中国协办的[第3届《洞见区块链·深度探索区块链》技术沙龙](http://www.huodongxing.com/event/5429319192800)。

时间： 2018 年 3 月 18 日 13:00 ～ 17:30 。

地点：北京市海淀区海淀西大街36号昊海写字楼3楼（清华经管创业者加速器）

限额 200 人

[点此报名](http://www.huodongxing.com/event/5429319192800)，或扫描二维码报名。


如何使用 syslog-ng 从远程 Linux 机器上收集日志

# 如何使用 syslog-ng 从远程 Linux 机器上收集日志

如果你的数据中心全是 Linux 服务器，而你就是系统管理员。那么你的其中一项工作内容就是查看服务器的日志文件。但是，如果你在大量的机器上去查看日志文件，那么意味着你需要挨个去登入到机器中来阅读日志文件。如果你管理的机器很多，仅这项工作就可以花费你一天的时间。

另外的选择是，你可以配置一台单独的 Linux 机器去收集这些日志。这将使你的每日工作更加高效。要实现这个目的，有很多的不同系统可供你选择，而 syslog-ng 就是其中之一。

syslog-ng 的不足是文档并不容易梳理。但是，我已经解决了这个问题，我可以通过这种方法马上进行安装和配置 syslog-ng。下面我将在 Ubuntu Server 16.04 上示范这两种方法：

* UBUNTUSERVERVM 的 IP 地址是 192.168.1.118 ，将配置为日志收集器
* UBUNTUSERVERVM2 将配置为一个客户端，发送日志文件到收集器

现在我们来开始安装和配置。

### 安装

安装很简单。为了尽可能容易，我将从标准仓库安装。打开一个终端窗口，运行如下命令：

```
sudo apt install syslog-ng

```

你必须在收集器和客户端的机器上都要运行上面的命令。安装完成之后，你将开始配置。

### 配置收集器

现在，我们开始日志收集器的配置。它的配置文件是 `/etc/syslog-ng/syslog-ng.conf`。syslog-ng 安装完成时就已经包含了一个配置文件。我们不使用这个默认的配置文件，可以使用 `mv /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.BAK` 将这个自带的默认配置文件重命名。现在使用 `sudo nano /etc/syslog/syslog-ng.conf` 命令创建一个新的配置文件。在这个文件中添加如下的行：

```
@version: 3.5
@include "scl.conf"
@include "`scl-root`/system/tty10.conf"
    options {
        time-reap(30);
        mark-freq(10);
        keep-hostname(yes);
        };
    source s_local { system(); internal(); };
    source s_network {
        syslog(transport(tcp) port(514));
        };
    destination d_local {
    file("/var/log/syslog-ng/messages_${HOST}"); };
    destination d_logs {
        file(
            "/var/log/syslog-ng/logs.txt"
            owner("root")
            group("root")
            perm(0777)
            ); };
    log { source(s_local); source(s_network); destination(d_logs); };

```

需要注意的是，syslog-ng 使用 514 端口，你需要确保在你的网络上它可以被访问。

保存并关闭这个文件。上面的配置将转存期望的日志文件（由 `system()` 和 `internal()` 指出）到 `/var/log/syslog-ng/logs.txt` 中。因此，你需要使用如下的命令去创建所需的目录和文件：

```
sudo mkdir /var/log/syslog-ng
sudo touch /var/log/syslog-ng/logs.txt

```

使用如下的命令启动和启用 syslog-ng：

```
sudo systemctl start syslog-ng
sudo systemctl enable syslog-ng

```

### 配置客户端

我们将在客户端上做同样的事情（移动默认配置文件并创建新配置文件）。拷贝下列文本到新的客户端配置文件中：

```
@version: 3.5
@include "scl.conf"
@include "`scl-root`/system/tty10.conf"
source s_local { system(); internal(); };
destination d_syslog_tcp {
              syslog("192.168.1.118" transport("tcp") port(514)); };
log { source(s_local);destination(d_syslog_tcp); };

```

请注意：请将 IP 地址修改为收集器的 IP 地址。

保存和关闭这个文件。与在配置为收集器的机器上一样的方法启动和启用 syslog-ng。

查看日志文件
------

回到你的配置为收集器的服务器上，运行这个命令 `sudo tail -f /var/log/syslog-ng/logs.txt`。你将看到包含了收集器和客户端的日志条目的输出（图 A）。

恭喜你！syslog-ng 已经正常工作了。你现在可以登入到你的收集器上查看本地机器和远程客户端的日志了。如果你的数据中心有很多 Linux 服务器，在每台服务器上都安装上 syslog-ng 并配置它们作为客户端发送日志到收集器，这样你就不需要登入到每个机器去查看它们的日志了。

---

via: <https://www.techrepublic.com/article/how-to-use-syslog-ng-to-collect-logs-from-remote-linux-machines/>

作者：[Jack Wallen](%5B1%5D:https://tr1.cbsistatic.com/hub/i/r/2017/01/11/51204409-68e0-49b8-a637-01af26be85f6/resize/770x/688dfedad4ed30ec4baf548c2adb8cd4/linuxhero.jpg) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


下一次技术面试时要问的 3 个重要问题

# 下一次技术面试时要问的 3 个重要问题

<img src="content_image/album_201803_08_230424aizx8m88mccy6mem.jpg" alt="" title="">

>
> 面试可能会有压力，但 58％ 的公司告诉 Dice 和 Linux 基金会，他们需要在未来几个月内聘请开源人才。学习如何提出正确的问题。
>
>
>

Dice 和 Linux 基金会的年度[开源工作报告](https://www.linuxfoundation.org/blog/2017-jobs-report-highlights-demand-open-source-skills/)揭示了开源专业人士的前景以及未来一年的招聘活动。在今年的报告中，86％ 的科技专业人士表示，了解开源推动了他们的职业生涯。然而，当在他们自己的组织内推进或在别处申请新职位的时候，有这些经历会发生什么呢？

面试新工作绝非易事。除了在准备新职位时还要应付复杂的工作，当面试官问“你有什么问题要问吗？”时，适当的回答更增添了压力。

在 Dice，我们从事职业、建议，并将技术专家与雇主连接起来。但是我们也在公司里雇佣技术人才来开发开源项目。实际上，Dice 平台基于许多 Linux 发行版，我们利用开源数据库作为我们搜索功能的基础。总之，如果没有开源软件，我们就无法运行 Dice，因此聘请了解和热爱开源软件的专业人士至关重要。

多年来，我在面试中了解到提出好问题的重要性。这是一个了解你的潜在新雇主的机会，以及更好地了解他们是否与你的技能相匹配。

这里有三个要问的重要问题，以及其重要的原因：

### 1、 公司对员工在空闲时间致力于开源项目或编写代码的立场是什么？

这个问题的答案会告诉正在面试的公司的很多信息。一般来说，只要它与你在该公司所从事的工作没有冲突，公司会希望技术专家为网站或项目做出贡献。在公司之外允许这种情况，也会在技术组织中培养出一种创业精神，并教授技术技能，否则在正常的日常工作中你可能无法获得这些技能。

### 2、 项目如何区分优先级？

由于所有的公司都成为了科技公司，所以在创新的客户面对技术项目与改进平台本身之间往往存在着分歧。你会努力保持现有的平台最新么？或者致力于公众开发新产品？根据你的兴趣，答案可以决定公司是否适合你。

### 3、 谁主要决定新产品，开发者在决策过程中有多少投入？

这个问题是了解谁负责公司创新（以及与他/她有多少联系），还有一个是了解你在公司的职业道路。在开发新产品之前，一个好的公司会和开发人员和开源人才交流。这看起来不用多想，但有时会错过这步，意味着在新产品发布之前协作环境的不同或者混乱的过程。

面试可能会有压力，但是 58％ 的公司告诉 Dice 和 Linux 基金会他们需要在未来几个月内聘用开源人才，所以记住高需求会让像你这样的专业人士成为雇员。以你想要的方向引导你的事业。

现在[下载](http://bit.ly/2017OSSjobsreport)完整的 2017 年开源工作报告。

---

via: <https://www.linux.com/blog/os-jobs/2017/12/3-essential-questions-ask-your-next-tech-interview>

作者：[Brian Hostetter](https://www.linux.com/users/brianhostetter) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 中配置 ssh 登录导语

Summary: 无论何时登录公司的某些生产系统，你都会看到一些登录消息、警告或关于你将登录或已登录的服务器的信息，如下所示。这些是登录导语（login banner）。

# 如何在 Linux 中配置 ssh 登录导语

>
> 了解如何在 Linux 中创建登录导语，来向要登录或登录后的用户显示不同的警告或消息。
>
>
>

无论何时登录公司的某些生产系统，你都会看到一些登录消息、警告或关于你将登录或已登录的服务器的信息，如下所示。这些是<ruby> 登录导语 <rt>  login banner </rt></ruby>。

在本文中，我们将引导你配置它们。

你可以配置两种类型的导语。

1. 用户登录前显示的导语信息（在你选择的文件中配置，例如 `/etc/login.warn`）
2. 用户成功登录后显示的导语信息（在 `/etc/motd` 中配置）

### 如何在用户登录前连接系统时显示消息

当用户连接到服务器并且在登录之前，这个消息将被显示给他。意味着当他输入用户名时，该消息将在密码提示之前显示。

你可以使用任何文件名并在其中输入信息。在这里我们使用 `/etc/login.warn` 并且把我们的消息放在里面。

```
# cat /etc/login.warn
        !!!! Welcome to KernelTalks test server !!!!
This server is meant for testing Linux commands and tools. If you are
not associated with kerneltalks.com and not authorized please dis-connect
immediately.

```

现在，需要将此文件和路径告诉 `sshd` 守护进程，以便它可以为每个用户登录请求获取此标语。对于此，打开 `/etc/sshd/sshd_config` 文件并搜索 `#Banner none`。

这里你需要编辑该配置文件，并写下你的文件名并删除注释标记（`#`）。它应该看起来像：`Banner /etc/login.warn`。

保存文件并重启 `sshd` 守护进程。为避免断开现有的连接用户，请使用 HUP 信号重启 sshd。

```
root@kerneltalks # ps -ef | grep -i sshd
root     14255     1  0 18:42 ?        00:00:00 /usr/sbin/sshd -D
root     19074 14255  0 18:46 ?        00:00:00 sshd: ec2-user [priv]
root     19177 19127  0 18:54 pts/0    00:00:00 grep -i sshd

root@kerneltalks # kill -HUP 14255

```

就是这样了！打开新的会话并尝试登录。你将看待你在上述步骤中配置的消息。

你可以在用户输入密码登录系统之前看到此消息。

### 如何在用户登录后显示消息

消息用户在成功登录系统后看到的<ruby> 当天消息 <rt>  Message Of The Day </rt></ruby>（MOTD）由 `/etc/motd` 控制。编辑这个文件并输入当成功登录后欢迎用户的消息。

```
root@kerneltalks # cat /etc/motd
           W E L C O M E
Welcome to the testing environment of kerneltalks.
Feel free to use this system for testing your Linux
skills. In case of any issues reach out to admin at
info@kerneltalks.com. Thank you.

```

你不需要重启 `sshd` 守护进程来使更改生效。只要保存该文件，`sshd` 守护进程就会下一次登录请求时读取和显示。

你可以在上面的截图中看到：黄色框是由 `/etc/motd` 控制的 MOTD，绿色框就是我们之前看到的登录导语。

你可以使用 [cowsay](https://kerneltalks.com/tips-tricks/cowsay-fun-in-linux-terminal/)、[banner](https://kerneltalks.com/howto/create-nice-text-banner-hpux/)、[figlet](https://kerneltalks.com/tips-tricks/create-beautiful-ascii-text-banners-linux/)、[lolcat](https://kerneltalks.com/linux/lolcat-tool-to-rainbow-color-linux-terminal/) 等工具创建出色的引人注目的登录消息。此方法适用于几乎所有 Linux 发行版，如 RedHat、CentOs、Ubuntu、Fedora 等。

---

via: <https://kerneltalks.com/tips-tricks/how-to-configure-login-banners-in-linux/>

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

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


9 个提高系统运行速度的轻量级 Linux 应用

Summary: 加速 Ubuntu 系统有很多方法，办法之一是使用轻量级应用来替代一些常用应用程序。

# 9 个提高系统运行速度的轻量级 Linux 应用

>
> **简介：** [加速 Ubuntu 系统](https://itsfoss.com/speed-up-ubuntu-1310/)有很多方法，办法之一是使用轻量级应用来替代一些常用应用程序。我们之前之前发布过一篇 [Linux 必备的应用程序](https://itsfoss.com/essential-linux-applications/)，如今将分享这些应用程序在 Ubuntu 或其他 Linux 发行版的轻量级替代方案。
>
>
>

### 9 个常用 Linux 应用程序的轻量级替代方案

你的 Linux 系统很慢吗？应用程序是不是很久才能打开？你最好的选择是使用[轻量级的 Linux 系统](https://itsfoss.com/lightweight-linux-beginners/)。但是重装系统并非总是可行，不是吗？

所以如果你想坚持使用你现在用的 Linux 发行版，但是想要提高性能，你应该使用更轻量级应用来替代你一些常用的应用。这篇文章会列出各种 Linux 应用程序的轻量级替代方案。

由于我使用的是 Ubuntu，因此我只提供了基于 Ubuntu 的 Linux 发行版的安装说明。但是这些应用程序可以用于几乎所有其他 Linux 发行版。你只需去找这些轻量级应用在你的 Linux 发行版中的安装方法就可以了。

### 1. Midori： Web 浏览器

[Midori](http://midori-browser.org/) 是与现代互联网环境具有良好兼容性的最轻量级网页浏览器之一。它是开源的，使用与 Google Chrome 最初所基于的相同的渲染引擎 —— WebKit。并且超快速，最小化但高度可定制。

Midori 浏览器有很多可以定制的扩展和选项。如果你有最高权限，使用这个浏览器也是一个不错的选择。如果在浏览网页的时候遇到了某些问题，请查看其网站上[常见问题](http://midori-browser.org/faqs/)部分 -- 这包含了你可能遇到的常见问题及其解决方案。

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

在 Ubuntu 上，可通过官方源找到 Midori 。运行以下指令即可安装它：

```
sudo apt install midori

```

### 2. Trojita：电子邮件客户端

[Trojita](http://trojita.flaska.net/) 是一款开源强大的 IMAP 电子邮件客户端。它速度快，资源利用率高。我可以肯定地称它是 [Linux 最好的电子邮件客户端之一](https://itsfoss.com/best-email-clients-linux/)。如果你只需电子邮件客户端提供 IMAP 支持，那么也许你不用再进一步考虑了。

Trojita 使用各种技术 —— 按需电子邮件加载、离线缓存、带宽节省模式等 —— 以实现其令人印象深刻的性能。

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

Trojita 目前没有针对 Ubuntu 的官方 PPA 。但这应该不成问题。您可以使用以下命令轻松安装它:

```
sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/jkt-gentoo:/trojita/xUbuntu_16.04/ /' > /etc/apt/sources.list.d/trojita.list"
wget http://download.opensuse.org/repositories/home:jkt-gentoo:trojita/xUbuntu_16.04/Release.key
sudo apt-key add - < Release.key
sudo apt update
sudo apt install trojita

```

### 3. GDebi：包安装程序

有时您需要快速安装 DEB 软件包。Ubuntu 软件中心是一个消耗资源严重的应用程序，仅用于安装 .deb 文件并不明智。

Gdebi 无疑是一款可以完成同样目的的漂亮工具，而它只有个极简的图形界面。

GDebi 是完全轻量级的，完美无缺地完成了它的工作。你甚至应该[让 Gdebi 成为 DEB 文件的默认安装程序](https://itsfoss.com/gdebi-default-ubuntu-software-center/)。

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

只需一行指令，你便可以在 Ubuntu 上安装 GDebi：

```
sudo apt install gdebi

```

### 4. App Grid：软件中心

如果您经常在 Ubuntu 上使用软件中心搜索、安装和管理应用程序，则 [App Grid](http://www.appgrid.org/) 是必备的应用程序。它是默认的 Ubuntu 软件中心最具视觉吸引力且速度最快的替代方案。

App Grid 支持应用程序的评分、评论和屏幕截图。

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

App Grid 拥有 Ubuntu 的官方 PPA。使用以下指令安装 App Grid：

```
sudo add-apt-repository ppa:appgrid/stable
sudo apt update
sudo apt install appgrid

```

### 5. Yarock：音乐播放器

[Yarock](https://seb-apps.github.io/yarock/) 是一个优雅的音乐播放器，拥有现代而最轻量级的用户界面。尽管在设计上是轻量级的，但 Yarock 有一个全面的高级功能列表。

Yarock 的主要功能包括多种音乐收藏、评级、智能播放列表、多种后端选项、桌面通知、音乐剪辑、上下文获取等。

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

您得通过 PPA 使用以下指令在 Ubuntu 上安装 Yarock：

```
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt update
sudo apt install yarock

```

### 6. VLC：视频播放器

谁不需要视频播放器？谁还从未听说过 [VLC](http://www.videolan.org/index.html)？我想并不需要对它做任何介绍。

VLC 能满足你在 Ubuntu 上播放各种媒体文件的全部需求，而且它非常轻便。它甚至可以在非常旧的 PC 上完美运行。

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

VLC 为 Ubuntu 提供官方 PPA。可以输入以下命令来安装它：

```
sudo apt install vlc

```

### 7. PCManFM：文件管理器

PCManFM 是 LXDE 的标准文件管理器。与 LXDE 的其他应用程序一样，它也是轻量级的。如果您正在为文件管理器寻找更轻量级的替代品，可以尝试使用这个应用。

尽管来自 LXDE，PCManFM 也同样适用于其他桌面环境。

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

在 Ubuntu 上安装 PCManFM 只需要一条简单的指令：

```
sudo apt install pcmanfm

```

### 8. Mousepad：文本编辑器

在轻量级方面，没有什么可以击败像 nano、vim 等命令行文本编辑器。但是，如果你想要一个图形界面，你可以尝试一下 Mousepad -- 一个最轻量级的文本编辑器。它非常轻巧，速度非常快。带有简单的可定制的用户界面和多个主题。

Mousepad 支持语法高亮显示。所以，你也可以使用它作为基础的代码编辑器。

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

想要安装 Mousepad ，可以使用以下指令：

```
sudo apt install mousepad

```

### 9. GNOME Office：办公软件

许多人需要经常使用办公应用程序。通常，大多数办公应用程序体积庞大且很耗资源。Gnome Office 在这方面非常轻便。Gnome Office 在技术上不是一个完整的办公套件。它由不同的独立应用程序组成，在这之中 AbiWord＆Gnumeric 脱颖而出。

**AbiWord** 是文字处理器。它比其他替代品轻巧并且快得多。但是这样做是有代价的 —— 你可能会失去宏、语法检查等一些功能。AdiWord 并不完美，但它可以满足你基本的需求。

**Gnumeric** 是电子表格编辑器。就像 AbiWord 一样，Gnumeric 也非常快速，提供了精确的计算功能。如果你正在寻找一个简单轻便的电子表格编辑器，Gnumeric 已经能满足你的需求了。

在 [Gnome Office](https://gnome.org/gnome-office/) 下面还有一些其它应用程序。你可以在官方页面找到它们。

#### 在基于 Ubuntu 的发行版上安装 AbiWord＆Gnumeric

要安装 AbiWord＆Gnumeric，只需在终端中输入以下指令：

```
sudo apt install abiword gnumeric

```

---

via: <https://itsfoss.com/lightweight-alternative-applications-ubuntu/>

作者：[Munif Tanjim](https://itsfoss.com/author/munif/) 译者：[imquanquan](https://github.com/imquanquan) 校对：[wxy](https://github.com/wxy)

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


Linux 跟踪器之选

# Linux 跟踪器之选

>
> Linux 跟踪很神奇！
>
>
>

<ruby> 跟踪器 <rt>  tracer </rt></ruby>是一个高级的性能分析和调试工具，如果你使用过 `strace(1)` 或者 `tcpdump(8)`，你不应该被它吓到 ... 你使用的就是跟踪器。系统跟踪器能让你看到很多的东西，而不仅是系统调用或者数据包，因为常见的跟踪器都可以跟踪内核或者应用程序的任何东西。

有大量的 Linux 跟踪器可供你选择。由于它们中的每个都有一个官方的（或者非官方的）的吉祥物，我们有足够多的选择给孩子们展示。

你喜欢使用哪一个呢？

我从两类读者的角度来回答这个问题：大多数人和性能/内核工程师。当然，随着时间的推移，这也可能会发生变化，因此，我需要及时去更新本文内容，或许是每年一次，或者更频繁。（LCTT 译注：本文最后更新于 2015 年）

### 对于大多数人

大多数人（开发者、系统管理员、运维人员、网络可靠性工程师（SRE）…）是不需要去学习系统跟踪器的底层细节的。以下是你需要去了解和做的事情：

#### 1. 使用 perf\_events 进行 CPU 剖析

可以使用 perf\_events 进行 CPU <ruby> 剖析 <rt>  profiling </rt></ruby>。它可以用一个 [火焰图](http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html) 来形象地表示。比如：

```
git clone --depth 1 https://github.com/brendangregg/FlameGraph
perf record -F 99 -a -g -- sleep 30
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > perf.svg

```

Linux 的 perf\_events（即 `perf`，后者是它的命令）是官方为 Linux 用户准备的跟踪器/分析器。它位于内核源码中，并且维护的非常好（而且现在它的功能还在快速变强）。它一般是通过 linux-tools-common 这个包来添加的。

`perf` 可以做的事情很多，但是，如果我只能建议你学习其中的一个功能的话，那就是 CPU 剖析。虽然从技术角度来说，这并不是事件“跟踪”，而是<ruby> 采样 <rt>  sampling </rt></ruby>。最难的部分是获得完整的栈和符号，这部分在我的 [Linux Profiling at Netflix](http://www.brendangregg.com/blog/2015-02-27/linux-profiling-at-netflix.html) 中针对 Java 和 Node.js 讨论过。

#### 2. 知道它能干什么

正如一位朋友所说的：“你不需要知道 X 光机是如何工作的，但你需要明白的是，如果你吞下了一个硬币，X 光机是你的一个选择！”你需要知道使用跟踪器能够做什么，因此，如果你在业务上确实需要它，你可以以后再去学习它，或者请会使用它的人来做。

简单地说：几乎任何事情都可以通过跟踪来了解它。内部文件系统、TCP/IP 处理过程、设备驱动、应用程序内部情况。阅读我在 lwn.net 上的 [ftrace](http://lwn.net/Articles/608497/) 的文章，也可以去浏览 [perf\_events 页面](http://www.brendangregg.com/perf.html)，那里有一些跟踪（和剖析）能力的示例。

#### 3. 需要一个前端工具

如果你要购买一个性能分析工具（有许多公司销售这类产品），并要求支持 Linux 跟踪。想要一个直观的“点击”界面去探查内核的内部，以及包含一个在不同堆栈位置的延迟热力图。就像我在 [Monitorama 演讲](http://www.brendangregg.com/blog/2015-06-23/netflix-instance-analysis-requirements.html) 中描述的那样。

我创建并开源了我自己的一些前端工具，虽然它是基于 CLI 的（不是图形界面的）。这样可以使其它人使用跟踪器更快更容易。比如，我的 [perf-tools](http://www.brendangregg.com/blog/2015-03-17/linux-performance-analysis-perf-tools.html)，跟踪新进程是这样的：

```
# ./execsnoop
Tracing exec()s. Ctrl-C to end.
 PID PPID ARGS
 22898 22004 man ls
 22905 22898 preconv -e UTF-8
 22908 22898 pager -s
 22907 22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8
[...]

```

在 Netflix 公司，我正在开发 [Vector](http://techblog.netflix.com/2015/04/introducing-vector-netflixs-on-host.html)，它是一个实例分析工具，实际上它也是一个 Linux 跟踪器的前端。

### 对于性能或者内核工程师

一般来说，我们的工作都非常难，因为大多数人或许要求我们去搞清楚如何去跟踪某个事件，以及因此需要选择使用哪个跟踪器。为完全理解一个跟踪器，你通常需要花至少一百多个小时去使用它。理解所有的 Linux 跟踪器并能在它们之间做出正确的选择是件很难的事情。（我或许是唯一接近完成这件事的人）

在这里我建议选择如下，要么：

A）选择一个全能的跟踪器，并以它为标准。这需要在一个测试环境中花大量的时间来搞清楚它的细微差别和安全性。我现在的建议是 SystemTap 的最新版本（例如，从 [源代码](https://sourceware.org/git/?p=systemtap.git;a=blob_plain;f=README;hb=HEAD) 构建）。我知道有的公司选择的是 LTTng ，尽管它并不是很强大（但是它很安全），但他们也用的很好。如果在 `sysdig` 中添加了跟踪点或者是 kprobes，它也是另外的一个候选者。

B）按我的 [Velocity 教程中](http://www.slideshare.net/brendangregg/velocity-2015-linux-perf-tools) 的流程图。这意味着尽可能使用 ftrace 或者 perf\_events，eBPF 已经集成到内核中了，然后用其它的跟踪器，如 SystemTap/LTTng 作为对 eBPF 的补充。我目前在 Netflix 的工作中就是这么做的。

以下是我对各个跟踪器的评价：

#### 1. ftrace

我爱 [ftrace](http://lwn.net/Articles/370423/)，它是内核黑客最好的朋友。它被构建进内核中，它能够利用跟踪点、kprobes、以及 uprobes，以提供一些功能：使用可选的过滤器和参数进行事件跟踪；事件计数和计时，内核概览；<ruby> 函数流步进 <rt>  function-flow walking </rt></ruby>。关于它的示例可以查看内核源代码树中的 [ftrace.txt](https://www.kernel.org/doc/Documentation/trace/ftrace.txt)。它通过 `/sys` 来管理，是面向单一的 root 用户的（虽然你可以使用缓冲实例以让其支持多用户），它的界面有时很繁琐，但是它比较容易<ruby> 调校 <rt>  hackable </rt></ruby>，并且有个前端：ftrace 的主要创建者 Steven Rostedt 设计了一个 trace-cmd，而且我也创建了 perf-tools 集合。我最诟病的就是它不是<ruby> 可编程的 <rt>  programmable </rt></ruby>，因此，举个例子说，你不能保存和获取时间戳、计算延迟，以及将其保存为直方图。你需要转储事件到用户级以便于进行后期处理，这需要花费一些成本。它也许可以通过 eBPF 实现可编程。

#### 2. perf\_events

[perf\_events](https://perf.wiki.kernel.org/index.php/Main_Page) 是 Linux 用户的主要跟踪工具，它的源代码位于 Linux 内核中，一般是通过 linux-tools-common 包来添加的。它又称为 `perf`，后者指的是它的前端，它相当高效（动态缓存），一般用于跟踪并转储到一个文件中（perf.data），然后可以在之后进行后期处理。它可以做大部分 ftrace 能做的事情。它不能进行函数流步进，并且不太容易调校（而它的安全/错误检查做的更好一些）。但它可以做剖析（采样）、CPU 性能计数、用户级的栈转换、以及使用本地变量利用<ruby> 调试信息 <rt>  debuginfo </rt></ruby>进行<ruby> 行级跟踪 <rt>  line tracing </rt></ruby>。它也支持多个并发用户。与 ftrace 一样，它也不是内核可编程的，除非 eBPF 支持（补丁已经在计划中）。如果只学习一个跟踪器，我建议大家去学习 perf，它可以解决大量的问题，并且它也相当安全。

#### 3. eBPF

<ruby> 扩展的伯克利包过滤器 <rt>  extended Berkeley Packet Filter </rt></ruby>（eBPF）是一个<ruby> 内核内 <rt>  in-kernel </rt></ruby>的虚拟机，可以在事件上运行程序，它非常高效（JIT）。它可能最终为 ftrace 和 perf\_events 提供<ruby> 内核内编程 <rt>  in-kernel programming </rt></ruby>，并可以去增强其它跟踪器。它现在是由 Alexei Starovoitov 开发的，还没有实现完全的整合，但是对于一些令人印象深刻的工具，有些内核版本（比如，4.1）已经支持了：比如，块设备 I/O 的<ruby> 延迟热力图 <rt>  latency heat map </rt></ruby>。更多参考资料，请查阅 Alexei 的 [BPF 演示](http://www.phoronix.com/scan.php?page=news_item&px=BPF-Understanding-Kernel-VM)，和它的 [eBPF 示例](https://github.com/torvalds/linux/tree/master/samples/bpf)。

#### 4. SystemTap

[SystemTap](https://sourceware.org/systemtap/wiki) 是一个非常强大的跟踪器。它可以做任何事情：剖析、跟踪点、kprobes、uprobes（它就来自 SystemTap）、USDT、内核内编程等等。它将程序编译成内核模块并加载它们 —— 这是一种很难保证安全的方法。它开发是在内核代码树之外进行的，并且在过去出现过很多问题（内核崩溃或冻结）。许多并不是 SystemTap 的过错 —— 它通常是首次对内核使用某些跟踪功能，并率先遇到 bug。最新版本的 SystemTap 是非常好的（你需要从它的源代码编译），但是，许多人仍然没有从早期版本的问题阴影中走出来。如果你想去使用它，花一些时间去测试环境，然后，在 irc.freenode.net 的 #systemtap 频道与开发者进行讨论。（Netflix 有一个容错架构，我们使用了 SystemTap，但是我们或许比起你来说，更少担心它的安全性）我最诟病的事情是，它似乎假设你有办法得到内核调试信息，而我并没有这些信息。没有它我实际上可以做很多事情，但是缺少相关的文档和示例（我现在自己开始帮着做这些了）。

#### 5. LTTng

[LTTng](http://lttng.org/) 对事件收集进行了优化，性能要好于其它的跟踪器，也支持许多的事件类型，包括 USDT。它的开发是在内核代码树之外进行的。它的核心部分非常简单：通过一个很小的固定指令集写入事件到跟踪缓冲区。这样让它既安全又快速。缺点是做内核内编程不太容易。我觉得那不是个大问题，由于它优化的很好，可以充分的扩展，尽管需要后期处理。它也探索了一种不同的分析技术。很多的“黑匣子”记录了所有感兴趣的事件，以便可以在 GUI 中以后分析它。我担心该记录会错失之前没有预料的事件，我真的需要花一些时间去看看它在实践中是如何工作的。这个跟踪器上我花的时间最少（没有特别的原因）。

#### 6. ktap

[ktap](http://ktap.org/) 是一个很有前途的跟踪器，它在内核中使用了一个 lua 虚拟机，不需要调试信息和在嵌入时设备上可以工作的很好。这使得它进入了人们的视野，在某个时候似乎要成为 Linux 上最好的跟踪器。然而，由于 eBPF 开始集成到了内核，而 ktap 的集成工作被推迟了，直到它能够使用 eBPF 而不是它自己的虚拟机。由于 eBPF 在几个月过去之后仍然在集成过程中，ktap 的开发者已经等待了很长的时间。我希望在今年的晚些时间它能够重启开发。

#### 7. dtrace4linux

[dtrace4linux](https://github.com/dtrace4linux/linux) 主要由一个人（Paul Fox）利用业务时间将 Sun DTrace 移植到 Linux 中的。它令人印象深刻，一些<ruby> 供应器 <rt>  provider </rt></ruby>可以工作，还不是很完美，它最多应该算是实验性的工具（不安全）。我认为对于许可证的担心，使人们对它保持谨慎：它可能永远也进入不了 Linux 内核，因为 Sun 是基于 CDDL 许可证发布的 DTrace；Paul 的方法是将它作为一个插件。我非常希望看到 Linux 上的 DTrace，并且希望这个项目能够完成，我想我加入 Netflix 时将花一些时间来帮它完成。但是，我一直在使用内置的跟踪器 ftrace 和 perf\_events。

#### 8. OL DTrace

[Oracle Linux DTrace](http://docs.oracle.com/cd/E37670_01/E38608/html/index.html) 是将 DTrace 移植到 Linux （尤其是 Oracle Linux）的重大努力。过去这些年的许多发布版本都一直稳定的进步，开发者甚至谈到了改善 DTrace 测试套件，这显示出这个项目很有前途。许多有用的功能已经完成：系统调用、剖析、sdt、proc、sched、以及 USDT。我一直在等待着 fbt（函数边界跟踪，对内核的动态跟踪），它将成为 Linux 内核上非常强大的功能。它最终能否成功取决于能否吸引足够多的人去使用 Oracle Linux（并为支持付费）。另一个羁绊是它并非完全开源的：内核组件是开源的，但用户级代码我没有看到。

#### 9. sysdig

[sysdig](http://www.sysdig.org/) 是一个很新的跟踪器，它可以使用类似 `tcpdump` 的语法来处理<ruby> 系统调用 <rt>  syscall </rt></ruby>事件，并用 lua 做后期处理。它也是令人印象深刻的，并且很高兴能看到在系统跟踪领域的创新。它的局限性是，它的系统调用只能是在当时，并且，它转储所有事件到用户级进行后期处理。你可以使用系统调用来做许多事情，虽然我希望能看到它去支持跟踪点、kprobes、以及 uprobes。我也希望看到它支持 eBPF 以查看内核内概览。sysdig 的开发者现在正在增加对容器的支持。可以关注它的进一步发展。

### 深入阅读

我自己的工作中使用到的跟踪器包括：

* **ftrace** ： 我的 [perf-tools](http://www.brendangregg.com/blog/2015-03-17/linux-performance-analysis-perf-tools.html) 集合（查看示例目录）；我的 lwn.net 的 [ftrace 跟踪器的文章](http://lwn.net/Articles/608497/)； 一个 [LISA14](http://www.brendangregg.com/blog/2015-03-17/linux-performance-analysis-perf-tools.html) 演讲；以及帖子： [函数计数](http://www.brendangregg.com/blog/2014-07-13/linux-ftrace-function-counting.html)、 [iosnoop](http://www.brendangregg.com/blog/2014-07-16/iosnoop-for-linux.html)、 [opensnoop](http://www.brendangregg.com/blog/2014-07-25/opensnoop-for-linux.html)、 [execsnoop](http://www.brendangregg.com/blog/2014-07-28/execsnoop-for-linux.html)、 [TCP retransmits](http://www.brendangregg.com/blog/2014-09-06/linux-ftrace-tcp-retransmit-tracing.html)、 [uprobes](http://www.brendangregg.com/blog/2015-06-28/linux-ftrace-uprobe.html) 和 [USDT](http://www.brendangregg.com/blog/2015-07-03/hacking-linux-usdt-ftrace.html)。
* **perf\_events** ： 我的 [perf\_events 示例](http://www.brendangregg.com/perf.html) 页面；在 SCALE 的一个 [Linux Profiling at Netflix](http://www.brendangregg.com/blog/2015-02-27/linux-profiling-at-netflix.html) 演讲；和帖子：[CPU 采样](http://www.brendangregg.com/blog/2014-06-22/perf-cpu-sample.html)、[静态跟踪点](http://www.brendangregg.com/blog/2014-06-29/perf-static-tracepoints.html)、[热力图](http://www.brendangregg.com/blog/2014-07-01/perf-heat-maps.html)、[计数](http://www.brendangregg.com/blog/2014-07-03/perf-counting.html)、[内核行级跟踪](http://www.brendangregg.com/blog/2014-09-11/perf-kernel-line-tracing.html)、[off-CPU 时间火焰图](http://www.brendangregg.com/blog/2015-02-26/linux-perf-off-cpu-flame-graph.html)。
* **eBPF** : 帖子 [eBPF：一个小的进步](http://www.brendangregg.com/blog/2015-05-15/ebpf-one-small-step.html)，和一些 [BPF-tools](https://github.com/brendangregg/BPF-tools) （我需要发布更多）。
* **SystemTap** ： 很久以前，我写了一篇 [使用 SystemTap](http://dtrace.org/blogs/brendan/2011/10/15/using-systemtap/) 的文章，它有点过时了。最近我发布了一些 [systemtap-lwtools](https://github.com/brendangregg/systemtap-lwtools)，展示了在没有内核调试信息的情况下，SystemTap 是如何使用的。
* **LTTng** ： 我使用它的时间很短，不足以发布什么文章。
* **ktap** ： 我的 [ktap 示例](http://www.brendangregg.com/ktap.html) 页面包括一行程序和脚本，虽然它是早期的版本。
* **dtrace4linux** ： 在我的 [系统性能](http://www.brendangregg.com/sysperfbook.html) 书中包含了一些示例，并且在过去我为了某些事情开发了一些小的修补，比如， [timestamps](https://github.com/dtrace4linux/linux/issues/55)。
* **OL DTrace** ： 因为它是对 DTrace 的直接移植，我早期 DTrace 的工作大多与之相关（链接太多了，可以去 [我的主页](http://www.brendangregg.com) 上搜索）。一旦它更加完美，我可以开发很多专用工具。
* **sysdig** ： 我贡献了 [fileslower](https://github.com/brendangregg/sysdig/commit/d0eeac1a32d6749dab24d1dc3fffb2ef0f9d7151) 和 [subsecond offset spectrogram](https://github.com/brendangregg/sysdig/commit/2f21604dce0b561407accb9dba869aa19c365952) 的 chisel。
* **其它** ： 关于 [strace](http://www.brendangregg.com/blog/2014-05-11/strace-wow-much-syscall.html)，我写了一些告诫文章。

不好意思，没有更多的跟踪器了！ … 如果你想知道为什么 Linux 中的跟踪器不止一个，或者关于 DTrace 的内容，在我的 [从 DTrace 到 Linux](http://www.brendangregg.com/blog/2015-02-28/from-dtrace-to-linux.html) 的演讲中有答案，从 [第 28 张幻灯片](http://www.slideshare.net/brendangregg/from-dtrace-to-linux/28) 开始。

感谢 [Deirdre Straughan](http://www.beginningwithi.com/) 的编辑，以及跟踪小马的创建（General Zoi 是小马的创建者）。

---

via: <http://www.brendangregg.com/blog/2015-07-08/choosing-a-linux-tracer.html>

作者：[Brendan Gregg](http://www.brendangregg.com) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


给 “rm” 命令添加个“垃圾桶”

Summary: 将文件移动到“垃圾桶”是一个好主意，当你无意中运行 rm 命令时，可以拯救你

将文件移动到“垃圾桶”是一个好主意，当你无意中运行 rm 命令时，可以拯救你

# 给 “rm” 命令添加个“垃圾桶”

人类犯错误是因为我们不是一个可编程设备，所以，在使用 `rm` 命令时要额外注意，不要在任何时候使用 `rm -rf *`。当你使用 `rm` 命令时，它会永久删除文件，不会像文件管理器那样将这些文件移动到 “垃圾箱”。

有时我们会将不应该删除的文件删除掉，所以当错误地删除了文件时该怎么办？ 你必须看看恢复工具（Linux 中有很多数据恢复工具），但我们不知道是否能将它百分之百恢复，所以要如何解决这个问题？

我们最近发表了一篇关于 [Trash-Cli](https://www.2daygeek.com/trash-cli-command-line-trashcan-linux-system/) 的文章，在评论部分，我们从用户 Eemil Lgz 那里获得了一个关于 [saferm.sh](https://github.com/lagerspetz/linux-stuff/blob/master/scripts/saferm.sh) 脚本的更新，它可以帮助我们将文件移动到“垃圾箱”而不是永久删除它们。

将文件移动到“垃圾桶”是一个好主意，当你无意中运行 `rm` 命令时，可以拯救你；但是很少有人会说这是一个坏习惯，如果你不注意“垃圾桶”，它可能会在一定的时间内被文件和文件夹堆积起来。在这种情况下，我建议你按照你的意愿去做一个定时任务。

这适用于服务器和桌面两种环境。 如果脚本检测到 GNOME 、KDE、Unity 或 LXDE 桌面环境（DE），则它将文件或文件夹安全地移动到默认垃圾箱 `$HOME/.local/share/Trash/files`，否则会在您的主目录中创建垃圾箱文件夹 `$HOME/Trash`。

`saferm.sh` 脚本托管在 Github 中，可以从仓库中克隆，也可以创建一个名为 `saferm.sh` 的文件并复制其上的代码。

```
$ git clone https://github.com/lagerspetz/linux-stuff
$ sudo mv linux-stuff/scripts/saferm.sh /bin
$ rm -Rf linux-stuff

```

在 `.bashrc` 文件中设置别名，

```
alias rm=saferm.sh

```

执行下面的命令使其生效，

```
$ source ~/.bashrc

```

一切就绪，现在你可以执行 `rm` 命令，自动将文件移动到”垃圾桶”，而不是永久删除它们。

测试一下，我们将删除一个名为 `magi.txt` 的文件，命令行明确的提醒了 `Moving magi.txt to $HOME/.local/share/Trash/file`。

```
$ rm -rf magi.txt
Moving magi.txt to /home/magi/.local/share/Trash/files

```

也可以通过 `ls` 命令或 `trash-cli` 进行验证。

```
$ ls -lh /home/magi/.local/share/Trash/files
Permissions Size User Date Modified Name
.rw-r--r-- 32 magi 11 Oct 16:24 magi.txt

```

或者我们可以通过文件管理器界面中查看相同的内容。

（LCTT 译注：原文此处混淆了部分 trash-cli 的内容，考虑到文章衔接和逻辑，此处略。）

要了解 `saferm.sh` 的其他选项，请查看帮助。

```
$ saferm.sh -h
This is saferm.sh 1.16. LXDE and Gnome3 detection.
Will ask to unsafe-delete instead of cross-fs move. Allows unsafe (regular rm) delete (ignores trashinfo).
Creates trash and trashinfo directories if they do not exist. Handles symbolic link deletion.
Does not complain about different user any more.

Usage: /path/to/saferm.sh [OPTIONS] [--] files and dirs to safely remove
OPTIONS:
-r      allows recursively removing directories.
-f      Allow deleting special files (devices, ...).
-u      Unsafe mode, bypass trash and delete files permanently.
-v      Verbose, prints more messages. Default in this version.
-q      Quiet mode. Opposite of verbose.

```

---

via: <https://www.2daygeek.com/rm-command-to-move-files-to-trash-can-rm-alias/>

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

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


Partclone：多功能的分区和克隆的自由软件

Summary: 它为用户提供了备份与恢复已用分区的工具，并与多个文件系统高度兼容。

它为用户提供了备份与恢复已用分区的工具，并与多个文件系统高度兼容。

# Partclone：多功能的分区和克隆的自由软件

<img src="content_image/album_201803_10_090516nhli68552dv8zn2z.png" alt="" title="">

[Partclone](https://partclone.org/) 是由 Clonezilla 的开发者们开发的用于创建和克隆分区镜像的自由开源软件。实际上，Partclone 是 Clonezilla 所基于的工具之一。

它为用户提供了备份与恢复已用分区的工具，并与多个文件系统高度兼容，这要归功于它能够使用像 e2fslibs 这样的现有库来读取和写入分区，例如 ext2。

它最大的优点是支持各种格式，包括 ext2、ext3、ext4、hfs+、reiserfs、reiser4、btrfs、vmfs3、vmfs5、xfs、jfs、ufs、ntfs、fat（12/16/32）、exfat、f2fs 和 nilfs。

它还有许多的程序，包括 partclone.ext2（ext3＆ext4）、partclone.ntfs、partclone.exfat、partclone.hfsp 和 partclone.vmfs（v3和v5） 等等。

### Partclone中的功能

* 免费软件： Partclone 免费供所有人下载和使用。 \* 开源： Partclone 是在 GNU GPL 许可下发布的，并在 [GitHub](https://github.com/Thomas-Tsai/partclone) 上公开。 \* 跨平台：适用于 Linux、Windows、MAC、ESX 文件系统备份/恢复和 FreeBSD。 \* 一个在线的[文档页面](https://partclone.org/help/)，你可以从中查看帮助文档并跟踪其 GitHub 问题。 \* 为初学者和专业人士提供的在线[用户手册](https://partclone.org/usage/)。 \* 支持救援。 \* 克隆分区成镜像文件。 \* 将镜像文件恢复到分区。 \* 快速复制分区。 \* 支持 raw 克隆。 \* 显示传输速率和持续时间。 \* 支持管道。 \* 支持 crc32 校验。 \* 支持 ESX vmware server 的 vmfs 和 FreeBSD 的文件系统 ufs。

Partclone 中还捆绑了更多功能，你可以在[这里](https://partclone.org/features/)查看其余的功能。

* [下载 Linux 中的 Partclone](https://partclone.org/download/)

### 如何安装和使用 Partclone

在 Linux 上安装 Partclone。

```
$ sudo apt install partclone [On Debian/Ubuntu]
$ sudo yum install partclone [On CentOS/RHEL/Fedora]

```

克隆分区为镜像。

```
# partclone.ext4 -d -c -s /dev/sda1 -o sda1.img

```

将镜像恢复到分区。

```
# partclone.ext4 -d -r -s sda1.img -o /dev/sda1

```

分区到分区克隆。

```
# partclone.ext4 -d -b -s /dev/sda1 -o /dev/sdb1

```

显示镜像信息。

```
# partclone.info -s sda1.img

```

检查镜像。

```
# partclone.chkimg -s sda1.img

```

你是 Partclone 的用户吗？我最近在 [Deepin Clone](https://www.fossmint.com/deepin-clone-system-backup-restore-for-deepin-users/) 上写了一篇文章，显然，Partclone 有擅长处理的任务。你使用其他备份和恢复工具的经验是什么？

请在下面的评论区与我们分享你的想法和建议。

---

via: <https://www.fossmint.com/partclone-linux-backup-clone-tool/>

作者：[Martins D. Okoi](https://www.fossmint.com/author/dillivine/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


Linux 下最好的图片截取和视频截录工具

# Linux 下最好的图片截取和视频截录工具

可能有一个困扰你多时的问题，当你想要获取一张屏幕截图向开发者反馈问题，或是在 Stack Overflow 寻求帮助时，你可能缺乏一个可靠的屏幕截图工具去保存和发送截图。在 GNOME 中有一些这种类型的程序和 shell 拓展工具。这里介绍的是 Linux 最好的屏幕截图工具，可以供你截取图片或截录视频。

### 1. Shutter

[](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/shutter-linux-screenshot-taking-tools_orig.jpg)

[Shutter](http://shutter-project.org/) 可以截取任意你想截取的屏幕，是 Linux 最好的截屏工具之一。得到截屏之后，它还可以在保存截屏之前预览图片。它也有一个扩展菜单，展示在 GNOME 顶部面板，使得用户进入软件变得更人性化，非常方便使用。

你可以截取选区、窗口、桌面、当前光标下的窗口、区域、菜单、提示框或网页。Shutter 允许用户直接上传屏幕截图到设置内首选的云服务商。它同样允许用户在保存截图之前编辑器图片；同时提供了一些可自由添加或移除的插件。

终端内键入下列命令安装此工具：

```
sudo add-apt-repository -y ppa:shutter/ppa
sudo apt-get update && sudo apt-get install shutter

```

### 2. Vokoscreen

[](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vokoscreen-screencasting-tool-for-linux_orig.jpg)

[Vokoscreen](https://github.com/vkohaupt/vokoscreen) 是一款允许你记录和叙述屏幕活动的一款软件。它易于使用，有一个简洁的界面和顶部面板的菜单，方便用户录制视频。

你可以选择记录整个屏幕，或是记录一个窗口，抑或是记录一个选区。自定义记录可以让你轻松得到所需的保存类型，你甚至可以将屏幕录制记录保存为 gif 文件。当然，你也可以使用网络摄像头记录自己的情况，用于你写作教程吸引学习者。记录完成后，你还可以在该应用程序中回放视频记录，这样就不必到处去找你记录的内容。

[](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vokoscreen-preferences_orig.jpg)

你可以从你的发行版仓库安装 Vocoscreen，或者你也可以在 [pkgs.org](https://pkgs.org/download/vokoscreen) 选择下载你需要的版本。

```
sudo dpkg -i vokoscreen_2.5.0-1_amd64.deb

```

### 3. OBS

[](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/obs-linux-screencasting-tool_orig.jpg)

[OBS](https://obsproject.com/) 可以用来录制自己的屏幕亦可用来录制互联网上的流媒体。它允许你看到自己所录制的内容或你叙述的屏幕录制。它允许你根据喜好选择录制视频的品质；它也允许你选择文件的保存类型。除了视频录制功能之外，你还可以切换到 Studio 模式，不借助其他软件进行视频编辑。要在你的 Linux 系统中安装 OBS，你必须确保你的电脑已安装 FFmpeg。ubuntu 14.04 或更早的版本安装 FFmpeg 可以使用如下命令：

```
sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next

sudo apt-get update && sudo apt-get install ffmpeg

```

ubuntu 15.04 以及之后的版本，你可以在终端中键入如下命令安装 FFmpeg：

```
sudo apt-get install ffmpeg

```

如果 FFmpeg 安装完成，在终端中键入如下安装 OBS：

```
sudo add-apt-repository ppa:obsproject/obs-studio

sudo apt-get update

sudo apt-get install obs-studio

```

### 4. Green Recorder

[](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/green-recording-linux-tool_orig.jpg)

[Green recorder](https://github.com/foss-project/green-recorder) 是一款界面简单的程序，它可以让你记录屏幕。你可以选择包括视频和单纯的音频在内的录制内容，也可以显示鼠标指针，甚至可以跟随鼠标录制视频。同样，你可以选择记录窗口或是屏幕上的选区，以便于只在自己的记录中保留需要的内容；你还可以自定义最终保存的视频的帧数。如果你想要延迟录制，它提供给你一个选项可以设置出你想要的延迟时间。它还提供一个录制结束后的命令运行选项，这样，就可以在视频录制结束后立即运行。

在终端中键入如下命令来安装 green recorder：

```
sudo add-apt-repository ppa:fossproject/ppa

sudo apt update && sudo apt install green-recorder

```

### 5. Kazam

[](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/kazam-screencasting-tool-for-linux_orig.jpg)

[Kazam](https://launchpad.net/kazam) 在几乎所有使用截图工具的 Linux 用户中都十分流行。这是一款简单直观的软件，它可以让你做一个屏幕截图或是视频录制，也同样允许在屏幕截图或屏幕录制之前设置延时。它可以让你选择录制区域，窗口或是你想要抓取的整个屏幕。Kazam 的界面接口安排的非常好，和其它软件相比毫无复杂感。它的特点，就是让你优雅的截图。Kazam 在系统托盘和菜单中都有图标，无需打开应用本身，你就可以开始屏幕截图。

终端中键入如下命令来安装 Kazam：

```
sudo apt-get install kazam

```

如果没有找到该 PPA，你需要使用下面的命令安装它：

```
sudo add-apt-repository ppa:kazam-team/stable-series

sudo apt-get update && sudo apt-get install kazam

```

### 6. GNOME 扩展截屏工具

[](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/gnome-screenshot-extension-compressed_orig.jpg)

GNOME 的一个扩展软件就叫做 screenshot tool，它常驻系统面板，如果你没有设置禁用它的话。由于它是常驻系统面板的软件，所以它会一直等待你的调用，获取截图，方便和容易获取是它最主要的特点，除非你在调整工具中禁用，否则它将一直在你的系统面板中。这个工具也有用来设置首选项的选项窗口。在 extensions.gnome.org 中搜索 “*Screenshot Tool*”，在你的 GNOME 中安装它。

你需要安装 gnome 扩展的 chrome 扩展组件和 GNOME 调整工具才能使用这个工具。

[](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/gnome-screenshot-extension-preferences_orig.jpg)

当你碰到一个问题，不知道怎么处理，想要在 [Linux 社区](http://www.linuxandubuntu.com/home/top-10-communities-to-help-you-learn-linux) 或者其他开发社区分享、寻求帮助的的时候， **Linux 截图工具** 尤其合适。学习开发、程序或者其他任何事物都会发现这些工具在分享截图的时候真的很实用。Youtube 用户和教程制作爱好者会发现视频截录工具真的很适合录制可以发表的教程。

---

via: <http://www.linuxandubuntu.com/home/best-linux-screenshot-screencasting-tools>

作者：[linuxandubuntu](http://www.linuxandubuntu.com) 译者：[CYLeft](https://github.com/CYLeft) 校对：[wxy](https://github.com/wxy)

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


Linux 容器安全的 10 个层面

Summary: 应用这些策略来保护容器解决方案的各个层面和容器生命周期的各个阶段的安全。

应用这些策略来保护容器解决方案的各个层面和容器生命周期的各个阶段的安全。

# Linux 容器安全的 10 个层面

>
> 应用这些策略来保护容器解决方案的各个层面和容器生命周期的各个阶段的安全。
>
>
>

容器提供了打包应用程序的一种简单方法，它实现了从开发到测试到投入生产系统的无缝传递。它也有助于确保跨不同环境的连贯性，包括物理服务器、虚拟机、以及公有云或私有云。这些好处使得一些组织为了更方便地部署和管理为他们提升业务价值的应用程序，而快速地采用了容器技术。

企业需要高度安全，在容器中运行核心服务的任何人都会问，“容器安全吗？”以及“我们能信任运行在容器中的应用程序吗？”

对容器进行安全保护就像是对运行中的进程进行安全保护一样。在你部署和运行你的容器之前，你需要去考虑整个解决方案各个层面的安全。你也需要去考虑贯穿了应用程序和容器整个生命周期的安全。

请尝试从这十个关键的因素去确保容器解决方案栈不同层面、以及容器生命周期的不同阶段的安全。

### 1. 容器宿主机操作系统和多租户环境

由于容器将应用程序和它的依赖作为一个单元来处理，使得开发者构建和升级应用程序变得更加容易，并且，容器可以启用多租户技术将许多应用程序和服务部署到一台共享主机上。在一台单独的主机上以容器方式部署多个应用程序、按需启动和关闭单个容器都是很容易的。为完全实现这种打包和部署技术的优势，运营团队需要运行容器的合适环境。运营者需要一个安全的操作系统，它能够在边界上保护容器安全、从容器中保护主机内核，以及保护容器彼此之间的安全。

容器是隔离而资源受限的 Linux 进程，允许你在一个共享的宿主机内核上运行沙盒化的应用程序。保护容器的方法与保护你的 Linux 中运行的任何进程的方法是一样的。降低权限是非常重要的，也是保护容器安全的最佳实践。最好使用尽可能小的权限去创建容器。容器应该以一个普通用户的权限来运行，而不是 root 权限的用户。在 Linux 中可以使用多个层面的安全加固手段，Linux 命名空间、安全强化 Linux（[SELinux](https://en.wikipedia.org/wiki/Security-Enhanced_Linux)）、[cgroups](https://en.wikipedia.org/wiki/Cgroups) 、capabilities（LCTT 译注：Linux 内核的一个安全特性，它打破了传统的普通用户与 root 用户的概念，在进程级提供更好的安全控制）、以及安全计算模式（ [seccomp](https://en.wikipedia.org/wiki/Seccomp) ），这五种 Linux 的安全特性可以用于保护容器的安全。

### 2. 容器内容（使用可信来源）

在谈到安全时，首先要考虑你的容器里面有什么？例如 ，有些时候，应用程序和基础设施是由很多可用组件所构成的。它们中的一些是开源的软件包，比如，Linux 操作系统、Apache Web 服务器、Red Hat JBoss 企业应用平台、PostgreSQL，以及 Node.js。这些软件包的容器化版本已经可以使用了，因此，你没有必要自己去构建它们。但是，对于你从一些外部来源下载的任何代码，你需要知道这些软件包的原始来源，是谁构建的它，以及这些包里面是否包含恶意代码。

### 3. 容器注册（安全访问容器镜像）

你的团队的容器构建于下载的公共容器镜像，因此，访问和升级这些下载的容器镜像以及内部构建镜像，与管理和下载其它类型的二进制文件的方式是相同的，这一点至关重要。许多私有的注册库支持容器镜像的存储。选择一个私有的注册库，可以帮你将存储在它的注册中的容器镜像实现策略自动化。

### 4. 安全性与构建过程

在一个容器化环境中，软件构建过程是软件生命周期的一个阶段，它将所需的运行时库和应用程序代码集成到一起。管理这个构建过程对于保护软件栈安全来说是很关键的。遵守“一次构建，到处部署”的原则，可以确保构建过程的结果正是生产系统中需要的。保持容器的恒定不变也很重要 — 换句话说就是，不要对正在运行的容器打补丁，而是，重新构建和部署它们。

不论是因为你处于一个高强度监管的行业中，还是只希望简单地优化你的团队的成果，设计你的容器镜像管理以及构建过程，可以使用容器层的优势来实现控制分离，因此，你应该去这么做：

* 运营团队管理基础镜像
* 架构师管理中间件、运行时、数据库，以及其它解决方案
* 开发者专注于应用程序层面，并且只写代码

最后，标记好你的定制构建容器，这样可以确保在构建和部署时不会搞混乱。

### 5. 控制好在同一个集群内部署应用

如果是在构建过程中出现的任何问题，或者在镜像被部署之后发现的任何漏洞，那么，请在基于策略的、自动化工具上添加另外的安全层。

我们来看一下，一个应用程序的构建使用了三个容器镜像层：内核、中间件，以及应用程序。如果在内核镜像中发现了问题，那么只能重新构建镜像。一旦构建完成，镜像就会被发布到容器平台注册库中。这个平台可以自动检测到发生变化的镜像。对于基于这个镜像的其它构建将被触发一个预定义的动作，平台将自己重新构建应用镜像，合并该修复的库。

一旦构建完成，镜像将被发布到容器平台的内部注册库中。在它的内部注册库中，会立即检测到镜像发生变化，应用程序在这里将会被触发一个预定义的动作，自动部署更新镜像，确保运行在生产系统中的代码总是使用更新后的最新的镜像。所有的这些功能协同工作，将安全功能集成到你的持续集成和持续部署（CI/CD）过程和管道中。

### 6. 容器编配：保护容器平台安全

当然了，应用程序很少会以单一容器分发。甚至，简单的应用程序一般情况下都会有一个前端、一个后端、以及一个数据库。而在容器中以微服务模式部署的应用程序，意味着应用程序将部署在多个容器中，有时它们在同一台宿主机上，有时它们是分布在多个宿主机或者节点上，如下面的图所示：

在大规模的容器部署时，你应该考虑：

* 哪个容器应该被部署在哪个宿主机上？
* 那个宿主机应该有什么样的性能？
* 哪个容器需要访问其它容器？它们之间如何发现彼此？
* 你如何控制和管理对共享资源的访问，像网络和存储？
* 如何监视容器健康状况？
* 如何去自动扩展性能以满足应用程序的需要？
* 如何在满足安全需求的同时启用开发者的自助服务？

考虑到开发者和运营者的能力，提供基于角色的访问控制是容器平台的关键要素。例如，编配管理服务器是中心访问点，应该接受最高级别的安全检查。API 是规模化的自动容器平台管理的关键，可以用于为 pod、服务，以及复制控制器验证和配置数据；在入站请求上执行项目验证；以及调用其它主要系统组件上的触发器。

### 7. 网络隔离

在容器中部署现代微服务应用，经常意味着跨多个节点在多个容器上部署。考虑到网络防御，你需要一种在一个集群中的应用之间的相互隔离的方法。一个典型的公有云容器服务，像 Google 容器引擎（GKE）、Azure 容器服务，或者 Amazon Web 服务（AWS）容器服务，是单租户服务。他们让你在你初始化建立的虚拟机集群上运行你的容器。对于多租户容器的安全，你需要容器平台为你启用一个单一集群，并且分割流量以隔离不同的用户、团队、应用、以及在这个集群中的环境。

使用网络命名空间，容器内的每个集合（即大家熟知的 “pod”）都会得到它自己的 IP 和绑定的端口范围，以此来从一个节点上隔离每个 pod 网络。除使用下面所述的方式之外，默认情况下，来自不同命名空间（项目）的 pod 并不能发送或者接收其它 pod 上的包和不同项目的服务。你可以使用这些特性在同一个集群内隔离开发者环境、测试环境，以及生产环境。但是，这样会导致 IP 地址和端口数量的激增，使得网络管理更加复杂。另外，容器是被设计为反复使用的，你应该在处理这种复杂性的工具上进行投入。在容器平台上比较受欢迎的工具是使用 [软件定义网络](https://en.wikipedia.org/wiki/Software-defined_networking) (SDN) 提供一个定义的网络集群，它允许跨不同集群的容器进行通讯。

### 8. 存储

容器即可被用于无状态应用，也可被用于有状态应用。保护外加的存储是保护有状态服务的一个关键要素。容器平台对多种受欢迎的存储提供了插件，包括网络文件系统（NFS）、AWS 弹性块存储（EBS）、GCE 持久磁盘、GlusterFS、iSCSI、 RADOS（Ceph）、Cinder 等等。

一个持久卷（PV）可以通过资源提供者支持的任何方式装载到一个主机上。提供者有不同的性能，而每个 PV 的访问模式被设置为特定的卷支持的特定模式。例如，NFS 能够支持多路客户端同时读/写，但是，一个特定的 NFS 的 PV 可以在服务器上被发布为只读模式。每个 PV 有它自己的一组反应特定 PV 性能的访问模式的描述，比如，ReadWriteOnce、ReadOnlyMany、以及 ReadWriteMany。

### 9. API 管理、终端安全、以及单点登录（SSO）

保护你的应用安全，包括管理应用、以及 API 的认证和授权。

Web SSO 能力是现代应用程序的一个关键部分。在构建它们的应用时，容器平台带来了开发者可以使用的多种容器化服务。

API 是微服务构成的应用程序的关键所在。这些应用程序有多个独立的 API 服务，这导致了终端服务数量的激增，它就需要额外的管理工具。推荐使用 API 管理工具。所有的 API 平台应该提供多种 API 认证和安全所需要的标准选项，这些选项既可以单独使用，也可以组合使用，以用于发布证书或者控制访问。

这些选项包括标准的 API key、应用 ID 和密钥对，以及 OAuth 2.0。

### 10. 在一个联合集群中的角色和访问管理

在 2016 年 7 月份，Kubernetes 1.3 引入了 [Kubernetes 联合集群](https://kubernetes.io/docs/concepts/cluster-administration/federation/)。这是一个令人兴奋的新特性之一，它是在 Kubernetes 上游、当前的 Kubernetes 1.6 beta 中引用的。联合是用于部署和访问跨多集群运行在公有云或企业数据中心的应用程序服务的。多个集群能够用于去实现应用程序的高可用性，应用程序可以跨多个可用区域，或者去启用部署公共管理，或者跨不同的供应商进行迁移，比如，AWS、Google Cloud、以及 Azure。

当管理联合集群时，你必须确保你的编配工具能够提供你所需要的跨不同部署平台的实例的安全性。一般来说，认证和授权是很关键的 —— 不论你的应用程序运行在什么地方，将数据安全可靠地传递给它们，以及管理跨集群的多租户应用程序。Kubernetes 扩展了联合集群，包括对联合的秘密数据、联合的命名空间、以及 Ingress objects 的支持。

### 选择一个容器平台

当然，它并不仅关乎安全。你需要提供一个你的开发者团队和运营团队有相关经验的容器平台。他们需要一个安全的、企业级的基于容器的应用平台，它能够同时满足开发者和运营者的需要，而且还能够提高操作效率和基础设施利用率。

想从 Daniel 在 [欧盟开源峰会](http://events.linuxfoundation.org/events/open-source-summit-europe) 上的 [容器安全的十个层面](https://osseu17.sched.com/mobile/#session:f2deeabfc1640d002c1d55101ce81223) 的演讲中学习更多知识吗？这个峰会已于 10 月 23 - 26 日在 Prague 举行。

### 关于作者

Daniel Oh；Microservives；Agile；Devops；Java Ee；Container；Openshift；Jboss；Evangelism

---

via: <https://opensource.com/article/17/10/10-layers-container-security>

作者：[Daniel Oh](https://opensource.com/users/daniel-oh) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


5 个在视觉上最轻松的黑暗主题

# 5 个在视觉上最轻松的黑暗主题

人们在电脑上选择黑暗主题有几个原因。有些人觉得对于眼睛轻松，而另一些人因为他们的医学条件选择黑色。特别地，程序员喜欢黑暗的主题，因为可以减少眼睛的眩光。

如果你是一位 Linux 用户和黑暗主题爱好者，那么你很幸运。这里有五个最好的 Linux 黑暗主题。去看一下！

### 1. OSX-Arc-Shadow

顾名思义，这个主题受 OS X 的启发，它是基于 Arc 的平面主题。该主题支持 GTK 3 和 GTK 2 桌面环境，因此 Gnome、Cinnamon、Unity、Manjaro、Mate 和 XFCE 用户可以安装和使用该主题。[OSX-Arc-Shadow](https://github.com/LinxGem33/OSX-Arc-Shadow/) 是 OSX-Arc 主题集合的一部分。该集合还包括其他几个主题（黑暗和明亮）。你可以下载整个系列并使用黑色主题。

基于 Debian 和 Ubuntu 的发行版用户可以选择使用此[页面](https://github.com/LinxGem33/OSX-Arc-Shadow/releases)中找到的 .deb 文件来安装稳定版本。压缩的源文件也位于同一页面上。Arch Linux 用户，请查看此 [AUR 链接](https://aur.archlinux.org/packages/osx-arc-shadow/)。最后，要手动安装主题，请将 zip 解压到 `~/.themes` ，并将其设置为当前主题、控件和窗口边框。

### 2. Kiss-Kool-Red version 2

该主题发布不久。与 OSX-Arc-Shadow 相比它有更黑的外观和红色选择框。对于那些希望电脑屏幕上有更强对比度和更少眩光的人尤其有吸引力。因此，它可以减少在夜间使用或在光线较暗的地方使用时的注意力分散。它支持 GTK 3 和 GTK2。

前往 [gnome-looks](https://www.gnome-look.org/p/1207964/)，在“文件”菜单下下载主题。安装过程很简单：将主题解压到 `~/.themes` 中，并将其设置为当前主题、控件和窗口边框。

### 3. Equilux

Equilux 是另一个基于 Materia 主题的简单的黑暗主题。它有一个中性的深色调，并不过分花哨。选择框之间的对比度也很小，并且没有 Kiss-Kool-Red 中红色的锐利。这个主题的确是为减轻眼睛疲劳而做的。

[下载压缩文件](https://www.gnome-look.org/p/1182169/)并将其解压缩到你的 `~/.themes` 中。然后，你可以将其设置为你的主题。你可以查看[它的 GitHub 页面](https://github.com/ddnexus/equilux-theme)了解最新的增加内容。

### 4. Deepin Dark

Deepin Dark 是一个完全黑暗的主题。对于那些喜欢更黑暗的人来说，这个主题绝对是值得考虑的。此外，它还可以减少电脑屏幕的眩光量。另外，它支持 Unity。[在这里下载 Deepin Dark](https://www.gnome-look.org/p/1190867/)。

### 5. Ambiance DS BlueSB12

Ambiance DS BlueSB12 是一个简单的黑暗主题，它使得重要细节突出。它有助于专注，不花哨。它与 Deepin Dark 非常相似。特别是对于 Ubuntu 用户，它与 Ubuntu 17.04 兼容。你可以从[这里](https://www.gnome-look.org/p/1013664/)下载并尝试。

### 总结

如果你长时间使用电脑，黑暗主题是减轻眼睛疲劳的好方法。即使你不这样做，黑暗主题也可以在其他方面帮助你，例如提高专注。让我们知道你最喜欢哪一个。

---

via: <https://www.maketecheasier.com/best-linux-dark-themes/>

作者：[Bruno Edoh](https://www.maketecheasier.com) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


有用的 Bash 快捷键清单

# 有用的 Bash 快捷键清单

现如今，我在终端上花的时间更多，尝试在命令行完成比在图形界面更多的工作。随着时间推移，我学了许多 BASH 的技巧。这是一份每个 Linux 用户都应该知道的 BASH 快捷键，这样在终端做事就会快很多。我不会说这是一份完全的 BASH 快捷键清单，但是这足够让你的 BASH shell 操作比以前更快了。学习更快地使用 BASH 不仅节省了更多时间，也让你因为学到了有用的知识而感到自豪。那么，让我们开始吧。

### ALT 快捷键

1. `ALT+A` – 光标移动到行首。
2. `ALT+B` – 光标移动到所在单词词首。
3. `ALT+C` – 终止正在运行的命令/进程。与 `CTRL+C` 相同。
4. `ALT+D` – 关闭空的终端（也就是它会关闭没有输入的终端）。也删除光标后的全部字符。
5. `ALT+F` – 移动到光标所在单词词末。
6. `ALT+T` – 交换最后两个单词。
7. `ALT+U` – 将单词内光标后的字母转为大写。
8. `ALT+L` – 将单词内光标后的字母转为小写。
9. `ALT+R` – 撤销对从历史记录中带来的命令的修改。
正如你在上面输出所见，我使用反向搜索拉取了一个指令，并更改了那个指令的最后一个字母，并使用 `ALT+R` 撤销了更改。
10. `ALT+.` （注意末尾的点号） – 使用上一条命令的最后一个单词。

如果你想要对多个命令进行相同的操作的话，你可以使用这个快捷键来获取前几个指令的最后一个单词。例如，我需要使用 `ls -r` 命令输出以文件名逆序排列的目录内容。同时，我也想使用 `uname -r` 命令来查看我的内核版本。在这两个命令中，相同的单词是 `-r` 。这就是需要 `ALT+.` 的地方。快捷键很顺手。首先运行 `ls -r` 来按文件名逆序输出，然后在其他命令，比如 `uname` 中使用最后一个单词 `-r` 。

### CTRL 快捷键

1. `CTRL+A` – 快速移动到行首。
我们假设你输入了像下面这样的命令。当你在第 N 行时，你发现在行首字符有一个输入错误

```
$ gind . -mtime -1 -type

```

注意到了吗？上面的命令中我输入了 `gind` 而不是 `find` 。你可以通过一直按着左箭头键定位到第一个字母然后用 `g` 替换 `f` 。或者，仅通过 `CTRL+A` 或 `HOME` 键来立刻定位到行首，并替换拼错的单词。这将节省你几秒钟的时间。
2. `CTRL+B` – 光标向前移动一个字符。
这个快捷键可以使光标向前移动一个字符，即光标前的一个字符。或者，你可以使用左箭头键来向前移动一个字符。
3. `CTRL+C` – 停止当前运行的命令。
如果一个命令运行时间过久，或者你误运行了，你可以通过使用 `CTRL+C` 来强制停止或退出。
4. `CTRL+D` – 删除光标后的一个字符。
如果你的系统退格键无法工作的话，你可以使用 `CTRL+D` 来删除光标后的一个字符。这个快捷键也可以让你退出当前会话，和 exit 类似。
5. `CTRL+E` – 移动到行末。
当你修正了行首拼写错误的单词，按下 `CTRL+E` 来快速移动到行末。或者，你也可以使用你键盘上的 `END` 键。
6. `CTRL+F` – 光标向后移动一个字符。
如果你想将光标向后移动一个字符的话，按 `CTRL+F` 来替代右箭头键。
7. `CTRL+G` – 退出历史搜索模式，不运行命令。
正如你在上面的截图看到的，我进行了反向搜索，但是我执行命令，并退出了历史搜索模式。
8. `CTRL+H` – 删除光标前的一个字符，和退格键相同。
9. `CTRL+J` – 和 ENTER/RETURN 键相同。
回车键不工作？没问题！ `CTRL+J` 或 `CTRL+M` 可以用来替换回车键。
10. `CTRL+K` – 删除光标后的所有字符。
你不必一直按着删除键来删除光标后的字符。只要按 `CTRL+K` 就能删除光标后的所有字符。
11. `CTRL+L` – 清空屏幕并重新显示当前行。
别输入 `clear` 来清空屏幕了。只需按 `CTRL+L` 即可清空并重新显示当前行。
12. `CTRL+M` – 和 `CTRL+J` 或 RETURN键相同。
13. `CTRL+N` – 在命令历史中显示下一行。
你也可以使用下箭头键。
14. `CTRL+O` – 运行你使用反向搜索时发现的命令，即 CTRL+R。
15. `CTRL+P` – 显示命令历史的上一条命令。
你也可以使用上箭头键。
16. `CTRL+R` – 向后搜索历史记录（反向搜索）。
17. `CTRL+S` – 向前搜索历史记录。
18. `CTRL+T` – 交换最后两个字符。
这是我最喜欢的一个快捷键。假设你输入了 `sl` 而不是 `ls` 。没问题！这个快捷键会像下面这张截图一样交换字符。

19. `CTRL+U` – 删除光标前的所有字符（从光标后的点删除到行首）。
这个快捷键立刻删除前面的所有字符。
20. `CTRL+V` – 逐字显示输入的下一个字符。
21. `CTRL+W` – 删除光标前的一个单词。
不要和 CTRL+U 弄混了。CTRL+W 不会删除光标前的所有东西，而是只删除一个单词。

22. `CTRL+X` – 列出当前单词可能的文件名补全。
23. `CTRL+XX` – 移动到行首位置（再移动回来）。
24. `CTRL+Y` – 恢复你上一个删除或剪切的条目。
记得吗，我们在第 21 个命令用 `CTRL+W` 删除了单词“-al”。你可以使用 `CTRL+Y` 立刻恢复。

看见了吧？我没有输入“-al”。取而代之，我按了 `CTRL+Y` 来恢复它。
25. `CTRL+Z` – 停止当前的命令。
你也许很了解这个快捷键。它终止了当前运行的命令。你可以在前台使用 `fg` 或在后台使用 `bg` 来恢复它。
26. `CTRL+[` – 和 `ESC` 键等同。

### 杂项

1. `!!` – 重复上一个命令。
2. `ESC+t` – 交换最后两个单词。

这就是我所能想到的了。将来我遇到 Bash 快捷键时我会持续添加的。如果你觉得文章有错的话，请在下方的评论区留言。我会尽快更新。

Cheers!

---

via: <https://www.ostechnix.com/list-useful-bash-keyboard-shortcuts/>

作者：[SK](https://www.ostechnix.com/author/sk/) 译者：[heart4lor](https://github.com/heart4lor) 校对：[wxy](https://github.com/wxy)

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


Linux 如何成为我的工作

# Linux 如何成为我的工作

>
> IBM 工程师 Phil Estes 分享了他的 Linux 爱好如何使他成为了一位开源领袖、贡献者和维护者。
>
>
>

<img src="content_image/album_201803_11_223141orj0p3m35cz3z34c.png" alt="" title="">

从很早很早以前起，我就一直使用开源软件。那个时候，没有所谓的社交媒体。没有火狐，没有谷歌浏览器（甚至连谷歌也没有），没有亚马逊，甚至几乎没有互联网。事实上，那个时候最热门的是最新的 Linux 2.0 内核。当时的技术挑战是什么？嗯，是 Linux 发行版本中旧的 [a.out](https://en.wikipedia.org/wiki/A.out) 格式被 [ELF 格式](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format)代替，导致升级一些 [Linux](https://opensource.com/node/19796) 的安装可能有些棘手。

我如何将我自己对这个初出茅庐的年轻操作系统的兴趣转变为开源事业是一个有趣的故事。

### Linux 为乐趣为生，而非利益

1994 年我大学毕业时，计算机实验室是 UNIX 系统的小型网络；如果你幸运的话，它们会连接到这个叫做互联网的新东西上。我知道这难以置信！（那时，）“Web”（就是所知道的那个）大多是手写的 HTML，`cgi-bin` 目录是启用动态 Web 交互的一个新平台。我们许多人对这些新技术感到兴奋，我们还自学了 shell 脚本、[Perl](https://opensource.com/node/25456)、HTML，以及所有我们在父母的 Windows 3.1 PC 上从没有见过的简短的 UNIX 命令。

毕业后，我加入 IBM，工作在一个不能访问 UNIX 系统的 PC 操作系统上，不久，我的大学切断了我通往工程实验室的远程通道。我该如何继续通过 [Pine](https://opensource.com/article/17/10/alpine-email-client) 使用 `vi` 和 `ls` 读我的电子邮件的呢？我一直听说开源 Linux，但我还没有时间去研究它。

1996 年，我在德克萨斯大学奥斯丁分校开始读硕士学位。我知道这将涉及编程和写论文，不知道还有什么，但我不想使用专有的编辑器，编译器或者文字处理器。我想要的是我的 UNIX 体验!

所以我拿了一个旧电脑，找到了一个 Linux 发行版本 Slackware 3.0，在我的 IBM 办公室下载了一张又一张的软盘。可以说我在第一次安装 Linux 后就没有回过头了。在最初的那些日子里，我学习了很多关于 Makefile 和 `make` 系统、构建软件、补丁还有源码控制的知识。虽然我开始使用 Linux 只是为了兴趣和个人知识，但它最终改变了我的职业生涯。

虽然我是一个愉快的 Linux 用户，但我认为开源开发仍然是其他人的工作；我觉得在线邮件列表都是神秘的 [UNIX](https://opensource.com/node/22781) 极客的。我很感激像 Linux HOWTO 这样的项目，它们在我尝试添加软件包、升级 Linux 版本，或者安装新硬件和新 PC 的设备驱动程序撞得鼻青脸肿时帮助了我。但是要处理源代码并进行修改或提交到上游……那是别人的事，不是我。

### Linux 如何成为我的工作

1999 年，我终于有理由把我对 Linux 的个人兴趣与我在 IBM 的日常工作结合起来了。我接了一个研究项目，将 IBM 的 Java 虚拟机（JVM）移植到 Linux 上。为了确保我们在法律上是安全的，IBM 购买了一个塑封的盒装的 Red Hat Linux 6.1 副本来完成这项工作。在 IBM 东京研究实验室工作时，为了编写我们的 JVM 即时编译器（JIT），参考了 AIX JVM 源代码和 Windows 及 OS/2 的 JVM 源代码，我们在几周内就有了一个可以工作在 Linux 上的 JVM，击败了 SUN 公司官方宣告花了几个月才把 Java 移植到 Linux。既然我在 Linux 平台上做得了开发，我就更喜欢它了。

到 2000 年，IBM 使用 Linux 的频率迅速增加。由于 [Dan Frye](https://www.linkedin.com/in/danieldfrye/) 的远见和坚持，IBM 在 Linux 上下了“[一亿美元的赌注](http://www-03.ibm.com/ibm/history/ibm100/us/en/icons/linux/)”，在 1999 年创建了 Linux 技术中心（LTC）。在 LTC 里面有内核开发者、开源贡献者、IBM 硬件设备的驱动程序编写者，以及各种各样的针对 Linux 的开源工作。比起留在与 LTC 联系不大的部门，我更想要成为这个令人兴奋的 IBM 新天地的一份子。

从 2003 年到 2013 年我深度参与了 IBM 的 Linux 战略和 Linux 发行版（在 IBM 内部）的使用，最终组成了一个团队成为大约 60 个产品的信息交换所，Linux 的使用涉及了 IBM 每个部门。我参与了收购，期望每个设备、管理系统和虚拟机或者基于物理设备的中间件都能运行 Linux。我开始熟悉 Linux 发行版的构建，包括打包、选择上游来源、开发发行版维护的补丁集、做定制，并通过我们的发行版合作伙伴提供支持。

由于我们的下游供应商，我很少提交补丁到上游，但我通过配合 [Ulrich Drepper](https://www.linkedin.com/in/ulrichdrepper/) （将一个小补丁提交到 glibc）和改变[时区数据库](https://en.wikipedia.org/wiki/Tz_database)的工作贡献了自己的力量（Arthur David Olson 在 NIH 的 FTP 站点维护它的时候接受了这个改变）。但我仍然没有把开源项目的正式贡献者的工作来当做我的工作的一部分。是该改变这种情况的时候了。

在 2013 年末，我加入了 IBM 在开源社区的云组织，并正在寻找一个上游社区参与进来。我会在 Cloud Foundry 工作，还是会加入 IBM 为 OpenStack 贡献的大组中呢？都不是，因为在 2014 年 Docker 席卷了全球，IBM 要我们几个参与到这个热门的新技术。我在接下来的几个月里，经历了许多的第一次：使用 GitHub，比起只是 `git clone` [学习了关于 Git 的更多知识](/article-9319-1.html)，做过 Pull Request 的审查，用 Go 语言写代码，等等。在接下来的一年中，我在 Docker 引擎项目上成为一个维护者，为 Dockr 创造下一版的镜像规范（支持多个架构），并在一个关于容器技术的会议上出席和讲话。

### 如今的我

一晃几年过去，我已经成为了包括 CNCF 的 [containerd](https://github.com/containerd/containerd) 项目在内的开源项目的维护者。我还创建了项目（如 [manifest-tool](https://github.com/estesp/manifest-tool) 和 [bucketbench](https://github.com/estesp/bucketbench)）。我也通过 OCI 参与了开源治理，我现在是技术监督委员会的成员；而在Moby 项目，我是技术指导委员会的成员。我乐于在世界各地的会议、沙龙、IBM 内部发表关于开源的演讲。

开源现在是我在 IBM 职业生涯的一部分。我与工程师、开发人员和行业领袖的联系可能比我在 IBM 内认识的人的联系还要多。虽然开源与专有开发团队和供应商合作伙伴有许多相同的挑战，但据我的经验，开源与全球各地的人们的关系和联系远远超过困难。随着不同的意见、观点和经验的不断优化，可以对软件和涉及的在其中的人产生一种不断学习和改进的文化。

这个旅程 —— 从我第一次使用 Linux 到今天成为一个领袖、贡献者，和现在云原生开源世界的维护者 —— 我获得了极大的收获。我期待着与全球各地的人们长久的进行开源协作和互动。

---

via: <https://opensource.com/article/18/2/my-open-source-story-phil-estes>

作者：[Phil Estes](https://opensource.com/users/estesp) 译者：[ranchong](https://github.com/ranchong) 校对：[wxy](https://github.com/wxy)

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


简单介绍 ldd 命令

Summary: 您可以使用它来访问共享对象依赖关系

您可以使用它来访问共享对象依赖关系

# 简单介绍 ldd 命令

如果您的工作涉及到 Linux 中的可执行文件和共享库的知识，则需要了解几种命令行工具。其中之一是 `ldd` ，您可以使用它来访问共享对象依赖关系。在本教程中，我们将使用一些易于理解的示例来讨论此实用程序的基础知识。

请注意，这里提到的所有示例都已在 Ubuntu 16.04 LTS 上进行了测试。

### Linux ldd 命令

正如开头已经提到的，`ldd` 命令打印共享对象依赖关系。以下是该命令的语法：

```
ldd [option]... file...

```

下面是该工具的手册页对它作出的解释：

>
> ldd 会输出命令行指定的每个程序或共享对象所需的共享对象（共享库）。
>
>
>

以下使用问答的方式让您更好地了解ldd的工作原理。

### 问题一、 如何使用 ldd 命令?

`ldd` 的基本用法非常简单，只需运行 `ldd` 命令以及可执行文件或共享对象的文件名称作为输入。

```
ldd [object-name]

```

例如：

```
ldd test

```

[](https://www.howtoforge.com/images/command-tutorial/big/ldd-basic.png)

所以你可以看到所有的共享库依赖已经在输出中产生了。

### Q2、 如何使 ldd 在输出中生成详细的信息？

如果您想要 `ldd` 生成详细信息，包括符号版本控制数据，则可以使用 `-v` 命令行选项。例如，该命令

```
ldd -v test

```

当使用 `-v` 命令行选项时，在输出中产生以下内容：

[](https://www.howtoforge.com/images/command-tutorial/big/ldd-v-option.png)

### Q3、 如何使 ldd 产生未使用的直接依赖关系？

对于这个信息，使用 `-u` 命令行选项。这是一个例子：

```
ldd -u test

```

[](https://www.howtoforge.com/images/command-tutorial/big/ldd-u-test.png)

### Q4、 如何让 ldd 执行重定位？

您可以在这里使用几个命令行选项：`-d` 和 `-r`。 前者告诉 `ldd` 执行数据重定位，后者则使 `ldd` 为数据对象和函数执行重定位。在这两种情况下，该工具都会报告丢失的 ELF 对象（如果有的话）。

```
ldd -d
ldd -r

```

### Q5、 如何获得关于ldd的帮助？

`--help` 命令行选项使 `ldd` 为该工具生成有用的用法相关信息。

```
ldd --help

```

[](https://www.howtoforge.com/images/command-tutorial/big/ldd-help-option.png)

### 总结

`ldd` 不像 `cd`、`rm` 和 `mkdir` 这样的工具类别。这是因为它是为特定目的而构建的。该实用程序提供了有限的命令行选项，我们在这里介绍了其中的大部分。要了解更多信息，请前往 `ldd` 的[手册页](https://linux.die.net/man/1/ldd)。

---

via: <https://www.howtoforge.com/linux-ldd-command/>

作者: [Himanshu Arora](https://www.howtoforge.com/) 选题: [lujun9972](https://github.com/lujun9972) 译者: [MonkeyDEcho](https://github.com/MonkeyDEcho) 校对: [wxy](https://github.com/wxy)

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


使用 Showterm 录制和分享终端会话

# 使用 Showterm 录制和分享终端会话

你可以使用几乎所有的屏幕录制程序轻松录制终端会话。但是，你很可能会得到超大的视频文件。Linux 中有几种终端录制程序，每种录制程序都有自己的优点和缺点。Showterm 是一个可以非常容易地记录终端会话、上传、分享，并将它们嵌入到任何网页中的工具。一个优点是，你不会有巨大的文件来处理。

Showterm 是开源的，该项目可以在这个 [GitHub 页面](https://github.com/ConradIrwin/showterm)上找到。

**相关**：[2 个简单的将你的终端会话录制为视频的 Linux 程序](https://www.maketecheasier.com/record-terminal-session-as-video/ "2 Simple Applications That Record Your Terminal Session as Video [Linux]")

### 在 Linux 中安装 Showterm

Showterm 要求你在计算机上安装了 Ruby。以下是如何安装该程序。

```
gem install showterm

```

如果你没有在 Linux 上安装 Ruby，可以这样：

```
sudo curl showterm.io/showterm > ~/bin/showterm
sudo chmod +x ~/bin/showterm

```

如果你只是想运行程序而不是安装：

```
bash <(curl record.showterm.io)

```

你可以在终端输入 `showterm --help` 得到帮助页面。如果没有出现帮助页面，那么可能是未安装 `showterm`。现在你已安装了 Showterm（或正在运行独立版本），让我们开始使用该工具进行录制。

**相关**：[如何在 Ubuntu 中录制终端会话](https://www.maketecheasier.com/record-terminal-session-in-ubuntu/ "How to Record Terminal Session in Ubuntu")

### 录制终端会话

录制终端会话非常简单。从命令行运行 `showterm`。这会在后台启动终端录制。所有从命令行输入的命令都由 Showterm 记录。完成录制后，请按 `Ctrl + D` 或在命令行中输入`exit` 停止录制。

Showterm 会上传你的视频并输出一个看起来像 `http://showterm.io/<一长串字符>` 的链接的视频。不幸的是，终端会话会立即上传，而没有任何提示。请不要惊慌！你可以通过输入 `showterm --delete <recording URL>` 删除任何已上传的视频。在上传视频之前，你可以通过在 `showterm` 命令中添加 `-e` 选项来改变计时。如果视频无法上传，你可以使用 `showterm --retry <script> <times>` 强制重试。

在查看录制内容时，还可以通过在 URL 中添加 `#slow`、`#fast` 或 `#stop` 来控制视频的计时。`#slow` 让视频以正常速度播放、`#fast` 是速度加倍、`#stop`，如名称所示，停止播放视频。

Showterm 终端录制视频可以通过 iframe 轻松嵌入到网页中。这可以通过将 iframe 源添加到 showterm 视频地址来实现，如下所示。

作为开源工具，Showterm 允许进一步定制。例如，要运行你自己的 Showterm 服务器，你需要运行以下命令：

```
export SHOWTERM_SERVER=https://showterm.myorg.local/

```

这样你的客户端可以和它通信。还有额外的功能只需很少的编程知识就可添加。Showterm 服务器项目可在此 [GitHub 页面](https://github.com/ConradIrwin/showterm)获得。

### 结论

如果你想与同事分享一些命令行教程，请务必记得 Showterm。Showterm 是基于文本的。因此，与其他屏幕录制机相比，它将产生相对较小的视频。该工具本身尺寸相当小 —— 只有几千字节。

---

via: <https://www.maketecheasier.com/record-terminal-session-showterm/>

作者：[Bruno Edoh](https://www.maketecheasier.com/author/brunoedoh/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


在 Linux 中自动配置 IPv6 地址

Summary: 在本文中，我们将学习如何为 ULA 自动配置 IP 地址。

在本文中，我们将学习如何为 ULA 自动配置 IP 地址。

# 在 Linux 中自动配置 IPv6 地址

<img src="content_image/album_201803_12_093041hiu82223jw24aoa7.png" alt="" title="">

在 [KVM 中测试 IPv6 网络：第 1 部分](/article-9594-1.html) 一文中，我们学习了关于<ruby> 唯一本地地址 <rt>  unique local addresses </rt></ruby>（ULA）的相关内容。在本文中，我们将学习如何为 ULA 自动配置 IP 地址。

### 何时使用唯一本地地址

<ruby> 唯一本地地址 <rt>  unique local addresses </rt></ruby>（ULA）使用 `fd00::/8` 地址块，它类似于我们常用的 IPv4 的私有地址：`10.0.0.0/8`、`172.16.0.0/12`、以及 `192.168.0.0/16`。但它们并不能直接替换。IPv4 的私有地址分类和网络地址转换（NAT）功能是为了缓解 IPv4 地址短缺的问题，这是个明智的解决方案，它延缓了本该被替换的 IPv4 的生命周期。IPv6 也支持 NAT，但是我想不出使用它的理由。IPv6 的地址数量远远大于 IPv4；它是不一样的，因此需要做不一样的事情。

那么，ULA 存在的意义是什么呢？尤其是在我们已经有了<ruby> 本地链路地址 <rt>  link-local addresses </rt></ruby>（`fe80::/10`）时，到底需不需要我们去配置它们呢？它们之间（LCTT 译注：指的是唯一本地地址和本地链路地址）有两个重要的区别。一是，本地链路地址是不可路由的，因此，你不能跨子网使用它。二是，ULA 是你自己管理的；你可以自己选择它用于子网的地址范围，并且它们是可路由的。

使用 ULA 的另一个好处是，如果你只是在局域网中“混日子”的话，你不需要为它们分配全局单播 IPv6 地址。当然了，如果你的 ISP 已经为你分配了 IPv6 的<ruby> 全局单播地址 <rt>  global unicast addresses </rt></ruby>，就不需要使用 ULA 了。你也可以在同一个网络中混合使用全局单播地址和 ULA，但是，我想不出这样使用的一个好理由，并且要一定确保你不使用网络地址转换（NAT）以使 ULA 可公共访问。在我看来，这是很愚蠢的行为。

ULA 是仅为私有网络使用的，并且应该阻止其流出你的网络，不允许进入因特网。这很简单，在你的边界设备上只要阻止整个 `fd00::/8` 范围的 IPv6 地址即可实现。

### 地址自动配置

ULA 不像本地链路地址那样自动配置的，但是使用 radvd 设置自动配置是非常容易的，radva 是路由器公告守护程序。在你开始之前，运行 `ifconfig` 或者 `ip addr show` 去查看你现有的 IP 地址。

在生产系统上使用时，你应该将 radvd 安装在一台单独的路由器上，如果只是测试使用，你可以将它安装在你的网络中的任意 Linux PC 上。在我的小型 KVM 测试实验室中，我使用 `apt-get install radvd` 命令把它安装在 Ubuntu 上。安装完成之后，我先不启动它，因为它还没有配置文件：

```
$ sudo systemctl status radvd
● radvd.service - LSB: Router Advertising Daemon
   Loaded: loaded (/etc/init.d/radvd; bad; vendor preset: enabled)
   Active: active (exited) since Mon 2017-12-11 20:08:25 PST; 4min 59s ago
     Docs: man:systemd-sysv-generator(8)

Dec 11 20:08:25 ubunut1 systemd[1]: Starting LSB: Router Advertising Daemon...
Dec 11 20:08:25 ubunut1 radvd[3541]: Starting radvd:
Dec 11 20:08:25 ubunut1 radvd[3541]: * /etc/radvd.conf does not exist or is empty.
Dec 11 20:08:25 ubunut1 radvd[3541]: * See /usr/share/doc/radvd/README.Debian
Dec 11 20:08:25 ubunut1 radvd[3541]: * radvd will *not* be started.
Dec 11 20:08:25 ubunut1 systemd[1]: Started LSB: Router Advertising Daemon.

```

这些所有的消息有点让人困惑，实际上 radvd 并没有运行，你可以使用经典命令 `ps | grep radvd` 来验证这一点。因此，我们现在需要去创建 `/etc/radvd.conf` 文件。拷贝这个示例，将第一行的网络接口名替换成你自己的接口名字：

```
interface ens7 {
  AdvSendAdvert on;
  MinRtrAdvInterval 3;
  MaxRtrAdvInterval 10;
  prefix fd7d:844d:3e17:f3ae::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
        };

};

```

前缀（`prefix`）定义了你的网络地址，它是地址的前 64 位。前两个字符必须是 `fd`，前缀接下来的剩余部分你自己定义它，最后的 64 位留空，因为 radvd 将去分配最后的 64 位。前缀后面的 16 位用来定义子网，剩余的地址定义为主机地址。你的子网必须总是 `/64`。RFC 4193 要求地址必须随机生成；查看 [在 KVM 中测试 IPv6 Networking：第 1 部分](https://www.linux.com/learn/intro-to-linux/2017/11/testing-ipv6-networking-kvm-part-1) 学习创建和管理 ULAs 的更多知识。

### IPv6 转发

IPv6 转发必须要启用。下面的命令去启用它，重启后生效：

```
$ sudo sysctl -w net.ipv6.conf.all.forwarding=1

```

取消注释或者添加如下的行到 `/etc/sysctl.conf` 文件中，以使它永久生效：

```
net.ipv6.conf.all.forwarding = 1

```

启动 radvd 守护程序：

```
$ sudo systemctl stop radvd
$ sudo systemctl start radvd

```

这个示例在我的 Ubuntu 测试系统中遇到了一个怪事；radvd 总是停止，我查看它的状态却没有任何问题，做任何改变之后都需要重新启动 radvd。

启动成功后没有任何输出，并且失败也是如此，因此，需要运行 `sudo systemctl status radvd` 去查看它的运行状态。如果有错误，`systemctl` 会告诉你。一般常见的错误都是 `/etc/radvd.conf` 中的语法错误。

在 Twitter 上抱怨了上述问题之后，我学到了一件很酷的技巧：当你运行 `journalctl -xe --no-pager` 去调试 `systemctl` 错误时，你的输出会被换行，然后，你就可以看到错误信息。

现在检查你的主机，查看它们自动分配的新地址：

```
$ ifconfig
ens7      Link encap:Ethernet  HWaddr 52:54:00:57:71:50
          [...]
          inet6 addr: fd7d:844d:3e17:f3ae:9808:98d5:bea9:14d9/64 Scope:Global
          [...]

```

本文到此为止，下周继续学习如何为 ULA 管理 DNS，这样你就可以使用一个合适的主机名来代替这些长长的 IPv6 地址。

通过来自 Linux 基金会和 edX 的 [“Linux 入门”](https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux) 免费课程学习更多 Linux 的知识。

---

via: <https://www.linux.com/learn/intro-to-linux/2017/12/ipv6-auto-configuration-linux>

作者：[Carla Schroder](https://www.linux.com/users/cschroder) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


为初学者介绍的 Linux tee 命令（6 个例子）

Summary: 有时候，你会想手动跟踪命令的输出内容，同时又想将输出的内容写入文件，确保之后可以用来参考。如果你想寻找这相关的工具，那么恭喜你，Linux 已经有了一个叫做 tee 的命令可以帮助你。

赞

# 为初学者介绍的 Linux tee 命令（6 个例子）

有时候，你会想手动跟踪命令的输出内容，同时又想将输出的内容写入文件，确保之后可以用来参考。如果你想寻找这相关的工具，那么恭喜你，Linux 已经有了一个叫做 `tee` 的命令可以帮助你。

本教程中，我们将基于 `tee` 命令，用一些简单的例子开始讨论。但是在此之前，值得一提的是，本文我们所有的测试实例都基于 Ubuntu 16.04 LTS。

### Linux tee 命令

`tee` 命令基于标准输入读取数据，标准输出或文件写入数据。感受下这个命令的语法：

```
tee [OPTION]... [FILE]...

```

这里是帮助文档的说明：

>
> 从标准输入中复制到每一个文件，并输出到标准输出。
>
>
>

让 Q&A（问&答）风格的实例给我们带来更多灵感，深入了解这个命令。

### Q1、 如何在 Linux 上使用这个命令？

假设因为某些原因，你正在使用 `ping` 命令。

```
ping google.com

```

[](https://www.howtoforge.com/images/command-tutorial/big/ping-example.png)

然后同时，你想要输出的信息也同时能写入文件。这个时候，`tee` 命令就有其用武之地了。

```
ping google.com | tee output.txt

```

下面的截图展示了这个输出内容不仅被写入 `output.txt` 文件，也被显示在标准输出中。

[](https://www.howtoforge.com/images/command-tutorial/big/ping-with-tee.png)

如此应当明白了 `tee` 的基础用法。

### Q2、 如何确保 tee 命令追加信息到文件中？

默认情况下，在同一个文件下再次使用 `tee` 命令会覆盖之前的信息。如果你想的话，可以通过 `-a` 命令选项改变默认设置。

```
[command] | tee -a [file]

```

基本上，`-a` 选项强制 `tee` 命令追加信息到文件。

### Q3、 如何让 tee 写入多个文件？

这非常之简单。你仅仅只需要写明文件名即可。

```
[command] | tee [file1] [file2] [file3]

```

比如：

```
ping google.com | tee output1.txt output2.txt output3.txt

```

[](https://www.howtoforge.com/images/command-tutorial/big/tee-mult-files1.png)

### Q4. 如何让 tee 命令的输出内容直接作为另一个命令的输入内容？

使用 `tee` 命令，你不仅可以将输出内容写入文件，还可以把输出内容作为另一个命令的输入内容。比如说，下面的命令不仅会将文件名存入 `output.txt` 文件中，还会通过 `wc` 命令让你知道输入到 `output.txt` 中的文件数目。

```
ls file* | tee output.txt | wc -l

```

[](https://www.howtoforge.com/images/command-tutorial/big/tee-redirect-output.png)

### Q5. 如何使用 tee 命令提升文件写入权限？

假如你使用 [Vim 编辑器](https://www.howtoforge.com/vim-basics) 打开文件，并且做了很多更改，然后当你尝试保存修改时，你得到一个报错，让你意识到那是一个 root 所拥有的文件，这意味着你需要使用 `sudo` 权限保存修改。

[](https://www.howtoforge.com/images/command-tutorial/big/vim-write-error.png)

如此情况下，你可以（在 Vim 内）使用 `tee` 命令来提高权限。

```
:w !sudo tee %

```

上述命令会向你索要 root 密码，然后就能让你保存修改了。

### Q6. 如何让 tee 命令忽视中断？

`-i` 命令行选项使 `tee` 命令忽视通常由 `ctrl+c` 组合键发起的中断信号（`SIGINT`）。

```
[command] | tee -i [file]

```

当你想要使用 `ctrl+c` 中断该命令，同时让 `tee` 命令优雅的退出，这个选项尤为实用。

### 总结

现在你可能已经认同 `tee` 是一个非常实用的命令。基于 `tee` 命令的用法，我们已经介绍了其绝大多数的命令行选项。这个工具并没有什么陡峭的学习曲线，所以，只需跟随这几个例子练习，你就可以运用自如了。更多信息，请查看 [帮助文档](https://linux.die.net/man/1/tee).

---

via: <https://www.howtoforge.com/linux-tee-command/>

作者：[Himanshu Arora](https://www.howtoforge.com) 译者：[CYLeft](https://github.com/CYLeft) 校对：[wxy](https://github.com/wxy)

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


SPARTA：用于网络渗透测试的 GUI 工具套件

# SPARTA：用于网络渗透测试的 GUI 工具套件

SPARTA 是使用 Python 开发的 GUI 应用程序，它是 Kali Linux 内置的网络渗透测试工具。它简化了扫描和枚举阶段，并更快速的得到结果。

SPARTA GUI 工具套件最擅长的事情是扫描和发现目标端口和运行的服务。

此外，作为枚举阶段的一部分功能，它提供对开放端口和服务的暴力攻击。

延伸阅读：[网络渗透检查清单](https://gbhackers.com/network-penetration-testing-checklist-examples/)

### 安装

请从 GitHub 上克隆最新版本的 SPARTA：

```
git clone https://github.com/secforce/sparta.git

```

或者，从 [这里](https://github.com/SECFORCE/sparta/archive/master.zip) 下载最新版本的 Zip 文件。

```
cd /usr/share/
git clone https://github.com/secforce/sparta.git

```

将 `sparta` 文件放到 `/usr/bin/` 目录下并赋于可运行权限。

在任意终端中输入 'sparta' 来启动应用程序。

### 网络渗透测试的范围

添加一个目标主机或者目标主机的列表到测试范围中，来发现一个组织的网络基础设备在安全方面的薄弱环节。

选择菜单条 - “File” -> “Add host(s) to scope”

[](https://i0.wp.com/gbhackers.com/wp-content/uploads/2018/01/Screenshot-526.png?ssl=1)

[](https://i2.wp.com/gbhackers.com/wp-content/uploads/2018/01/Screenshot-527.png?ssl=1)

上图展示了在扫描范围中添加 IP 地址。根据你网络的具体情况，你可以添加一个 IP 地址的范围去扫描。 扫描范围添加之后，Nmap 将开始扫描，并很快得到结果，扫描阶段结束。

### 打开的端口及服务

Nmap 扫描结果提供了目标上开放的端口和服务。

[](https://i2.wp.com/gbhackers.com/wp-content/uploads/2018/01/Screenshot-528.png?ssl=1)

上图展示了扫描发现的目标操作系统、开发的端口和服务。

### 在开放端口上实施暴力攻击

我们来通过 445 端口的服务器消息块（SMB）协议来暴力获取用户列表和它们的有效密码。

[](https://i1.wp.com/gbhackers.com/wp-content/uploads/2018/01/Screenshot-529.png?ssl=1)

右键并选择 “Send to Brute” 选项。也可以选择发现的目标上的开放端口和服务。

浏览和在用户名密码框中添加字典文件。

[](https://i2.wp.com/gbhackers.com/wp-content/uploads/2018/01/Screenshot-531.png?ssl=1)

点击 “Run” 去启动对目标的暴力攻击。上图展示了对目标 IP 地址进行的暴力攻击取得成功，找到了有效的密码。

在 Windows 中失败的登陆尝试总是被记录到事件日志中。

密码每 15 到 30 天改变一次的策略是非常好的一个实践经验。

强烈建议使用强密码策略。密码锁定策略是阻止这种暴力攻击的最佳方法之一（ 5 次失败的登录尝试之后将锁定帐户）。

将关键业务资产整合到 SIEM（ 安全冲突 & 事件管理）中将尽可能快地检测到这类攻击行为。

SPARTA 对渗透测试的扫描和枚举阶段来说是一个非常省时的 GUI 工具套件。SPARTA 可以扫描和暴力破解各种协议。它有许多的功能！祝你测试顺利！

---

via: <https://gbhackers.com/sparta-network-penetration-testing-gui-toolkit/>

作者：[Balaganesh](https://gbhackers.com/author/balaganesh/) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


Linux 启动过程分析

Summary: 理解运转良好的系统对于处理不可避免的故障是最好的准备。

理解运转良好的系统对于处理不可避免的故障是最好的准备。

# Linux 启动过程分析

>
> 理解运转良好的系统对于处理不可避免的故障是最好的准备。
>
>
>

关于开源软件最古老的笑话是：“代码是<ruby> 自具文档化的 <rt>  self-documenting </rt></ruby>”。经验表明，阅读源代码就像听天气预报一样：明智的人依然出门会看看室外的天气。本文讲述了如何运用调试工具来观察和分析 Linux 系统的启动。分析一个功能正常的系统启动过程，有助于用户和开发人员应对不可避免的故障。

从某些方面看，启动过程非常简单。内核在单核上以单线程和同步状态启动，似乎可以理解。但内核本身是如何启动的呢？[initrd（initial ramdisk）](https://en.wikipedia.org/wiki/Initial_ramdisk) 和<ruby> 引导程序 <rt>  bootloader </rt></ruby>具有哪些功能？还有，为什么以太网端口上的 LED 灯是常亮的呢？

请继续阅读寻找答案。在 GitHub 上也提供了 [介绍演示和练习的代码](https://github.com/chaiken/LCA2018-Demo-Code)。

### 启动的开始：OFF 状态

#### <ruby> 局域网唤醒 <rt>  Wake-on-LAN </rt></ruby>

OFF 状态表示系统没有上电，没错吧？表面简单，其实不然。例如，如果系统启用了局域网唤醒机制（WOL），以太网指示灯将亮起。通过以下命令来检查是否是这种情况：

```
# sudo ethtool <interface name>

```

其中 `<interface name>` 是网络接口的名字，比如 `eth0`。（`ethtool` 可以在同名的 Linux 软件包中找到。）如果输出中的 `Wake-on` 显示 `g`，则远程主机可以通过发送 [<ruby> 魔法数据包 <rt>  MagicPacket </rt></ruby>](https://en.wikipedia.org/wiki/Wake-on-LAN) 来启动系统。如果您无意远程唤醒系统，也不希望其他人这样做，请在系统 BIOS 菜单中将 WOL 关闭，或者用以下方式：

```
# sudo ethtool -s <interface name> wol d

```

响应魔法数据包的处理器可能是网络接口的一部分，也可能是 [<ruby> 底板管理控制器 <rt>  Baseboard Management Controller </rt></ruby>](https://lwn.net/Articles/630778/)（BMC）。

#### 英特尔管理引擎、平台控制器单元和 Minix

BMC 不是唯一的在系统关闭时仍在监听的微控制器（MCU）。x86\_64 系统还包含了用于远程管理系统的英特尔管理引擎（IME）软件套件。从服务器到笔记本电脑，各种各样的设备都包含了这项技术，它开启了如 KVM 远程控制和英特尔功能许可服务等 [功能](https://www.youtube.com/watch?v=iffTJ1vPCSo&amp;amp;amp;amp;amp;index=65&amp;amp;amp;amp;amp;list=PLbzoR-pLrL6pISWAq-1cXP4_UZAyRtesk)。根据 [Intel 自己的检测工具](https://www.intel.com/content/www/us/en/support/articles/000025619/software.html)，[IME 存在尚未修补的漏洞](https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00086&amp;amp;amp;amp;amp;languageid=en-fr)。坏消息是，要禁用 IME 很难。Trammell Hudson 发起了一个 [me\_cleaner 项目](https://github.com/corna/me_cleaner)，它可以清除一些相对恶劣的 IME 组件，比如嵌入式 Web 服务器，但也可能会影响运行它的系统。

IME 固件和<ruby> 系统管理模式 <rt>  System Management Mode </rt></ruby>（SMM）软件是 [基于 Minix 操作系统](https://lwn.net/Articles/738649/) 的，并运行在单独的<ruby> 平台控制器单元 <rt>  Platform Controller Hub </rt></ruby>上（LCTT 译注：即南桥芯片），而不是主 CPU 上。然后，SMM 启动位于主处理器上的<ruby> 通用可扩展固件接口 <rt>  Universal Extensible Firmware Interface </rt></ruby>（UEFI）软件，相关内容 [已被提及多次](https://lwn.net/Articles/699551/)。Google 的 Coreboot 小组已经启动了一个雄心勃勃的 [<ruby> 非扩展性缩减版固件 <rt>  Non-Extensible Reduced Firmware </rt></ruby>](https://trmm.net/NERF)（NERF）项目，其目的不仅是要取代 UEFI，还要取代早期的 Linux 用户空间组件，如 systemd。在我们等待这些新成果的同时，Linux 用户现在就可以从 Purism、System76 或 Dell 等处购买 [禁用了 IME](https://www.extremetech.com/computing/259879-dell-now-shipping-laptops-intels-management-engine-disabled) 的笔记本电脑，另外 [带有 ARM 64 位处理器笔记本电脑](https://lwn.net/Articles/733837/) 还是值得期待的。

#### 引导程序

除了启动那些问题不断的间谍软件外，早期引导固件还有什么功能呢？引导程序的作用是为新上电的处理器提供通用操作系统（如 Linux）所需的资源。在开机时，不但没有虚拟内存，在控制器启动之前连 DRAM 也没有。然后，引导程序打开电源，并扫描总线和接口，以定位内核镜像和根文件系统的位置。U-Boot 和 GRUB 等常见的引导程序支持 USB、PCI 和 NFS 等接口，以及更多的嵌入式专用设备，如 NOR 闪存和 NAND 闪存。引导程序还与 [<ruby> 可信平台模块 <rt>  Trusted Platform Module </rt></ruby>](https://linuxplumbersconf.org/2017/ocw/events/LPC2017/tracks/639)（TPM）等硬件安全设备进行交互，在启动最开始建立信任链。

*在构建主机上的沙盒中运行 U-boot 引导程序。*

包括树莓派、任天堂设备、汽车主板和 Chromebook 在内的系统都支持广泛使用的开源引导程序 [U-Boot](http://www.denx.de/wiki/DULG/Manual)。它没有系统日志，当发生问题时，甚至没有任何控制台输出。为了便于调试，U-Boot 团队提供了一个沙盒，可以在构建主机甚至是夜间的持续集成（CI）系统上测试补丁程序。如果系统上安装了 Git 和 GNU Compiler Collection（GCC）等通用的开发工具，使用 U-Boot 沙盒会相对简单：

```
# git clone git://git.denx.de/u-boot; cd u-boot
# make ARCH=sandbox defconfig
# make; ./u-boot
=> printenv
=> help

```

在 x86\_64 上运行 U-Boot，可以测试一些棘手的功能，如 [模拟存储设备](https://github.com/chaiken/LCA2018-Demo-Code) 的重新分区、基于 TPM 的密钥操作以及 USB 设备热插拔等。U-Boot 沙盒甚至可以在 GDB 调试器下单步执行。使用沙盒进行开发的速度比将引导程序刷新到电路板上的测试快 10 倍，并且可以使用 `Ctrl + C` 恢复一个“变砖”的沙盒。

### 启动内核

#### 配置引导内核

引导程序完成任务后将跳转到已加载到主内存中的内核代码，并开始执行，传递用户指定的任何命令行选项。内核是什么样的程序呢？用命令 `file /boot/vmlinuz` 可以看到它是一个 “bzImage”，意思是一个大的压缩的镜像。Linux 源代码树包含了一个可以解压缩这个文件的工具—— [extract-vmlinux](https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux)：

```
# scripts/extract-vmlinux /boot/vmlinuz-$(uname -r) > vmlinux
# file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically
linked, stripped

```

内核是一个 [<ruby> 可执行与可链接格式 <rt>  Executable and Linking Format </rt></ruby>](http://man7.org/linux/man-pages/man5/elf.5.html)（ELF）的二进制文件，就像 Linux 的用户空间程序一样。这意味着我们可以使用 `binutils` 包中的命令，如 `readelf` 来检查它。比较一下输出，例如：

```
# readelf -S /bin/date
# readelf -S vmlinux

```

这两个二进制文件中的段内容大致相同。

所以内核必须像其他的 Linux ELF 文件一样启动，但用户空间程序是如何启动的呢？在 `main()` 函数中？并不确切。

在 `main()` 函数运行之前，程序需要一个执行上下文，包括堆栈内存以及 `stdio`、`stdout` 和 `stderr` 的文件描述符。用户空间程序从标准库（多数 Linux 系统在用 “glibc”）中获取这些资源。参照以下输出：

```
# file /bin/date
/bin/date: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32,
BuildID[sha1]=14e8563676febeb06d701dbee35d225c5a8e565a,
stripped

```

ELF 二进制文件有一个解释器，就像 Bash 和 Python 脚本一样，但是解释器不需要像脚本那样用 `#!` 指定，因为 ELF 是 Linux 的原生格式。ELF 解释器通过调用 `_start()` 函数来用所需资源 [配置一个二进制文件](https://0xax.gitbooks.io/linux-insides/content/Misc/program_startup.html)，这个函数可以从 glibc 源代码包中找到，可以 [用 GDB 查看](https://github.com/chaiken/LCA2018-Demo-Code/commit/e543d9812058f2dd65f6aed45b09dda886c5fd4e)。内核显然没有解释器，必须自我配置，这是怎么做到的呢？

用 GDB 检查内核的启动给出了答案。首先安装内核的调试软件包，内核中包含一个<ruby> 未剥离的 <rt>  unstripped </rt></ruby> vmlinux，例如 `apt-get install linux-image-amd64-dbg`，或者从源代码编译和安装你自己的内核，可以参照 [Debian Kernel Handbook](http://kernel-handbook.alioth.debian.org/) 中的指令。`gdb vmlinux` 后加 `info files` 可显示 ELF 段 `init.text`。在 `init.text` 中用 `l *(address)` 列出程序执行的开头，其中 `address` 是 `init.text` 的十六进制开头。用 GDB 可以看到 x86\_64 内核从内核文件 [arch/x86/kernel/head\_64.S](https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/head_64.S) 开始启动，在这个文件中我们找到了汇编函数 `start_cpu0()`，以及一段明确的代码显示在调用 `x86_64 start_kernel()` 函数之前创建了堆栈并解压了 zImage。ARM 32 位内核也有类似的文件 [arch/arm/kernel/head.S](https://github.com/torvalds/linux/blob/master/arch/arm/boot/compressed/head.S)。`start_kernel()` 不针对特定的体系结构，所以这个函数驻留在内核的 [init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) 中。`start_kernel()` 可以说是 Linux 真正的 `main()` 函数。

### 从 start\_kernel() 到 PID 1

#### 内核的硬件清单：设备树和 ACPI 表

在引导时，内核需要硬件信息，不仅仅是已编译过的处理器类型。代码中的指令通过单独存储的配置数据进行扩充。有两种主要的数据存储方法：[<ruby> 设备树 <rt>  device-tree </rt></ruby>](https://www.youtube.com/watch?v=m_NyYEBxfn8) 和 [高级配置和电源接口（ACPI）表](http://events.linuxfoundation.org/sites/events/files/slides/x86-platform.pdf)。内核通过读取这些文件了解每次启动时需要运行的硬件。

对于嵌入式设备，设备树是已安装硬件的清单。设备树只是一个与内核源代码同时编译的文件，通常与 `vmlinux` 一样位于 `/boot` 目录中。要查看 ARM 设备上的设备树的内容，只需对名称与 `/boot/*.dtb` 匹配的文件执行 `binutils` 包中的 `strings` 命令即可，这里 `dtb` 是指<ruby> 设备树二进制文件 <rt>  device-tree binary </rt></ruby>。显然，只需编辑构成它的类 JSON 的文件并重新运行随内核源代码提供的特殊 `dtc` 编译器即可修改设备树。虽然设备树是一个静态文件，其文件路径通常由命令行引导程序传递给内核，但近年来增加了一个 [设备树覆盖](http://lwn.net/Articles/616859/) 的功能，内核在启动后可以动态加载热插拔的附加设备。

x86 系列和许多企业级的 ARM64 设备使用 [ACPI](http://events.linuxfoundation.org/sites/events/files/slides/x86-platform.pdf) 机制。与设备树不同的是，ACPI 信息存储在内核在启动时通过访问板载 ROM 而创建的 `/sys/firmware/acpi/tables` 虚拟文件系统中。读取 ACPI 表的简单方法是使用 `acpica-tools` 包中的 `acpidump` 命令。例如：

*联想笔记本电脑的 ACPI 表都是为 Windows 2001 设置的。*

是的，你的 Linux 系统已经准备好用于 Windows 2001 了，你要考虑安装吗？与设备树不同，ACPI 具有方法和数据，而设备树更多地是一种硬件描述语言。ACPI 方法在启动后仍处于活动状态。例如，运行 `acpi_listen` 命令（在 `apcid` 包中），然后打开和关闭笔记本机盖会发现 ACPI 功能一直在运行。暂时地和动态地 [覆盖 ACPI 表](https://www.mjmwired.net/kernel/Documentation/acpi/method-customizing.txt) 是可能的，而永久地改变它需要在引导时与 BIOS 菜单交互或刷新 ROM。如果你遇到那么多麻烦，也许你应该 [安装 coreboot](https://www.coreboot.org/Supported_Motherboards)，这是开源固件的替代品。

#### 从 start\_kernel() 到用户空间

[init/main.c](https://github.com/torvalds/linux/blob/master/init/main.c) 中的代码竟然是可读的，而且有趣的是，它仍然在使用 1991 - 1992 年的 Linus Torvalds 的原始版权。在一个刚启动的系统上运行 `dmesg | head`，其输出主要来源于此文件。第一个 CPU 注册到系统中，全局数据结构被初始化，并且调度程序、中断处理程序（IRQ）、定时器和控制台按照严格的顺序逐一启动。在 `timekeeping_init()` 函数运行之前，所有的时间戳都是零。内核初始化的这部分是同步的，也就是说执行只发生在一个线程中，在最后一个完成并返回之前，没有任何函数会被执行。因此，即使在两个系统之间，`dmesg` 的输出也是完全可重复的，只要它们具有相同的设备树或 ACPI 表。Linux 的行为就像在 MCU 上运行的 RTOS（实时操作系统）一样，如 QNX 或 VxWorks。这种情况持续存在于函数 `rest_init()` 中，该函数在终止时由 `start_kernel()` 调用。

*早期的内核启动流程。*

函数 `rest_init()` 产生了一个新进程以运行 `kernel_init()`，并调用了 `do_initcalls()`。用户可以通过将 `initcall_debug` 附加到内核命令行来监控 `initcalls`，这样每运行一次 `initcall` 函数就会产生 一个 `dmesg` 条目。`initcalls` 会历经七个连续的级别：early、core、postcore、arch、subsys、fs、device 和 late。`initcalls` 最为用户可见的部分是所有处理器外围设备的探测和设置：总线、网络、存储和显示器等等，同时加载其内核模块。`rest_init()` 也会在引导处理器上产生第二个线程，它首先运行 `cpu_idle()`，然后等待调度器分配工作。

`kernel_init()` 也可以 [设置对称多处理（SMP）结构](http://free-electrons.com/pub/conferences/2014/elc/clement-smp-bring-up-on-arm-soc)。在较新的内核中，如果 `dmesg` 的输出中出现 “Bringing up secondary CPUs...” 等字样，系统便使用了 SMP。SMP 通过“热插拔” CPU 来进行，这意味着它用状态机来管理其生命周期，这种状态机在概念上类似于热插拔的 U 盘一样。内核的电源管理系统经常会使某个<ruby> 核 <rt>  core </rt></ruby>离线，然后根据需要将其唤醒，以便在不忙的机器上反复调用同一段的 CPU 热插拔代码。观察电源管理系统调用 CPU 热插拔代码的 [BCC 工具](http://www.brendangregg.com/ebpf.html) 称为 `offcputime.py`。

请注意，`init/main.c` 中的代码在 `smp_init()` 运行时几乎已执行完毕：引导处理器已经完成了大部分一次性初始化操作，其它核无需重复。尽管如此，跨 CPU 的线程仍然要在每个核上生成，以管理每个核的中断（IRQ）、工作队列、定时器和电源事件。例如，通过 `ps -o psr` 命令可以查看服务每个 CPU 上的线程的 softirqs 和 workqueues。

```
# ps -o pid,psr,comm $(pgrep ksoftirqd)
 PID PSR COMMAND
   7   0 ksoftirqd/0
  16   1 ksoftirqd/1
  22   2 ksoftirqd/2
  28   3 ksoftirqd/3

# ps -o pid,psr,comm $(pgrep kworker)
PID  PSR COMMAND
   4   0 kworker/0:0H
  18   1 kworker/1:0H
  24   2 kworker/2:0H
  30   3 kworker/3:0H
[ . . . ]

```

其中，PSR 字段代表“<ruby> 处理器 <rt>  processor </rt></ruby>”。每个核还必须拥有自己的定时器和 `cpuhp` 热插拔处理程序。

那么用户空间是如何启动的呢？在最后，`kernel_init()` 寻找可以代表它执行 `init` 进程的 `initrd`。如果没有找到，内核直接执行 `init` 本身。那么为什么需要 `initrd` 呢？

#### 早期的用户空间：谁规定要用 initrd？

除了设备树之外，在启动时可以提供给内核的另一个文件路径是 `initrd` 的路径。`initrd` 通常位于 `/boot` 目录中，与 x86 系统中的 bzImage 文件 vmlinuz 一样，或是与 ARM 系统中的 uImage 和设备树相同。用 `initramfs-tools-core` 软件包中的 `lsinitramfs` 工具可以列出 `initrd` 的内容。发行版的 `initrd` 方案包含了最小化的 `/bin`、`/sbin` 和 `/etc` 目录以及内核模块，还有 `/scripts` 中的一些文件。所有这些看起来都很熟悉，因为 `initrd` 大致上是一个简单的最小化 Linux 根文件系统。看似相似，其实不然，因为位于虚拟内存盘中的 `/bin` 和 `/sbin` 目录下的所有可执行文件几乎都是指向 [BusyBox 二进制文件](https://www.mjmwired.net/kernel/Documentation/acpi/initrd_table_override.txt) 的符号链接，由此导致 `/bin` 和 `/sbin` 目录比 glibc 的小 10 倍。

如果要做的只是加载一些模块，然后在普通的根文件系统上启动 `init`，为什么还要创建一个 `initrd` 呢？想想一个加密的根文件系统，解密可能依赖于加载一个位于根文件系统 `/lib/modules` 的内核模块，当然还有 `initrd` 中的。加密模块可能被静态地编译到内核中，而不是从文件加载，但有多种原因不希望这样做。例如，用模块静态编译内核可能会使其太大而不能适应存储空间，或者静态编译可能会违反软件许可条款。不出所料，存储、网络和人类输入设备（HID）驱动程序也可能存在于 `initrd` 中。`initrd` 基本上包含了任何挂载根文件系统所必需的非内核代码。`initrd` 也是用户存放 [自定义ACPI](https://www.mjmwired.net/kernel/Documentation/acpi/initrd_table_override.txt) 表代码的地方。

<img src="content_image/album_201803_13_105732ympxw546urala8w3.png" alt="Rescue shell and a custom initrd." title="Rescue shell and a custom initrd.">

*救援模式的 shell 和自定义的 `initrd` 还是很有意思的。*

`initrd` 对测试文件系统和数据存储设备也很有用。将这些测试工具存放在 `initrd` 中，并从内存中运行测试，而不是从被测对象中运行。

最后，当 `init` 开始运行时，系统就启动啦！由于第二个处理器现在在运行，机器已经成为我们所熟知和喜爱的异步、可抢占、不可预测和高性能的生物。的确，`ps -o pid,psr,comm -p 1` 很容易显示用户空间的 `init` 进程已不在引导处理器上运行了。

### 总结

Linux 引导过程听起来或许令人生畏，即使是简单嵌入式设备上的软件数量也是如此。但换个角度来看，启动过程相当简单，因为启动中没有抢占、RCU 和竞争条件等扑朔迷离的复杂功能。只关注内核和 PID 1 会忽略了引导程序和辅助处理器为运行内核执行的大量准备工作。虽然内核在 Linux 程序中是独一无二的，但通过一些检查 ELF 文件的工具也可以了解其结构。学习一个正常的启动过程，可以帮助运维人员处理启动的故障。

要了解更多信息，请参阅 Alison Chaiken 的演讲——[Linux: The first second](https://rego.linux.conf.au/schedule/presentation/16/)，已于 1 月 22 日至 26 日在悉尼举行。参见 [linux.conf.au](https://linux.conf.au/index.html)。

感谢 [Akkana Peck](http://shallowsky.com/) 的提议和指正。

---

via: <https://opensource.com/article/18/1/analyzing-linux-boot-process>

作者：[Alison Chaiken](https://opensource.com/users/don-watkins) 译者：[jessie-pang](https://github.com/jessie-pang) 校对：[wxy](https://github.com/wxy)

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


Dnsmasq 进阶技巧

# Dnsmasq 进阶技巧

<img src="content_image/album_201803_14_000349ttbzzl4em8xxn7il.png" alt="" title="">

许多人熟知并热爱 Dnsmasq，并在他们的本地域名服务上使用它。今天我们将介绍进阶配置文件管理、如何测试你的配置、一些基础的安全知识、DNS 泛域名、快速 DNS 配置，以及其他一些技巧与窍门。下个星期我们将继续详细讲解如何配置 DNS 和 DHCP。

### 测试配置

当你测试新的配置的时候，你应该从命令行运行 Dnsmasq，而不是使用守护进程。下面的例子演示了如何不用守护进程运行它，同时显示指令的输出并保留运行日志：

```
# dnsmasq --no-daemon --log-queries
dnsmasq: started, version 2.75 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt
 DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack
 ipset auth DNSSEC loop-detect inotify
dnsmasq: reading /etc/resolv.conf
dnsmasq: using nameserver 192.168.0.1#53
dnsmasq: read /etc/hosts - 9 addresses

```

在这个小例子中你能看到许多有用的信息，包括版本、编译参数、系统名字服务文件，以及它的监听地址。可以使用 `Ctrl+C` 停止进程。在默认情况下，Dnsmasq 没有自己的日志文件，所以日志会被记录到 `/var/log` 目录下的多个地方。你可以使用经典的 `grep` 来找到 Dnsmasq 的日志文件。下面这条指令会递归式地搜索 `/var/log`，在每个匹配的文件名之后显示匹配的行号，并忽略 `/var/log/dist-upgrade` 里的内容：

```
# grep -ir --exclude-dir=dist-upgrade dnsmasq /var/log/

```

使用 `grep --exclude-dir=` 时有一个有趣的小陷阱需要注意：不要使用完整路径，而应该只写目录名称。

你可以使用如下的命令行参数来让 Dnsmasq 使用你指定的文件作为它专属的日志文件：

```
# dnsmasq --no-daemon --log-queries --log-facility=/var/log/dnsmasq.log

```

或者在你的 Dnsmasq 配置文件中加上 `log-facility=/var/log/dnsmasq.log`。

### 配置文件

Dnsmasq 的配置文件位于 `/etc/dnsmasq.conf`。你的 Linux 发行版也可能会使用 `/etc/default/dnsmasq`、`/etc/dnsmasq.d/`，或者 `/etc/dnsmasq.d-available/`（不，我们不能统一标准，因为这违反了 <ruby> Linux 七嘴八舌秘密议会 <rt>  Linux Cat Herd Ruling Cabal </rt></ruby>的旨意）。你有很多自由来随意安置你的配置文件。

`/etc/dnsmasq.conf` 是德高望重的老大。Dnsmasq 在启动时会最先读取它。`/etc/dnsmasq.conf` 可以使用 `conf-file=` 选项来调用其他的配置文件，例如 `conf-file=/etc/dnsmasqextrastuff.conf`，或使用 `conf-dir=` 选项来调用目录下的所有文件，例如 `conf-dir=/etc/dnsmasq.d`。

每当你对配置文件进行了修改，你都必须重启 Dnsmasq。

你也可以根据扩展名来包含或忽略配置文件。星号表示包含，不加星号表示排除：

```
conf-dir=/etc/dnsmasq.d/, *.conf, *.foo
conf-dir=/etc/dnsmasq.d, .old, .bak, .tmp

```

你可以用 `--addn-hosts=` 选项来把你的主机配置分布在多个文件中。

Dnsmasq 包含了一个语法检查器：

```
$ dnsmasq --test
dnsmasq: syntax check OK.

```

### 实用配置

永远加入这几行：

```
domain-needed
bogus-priv

```

它们可以避免含有格式出错的域名或私有 IP 地址的数据包离开你的网络。

让你的名字服务只使用 Dnsmasq，而不去使用 `/etc/resolv.conf` 或任何其他的名字服务文件：

```
no-resolv

```

使用其他的域名服务器。第一个例子是只对于某一个域名使用不同的域名服务器。第二个和第三个例子是 OpenDNS 公用服务器：

```
server=/fooxample.com/192.168.0.1
server=208.67.222.222
server=208.67.220.220

```

你也可以将某些域名限制为只能本地解析，但不影响其他域名。这些被限制的域名只能从 `/etc/hosts` 或 DHCP 解析：

```
local=/mehxample.com/
local=/fooxample.com/

```

限制 Dnsmasq 监听的网络接口：

```
interface=eth0
interface=wlan1

```

Dnsmasq 在默认设置下会读取并使用 `/etc/hosts`。这是一个又快又好的配置大量域名的方法，并且 `/etc/hosts` 只需要和 Dnsmasq 在同一台电脑上。你还可以让这个过程再快一些，可以在 `/etc/hosts` 文件中只写主机名，然后用 Dnsmasq 来添加域名。`/etc/hosts` 看上去是这样的：

```
127.0.0.1 localhost
192.168.0.1 host2
192.168.0.2 host3
192.168.0.3 host4

```

然后把下面这几行写入 `dnsmasq.conf`（当然，要换成你自己的域名）：

```
expand-hosts
domain=mehxample.com

```

Dnsmasq 会自动把这些主机名扩展为完整的域名，比如 `host2` 会变为 `host2.mehxample.com`。

### DNS 泛域名

一般来说，使用 DNS 泛域名不是一个好习惯，因为它们太容易被误用了。但它们有时会很有用，比如在你的局域网的严密保护之下的时候。一个例子是使用 DNS 泛域名会让 Kubernetes 集群变得容易管理许多，除非你喜欢给你成百上千的应用写 DNS 记录。假设你的 Kubernetes 域名是 mehxample.com，那么下面这行配置可以让 Dnsmasq 解析所有对 mehxample.com 的请求：

```
address=/mehxample.com/192.168.0.5

```

这里使用的地址是你的集群的公网 IP 地址。这会响应对 mehxample.com 的所有主机名和子域名的请求，除非请求的目标地址已经在 DHCP 或者 `/etc/hosts` 中配置过。

下星期我们将探索更多的管理 DNS 和 DHCP 的细节，包括对不同的子网络使用不同的设置，以及提供权威域名服务器。

### 更多参考

* [使用 Dnsmasq 进行 DNS 伪装](https://www.linux.com/learn/intro-to-linux/2017/7/dns-spoofing-dnsmasq)
* [使用 Dnsmasq 配置简单的局域网域名服务](https://www.linux.com/learn/dnsmasq-easy-lan-name-services)
* [Dnsmasq](http://www.thekelleys.org.uk/dnsmasq/doc.html)

---

via: <https://www.linux.com/learn/intro-to-linux/2018/2/advanced-dnsmasq-tips-and-tricks>

作者：[CARLA SCHRODER](https://www.linux.com/users/cschroder) 译者：[yixunx](https://github.com/yixunx) 校对：[wxy](https://github.com/wxy)

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


Docker 容器中的老式 DOS BBS

# Docker 容器中的老式 DOS BBS

不久前，我写了一篇[我的 Debian Docker 基本映像](https://changelog.complete.org/archives/9794-fixing-the-problems-with-docker-images)。我决定进一步扩展这个概念：在 Docker 中运行 DOS 程序。

但首先，来看看题图。

<img src="content_image/album_201803_14_001826vyeufznu6mr0ovz2.png" alt="" title="">

事实证明这是可能的，但很难。我使用了所有三种主要的 DOS 模拟器（dosbox、qemu 和 dosemu）。我让它们都能在 Docker 容器中运行，但有很多有趣的问题需要解决。

都要做的事是在 DOS 环境下提供一个伪造的调制解调器。它需要作为 TCP 端口暴露在容器外部。有很多方法可以做到 —— 我使用的是 tcpser。dosbox 有一个 TCP 调制解调器接口，但事实证明，这样做太问题太多了。

挑战来自你希望能够一次接受多个传入 telnet（或 TCP）连接。DOS 不是一个多任务操作系统，所以当时有很多黑客式的方法。一种是有多台物理机，每个有一根传入电话线。或者它们可能会在 [DESQview](https://en.wikipedia.org/wiki/DESQview)、OS/2 甚至 Windows 3.1 等多任务层下运行多个伪 DOS 实例。

（注意：我刚刚了解到 [DESQview/X](http://toastytech.com/guis/dvx.html)，它将 DESQview 与 X11R5 集成在一起，并[取代了 Windows 3 驱动程序](http://toastytech.com/guis/dvx3.html)来把 Windows 作为 X 应用程序运行。）

出于各种原因，我不想尝试在 Docker 中运行其中任何一个系统。这让我模拟了原来的多物理节点设置。从理论上讲，非常简单 —— 运行一组 DOS 实例，每个实例最多使用 1MB 的模拟 RAM，这就行了。但是这里面临挑战。

在多物理节点设置中，你需要某种文件共享，因为你的节点需要访问共享的消息和文件存储。在老式的 DOS 时代，有很多笨重的方法可以做到这一点 —— [Netware](https://en.wikipedia.org/wiki/NetWare)、[LAN manager](https://en.wikipedia.org/wiki/LAN_Manager)，甚至一些 PC NFS 客户端。我没有访问 Netware。我尝试了 DOS 中的 Microsoft LM 客户端，与在 Docker 容器内运行的 Samba 服务器交互。这样可以使用，但 LM 客户端即使有各种高内存技巧还是占用了很多内存，BBS 软件也无法运行。我无法在多个 dosbox 实例中挂载底层文件系统，因为 dosbox 缓存不兼容。

这就是为什么我使用 dosemu 的原因。除了有比 dosbox 更完整的模拟器之外，它还有一种共享主机文件系统的方式。

所以，所有这一切都在此：[jgoerzen/docker-bbs-renegade](https://github.com/jgoerzen/docker-bbs-renegade)。

我还为其他想做类似事情的人准备了构建块：[docker-dos-bbs](https://github.com/jgoerzen/docker-dos-bbs) 和底层 [docker-dosemu](https://github.com/jgoerzen/docker-dosemu)。

意外的收获是，我也试图了在 Joyent 的 Triton（基于 Solaris 的 SmartOS）下运行它。让我感到高兴的印象是，几乎可以在这下面工作。是的，在 Solaris 机器上的一个基于 Linux 的 DOS 模拟器的容器中运行 Renegade DOS BBS。

---

via: <http://changelog.complete.org/archives/9836-an-old-dos-bbs-in-a-docker-container>

作者：[John Goerzen](http://changelog.complete.org/archives/author/jgoerzen) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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