在 RHEL/CentOS 7.0 中安装 LAMP

Summary: 跳过 LAMP 的介绍，因为我认为你们大多数已经知道了。这个教程会集中在如何在升级到 Apache 2.4 的 Red Hat Enterprise Linux 7.0 和 CentOS 7.0 中安装和配置 LAMP：Linux、Apache、 MariaDB、 PHP/PhpMyAdmin。  在 RHEL/CentOS 7.0 中安装 LAMP 前置要求 根据使用的发行版是 RHEL 还是 CentOS 7.0，按照下面的链接来进行最小化的系统安装，网络使用静态 IP。 对于 RHEL 7.0  RHEL 7.0 安装过程 在 RHEL 7.0 中注册和启用订阅仓库  对于 CentOS 7.0  CentOS 7.0 安装过程  第一步：使用基本配置安装apache 1、在完成最小化系统安装，并

原文是国外的，phpmyadmin的源电信网不可用，不知道国内其他人有测试过没

# 在 RHEL/CentOS 7.0 中安装 LAMP

跳过 LAMP 的介绍，因为我认为你们大多数已经知道了。这个教程会集中在如何在升级到 Apache 2.4 的 Red Hat Enterprise Linux 7.0 和 CentOS 7.0 中安装和配置 LAMP：Linux、Apache、 MariaDB、 PHP/PhpMyAdmin。

*在 RHEL/CentOS 7.0 中安装 LAMP*

#### 前置要求

根据使用的发行版是 RHEL 还是 CentOS 7.0，按照下面的链接来进行最小化的系统安装，网络使用静态 IP。

**对于 RHEL 7.0**

* [RHEL 7.0 安装过程](http://www.tecmint.com/redhat-enterprise-linux-7-installation/)
* [在 RHEL 7.0 中注册和启用订阅仓库](http://www.tecmint.com/enable-redhat-subscription-reposiories-and-updates-for-rhel-7/)

**对于 CentOS 7.0**

* [CentOS 7.0 安装过程](http://www.tecmint.com/centos-7-installation/)

### 第一步：使用基本配置安装apache

1、在完成最小化系统安装，并[在 RHEL/CentOS 7.0 上配置静态 IP](/article-3977-1.html) 后，就可以使用下面的命令从官方仓库安装最新的 Apache 2.4 httpd 服务了。

```
# yum install httpd

```

*安装 apache 服务*

2、安装完成后，使用下面的命令来管理apache守护进程，因为 RHEL 和 CentOS 7.0 都将 init 脚本从 SysV 升级到了systemd，所以同时你还可以使用 SysV 脚本和 Apache 脚本来管理服务。

```
# systemctl status|start|stop|restart|reload httpd
或者
# service httpd status|start|stop|restart|reload
或者
# apachectl configtest| graceful

```

*启动apache服务*

3、在使用 systemd 初始化脚本来启动 apache 服务后，要用 `firewall-cmd` 打开 RHEL/CentOS 7.0 防火墙规则， 这是通过 [firewalld](/article-4425-1.html) 守护进程管理 iptables 的默认命令。\*\*

```
# firewall-cmd --add-service=http

```

**注意**：上面的命令会在系统重启或者 firewalld 服务重启后失效，因为它是即时的规则，它不会永久生效。要使 iptables 规则在 fiewalld 中持久化，使用 `--permanent` 选项并重启 firewalld 服务来生效。（LCTT 译注：也可以不重启 firewalld 服务，而是再执行一遍不带 `--permanent` 选项的命令。）

```
# firewall-cmd --permanent --add-service=http
# systemctl restart firewalld

```

*在 CentOS 7 中启用防火墙*

下面是 firewalld 其他的重要选项：

```
# firewall-cmd --state
# firewall-cmd --list-all
# firewall-cmd --list-interfaces
# firewall-cmd --get-service
# firewall-cmd --query-service service_name
# firewall-cmd --add-port=8080/tcp

```

4、要验证 apache 的功能，打开一个远程浏览器并使用 http 协议访问你服务器的 IP 地址(http://server\_IP)， 应该会显示下图中的默认页面。

*Apache 默认页*

5、现在 apache 的根地址在 `/var/www/html`，该目录中没有提供任何索引文件。如果你想要看见根目录下的文件夹列表，打开 apache 欢迎配置文件并设置 `<LocationMach>` 下 `Indexes` 前的状态从`-`到`+`，下面的截图就是一个例子。

```
# nano /etc/httpd/conf.d/welcome.conf

```

*Apache 目录列出*

6、关闭文件，重启 apache 服务来使设置生效，重载页面来看最终效果。

```
# systemctl restart httpd

```

*Apache 索引文件*

### 第二步：为 Apache 安装 php5 支持

7、在为 apache 安装 php 支持之前，使用下面的命令的得到所有可用的php模块和扩展。

```
# yum search php

```

在 CentOS 7 上安装 PHP\*

8、根据你所要使用的应用类型，安装上述列表中所需的 PHP 模块。对于 PHP 中的基本的 MariaDB 支持和 PhpMyAdmin，你需要安装如下模块。

```
# yum install php php-mysql php-pdo php-gd php-mbstring

```

*安装 PHP 模块*

*安装 PHP mbstring 模块*

9、 要在你的浏览器上显示 PHP 的全部信息，用 root 账号执行如下命令在 Apache 的文档根目录下创建一个 `info.php` 文件，然后重启 httpd 服务，并在你的浏览器里面访问 http://server\_IP/info.php 。

```
# echo "<?php phpinfo(); ?>" > /var/www/html/info.php
# systemctl restart httpd

```

*查看 CentOS 7 上的 PHP 信息*

10、如果你得到一个 PHP 的日期和时区错误，打开配置文件 `php.ini`，取消 `date.timezone` 语句的注释，加上你的实际时区参数，然后重启 Apache 守护进程。

```
# nano /etc/php.ini

```

找到并如下修改`date.timezone`，参考 [PHP 支持的时区列表](http://php.net/manual/en/timezones.php)。（LCTT 译注：对于中国，可以使用 Asia/Shanghai、Asia/Chongqing 等，但是不建议使用向后兼容而保留的 PRC。）

```
date.timezone = Continent/City

```

*设置 PHP 的时区*

### 第三步：安装和配置 MariaDB 数据库

11、 Red Hat Enterprise Linux/CentOS 7.0 使用 MariaDB 替换 MySQL 为默认数据库管理系统。使用如下命令安装 MariaDB 数据库。

```
# yum install mariadb-server mariadb

```

*在 CentOS 7中安装 MariaDB*

12、安装 MariaDB 后，启动数据库守护进程并使用 mysql*secure*installation 脚本来保护数据库（设置数据库的 root 密码、禁止远程 root 登录、移除测试数据库、移除匿名用户等）。

```
# systemctl start mariadb
# mysql_secure_installation

```

*启动 MariaDB 数据库*

*MariaDB 安全设置*

13、要测试数据库功能，使用 root 账户登录 MariaDB 并用 quit 退出。

```
mysql -u root -p
MariaDB > SHOW VARIABLES;
MariaDB > quit

```

*连接 MariaDB 数据库*

### 第四步：安装 PhpMyAdmin

14、 RHEL 7.0 或者 CentOS 7.0 仓库默认没有提供 PhpMyAdmin 二进制安装包。如果你不适应使用 MySQL 命令行来管理你的数据库，你可以通过下面的命令启用 CentOS 7.0 rpmforge 仓库来安装 PhpMyAdmin。

```
# yum install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

```

启用 rpmforge 仓库后，下面安装 PhpMyAdmin。

```
# yum install phpmyadmin

```

*启用 RPMForge 仓库*

15、下面配置 PhpMyAdmin 的 `phpmyadmin.conf` 来允许远程连接，它位于 Apache 的 `conf.d` 目录下，并注释掉下面的行。

```
# nano /etc/httpd/conf.d/phpmyadmin.conf

```

使用#来注释掉下列行。

```
# Order Deny,Allow
# Deny from all
# Allow from 127.0.0.1

```

*允许远程 PhpMyAdmin 访问*

16、 要使用 cookie 验证来登录 PhpMyAdmin，像下面的截图那样使用[生成的秘密字符串](http://www.question-defense.com/tools/phpmyadmin-blowfish-secret-generator)来添加一个 blowfish 字符串到 `config.inc.php` 文件中，重启 apache 服务并打开 URL：http://server\_IP/phpmyadmin/。

```
# nano /etc/httpd/conf.d/phpmyadmin.conf
# systemctl restart httpd

```

*在 PhpMyAdmin 中添加 Blowfish*

*PhpMyAdmin 面板*

### 第五步：在系统范围内启用 LAMP

17、 如果你需要在重启后自动运行 MariaDB 和 Apache 服务，你需要在系统级地启用它们。

```
# systemctl enable mariadb
# systemctl enable httpd

```

*系统级启用服务*

这就是在 Red Hat Enterprise 7.0 或者 CentOS 7.0 中安装 LAMP 的过程。在 CentOS/RHEL 7.0 上关于 LAMP 的系列文章接下来将会讨论在 Apache 中创建虚拟主机，生成 SSL 证书、密钥和添加 SSL 事务支持。

---

via: <http://www.tecmint.com/install-lamp-in-centos-7/>

作者：[Matei Cezar](http://www.tecmint.com/author/cezarmatei/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


Linus Torvalds说那些对人工智能奇点深信不疑的人显然磕了药

Summary: 像往常一样, 他的评论不能只看字面意思  人工智能是一个非常热门的话题，许多高端人士，包括特斯拉的CEO埃隆马斯克就曾表示有情感的人工智能技术即将到来，同时这一技术将发展到危险的门槛上。不过Linus Torvalds显然不这么认为，他认为那只是差劲的科幻小说。 人工智能激发了人们的创造力已经不是什么新鲜的想法了，不过近段时间关于所谓的人工智能奇点的讨论，引起了诸如埃隆马斯克和斯蒂芬霍金表示关心，认为可能会创造出一个怪兽。不只是他们，论坛和评论部分充斥着杞人忧天者，他们不知道该相信谁，或是哪个提出建议的人更聪明。 事

Linus Torvalds表示：我搞了那么久都没把人工智能弄出来，你们瞎BB什么呢！

我也不相信人工智能。人类到现在对思维可以说是一无所知，也就能算算数学题，思维是上帝创造的。

创造一个自己的都搞不清怎么运转的东西=_= |||

除非哪个程序员一不小心给代码注入了灵魂

有道理

灵魂那么高尚的东西，不会是bug吧。。。

# Linus Torvalds说那些对人工智能奇点深信不疑的人显然磕了药

*像往常一样, 他的评论不能只看字面意思*

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

**人工智能是一个非常热门的话题，许多高端人士，包括特斯拉的CEO埃隆·马斯克就曾表示有情感的人工智能技术即将到来，同时这一技术将发展到危险的门槛上。不过Linus Torvalds显然不这么认为，他认为那只是差劲的科幻小说。**

人工智能激发了人们的创造力已经不是什么新鲜的想法了，不过近段时间关于所谓的人工智能奇点的讨论，引起了诸如埃隆·马斯克和斯蒂芬·霍金表示关心，认为可能会创造出一个怪兽。不只是他们，论坛和评论部分充斥着杞人忧天者，他们不知道该相信谁，或是哪个提出建议的人更聪明。

事实证明Linux项目创始人Linus Torvalds在这件事上显然有完全不同的观点。他说事实上什么都不会发生，我们也更有理由相信他。人工智能意需要有人编写它的代码，Linus知道编写人工智能代码会遇到的阻力和障碍。他很有可能已经猜到了什么会被涉及到，并且明白为什么人工智能不会成为威胁。

### Linus Torvalds与人工智能

Linus Torvalds在[slashdot.org](http://classic.slashdot.org/story/15/06/30/0058243)上回答了一些社区中的问题，他的所有观点都十分有趣。他曾对[游戏的未来和Valve](http://news.softpedia.com/news/linus-torvalds-said-valve-is-exploring-a-second-source-against-microsoft-486266.shtml)发表看法，就像这次关于人工智能一样。虽然他经常是关注一些关于内核和开源的问题，但是他在其他部分也有自己的见解。事实是作为一个问题，人工智能工程是一个他可以从程序员的角度讨论的问题。

“所以我期待更多有针对性的（和相当棒的）AI，而不是它有多像人。像语言识别、模式识别，这样的东西。我根本找不出在你洗碗的时候，洗碗机和你讨论Sartre（萨特，法国哲学家、小说家、剧作家）有什么危害。真的有‘奇点’这种事吗？是的，我认为那只是科幻小说，还不是好的那种。无休止的指数增长？我说，真的！这些人嗑了什么药了吧？” Linus在Slashdot写道。

选择相信埃隆·马斯克还是Linus是你的决定，但如果我卷入了这场赌局，我会把钱投给Linus。

---

via: <http://news.softpedia.com/news/linus-torvalds-says-people-who-believe-in-an-ai-singularity-are-on-drugs-486373.shtml>

作者：[Silviu Stahie](http://news.softpedia.com/editors/browse/silviu-stahie) 译者：[martin2011qi](https://github.com/martin2011qi) 校对：[wxy](https://github.com/wxy)

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


时隔两年，Oracle VirtualBox 5.0 正式版发布

Summary: 我们很高兴的宣布，Oracle VMVirtualBox 5.0 发布了！  此版本包含了重大改进和大量的增强及错误修复，具体可详见官方的发布公告。Oracle VM VirtualBox 5.0 中的全部功能的说明请参见这里。 这里只强调一些新的功能 对新版本的 Windows 和 Linux 客户机的半虚拟化支持 Oracle VM VirtualBox 能够为软件的有效执行而提供半虚拟化接口。当设置一个虚拟机平台时，Oracle VM VirtualBox 可通过内置的虚拟化支持（Linux 客户机上的 KVM，Windows 客户机的 Hyper-V）提升客户机性能。 支持 USB 3.0 设备的 xHCI 控制器 客户机操作系统现在可以

为什么我今天安装的没有Start的三个选项？我是xubuntu14.04直接下的64位DEB包。虚拟机中安装的Debian8.10。<br />
原来是安装的时候没有，安装完成以后，还是有这三个选项的。心急吃不了热豆腐呀～

图标变丑了 =_= |||

我也从Ubuntu转到Xubuntu 14.04.2 LTS下了<br />
我觉得LXC / Docker更好玩，玩Linux肯定没问题吧？

唉

不管LINUX是内核也好，框架也好。。。。。。反正我就是当是个平台，能完成我所做的事情就好了。GNOME和KDE都感觉太。。。。。。还是简单点好～不折腾

# 时隔两年，Oracle VirtualBox 5.0 正式版发布

我们很高兴的宣布，Oracle VM VirtualBox 5.0 发布了！

此版本包含了重大改进和大量的增强及错误修复，具体可详见官方的[发布公告](https://www.oracle.com/corporate/pressrelease/oracle-vm-virtualbox-5-070915.html)。Oracle VM VirtualBox 5.0 中的全部功能的说明请参见[这里[PDF]](http://www.oracle.com/us/technologies/virtualization/oraclevm/oracle-vm-virtualbox-ds-1655169.pdf)。

### 这里只强调一些新的功能

#### 对新版本的 Windows 和 Linux 客户机的半虚拟化支持

Oracle VM VirtualBox 能够为软件的有效执行而提供半虚拟化接口。当设置一个虚拟机平台时，Oracle VM VirtualBox 可通过内置的虚拟化支持（Linux 客户机上的 KVM，Windows 客户机的 Hyper-V）提升客户机性能。

#### 支持 USB 3.0 设备的 xHCI 控制器

客户机操作系统现在可以直接识别 USB 3.0 设备，并支持 3.0 设备的全速操作。客户机可以配置使用 USB 1.1、2.0 和 3.0 设备。

#### 改进的拖放支持

从 Oracle VM VirtualBox 5.0 开始，我们改进了客户机和宿主操作系统之间的双向拖放支持；可以安装最新的客户机附件来支持拖放功能。

#### 磁盘镜像加密

Oracle VM VirtualBox 5.0 可以在 XTS 模式（128 位或 256 位）下使用 AES 算法来加密虚拟磁盘镜像；因为 DEK 存储在虚拟机配置文件中，所以加密功能的引入带来了在启动虚拟机之前输入密码的安全功能。

#### 无界面启动和可分离启动选项

Oracle VM VirtualBox 现在支持在后台启动虚拟机，分离的前端进程可以关闭，而虚拟机会继续运行。

更多的 GUI 改进：

* 客户机内容（guest-content）缩放支持（包括3D 加速）
* 新的用户界面设置包括定制状态条、菜单栏和客户机内容缩放
* 新的加密设置页可定制磁盘镜像的加密选项
* HiDPI 支持，包括在 Mac OS X 上的应用图标和可选的非缩放 HiDPI 输出（包括3D 加速）
* 对 SATA 磁盘的热插拔支持
* 改进的 Mac 和 Windows 宿主机上的 HID LED 同步
* 在账户的预览窗口中以同等尺寸比例显示客户机屏幕
* 在虚拟机选择器里可以直接访问存储介质

如希望了解更多细节，请参考官方的 Oracle VM VirtualBox 5.0 [资料表](http://www.oracle.com/us/technologies/virtualization/oraclevm/oracle-vm-virtualbox-ds-1655169.pdf)， [用户手册](http://download.virtualbox.org/virtualbox/5.0.0/UserManual.pdf) 和 [virtualbox.org](https://www.virtualbox.org/) 网站。

### 下载

[](https://www.virtualbox.org/wiki/Downloads)

* **VirtualBox 软件包。**这些二进制的发布许可协议是 GPL v2
	+ **VirtualBox 5.0 for Windows hosts**  [x86/amd64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-Win.exe)
	+ **VirtualBox 5.0 for OS X hosts**  [x86/amd64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-OSX.dmg)
	+ **[VirtualBox 5.0 for Linux hosts](https://www.virtualbox.org/wiki/Linux_Downloads)**
		- Ubuntu 14.04 ("Trusty") / 14.10 ("Utopic") / 15.04 ("Vivid")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Ubuntu~trusty_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Ubuntu~trusty_amd64.deb)
		- Ubuntu 12.04 LTS ("Precise Pangolin")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Ubuntu~precise_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Ubuntu~precise_amd64.deb)
		- Debian 8 ("Jessie")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~jessie_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~jessie_amd64.deb)
		- Debian 7 ("Wheezy")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~wheezy_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~wheezy_amd64.deb)
		- Debian 6 ("Squeeze")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~squeeze_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~squeeze_amd64.deb)
		- openSUSE 13.2  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE132-1.i586.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE132-1.x86_64.rpm)
		- openSUSE 13.1  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE131-1.i586.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE131-1.x86_64.rpm)
		- openSUSE 12.3  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE123-1.i586.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE123-1.x86_64.rpm)
		- SUSE Linux Enterprise Server 11 (SLES11)  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_sles11.0-1.i586.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_sles11.0-1.x86_64.rpm)
		- Fedora 22  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_fedora22-1.i686.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_fedora22-1.x86_64.rpm)
		- Fedora 18 ("Spherical Cow") / 19 ("Schrödingers Cat") / 20 ("Heisenbug") / 21  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_fedora18-1.i686.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_fedora18-1.x86_64.rpm)
		- Oracle Linux 7 ("OL7") / Red Hat Enterprise Linux 7 ("RHEL7") / CentOS 7  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el7-1.x86_64.rpm)
		- Oracle Linux 6 ("OL6") / Red Hat Enterprise Linux 6 ("RHEL6") / CentOS 6  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el6-1.i686.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el6-1.x86_64.rpm)
		- Oracle Linux 5 ("OL5") / Red Hat Enterprise Linux 5 ("RHEL5") / CentOS 5  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el5-1.i386.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el5-1.x86_64.rpm)
		- All distributions  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-Linux_x86.run) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-Linux_amd64.run)
	+ **VirtualBox 5.0 for Solaris hosts**  [amd64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-SunOS.tar.gz)

* **VirtualBox 5.0 Oracle VM VirtualBox Extension Pack**  [All supported platforms](http://download.virtualbox.org/virtualbox/5.0.0/Oracle_VM_VirtualBox_Extension_Pack-5.0.0-101573.vbox-extpack)


LFS 中文版手册发布：如何打造自己的 Linux 发行版

Summary: 您是否想过打造您自己的 Linux 发行版？每个 Linux 用户在他们使用 Linux 的过程中都想过做一个他们自己的发行版，至少一次。我也不例外，作为一个 Linux 菜鸟，我也考虑过开发一个自己的 Linux 发行版。从头开发一个 Linux 发行版这件事情被称作 Linux From Scratch （LFS）。  在开始之前，我总结了一些有关 LFS 的内容，如下： 1. 那些想要打造他们自己的 Linux 发行版的人应该了解打造一个 Linux 发行版（打造意味着从头开始）与配置一个已有的 Linux 发行版的不同 如果您只是想调整下启动屏幕、定制登录页面以及拥有更好的外观和使用

这个必须好顶赞

有没有下载翻译版的地址？

翻译团队辛苦啦，32个赞！！

制作上传中——目前 PDF 版本遇到问题了。

这个必须来32个赞~

大赞！

必须大赞，期待可下载版，话说FHS也翻译下吧！！！！

已经有了下载的 PDF 和 CHM 啦，去看看吧。。。FHS 。。。这个。。

刚刚放上了。敬请下载。

谢谢

缅怀一下逝去的linuxsir...

awsome

非常感谢翻译了最新的LFS 7.7，希望可以继续翻译BLFS 7.7。毕竟LFS只是用来构建一个基础系统，有BLFS会完善很多。

压力好大——希望更多的人来参与。

有翻译版本了 找了好久终于找到了 谢谢

LCTT辛苦了！

很感谢这些翻译工作人员，谢谢你们的辛苦劳动~！

我在编译Kmod时出错了

gcc: error: /usr/lib/liblzma.so: No such file or directory

ldd /usr/lib/liblzma.so

显示ldd: /usr/lib/liblzma.so: No such file or directory

要怎么解决呢

liblzma.so是在编译xz软件时生成的，make install后，会有如下动作：

============================

mv -v /usr/lib/liblzma.so.* /lib

ln -svf ../../lib/$(readlink /usr/lib/liblzma.so) /usr/lib/liblzma.so

=============================

第二句的链接要注意不要含有中文字符，我当时也是有这个问题，后来从英文LFS拷贝这两行后再运行就OK了！

成功后可以查看下链接是否正常：

=============================

root:/src/kmod-19# ls -l /usr/lib | grep liblzma

-rw-r--r-- 1 root root  1407116 Oct  9 07:12 liblzma.a

-rwxr-xr-x

来自陕西西安的 Microsoft Edge 12.10240|Windows 10 用户

=============================

root:/src/kmod-19# ls -l /usr/lib | grep liblzma

-rw-r--r-- 1 root root  1407116 Oct  9 07:12 liblzma.a

-rwxr-xr-x 1 root root      919 Oct  9 07:12 liblzma.la

lrwxrwxrwx 1 root root       26 Oct  9 08:09 liblzma.so -> ../../lib/liblzma.so.5.2.0

root:/src/kmod-19#

=============================

另外，别忘了重新configure再make，然后就OK了。

这是那一节的内容？请告诉我，或者到 github 上提交 PR 补丁吧：https://github.com/LCTT/LFS-BOOK-7.7-systemd 谢谢！

谢谢，找到了，xz 一节有错误的中文括号，已经修正 github 版本库了。

太感谢了，话不多说，辛苦了！

谢谢！

正在翻译7.8，欢迎愿意参与翻译的，对 LFS 和 Linux 有了解的同学加入。

有非systemd版本的中文手册吗？

没有翻译

已经按照书本在做编译了，总是出错，已经接近崩溃了！！！！

# LFS 中文版手册发布：如何打造自己的 Linux 发行版

您是否想过打造您自己的 Linux 发行版？每个 Linux 用户在他们使用 Linux 的过程中都想过做一个他们自己的发行版，至少一次。我也不例外，作为一个 Linux 菜鸟，我也考虑过开发一个自己的 Linux 发行版。从头开发一个 Linux 发行版这件事情被称作 Linux From Scratch （LFS）。

在开始之前，我总结了一些有关 LFS 的内容，如下：

**1. 那些想要打造他们自己的 Linux 发行版的人应该了解打造一个 Linux 发行版（打造意味着从头开始）与配置一个已有的 Linux 发行版的不同**

如果您只是想调整下启动屏幕、定制登录页面以及拥有更好的外观和使用体验。您可以选择任何一个 Linux 发行版并且按照您的喜好进行个性化配置。此外，有许多配置工具可以帮助您。

如果您想打包所有必须的文件、引导加载器和内核，并选择什么该被包括进来，然后依靠自己编译这一切东西。那么您需要的就是 Linux From Scratch （LFS）。

**注意**：如果您只想要定制 Linux 系统的外表和体验，这个指南并不适合您。但如果您真的想打造一个 Linux 发行版，并且向了解怎么开始以及一些其他的信息，那么这个指南正是为您而写。

**2. 打造一个 Linux 发行版（LFS）的好处**

* 您将了解 Linux 系统的内部工作机制
* 您将开发一个灵活的适应您需求的系统
* 您开发的系统（LFS）将会非常紧凑，因为您对该包含/不该包含什么拥有绝对的掌控
* 您开发的系统（LFS）在安全性上会更好

**3. 打造一个Linux发行版（LFS）的坏处**

打造一个 Linux 系统意味着将所有需要的东西放在一起并且编译之。这需要许多查阅、耐心和时间。而且您需要一个可用的 Linux 系统和足够的磁盘空间来打造 LFS。

**4. 有趣的是，Gentoo/GNU Linux 在某种意义上最接近于 LFS。Gentoo 和 LFS 都是完全从源码编译的定制的 Linux 系统**

**5. 您应该是一个有经验的Linux用户，对编译包、解决依赖有相当的了解，并且是个 shell 脚本的专家。**

了解一门编程语言（最好是 C 语言）将会使事情变得容易些。但哪怕您是一个新手，只要您是一个优秀的学习者，可以很快的掌握知识，您也可以开始。最重要的是不要在 LFS 过程中丢失您的热情。

如果您不够坚定，恐怕会在 LFS 进行到一半时放弃。

\*\*6. 现在您需要一步一步的指导来打造一个 Linux 。LFS 手册是打造 LFS 的官方指南。我们的合作站点 tradepub 也为我们的读者制作了 LFS 的指南，这同样是免费的。 ###

您可以从下面的链接下载 Linux From Scratch 的电子书：

[](http://tecmint.tradepub.com/free/w_linu01/prgm.cgi)

下载: [Linux From Scratch](http://tecmint.tradepub.com/free/w_linu01/prgm.cgi)

**7. 当前 LFS 的版本是 7.7，分为 systemd 版本和非 systemd 版本。**

LFS 的官方网站是： <http://www.linuxfromscratch.org/>

您可以在官网在线浏览 LFS 以及类似 BLFS 这样的相关项目的手册，也可以下载不同格式的版本。

* LFS （非 systemd 版本）：
	+ PDF 版本： <http://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-7.7.pdf>
	+ 单一 HTML 版本： <http://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-7.7-NOCHUNKS.html>
	+ 打包的多页 HTML 版本： <http://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-7.7.tar.bz2>
* LFS （systemd 版本）：
	+ PDF 版本： <http://www.linuxfromscratch.org/lfs/downloads/7.7-systemd/LFS-BOOK-7.7-systemd.pdf>
	+ 单一 HTML 版本： <http://www.linuxfromscratch.org/lfs/downloads/7.7-systemd/LFS-BOOK-7.7-systemd-NOCHUNKS.html>
	+ 打包的多页 HTML 版本： <http://www.linuxfromscratch.org/lfs/downloads/7.7-systemd/LFS-BOOK-7.7-systemd.tar.bz2>

**8. Linux 中国/LCTT 翻译了一份 LFS 手册（7.7，systemd 版本）**

经过 LCTT 成员的努力，我们终于完成了对 LFS 7.7 systemd 版本手册的翻译。

手册在线访问地址：<https://linux.cn/lfs/LFS-BOOK-7.7-systemd/index.html> 。

CHM 版本： <https://img.linux.net.cn/lfs/LFS-BOOK-7.7-systemd.chm>

PDF 版本： <https://img.linux.net.cn/lfs/LFS-BOOK-7.7-systemd.pdf>

其它格式的版本稍后推出。

感谢参与翻译的成员： wxy, ictlyh, dongfengweixiao, zpl1025, H-mudcup, Yuking-net, kevinSJ 。

### 关于：Linux From Scratch

这本手册是由 LFS 的项目领头人 Gerard Beekmans 创作的， Matthew Burgess 和 Bruse Dubbs 参与编辑，两人都是LFS 项目的联合领导人。这本书内容很广泛，有 338 页之多。

手册中内容包括：介绍 LFS、准备构建、构建 LFS、建立启动脚本、使 LFS 可以引导，以及附录。其中涵盖了您想知道的 LFS 项目中的所有东西。

这本手册还给出了编译一个包的预估时间。预估的时间以编译第一个包的时间作为参考。所有的东西都以易于理解的方式呈现，甚至对于新手来说也是这样。

如果您有充裕的时间并且真正对构建自己的 Linux 发行版感兴趣，那么您绝对不会错过下载这个电子书（免费下载）的机会。您需要做的，便是照着这本手册在一个工作的 Linux 系统（任何 Linux 发行版，足够的磁盘空间即可）中开始构建您自己的 Linux 系统，付出时间和热情。

如果 Linux 使您着迷，如果您想自己动手构建一个自己的 Linux 发行版，这便是现阶段您应该知道的全部了，其他的信息您可以参考上面链接的手册中的内容。

请让我了解您阅读/使用这本手册的经历，这本详尽的 LFS 指南的使用是否足够简单？如果您已经构建了一个 LFS 并且想给我们的读者一些建议，欢迎留言和反馈。

---

via: <http://www.tecmint.com/create-custom-linux-distribution-from-scratch/>

作者：[Avishek Kumar](http://www.tecmint.com/author/avishek/) 译者：[wwy-hust](https://github.com/wwy-hust) 校对：[wxy](https://github.com/wxy)

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


lolcat ：一个在 Linux 终端中输出彩虹特效的命令行工具

Summary: 那些相信 Linux 命令行是单调无聊且没有任何乐趣的人们，你们错了，这里有一些有关 Linux 的文章，它们展示着 Linux 是如何的有趣和淘气 。  Linux命令及Linux终端的20个趣事 终端中的乐趣：6个有趣的Linux命令行工具 Linux终端的乐趣之把玩字词计数  在本文中，我将讨论一个名为lolcat的小工具  它可以在终端中生成彩虹般的颜色。  为终端生成彩虹般颜色的输出的 Lolcat 命令 何为 lolcat ? Lolcat 是一个针对 Linux，BSD 和 OSX 平台的工具，它类似于 cat 命令，并为 cat 的输出添加彩虹般的色彩。 Lolcat 主要用于在 Linux 终端中为文

感觉在linux.cn上这个东西已经看见过不下五次了。。。。

我敢打赌，顶多三次——因为我只记得两次。。汗

请问下楼主，我看到你用的终端颜色配置，其中，命令行本身，如 apt-get、yum、alias等都有颜色，请问下要怎么配置呢！！！

越多越好，喜欢喜欢，这是Linux新手的动力啊。O(∩_∩)O

按照文章的方法去安装，是不行的？？？？<br />
谁知道怎么用yum安装

楼主是不会告诉你这些高端操作的

# lolcat ：一个在 Linux 终端中输出彩虹特效的命令行工具

那些相信 Linux 命令行是单调无聊且没有任何乐趣的人们，你们错了，这里有一些有关 Linux 的文章，它们展示着 Linux 是如何的有趣和“淘气” 。

* [Linux命令及Linux终端的20个趣事](/article-2831-1.html)
* [终端中的乐趣：6个有趣的Linux命令行工具](/article-4128-1.html)
* [Linux终端的乐趣之把玩字词计数](/article-4088-1.html)

在本文中，我将讨论一个名为“lolcat”的小工具 – 它可以在终端中生成彩虹般的颜色。

*为终端生成彩虹般颜色的输出的 Lolcat 命令*

#### 何为 lolcat ?

Lolcat 是一个针对 Linux，BSD 和 OSX 平台的工具，它类似于 [cat 命令](http://www.tecmint.com/13-basic-cat-command-examples-in-linux/)，并为 `cat` 的输出添加彩虹般的色彩。 Lolcat 主要用于在 Linux 终端中为文本添加彩虹般的色彩。

### 在 Linux 中安装 Lolcat

**1. Lolcat 工具在许多 Linux 发行版的软件仓库中都可获取到，但可获得的版本都有些陈旧，而你可以通过 git 仓库下载和安装最新版本的 lolcat。**

由于 Lolcat 是一个 ruby gem 程序，所以在你的系统中必须安装有最新版本的 RUBY。

```
# apt-get install ruby      [在基于 APT 的系统中]
# yum install ruby          [在基于 Yum 的系统中]
# dnf install ruby          [在基于 DNF 的系统中]

```

一旦 ruby 软件包安装成功，请确保验证安装的 ruby 的版本。

```
# ruby --version

ruby 2.1.5p273 (2014-11-13) [x86_64-linux-gnu]

```

**2. 接着使用下面的命令来从 lolcat 的 git 仓库中下载和安装最新版本的 lolcat。**

```
# wget https://github.com/busyloop/lolcat/archive/master.zip
# unzip master.zip
# cd lolcat-master/bin
# gem install lolcat

```

一旦 lolcat 安装后，你可以检查它的版本号。

```
# lolcat --version

lolcat 42.0.99 (c)2011 moe@busyloop.net

```

### Lolcat 的用法

**3. 在开始使用 lolcat 之前，使用下面的命令来了解它可用的选项和其帮助文档。**

```
# lolcat -h

```

*Lolcat 的帮助文档*

**4. 接着, 通过管道连接 lolcat 和其他命令，例如 ps, date 和 cal:**

```
# ps | lolcat
# date | lolcat
# cal | lolcat

```

*ps 命令的输出*

*Date 的输出*

*Calendar 的输出*

**5. 使用 lolcat 来展示一个脚本文件的代码:**

```
# lolcat test.sh

```

*用 lolcat 来展示代码*

**6. 通过管道连接 lolcat 和 figlet 命令。Figlet 是一个展示由常规的屏幕字符组成的巨大字符串的应用。我们可以通过管道将 figlet 的输出连接到 lolcat 中来展示出如下的多彩输出:**

```
# echo I ❤ Tecmint | lolcat
# figlet I Love Tecmint | lolcat

```

*多彩的文字*

**注**: 注意， ❤ 是一个 unicode 字符。要安装 figlet，你需要像下面那样使用 yum 和 apt 来得到这个软件包:

```
# apt-get figlet
# yum install figlet
# dnf install figlet

```

**7. 给文本赋予彩虹颜色的动画:**

```
$ echo I ❤ Tecmit | lolcat -a -d 500

```

*动的文本*

这里选项 `-a` 指的是 Animation(动画)， `-d` 指的是 duration(持续时间)。在上面的例子中，持续 500 次动画。

**8. 在彩虹般的颜色下阅读 man 页(例如 `man ls`):**

```
# man ls | lolcat

```

*多彩地显示文件*

**9. 通过管道连接 lolcat 和 cowsay。cowsay 是一个可配置的正在思考或说话的奶牛，这个程序也支持其他的动物。**

使用下面的命令来安装 cowsay :

```
# apt-get cowsay
# yum install cowsay
# dnf install cowsay

```

安装后，使用下面的命令来显示在 cowsay 中的所有动物：

```
# cowsay -l

```

**样例输出**

```
Cow files in /usr/share/cowsay/cows:
apt beavis.zen bong bud-frogs bunny calvin cheese cock cower daemon default
dragon dragon-and-cow duck elephant elephant-in-snake eyes flaming-sheep
ghostbusters gnu head-in hellokitty kiss kitty koala kosh luke-koala
mech-and-cow meow milk moofasa moose mutilated pony pony-smaller ren sheep
skeleton snowman sodomized-sheep stegosaurus stimpy suse three-eyes turkey
turtle tux unipony unipony-smaller vader vader-koala www

```

通过管道连接 lolcat 和 cowsay 后的输出，并且使用了‘gnu’形象的 cowfile。

```
# cowsay -f gnu ☛ Tecmint ☚ is the best Linux Resource Available online | lolcat

```

*使用 Lolcat 的 Cowsay*

**注**: 你可以在将 lolcat 和其他任何命令用管道连接起来在终端中得到彩色的输出。

**10. 你可以为最常用的命令创建别名来使得命令的输出呈现出彩虹般的色彩。你可以像下面那样为 ‘ls -l‘ 命令创建别名，这个命令输出一个目录中包含内容的列表。**

```
# alias lolls="ls -l | lolcat"
# lolls

```

*多彩的 Alias 命令*

你可以像上面建议的那样，为任何命令创建别名。为了使得别名永久生效，你需要添加相关的代码(上面的代码是 ls -l 的别名) 到 ~/.bashrc 文件中，并登出后再重新登录来使得更改生效。

现在就是这些了。我想知道你是否曾经注意过 lolcat 这个工具？你是否喜欢这篇文章？欢迎在下面的评论环节中给出你的建议和反馈。喜欢并分享我们，帮助我们传播。

---

via: <http://www.tecmint.com/lolcat-command-to-output-rainbow-of-colors-in-linux-terminal/>

作者：[Avishek Kumar](http://www.tecmint.com/author/avishek/) 译者：[FSSlc](https://github.com/FSSlc) 校对：[wxy](https://github.com/wxy)

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


动态壁纸给linux发行版添加活力背景

Summary: 我们知道你想拥有一个有格调的ubuntu桌面来炫耀一下 ：）  Live Wallpaper 在linxu上费一点点劲搭建一个出色的工作环境是很简单的。今天，我们（重新）着重来探讨长驻你脑海中那些东西 ：一款自由，开源，能够给你的截图增添光彩的工具。 它叫 Live Wallpaper (正如你猜的那样) ，它用由OpenGL驱动的一款动态桌面背景来代替标准的静态桌面背景。 最好的一点是：在ubuntu上安装它很容易。 动态壁纸主题  Live Wallpaper 不是此类软件唯一的一款，但它是最好的一款之一。 它附带很多不同的开箱即用的主题。 从精细的(noise)到狂热的 (nexus)

能不能让视频作为桌面背景呢

# 动态壁纸给linux发行版添加活力背景

**我们知道你想拥有一个有格调的ubuntu桌面来炫耀一下 ：）**

在linxu上费一点点劲搭建一个出色的工作环境是很简单的。今天，我们（[重新](http://www.omgubuntu.co.uk/2011/11/5-system-monitoring-tools-for-ubuntu)）着重来探讨长驻你脑海中那些东西 ：一款自由，开源，能够给你的截图增添光彩的工具。

它叫 **Live Wallpaper** (正如你猜的那样) ，它用由OpenGL驱动的一款动态桌面背景来代替标准的静态桌面背景。

最好的一点是：在ubuntu上安装它很容易。

### 动态壁纸主题

Live Wallpaper 不是此类软件唯一的一款，但它是最好的一款之一。

它附带很多不同的开箱即用的主题。

*Live Wallpaper*

从精细的(‘noise’)到狂热的 (‘nexus’)，包罗万象，甚至有受到Ubuntu Phone欢迎屏幕启发的obligatory锁屏壁纸。

* Circles — 带着‘evolving circle’风格的时钟，灵感来自于Ubuntu Phone
* Galaxy — 支持自定义大小，位置的旋转星系
* Gradient Clock — 放在倾斜面上的polar时钟
* Nexus — 亮色粒子火花穿越屏幕
* Noise — 类似于iOS动态壁纸的Bokeh设计
* Photoslide — 由文件夹（默认为 ~/Photos）内照片构成的动态网格相册

Live Wallpaper **完全开源**，所以没有什么能够阻挡天马行空的艺术家们用诀窍（当然还有耐心）来创造他们自己的精美主题。

### 设置 & 特点

虽然某些主题与其它主题相比有更多的选项，但每款主题都可以通过某些方式来配置或者定制。

例如，Nexus主题中 (上图所示) 你可以更改脉冲粒子的数量，颜色，大小和出现频率。

首选项提供了 **通用选项** 适用于所有主题，包括:

* 设置登录界面的动态壁纸
* 自定义动画背景
* 调节 FPS (包括在屏幕上显示FPS)
* 指定多显示器的行为

有如此多的选项，diy适用于你自己的桌面背景是很容易的。

### 缺陷

#### 没有桌面图标

Live Wallpaper在运行时，你无法在桌面添加，打开或者是编辑文件和文件夹。

首选项程序提供了一个选项来让你这样做（只是猜测）。也许是它只能在老版本中使用，在我们的测试中－测试环境为Ununtu 14.10，它不工作。但在测试中发现当把桌面壁纸设置成格式为png的图片文件时，这个选项有用，不需要是透明的png图片文件，只要是png图片文件就行了。

#### 资源占用

动态壁纸与标准的壁纸相比要消耗更多的系统资源。

我们并不是说任何时候都会消耗大量资源，但至少在我们的测试中是这样，所以低配置机器和笔记本用户要谨慎使用这款软件。可以使用 [系统监视器](http://www.omgubuntu.co.uk/2011/11/5-system-monitoring-tools-for-ubuntu) 来追踪CPU 和GPU的负载。

#### 退出程序

对我来说最大的“bug”绝对是没有“退出”选项。

当然，动态壁纸可以通过托盘图标和首选项完全退出，那退出托盘图标呢？没办法。只能在终端执行命令‘pkill livewallpaper’。

### 怎么在 Ubuntu 14.04 LTS+ 上安装 Live Wallpaper

要想在Ubuntu 14.04 LTS 和更高版本中安装 Live Wallpaper，你首先需要把官方PPA添加进你的软件源。 最快的方法是在终端中执行下列命令:

```
sudo add-apt-repository ppa:fyrmir/livewallpaper-daily

sudo apt-get update && sudo apt-get install livewallpaper

```

你还需要安装 indicator applet，这样可以方便快速的打开或是关闭动态壁纸，从菜单选择主题，另外图形配置工具可以让你基于你自己的口味来配置每款主题。

```
sudo apt-get install livewallpaper-config livewallpaper-indicator

```

所有都安装好之后你就可以通过Unity Dash来启动它和它的首选项工具了。

让人不爽的是，安装完成后，程序不会自动打开托盘图标，而仅仅将它自己加入自动启动项，所以，快速来个注销 -> 登陆它就会出现啦。

### 总结

如果你正处在无聊呆板的桌面中，幻想有一个更有活力的生活，不妨试试。另外，告诉我们你想看到什么样的动态壁纸！

---

via: <http://www.omgubuntu.co.uk/2015/05/animated-wallpaper-adds-live-backgrounds-to-linux-distros>

作者：[Joey-Elijah Sneddon](https://plus.google.com/117485690627814051450/?rel=author) 译者：[Love-xuan](https://github.com/Love-xuan) 校对：[wxy](https://github.com/wxy)

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


在Ubuntu 15.04中安装Ruby on Rails

Summary: 本篇我们会学习如何用rbenv在Ubuntu 15.04中安装Ruby on Rails。我们选择Ubuntu作为操作系统是因为Ubuntu是Linux发行版中自带很多包和完整文档的操作系统，因此我认为这是正确的选择。如果你还没有安装最新的Ubuntu，你可以从下载iso文件开始。 安装 Ruby 我们要做的第一件事是更新Ubuntu包并且为Ruby安装一些依赖。 sudo apt-get update sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-

# 在Ubuntu 15.04中安装Ruby on Rails

本篇我们会学习如何用rbenv在Ubuntu 15.04中安装Ruby on Rails。我们选择Ubuntu作为操作系统是因为Ubuntu是Linux发行版中自带很多包和完整文档的操作系统，因此我认为这是正确的选择。如果你还没有安装最新的Ubuntu，你可以从[下载iso文件](http://release.ubuntu.com/15.04)开始。

### 安装 Ruby

我们要做的第一件事是更新Ubuntu包并且为Ruby安装一些依赖。

```
sudo apt-get update
sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev

```

有三种方法来安装Ruby：rbenv、rvm和从源码安装。每种都有各自的好处，但是近来开发者们更倾向使用rbenv而不是rvm和源码来安装。我们将安装最新的Ruby版本，2.2.2。

用rbenv来安装只有简单的两步。第一步安装rbenv，接着是ruby-build：

```
cd
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL

git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL

git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash

rbenv install 2.2.2
rbenv global 2.2.2
ruby -v

```

我们需要安装Bundler，但是我们要在安装之前告诉rubygems不要为每个包安装本地文档。

```
echo "gem: --no-ri --no-rdoc" > ~/.gemrc
gem install bundler

```

### 配置 GIT

配置git之前，你要创建一个github账号，你可以注册一个[github 账号](http://github.com)。我们需要git作为版本控制系统，因此我们要设置它来匹配github账号。

用户的github账号来替换下面的**Name** 和 **Email address** 。

```
git config --global color.ui true
git config --global user.name "YOUR NAME"
git config --global user.email "YOUR@EMAIL.com"
ssh-keygen -t rsa -C "YOUR@EMAIL.com"

```

接下来用新生成的ssh key添加到github账号中。这样你需要复制下面命令的输出并[粘贴在Github的设置页面里面](https://github.com/settings/ssh)。

```
cat ~/.ssh/id_rsa.pub

```

如果你做完了，检查是否已经成功。

```
ssh -T git@github.com

```

你应该得到下面这样的信息。

```
Hi excid3! You've successfully authenticated, but GitHub does not provide shell access.

```

### 安装 Rails

我们需要安装像NodeJS这样的javascript运行时环境，因为近来Rails的依赖越来越多了。这样我们可以合并和压缩你的javascript，从而提供一个更快的生产环境。

我们需要添加PPA来安装nodeJS。

```
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

```

如果在更新时遇到了问题，你可以试试这个命令：

```
# Note the new setup script name for Node.js v0.12
curl -sL https://deb.nodesource.com/setup_0.12 | sudo bash -

# Then install with:
sudo apt-get install -y nodejs

```

下一步，用这个命令安装 rails：

```
gem install rails -v 4.2.1

```

因为我们正在使用rbenv，用下面的命令来让rails的执行程序可以使用。

```
rbenv rehash

```

要确保rails已经正确安装，你可以运行rails -v，显示如下：

```
rails -v
# Rails 4.2.1

```

如果你得到的是不同的结果可能是环境没有设置正确。

### 设置 MySQL

或许你已经熟悉MySQL了，你可以从Ubuntu的仓库中安装MySQL的客户端与服务端。你可以在安装时设置root用户密码。这个信息将来会进入你rails程序的database.yml文件中。用下面的命令来安装mysql。

```
sudo apt-get install mysql-server mysql-client libmysqlclient-dev

```

安装libmysqlclient-dev用于mysql2 gem的编译；在设置rails程序时，rails通过它来连接mysql。

### 最后一步

让我们尝试创建你的第一个rails程序：

```
# 使用 MySQL 数据库
rails new myapp -d mysql

# 进入到应用目录
cd myapp
# 创建数据库
rake db:create
rails server

```

访问http://localhost:3000来访问你的新网站。现在你的电脑上已经可以构建rails程序了。

如果你在创建数据库时遇到了“Access denied for user 'root'@'localhost' (Using password: NO)”这个错误信息，你需要更新你的config/database.yml文件来匹配数据库的**用户名**和**密码**。

```
# 编辑配置文件夹中的 database.yml
nano config/database.yml

```

接着填入MySql root用户的密码。

退出 (Ctrl+X)并保存。

### 总结

Rails是用Ruby写的， 也是随着rails一起使用的编程语言。在Ubuntu 15.04中Ruby on Rails可以用rbenv、 rvm和源码的方式来安装。本篇我们使用的是rbenv方式并用了MySQL作为数据库。有任何的问题或建议，请在评论栏指出。

---

via: <http://linoxide.com/ubuntu-how-to/installing-ruby-rails-using-rbenv-ubuntu-15-04/>

作者：[Obet](http://linoxide.com/author/obetp/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


十个非常有趣的 Linux 彩蛋

Summary: 在1979年的时候，Atari 公司为 Atari 2600 开发了一个电子游戏Adventure。 制作 Adventure 的程序员悄悄的把这样的一个功能放进了游戏里，当用户把一个隐形方块移动到特定的一面墙上时，会让用户进入一个密室。那个房间里只有一句话：Created by Warren Robinett意思是，由 Warren Robinett 创建。  图片来自： Wikipedia Atari 有一项反对作者将自己的名字放进他们的游戏里的政策，所以这个无畏的程序员只能偷偷的把自己的名字放进游戏里。Atari 在 Warren Robinett 离开公司之后才发现这个密室。Atari 并没有对此感到生气，而是给这类秘

lolcat - linux.cn的日常

哈哈，这可真是第三次了。。被嘲讽了。。。

哈哈，暴击伤害。

不错

# 十个非常有趣的 Linux 彩蛋

**

在1979年的时候，Atari 公司为 Atari 2600 开发了一个电子游戏——[Adventure](http://en.wikipedia.org/wiki/Adventure_(Atari_2600))。

制作 Adventure 的程序员悄悄的把这样的一个功能放进了游戏里，当用户把一个“隐形方块”移动到特定的一面墙上时，会让用户进入一个“密室”。那个房间里只有一句话：“Created by [Warren Robinett](http://en.wikipedia.org/wiki/Warren_Robinett)”——意思是，由 [Warren Robinett](http://en.wikipedia.org/wiki/Warren_Robinett) 创建。

*图片来自： Wikipedia*

Atari 有一项反对作者将自己的名字放进他们的游戏里的政策，所以这个无畏的程序员只能偷偷的把自己的名字放进游戏里。Atari 在 Warren Robinett 离开公司之后才发现这个“密室”。Atari 并没有对此感到生气，而是给这类“秘密功能”起了个名字——“彩蛋”，因为——你懂的——你会寻找它们。Atari 还宣布将在之后的游戏中加入更多的“彩蛋”。

这种软件里的“隐藏功能”并不是第一次出现（这类特性的首次出现是在1966年[PDP-10](http://en.wikipedia.org/wiki/PDP-10)的操作系统上），但这是它第一次有了名字，同时也是第一次真正的被众多电脑用户和游戏玩家所注意。

Linux（以及和Linux相关的软件）也没有被遗忘。这些年来，人们为这个倍受喜爱的操作系统创作了很多非常有趣的彩蛋。下面将介绍我个人最喜爱的彩蛋——以及如何找到它们。

你很快就会想到这些彩蛋大多需要通过终端才能体验到。这是故意的。因为终端比较酷。【我应该借此机机会提醒你一下，如果你想运行我所列出的应用，然而你却还没有安装它们，你是绝对无法运行成功的。你应该先安装好它们的。因为……毕竟只是计算机。】

### Arch : 包管理器（pacman）里的吃豆人（Pac-Man）

为了广大的 [Arch Linux](http://en.wikipedia.org/wiki/Arch_Linux) 粉丝，我们将以此开篇。你们可以将“[pacman](http://www.linux.com/news/software/applications/820944-10-truly-amusing-linux-easter-eggs-#Pacman)” (Arch 的包管理器)的进度条变成吃豆人吃豆的样子。别问我为什么这不是默认设置。

你需要在你最喜欢的文本编辑器里编辑“/etc/pacman.conf”文件。在“# Misc options”区下面，删除“Color”前的“#”，添加一行“ILoveCandy”。因为吃豆人喜欢糖豆。

没错，这样就行了！下次你在终端里运行pacman管理器时，你就会让这个黄颜色的小家伙吃到些午餐（至少能吃些糖豆）。

### GNU Emacs : 俄罗斯方块（Tetris）以及……

*我不喜欢 emacs。一点也不喜欢。但是它确实能玩俄罗斯方块。*

我要坦白一件事：我不喜欢[emacs](http://en.wikipedia.org/wiki/GNU_Emacs)。一点也不喜欢。

有些东西让我满心欢喜。有些东西能带走我所有伤痛。有些东西能解决我的烦恼。这些[绝对跟 emacs 无关](https://www.youtube.com/watch?v=AQ4NAZPi2js)。

但是它确实能玩俄罗斯方块。这可不是件小事。方法如下：

第一步）打开 emacs。（有疑问？输入“emacs”。）

第二步）按下键盘上的Esc和X键。

第三步）输入“tetris”然后按下“Enter”。

玩腻了俄罗斯方块？试试“pong”、“snake”还有其他一堆小游戏（或奇怪的东西）。在“/usr/share/emacs/\*/lisp/play”文件中可以看见完整的清单。

### 动物说话了

让动物在终端里说话在 Linux 世界里有着悠久而辉煌的历史。下面这些真的是最应该知道的。

在用基于 Debian 的发行版？试试输入“apt-get moo"。

*apt-get moo*

简单？的确。但这是只会说话的牛，所以惹我们喜欢。再试试“aptitude moo”。他会告诉你“There are no Easter Eggs in this program（这个程序里没有彩蛋）”。

关于 [aptitude](https://wiki.debian.org/Aptitude) 有一件事你一定要知道，它是个肮脏、下流的骗子。如果 aptitude 是匹诺曹，那它的鼻子能刺穿月球。在这条命令中添加“-v”选项。不停的添加 v，直到它被逼得投降。

*我猜大家都同意，这是 aptitude 中最重要的功能。*

我猜大家都同意，这是 aptitude 中最重要的功能。但是万一你想把自己的话让一头牛说出来怎么办？这时我们就需要“cowsay”了。

还有，别让“cowsay（牛说）”这个名字把你给骗了。你可以让你的话从各种东西的嘴里说出来。比如一头大象，Calvin，Beavis 甚至可以是 Ghostbusters（捉鬼敢死队）的标志。只需在终端输入“cowsay -l”就能看到所有选项的列表。

*你可以让你的话从各种东西的嘴里说出来*

想玩高端点的？你可以用管道把其他应用的输出放到 cowsay 中。试试“fortune | cowsay”。非常有趣。

### Sudo 请无情的侮辱我

当你做错事时希望你的电脑骂你的人请举手。反正，我这样想过。试试这个：

输入“sudo visudo”以打开“sudoers”文件。在文件的开头你很可能会看见几行以“Defaults”开头的文字。在那几行后面添加“Defaults insults”并保存文件。

现在，只要你输错了你的 sudo 密码，你的系统就会骂你。这些可以提高自信的语句包括“听着，煎饼脑袋，我可没时间听这些垃圾。”，“你吃错药了吧？”以及“你被电过以后大脑就跟以前不太一样了是不是？”

把这个设在同事的电脑上会有非常有趣。

### Firefox 是个厚脸皮

这一个不需要终端！太棒了！

打开火狐浏览器。在地址栏填上“about:about”。你将得到火狐浏览器中所有的“about”页。一点也不炫酷，是不是？

现在试试“about:mozilla”，浏览器就会回应你一条从“[Book of Mozilla（Mozilla 之书）](http://en.wikipedia.org/wiki/The_Book_of_Mozilla)”——这本浏览网页的圣经——里引用的话。我的另一个最爱是“about:robots”，这个也很有趣。

*“[Book of Mozilla（Mozilla 之书）](http://en.wikipedia.org/wiki/The_Book_of_Mozilla)”——浏览网页的圣经。*

### 精心调制的混搭日历

是否厌倦了千百年不变的 [Gregorian Calendar（罗马教历）](http://en.wikipedia.org/wiki/Gregorian_calendar)？准备好乱入了吗？试试输入“ddate”。这样会把当前日历以[Discordian Calendar（不和教历）](http://en.wikipedia.org/wiki/Discordian_calendar)的方式显示出来。你会遇见这样的语句：

“今天是Sweetmorn（甜美的清晨），3181年Discord（不和）季的第18天。”

我听见你在说什么了，“但这根本不是什么彩蛋！”嘘~，闭嘴。只要我想，我就可以把它叫做彩蛋。

### 快速进入黑客行话模式

想不想尝试一下电影里超级黑客的感觉？试试（通过添加“-oS”）把扫描器设置成“[Script Kiddie](http://nmap.org/book/output-formats-script-kiddie.html)”模式。然后所有的输出都会变成最3l33t的[黑客范](http://nmap.org/book/output-formats-script-kiddie.html)。

例如: “nmap -oS - google.com”

赶快试试。我知道你有多想这么做。你一定会让安吉丽娜·朱莉（Angelina Jolie）[印象深刻](https://www.youtube.com/watch?v=Ql1uLyuWra8)。

### lolcat彩虹

在你的Linux终端里有很多彩蛋真真是极好的……但是如果你还想要变得……更有魅力些怎么办？输入：lolcat。把任何一个程序的文本输出通过管道输入到lolcat里。你会得到它的超级无敌彩虹版。

*把任何一个程序的文本输出通过管道输入到lolcat里。你会得到它的超级无敌彩虹版。*

### 追光标的小家伙

*“Oneko” -- 经典 “Neko”的Linux移植版本。*

接下来是“Oneko” -- 经典 “[Neko](http://en.wikipedia.org/wiki/Neko_%28computer_program%29)”的Linux移植版本。基本上就是个满屏幕追着你的光标跑的小猫。

虽然严格来它并不算是“彩蛋”，它还是很有趣的。而且感觉上也是很彩蛋的。

你还可以用不同的选项（比如“oneko -dog”）把小猫替代成小狗，或是调成其他样式。用这个对付讨厌的同事有着无限的可能。

就是这些了！一个我最喜欢的Linux彩蛋（或是类似东西）的清单。请尽情的的在下面的评论区留下你的最爱。因为这是互联网。你就能做这些事。

---

via: <http://www.linux.com/news/software/applications/820944-10-truly-amusing-linux-easter-eggs->

作者：[Bryan Lunduke](http://www.linux.com/community/forums/person/56734) 译者：[H-mudcup](https://github.com/H-mudcup) 校对：[wxy](https://github.com/wxy)

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


Summary: 问题: 当我想试着用tar命令来创建一个压缩文件时，总在执行过程中失败，并且抛出一个错误说明"tar：由于前一个错误导致于失败状态中退出"("Exiting with failure status due to previous errors"). 什么导致这个错误的发生，要如何解决？   如果当你执行tar命令时，遇到了下面的错误，那么最有可能的原因是对于你想用tar命令压缩的某个文件中，你并不具备其读权限。 tar: Exiting with failure status due to previous errors  那么我们要如何确定引起错误的这个（些）文件呢？或者如何确定其它的错误根源？ 事实上tar命令应该会打印出所

# Linux常见问题解答--如何修复"tar：由于前一个错误导致于失败状态中退出"

>
> **问题**: 当我想试着用tar命令来创建一个压缩文件时，总在执行过程中失败，并且抛出一个错误说明"tar：由于前一个错误导致于失败状态中退出"("Exiting with failure status due to previous errors"). 什么导致这个错误的发生，要如何解决？
>
>
>

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

如果当你执行tar命令时，遇到了下面的错误，那么最有可能的原因是对于你想用tar命令压缩的某个文件中，你并不具备其读权限。

```
tar: Exiting with failure status due to previous errors

```

那么我们要如何确定引起错误的这个（些）文件呢？或者如何确定其它的错误根源？

事实上tar命令应该会打印出所谓的“上一个错误”("previous errors")到底是什么错误，但是如果你让tar运行在详细模式（即verbose mode，例如, -cvf)，那么你会很容易错失这些信息。要找到这些信息，你可以像下面那样，把tar的标准输出（stdout)信息过滤掉。

```
$ tar cvzfz backup.tgz my_program/ > /dev/null

```

然后你会看到tar输出的标准错误(stderr)信息。（LCTT 译注：自然，不用 v 参数也可以。）

```
tar: my_program/src/lib/.conf.db.~lock~: Cannot open: Permission denied
tar: Exiting with failure status due to previous errors

```

你可以从上面的例子中看到，引起错误的原因的确是“读权限不允许”（denied read permission.)要解决这个问题，只要简单地更改(或移除)问题文件的权限，然后重新执行tar命令即可。

---

via: <http://ask.xmodulo.com/tar-exiting-with-failure-status-due-to-previous-errors.html>

作者：[Dan Nanni](http://ask.xmodulo.com/author/nanni) 译者：[XLCYun(袖里藏云)](https://github.com/XLCYun) 校对：[wxy](https://github.com/wxy)

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


原子(Atom)代码编辑器的视频短片介绍

Summary: Atom 1.0时代来临。作为之一，Atom已公开使用快一年了，近段时间，第一个稳定版本的原子编辑器的发布却引起了广大用户的谈论。这个Github上的项目随着为21世纪破解文本编辑器活动的兴起，已近被下载了150万余次，积累35万活跃用户。 这是个漫长的过程 滴水穿石，非一日之功，Atom同样经历一个漫长的过程。从2008年首次提出概念到这个月第一个稳定版本的发布，主创人员和全球各地的贡献者，这几年来不断地致力于Atom核心的开发。我们通过下面这张图来了解一下Atom的发展过程：  图片来源：Atom 回到未来 Atom 1.0 通过流行的视频发布方式，

什么都好，对中文支持是个硬伤，短期内好像也没有完美的解决方案，所以作为主力编辑器还要考虑一下。

中文不是挺好的么？正用着呢

中文硬伤

是linux平台吗？我用这个打开markdown文件，文件名和里面内容中文都乱码，最后找到解决方案解决了一部分，但是还有一部分菜单栏和文件中的文字是乱的。atom好像也没有统一配置的地方，尤其是各种插件如果有中文还得重新找对应的配置项。

# 原子(Atom)代码编辑器的视频短片介绍

[Atom 1.0](http://blog.atom.io/2015/06/25/atom-1-0.html)时代来临。作为[最好的开源代码编辑器]之一，Atom已公开使用快一年了，近段时间，第一个稳定版本的原子编辑器的发布却引起了广大用户的谈论。这个[Github](https://github.com/)上的项目随着“为21世纪破解文本编辑器”活动的兴起，已近被下载了150万余次，积累35万活跃用户。

### 这是个漫长的过程

滴水穿石，非一日之功，Atom同样经历一个漫长的过程。从2008年首次提出概念到这个月第一个稳定版本的发布，主创人员和全球各地的贡献者，这几年来不断地致力于Atom核心的开发。我们通过下面这张图来了解一下Atom的发展过程：

*图片来源：Atom*

### 回到未来

Atom 1.0 通过流行的视频发布方式，展示了这款编辑器的潜能。这个视屏就像70年代的科幻连续剧一样，今天你将会看到一个极其酷炫的视频：

### 原子编辑器特点

* 跨平台编辑
* 实现包管理
* 智能化、自动化
* 文件系统视图
* 多窗操作
* 支持查找更换
* 高度个性化
* 界面更新颖

### Atom 1.0起来

Atom 1.0 支持Linux，Windows和Mac OS X。对于基于Debian的Linux，例如Ubuntu和Linux Mint，Atom提供了deb包。对于Fedora，同样有rpm包。如果你愿意，你可以下载源代码。通过下面的链接下载最新的版本。

* [Atom .deb](https://atom.io/download/deb)
* [Atom .rpm](https://atom.io/download/rpm)
* [Atom Source Code](https://github.com/atom/atom/blob/master/docs/build-instructions/linux.md)

如果你愿意，你可以[通过PPA在Ubuntu上安装Atom]。PPA并不是官方解决方案。

注：下面是一个调查，可以发布的时候在文章内发布个调查

#### 你对Atom感兴趣吗？

* 噢，当然！这是程序员的福音。
* 我并不这样认为。我见过更好的编辑器。
* 并不关心，我的默认编辑器就能胜任我的工作。

---

via: <http://itsfoss.com/atom-stable-released/>

作者：[Abhishek](http://itsfoss.com/author/abhishek/) 译者：[sevenot](https://github.com/sevenot) 校对：[wxy](https://github.com/wxy)

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


为什么 mysql 里的 ibdata1 文件不断的增长？

Summary: 我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题。 当监控服务器发送一个关于 MySQL 服务器存储的报警时，恐慌就开始了  就是说磁盘快要满了。 一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 innodbfileper_table，所以问题是： ibdata1存了什么？ 当你启用了 innodb_file_per_table，表被存储在他们自己的表空间里，但是共享表空间仍然在存储其它的 InnoDB 内部数据：  数据字典，也就是 InnoDB 表的元数据 变更缓冲区 双写缓冲区 撤销日志  其中的一些在 Percona 服务器

asdf

非常感谢

# 为什么 mysql 里的 ibdata1 文件不断的增长？

<img src="content_image/album_201507_16_004226wdcda9djbabjzdx4.jpg" alt="ibdata1 file" title="ibdata1 file">

我们在 [Percona 支持栏目](https://www.percona.com/products/mysql-support)经常收到关于 MySQL 的 ibdata1 文件的这个问题。

当监控服务器发送一个关于 MySQL 服务器存储的报警时，恐慌就开始了 —— 就是说磁盘快要满了。

一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 [innodb\_file\_per\_table](http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_file_per_table)，所以问题是：

### ibdata1存了什么？

当你启用了 `innodb_file_per_table`，表被存储在他们自己的表空间里，但是共享表空间仍然在存储其它的 InnoDB 内部数据：

* 数据字典，也就是 InnoDB 表的元数据
* 变更缓冲区
* 双写缓冲区
* 撤销日志

其中的一些在 [Percona 服务器](https://www.percona.com/software/percona-server)上可以被配置来避免增长过大的。例如你可以通过 [innodb\_ibuf\_max\_size](https://www.percona.com/doc/percona-server/5.5/scalability/innodb_insert_buffer.html#innodb_ibuf_max_size) 设置最大变更缓冲区，或设置 [innodb\_doublewrite\_file](https://www.percona.com/doc/percona-server/5.5/performance/innodb_doublewrite_path.html?id=percona-server:features:percona_innodb_doublewrite_path#innodb_doublewrite_file) 来将双写缓冲区存储到一个分离的文件。

MySQL 5.6 版中你也可以创建外部的撤销表空间，所以它们可以放到自己的文件来替代存储到 ibdata1。可以看看这个[文档](http://dev.mysql.com/doc/refman/5.6/en/innodb-performance.html#innodb-undo-tablespace)。

### 什么引起 ibdata1 增长迅速？

当 MySQL 出现问题通常我们需要执行的第一个命令是：

```
SHOW ENGINE INNODB STATUS/G

```

这将展示给我们一些很有价值的信息。我们从\*\* TRANSACTION（事务）\*\*部分开始检查，然后我们会发现这个：

```
---TRANSACTION 36E, ACTIVE 1256288 sec
MySQL thread id 42, OS thread handle 0x7f8baaccc700, query id 7900290 localhost root
show engine innodb status
Trx read view will not see trx with id >= 36F, sees < 36F

```

这是一个最常见的原因，一个14天前创建的相当老的事务。这个状态是**活动的**，这意味着 InnoDB 已经创建了一个数据的快照，所以需要在**撤销**日志中维护旧页面，以保障数据库的一致性视图，直到事务开始。如果你的数据库有大量的写入任务，那就意味着存储了大量的撤销页。

如果你找不到任何长时间运行的事务，你也可以监控INNODB STATUS 中的其他的变量，“**History list length（历史记录列表长度）**”展示了一些等待清除操作。这种情况下问题经常发生，因为清除线程（或者老版本的主线程）不能像这些记录进来的速度一样快地处理撤销。

### 我怎么检查什么被存储到了 ibdata1 里了？

很不幸，MySQL 不提供查看什么被存储到 ibdata1 共享表空间的信息，但是有两个工具将会很有帮助。第一个是马克·卡拉汉制作的一个修改版 innochecksum ，它发布在[这个漏洞报告](http://bugs.mysql.com/bug.php?id=57611)里。

它相当易于使用：

```
# ./innochecksum /var/lib/mysql/ibdata1
0 bad checksum
13 FIL_PAGE_INDEX
19272 FIL_PAGE_UNDO_LOG
230 FIL_PAGE_INODE
1 FIL_PAGE_IBUF_FREE_LIST
892 FIL_PAGE_TYPE_ALLOCATED
2 FIL_PAGE_IBUF_BITMAP
195 FIL_PAGE_TYPE_SYS
1 FIL_PAGE_TYPE_TRX_SYS
1 FIL_PAGE_TYPE_FSP_HDR
1 FIL_PAGE_TYPE_XDES
0 FIL_PAGE_TYPE_BLOB
0 FIL_PAGE_TYPE_ZBLOB
0 other
3 max index_id

```

全部的 20608 中有 19272 个撤销日志页。**这占用了表空间的 93%**。

第二个检查表空间内容的方式是杰里米·科尔制作的 [InnoDB Ruby 工具](https://github.com/jeremycole/innodb_ruby)。它是个检查 InnoDB 的内部结构的更先进的工具。例如我们可以使用 space-summary 参数来得到每个页面及其数据类型的列表。我们可以使用标准的 Unix 工具来统计**撤销日志**页的数量：

```
# innodb_space -f /var/lib/mysql/ibdata1 space-summary | grep UNDO_LOG | wc -l
19272

```

尽管这种特殊的情况下，innochedcksum 更快更容易使用，但是我推荐你使用杰里米的工具去了解更多的 InnoDB 内部的数据分布及其内部结构。

好，现在我们知道问题所在了。下一个问题：

### 我该怎么解决问题？

这个问题的答案很简单。如果你还能提交语句，就做吧。如果不能的话，你必须要杀掉线程开始回滚过程。那将停止 ibdata1 的增长，但是很显然，你的软件会出现漏洞，有些人会遇到错误。现在你知道如何去鉴定问题所在，你需要使用你自己的调试工具或普通的查询日志来找出谁或者什么引起的问题。

如果问题发生在清除线程，解决方法通常是升级到新版本，新版中使用一个独立的清除线程替代主线程。更多信息查看该[文档](http://dev.mysql.com/doc/innodb/1.1/en/innodb-improved-purge-scheduling.html)

### 有什么方法回收已使用的空间么？

没有，目前还没有一个容易并且快速的方法。InnoDB 表空间从不收缩...参见[10 年之久的漏洞报告](http://bugs.mysql.com/bug.php?id=1341)，最新更新自詹姆斯·戴（谢谢）：

当你删除一些行，这个页被标为已删除稍后重用，但是这个空间从不会被回收。唯一的方法是使用新的 ibdata1 启动数据库。要做这个你应该需要使用 mysqldump 做一个逻辑全备份，然后停止 MySQL 并删除所有数据库、ib\_logfile\**、*ibdata1\* 文件。当你再启动 MySQL 的时候将会创建一个新的共享表空间。然后恢复逻辑备份。

### 总结

当 ibdata1 文件增长太快，通常是 MySQL 里长时间运行的被遗忘的事务引起的。尝试去解决问题越快越好（提交或者杀死事务），因为不经过痛苦缓慢的 mysqldump 过程，你就不能回收浪费的磁盘空间。

也是非常推荐监控数据库以避免这些问题。我们的 [MySQL 监控插件](https://www.percona.com/software/percona-monitoring-plugins)包括一个 Nagios 脚本，如果发现了一个太老的运行事务它可以提醒你。

---

via: <https://www.percona.com/blog/2013/08/20/why-is-the-ibdata1-file-continuously-growing-in-mysql/>

作者：[Miguel Angel Nieto](https://www.percona.com/blog/author/miguelangelnieto/) 译者：[wyangsun](https://github.com/wyangsun) 校对：[wxy](https://github.com/wxy)

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


Summary: 问: 我以前可以在我的 Ubuntu 台式机中的 gnome-terminal 中开启多个标签。但升到 Ubuntu 15.04 后，我就无法再在 gnome-terminal 窗口中打开新标签了。要怎样做才能在 Ubuntu 15.04 的 gnome-terminal 中打开标签呢？  在 Ubuntu 14.10 或之前的版本中，gnome-terminal 允许你在终端窗口中开启一个新标签或一个终端窗口。但从 Ubuntu 15.04开始，gnome-terminal 移除了新标签选项。这实际上并不是一个 bug，而是一个合并新标签和新窗口的举措。GNOME 3.12 引入了单独的开启终端选项。开启新终端标签的功能从终端菜单移动到了首选项中。

强烈支持

# Linux有问必答：如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签

>
> **问**: 我以前可以在我的 Ubuntu 台式机中的 gnome-terminal 中开启多个标签。但升到 Ubuntu 15.04 后，我就无法再在 gnome-terminal 窗口中打开新标签了。要怎样做才能在 Ubuntu 15.04 的 gnome-terminal 中打开标签呢？
>
>
>

在 Ubuntu 14.10 或之前的版本中，gnome-terminal 允许你在终端窗口中开启一个新标签或一个终端窗口。但从 Ubuntu 15.04开始，gnome-terminal 移除了“新标签”选项。这实际上并不是一个 bug，而是一个合并新标签和新窗口的举措。GNOME 3.12 引入了[单独的“开启终端”选项](http://worldofgnome.org/opening-a-new-terminal-tabwindow-in-gnome-3-12/)。开启新终端标签的功能从终端菜单移动到了首选项中。

### 偏好设置中的开启新标签

要在 Ubuntu 15.04 的 gnome-terminal中开启新标签，选择“编辑” -> “首选项"，并把“开启新终端：窗口”改为“开启新终端：标签”。

如果现在你通过菜单开启新终端，就会显示在当前终端中的一个新标签页中。

### 通过键盘快捷键开启标签

如果你不想更改首选项，你可以按住 临时改变设置。比如，在默认情况下，在点击“新终端”的同时按住 ，终端就会在新标签中打开而不是开启新的终端。

另外，你还可以使用键盘快捷键 <Shift+Ctrl+T> 在终端中开启新标签。

在我看来，gnome-terminal 此番在 UI 上的改变并非一个进步。比如，你无法自定义终端中各个标签的标题了。当你在一个终端中打开了多个标签时，这个功能会很有用。而如果终端名称保持默认标题（并不断变长）时，你就不能在有限的标题空间里看见终端的标题了。希望能被尽早加入这个功能。

---

via: <http://ask.xmodulo.com/open-multiple-tabs-gnome-terminal-ubuntu.html>

作者：[Dan Nanni](http://ask.xmodulo.com/author/nanni) 译者：[KevSJ](https://github.com/KevSJ) 校对：[wxy](https://github.com/wxy)

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


Summary: linuxlogo（或叫 linux_logo）是一款在Linux命令行下用彩色 ANSI 代码生成附带有系统信息的发行版徽标的工具。  Linux_Logo  输出彩色 ANSI Linux 发行版徽标 这个小工具可以从 /proc 文件系统中获取系统信息并可以显示包括主机上安装的发行版在内的很多发行版的徽标。 与徽标一同显示的系统信息包括 ： Linux 内核版本，最近一次编译Linux内核的时间，处理器/核心数量，速度，制造商，以及哪一代处理器。它还能显示总共的物理内存大小。 无独有偶，screenfetch是一个拥有类似功能的工具，它也能显示发行版徽标，同时还提供更加详细美观的

好文

看起来不错，不过安装时提示：<br />
E: 未发现软件包 linux_logo

如果是 ubuntu，是linuxlogo

嗯，我是linuxmint～

ubuntu安装时是 apt-get install linuxlogo

# Linux_Logo – 输出彩色 ANSI Linux 发行版徽标的命令行工具

linuxlogo（或叫 linux\_logo）是一款在Linux命令行下用彩色 ANSI 代码生成附带有系统信息的发行版徽标的工具。

*Linux\_Logo – 输出彩色 ANSI Linux 发行版徽标*

这个小工具可以从 /proc 文件系统中获取系统信息并可以显示包括主机上安装的发行版在内的很多发行版的徽标。

与徽标一同显示的系统信息包括 ： Linux 内核版本，最近一次编译Linux内核的时间，处理器/核心数量，速度，制造商，以及哪一代处理器。它还能显示总共的物理内存大小。

无独有偶，screenfetch是一个拥有类似功能的工具，它也能显示发行版徽标，同时还提供更加详细美观的系统信息。我们之前已经介绍过这个工具，你可以参考一下链接：

* [screenFetch: 命令行信息截图工具](/article-1947-1.html)

linux\_logo 和 Screenfetch 并完全一样。尽管 screenfetch 的输出较为整洁并提供更多细节， 但 linux\_logo 则提供了更多的彩色 ANSI 图标， 并且提供了格式化输出的选项。

linux\_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统中因此需要安装图形界面 X11 或 X 系统（LCTT 译注：此处应是错误的。按说不需要任何图形界面支持，并且译者从其官方站 <http://www.deater.net/weave/vmwprod/linux_logo> 也没找到任何相关 X11的信息）。这个软件使用GNU 2.0协议。

本文中，我们将使用以下环境测试 linux\_logo 工具。

```
操作系统 : Debian Jessie
处理器 : i3 / x86_64

```

### 在 Linux 中安装 Linux Logo工具

**1. linuxlogo软件包 ( 5.11 稳定版) 可通过如下方式使用 apt, yum 或 dnf 在所有发行版中使用默认的软件仓库进行安装**

```
# apt-get install linuxlogo            [用于基于 Apt 的系统] （译者注：Ubuntu中，该软件包名为linuxlogo）
# yum install linux_logo            [用于基于 Yum 的系统]
# dnf install linux_logo            [用于基于 Dnf 的系统]
或
# dnf install linux_logo.x86_64         [用于 64 位系统]

```

**2. 装好linuxlogo软件包之后，你可以使用命令 `linuxlogo` 来获取你当前使用的发行版的默认徽标..**

```
# linux_logo
或
# linuxlogo

```

*获取默认系统徽标*

**3. 使用 `[-a]` 选项可以输出没有颜色的徽标。当在黑白终端里使用 linux\_logo 时，这个选项会很有用。**

```
# linux_logo -a

```

*黑白 Linux 徽标*

**4. 使用 `[-l]` 选项可以仅输出徽标而不包含系统信息。**

```
# linux_logo -l

```

*输出发行版徽标*

**5. `[-u]` 选项可以显示系统运行时间。**

```
# linux_logo -u

```

*输出系统运行时间*

**6. 如果你对系统平均负载感兴趣，可以使用 `[-y]` 选项。你可以同时使用多个选项。**

```
# linux_logo -y

```

*输出系统平均负载*

如需查看更多选项并获取相关帮助，你可以使用如下命令。

```
# linux_logo -h

```

*Linuxlogo选项及帮助*

**7. 此工具内置了很多不同发行版的徽标。你可以使用 `[-L list]` 选项查看在这些徽标的列表。**

```
# linux_logo -L list

```

*Linux 徽标列表*

如果你想输出这个列表中的任意徽标，可以使用 `-L NUM` 或 `-L NAME` 来显示想要选中的图标。

* -L NUM – 会输出列表中序号为 NUM 的图标 (不推荐).
* -L NAME – 会输出列表中名为 NAME 的图标。

例如，如果想要显示 AIX 的徽标，你可以使用如下命令

```
# linux_logo -L 1
或
# linux_logo -L aix

```

*输出 AIX 图标*

**注**: 命令中的使用 `-L 1` 是因为 AIX 徽标在列表中的编号是1，而使用 `-L aix` 则是因为 AIX 徽标在列表中的名称为 aix

同样的，你还可以使用这些选项输出任何图标，以下是一些例子..

```
# linux_logo -L 27
# linux_logo -L 21

```

*各种 Linux 徽标*

你可以通过徽标对应的编号或名字使用任意徽标。

### 一些使用 Linux\_logo 的建议和提示

**8. 你可以在登录界面输出你的 Linux 发行版徽标。要输出默认徽标，你可以在 `~/.bashrc`文件的最后添加以下内容。**

```
if [ -f /usr/bin/linux_logo ]; then linux_logo; fi

```

**注**: 如没有`~/.bashrc` 文件，你需要在当前用户的 home 目录下新建一个。

**9. 在添加以上内容后，你只需要注销并重新登录即可看到你的发行版的默认徽标**

*在用户登录时输出徽标*

其实你也可以在登录后输出任意图标，只需加入以下内容：

```
if [ -f /usr/bin/linux_logo ]; then linux_logo -L num; fi

```

**重要**: 不要忘了将 num 替换成你想使用的图标。

**10. 你也能直接指定徽标所在的位置来显示你自己的徽标。**

```
# linux_logo -D /path/to/ASCII/logo

```

**11. 在远程登录时输出图标。**

```
# /usr/local/bin/linux_logo > /etc/issue.net

```

如果你想使用　ASCII　徽标而不是含有颜色的 ANSI 徽标，则使用如下命令

```
# /usr/local/bin/linux_logo -a > /etc/issue.net

```

**12. 创建一个 Linux 上的端口 - 用于回应连接的端口。要创建 **Linux** 端口， 则需在 /etc/services 文件中加入以下内容**

```
penguin 4444/tcp    penguin

```

这里的 `4444` 是一个未被任何其他资源使用的空闲端口。你也可以使用其他端口。你还需要在 /etc/inetd.conf中加入以下内容：

```
penguin stream       tcp    nowait  root /usr/local/bin/linux_logo

```

并使用以下命令重启 inetd 服务

```
# killall -HUP inetd

```

（LCTT 译注：然后你就可以远程或本地连接到这个端口，并显示这个徽标了。）

linux\_logo 还可以用做启动脚本来愚弄攻击者或对你朋友使用恶作剧。这是一个我经常在我的脚本中用来获取不同发行版输出的好工具。

试过一次后，你就不会忘记的。让我们知道你对这个工具的想法及它对你的作用吧。 不要忘记给评论、点赞或分享！

---

via: <http://www.tecmint.com/linux_logo-tool-to-print-color-ansi-logos-of-linux/>

作者：[Avishek Kumar](http://www.tecmint.com/author/avishek/) 译者：[KevinSJ](https://github.com/KevinSJ) 校对：[wxy](https://github.com/wxy)

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


PHP 7.0 升级备注

Summary: PHP 7.0.0 beta1 发布了，在带来了引人注目的性能提升的同时，也带来了不少语言特性方面的改变。以下由 LCTT 翻译自对官方的升级备注，虽然目前还不是正式发布版，不过想必距离正式发布的特性已经差别不大了。（本文会持续追踪更新）  1. 向后不兼容的变化 语言变化 变量处理的变化   间接变量、属性和方法引用现在以从左到右的语义进行解释。一些例子： $$foo // 解释做 ($$foo) $foo-$bar // 解释做 ($foo-$bar) $foo-$bar() // 解释做 ($foo-$bar)() Foo::$bar() // 解释做 (Foo::$bar)()  要恢复以前的行为，需要显式地加大括号： ${$

变的真多

php越来越不伦不类了

hi

# PHP 7.0 升级备注

PHP 7.0.0 beta1 发布了，在带来了引人注目的性能提升的同时，也带来了不少语言特性方面的改变。以下由 LCTT 翻译自对官方的[升级备注](https://github.com/php/php-src/blob/php-7.0.0beta1/UPGRADING)，虽然目前还不是正式发布版，不过想必距离正式发布的特性已经差别不大了。（本文会持续追踪更新）

1. 向后不兼容的变化
-----------

### 语言变化

#### 变量处理的变化

* 间接变量、属性和方法引用现在以从左到右的语义进行解释。一些例子：

```
$$foo['bar']['baz'] // 解释做 ($$foo)['bar']['baz']
$foo->$bar['baz']   // 解释做 ($foo->$bar)['baz']
$foo->$bar['baz']() // 解释做 ($foo->$bar)['baz']()
Foo::$bar['baz']()  // 解释做 (Foo::$bar)['baz']()

```

要恢复以前的行为，需要显式地加大括号：

```
${$foo['bar']['baz']}
$foo->{$bar['baz']}
$foo->{$bar['baz']}()
Foo::{$bar['baz']}()

```
* 全局关键字现在只接受简单变量。像以前的

```
global $$foo->bar;

```

现在要求如下写法：

```
global ${$foo->bar};

```
* 变量或函数调用的前后加上括号不再有任何影响。例如下列代码，函数调用结果以引用的方式传给一个函数

```
function getArray() { return [1, 2, 3]; }

$last = array_pop(getArray());
// Strict Standards: 只有变量可以用引用方式传递
$last = array_pop((getArray()));
// Strict Standards: 只有变量可以用引用方式传递

```

现在无论是否使用括号，都会抛出一个严格标准错误。以前在第二种调用方式下不会有提示。
* 数组元素或对象属性自动安装引用顺序创建，现在的结果顺序将不同。例如：

```
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);

```

现在结果是 ["a" => 1, "b" => 1]，而以前的结果是 ["b" => 1, "a" => 1]。

相关的 RFC：

* <https://wiki.php.net/rfc/uniform_variable_syntax>
* <https://wiki.php.net/rfc/abstract_syntax_tree>

#### list() 的变化

* list() 不再以反序赋值，例如：

```
list($array[], $array[], $array[]) = [1, 2, 3];
var_dump($array);

```

现在结果是 $array == [1, 2, 3] ，而不是 [3, 2, 1]。注意仅赋值**顺序**变化了，而赋值仍然一致（LCTT 译注：即以前的 list()行为是从后面的变量开始逐一赋值，这样对与上述用法就会产生 [3,2,1] 这样的结果了。）。例如，类似如下的常规用法

```
list($a, $b, $c) = [1, 2, 3];
// $a = 1; $b = 2; $c = 3;

```

仍然保持当前的行为。
* 不再允许对空的 list() 赋值。如下全是无效的：

```
list() = $a;
list(,,) = $a;
list($x, list(), $y) = $a;

```
* list() 不再支持对字符串的拆分（以前也只在某些情况下支持）。如下代码：

```
$string = "xy";
list($x, $y) = $string;

```

现在的结果是： $x == null 和 $y == null （没有提示），而以前的结果是： $x == "x" 和 $y == "y" 。此外， list() 现在总是可以处理实现了 ArrayAccess 的对象，例如：

```
list($a, $b) = (object) new ArrayObject([0, 1]);

```

现在的结果是： $a == 0 和 $b == 1。 以前 $a 和 $b 都是 null。

相关 RFC:

* <https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_list>
* <https://wiki.php.net/rfc/fix_list_behavior_inconsistency>

#### foreach 的变化

* foreach() 迭代不再影响数组内部指针，数组指针可通过 current()/next() 等系列的函数访问。例如：

```
$array = [0, 1, 2];
foreach ($array as &$val) {
    var_dump(current($array));
}

```

现在将指向值 int(0) 三次。以前的输出是 int(1)、int(2) 和 bool(false)。
* 在对数组按值迭代时，foreach 总是在对数组副本进行操作，在迭代中任何对数组的操作都不会影响到迭代行为。例如：

```
$array = [0, 1, 2];
$ref =& $array; // Necessary to trigger the old behavior
foreach ($array as $val) {
    var_dump($val);
    unset($array[1]);
}

```

现在将打印出全部三个元素 (0 1 2)，而以前第二个元素 1 会跳过 (0 2)。
* 在对数组按引用迭代时，对数组的修改将继续会影响到迭代。不过，现在 PHP 在使用数字作为键时可以更好的维护数组内的位置。例如，在按引用迭代过程中添加数组元素：

```
$array = [0];
foreach ($array as &$val) {
    var_dump($val);
    $array[1] = 1;
}

```

现在迭代会正确的添加了元素。如上代码输出是 "int(0) int(1)"，而以前只是 "int(0)"。
* 对普通（不可遍历的）对象按值或按引用迭代的行为类似于对数组进行按引用迭代。这符合以前的行为，除了如上一点所述的更精确的位置管理的改进。
* 对可遍历对象的迭代行为保持不变。

相关 RFC: <https://wiki.php.net/rfc/php7_foreach>

#### 参数处理的变化

* 不能定义两个同名的函数参数。例如，下面的方法将会触发编译时错误：

```
public function foo($a, $b, $unused, $unused) {
    // ...
}

```

如上的代码应该修改使用不同的参数名，如：

```
public function foo($a, $b, $unused1, $unused2) {
    // ...
}

```
* func\_get\_arg() 和 func\_get\_args() 函数不再返回传递给参数的原始值，而是返回其当前值（也许会被修改）。例如：

```
function foo($x) {
    $x++;
    var_dump(func_get_arg(0));
}
foo(1);

```

将会打印 "2" 而不是 "1"。代码应该改成仅在调用 func\_get\_arg(s) 后进行修改操作。

```
function foo($x) {
    var_dump(func_get_arg(0));
    $x++;
}

```

或者应该避免修改参数：

```
function foo($x) {
    $newX = $x + 1;
    var_dump(func_get_arg(0));
}

```
* 类似的，异常回溯也不再显示传递给函数的原始值，而是修改后的值。例如：

```
function foo($x) {
    $x = 42;
    throw new Exception;
}
foo("string");

```

现在堆栈跟踪的结果是：

```
Stack trace:
#0 file.php(4): foo(42)
#1 {main}

```

而以前是：

```
Stack trace:
#0 file.php(4): foo('string')
#1 {main}

```

这并不会影响到你的代码的运行时行为，值得注意的是在调试时会有所不同。

同样的限制也会影响到 debug\_backtrace() 及其它检查函数参数的函数。

相关 RFC: <https://wiki.php.net/phpng>

#### 整数处理的变化

* 无效的八进制表示（包含大于7的数字）现在会产生编译错误。例如，下列代码不再有效：

```
$i = 0781; // 8 不是一个有效的八进制数字！

```

以前，无效的数字（以及无效数字后的任何数字）会简单的忽略。以前如上 $i 的值是 7，因为后两位数字会被悄悄丢弃。
* 二进制以负数镜像位移现在会抛出一个算术错误：

```
var_dump(1 >> -1);
// ArithmeticError: 以负数进行位移

```
* 向左位移的位数超出了整型宽度时，结果总是 0。

```
var_dump(1 << 64); // int(0)

```

以前上述代码的结果依赖于所用的 CPU 架构。例如，在 x86（包括 x86-64） 上结果是 int(1)，因为其位移操作数在范围内。
* 类似的，向右位移的位数超出了整型宽度时，其结果总是 0 或 -1 （依赖于符号）：

```
var_dump(1 >> 64);  // int(0)
var_dump(-1 >> 64); // int(-1)

```

相关 RFC: <https://wiki.php.net/rfc/integer_semantics>

#### 字符串处理的变化

* 包含十六进制数字的字符串不会再被当做数字，也不会被特殊处理。参见例子中的新行为：

```
var_dump("0x123" == "291");     // bool(false)     (以前是 true)
var_dump(is_numeric("0x123"));  // bool(false)     (以前是 true)
var_dump("0xe" + "0x1");        // int(0)          (以前是 16)

var_dump(substr("foo", "0x1")); // string(3) "foo" (以前是 "oo")
// 注意：遇到了一个非正常格式的数字

```

filter\_var() 可以用来检查一个字符串是否包含了十六进制数字，或这个字符串是否能转换为整数：

```
$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
    throw new Exception("Invalid integer!");
}
var_dump($int); // int(65535)

```
* 由于给双引号字符串和 HERE 文档增加了 Unicode 码点转义格式（Unicode Codepoint Escape Syntax）， 所以带有无效序列的 "\u{" 现在会造成错误：

```
$str = "\u{xyz}"; // 致命错误：无效的 UTF-8 码点转义序列

```

要避免这种情况，需要转义开头的反斜杠：

```
$str = "\\u{xyz}"; // 正确

```

不过，不跟随 { 的 "\u" 不受影响。如下代码不会生成错误，和前面的一样工作：

```
$str = "\u202e"; // 正确

```

相关 RFC:

* <https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings>
* <https://wiki.php.net/rfc/unicode_escape>

#### 错误处理的变化

* 现在有两个异常类： Exception 和 Error 。这两个类都实现了一个新接口： Throwable 。在异常处理代码中的类型指示也许需要修改来处理这种情况。
* 一些致命错误和可恢复的致命错误现在改为抛出一个 Error 。由于 Error 是一个独立于 Exception 的类，这些异常不会被已有的 try/catch 块捕获。

可恢复的致命错误被转换为一个异常，所以它们不能在错误处理里面悄悄的忽略。部分情况下，类型指示失败不再能忽略。
* 解析错误现在会生成一个 Error 扩展的 ParseError 。除了以前的基于返回值 / error*get*last() 的处理，对某些可能无效的代码的 eval() 的错误处理应该改为捕获 ParseError 。
* 内部类的构造函数在失败时总是会抛出一个异常。以前一些构造函数会返回 NULL 或一个不可用的对象。
* 一些 E\_STRICT 提示的错误级别改变了。

相关 RFC:

* <https://wiki.php.net/rfc/engine_exceptions_for_php7>
* <https://wiki.php.net/rfc/throwable-interface>
* <https://wiki.php.net/rfc/internal_constructor_behaviour>
* <https://wiki.php.net/rfc/reclassify_e_strict>

#### 其它的语言变化

* 静态调用一个不兼容的 $this 上下文的非静态调用的做法不再支持。这种情况下，$this 是没有定义的，但是对它的调用是允许的，并带有一个废弃提示。例子：

```
class A {
    public function test() { var_dump($this); }
}

// 注意：没有从类 A 进行扩展
class B {
    public function callNonStaticMethodOfA() { A::test(); }
}

(new B)->callNonStaticMethodOfA();

// 废弃：非静态方法 A::test() 不应该被静态调用
// 提示：未定义的变量 $this
NULL

```

注意，这仅出现在来自不兼容上下文的调用上。如果类 B 扩展自类 A ，调用会被允许，没有任何提示。
* 不能使用下列类名、接口名和特殊名（大小写敏感）：

```
bool
int
float
string
null
false
true

```

这用于 class/interface/trait 声明、 class\_alias() 和 use 语句中。

此外，下列类名、接口名和特殊名保留做将来使用，但是使用时尚不会抛出错误：

```
resource
object
mixed
numeric

```
* yield 语句结构当用在一个表达式上下文时，不再要求括号。它现在是一个优先级在 “print” 和 “=>” 之间的右结合操作符。在某些情况下这会导致不同的行为，例如：

```
echo yield -1;
// 以前被解释如下
echo (yield) - 1;
// 现在被解释如下
echo yield (-1);

yield $foo or die;
// 以前被解释如下
yield ($foo or die);
// 现在被解释如下
(yield $foo) or die;

```

这种情况可以通过增加括号来解决。
* 移除了 ASP (<%) 和 script (


用这些专用工具让你截图更简单

Summary: 一图胜千言，这句二十世纪早期在美国应运而生的名言，说的是一张单一的静止图片所蕴含的信息足以匹敌大量的描述性文字。本质上说，图片所传递的信息量的确是比文字更有效更高效。 截图（或抓帧）是一种捕捉自计算机的快照或图片，用来记录可视设备的输出。屏幕捕捉软件能从计算机中获取到截图。此类软件有很多用处，因为一张图片能很好地说明计算机软件的操作，截图在软件开发过程和文档中扮演了一个很重要的角色。或者，如果你的电脑有了技术性问题，一张截图能让技术支持理解你碰到的这个问题。要写好计算机相关的文章、文档和教程，没

# 用这些专用工具让你截图更简单

“一图胜千言”，这句二十世纪早期在美国应运而生的名言，说的是一张单一的静止图片所蕴含的信息足以匹敌大量的描述性文字。本质上说，图片所传递的信息量的确是比文字更有效更高效。

截图（或抓帧）是一种捕捉自计算机的快照或图片，用来记录可视设备的输出。屏幕捕捉软件能从计算机中获取到截图。此类软件有很多用处，因为一张图片能很好地说明计算机软件的操作，截图在软件开发过程和文档中扮演了一个很重要的角色。或者，如果你的电脑有了技术性问题，一张截图能让技术支持理解你碰到的这个问题。要写好计算机相关的文章、文档和教程，没有一款好的截图工具是几乎不可能的。如果你想保存你放在屏幕上的一些零星的信息，特别是不方便打字时，截图也很有用。

在开源世界，Linux有许多专注于截图功能的工具供选择，基于图形的和控制台的都有。如果要说一个功能丰富的专用截图工具，看起来没有能超过Shutter的。这款工具是小型开源工具的杰出代表，但是也有其它的不错替代品可以选择。

屏幕捕捉功能不仅仅只有专门的工具提供，GIMP和ImageMagick这两款主攻图像处理的工具，也能提供像样的屏幕捕捉功能。

### Shutter

Shutter是一款功能丰富的截图软件。你可以对特定区域、窗口、整个屏幕甚至是网站截图 - 并为其应用不同的效果，比如用高亮的点在上面绘图，然后上传至一个图片托管网站，一切尽在这个小窗口内。

包含特性：

* 截图范围：
	+ 一个特定区域
	+ 窗口
	+ 完整的桌面
	+ 脚本生成的网页
* 在截图中应用不同效果
* 热键
* 打印
* 直接截图或指定延迟时间截图
* 将截图保存至一个指定目录并用一个简便方法重命名它（用指定通配符）
* 完全集成在GNOME桌面中（TrayIcon等等）
* 当你截了一张图并根据尺寸的百分比直接生成缩略图
* Shutter会话集：
	+ 跟踪会话中所有的截图
	+ 复制截图至剪贴板
	+ 打印截图
	+ 删除截图
	+ 重命名文件
* 直接上传你的文件至图像托管网站（比如 <http://ubuntu-pics.de> ），得到链接并将它们与其他人分享
* 用内置的绘画工具直接编辑截图

---

* 主页： [shutter-project.org](http://shutter-project.org/)
* 开发者： Mario Kemper和Shutter团队
* 许可证： GNU GPL v3
* 版本号： 0.93.1

### HotShots

HotShots是一款捕捉屏幕并能以各种图片格式保存的软件，同时也能添加注释和图形数据（箭头、行、文本 ...）。

你也可以把你的作品上传到网上（FTP/一些web服务），HotShots是用Qt开发而成的。

HotShots无法从Ubuntu的Software Center中获取，不过用以下命令可以轻松地来安装它：

```
sudo add-apt-repository ppa:ubuntuhandbook1/apps
sudo apt-get update
sudo apt-get install hotshots

```

包含特性：

* 简单易用
* 功能完整
* 内置编辑器
* 热键
* 内置放大功能
* 手动控制和多屏捕捉
* 支持输出格式：Black & Whte (bw), Encapsulated PostScript (eps, epsf), Encapsulated PostScript Interchange (epsi), OpenEXR (exr), PC Paintbrush Exchange (pcx), Photoshop Document (psd), ras, rgb, rgba, Irix RGB (sgi), Truevision Targa (tga), eXperimental Computing Facility (xcf), Windows Bitmap (bmp), DirectDraw Surface (dds), Graphic Interchange Format (gif), Icon Image (ico), Joint Photographic Experts Group 2000 (jp2), Joint Photographic Experts Group (jpeg, jpg), Multiple-image Network Graphics (mng), Portable Pixmap (ppm), Scalable Vector Graphics (svg), svgz, Tagged Image File Format (tif, tiff), webp, X11 Bitmap (xbm), X11 Pixmap (xpm), and Khoros Visualization (xv)
* 国际化支持：巴斯克语、中文、捷克语、法语、加利西亚语、德语、希腊语、意大利语、日语、立陶宛语、波兰语、葡萄牙语、罗马尼亚语、俄罗斯语、塞尔维亚语、僧伽罗语、斯洛伐克语、西班牙语、土耳其语、乌克兰语和越南语

---

* 主页： [thehive.xbee.net](http://thehive.xbee.net/)
* 开发者 xbee
* 许可证： GNU GPL v2
* 版本号： 2.2.0

### ScreenCloud

ScreenCloud是一款易于使用的开源截图工具。

在这款软件中，用户可以用三个热键之一或只需点击ScreenCloud托盘图标就能进行截图，用户也可以自行选择保存截图的地址。

如果你选择上传你的截图到screencloud网站，链接会自动复制到你的剪贴板上，你能通过email或在一个聊天对话框里和你的朋友同事分享它，他们肯定会点击这个链接来看你的截图的。

包含特性：

* 捕捉整个屏幕，窗口和截选区域
* 快速又简单：截取图片，粘贴链接，完成
* 免费托管你的截图
* 热键
* 设置定时器延迟
* 允许 '捕捉窗口边框'
* 启用/禁用通知
* 设置开机自启动
* 调整账户/上传/文件名/快捷方式的设置
* 跨平台工具
* 插件支持：保存至Dropbox，Imgur等等
* 支持上传至FTP和SFTP服务器

---

* 主页： [screencloud.net](https://screencloud.net/)
* 开发者： Olav S Thoresen
* 许可证： GNU GPL v2
* 版本号： 1.2.1

### KSnapshot

KSnapshot也是一款易于使用的截图工具，它能给整个桌面、单一窗口、窗口的一部分或一块所选区域捕捉图像。图像能以各种不同格式保存。

KSnapshot也允许用户用热键来进行截图。除了保存截图之外，它也可以被复制到剪贴板或用任何与图像文件关联的程序打开。

KSnapshot是KDE 4图形模块的一部分。

包含特性：

* 以多种格式保存截图
* 延迟截图
* 剔除窗口装饰（边框、菜单等）
* 复制截图至剪贴板
* 热键
* 能用它的D-Bus接口进行脚本化

---

* 主页： [www.kde.org](https://www.kde.org/applications/graphics/ksnapshot/)
* 开发者： KDE, Richard J. Moore, Aaron J. Seigo, Matthias Ettrich
* 许可证： GNU GPL v2
* 版本号： 0.8.2

---

via: <http://www.linuxlinks.com/article/2015062316235249/ScreenCapture.html>

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

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


Linux有问必答：如何为在Linux中安装兄弟牌打印机

Summary: 提问: 我有一台兄弟牌HL-2270DW激光打印机，我想从我的Linux机器上打印文档。我该如何在我的电脑上安装合适的驱动并使用它？  兄弟牌以买得起的紧凑型激光打印机而闻名。你可以用低于200美元的价格得到高质量的WiFi/双工激光打印机，而且价格还在下降。最棒的是，它们还提供良好的Linux支持，因此你可以在Linux中下载并安装它们的打印机驱动。我在一年前买了台HL-2270DW，我对它的性能和可靠性都很满意。 下面是如何在Linux中安装和配置兄弟打印机驱动。本篇教程中，我会演示安装HL-2270DW激光打印机的USB驱动。 首先通过USB线连接你的打

# Linux有问必答：如何为在Linux中安装兄弟牌打印机

>
> **提问**: 我有一台兄弟牌HL-2270DW激光打印机，我想从我的Linux机器上打印文档。我该如何在我的电脑上安装合适的驱动并使用它？
>
>
>

兄弟牌以买得起的紧凑型激光打印机而闻名。你可以用低于200美元的价格得到高质量的WiFi/双工激光打印机，而且价格还在下降。最棒的是，它们还提供良好的Linux支持，因此你可以在Linux中下载并安装它们的打印机驱动。我在一年前买了台HL-2270DW，我对它的性能和可靠性都很满意。

下面是如何在Linux中安装和配置兄弟打印机驱动。本篇教程中，我会演示安装HL-2270DW激光打印机的USB驱动。

首先通过USB线连接你的打印机到Linux上。

### 准备

在准备阶段，进入[兄弟官方支持网站](http://support.brother.com/)，输入你的型号（比如：HL-2270DW）搜索你的兄弟打印机型号。

进入下面页面后，选择你的Linux平台。对于Debian、Ubuntu或者其他衍生版，选择“Linux (deb)”。对于Fedora、CentOS或者RHEL选择“Linux (rpm)”。

下一页，你会找到你打印机的LPR驱动和CUPS包装器驱动。前者是命令行驱动，后者允许你通过网页管理和配置你的打印机。尤其是基于CUPS的图形界面对（本地、远程）打印机维护非常有用。建议你安装这两个驱动。点击“Driver Install Tool”下载安装文件。

运行安装文件之前，你需要在64位的Linux系统上做另外一件事情。

因为兄弟打印机驱动是为32位的Linux系统开发的，因此你需要按照下面的方法安装32位的库。

在早期的Debian(6.0或者更早期)或者Ubuntu（11.04或者更早期），安装下面的包。

```
$ sudo apt-get install ia32-libs

```

对于已经引入多架构的新的Debian或者Ubuntu而言，你可以安装下面的包：

```
$ sudo apt-get install lib32z1 lib32ncurses5

```

上面的包代替了ia32-libs包。或者你只需要安装：

```
$ sudo apt-get install lib32stdc++6

```

如果你使用的是基于Red Hat的Linux，你可以安装：

```
$ sudo yum install glibc.i686

```

### 驱动安装

现在解压下载的驱动文件。

```
$ gunzip linux-brprinter-installer-2.0.0-1.gz

```

接下来像下面这样运行安装文件。

```
$ sudo sh ./linux-brprinter-installer-2.0.0-1

```

你会被要求输入打印机的型号。输入你打印机的型号，比如“HL-2270DW”。

同意GPL协议之后，接受接下来的任何默认问题。

现在LPR/CUPS打印机驱动已经安装好了。接下来要配置你的打印机了。

### 打印机配置

我接下来就要通过基于CUPS的网页管理和配置兄弟打印机了。

首先验证CUPS守护进程已经启动。

```
$ sudo netstat -nap | grep 631

```

打开一个浏览器输入 http://localhost:631 。你会看到下面的打印机管理界面。

进入“Administration”选项卡，点击打印机选项下的“Manage Printers”。

你一定在下面的页面中看到了你的打印机（HL-2270DW）。点击打印机名。

在下拉菜单“Administration”中，选择“Set As Server Default”。这会设置你的打印机位系统默认打印机。

当被要求验证时，输入你的Linux登录信息。

现在基础配置已经基本完成了。为了测试打印，打开任何文档浏览程序（比如：PDF浏览器）并打印。你会看到“HL-2270DW”被列出并被作为默认的打印机设置。

打印机应该可以工作了。你可以通过CUPS的网页看到打印机状态和管理打印机任务。

---

via: <http://ask.xmodulo.com/install-brother-printer-linux.html>

作者：[Dan Nanni](http://ask.xmodulo.com/author/nanni) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何在 Fedora 22 上面配置 Apache 的 Docker 容器

Summary: 在这篇文章中，我们将会学习关于Docker的一些知识，如何使用Docker部署Apache httpd服务，并且共享到Docker Hub上面去。首先，我们学习怎样拉取和使用Docker Hub里面的镜像，然后在一个Fedora 22的镜像上交互式地安装Apache，之后我们将会学习如何用一个Dockerfile文件来以一种更快，更优雅的方式制作一个镜像。最后，我们将我们创建的镜像发布到Docker Hub上，这样以后任何人都可以下载并使用它。  安装并初体验Docker 要求 运行Docker，你至少需要满足这些：  你需要一个64位的内核，版本3.10或者更高 Iptables 1.4 - Docker会用它来做

# 如何在 Fedora 22 上面配置 Apache 的 Docker 容器

在这篇文章中，我们将会学习关于Docker的一些知识，如何使用Docker部署Apache httpd服务，并且共享到Docker Hub上面去。首先，我们学习怎样拉取和使用Docker Hub里面的镜像，然后在一个Fedora 22的镜像上交互式地安装Apache，之后我们将会学习如何用一个Dockerfile文件来以一种更快，更优雅的方式制作一个镜像。最后，我们将我们创建的镜像发布到Docker Hub上，这样以后任何人都可以下载并使用它。

### 安装并初体验Docker

**要求**

运行Docker，你至少需要满足这些：

* 你需要一个64位的内核，版本3.10或者更高
* Iptables 1.4 - Docker会用它来做网络配置，如网络地址转换（NAT）
* Git 1.7 - Docker会使用Git来与仓库交流，如Docker Hub
* ps - 在大多数环境中这个工具都存在，在procps包里有提供
* root - 尽管一般用户可以通过TCP或者其他方式来运行Docker，但是为了简化，我们会假定你就是root

#### 使用dnf安装docker

以下的命令会安装Docker

```
dnf update && dnf install docker

```

**注意**：在Fedora 22里，你仍然可以使用Yum命令，但是它被DNF取代了，而且在纯净安装时不可用了。

#### 检查安装

我们将要使用的第一个命令是docker info，这会输出很多信息给你：

```
docker info

```

也可以试着用**docker version**：

```
docker version

```

#### 以守护进程方式启动Dcoker

你应该启动一个docker实例，然后她会处理我们的请求。

```
docker -d

```

现在我们设置 docker 随系统启动，以便我们不需要每次重启都需要运行上述命令。

```
chkconfig docker on

```

让我们用Busybox来打印hello world：

```
dockr run -t busybox /bin/echo "hello world"

```

这个命令里，我们告诉Docker在Busybox镜像的一个实例/容器里执行 /bin/echo "hello world"。Busybox是一个小型的POSIX环境，将许多小工具都结合到了一个单独的可执行程序里。

如果Docker不能在你的系统里找到本地的Busybox镜像，她就会自动从Docker Hub里拉取镜像，正如你可以看下如下的快照：

*Hello world with Busybox*

再次尝试相同的命令，这次由于Docker已经有了本地的Busybox镜像，你将会看到的全部就是echo的输出：

```
docker run -t busybox /bin/echo "hello world"

```

也可以尝试以下的命令进入到容器环境里去：

```
docker run -it busybox /bin/sh

```

使用**exit**命令可以离开容器并停止它

### 交互式地Docker化Apache

拉取/下载 Fedora 镜像：

```
docker pull fedora:22

```

启动一个容器在后台运行：

```
docker run -d -t fedora:22 /bin/bash

```

列出正在运行地容器及其名字标识，如下

```
docker ps

```

*使用docker ps列出，并使用docker attach进入一个容器里*

angry\_noble是docker分配给我们容器的名字，所以我们来连接上去：

```
docker attach angry_noble

```

注意：每次你启动一个容器，就会被给与一个新的名字，如果你的容器需要一个固定的名字，你应该在 docker run 命令里使用 -name 参数。

#### 安装Apache

下面的命令会更新DNF的数据库，下载安装Apache（httpd包）并清理dnf缓存使镜像尽量小

```
dnf -y update && dnf -y install httpd && dnf -y clean all

```

**配置Apache**

我们需要修改httpd.conf的唯一地方就是ServerName，这会使Apache停止抱怨

```
sed -i.orig 's/#ServerName/ServerName/' /etc/httpd/conf/httpd.conf

```

**设定环境**

为了使Apache运行为独立模式，你必须以环境变量的格式提供一些信息，并且你也需要创建这些变量里的目录，所以我们将会用一个小的shell脚本干这个工作，当然也会启动Apache

```
vi /etc/httpd/run_apache_foreground

```

---

```
#!/bin/bash

#设置环境变量
APACHE_LOG_DI=R"/var/log/httpd"
APACHE_LOCK_DIR="/var/lock/httpd"
APACHE_RUN_USER="apache"
APACHE_RUN_GROUP="apache"
APACHE_PID_FILE="/var/run/httpd/httpd.pid"
APACHE_RUN_DIR="/var/run/httpd"

#如果需要的话，创建目录
if ! [ -d /var/run/httpd ]; then mkdir /var/run/httpd;fi
if ! [ -d /var/log/httpd ]; then mkdir /var/log/httpd;fi
if ! [ -d /var/lock/httpd ]; then mkdir /var/lock/httpd;fi

#运行 Apache
httpd -D FOREGROUND

```

**另外地**，你可以粘贴这个片段代码到容器shell里并运行:

```
dnf -y install git && git clone https://github.com/gaiada/run-apache-foreground.git && cd run-apach* && ./install && dnf erase git

```

上面的内嵌脚本会安装Git，克隆[这个仓库](https://github.com/gaiada/run-apache-foreground)，到文件里去运行脚本，并询问你是否卸载Git。

**保存你的容器状态**

你的容器现在准备好运行Apache，是时候保存容器当前的状态为一个镜像，以备你需要的时候使用。

为了离开容器环境，你必须顺序按下 **Ctrl+q** 和 **Ctrl+p**，如果你仅仅在shell执行exit，你同时也会停止容器，失去目前为止你做过的所有工作。

回到Docker主机，使用 **docker commit** 及容器名和你想要的仓库名字/标签：

```
docker commit angry_noble gaiada/apache

```

现在，你保存了容器的状态到一个镜像里，可以使用 **docker stop** 停止容器了：

```
docker stop angry_noble

```

**运行并测试你的镜像**

最后，从你的新镜像启动一个容器，并且重定向80端口到该容器：

```
docker run -p 80:80 -d -t gaiada/apache /etc/httpd/run_apache_foreground

```

到目前，你正在你的容器里运行Apache，打开你的浏览器访问该服务，在[http://localhost](http://localhost/)，你将会看到如下Apache默认的页面

*在容器里运行的Apache默认页面*

### 使用Dockerfile Docker化Apache

现在，我们将要去创建一个新的Apache镜像，这次所有步骤会写在一个Dockerfile文件里，文件将会被用于生成该镜像。

首先，新建一个目录，在里面放Dockerfile文件，并进入该目录：

```
mkdir apachedf; cd apachedf

```

然后创建一个名为Dockerfile的文件，添加以下内容：

```
FROM fedora:22

MAINTAINER Carlos Alberto
LABEL version="0.1"

RUN dnf -y update && dnf -y install httpd && dnf -y clean all

RUN [ -d /var/log/httpd ] || mkdir /var/log/httpd
RUN [ -d /var/run/httpd ] || mkdir /var/run/httpd
RUN [ -d /var/lock/httpd ] || mkdir /var/lock/httpd

RUN sed -i.orig 's/#ServerName/ServerName/' /etc/httpd/conf/httpd.conf

ENV APACHE_RUN_USER apache
ENV APACHE_RUN_GROUP apache
ENV APACHE_LOG_DIR /var/log/httpd
ENV APACHE_LOCK_DIR /var/lock/httpd
ENV APACHE_RUN_DIR /var/run/httpd
ENV APACHE_PID_FILE /var/run/httpd/httpd.pid

EXPOSE 80

CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

```

我们一起来看看Dockerfile里面有什么：

* **FROM** - 这告诉docker，我们将要使用Fedora 22作为基础镜像
* **MAINTAINER** 和 **LABLE** - 这些命令对镜像没有直接作用，属于标记信息
* **RUN** - 自动完成我们之前交互式做的工作，安装Apache，新建目录并编辑httpd.conf
* **ENV** - 设置环境变量，现在我们再不需要run*apache*foreground脚本
* **EXPOSE** - 暴露80端口给外网
* **CMD** - 设置默认的命令启动httpd服务，这样我们就不需要每次起一个新的容器都重复这个工作

**建立该镜像**

现在，我们将要建立这个镜像，并为其添加tag gaiada/apachedf

```
docker build -t gaiada/apachedf:0.1 .

```

*docker完成创建*

使用 **docker images** 列出本地镜像，查看是否存在你新建的镜像：

```
docker images

```

然后运行新的镜像:

```
docker run -t -p 80:80 gaiada/apachedf

```

这就是Dockerfile的工作，使用这项功能会使得事情更加容易，快速并且可重复生成。

### 发布你的镜像

直到现在，你仅仅是从Docker Hub拉取了镜像，但是你也可以推送你的镜像，以后需要也可以再次拉取他们。实际上，其他人也可以下载你的镜像，在他们的系统中使用它而不需要改变任何东西。现在我们将要学习如何使我们的镜像对世界上的其他人可用。

**创建帐号**

为了能够在Docker Hub上推送你的镜像，你需要创建一个帐号。访问 <https://hub.docker.com/account/signup/>，填写下面的表格：

*Docker Hub 注册页面*

**登录**

输入下面的命令，接着输入你注册时提供的用户名，密码和邮箱

```
docker login

```

第一次登录过后，你的帐号信息会被记录在 **～/.dockercfg**

**推送**

推送镜像，使用 **docker push [registry/]your*login/repository*name[:tag]**

```
docker push docker.io/gaiada/apachedf

```

你可能会看见像这样的输出，在你的控制台上：

*Docker推送Apache镜像完成*

### 结论

现在，你知道如何Docker化Apache，试一试包含其他一些组件，Perl，PHP，proxy，HTTPS，或者任何你需要的东西。我希望你们这些家伙喜欢她，并推送你们自己的镜像到Docker Hub。

---

via: <http://linoxide.com/linux-how-to/configure-apache-containers-docker-fedora-22/>

作者：[Carlos Alberto](http://linoxide.com/author/carlosal/) 译者：[wi-cuckoo](https://github.com/wi-cuckoo) 校对：[wxy](https://github.com/wxy)

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


互联网扫描器 ZMap 完全手册

Summary: 初识 ZMap  ZMap被设计用来针对整个IPv4地址空间或其中的大部分实施综合扫描的工具。ZMap是研究者手中的利器，但在运行ZMap时，请注意，您很有可能正在以每秒140万个包的速度扫描整个IPv4地址空间 。我们建议用户即使在实施小范围扫描之前，也联系一下本地网络的管理员并参考我们列举的最佳扫描体验。 默认情况下，ZMap会对于指定端口实施尽可能大速率的TCP SYN扫描。较为保守的情况下，对10,000个随机的地址的80端口以10Mbps的速度扫描，如下所示： $ zmap --bandwidth=10M --target-port=80 --max-targets=10000 --output-file=results.

确实很详细，赞一个！

您好，请教一个问题，在zmap扩展这块，官方源码里面中examples中是没有这个/banner-grab文件的，请问从哪里可以找到？而且这个源码中也不能输出·extend-file格式文件，请问怎么解决？十分谢谢

test by<script>alert('a');</script>

楼上在 XSS

<img src="" onerror=alert("1")>

的确很牛逼，有些引用了、

# 互联网扫描器 ZMap 完全手册

### 初识 ZMap

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

ZMap被设计用来针对整个IPv4地址空间或其中的大部分实施综合扫描的工具。ZMap是研究者手中的利器，但在运行ZMap时，请注意，您很有可能正在以每秒140万个包的速度扫描整个IPv4地址空间 。我们建议用户即使在实施小范围扫描之前，也联系一下本地网络的管理员并参考我们列举的[最佳扫描体验](/article-5860-1.html#bestpractices)。

默认情况下，ZMap会对于指定端口实施尽可能大速率的TCP SYN扫描。较为保守的情况下，对10,000个随机的地址的80端口以10Mbps的速度扫描，如下所示：

```
$ zmap --bandwidth=10M --target-port=80 --max-targets=10000 --output-file=results.csv

```

或者更加简洁地写成：

```
$ zmap -B 10M -p 80 -n 10000 -o results.csv

```

ZMap也可用于扫描特定子网或CIDR地址块。例如，仅扫描10.0.0.0/8和192.168.0.0/16的80端口，运行指令如下：

```
zmap -p 80 -o results.csv 10.0.0.0/8 192.168.0.0/16

```

如果扫描进行的顺利，ZMap会每秒输出类似以下内容的状态更新：

```
0% (1h51m left); send: 28777 562 Kp/s (560 Kp/s avg); recv: 1192 248 p/s (231 p/s avg); hits: 0.04%
0% (1h51m left); send: 34320 554 Kp/s (559 Kp/s avg); recv: 1442 249 p/s (234 p/s avg); hits: 0.04%
0% (1h50m left); send: 39676 535 Kp/s (555 Kp/s avg); recv: 1663 220 p/s (232 p/s avg); hits: 0.04%
0% (1h50m left); send: 45372 570 Kp/s (557 Kp/s avg); recv: 1890 226 p/s (232 p/s avg); hits: 0.04%

```

这些更新信息提供了扫描的即时状态并表示成：

```
完成进度% (剩余时间); send: 发出包的数量 即时速率 (平均发送速率); recv: 接收包的数量 接收率 (平均接收率); hits: 命中率

```

如果您不知道您所在网络能支持的扫描速率，您可能要尝试不同的扫描速率和带宽限制直到扫描效果开始下降，借此找出当前网络能够支持的最快速度。

默认情况下，ZMap会输出不同IP地址的列表（例如，根据SYN ACK数据包的情况），像下面这样。其[输出结果](/article-5860-1.html#output)还有几种附加的格式（如，JSON和Redis），可以用作生成[程序可解析的扫描统计](/article-5860-1.html#verbosity)。 同样，可以指定附加的[输出字段](/article-5860-1.html#outputfields)并使用[输出过滤](/article-5860-1.html#outputfilter)来过滤输出的结果。

```
115.237.116.119
23.9.117.80
207.118.204.141
217.120.143.111
50.195.22.82

```

我们强烈建议您使用[黑名单文件](/article-5860-1.html#blacklisting)，以排除预留的/未分配的IP地址空间（如，RFC1918 规定的私有地址、组播地址），以及网络中需要排除在您扫描之外的地址。默认情况下，ZMap将采用位于 `/etc/zmap/blacklist.conf`的这个简单的[黑名单文件](/article-5860-1.html#blacklisting)中所包含的预留和未分配地址。如果您需要某些特定设置，比如每次运行ZMap时的最大带宽或[黑名单文件](/article-5860-1.html#blacklisting)，您可以在文件`/etc/zmap/zmap.conf`中指定或使用自定义[配置文件](/article-5860-1.html#config)。

如果您正试图解决扫描的相关问题，有几个选项可以帮助您调试。首先，您可以通过添加`--dryrun`实施[预扫](/article-5860-1.html#dryrun)，以此来分析包可能会发送到网络的何处。此外，还可以通过设置'--verbosity=n`来更改[日志详细程度](/article-5860-1.html#verbosity)。

### 最佳扫描体验

我们为针对互联网进行扫描的研究者提供了一些建议，以此来引导养成良好的互联网合作氛围。

* 密切协同本地的网络管理员，以减少风险和调查
* 确认扫描不会使本地网络或上游供应商瘫痪
* 在发起扫描的源地址的网页和DNS条目中申明你的扫描是善意的
* 明确解释你的扫描中所有连接的目的和范围
* 提供一个简单的退出扫描的方法并及时响应请求
* 实施扫描时，不使用比研究对象需求更大的扫描范围或更快的扫描频率
* 如果可以，将扫描流量分布到不同的时间或源地址上

即使不声明，使用扫描的研究者也应该避免利用漏洞或访问受保护的资源，并遵守其辖区内任何特殊的法律规定。

### 命令行参数

#### 通用选项

这些选项是实施简单扫描时最常用的选项。我们注意到某些选项取决于所使用的[探测模块](/article-5860-1.html#probemodule)或[输出模块](/article-5860-1.html#outputmodule)（如，在实施ICMP Echo扫描时是不需要使用目的端口的）。

**-p, --target-port=port**

要扫描的目标TCP端口号（例如，443）

**-o, --output-file=name**

将结果写入该文件，使用`-`代表输出到标准输出。

**-b, --blacklist-file=path**

文件中被排除的子网使用CIDR表示法（如192.168.0.0/16），一个一行。建议您使用此方法排除RFC 1918地址、组播地址、IANA预留空间等IANA专用地址。在conf/blacklist.example中提供了一个以此为目的示例黑名单文件。

#### 扫描选项

**-n, --max-targets=n**

限制探测目标的数量。后面跟的可以是一个数字（例如'-n 1000`），或可扫描地址空间的百分比（例如，`-n 0.1％`，不包括黑名单）

**-N, --max-results=n**

收到多少结果后退出

**-t, --max-runtime=secs**

限制发送报文的时间

**-r, --rate=pps**

设置发包速率，以包/秒为单位

**-B, --bandwidth=bps**

以比特/秒设置传输速率（支持使用后缀G，M或K（如`-B 10M`就是速度10 mbps）的。设置会覆盖`--rate`。

**-c, --cooldown-time=secs**

发送完成后等待多久继续接收回包（默认值= 8）

**-e, --seed=n**

地址排序种子。如果要用多个ZMap以相同的顺序扫描地址，那么就可以使用这个参数。

**--shards=n**

将扫描分片/区，使其可多个ZMap中执行（默认值= 1）。启用分片时，`--seed`参数是必需的。

**--shard=n**

选择扫描的分片（默认值= 0）。n的范围在[0，N)，其中N为碎片的总数。启用分片时，`--seed`参数是必需的。

**-T, --sender-threads=n**

用于发送数据包的线程数（默认值= 1）

**-P, --probes=n**

发送到每个IP的探测数（默认值= 1）

**-d, --dryrun**

用标准输出打印出每个包，而不是将其发送（用于调试）

#### 网络选项

**-s, --source-port=port|range**

发送数据包的源端口

**-S, --source-ip=ip|range**

发送数据包的源地址。可以仅仅是一个IP，也可以是一个范围（如，10.0.0.1-10.0.0.9）

**-G, --gateway-mac=addr**

数据包发送到的网关MAC地址（用以防止自动检测不工作的情况）

**-i, --interface=name**

使用的网络接口

#### 探测选项

ZMap允许用户指定并添加自己所需要的[探测模块](/article-5860-1.html#probemodule)。 探测模块的职责就是生成要发送的探测包，并处理主机回复的响应包。

**--list-probe-modules**

列出可用探测模块（如tcp\_synscan）

**-M, --probe-module=name**

选择[探测模块](/article-5860-1.html#probemodule)（默认值= tcp\_synscan）

**--probe-args=args**

向模块传递参数

**--list-output-fields**

列出可用的输出模块

#### 输出选项

ZMap允许用户指定和编写他们自己的[输出模块](/article-5860-1.html#outputmodule)。输出模块负责处理由探测模块返回的字段，并将它们输出给用户。用户可以指定输出的字段，并过滤相应字段。

**--list-output-modules**

列出可用输出模块（如tcp\_synscan）

**-O, --output-module=name**

选择[输出模块](/article-5860-1.html#outputmodule)（默认值为csv）

**--output-args=args**

传递给输出模块的参数

**-f, --output-fields=fields**

输出的字段列表，以逗号分割

**--output-filter**

指定输出[过滤器](/article-5860-1.html#outputfilter)对[探测模块](/article-5860-1.html#probemodule)定义字段进行过滤

#### 附加选项

**-C, --config=filename**

加载[配置文件](/article-5860-1.html#config)，可以指定其他路径。

**-q, --quiet**

不必每秒刷新输出

**-g, --summary**

在扫描结束后打印配置和结果汇总信息

**-v, --verbosity=n**

日志详细程度（0-5，默认值= 3）

**-h, --help**

打印帮助并退出

**-V, --version**

打印版本并退出

### 附加信息

#### TCP SYN 扫描

在执行TCP SYN扫描时，ZMap需要指定一个目标端口，也支持指定发起扫描的源端口范围。

**-p, --target-port=port**

扫描的TCP端口（例如 443）

**-s, --source-port=port|range**

发送扫描数据包的源端口（例如 40000-50000）

**警示！** ZMap基于Linux内核使用RST包来应答SYN/ACK包响应，以关闭扫描器打开的连接。ZMap是在Ethernet层完成包的发送的，这样做是为了减少跟踪打开的TCP连接和路由寻路带来的内核开销。因此，如果您有跟踪连接建立的防火墙规则，如类似于`-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT`的netfilter规则，将阻止SYN/ACK包到达内核。这不会妨碍到ZMap记录应答，但它会阻止RST包被送回，最终被扫描主机的连接会一直打开，直到超时后断开。我们强烈建议您在执行ZMap时，选择一组主机上未使用且防火墙允许访问的端口，加在`-s`后（如 `-s '50000-60000'` ）。

#### ICMP Echo 请求扫描

虽然在默认情况下ZMap执行的是TCP SYN扫描，但它也支持使用ICMP echo请求扫描。在这种扫描方式下ICMP echo请求包被发送到每个主机，并以收到ICMP应答包作为答复。实施ICMP扫描可以通过选择icmp\_echoscan扫描模块来执行，如下：

```
$ zmap --probe-module=icmp_echoscan

```

#### UDP 数据报扫描

ZMap还额外支持UDP探测，它会发出任意UDP数据报给每个主机，并接收UDP或ICMP不可达的应答。ZMap可以通过使用--probe-args命令行选项来设置四种不同的UDP载荷。这些是：可在命令行设置可打印的ASCII 码的‘text’载荷和十六进制载荷的‘hex’，外部文件中包含载荷的‘file’，和通过动态字段生成的载荷的‘template’。为了得到UDP响应，请使用-f参数确保您指定的“data”字段处于输出范围。

下面的例子将发送两个字节'ST'，即PCAnwywhere的'status'请求，到UDP端口5632。

```
$ zmap -M udp -p 5632 --probe-args=text:ST -N 100 -f saddr,data -o -

```

下面的例子将发送字节“0X02”，即SQL Server的'client broadcast'请求，到UDP端口1434。

```
$ zmap -M udp -p 1434 --probe-args=hex:02 -N 100 -f saddr,data -o -

```

下面的例子将发送一个NetBIOS状态请求到UDP端口137。使用一个ZMap自带的载荷文件。

```
$ zmap -M udp -p 1434 --probe-args=file:netbios_137.pkt -N 100 -f saddr,data -o -

```

下面的例子将发送SIP的'OPTIONS'请求到UDP端口5060。使用附ZMap自带的模板文件。

```
$ zmap -M udp -p 1434 --probe-args=file:sip_options.tpl -N 100 -f saddr,data -o -

```

UDP载荷模板仍处于实验阶段。当您在更多的使用一个以上的发送线程（-T）时可能会遇到崩溃和一个明显的相比静态载荷性能降低的表现。模板仅仅是一个由一个或多个使用${}将字段说明封装成序列构成的载荷文件。某些协议，特别是SIP，需要载荷来反射包中的源和目的包。其他协议，如portmapper和DNS，每个请求包含的字段应该是随机的，或降低被Zamp扫描的多宿主系统的风险。

以下的载荷模板将发送SIP OPTIONS请求到每一个目的地：

```
OPTIONS sip:${RAND_ALPHA=8}@${DADDR} SIP/2.0
Via: SIP/2.0/UDP ${SADDR}:${SPORT};branch=${RAND_ALPHA=6}.${RAND_DIGIT=10};rport;alias
From: sip:${RAND_ALPHA=8}@${SADDR}:${SPORT};tag=${RAND_DIGIT=8}
To: sip:${RAND_ALPHA=8}@${DADDR}
Call-ID: ${RAND_DIGIT=10}@${SADDR}
CSeq: 1 OPTIONS
Contact: sip:${RAND_ALPHA=8}@${SADDR}:${SPORT}
Content-Length: 0
Max-Forwards: 20
User-Agent: ${RAND_ALPHA=8}
Accept: text/plain

```

就像在上面的例子中展示的那样，注意每行行末以\r\n结尾，请求以\r\n\r\n结尾，大多数SIP实现都可以正确处理它。一个可以工作的例子放在ZMap的examples/udp-payloads目录下 (sip\_options.tpl).

当前实现了下面的模板字段：

* **SADDR**: 源IP地址的点分十进制格式
* **SADDR\_N**: 源IP地址的网络字节序格式
* **DADDR**: 目的IP地址的点分十进制格式
* **DADDR\_N**: 目的IP地址的网络字节序格式
* **SPORT**: 源端口的ascii格式
* **SPORT\_N**: 源端口的网络字节序格式
* **DPORT**: 目的端口的ascii格式
* **DPORT\_N**: 目的端口的网络字节序格式
* **RAND\_BYTE**: 随机字节(0-255)，长度由=(length) 参数决定
* **RAND\_DIGIT**: 随机数字0-9，长度由=(length) 参数决定
* **RAND\_ALPHA**: 随机大写字母A-Z，长度由=(length) 参数决定
* **RAND\_ALPHANUM**: 随机大写字母A-Z和随机数字0-9，长度由=(length) 参数决定

### 配置文件

ZMap支持使用配置文件来代替在命令行上指定所有要求的选项。配置中可以通过每行指定一个长名称的选项和对应的值来创建：

```
interface "eth1"
source-ip 1.1.1.4-1.1.1.8
gateway-mac b4:23:f9:28:fa:2d # upstream gateway
cooldown-time 300 # seconds
blacklist-file /etc/zmap/blacklist.conf
output-file ~/zmap-output
quiet
summary

```

然后ZMap就可以按照配置文件并指定一些必要的附加参数运行了：

```
$ zmap --config=~/.zmap.conf --target-port=443

```

### 详细

ZMap可以在屏幕上生成多种类型的输出。默认情况下，Zmap将每隔1秒打印出相似的基本进度信息。可以通过设置`--quiet`来禁用。

```
0:01 12%; send: 10000 done (15.1 Kp/s avg); recv: 144 143 p/s (141 p/s avg); hits: 1.44%

```

ZMap同样也可以根据扫描配置打印如下消息，可以通过'--verbosity`参数加以控制。

```
Aug 11 16:16:12.813 [INFO] zmap: started
Aug 11 16:16:12.817 [DEBUG] zmap: no interface provided. will use eth0
Aug 11 16:17:03.971 [DEBUG] cyclic: primitive root: 3489180582
Aug 11 16:17:03.971 [DEBUG] cyclic: starting point: 46588
Aug 11 16:17:03.975 [DEBUG] blacklist: 3717595507 addresses allowed to be scanned
Aug 11 16:17:03.975 [DEBUG] send: will send from 1 address on 28233 source ports
Aug 11 16:17:03.975 [DEBUG] send: using bandwidth 10000000 bits/s, rate set to 14880 pkt/s
Aug 11 16:17:03.985 [DEBUG] recv: thread started

```

ZMap还支持在扫描之后打印出一个的可grep的汇总信息，类似于下面这样，可以通过调用`--summary`来实现。

```
cnf target-port             443
cnf source-port-range-begin         32768
cnf source-port-range-end           61000
cnf source-addr-range-begin         1.1.1.4
cnf source-addr-range-end           1.1.1.8
cnf maximum-packets             4294967295
cnf maximum-runtime             0
cnf permutation-seed            0
cnf cooldown-period             300
cnf send-interface              eth1
cnf rate                    45000
env nprocessors             16
exc send-start-time             Fri Jan 18 01:47:35 2013
exc send-end-time               Sat Jan 19 00:47:07 2013
exc recv-start-time             Fri Jan 18 01:47:35 2013
exc recv-end-time               Sat Jan 19 00:52:07 2013
exc sent                    3722335150
exc blacklisted             572632145
exc first-scanned               1318129262
exc hit-rate                0.874102
exc synack-received-unique          32537000
exc synack-received-total           36689941
exc synack-cooldown-received-unique     193
exc synack-cooldown-received-total      1543
exc rst-received-unique         141901021
exc rst-received-total          166779002
adv source-port-secret          37952
adv permutation-gen             4215763218

```

### 结果输出

ZMap可以通过**输出模块**生成不同格式的结果。默认情况下，ZMap只支持**csv**的输出，但是可以通过编译支持**redis**和**json** 。可以使用**输出过滤**来过滤这些发送到输出模块上的结果。输出模块输出的字段由用户指定。默认情况如果没有指定输出文件，ZMap将以csv格式返回结果，而不会生成特定结果。也可以编写自己的输出模块;请参阅[编写输出模块](/article-5860-1.html#exteding)。

**-o, --output-file=p**

输出写入文件地址

**-O, --output-module=p**

调用自定义输出模块

**-f, --output-fields=p**

以逗号分隔的输出的字段列表

**--output-filter=filter**

对给定的探测指定字段输出过滤

**--list-output-modules**

列出可用输出模块

**--list-output-fields**

列出给定的探测的可用输出字段

#### 输出字段

除了IP地址之外，ZMap有很多字段。这些字段可以通过在给定探测模块上运行`--list-output-fields`来查看。

```
$ zmap --probe-module="tcp_synscan" --list-output-fields
saddr           string: 应答包中的源IP地址
saddr-raw          int: 网络字节格式的源IP地址
daddr           string: 应答包中的目的IP地址
daddr-raw          int: 网络字节格式的目的IP地址
ipid               int: 应答包中的IP识别号
ttl                int: 应答包中的ttl（存活时间）值
sport              int: TCP 源端口
dport              int: TCP 目的端口
seqnum             int: TCP 序列号
acknum             int: TCP Ack号
window             int: TCP 窗口
classification  string: 包类型
success            int: 是应答包成功
repeat             int: 是否是来自主机的重复响应
cooldown           int: 是否是在冷却时间内收到的响应
timestamp-str   string: 响应抵达时的时间戳使用ISO8601格式
timestamp-ts       int: 响应抵达时的时间戳使用UNIX纪元开始的秒数
timestamp-us       int: 时间戳的微秒部分(例如 从'timestamp-ts'的几微秒)

```

可以通过使用`--output-fields=fields`或`-f`来选择选择输出字段，任意组合的输出字段可以被指定为逗号分隔的列表。例如：

```
$ zmap -p 80 -f "response,saddr,daddr,sport,seq,ack,in_cooldown,is_repeat,timestamp" -o output.csv

```

#### 过滤输出

在传到输出模块之前，探测模块生成的结果可以先过滤。过滤是针对探测模块的输出字段的。过滤使用类似于SQL的简单过滤语法写成，通过ZMap的**--output-filter**选项来指定。输出过滤通常用于过滤掉重复的结果，或仅传输成功的响应到输出模块。

过滤表达式的形式为`<字段名> <操作符> <值>`。`<值>`的类型必须是一个字符串或一串无符号整数并且匹配`<字段名>`类型。对于整数比较有效的操作符是`= !=, <, >, <=, >=`。字符串比较的操作是=，!=。`--list-output-fields`可以打印那些可供探测模块选择的字段和类型，然后退出。

复合型的过滤操作，可以通过使用`&&`（逻辑与）和`||`（逻辑或）这样的运算符来组合出特殊的过滤操作。

**示例**

书写一则过滤仅显示成功的、不重复的应答

```
--output-filter="success = 1 && repeat = 0"

```

过滤出RST分类并且TTL大于10的包，或者SYNACK分类的包

```
--output-filter="(classification = rst && ttl > 10) || classification = synack"

```

#### CSV

csv模块将会生成以逗号分隔各个要求输出的字段的文件。例如，以下的指令将生成名为`output.csv`的CSV文件。

```
$ zmap -p 80 -f "response,saddr,daddr,sport,seq,ack,in_cooldown,is_repeat,timestamp" -o output.csv

```

---

```
#响应, 源地址, 目的地址, 源端口, 目的端口, 序列号, 应答, 是否是冷却模式, 是否重复, 时间戳
response, saddr, daddr, sport, dport, seq, ack, in_cooldown, is_repeat, timestamp
synack, 159.174.153.144, 10.0.0.9, 80, 40555, 3050964427, 3515084203, 0, 0,2013-08-15 18:55:47.681
rst, 141.209.175.1, 10.0.0.9, 80, 40136, 0, 3272553764, 0, 0,2013-08-15 18:55:47.683
rst, 72.36.213.231, 10.0.0.9, 80, 56642, 0, 2037447916, 0, 0,2013-08-15 18:55:47.691
rst, 148.8.49.150, 10.0.0.9, 80, 41672, 0, 1135824975, 0, 0,2013-08-15 18:55:47.692
rst, 50.165.166.206, 10.0.0.9, 80, 38858, 0, 535206863, 0, 0,2013-08-15 18:55:47.694
rst, 65.55.203.135, 10.0.0.9, 80, 50008, 0, 4071709905, 0, 0,2013-08-15 18:55:47.700
synack, 50.57.166.186, 10.0.0.9, 80, 60650, 2813653162, 993314545, 0, 0,2013-08-15 18:55:47.704
synack, 152.75.208.114, 10.0.0.9, 80, 52498, 460383682, 4040786862, 0, 0,2013-08-15 18:55:47.707
synack, 23.72.138.74, 10.0.0.9, 80, 33480, 810393698, 486476355, 0, 0,2013-08-15 18:55:47.710

```

#### Redis

Redis的输出模块允许地址被添加到一个Redis的队列，而不是保存到文件，允许ZMap将它与之后的处理工具结合使用。

**注意!** ZMap默认不会编译Redis功能。如果你从源码构建ZMap，可以在CMake的时候加上`-DWITH_REDIS=ON`来增加Redis支持。

#### JSON

JSON输出模块用起来类似于CSV模块，只是以JSON格式写入到文件。JSON文件能轻松地导入到其它可以读取JSON的程序中。

**注意！**，ZMap默认不会编译JSON功能。如果你从源码构建ZMap，可以在CMake的时候加上`-DWITH_JSON=ON`来增加JSON支持。

### 黑名单和白名单

ZMap同时支持对网络前缀做黑名单和白名单。如果ZMap不加黑名单和白名单参数，他将会扫描所有的IPv4地址（包括本地的，保留的以及组播地址）。如果指定了黑名单文件，那么在黑名单中的网络前缀将不再扫描；如果指定了白名单文件，只有那些网络前缀在白名单内的才会扫描。白名单和黑名单文件可以协同使用；黑名单优先于白名单（例如：如果您在白名单中指定了10.0.0.0/8并在黑名单中指定了10.1.0.0/16，那么10.1.0.0/16将不会扫描）。白名单和黑名单文件可以在命令行中指定，如下所示：

**-b, --blacklist-file=path**

文件用于记录黑名单子网，以CIDR（无类域间路由）的表示法，例如192.168.0.0/16

**-w, --whitelist-file=path**

文件用于记录限制扫描的子网，以CIDR的表示法，例如192.168.0.0/16

黑名单文件的每行都需要以CIDR的表示格式书写，一行单一的网络前缀。允许使用`#`加以备注。例如：

```
# IANA（英特网编号管理局）记录的用于特殊目的的IPv4地址
# http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
# 更新于2013-05-22

0.0.0.0/8           # RFC1122: 网络中的所有主机
10.0.0.0/8          # RFC1918: 私有地址
100.64.0.0/10       # RFC6598: 共享地址空间
127.0.0.0/8         # RFC1122: 回环地址
169.254.0.0/16      # RFC3927: 本地链路地址
172.16.0.0/12       # RFC1918: 私有地址
192.0.0.0/24        # RFC6890: IETF协议预留
192.0.2.0/24        # RFC5737: 测试地址1
192.88.99.0/24      # RFC3068: IPv6转换到IPv4的任播
192.168.0.0/16      # RFC1918: 私有地址
192.18.0.0/15       # RFC2544: 检测地址
198.51.100.0/24     # RFC5737: 测试地址2
203.0.113.0/24      # RFC5737: 测试地址3
240.0.0.0/4         # RFC1112: 预留地址
255.255.255.255/32  # RFC0919: 限制广播地址

# IANA记录的用于组播的地址空间
# http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
# 更新于2013-06-25

224.0.0.0/4         # RFC5771: 组播/预留地址ed

```

如果您只是想扫描因特网中随机的一部分地址，使用[抽样](/article-5860-1.html#ratelimiting)检出，来代替使用白名单和黑名单。

**注意！**ZMap默认设置使用`/etc/zmap/blacklist.conf`作为黑名单文件，其中包含有本地的地址空间和预留的IP空间。通过编辑`/etc/zmap/zmap.conf`可以改变默认的配置。

### 速度限制与抽样

默认情况下，ZMap将以您当前网卡所能支持的最快速度扫描。以我们对于常用硬件的经验，这通常是理论上Gbit以太网速度的95-98%，这可能比您的上游提供商可处理的速度还要快。ZMap是不会自动的根据您的上游提供商来调整发送速率的。您可能需要手动的调整发送速率来减少丢包和错误结果。

**-r, --rate=pps**

设置最大发送速率以包/秒为单位

**-B, --bandwidth=bps**

设置发送速率以比特/秒(支持G,M和K后缀)。这会覆盖--rate参数。

ZMap同样支持对IPv4地址空间进行指定最大目标数和/或最长运行时间的随机采样。由于每次对主机的扫描是通过随机排序生成的，限制扫描的主机个数为N就会随机抽选N个主机。命令选项如下：

**-n, --max-targets=n**

探测目标上限数量

**-N, --max-results=n**

结果上限数量（累积收到这么多结果后退出）

**-t, --max-runtime=s**

发送数据包时间长度上限（以秒为单位）

**-s, --seed=n**

种子用以选择地址的排列方式。使用不同ZMap执行扫描操作时将种子设成相同的值可以保证相同的扫描顺序。

举个例子，如果您想要多次扫描同样的一百万个互联网主机，您可以设定排序种子和扫描主机的上限数量，大致如下所示：

```
zmap -p 443 -s 3 -n 1000000 -o results

```

为了确定哪一百万主机将要被扫描，您可以执行预扫，只打印数据包而非发送，并非真的实施扫描。

```
zmap -p 443 -s 3 -n 1000000 --dryrun | grep daddr
    | awk -F'daddr: ' '{print $2}' | sed 's/ |.*//;'

```

### 发送多个数据包

ZMap支持向每个主机发送多个探测。增加这个数量既增加了扫描时间又增加了到达的主机数量。然而，我们发现，增加的扫描时间（每个额外扫描的增加近100％）远远大于到达的主机数量（每个额外扫描的增加近1％）。

**-P, --probes=n**

向每个IP发出的独立探测个数（默认值=1）

### 示例应用

ZMap专为向大量主机发起连接并寻找那些正确响应而设计。然而，我们意识到许多用户需要执行一些后续处理，如执行应用程序级别的握手。例如，用户在80端口实施TCP SYN扫描也许想要实施一个简单的GET请求，还有用户扫描443端口可能希望完成TLS握手。

#### Banner获取

我们收录了一个示例程序，banner-grab，伴随ZMap使用可以让用户从监听状态的TCP服务器上接收到消息。Banner-grab连接到提供的服务器上，发送一个可选的消息，然后打印出收到的第一个消息。这个工具可以用来获取banner，例如HTTP服务的回复的具体指令，telnet登陆提示，或SSH服务的字符串。

下面的例子寻找了1000个监听80端口的服务器，并向每个发送一个简单的GET请求，存储他们的64位编码响应至http-banners.out

```
$ zmap -p 80 -N 1000 -B 10M -o - | ./banner-grab-tcp -p 80 -c 500 -d ./http-req > out

```

如果想知道更多使用`banner-grab`的细节,可以参考`examples/banner-grab`中的README文件。

**注意！** ZMap和banner-grab（如例子中）同时运行可能会比较显著的影响对方的表现和精度。确保不让ZMap占满banner-grab-tcp的并发连接，不然banner-grab将会落后于标准输入的读入，导致阻塞ZMap的输出写入。我们推荐使用较慢扫描速率的ZMap，同时提升banner-grab-tcp的并发性至3000以内（注意 并发连接>1000需要您使用`ulimit -SHn 100000`和`ulimit -HHn 100000`来增加每个进程的最大文件描述符数量）。当然，这些参数取决于您服务器的性能、连接成功率（hit-rate）；我们鼓励开发者在运行大型扫描之前先进行小样本的试验。

#### 建立套接字

我们也收录了另一种形式的banner-grab，就是forge-socket， 重复利用服务器发出的SYN-ACK，连接并最终取得banner。在`banner-grab-tcp`中，ZMap向每个服务器发送一个SYN，并监听服务器发回的带有SYN+ACK的应答。运行ZMap主机的内核接受应答后发送RST，这样就没有与该包关联活动连接。程序banner-grab必须在这之后创建一个新的TCP连接到从服务器获取数据。

在forge-socket中，我们利用内核中同名的模块，使我们可以创建任意参数的TCP连接。可以通过抑制内核的RST包，并重用SYN+ACK的参数取代该包而创建套接字，通过这个套接字收发数据和我们平时使用的连接套接字并没有什么不同。

要使用forge-socket，您需要forge-socket内核模块，从[github](https://github.com/ewust/forge_socket/)上可以获得。您需要`git clone git@github.com:ewust/forge_socket.git`至ZMap源码根目录，然后cd进入forge\_socket目录，运行make。以root身份运行`insmod forge_socket.ko` 来安装该内核模块。

您也需要告知内核不要发送RST包。一个简单的在全系统禁用RST包的方法是使用**iptables**。以root身份运行`iptables -A OUTPUT -p tcp -m tcp --tcp-flgas RST,RST RST,RST -j DROP`即可，当然您也可以加上一项`--dport X`将禁用局限于所扫描的端口（X）上。扫描完成后移除这项设置，以root身份运行`iptables -D OUTPUT -p tcp -m tcp --tcp-flags RST,RST RST,RST -j DROP`即可。

现在应该可以建立forge-socket的ZMap示例程序了。运行需要使用**extended\_file**ZMap[输出模块](/article-5860-1.html#outputmodule)：

```
$ zmap -p 80 -N 1000 -B 10M -O extended_file -o - | \
    ./forge-socket -c 500 -d ./http-req > ./http-banners.out

```

详细内容可以参考`examples/forge-socket`目录下的README。

---

### 编写探测和输出模块

ZMap可以通过**探测模块**来扩展支持不同类型的扫描，通过**输出模块**增加不同类型的输出结果。注册过的探测和输出模块可以在命令行中列出：

**--list-probe-modules**

列出安装过的探测模块

**--list-output-modules**

列出安装过的输出模块

#### 输出模块

ZMap的输出和输出后处理可以通过实现和注册扫描器的**输出模块**来扩展。输出模块在接收每一个应答包时都会收到一个回调。然而默认提供的模块仅提供简单的输出，这些模块同样支持更多的输出后处理（例如：重复跟踪或输出AS号码来代替IP地址）。

通过定义一个新的output\_module结构来创建输出模块，并在[output\_modules.c](https://github.com/zmap/zmap/blob/v1.0.0/src/output_modules/output_modules.c)中注册：

```
typedef struct output_module {
    const char          *name;           // 在命令行如何引用输出模块
    unsigned            update_interval; // 以秒为单位的更新间隔

    output_init_cb      init;            // 在扫描器初始化的时候调用
    output_update_cb    start;           // 在扫描器开始的时候调用
    output_update_cb    update;          // 每次更新间隔调用，秒为单位
    output_update_cb    close;           // 扫描终止后调用

    output_packet_cb    process_ip;      // 接收到应答时调用

    const char          *helptext;       // 会在--list-output-modules时打印在屏幕上

} output_module_t;

```

输出模块必须有名称，通过名称可以在命令行调用，并且通常会实现`success_ip`和常见的`other_ip`回调。process\_ip的回调由每个收到并经由**probe module**过滤的应答包调用。应答是否被认定为成功并不确定（比如，它可以是一个TCP的RST）。这些回调必须定义匹配`output_packet_cb`定义的函数:

```
int (*output_packet_cb) (

    ipaddr_n_t    saddr,         // 网络字节格式的发起扫描主机IP地址
    ipaddr_n_t    daddr,         // 网络字节格式的目的IP地址

    const char*   response_type, // 发送模块的数据包分类

    int           is_repeat,     // {0: 主机的第一个应答, 1: 后续的应答}
    int           in_cooldown,   // {0: 非冷却状态, 1: 扫描器处于冷却中}

    const u_char* packet,        // 指向IP包的iphdr结构体的指针
    size_t        packet_len     // 包的长度，以字节为单位
);

```

输出模块还可以通过注册回调，执行在扫描初始化的时候（诸如打开输出文件的任务）、在扫描开始阶段（诸如记录黑名单的任务）、在扫描的常规间隔（诸如状态更新的任务）、在关闭的时候（诸如关掉所有打开的文件描述符）。提供的这些回调可以完整的访问扫描配置和当前状态：

```
int (*output_update_cb)(struct state_conf*, struct state_send*, struct state_recv*);

```

这些定义在[output\_modules.h](https://github.com/zmap/zmap/blob/master/src/output_modules/output_modules.h)中。在[src/output*modules/module*csv.c](https://github.com/zmap/zmap/blob/master/src/output_modules/module_csv.c)中有可用示例。

#### 探测模块

数据包由**探测模块**构造，它可以创建各种包和不同类型的响应。ZMap默认拥有两个扫描模块：`tcp_synscan`和`icmp_echoscan`。默认情况下，ZMap使用`tcp_synscan`来发送TCP SYN包并对每个主机的响应分类，如打开时（收到SYN+ACK）或关闭时（收到RST）。ZMap允许开发者编写自己的ZMap探测模块，使用如下的API：

任何类型的扫描都必须通过开发和注册`send_module_t`结构中的回调来实现：

```
typedef struct probe_module {
    const char               *name;             // 如何在命令行调用扫描
    size_t                   packet_length;     // 探测包有多长(必须是静态的)

    const char               *pcap_filter;      // 对收到的响应实施PCAP过滤
    size_t                   pcap_snaplen;      // libpcap 捕获的最大字节数
    uint8_t                  port_args;         // 设为1，如果ZMap需要用户指定--target-port

    probe_global_init_cb     global_initialize; // 在扫描初始化会时被调用一次
    probe_thread_init_cb     thread_initialize; // 每个包缓存区的线程中被调用一次
    probe_make_packet_cb     make_packet;       // 每个主机更新包的时候被调用一次
    probe_validate_packet_cb validate_packet;   // 每收到一个包被调用一次，
                                                // 如果包无效返回0，
                                                // 非零则有效。

    probe_print_packet_cb    print_packet;      // 如果在预扫模式下被每个包都调用
    probe_classify_packet_cb process_packet;    // 由区分响应的接收器调用
    probe_close_cb           close;             // 扫描终止后被调用

    fielddef_t               *fields            // 该模块指定的字段的定义
    int                      numfields          // 字段的数量

} probe_module_t;

```

在扫描操作初始化时会调用一次`global_initialize`，可以用来实施一些必要的全局配置和初始化操作。然而，`global_initialize`并不能访问包缓冲区，那里是线程特定的。代替的，`thread_initialize`在每个发送线程初始化的时候被调用，提供对于缓冲区的访问，可以用来构建探测包和全局的源和目的值。此回调应用于构建主机不可知的包结构，甚至只有特定值（如：目的主机和校验和），需要随着每个主机更新。例如，以太网头部信息在交换时不会变更（减去校验和是由NIC硬件计算的）因此可以事先定义以减少扫描时间开销。

调用回调参数`make\_packet`是为了让被扫描的主机允许**探测模块**更新主机指定的值，同时提供IP地址、一个非透明的验证字符串和探测数目（如下所示）。探测模块负责在探测中放置尽可能多的验证字符串，即便当服务器返回的应答为空时，探测模块也能验证它的当前状态。例如，针对TCP SYN扫描，tcp\_synscan探测模块会使用TCP源端口和序列号的格式存储验证字符串。响应包（SYN+ACK）将包含目的端口和确认号的预期值。

```
int make_packet(
    void        *packetbuf,  // 包的缓冲区
    ipaddr_n_t  src_ip,      // 网络字节格式源IP
    ipaddr_n_t  dst_ip,      // 网络字节格式目的IP
    uint32_t    *validation, // 探测中的有效字符串
    int         probe_num    // 如果向每个主机发送多重探测，
                             // 该值为我们对于该主机
                             // 正在发送的探测数目
);

```

扫描模块也应该定义`pcap_filter`、`validate_packet`和`process_packet`。只有符合PCAP过滤器的包才会被扫描。举个例子，在一个TCP SYN扫描的情况下，我们只想要调查TCP SYN / ACK或RST TCP数据包，并利用类似`tcp && tcp[13] & 4 != 0 || tcp[13] == 18`的过滤方法。`validate_packet`函数将会被每个满足PCAP过滤条件的包调用。如果验证返回的值非零，将会调用`process_packet`函数，并使用`fields`定义的字段和包中的数据填充字段集。举个例子，如下代码为TCP synscan探测模块处理了一个数据包。

```
void synscan_process_packet(const u_char *packet, uint32_t len, fieldset_t *fs)
{
    struct iphdr *ip_hdr = (struct iphdr *)&packet[sizeof(struct ethhdr)];
    struct tcphdr *tcp = (struct tcphdr*)((char *)ip_hdr
            + (sizeof(struct iphdr)));

    fs_add_uint64(fs, "sport", (uint64_t) ntohs(tcp->source));
    fs_add_uint64(fs, "dport", (uint64_t) ntohs(tcp->dest));
    fs_add_uint64(fs, "seqnum", (uint64_t) ntohl(tcp->seq));
    fs_add_uint64(fs, "acknum", (uint64_t) ntohl(tcp->ack_seq));
    fs_add_uint64(fs, "window", (uint64_t) ntohs(tcp->window));

    if (tcp->rst) { // RST packet
        fs_add_string(fs, "classification", (char*) "rst", 0);
        fs_add_uint64(fs, "success", 0);
    } else { // SYNACK packet
        fs_add_string(fs, "classification", (char*) "synack", 0);
        fs_add_uint64(fs, "success", 1);
    }
}

```

---

via: <https://zmap.io/documentation.html>

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

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


Linux mkdir、tar 和 kill 命令的 4 个有用小技巧

Summary: 我们一直以常规的方式完成一个任务，直到我们知道有更好的处理方法。作为 Linux 技巧和绝招系列 的后续，我会在这里介绍能在各个方面给你帮助的 4 个小技巧。开始吧！  4 个有用的 Linux 小技巧 1. 假设你要创建一个类似于下面很长的/复杂的目录树。实现这最有效的方法是什么呢？ 类似下面要实现的目录树结构。 $ cd /home/$USER/Desktop $ mkdir tecmint $ mkdir tecmint/etc $ mkdir tecmint/lib $ mkdir tecmint/usr $ mkdir tecmint/bin $ mkdir tecmint/tmp $ mkdir tecmint/opt $ mkdir tecmint/var $ mkdir tecmint/etc/x1 $ mkdir

EOF 是什么意思？

End of File

当然，你随便用个别的字符串也可以的。

其实 /bin 下的 kill 可以直接跟进程名来杀死进程

\kill -KILL vim

真的么？你说外置的 /bin/kill 支持进程名杀死？

确实如此

NAME

       kill - terminate a process

SYNOPSIS

       kill [-signal|-s signal|-p] [-q value] [-a] [--] pid|name...

不错，很好的技巧。最受用的是第1个和第4个，因为2、3个之前已经有所了解，学到新的知识就会有一种兴奋的感觉，知识贵在积累。感谢这位仁兄的教程

最后一个pkill的命令还是第一次知道，不错！

实用,好文章,受教.

pkill pgrep 的技巧积累成功！！感谢！！

# Linux mkdir、tar 和 kill 命令的 4 个有用小技巧

我们一直以常规的方式完成一个任务，直到我们知道有更好的处理方法。作为 [Linux 技巧和绝招系列](http://www.tecmint.com/tag/linux-tricks/) 的后续，我会在这里介绍能在各个方面给你帮助的 4 个小技巧。开始吧！

*4 个有用的 Linux 小技巧*

### 1. 假设你要创建一个类似于下面很长的/复杂的目录树。实现这最有效的方法是什么呢？

类似下面要实现的目录树结构。

```
$ cd /home/$USER/Desktop
$ mkdir tecmint
$ mkdir tecmint/etc
$ mkdir tecmint/lib
$ mkdir tecmint/usr
$ mkdir tecmint/bin
$ mkdir tecmint/tmp
$ mkdir tecmint/opt
$ mkdir tecmint/var
$ mkdir tecmint/etc/x1
$ mkdir tecmint/usr/x2
$ mkdir tecmint/usr/x3
$ mkdir tecmint/tmp/Y1
$ mkdir tecmint/tmp/Y2
$ mkdir tecmint/tmp/Y3
$ mkdir tecmint/tmp/Y3/z

```

上述情况可以简单地通过运行下面一行命令来实现。

```
$ mkdir -p /home/$USER/Desktop/tecmint/{etc/x1,lib,usr/{x2,x3},bin,tmp/{Y1,Y2,Y3/z},opt,var}

```

你可以用 tree 命令验证。如果没有安装你可以使用 apt 或 yum 安装 ‘tree’ 软件包。

```
$ tree tecmint

```

*检查目录结构*

我们可以用上面的方式创建任意复杂的目录树结构。注意这仅仅是一个普通的命令，但是用 ‘{}’ 来创建层级目录。需要的时候如果在 shell 脚本中使用是非常有用的。

### 2. 在桌面（/home/$USER/Desktop）创建一个文件（例如 test）并填入以下内容。

```
ABC
DEF
GHI
JKL
MNO
PQR
STU
VWX
Y
Z

```

这种情况一个普通用户会怎么做呢？

a. 他首先会创建文件，最好使用 [touch 命令](http://www.tecmint.com/8-pratical-examples-of-linux-touch-command/)，例如：

```
$ touch /home/$USER/Desktop/test

```

b. 他会用一个文本编辑器打开文件，这可能是 nano、vim 或其它编辑器。

```
$ nano /home/$USER/Desktop/test

```

c. 然后他会将上面的内容输入到文件中，保存并退出。

忽略他/她使用的时间，他至少需要 3 步来执行上面的情况。

一个经验丰富的 Linux 用户会怎么做呢？他会在终端中输入下面的文本然后就完成所有任务。他不需要单独执行每一步。

```
cat << EOF > /home/$USER/Desktop/test
ABC
DEF
GHI
JKL
MNO
PQR
STU
VWX
Y
Z
EOF

```

你可以用 ‘cat’ 命令检查是否成功创建了文件和内容。

```
$ cat /home/avi/Desktop/test

```

### 3. 我们经常在 Linux 中处理归档文件（尤其是 TAR 包）。很多情况下我们会在某些位置，而不是在 Downloads 目录中使用 TAR 包。这种情况下我们怎么做呢？

在这种情况下我们通常会做两件事。

a. 复制/移动 tar 包到目标位置并解压，例如：

```
$ cp firefox-37.0.2.tar.bz2 /opt/
或
$ mv firefox-37.0.2.tar.bz2 /opt/

```

b. cd 到 /opt/ 目录。

```
$ cd /opt/

```

c. 解压 tar 包。

```
# tar -jxvf firefox-37.0.2.tar.bz2

```

我们也可以采用另外一种方式。

我们也可以在 Tar 包所在位置解压并复制/移动解压后的文件到所需的目标位置，例如：

```
$ tar -jxvf firefox-37.0.2.tar.bz2
$ cp -R firefox/  /opt/
或
$ mv firefox/ /opt/

```

不管哪种方式都需要两步才能完成任务。专业的人可以只用一步就完成这个任务：

```
$ tar -jxvf firefox-37.0.2.tar.bz2 -C /opt/

```

-C 选项提取文件到指定目录（这里是 /opt/）。

这并不是关于选项（-C）的问题，**而是习惯的问题**。养成使用带 -C 选项 tar 命令的习惯。这会使你的工作更加轻松。从现在开始不要再移动归档文件或复制/移动解压后的文件了，在 Downloads 文件夹保存 tar 包并解压到你想要的任何地方吧。

### 4. 常规方式我们怎样杀掉一个进程？

最普遍的方法，我们首先用 `ps -A` 命令列出所有进程，然后通过管道输入到 grep 来查找进程/服务（假如 apache2），如下：

```
$ ps -A | grep -i apache2

```

输出样例

```
 1006 ?        00:00:00 apache2
 2702 ?        00:00:00 apache2
 2703 ?        00:00:00 apache2
 2704 ?        00:00:00 apache2
 2705 ?        00:00:00 apache2
 2706 ?        00:00:00 apache2
 2707 ?        00:00:00 apache2

```

上面的输出显示了所有正在运行 apache2 的进程以及它们的 PID，然后你可以使用这些 PID 在下面命令的帮助下杀掉 apache2。

```
# kill 1006 2702 2703 2704 2705 2706 2707

```

然后交叉检查是否还有名称中包含 ‘apache2’ 的进程/服务在运行，如下：

```
$ ps -A | grep -i apache2

```

实际上我们可以使用类似 pgrep 和 pkill 的工具以一种更容易理解的方式实现。你可以使用 pgrep 找到和一个进程相关的信息。假如你要找和 apache2 相关的进程信息，你只需要运行：

```
$ pgrep apache2

```

输出样例

```
15396
15400
15401
15402
15403
15404
15405

```

你也可以通过运行下面命令列出进程名称以及 pid。

```
$ pgrep -l apache2

```

输出样例

```
15396 apache2
15400 apache2
15401 apache2
15402 apache2
15403 apache2
15404 apache2
15405 apache2

```

用 pkill 杀掉进程非常简单。你只需要输入想要杀死的资源名称。我写了一篇关于 pkill 的博文，你可以参考： <http://www.tecmint.com/how-to-kill-a-process-in-linux/>。

用 pkill 杀死一个进程（例如 apache2），你只需要输入以下命令：

```
# pkill apache2

```

你可以通过运行下面命令验证是否杀掉了 apache2。

```
$ pgrep -l apache2

```

它没有输出任何东西并返回到窗口意味着没有名称中包含 apache2 的进程在运行。

这就是我要说的所有东西。上面讨论的点肯定远远不够，但也肯定对你有所帮助。我们不仅仅是介绍教程使你学到一些新的东西，更重要的是想告诉你 ‘**在同样的情况下如何变得更有效率**’。在下面的评论框中告诉我们你的反馈吧。保持联系，继续评论。

---

via: <http://www.tecmint.com/mkdir-tar-and-kill-commands-in-linux/>

作者：[Avishek Kumar](http://www.tecmint.com/author/avishek/) 译者：[ictlyh](https://github.com/ictlyh) 校对：[wxy](https://github.com/wxy)

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