详解 Ubuntu 和 Arch Linux 双启动

![](/data/attachment/album/201802/15/101149ye1nggmi9qy3rh4e.jpg)

Ubuntu 和 Arch Linux 双启动不像听起来那么容易，然而，我将使这个过程尽可能地简单明了。首先，我们需要安装 Ubuntu，然后安装 Arch Linux，因为配置 Ubuntu grub 更容易实现 Ubuntu 和 Arch Linux 双启动。

### Ubuntu 和 Arch Linux 双启动

你需要准备好以下内容：

1、你需要准备你所选择的 Ubuntu 的特色版本，在这个例子中，我将使用 Ubuntu 17.10 ISO 2、两个优盘 3、Windows 或者 Linux 操作系统的 PC 机 4、Arch Linux ISO 5、基于 Windows 的 Rufus 或是基于 Linux 发行版的 etcher 的两款软件中的一种，要根据自己的系统类型来选择哦。

### 安装 Ubuntu

首先, 利用 Rufus 为 Ubuntu 和 Arch Linux [创建可启动的闪存驱动器](http://www.linuxandubuntu.com/home/etcher-burn-images-to-sd-card-make-bootable-usb)。另外，也可以使用 `etcher` 创建 Ubuntu 和 Arch Linux 的可启动闪存驱动器。

[![Ubuntu 可启动 USB 镜像写入工具](/data/attachment/album/201802/15/101149ft82vam896m6m69h.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/bootable-ubuntu-usb-etcher-image-writer_orig.jpg)

为 Ubuntu 选择 ISO 映像文件，然后选择闪存驱动器，然后单击 `Flash!` 创建可引导的闪存驱动器。等到它完成，瞧！你的可启动闪存驱动器已经准备好使用了。

[![在 linux 下创建 Ubuntu USB 启动程序](/data/attachment/album/201802/15/101150mwnfw1wwi71twzzh.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/make-ubuntu-usb-bootable-in-linux_orig.jpg)

打开你的机器并使用载有 Ubuntu 安装媒体的可启动闪存驱动器进行启动。确保引导到 UEFI 或 BIOS 兼容模式，这取决于您所使用的 PC 的类型。我更喜欢使用 UEFI 来构建新的 PC。

[![live Ubuntu 启动](/data/attachment/album/201802/15/101150ijz8feh88oo0ctez.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/live-ubuntu-boot_orig.jpg)

在成功启动后，您将看到如上图显示，要求您尝试 Ubuntu 或安装 Ubuntu，选择安装 Ubuntu。  [![从可启动 USB 安装](/data/attachment/album/201802/15/101151pja8a5a9r5h5fhro.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-usb-from-live-usb_orig.jpg)

然后检查安装第三方软件的图形和 WiFi 硬件、MP3 和其他媒体。如果你有一个互联网连接，你可以选择在安装 Ubuntu 的时候下载更新，因为它会节省安装时间，并且确保安装的是最新更新。

[![自定义磁盘分区安装 Ubuntu](/data/attachment/album/201802/15/101151d8mmnifr0gqsscst.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/custom-partition-hd-install-ubuntu_orig.jpg)

然后选择点击“Something else”，这样我们就可以对硬盘进行分区，并预留出 Ubuntu 和 Archlinux 的分区以及它们的交换分区的空间。  [![创建交换分区](/data/attachment/album/201802/15/101151uvuqipbycsvxbpv5.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/create-swap-partition-ubuntu_orig.jpg)

创建一个交换分区。最好是内存的一半大小。在我的例子中，我有 1 GB 的内存，因此创建一个 512 MB 的交换空间。

[![安装 Ubuntu 到根（/）分区](/data/attachment/album/201802/15/101152cm5166s6gm65uv02.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-ubuntu-root-partition_orig.jpg)

然后创建挂载点为 `/` 的分区，并且点击“Install Now”按钮。

[![选择时区](/data/attachment/album/201802/15/101152mo20nrke057xqger.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/select-ubuntu-timezone_orig.jpg)

接下来选择你的位置以选择语言和键盘设置。

[![选择键盘布局](/data/attachment/album/201802/15/101153z7bqqhrs53hh6ppt.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-ubuntu-select-location-keyboard-layout_orig.jpg)

然后创建新用户的用户凭据。  [![创建用户名、系统名并开始安装](/data/attachment/album/201802/15/101153p39f3efikfl313yc.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/create-username-system-name-ubuntu-install_orig.jpg)

点击“Next”开始安装。  [![ubuntu installation finishing](/data/attachment/album/201802/15/101153sqzwx3g8q8f4uoy0.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/ubuntu-installation-finishing_orig.jpg)

当安装完成后点击“Restart Now”重启 PC。

[![完成 Ubuntu 安装并重启系统](/data/attachment/album/201802/15/101154aw2f7zx11p0jron7.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/ubuntu-installation-finished_orig.jpg)

移除安装媒介，按下回车继续。

[![移除安装媒介](/data/attachment/album/201802/15/101154gvk8f5rvcrfv2imv.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/remove-installation-media-after-ubuntu_orig.jpg)

在确认成功安装后，重新启动并利用 Arch Linux 安装媒介引导。

### 安装 Arch Linux

在引导到 Arch Linux 安装媒体时，您应该看到如下所示的初始屏幕。选择 “Boot Arch Linux(x86\_64)”。注意 Arch Linux 更类似于一种 [DIY](http://www.linuxandubuntu.com/home/arch-linux-take-your-linux-knowledge-to-next-level-review)（自我定制）的操作系统。  [![Arch Linux 安装引导菜单](/data/attachment/album/201802/15/101154yciu3cdiliggti34.jpg)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/arch-linux-installation-boot-menu_orig.jpg)

选择之后，它将打开一个`tty1`终端，您将使用它来安装操作系统。

[![tty终端](/data/attachment/album/201802/15/101155l4hhq2g1xy1mm1v1.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/arch-linux-tty1-linux_orig.png)

注意：为了成功安装 Arch Linux，您需要一个互联网连接来下载一些必须的系统安装包。所以我们需要检查一下互联网是否运行正常。输入以下命令到终端以检查网络连接。

```
ping linuxandubuntu.com -c 4

```

[![检查互联网连接](/data/attachment/album/201802/15/101155twxcpakr1xa1qaka.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/arch-linux-ping-check-internet-connection_orig.png)

如果互联网运行正常，你应该得到一个回显，显示发送和接收的数据包的数量。在这种情况下，我们发送了 4 个包，并得到了 4 个反馈，这意味着连接是正常的。

如果想在 Arch Linux 中设置 Wifi，请阅读[本文](http://www.linuxandubuntu.com/home/how-to-setup-a-wifi-in-arch-linux-using-terminal)以在 Arch Linux 中配置 Wifi。  接下来，我们需要选择之前在安装 Ubuntu 时预留出的空闲分区。

```
fdisk -l

```

上面的命令应该显示可用的磁盘分区在哪里。您应该能看到 Ubuntu 分区以及预留的空闲空间。我们将使用 `cfdisk`命令进行分区。

```
cfdisk

```

[![利用cfdisk命令安装 Arch 分区](/data/attachment/album/201802/15/101155ip31forbzp6f6o6b.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-arch-partition-disk-with-cfdisk_orig.png)

执行命令后将看到分区情况。选择其它已分配分区下面的空闲空间。

您需要选择 “New”，然后输入分区大小。

[![为 Archlinux 分区](/data/attachment/album/201802/15/101156yiuvwraszi6ku6ae.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/partition-free-space-swap-arch-linux_orig.png)

例如，9.3G - G 表示千兆字节。

[![挂载 Arch Linux 分区](/data/attachment/album/201802/15/101156q613z03evnyqgvjz.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-arch-linux-partition_orig.png)

如下图所示，选择“primary”进行分区

[![将 Arch Linux 的根（root）分区设置成主分区](/data/attachment/album/201802/15/101157hlsznshszobhlgbl.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/make-arch-linux-root-as-primary-partition_orig.png)

然后选择写分区条目。

[![选择分区安装 Arch](/data/attachment/album/201802/15/101157uh1ltze0l0w2ch0e.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/select-partition-to-install-arch_orig.png)

键入“yes”，以确认写入分区表。  [![确认创建分区并安装 Arch Linux](/data/attachment/album/201802/15/101157p6xcxxxh7zw7j7n6.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-arch-linux-confirm-create-partition_orig.png)

然后选择 “Quit”（退出）选项。

[![退出 Arch Linux 的‘cfdisk’](/data/attachment/album/201802/15/101158as5lvnvyx9s7znsl.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/quit-cfdisk-arch-linux_orig.png) 然后键入：

```
fdisk -l

```

确认修改。

[![确认分区修改](/data/attachment/album/201802/15/101158m9szsfg2swishv1v.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/confirm-partition-changes_orig.png)

然后使用磁盘分区命令：

```
mkfs.ext4 /dev/sda3

```

确保您选择的分区是我们创建的最后一个分区，这样我们就不会破坏 Ubuntu 分区。  [![完成 Arch Linux 分区安装](/data/attachment/album/201802/15/101158vzs4du3osi5hol65.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/complete-arch-linux-installation-partition_orig.png)

然后使用以下命令安装这个分区：

```
mount /dev/sda3 /mnt

```

[![安装基础分区](/data/attachment/album/201802/15/101159eznmnhf90uhdfmhm.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/mount-base-partition-in-arch-linux.png)

用下面命令创建“home”目录：

```
mkdir .mnt/home

```

[![安装家目录](/data/attachment/album/201802/15/101159bv72blxvkslvw0ll.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/mount-home-partition-arch-linux.png)

用以下命令安装“home”目录到这个分区上：

```
mount /dev/sda3 /mnt/home

```

[![安装家目录](/data/attachment/album/201802/15/101159xhdik647ny466h4l.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/make-mount-home-directory.png)

现在使用以下命令安装 Archlinux 的基本系统：

```
pacstrap /mnt base

```

请确保网络连接正常。

接下来开始下载和配置安装所用时间取决于你的网速。

[![安装Arch Linux 基础系统](/data/attachment/album/201802/15/101200k4aala2s6b20bz0p.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/install-arch-linux-base.png)

这一步骤完成后，将完成 Archlinux 基本安装。

Arch Linux 基础系统安装完成后，使用以下命令创建一个 `fstab` 文件：

```
genfstab -U /mnt >> /mnt/etc/fstab

```

[![创建 fstab文件](/data/attachment/album/201802/15/101200xhjfeh3k1heze3jk.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/create-fstab-file-in-arch-linux.png)

在此之后，您需要验证`fstab`文件，使用下面命令:

```
cat /mnt/etc/fstab

```

[![查看 fstab 文件的终端显示](/data/attachment/album/201802/15/101200tgqjojjj989sqojg.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/cat-fstab-file-data-terminal.png)

### 配置 Arch Linux 的基础配置

您将需要在安装时配置以下内容：

1. 系统语言和系统语言环境
2. 系统时区
3. Root 用户密码
4. 设置主机名

首先，您需要使用以下命令将`root`切换为新安装的基础系统用户：

```
arch-chroot /mnt

```

#### 1. 系统语言和系统语言环境

然后必须配置系统语言。必须取消对 en\_Utf-8 UTF-8的注释，并加载到文件 `/etc/local.gen` 中。

键入：

```
nano /etc/local.gen

```

然后将 en\_UTF-8 UTF-8 取消注释。

键入命令：

```
locale-gen

```

生成本地化设置如下：

[![生成本地化配置](/data/attachment/album/201802/15/101200mk1qzqznkx3tlqte.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/generate-localization-arch-linux.png)

相应的需要在 `locale.conf` 文件中配置 LANG 变量。例如：

```
nano /etc/locale.conf

```

修改为：

```
LANG=en_US.UTF-8

```

配置键盘布局，则在文件 `vconsole.conf` 中进行更改，如下操作：

```
nano /etc/vconsole.conf

```

修改为：

```
KEYMAP=us-eng

```

#### 2. 系统时区

配置时区需要利用以下命令实现：

```
ln -sf /usr/share/zoneinfo/Region/City /etc/localtime

```

要查看可用时区，可以在终端使用以下命令：

注意可选时区在屏幕截图中显示为蓝色：

```
ls /usr/share/zoneinfo

```

[![配置时区文件](/data/attachment/album/201802/15/101201wspsgwqu9b9xu1e8.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/setup-zonefile-in-arch-linux.png)

[![配置地区](/data/attachment/album/201802/15/101201tkuk87hjfk7djjj2.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/setup-country-zonefile_orig.png)

运行 `hwclock` 命令来生成 `/etc/adjtime`（假设硬件时钟被设置为 UTC）：

```
# hwclock --systohc

```

#### 3. 配置 root 用户密码

要为 Arch Linux 系统用户 root 设置密码，请使用：

```
passwd

```

为 root 用户提供一个新的密码并确认密码使其生效。

[![配置系统用户root密码](/data/attachment/album/201802/15/101202yulu9yjbyjjlbsbh.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/setup-arch-linux-root-password.png)

#### 4. 配置主机名和网络

需要创建主机名文件：

```
nano /etc/hostname

```

[![配置主机名](/data/attachment/album/201802/15/101202hyagw8dgakaaazkx.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/set-arch-linux-hostname.png)

将名字更改为您的用户名:

[![set arch linux username](/data/attachment/album/201802/15/101202d5cbd066m0405465.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/set-arch-linux-username.png)

然后向主机添加一个匹配的条目：

```
nano /etc/hosts

```

```
127.0.0.1 localhost.localdomain localhost

::1 localhost.localdomain localhost

127.0.1.1 LinuxandUbuntu.localdomain LinuxandUbuntu

```

您需要使网络保持连接，然后使用：

```
systemctl enable dhcpd

```

#### 配置 Grub

然后重启机器，进入 Ubuntu 配置 grub。

你可以键入：

```
reboot

```

[![安装完成后重启](/data/attachment/album/201802/15/101202rokdiwwwm7mooiig.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/reboot-system-after-arch-linux-installation.png)

Arch Linux 仍然没有出现，因此我们需要在 Ubuntu 中使用 `update-grub` 来安装它。

[![Ubuntu grub 菜单](/data/attachment/album/201802/15/101203zvarrlirrauvz3ai.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/edited/ubuntu-grub-menu.png)

在Ubuntu中打开终端，输入:

```
sudo update-grub

```

这将更新 grub，添加 Arch Linux 记录。

### 小结

祝贺您成功地将 Ubuntu 和 Arch Linux 设置为双引导。Ubuntu 安装很简单，但是 Arch Linux 安装对新的 Linux 用户来说是一个挑战。我试着让这个教程变得简单。但是如果你对这篇文章有任何疑问，请在评论部分告诉我。还可以与您的朋友分享这篇文章，并帮助他们学习 Linux。

---

via: <http://www.linuxandubuntu.com/home/dual-boot-ubuntu-and-arch-linux>

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

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


谨慎使用 Linux find 命令

>
> 当使用 Linux 下的 find 命令时，请使用 -ok 选项来避免文件被意外删除，这个选项会在移除任何文件之前都会请求你的许可。
>
>
>

![](/data/attachment/album/201802/15/184844iwhl7fwuph7zlvwv.jpg)

最近有朋友提醒我有一个有用的选项来更加谨慎地运行 `find` 命令，它就是 `-ok`。除了一个重要的区别之外，它的工作方式与 `-exec` 相似，它使 `find` 命令在执行指定的操作之前请求权限。

这有一个例子。如果你使用 `find` 命令查找文件并删除它们，你可能使用的是下面的命令：

```
$ find . -name runme -exec rm {} \;

```

在当前目录及其子目录中中任何名为 “runme” 的文件都将被立即删除 —— 当然，你要有权限删除它们。改用 `-ok` 选项，你会看到类似这样的东西，但 `find` 命令将在删除文件之前会请求权限。回答 `y` 代表 “yes” 将允许 `find` 命令继续并逐个删除文件。

```
$ find . -name runme -ok rm {} \;
< rm ... ./bin/runme > ?

```

### -execdir 命令也是一个选择

另一个可以用来修改 `find` 命令行为，并可能使其更可控的选项是 `-execdir` 。`-exec` 会运行指定的任何命令，而 `-execdir 则从文件所在的目录运行指定的命令，而不是在运行`find` 命令的目录运行指定的命令。这是两个它的例子：

```
$ pwd
/home/shs
$ find . -name runme -execdir pwd \;
/home/shs/bin

```

```
$ find . -name runme -execdir ls \;
ls rm runme

```

到现在为止还挺好。但要记住的是，`-execdir` 也会在匹配文件的目录中执行该命令。如果运行下面的命令，并且目录包含一个名为 “ls” 的文件，那么即使该文件*没有*执行权限，它也将运行该文件。使用 `-exec` 或 `-execdir` 类似于通过 `source` 来运行命令。

```
$ find . -name runme -execdir ls \;
Running the /home/shs/bin/ls file

```

```
$ find . -name runme -execdir rm {} \;
This is an imposter rm command

```

```
$ ls -l bin
total 12
-r-x------ 1 shs shs 25 Oct 13 18:12 ls
-rwxr-x--- 1 shs shs 36 Oct 13 18:29 rm
-rw-rw-r-- 1 shs shs 28 Oct 13 18:55 runme

```

```
$ cat bin/ls
echo Running the $0 file
$ cat bin/rm
echo This is an imposter rm command

```

### -okdir 选项也会请求权限

要更谨慎，可以使用 `-okdir` 选项。类似 `-ok`，该选项将请求权限来运行该命令。

```
$ find . -name runme -okdir rm {} \;
< rm ... ./bin/runme > ?

```

你也可以小心地指定你想用的命令的完整路径，以避免像上面那样的冒牌命令出现的任何问题。

```
$ find . -name runme -execdir /bin/rm {} \;

```

`find` 命令除了默认打印之外还有很多选项，有些可以使你的文件搜索更精确，但谨慎一点总是好的。

在 [Facebook](https://www.facebook.com/NetworkWorld/) 和 [LinkedIn](https://www.linkedin.com/company/network-world) 上加入 Network World 社区来进行评论。

---

via: <https://www.networkworld.com/article/3233305/linux/using-the-linux-find-command-with-caution.html>

作者：[Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) 译者：[geekpi](https://github.com/geekpi) 校对：[Locez](https://github.com/locez)

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


在 Linux 上安装和使用 Docker

Summary: Docker 使得创建、部署，和管理容器变得特别简单。更好的是，安装和使用 Docker 在 Linux 平台上特别的方便。

![](/data/attachment/album/201802/15/190609ee2ru2cduc5puinu.jpg)

容器现在风靡于 IT 界 —— 这很好理解。容器是轻量级的，包含应用运行所需所有东西（代码、库、运行时环境、系统设置，以及依赖关系）的独立的包。每个容器都部署于它自己的 CPU、内存、块 I/O，以及网络资源上，所有这些都不依赖于某个内核和操作系统。这也是容器与虚拟机之间最大的不同；相比之下，虚拟机是一个运行于宿主机操作系统上的完整的操作系统平台，而容器不是。

容器允许你以一种前所未有的方式扩展交付能力（不管内部还是外部的）。例如，你可以快速部署多个 NGINX 实例（甚至可以应用于多个不同的阶段 —— 比如开发和生产阶段）。跟虚拟机不同，容器不会消耗太多系统资源。

[Docker](https://www.docker.com/) 使得创建、部署，和管理容器变得特别简单。更好的是，安装和使用 Docker 在 Linux 平台上特别的方便。

我将会向你演示在 Linux 上安装 Docker 是多么方便，同时带你入门 Docker。我的演示平台是 [Ubuntu 16.04 Server](http://releases.ubuntu.com/16.04/)，但流程在大多数其它 Linux 平台都差不多。

我这里假设你已经启动了 Ubuntu Server 16.04。

### 安装

由于 Ubuntu Server 16.04 缺少图形界面，我会完全通过命令行来安装和使用 Docker。在你安装前，你需要更新 `apt` 然后进行必要的升级。一定要注意，若系统内核升级了，你会需要重启系统。因此最好挑个服务器能重启的时间进行。

运行下面命令更新 `apt`：

```
sudo apt update

```

完成后，使用命令升级系统：

```
sudo apt upgrade

```

若内核升级了，你需要用下面命令重启服务器：

```
sudo reboot

```

若内核没有升级，你就可以安装 Docker 了（无需重启）。安装 Docker 的命令为：

```
sudo apt install docker.io

```

若你使用的是其它 Linux 发行版，当尝试用相应的包管理器来安装时却发现没有 `docker.io` 包，则你应该安装 `docker` 包。例如，在 [Fedora](https://getfedora.org/) 上安装应该用命令：

```
sudo dnf install docker

```

若你使用的是 CentOS 7，那么最好使用安装脚本来安装 docker。首先使用命令 `sudo yum check-update` 更新系统。升级完后，输入下面命令来下载并运行所需的脚本：

```
curl -fsSL https://get.docker.com/ | sh

```

默认情况下，只有管理员权限能够运行 docker 命令。考虑到安全问题，你不会想用 root 用户或使用 `sudo` 来运行 Docker 的。要解决这个问题，你需要将自己的用户加入到 docker 组中。命令如下：

```
sudo usermod -a -G docker $USER

```

完成操作后，登出系统然后再重新登录，应该就搞定了。不过若你的平台是 Fedora，则添加用户到 docker 组时会发现这个组是不存在的。那该怎么办呢？你需要首先创建这个组。命令如下：

```
sudo groupadd docker && sudo gpasswd -a ${USER} docker && sudo systemctl restart docker
newgrp docker

```

登出后再登录。就可以开始用 Docker 了。

### 启动，暂停以及启用 Docker

安装好 Docker 后，你可以让系统在启动时自动启动 Docker 守护进程。使用下面两个命令来实现这一点：

```
sudo systemctl start docker
sudo systemctl enable docker

```

若需要暂停或重启 Docker 守护进程，则命令为：

```
sudo systemctl stop docker
sudo systemctl restart docker

```

现在可以用 Docker 来部署容器了。

### 拉取镜像

对 Docker 来说，镜像是构建容器的基石。你可以拉下一个镜像（比如 [NGINX](https://www.nginx.com/)）然后根据这个镜像部署任意多个容器出来。使用镜像前，你首先需要把镜像拉取到系统中。镜像从注册仓库中拉取，默认情况下安装好的 Docker 包含了一个默认的注册仓库 [Docker Hub](https://hub.docker.com/) —— 这个注册仓库包含了大量别人所贡献的镜像（既包括官方的镜像，也包括用户自己贡献的镜像）。

假设你想要拉取一个 Nginx Web 服务器相关的镜像。在开始拉取前，先检查一下系统中已经有了哪些镜像。输入 `docker images` 命令你会发现现在还没有镜像存在（图 1）。

![Docker](/data/attachment/album/201802/15/190610zkzgts0lk0519xwd.jpg "Docker")

*图 1：还没有镜像。*

让我们来拉取一个镜像。使用下面命令可以从 Docker Hub 中下载 Nginx 镜像：

```
docker pull nginx

```

上面命令会从 Docker Hub 下载最新的（官方的） Nginx 镜像。现在再运行 `docker images` 命令就能看到有列出镜像了（图 2）。

![Docker](/data/attachment/album/201802/15/190610rcjqujoejbujanvr.jpg "Docker")

*图 2：NGINX 镜像已经被拉取下来了。*

注意到我这里说的是“官方” Nginx 镜像了吗？在 Docker Hub 上有很多的非官方 Nginx 镜像。这些非官方镜像都是基于各种不同的目的而创建出来的。你可以使用下面过命令来搜索 Docker Hub 中的所有 Nginx 镜像：

```
docker search nginx

```

你会发现（图 3 中），有很多基于不同目的所创建的 Nginx 镜像（反向代理、PHP-FPM（LCTT 译注：<ruby> FastCGI 进程管理器 <rt>  FastCGI Process Manager </rt></ruby>是一个 PHPFastCGI 管理器，旨在将 FastCGI 进程管理整合进 PHP 包中）功能、LetsEncrypt（LCTT 译注：由 ISRG 提供的免费 SSL 项目），Bitnami，在树莓派上使用的 Nginx 和 Drupal，等等很多很多)。

![Docker hub](/data/attachment/album/201802/15/190611t42a9cttzc59ckvc.jpg "Docker hub")

*图 3：Docker Hub 上找到的各种 NGINX 镜像。*

假设，你想要下载内建有反向代理功能的 Nginx 镜像，有个非官方的镜像 jwilder/nginx-proxy。因此输入下面命令来拉取这个镜像：

```
docker pull jwilder/nginx-proxy

```

再输入 `docker images` 命令来查看新拉下来的这个镜像（图 4）。

![Nginx](/data/attachment/album/201802/15/190611y1cm9ggcw707w9wz.jpg "Nginx")

*图 4：已经有了两种不同的 NGINX 镜像了。*

处于谨慎考虑，我建议只使用官方镜像，毕竟你无法确定非官方镜像是否包含了恶意代码。

有了镜像后就可以用它来部署容器了。下次我们再聊聊如何通过这些 Nginx 镜像来发布容器。

Docker 是一个超级强力的系统可以让你的工作更简单，让你的公司更具有伸缩性，也更灵活。想知道 Docker 还能做什么，运行 `man docker` 然后阅读它的帮助文档吧。

---

via: <https://www.linux.com/learn/intro-to-linux/2017/11/how-install-and-use-docker-linux>

作者：[Jack Wallen](https://www.linux.com/users/jlwallen) 译者：[lujun9972](https://github.com/lujun9972) 校对：[wxy](https://github.com/wxy)

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


我是被 “root@notty” 黑了吗？

Summary: 当你在 ps aux 的输出中看到 sshd：root@notty 时会觉得很奇怪吧，notty 算是哪门子的主机，是不是黑客计算机的名字啊。

![](/data/attachment/album/201802/16/201244lhzdhhc99jtjn90n.jpg)

当你在 `ps aux` 的输出中看到 `sshd：root@notty` 时会觉得很奇怪吧，`notty` 算是哪门子的主机，是不是黑客计算机的名字啊。不过不用担心；`notty` 仅仅是表示 没有 tty 而已。

当你在本地登录 Linux 机器时，登录终端会在进程列表中显示为 `tty`（ 比如，tty7）。若你通过 ssh 登录一台远程服务器，则会看到类似 `root@pts/0` 这样的东西。

而若某个连接是由 sftp 或者是由 scp 拷贝文件而创建的，则该连接会会显示成没有 tty （notty）。

如果你仍然想知道服务器上发生了什么事情，可以检查 `ps auxf` 的输出来查看进程树，或者运行 `netstat -vatn` 来检查所有的 TCP 连接。

---

via: <http://www.sysadminworld.com/2011/ps-aux-shows-sshd-rootnotty/>

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

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


如何在 Linux/Unix 之上绑定 ntpd 到特定的 IP 地址

Summary: NTP 是网络时间协议的首字母简写，这是一个用来同步两台电脑之间时间的协议。ntpd 是一个操作系统守护进程，可以设置并且保证系统的时间与互联网标准时间服务器同步。

默认的情况下，我们的 ntpd/NTP 服务器会监听所有的端口或者 IP 地址，也就是：`0.0.0.0:123`。 怎么才可以在一个 Linux 或是 FreeBSD Unix 服务器上，确保只监听特定的 IP 地址，比如 `localhost` 或者是 `192.168.1.1:123` ？

NTP 是<ruby> 网络时间协议 <rt>  Network Time Protocol </rt></ruby>的首字母简写，这是一个用来同步两台电脑之间时间的协议。ntpd 是一个操作系统守护进程，可以设置并且保证系统的时间与互联网标准时间服务器同步。

![](/data/attachment/album/201802/16/205909z7iy3yhnfineelif.jpg)

NTP 使用 `/etc/directory` 之下的 `ntp.conf` 作为配置文件。

### /etc/ntp.conf 之中的端口指令

你可以通过设置端口命令来防止 ntpd 监听 `0.0.0.0:123`，语法如下：

```
interface listen IPv4|IPv6|all
interface ignore IPv4|IPv6|all
interface drop IPv4|IPv6|all

```

上面的配置可以使 `ntpd` 监听那个地址或者不出来任何请求而直接丢弃。`ignore` 会防止打开匹配的地址，`drop` 会导致 ntpd 打开该地址并丢弃所有接收到的包，而不做任何检查。举个例子，如果要忽略所有端口之上的监听，加入下面的语句到 `/etc/ntp.conf`：

```
interface ignore wildcard

```

如果只监听 127.0.0.1 和 192.168.1.1 则是这样：

```
interface listen 127.0.0.1
interface listen 192.168.1.1

```

这是我 FreeBSD 云服务器上的样例 `/etc/ntp.conf` 文件：

```
$ egrep -v '^#|$^' /etc/ntp.conf

```

样例输出为：

```
tos minclock 3 maxclock 6
pool 0.freebsd.pool.ntp.org iburst
restrict    default limited kod nomodify notrap noquery nopeer
restrict -6 default limited kod nomodify notrap noquery nopeer
restrict    source  limited kod nomodify notrap noquery
restrict 127.0.0.1
restrict -6 ::1
leapfile "/var/db/ntpd.leap-seconds.list"
interface ignore wildcard
interface listen 172.16.3.1
interface listen 10.105.28.1

```

### 重启 ntpd

在 FreeBSD Unix 之上重新加载/重启 ntpd：

```
$ sudo /etc/rc.d/ntpd restart

```

或者 [在 Debian 和 Ubuntu Linux 之上使用下面的命令](https://www.cyberciti.biz/faq/restarting-ntp-service-on-linux/)：

```
$ sudo systemctl restart ntp

```

或者 [在 CentOS/RHEL 7/Fedora Linux 之上使用下面的命令](https://www.cyberciti.biz/faq/restarting-ntp-service-on-linux/)：

```
$ sudo systemctl restart ntpd

```

### 校验

使用 `netstat` 和 `ss` 命令来检查 ntpd 只绑定到了特定的 IP 地址：

```
$ netstat -tulpn | grep :123

```

或是：

```
$ ss -tulpn | grep :123

```

样例输出：

```
udp        0      0 10.105.28.1:123         0.0.0.0:*                           -
udp        0      0 172.16.3.1:123          0.0.0.0:*                           -

```

[在 FreeBSD Unix 服务器上使用 sockstat 命令](https://www.cyberciti.biz/faq/freebsd-unix-find-the-process-pid-listening-on-a-certain-port-commands/)：

```
$ sudo sockstat
$ sudo sockstat -4
$ sudo sockstat -4 | grep :123

```

样例输出：

```
root     ntpd       59914 22 udp4   127.0.0.1:123         *:*
root     ntpd       59914 24 udp4   127.0.1.1:123         *:*

```

---

作者是 nixCraft 的创始人并且是一位经验丰富的系统管理员、DevOps 工程师，也是一名 Linux 操作系统和 Unix shell 脚本的训练师。他为全球不同行业，包括 IT、教育业、安全防护、空间研究和非营利性组织的客户工作。关注他的 [Twitter](https://twitter.com/nixcraft), [Facebook](https://facebook.com/nixcraft), [Google+](https://plus.google.com/+CybercitiBiz)。

---

via: <https://www.cyberciti.biz/faq/how-to-bind-ntpd-to-specific-ip-addresses-on-linuxunix/>

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

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


如何使用特殊权限：setuid、setgid 和 sticky 位

![](/data/attachment/album/201802/16/211924c1psmdn0b8szk19m.jpg)

### 目标

了解特殊权限的工作原理，以及如何识别和设置它们。

### 要求

* [了解标准的 Unix / Linux 权限系统](/article-7460-1.html)

### 难度

简单

### 约定

* `#` - 要求直接以 root 用户或使用 `sudo` 命令执行指定的命令
* `$` - 用普通的非特权用户来执行指定的命令

### 介绍

通常，在类 Unix 操作系统上，文件和目录的所有权是基于文件创建者的默认 `uid`（user-id）和 `gid`（group-id）的。启动一个进程时也是同样的情况：它以启动它的用户的 `uid` 和 `gid` 运行，并具有相应的权限。这种行为可以通过使用特殊的权限进行改变。

### setuid 位

当使用 setuid （设置用户 ID）位时，之前描述的行为会有所变化，所以当一个可执行文件启动时，它不会以启动它的用户的权限运行，而是**以该文件所有者的权限运行**。所以，如果在一个可执行文件上设置了 setuid 位，并且该文件由 root 拥有，当一个普通用户启动它时，它将以 root 权限运行。显然，如果 setuid 位使用不当的话，会带来潜在的安全风险。

使用 setuid 权限的可执行文件的例子是 `passwd`，我们可以使用该程序更改登录密码。我们可以通过使用 `ls` 命令来验证：

```
ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27768 Feb 11 2017 /bin/passwd

```

如何识别 `setuid` 位呢？相信您在上面命令的输出已经注意到，`setuid` 位是用 `s` 来表示的，代替了可执行位的 `x`。小写的 `s` 意味着可执行位已经被设置，否则你会看到一个大写的 `S`。大写的 `S` 发生于当设置了 `setuid` 或 `setgid` 位、但没有设置可执行位 `x` 时。它用于提醒用户这个矛盾的设置：如果可执行位未设置，则 `setuid` 和 `setgid` 位均不起作用。setuid 位对目录没有影响。

### setgid 位

与 `setuid` 位不同，`setgid` （设置组 ID）位对文件和目录都有影响。在第一个例子中，具有 `setgid` 位设置的文件在执行时，不是以启动它的用户所属组的权限运行，而是**以拥有该文件的组运行**。换句话说，进程的 `gid` 与文件的 `gid` 相同。

当在一个目录上使用时，`setgid` 位与一般的行为不同，它使得在所述目录内创建的文件，不属于创建者所属的组，而是属于父目录所属的组。这个功能通常用于文件共享（目录所属组中的所有用户都可以修改文件）。就像 setuid 一样，setgid 位很容易识别（我们用 test 目录举例）：

```
ls -ld test
drwxrwsr-x. 2 egdoc egdoc 4096 Nov 1 17:25 test

```

这次 `s` 出现在组权限的可执行位上。

### sticky 位

sticky （粘连）位的工作方式有所不同：它对文件没有影响，但当它在目录上使用时，所述目录中的所有文件只能由其所有者删除或移动。一个典型的例子是 `/tmp` 目录，通常系统中的所有用户都对这个目录有写权限。所以，设置 sticky 位使用户不能删除其他用户的文件：

```
$ ls -ld /tmp
drwxrwxrwt. 14 root root 300 Nov 1 16:48 /tmp

```

在上面的例子中，目录所有者、组和其他用户对该目录具有完全的权限（读、写和执行）。sticky 位在可执行位上用 `t` 来标识。同样，小写的 `t` 表示可执行权限 `x`也被设置了，否则你会看到一个大写字母 `T`。

### 如何设置特殊权限位

就像普通的权限一样，特殊权限位可以用 `chmod` 命令设置，使用数字或者 `ugo/rwx` 格式。在前一种情况下，`setuid`、`setgid` 和 `sticky` 位分别由数值 4、2 和 1 表示。例如，如果我们要在目录上设置 `setgid` 位，我们可以运行：

```
$ chmod 2775 test

```

通过这个命令，我们在目录上设置了 `setgid` 位（由四个数字中的第一个数字标识），并给它的所有者和该目录所属组的所有用户赋予全部权限，对其他用户赋予读和执行的权限（目录上的执行位意味着用户可以 `cd` 进入该目录或使用 `ls` 列出其内容）。

另一种设置特殊权限位的方法是使用 `ugo/rwx` 语法：

```
$ chmod g+s test

```

要将 `setuid` 位应用于一个文件，我们可以运行：

```
$ chmod u+s file

```

要设置 sticky 位，可运行：

```
$ chmod o+t test

```

在某些情况下，使用特殊权限会非常有用。但如果使用不当，可能会引入严重的漏洞，因此使用之前请三思。

---

via: <https://linuxconfig.org/how-to-use-special-permissions-the-setuid-setgid-and-sticky-bits>

作者：[Egidio Docile](https://linuxconfig.org) 译者：[jessie-pang](https://github.com/jessie-pang) 校对：[wxy](https://github.com/wxy)

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


Linux mkdir 命令的初学者教程

Summary: 在这篇教程中，我将使用一些易于理解的例子来讲解这个工具的基本用法。

在这篇教程中，我将使用一些易于理解的例子来讲解这个工具的基本用法。

![](/data/attachment/album/201802/17/124700v1sssrbsovwoe18y.jpg)

当你使用命令行的时候，无论什么时候，你都位于一个目录中，它告诉了命令行当前所位于的完整目录。在 Linux 中，你可以使用 [rm](/article-9321-1.html) 命令删除目录，但是首先，你需要使用 `mkdir` 命令来创建目录。在这篇教程中，我将使用一些易于理解的例子来讲解这个工具的基本用法。

在开始之前，值得一提的是，这篇教程中的所有例子都已经在 Ubuntu 16.04 LTS 中测试过。

### Linux mkdir 命令

正如上面所提到的，用户可以使用 `mkdir` 命令来创建目录。它的语法如下：

```
mkdir [OPTION]... DIRECTORY...

```

下面的内容是 man 手册对这个工具的描述：

>
> 如果目录还不存在，则创建之。
>
>
>

下面这些 Q&A 式的例子将能够帮助你更好的理解 `mkdir` 这个命令是如何工作的。

### Q1. 如何使用 `mkdir` 命令创建目录？

创建目录非常简单，你唯一需要做的就是把你想创建的目录的名字跟在 `mkdir` 命令的后面作为参数。

```
mkdir [dir-name]

```

下面是一个简单例子：

```
mkdir test-dir

```

### Q2. 如何确保当父目录不存在的时候，同时创建父目录？

有时候，我们需要使用一条 `mkdir` 命令来创建一个完整的目录结构，这时候，你只需要使用 `-p` 这个命令行选项即可。

比如，你想创建目录 `dir1/dir2/dir3`，但是，该目录的父目录都不存在，这时候，你可以像下面这样做：

```
mkdir -p dir1/dir2/dir3

```

[![How to make sure parent directories (if non-existent) are created](/data/attachment/album/201802/17/124712ke4vbazwtebta4eb.png)](https://www.howtoforge.com/images/command-tutorial/big/mkdir-p.png)

### Q3. 如何在创建目录时自定义权限？

默认情况下，`mkdir` 命令创建目录时会把权限设置为 `rwx, rwx, r-x` 。

[![How to set permissions for directory being created](/data/attachment/album/201802/17/124715j7jd9jt9jzc95vth.png)](https://www.howtoforge.com/images/command-tutorial/big/mkdir-def-perm.png)

但是，如果你想自定义权限，那么你可以使用 `-m` 这一命令行选项。

[![mkdir -m command option](/data/attachment/album/201802/17/124716pqzvq22qyxqqytcq.png)](https://www.howtoforge.com/images/command-tutorial/big/mkdir-custom-perm.png)

### Q4. 如何使 `mkdir` 命令显示操作细节？

如果你希望 `mkdir` 命令显示它所执行的操作的完整细节，那么你可以使用 `-v` 这一命令行选项。

```
mkdir -v [dir]

```

下面是一个例子：

[![How to make mkdir emit details of operation](/data/attachment/album/201802/17/124719w9sdmccbhmbuw2hv.png)](https://www.howtoforge.com/images/command-tutorial/big/mkdir-verbose.png)

### 结论

你已经看到，`mkdir` 是一个非常简单，易于理解和使用的命令。学习这一命令不会遇到任何屏障。在这篇教程中，我们讨论到了它的绝大部分命令行选项。记得练习这些命令，并在日复一日的工作中使用这些命令。如果你想了解关于这一命令的更过内容，请查看它的 [man](https://linux.die.net/man/1/mkdir) 手册。

---

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

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

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


为初学者准备的 Linux rmdir 命令案例教程

Summary: 在 Linux 命令行上删除文件和目录，我们已经讨论过 rm 命令 的使用。然而，这里有另一个相关的命令行工具，专门针对目录的删除。这是所指的工具就是 rmdir，本教程中，我们将根据一些简单的实例来讨论它。

![](/data/attachment/album/201802/17/125918w3uwdp9b9sebabdi.jpg)

在 Linux 命令行上删除文件和目录，我们已经讨论过 [rm 命令](/article-9321-1.html) 的使用。然而，这里有另一个相关的命令行工具，专门针对目录的删除。这是所指的工具就是 `rmdir`，本教程中，我们将根据一些简单的实例来讨论它。

### Linux rmdir 命令

见名知意，`rmdir`（remove directory） 命令专门针对删除目录，不过通常目录内空空如也。如下是它的语法：

```
rmdir [OPTION]... DIRECTORY...

```

下面是 man 文档的说明：

>
> 如目录为空，则删除之。
>
>
>

在理解此程序如何工作，下面的 Q&A 风格的案例可能会给您带来更好的灵感。

### Q1. rmdir 命令如何工作？

这非常直接，只需将目录名作为输入参数传递给它。

比如：

```
rmdir test-dir

```

[![rmdir 命令如何工作](/data/attachment/album/201802/17/125931w7gf7s7gupifjes0.png)](https://www.howtoforge.com/images/command-tutorial/big/rm-basic-usage1.png)

### Q2. 如何让 rmdir 忽略非空目录？

通常情况下，`rmdir` 命令会在您删除非空目录时抛出一个错误。然而，如果需要的话，您可以使用 `--ignore-fail-on-non-empty` 选项，忽略它。

比如说：

[![如何让 rmdir 忽视非空目录](/data/attachment/album/201802/17/125931uz7cvhkk0xvqv5hk.png)](https://www.howtoforge.com/images/command-tutorial/big/rmdir-ignore-nonempty.png)

### Q3. 如何让 rmdir 命令移除父目录？

和 [mkdir](/article-9356-1.html) 一样，您可以通过要求 `rmdir` 命令在其父目录执行操作。这意味着，您可以一次性删除目录和目录的上级目录。这个功能可以通过 `-p` 命令选项实现。

比如，下面的命令将会删除 “test” 和 “test-dir” 目录。

```
rmdir -p test/test-dir/

```

注意： 欲此操作生效，所有被删除的父目录都不应该包含要被删除的空目录之外的任何目录。

### Q4. rmdir 和 rm -r 有何区别？

如果还有印象，您还可以通过提供 `-r` 选项的 `rm` 命令删除目录。那 `rmdir` 和 `rm -r` 区别何在？`rmdir` 仅对空目录生效 —— 您没有办法使用 rmdir 删除非空目录。

因此，`rmdir` 在删除需要检测目录是否为空的情况下，是一个有效的工具。

### 总结

相信您会认同，`rmdir` 并不是一个难以理解和使用的复杂命令。除此之外，它仅提供少量命令行选项。在此，我们几乎讨论了所有的选项，如果您想掌握的更好，练习在本教程提到的案例即可。关于 `rmdir`，[这里另有 man 文档](https://linux.die.net/man/1/rmdir)，备您不时之需。

---

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

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

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


在 Linux 上检查网络连接的更多方法

>
> 有几个命令可以帮助你在 Linux 系统上看到网络状况，这些包括 ip、ethtool、traceroute、tcptraceroute 和 tcpdump。
>
>
>

![](/data/attachment/album/201802/17/132109q2w28zeu9m43me9w.jpg)

`ifconfig` 和 `netstat` 命令当然非常有用，但还有很多其它命令能帮你查看 Linux 系统上的网络状况。本文探索了一些检查网络连接的非常简便的命令。

### ip 命令

`ip` 命令显示了许多与你使用 `ifconfig` 命令时的一样信息。其中一些信息以不同的格式呈现，比如显示 `192.168.0.6/24`，而不是 `inet addr:192.168.0.6 Bcast:192.168.0.255`，尽管 `ifconfig` 更适合数据包计数，但 `ip` 命令有许多有用的选项。

首先，`ip a` 命令可以列出所有网络接口的信息。

```
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host
 valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
 link/ether 00:1e:4f:c8:43:fc brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.6/24 brd 192.168.0.255 scope global eth0
 valid_lft forever preferred_lft forever
 inet6 fe80::21e:4fff:fec8:43fc/64 scope link
 valid_lft forever preferred_lft forever

```

如果你只想看到简单的网络接口列表，你可以用 `grep` 限制它的输出。

```
$ ip a | grep inet
 inet 127.0.0.1/8 scope host lo
 inet6 ::1/128 scope host
 inet 192.168.0.6/24 brd 192.168.0.255 scope global eth0
 inet6 fe80::21e:4fff:fec8:43fc/64 scope link

```

使用如下面的命令，你可以看到你的默认路由：

```
$ ip route show
default via 192.168.0.1 dev eth0
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.6

```

在这个输出中，你可以看到通过 `eth0` 的默认网关是 `192.168.0.1`，并且本地网络是相当标准的 `192.168.0.0/24`。

你也可以使用 `ip` 命令来启用和禁用网络接口。

```
$ sudo ip link set eth1 up
$ sudo ip link set eth1 down

```

### ethtool 命令

另一个检查网络非常有用的工具是 `ethtool`。这个命令提供了网络接口上的许多描述性的数据。

```
$ ethtool eth0
Settings for eth0:
 Supported ports: [ TP ]
 Supported link modes: 10baseT/Half 10baseT/Full
 100baseT/Half 100baseT/Full
 1000baseT/Full
 Supported pause frame use: No
 Supports auto-negotiation: Yes
 Advertised link modes: 10baseT/Half 10baseT/Full
 100baseT/Half 100baseT/Full
 1000baseT/Full
 Advertised pause frame use: No
 Advertised auto-negotiation: Yes
 Speed: 100Mb/s
 Duplex: Full
 Port: Twisted Pair
 PHYAD: 1
 Transceiver: internal
 Auto-negotiation: on
 MDI-X: on (auto)
Cannot get wake-on-lan settings: Operation not permitted
 Current message level: 0x00000007 (7)
 drv probe link
 Link detected: yes

```

你也可以使用 `ethtool` 命令来检查以太网驱动程序的设置。

```
$ ethtool -i eth0
driver: e1000e
version: 3.2.6-k
firmware-version: 1.4-0
expansion-rom-version:
bus-info: 0000:00:19.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

```

自动协商的详细信息可以用这样的命令来显示：

```
$ ethtool -a eth0
Pause parameters for eth0:
Autonegotiate: on
RX: on
TX: on

```

### traceroute 命令

`traceroute` 命令用于显示路由路径。它通过在一系列数据包中设置数据包头的 TTL（生存时间）字段来捕获数据包所经过的路径，以及数据包从一跳到下一跳需要的时间。`traceroute` 的输出有助于评估网络连接的健康状况，因为某些路由可能需要花费更长的时间才能到达最终的目的地。

```
$ sudo traceroute world.std.com
traceroute to world.std.com (192.74.137.5), 30 hops max, 60 byte packets
 1 192.168.0.1 (192.168.0.1) 3.691 ms 3.678 ms 3.665 ms
 2 10.224.64.1 (10.224.64.1) 26.273 ms 27.354 ms 28.574 ms
 3 10.20.0.33 (10.20.0.33) 28.293 ms 30.625 ms 33.959 ms
 4 10.20.0.226 (10.20.0.226) 36.807 ms 37.868 ms 37.857 ms
 5 204.111.0.132 (204.111.0.132) 38.256 ms 39.091 ms 40.429 ms
 6 ash-b1-link.telia.net (80.239.161.69) 41.612 ms 28.214 ms 29.573 ms
 7 xe-1-3-1.er1.iad10.us.zip.zayo.com (64.125.13.157) 30.429 ms 27.915 ms 29.065 ms
 8 ae6.cr1.dca2.us.zip.zayo.com (64.125.20.117) 31.353 ms 32.413 ms 33.821 ms
 9 ae27.cs1.dca2.us.eth.zayo.com (64.125.30.246) 43.474 ms 44.519 ms 46.037 ms
10 ae4.cs1.lga5.us.eth.zayo.com (64.125.29.202) 48.107 ms 48.960 ms 50.024 ms
11 ae8.mpr3.bos2.us.zip.zayo.com (64.125.30.139) 51.626 ms 51.200 ms 39.283 ms
12 64.124.51.229.t495-rtr.towerstream.com (64.124.51.229) 40.233 ms 41.295 ms 39.651 ms
13 69.38.149.18 (69.38.149.18) 44.955 ms 46.210 ms 55.673 ms
14 64.119.137.154 (64.119.137.154) 56.076 ms 56.064 ms 56.052 ms
15 world.std.com (192.74.137.5) 63.440 ms 63.886 ms 63.870 ms

```

### tcptraceroute 命令

`tcptraceroute` 命令与 `traceroute` 基本上是一样的，只是它能够绕过最常见的防火墙的过滤。正如该命令的手册页所述，`tcptraceroute` 发送 TCP SYN 数据包而不是 UDP 或 ICMP ECHO 数据包，所以其不易被阻塞。

### tcpdump 命令

`tcpdump` 命令允许你捕获网络数据包来进一步分析。使用 `-D` 选项列出可用的网络接口。

```
$ tcpdump -D
1.eth0 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.nflog (Linux netfilter log (NFLOG) interface)
5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
6.usbmon1 (USB bus number 1)
7.usbmon2 (USB bus number 2)
8.usbmon3 (USB bus number 3)
9.usbmon4 (USB bus number 4)
10.usbmon5 (USB bus number 5)
11.usbmon6 (USB bus number 6)
12.usbmon7 (USB bus number 7)

```

`-v` 选项控制你看到的细节程度——越多的 `v`，越详细，但超过 3 个 `v` 不会有更多意义。

```
$ sudo tcpdump -vv host 192.168.0.32
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:26:31.321816 IP (tos 0x10, ttl 64, id 22411, offset 0, flags [DF], proto TCP (6), length 184)
 192.168.0.6.ssh > 192.168.0.32.57294: Flags [P.], cksum 0x8221 (incorrect -> 0x0254), seq 3891093411:3891093555, ack 2388988308, win 329, length 144
20:26:31.321984 IP (tos 0x10, ttl 64, id 22412, offset 0, flags [DF], proto TCP (6), length 200)
 192.168.0.6.ssh > 192.168.0.32.57294: Flags [P.], cksum 0x8231 (incorrect -> 0x3db0), seq 144:304, ack 1, win 329, length 160
20:26:31.323791 IP (tos 0x0, ttl 128, id 20259, offset 0, flags [DF], proto TCP (6), length 40)
 192.168.0.32.57294 > 192.168.0.6.ssh: Flags [.], cksum 0x643d (correct), seq 1, ack 304, win 385, length 0
20:26:31.383954 IP (tos 0x10, ttl 64, id 22413, offset 0, flags [DF], proto TCP (6), length 248)
...

```

当你运行像这样的命令时，会看到**非常多**的输出。

这个命令捕获来自特定主机和 `eth0` 上的 `11` 个数据包。`-w` 选项标识保存捕获包的文件。在这个示例命令中，我们只要求捕获 `11` 个数据包。

```
$ sudo tcpdump -c 11 -i eth0 src 192.168.0.32 -w packets.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
11 packets captured
11 packets received by filter
0 packets dropped by kernel

```

### arp 命令

`arp` 命令将 IPv4 地址映射到硬件地址。它所提供的信息也可以在一定程度上用于识别系统，因为网络适配器可以告诉你使用它们的系统的一些信息。下面的第二个 MAC 地址，以 `f8:8e:85` 开头，很容易被识别出是 Comtrend 路由器。

```
$ arp -a
? (192.168.0.12) at b0:c0:90:3f:10:15 [ether] on eth0
? (192.168.0.1) at f8:8e:85:35:7f:b9 [ether] on eth0

```

上面的第一行显示了系统本身的网络适配器的 MAC 地址。该网络适配器似乎已由台湾 Chicony 电子公司制造。你可以很容易地在网上查找 MAC 地址关联，例如来自 Wireshark 的这个工具 —— <https://www.wireshark.org/tools/oui-lookup.html> 。

---

via: <https://www.networkworld.com/article/3233306/linux/more-ways-to-examine-network-connections-on-linux.html>

作者：[Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) 译者：[kimii](https://github.com/kimii) 校对：[wxy](https://github.com/wxy)

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


25 个学习 Linux 的免费资源（英文）

>
> 在这篇文章中，我将与你分享免费学习 Linux 的最佳资源。这个集合包括了网站、在线视频课程和免费电子书。
>
>
>

**如何学习 Linux ？**

这可能是 Facebook Linux 用户组中最常见的问题。

“如何学习 Linux”这个看起来简单的问题的答案并不简单。

问题在于不同的人对于学习 Linux 有不同的意义。

* 比如有人从来没有使用过 Linux，无论是命令行还是桌面版本，那个人可能只是想知道更多关于它的信息。
* 比如有人使用 Windows 作为桌面，但必须在工作中使用 Linux 命令行，那个人可能对学习 Linux 命令感兴趣。
* 比如有人已经使用过一段时间的 Linux，而且懂得一些基础，但他/她可能想要更上一层楼。
* 比如有人只是对 Linux 特定的发行版本感兴趣。
* 比如有人想要提升或学习几乎与 Linux 命令行差不多的 Bash 脚本。
* 比如有人想要从事一个 Linux 系统管理员的职业，或者想提高他/她的系统管理技能。

你看，“我如何学习 Linux”的答案取决于你追求什么样的 Linux 知识。为此，我收集了大量能用来学习 Linux 的资源。

这些免费的资源包括电子书、视频课程、网站等。这些资源分成几个子类别，以便当你试图学习 Linux 时可以很容易地找到你想要的东西。

再者，这里没有学习 Linux 的最好方式。这完全取决于你如何去学习 Linux，通过在线门户网站、下载电子书、视频课程或者其他。

让我们看看你能如何学习 Linux。

**免责声明** : 这里列举的所有书都可以合法的下载。 据我所知，这里提到的资源都是官方的资源。但是，如果你发现它不是，请让我知道以便我可以采取适当的措施。

![](/data/attachment/album/201802/17/195021c14bpthi1qqqy4cb.png)

### 1. 对于完全新手学习 Linux 的免费资料

也许你刚刚从朋友那里或者从网上的讨论中听到了 Linux。关于 Linux 的炒作让你对 Linux 很感兴趣，你被互联网上的大量信息所淹没，不知道在哪里寻找更多的关于 Linux 的知识。

不用担心，我们中的大多数，即使不是全部，都经过过这个阶段。

#### Linux 基金会关于 Linux 的介绍 [视频课程]

如果你对于什么是 Linux 和如何开始学习 Linux 完全没有概念的话，我建议你从学习 [Linux 基金会](https://www.linuxfoundation.org/)在 [edX](https://www.edx.org) 上提供的免费的视频课程开始。它可以看做“维护” Linux 的组织的一个官方课程——是的，这个组织是由 Linux 之父 [Linus Torvalds](https://www.youtube.com/watch?v=eE-ovSOQK0Y) 所背书的。

* [Introduction To Linux](https://www.edx.org/course/introduction-linux-linuxfoundationx-lfs101x-0)

#### Linux 旅程 [网站]

不是官方的，也许不是很受欢迎。但是这个小网站对于初学者来说是一个 Linux 学习的完美场所。

该网站设计精美，并根据主题组织得很好。它给你提供了能够在阅读完一个片段或章节后的进行的互动式测验。我的建议是收藏这个网站：

* [Linux Journey](https://linuxjourney.com/)

#### 《5 天学习 Linux》 [电子书]

这本出色的书针对 FOSS 读者来说完全的免费，这完全得感谢 [Linux Training Academy](https://www.linuxtrainingacademy.com/)。

为完全的新手而写，这本免费的 Linux 电子书给了你一个关于 Linux 的概述、常用的 Linux 指令和你开始学习 Linux 所需要的其他东西。

你能够从下面的网页下载该书：

* [Learn Linux In 5 Days](https://courses.linuxtrainingacademy.com/itsfoss-ll5d/)

#### 《Linux 新手终极指南》 [电子书]

这是一本面向 Linux 初学者的免费下载的电子书。该电子书从解释什么是 Linux 开始，并提供了将 Linux 作为桌面的更多实际使用经验。

您可以从下面的链接下载最新版本的电子书：

* [The Ultimate Linux Newbie Guide](https://linuxnewbieguide.org/ulngebook/)

### 2. 初学者进阶的免费书籍

本节列出了那些已经“完成”的 Linux 电子书。

我的意思是，这些之中的大部分就像是专注于 Linux 的每个方面的学术教科书。你可以作为一个绝对的新手阅读这些书，或者你也可以作为一个中级的 Linux 用户来深入学习。即使你已经是专家级，你也可以把它们作为参考。

#### 《Linux 介绍》 [电子书]

《Linux 介绍》是 [Linux 文档计划](http://www.tldp.org/index.html)的免费电子书，而且它是最热门的 Linux 免费电子书之一。即使我认为其中的部分段落需要更新，它仍然是一本非常好的电子书，可以教你 Linux、Linux 的文件系统、命令行、网络和其他相关的东西。

* [Introduction To Linux](http://tldp.org/LDP/intro-linux/intro-linux.pdf)

#### 《Linux 基础》 [电子书]

这本由 Paul Cobbaut 编写的免费的电子书可以教你关于 Linux 的历史、安装和你需要知道的基本的 Linux 命令。你能够从下列链接上得到这本书：

* [Linux Fundamentals](http://linux-training.be/linuxfun.pdf)

#### 《Linux 高级编程》 [电子书]

顾名思义，这是一本面向想要或者正在开发 Linux 软件的高级用户的书。它阐释了那些复杂的功能，比如多进程、多线程、进程间通信以及和硬件设备的交互。

跟着这本书学习会帮你开发一个更快速、更可靠、更安全的使用 GNU/Linux 系统全部功能的项目。

* [Advanced Linux Programming](http://advancedlinuxprogramming.com/alp-folder/advanced-linux-programming.pdf)

#### 《LFS》 [电子书]

如果你认为自己对 Linux 有足够的了解，并且你是一个专业人士，那么为什么不创建自己的 Linux 版本呢？ Linux From Scratch（LFS）是一个完全基于源代码，为你构建你自定义的 Linux 系统提供手把手的指导。

可以把它叫做 DIY Linux ，它是一个把你的 Linux 专业知识提高到新的高度的方法。

这里有许多的关于这个项目的子项目，你能够在这个网站上查看和下载。

* [Linux From Scratch](http://www.linuxfromscratch.org/)

### 3. 学习 Linux 命令和 Shell 脚本的免费电子书

Linux 的真正强大在于命令行，如果你想要征服 Linux，你必须学习命令行和shell。

事实上，如果你必须在你的工作中使用 Linux 终端，那么熟悉 Linux 命令行实际上会帮助你完成任务，也有可能帮助你提高你的职业生涯（因为你会更有效率）。

在本节中，我们将看到各种 Linux 命令方面的免费电子书。

#### 《GNU/Linux 命令行工具总览》 [电子书]

这本 Linux 文档项目中的电子书是接触 Linux 命令行并开始熟悉 Shell 脚本的好地方。

* [GNU/Linux Command−Line Tools Summary](http://tldp.org/LDP/GNU-Linux-Tools-Summary/GNU-Linux-Tools-Summary.pdf)

#### 《GNU Bash 参考手册》 [电子书]

这是一本可以从 [GNU](https://www.gnu.org/home.en.html) 网站下载的免费电子书。 就像名字暗示的那样, 它涉及 Bash Shell （如果我能这么叫的话）。这本书超过了 175 页，而且它包括了许多在 Bash 里和 Linux 有关的主题。

你能够从下面的链接中获取：

* [Bash Reference Manual](https://www.gnu.org/software/bash/manual/bash.pdf)

#### 《Linux 命令行》 [电子书]

这本 500 多页的由 William Shotts 编写的免费电子书，对于那些认真学习 Linux 命令行的人来说，是一本必须拥有的书。

即使你认为你已经了解了 Linux，你还是会惊讶于这本书能教你很多东西。

它涵盖了从初学者到高级的东西。我敢打赌读完这本书之后你会成为一个更好的 Linux 用户。请下载这本书并且随时携带它。

* [The Linux Command Line](http://linuxcommand.org/tlcl.php)

#### 《Bash 入门指南》 [电子书]

如果你想从 Bash 脚本开始，这可能对于你来说是一个很好的助手。 这本电子书也是基于 Linux 文档项目的，它是编写 《Linux 介绍》的电子书的作者（本文前面讨论过）。

* [Bash Guide for Beginners](http://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf)

#### 《Bash 脚本高级指南》 [电子书]

如果你认为你已经了解了基本的 Bash 脚本知识，并且你想把你的技能提高到一个新的水平，这本书就是你所需要的。这本书有超过 900 页的各种高级命令和举例。

* [Advanced Bash-Scripting Guide](http://www.tldp.org/LDP/abs/abs-guide.pdf)

#### 《AWK 编程语言》 [电子书]

这不是一本很美观的书，但是如果你真的想要深入学习脚本，这本虽旧但是依然很棒的书会很有帮助。

* [The AWK Programming Language](https://ia802309.us.archive.org/25/items/pdfy-MgN0H1joIoDVoIC7/The_AWK_Programming_Language.pdf)

#### 《Linux 101 技巧》 [电子书]

这本 270 多页的书来自“The Geek Stuff”，通过易于跟踪学习的例子教给你 Linux 命令行基础。你能够从下列的链接获取:

* [Linux 101 Hacks](http://www.thegeekstuff.com/linux-101-hacks-ebook/)

### 4. 特定发行版的免费学习资料

这个章节专注于特定 Linux 发行版的材料。到目前为止，我们看到的都是以常规的方式学习 Linux，更多的关注于文件系统、命令和其他的核心内容。

这些书，在另一方面，可以被认为是用户手册或者开始学习各种各样的 Linux 发行版的指南。所以如果你正在使用或准备使用一个特定的 Linux 发行版，你可以参考这些资源。是的，这些书更加关注 Linux 桌面。

我还想补充的是，大部分的 Linux 发行版有它们自己的大量的 wiki 或者文档。你能够从网上随时找到它们。

#### 《Ubuntu 用户指南》 [电子书]

不用说，这本书是针对 Ubuntu 用户的。这是一个独立的项目，以免费电子书的形式提供 Ubuntu 的用户指南。它对于每个版本的 Ubuntu 都有更新。

这本书被叫做用户指南因为它是由一步步的指导组成的，而且受众目标是对于 Ubuntu 完全新手的。所以，你会了解到 Unity 桌面，以及怎样逐渐使用它而且查找应用等等。

如果你从来没有使用过 Ubuntu Unity ，那么这是一本你必须拥有的书，因为它帮助你理解怎样在日常中使用 Ubuntu。

* [Ubuntu Manual](https://ubuntu-manual.org/)

#### 《面向 Linux Mint：直接告诉我就行！》 [电子书]

一本非常基本的关于 Linux Mint 的电子书。它告诉你怎么样在虚拟机中安装 Linux Mint，怎么样去查找软件，安装更新和自定义 Linux Mint 桌面。

你能够在下面的链接下载电子书：

* [Just Tell Me Damnit!](http://downtoearthlinux.com/resources/just-tell-me-damnit/)

#### 《Solus Linux 用户指南》 [电子书]

注意！这本书过去是 Solus Linux 的官方用户指南，但是我找不到 Solux 项目的网站上在哪里有提到它。我不知道它是不是已经过时了。尽管如此，反正不要钱，多少学习一点 Solus Linux。

* [Solus Linux User Guide](https://drive.google.com/file/d/0B5Ymf8oYXx-PWTVJR0pmM3daZUE/view)

### 5. 面向系统管理员的免费电子书

这个章节主要关注于系统管理员——开发者的超级英雄。我已经列了一部分会真正帮助那些已经是系统管理者或者想要成为系统管理者的免费的电子书。我还得说，你必须要关注基本的 Linux 命令行，因为它会使你的工作更加简单。

#### 《The Debian 管理手册》 [电子书]

如果你使用 Debian Linux 作为你的服务器，这本书就是你的圣经。这本书从 Debian 的历史、安装、包管理等等开始，接着覆盖一些主题，比如说 [LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle))、虚拟机、存储管理和其他核心系统管理。

* [The Debian Administration's Handbook](https://debian-handbook.info/about-the-book/)

#### 《高级 Linux 系统管理》 [电子书]

如果在准备 [LPI 认证](https://www.lpi.org/our-certifications/getting-started)，那么这本书是一本理想的书。这本书的涉及系统管理员必要的主题，所以了解 Linux 命令行是前置条件。

* [Advanced Linux System Administration](http://www.nongnu.org/lpi-manuals/manual/pdf/GNU-FDL-OO-LPI-201-0.1.pdf)

#### 《Linux 系统管理》 [电子书]

Paul Cobbaut 编写的另一本免费的电子书。370 页长的的书包括了网络、磁盘管理、用户管理、内核管理、库管理等等。

* [Linux System Administration](http://linux-training.be/linuxsys.pdf)

#### 《Linux 服务器》 [电子书]

又一本来自 [linux-training.be](http://linux-training.be/) 的 Paul Cobbaut 编写的电子书。这本书包括了 Web 服务器、MySQL、DHCP、DNS、Samba 和其他文件服务器。

* [Linux Servers](http://linux-training.be/linuxsrv.pdf)

#### 《Linux 网络》 [电子书]

网络是系统管理者的面包和黄油，这本也是由 Paul Cobbaut 编写的书是一本好的参考资料。

* [Linux Networking](http://linux-training.be/linuxnet.pdf)

#### 《Linux 存储》 [电子书]

这本由 Paul Cobbaut（对，还是他）编写的书详细解释了 Linux 的磁盘管理，而且介绍了许多其他的和存储相关的技术。

* [Linux Storage](http://linux-training.be/linuxsto.pdf)

#### 《Linux 安全》 [电子书]

这是这个书单里最后一本由 Paul Cobbaut 编写的书。安全是系统管理员最重要的工作之一。这本书关注文件权限、ACL、SELinux、用户和密码等等。

* [Linux Security](http://linux-training.be/linuxsec.pdf)

### 你有什么最喜爱的 Linux 资料吗？

我知道这是一个不错的免费 Linux 电子书集合，但是它可以做的更好。

如果你有学习 Linux 方面有更大帮助的其它资料，请务必和我们共享。请注意只共享合法的下载资料，以便我可以根据你的建议更新这篇文章而不会有任何问题。

我希望你觉得这篇文章在学习 Linux 时有帮助，欢迎你的反馈。

---

via: <https://itsfoss.com/learn-linux-for-free/>

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

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


2018 年度最佳 Linux 笔记本电脑：来自一位 RHCE 的选购指南

博主   红帽的系统好吗，可能我需要搭建单节点kubernetes  rhel7.0对已经入门两年的人来说合适吗

![](/data/attachment/album/201802/18/224641tx51k5224x4twxvw.png)

如果你不具备相关的知识和经验，挑选出最适合 Linux 的笔记本电脑，可能是件很困难的事。并且，看上去你买了一台配置、功能、性能都很棒的电脑，但是，却疲于处理各种 Linux 的问题，太难堪了！因此，作为一个 **RedHat 认证工程师**，这篇文章的作者兼博主，也是一个 **有 14 年以上 Linux 使用经验的用户**，我用我掌握的一些知识去为你推荐一些笔记本电脑，我可以保证我推荐的这些电脑，Linux 在它上面会跑的很好。我研究了 20 多个小时之后（通过认真了解硬件详细情况和用户反馈），我选择 [Dell XP S9360-3591-SLV](https://www.amazon.com/gp/product/B01LQTXED8?ie=UTF8&tag=flooclea01-20&camp=1789&linkCode=xm2&creativeASIN=B01LQTXED8) 作为我的首选推荐。如果你希望笔记本电脑装备最新的功能特性，并且 **能够在使用 Linux 工作** 时有极好的性能，那么，这台笔记本电脑将是你的最佳选择。

它使用铝合金机身，很轻（2.7 磅重），有强劲的硬件性能，待机时间较长，使用康宁大猩猩玻璃的 QHD 显示屏，分辨率为 3200×1800、并且还具备触控功能，可以为你带来清晰的图像表现，即便是很小的细节也可以很好的展现出来，有一个带橡皮掌托的、面积很大的并且非常好用的触摸板（早期版本上触摸板有几个小问题，但是，最新的机器已经修复了），并且也有一个很好用的带背光的键盘（按键的行程很短，这一点有些像 Thinkpad 笔记本），两个 USB 3.0 端口。最重要的是，两个最让 Linux 用户头痛的问题，无线网卡和 GPU （Intel HD Graphics 620 **播放 4K 视频可以达到 60 fps**），在这台 Dell 电脑上，它们都 **超级兼容 Linux**。

![](/data/attachment/album/201802/18/224731yo88lqhhwf0hwszn.png)![](/data/attachment/album/201802/18/224731nuc1q1nnnnq7cnqu.png)

有一个缺点是，它没有 HDMI 端口。在这个位置，Dell 增加了一个 Thunderbolt 3 端口。因此，你唯一的选择是使用一个 Thunderbolt 到 HDMI 的转换器（它很便宜）。第二，在购买之后，你不能升级它的 8GB 的内存（在采购之前你可以改变硬件配置 —— CPU、RAM & SSD），但是，在我的选择中，8GB 的内存运行任何 Linux 发行版做任何工作都足够了。我有一台 Asus 笔记本电脑（它是我收到的一份礼物）使用第五代的 Core i7 的 CPU，4GB 内存，它是我主要使用的计算机。使用 Chrome 可以打开 15-20 个标签，在后台运行 VLC ，打开文件管理和一个代码编辑器，这种情况下，它工作的很好。如果我减少一些浏览器标签（减少到 4-5 个），然后，即便是其它的应用程序都打开的情况下，我都可以在 Virtualbox 上使用虚拟机工作。这些都是在 4GB 内存的情况下，因此，有 8GB 内存和其它更强劲的硬件的情况下，它绝对会工作的非常好。

>
> **注意：** 虽然我为你选择了一套非常可靠的 [硬件](https://www.amazon.com/gp/product/B01LQTXED8?ie=UTF8&tag=flooclea01-20&camp=1789&linkCode=xm2&creativeASIN=B01LQTXED8)，但是，如果你愿意，你仍然可以进一步去定制它。即便你不去选择 ‘8GB RAM/128GB SSD’ 这个选项。因为，那个版本也提供 1920×1080 的 FHD 显示屏，并且，在 13.3″ 的显示屏上让菜单看起来更小一些，看起来稍微有点困难。
>
>
>

### 最便宜的 Linux 笔记本电脑

![](/data/attachment/album/201802/18/224807g1cjs1jwzgsj7llh.png)

如果你觉得这台 Dell 笔记本电脑有点贵，买不起，但是还想拥有类似的非常好的性能，并且与 Linux 的兼容性很好，那么，第二个最佳选择是这台 [Acer Aspire E 15 E5-575G-57D4](https://www.amazon.com/gp/product/B01LD4MGY4?ie=UTF8&tag=flooclea01-20&camp=1789&linkCode=xm2&creativeASIN=B01LD4MGY4)。它 15.6″ 的显示屏，无疑能提供像前面的 Dell 笔记本一样的显示表现，但是，在 15.6” 上的 1920×1080 的全高清分辨率显示屏，也可以让任何细节都显示的非常清晰。其它的硬件与前面介绍的很贵的 Dell 笔记本电脑很相似，但是，**因此它的电池很重，整机重达 5.2 磅。**

你实际上可以去做一些定制。基本的配置包括一个第七代 Core i5 CPU，15.6“ 的全高清显示屏（1920 x 1080），8GB DDR4 内存，256GB 固态硬盘，Intel HD Graphics 620 GPU 和一个独立的 Nvidia 940 MX GPU，端口方面：HDMI 2 USB 3.0，1 x USB 2.0 & 1 USB 3.1。对于 $549 的售价，它竟然 **包含一个 DVD 刻录机** … [**它是一个特价商品**](https://www.amazon.com/gp/product/B01LD4MGY4?ie=UTF8&tag=flooclea01-20&camp=1789&linkCode=xm2&creativeASIN=B01LD4MGY4)。

至于 Linux 的兼容性，它真的很好。虽然它不像顶级的 Dell XPS，但是，至少在我看来，如果它能够解决 Nvidia GPU 的问题，它就是一个很好的选择。除了一个用户以外，所有其它的用户都反馈，它的 Linux 兼容性非常好。唯一的一个用户抱怨说，在 Linux Mint 上安装了 Nvidia 的专用驱动以后，出现了一个小问题，并且他说，他决对不是故意 “抹黑” 它。这个反馈与我在使用移动版的 Nvidia GPU 所遇到的情况一样。

例如，现在我使用一台 Asus 笔记本电脑，并且它除了集成的 Intel GPU 以外，它也有一个独立的 Nvidia 920M GPU。这台笔记本电脑我大概已经用了一年半时间了。[我在它上面运行了一些 Linux 发行版](https://www.hecticgeek.com/gnu-linux/)，并且，遇到的唯一的问题是，[在 Ubuntu 17.10 上](https://www.hecticgeek.com/2017/11/ubuntu-17-10-review/) 安装完它的专用驱动程序后，如果激活 Nvidia 作为默认的 GPU，自动用户登入功能会停止工作。因此，每次进入桌面我都要输入我的登录凭据。这虽然不是一个大问题，但是，我确信，它可以通过编辑一些登录管理器的配置设定来修复它，但是，我根本就没有去理它，因为我很少使用 Nvidia GPU。因此，我只是简单地改变默认 GPU 为 Intel，所有的一切就会正常。因此，前段时间，我在 [Ubuntu 16.04 LTS](https://www.hecticgeek.com/2016/04/ubuntu-16-04-lts-review/) 上 [的同一个 Nvidia GPU 上启用了‘运动插值’](https://www.hecticgeek.com/2016/06/motion-interpolation-linux-svp/)，并且它处理的非常好！

我想说的是，GPU 驱动，比如 Nvidia & AMD/ATI 提供的，给用户带来困扰只是在过去的 Linux 上，但是，现在随着进一步的处理，已经不是什么困难的事情了，或者说，至少没有像以前那样困难了。除非你使用的是一个非常新的高端 GPU，Linux 的运行不遇到大的问题还是很有可能的。

### Linux 游戏笔记本

![](/data/attachment/album/201802/18/224835itwrk1rt0aqxxzjq.png)

很多时候，玩游戏的笔记本电脑，你需要去手动调整一些东西。并且，这些 “东西” 大部分都是与 GPU 相关的。它可能只是简单地安装一些专用的驱动程序，去处理一个拒绝引导到 CD/USB 中的系统。但是，如果有足够的耐心，大多数情况下，它们都是可以修复的。如果你的游戏笔记本有一个非常新的 Nvidia/AMD GPU 驱动，并且，这个驱动有问题，那么，修复它意味着只需要等待它更新驱动程序。有时候，可能需要等待很长的时间。但是，如果你买了一台安装有几个月前发布的 GPU 的笔记本电脑，那么，仅此一点，就大大增加你解决现有问题的机会。

因此，考虑到这一点，我选择了 [Dell Inspiron i5577-7342BLK-PUS](https://www.amazon.com/gp/product/B06XFC44CL?ie=UTF8&tag=flooclea01-20&camp=1789&linkCode=xm2&creativeASIN=B06XFC44CL)，作为一个游戏笔记本电脑的最佳选择。它是一台强大的游戏笔记本电脑，售价低于 1000 美元。主要原因是它有一个 15.6″ 的全高清（1920 x 1080）显示屏。因为，在你查看其它配置的时候你会发现（也可以进一步定制它），它包含一个第七代 Core i7 CPU（四核心），16GB DDR4 内存（最高可到 32GB），512GB SSD 驱动器，并且有一块 Nvidia GTX 1050 GPU，它有很多积极的评价。你只可以在 QHD 或者 4K 下，使用外接显示器去玩高端游戏，尽管如此，它也可以在 15.6″ 的全高清分辨率下玩一些游戏。

我选择 Dell 的另外原因是，大多数的 Dell 笔记本电脑（或者一般用途的计算机）都是非常兼容 Linux 系统的。我在 Dell 网站上手工检查了硬件配置的详细情况，虽然我不能保证使用 Nvidia GPU 不会有任何问题，其它的硬件在主流的 Linux 发行版上都工作的很好（比如 Ubuntu）。

### 哪个才是你需要的？

实际上，我相信越少越好。

我可以在这里给你 ‘推荐’ 很多很多的笔记本电脑，但是，那样的话，我需要写一系列的博客文章。因此，我并不打算 ‘推荐’ 10-12 台笔记本电脑，除非我确信它们都在 Linux 上运行的非常好。而目前为止，这个推荐清单上只有 3 台。我能确信它们在 Linux 上运行的非常好（而且，甚至是游戏笔记本电脑，除了 Nvidia GPU，其它的硬件部分应该工作的很好），再加上，这三个型号都有很多的可选项。换句话说就是，随着时间的推移，如果我从其它的制造商的产品中找到一些笔记本电脑，我相信它们在 Linux 上也运行的很好，然后，我也会推荐它们。但是，现在，就这三台笔记本电脑是我所推荐的。你可能不喜欢这些推荐的电脑，那么，下面我告诉你如何去查找你心仪的笔记本电脑。一旦你有了基本的概念，你可以非常容易地去预测，一台笔记本电脑是否能够运行 Linux 而不会出现问题。上面我已经提到了大部分，但是，我还在这里再说一下。

#### 查找关于硬件的更多信息

当你拿到一个笔记本电脑时，记下它的型号。现在，在大多数的网站上，都提供硬件的详细情况，比如，无线网卡或者声卡芯片的制造商。在大多数的情况下，使用一些简单的技巧就可以拿到这些信息。我通常是这样做的。

如果你知道笔记本电脑的制造商和型号，可以在 Google 中搜索它的驱动程序。我以前面的 Dell 游戏笔记本电脑为例。如果你知道它的名字，然后在 Google 上去搜索它的驱动程序（`Dell Inspiron i5577-7342BLK-PUS drivers`），Google 并不会显示一个 Dell 的官方的驱动程序页面。这并不奇怪，因为 Dell （以及其它制造商）在一个通用的型号名字下面，销售很多种装有各种不同的（2 到 3 种）硬件的笔记本电脑。因此，要缩小搜索目标，从左侧开始，我们首先来使用名字的前三个字段，并且用它在 Google（`Dell Inspiron i5577 drivers`）中搜索驱动程序，然后，如下所显示，并且，Google 也列出了不同的所属网站，对于 Inspiron 5577（没有 ‘i’），列出了一个 Dell 的官方驱动程序页面。

![](/data/attachment/album/201802/18/224916vaa2231z1hx3zzwh.png)

如果你进入这个页面，去查看各种我们感兴趣的型号的驱动程序和硬件列表，那么，你将看到在 ‘Dell Inspiron i5577-7342BLK-PUS’ 中的硬件也在这里列出来了。我通常只喜欢查看 ‘audio’ 和 ‘network’ 下面列出的内容，因为从购买网站上去获得这些芯片的准确的型号名一般很困难，其它的一些硬件如 GPU、CPU 等等也列了出来。因此，如果你查看在 ‘network’ 下显示的内容，你将看到 Dell 提供的一些驱动程序。其中一个就是 Realtek 以太网适配器（以太网适配器通常都支持 Linux ），Qualcomm QCA61x4A-QCA9377 无线网络适配器（如果你进一步研究，需要对 `QCA61x4A` 和 `QCA9377` 分别进行，因为它们之间用 ‘-’ 分隔，你就会发现，它们实际上是来自高通的两种不同的无线芯片。这个关键字表示，Dell 在一个包中包含了两种驱动程序），和一组 Intel 无线网络适配器（Intel 硬件在 Linux 中也支持的非常好）。

但是，高通的设备有时候可能会有些问题。我遇到过一两个，但是，它们都不是什么严重的问题。也就是说，当有问题时，去查找就是解决的一个好办法。因此，使用 `Qualcomm QCA61x4A-QCA9377` 做为关键字（使用一个适配器或者使用一个芯片名字的组合去查询这并不重要），并且增加一个像 `linux` 或者 `ubuntu` 这样的关键字在 Google 中去搜索它。如果像 `Qualcomm QCA61x4A-QCA9377 ubuntu` 这样去搜索，然后，Google 会列出很多结果。我收到的第一个结果是自来 [AskUbuntu](https://askubuntu.com/)（一个社区驱动的网站，专门回答终端用户提出的问题，是一个解决 Ubuntu 相关问题的极好的资源）。

![](/data/attachment/album/201802/18/224944flccxau99vvx73qa.png)

如果你去看那个页面，你可以看到有用户报怨 Qualcomm QCA9377 无线网络适配器在它的 Ubuntu 15.10 不能正常工作。幸运的是，那个问题已经被回答了。这个问题看起来似乎是 Ubuntu 15.10 的问题，它发布于 2015 年 10 月，因此，这是两年前的问题了。所以，这个问题很可能在最新的 Ubuntu 发行版中已经修复了。我还记得，这个问题好像与 Qualcomm QCA9377 无线芯片有关，而不是 QCA61x4A。因此，如果我们的 Linux 游戏笔记本电脑使用的是后面型号的无线芯片，那么很有可能你不会遇到这个问题。

我希望我不要遇到上面报怨的所有事情。我只是想给你提供一个指南，告诉你如何去找到你希望去运行 Linux 的笔记本电脑上的关于硬件的详细情况，这样你就可以很好地去评估它。使用一些常识性的技巧和经验，你的工作效率将会更高。

#### 不要止步于 GPU 和网络适配器上

![](/data/attachment/album/201802/18/225007zmurejnqan2n4xd5.jpg)

虽然，在你购买了一台笔记本电脑来运行 Linux 时，GPU 和网络适配器是大多数人遇到的最容易出现问题的硬件设备，但是，去研究音频、触控板、和键盘在 Linux 中的兼容性和它们相关的特性（例如，我的老 Dell 的背光键盘在 Linux 中也有一个小问题），也是一个很好的实践。

**搜索‘用户评论’（当你准备购买时）**

在诸如 Amazon.com 这样的网站上，你实际上可以搜索某些关键字的用户反馈 (‘审阅’)。这是非常有用的，因为你可以很容易地用几秒钟内在包括数以百计甚至数以千计的用户反馈中搜索一两个关键字。我建议你使用的关键字，如 `Linux` 或 `ubuntu` 或 `linux mint` 或任何其他 Linux 发行版，只要它是流行的发行版。如果已经购买了笔记本电脑的人试图在它上运行 Linux 发行版，使用此方法你总能找出发生了什么事。

在亚马逊这样的网站搜索用户反馈是很容易。一旦您访问了您感兴趣的产品页面，只需单击“客户评论”链接并向下滚动, 直到看到一个搜索框 (通常位于右下角)。

![](/data/attachment/album/201802/18/225143nuaq6d77767uybwd.png)

#### 如果它是一个 ‘热门’ 硬件，等待 2-3 个月

正如，计算机终端用户所担心的那样，Linux 的市场份额是非常小的。因此，硬件制造商并不会把 Linux 看的很重。因此，他们修复最新发布的硬件设备中已存在的主要问题需要很长的一段时间。即便是开源驱动程序，也是如此，当然，在我的经验中，开源的驱动程序的问题修复比专属的驱动程序要快。因此，如果你买的笔记本电脑的特色硬件设备（主要指 CPU 和 GPU）是最新发布的，那么，它通常需要等待 2 或 3 个月才能去修复在 Linux 上的主要的问题。并且，但愿在那个时候，你可以找到一个修复，或者，至少可以预测什么时候可以被修复。

#### 关于屏幕和 HiDPI 在 Linux 上支持的怎么样？

![](/data/attachment/album/201802/18/225206y4i8sfm94imf8sbx.png)

‘像素密度’ 或者 ‘高像素密度’ 显示是最近非常流行的术语。并且大多数人都认定，更高的像素意味着更好的质量。虽然在一般的认知和技术角度上，它可能是正确的，但是，它并不准确。这个主题理解起来很复杂，因此，我将只讲一些基本的概念，对于你理解这个主题已经足够了，以避免不必要的混乱。

任何显示在你的屏幕上的东西，比如文本或者图标，都被设计为某些固定的大小。而这些大小是通过被称为 “每英寸显示的像素点数” 或者简称为 DPI 来描述的。它基本上定义了每英寸应该显示多少个点（像素）才能正确显示这个东西。每英寸显示 72 个点是由 Apple 公司制定的标准，这是很重要的。我相信，你可能听说过，Windows 使用了一个不同的标准，每英寸 96 个点，但是，它不完全正确。我不去深入其中的细节，但是，如果你想进一步了解更多的内容，[阅读 Wikipedia](https://en.wikipedia.org/wiki/Dots_per_inch#Computer_monitor_DPI_standards)。在任何情况下，要确保显示在你的 Linux 笔记本电脑的屏幕上的内容看起来清晰可读，如果你想了解，按以下的内容去做。首先，确定它的显示大小（13.3″、15.6″、17″…）和分辨率。然后到 [PXCALC.com](http://pxcalc.com/) 网站，它提供一个非常好用的每英寸点数计算器。接着在上面输入正确的内容。计算完成后，它告诉你一个 DPI 的计算结果（在它的右上角，如下图所示）。然后将那个值简单地除以 72，这就是最重要的部分。

![](/data/attachment/album/201802/18/225232a1ctux2ik1upu3ts.png)

如果你得到的结果是一个类似于整形增量，比如 2、3、4（+0.2 到 —0.2 的偏差还不错，最好是 +0.1 到 —0.1，最完美的是接近 0.0 的偏差及更大的整数—— 3 或更大，比如 iMac 27 5K），然后，你就没有什么可担心的了。整形增量越高（只要偏差保持在范围之内），屏幕越清晰。为了更好理解，我们举一个例子。

我以推荐给你的第一个笔记本电脑（使用 13.3″ 的 QHD 分辨率的 Dell XPS）为例。如果你使用这个计算器去计算，它的结果是 ‘3.83’，把它粗算为 ‘3.8’，它不是我们前面所说的那样一个整数，但是，它在偏差范围以内（-0.2），是安全的。如果你拿我推荐的 Acer 笔记本电脑做同样的计算，它得到的结果是 ‘1.95’，把它粗算为 ‘2.0’。因此，在不考虑它的其它特性（亮度，可视角度，等等）的情况下，Dell 笔记本电脑上的显示清晰度要好于 Acer 几乎两倍（相信我，这个显示效果已经看起来非常清晰了。但是，它相比分辨率为1366 x 768 的无论是 13.3″ 还是 15.6″ 的屏幕，看起来显示效果更好）。

#### 关于内存大小？

![](/data/attachment/album/201802/18/225301cpn1rnhi1bcx1hro.png)

KDE 和 GNOME 是在 Linux 上的两种主流的桌面环境。虽然还有很多其它的选择，我建议你坚持使用其中的一个。目前来说，我比较偏爱 KDE。据我所知，KDE plasma 比 GNOME 更加轻量化，并且效果更好。如果你希望了解它们之间的比较数据，它在 [我的 Ubuntu 16.10 特点评估](https://www.hecticgeek.com/2016/11/ubuntu-16-10-flavors-comparison/) 中（它大概是在一年前做的），在 Ubuntu 上 KDE plasma 占用大约 369 MiB 内存，而 GNOME 大概占用了 781 MiB！减少了 **112% ！**

现在我使用 Kubuntu 17.10，虽然我没有评估它，但是我可以告诉你，它的内存占用大约在 380-400 MiB左右。重新回到这个话题上，我建议你在为你的 Linux 笔记本电脑的内存选择上，**不要低于 8GB**。那样，我可以很自信地保证，在未来 4 年内你的笔记本电脑都运行的很好，而不用担心它会变慢，并且可以去很好的使用各种发行版和满足大多数终端用户的需求。

如果你是在寻找一台 **在 Linux 上玩游戏的笔记本电脑**，那么内存选择应该是 **使用 12GB 或者更多**。 除比之外，8GB 内存对于大多数终端用户来说是足够的。

#### 关于 SSD

![](/data/attachment/album/201802/18/225330ddtgtssygfsyyvyv.png)

不管你使用的是什么操作系统，增加一块 SSD 将能提升你的笔记本电脑的整体性能和反应速度，因为它比起普通的机械硬盘来说速度快很多，就这么简单。也就是说，在我的经验中，即便是高效和轻量化的 KDE 发行版，相比 GNOME 要花更多的启用时间。一些 Linux 发行版，比如 Ubuntu 和 Kubuntu 带着一个特别设计的被称为 'ureadahead' 的实用程序，它可以改善启动时间（有时可以达到 **30%** 甚至更多），不幸的是，并不是所有的发行版都有这类工具。在有些时候，**安装在 SATA 驱动器上的 KDE 的启动时间可能长达 50 秒以上**。[Manjaro 17.0.2 KDE](https://www.hecticgeek.com/2017/07/manjaro-17-0-2-kde-review/) 就是其中一个这样的例子（显示在上面的图表中）。

因此，最简单的方法就是购买一台带有 SSD 的笔记本电脑，它可以帮助改善启动时间。**我的 Kubuntu 17.10 上是一个小的 SSD 驱动器（20GB），它的启动时间在 13-15 秒内**。

#### 关于 GPU ？

正如上面多次提到过的，如果可能，尽量使用一个 Intel GPU。正如众所周知的那样，Dell 的产品在硬件上都是 ‘Linux 友好的’， Intel 也在开源项目上大量进行投资，并且，其中它的一些硬件也如此。选择它你不会后悔的。

#### 如何进行自动 GPU 切换（比如： Nvidia Optimus），它能正常工作吗？

如果你希望购买的笔记本电脑，显卡在各方面都考虑的比较周全，那么，在 Windows 中，Nvidia 有一个叫做 ‘Optimus’ 的特性，它自动在集成 GPU（性能较弱） 和独立 GPU（性能更强）之间切换。ATI 也有这个功能。在 Linux 中这个功能并没有被官方支持，但是，在那方面有一个创新性的工作，比如 [Bumblebee 项目](https://bumblebee-project.org/)。不过它并不总是按预期工作。我比较喜欢去安装专用的 GPU 驱动程序，并且在我需要的时候去手动切换它们。值得称赞的是，Fedora 团队已经做出了它们的解决方案，我并不知道他们做的怎么样，[最好问问 Christian 吧](https://blogs.gnome.org/uraeus/2016/11/01/discrete-graphics-and-fedora-workstation-25/)。

#### Linux 能给你更长的电池使用时间吗？

当然可以！只要你的硬件设备配置正确，我建议你安装电源使用优化器。现在有几个这方面的应用程序，但是，我建议使用 ‘[TLP](http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html)’。它很容易安装，在我的经验中它可以使功耗降低，而且结果令人影响深刻，它不需要手动去调整什么就可以正常工作。

下面有两张我的最新的 Ubuntu 17.10 的评估截屏。第一张截屏展示了在安装 ‘tlp’ 之前的电源使用情况，而第二张展示了安装之后的（图片已经说明了一切）：

![](/data/attachment/album/201802/18/225422wepqfffuqmeuzyxf.png)

![](/data/attachment/album/201802/18/225422yo266505mh511jr1.png)

‘tlp’ 可以在主要的 Linux 发行版上使用。在 Ubuntu 上，你可以通过执行下面的命令去安装它：

```
sudo apt update

sudo apt install tlp

```

现在重启动计算机，就可以了！

#### 在 Linux 中能测量电源使用了多少吗？

很高兴你能这样问！它的名字叫 ‘[powerstat](https://www.hecticgeek.com/2012/02/powerstat-power-calculator-ubuntu-linux/)’。它是非常神奇的一个小实用程序（由 Colin King 设计，它是一位 Ubuntu 开发者），它采集电源消耗（和诊断）相关的使用数据，并将它们表示在屏幕上。在基于 Ubuntu 的系统上，输入下面的命令可以去安装它：

```
sudo apt update

sudo apt install powerstat

```

在大多数主流的 Linux 发行版上，它们的软件仓库中都有这个软件。

#### 你推荐的 Linux 操作系统是哪个？

很好的问题，到目前为止，我主要使用的操作系统是 Kubuntu 17.10。我没有评估过它，但是，长话短说，我喜欢它！它非常易于安装，并且对新手比较友好，稳定，漂亮，高效并且易于使用。到目前为止我不喜欢 GNOME！因此，如果你刚开始使用 Linux，那么，我建议你去尝试 [Kubuntu](https://kubuntu.org/) 或者 [Linux Mint](https://linuxmint.com/)，首先，（‘Mint’ 可以有很多的桌面环境选择。要么使用 KDE，要么使用 ‘Cinnamon’）。

然后，在你掌握使用技巧后，你就可以转移到其它的发行版上了，这是 Linux 新手最好的方法。

### 结束语

记住我一开始说的话，如果你在寻找一台能够轻松运行 Linux 的笔记本电脑，那么，[Dell XP S9360-3591-SLV](https://www.amazon.com/gp/product/B01LQTXED8?ie=UTF8&tag=flooclea01-20&camp=1789&linkCode=xm2&creativeASIN=B01LQTXED8) 将是你的最佳选择。它外观漂亮、功能强大、非常流行、超便携，不仅能够很轻松地运行 Linux，而且它还有一个非常棒的，并且得到很多人赞扬的显示屏。

如果，你希望有一个更便宜的选择，那么，[Acer Aspire E 15 E5-575G-57D4](https://www.amazon.com/gp/product/B01LD4MGY4?ie=UTF8&tag=flooclea01-20&camp=1789&linkCode=xm2&creativeASIN=B01LD4MGY4) 会满足你的要求。它也像前面的 Dell 一样，可以很好地兼容 Linux，再加上它的性价比，它也是一个非常好的选择。

第三，如果你在寻找一台能够在 Linux 上运行游戏的笔记本电脑，那么，[Dell Inspiron i5577-7342BLK-PUS](https://www.amazon.com/gp/product/B06XFC44CL?ie=UTF8&tag=flooclea01-20&camp=1789&linkCode=xm2&creativeASIN=B06XFC44CL) 看起来非常适合你。当然，还有许多其它的游戏笔记本，但是，我特别选择这一款的原因是，它的硬件特性与 Linux 兼容，虽然我不能保证它与 Nvidia GTX 1050 一样。换句话说，你不应该去买一台 Linux 笔记本去玩游戏，那样会“玷污”你的游戏水平。如果是那样的话，它的硬件性能（它的性能很强大了）并不会让你满意，如果你愿意去研究并找到其它的选择，那就去做吧。

祝你采购顺利，并感谢阅读！

---

via: <https://www.hecticgeek.com/2017/12/best-linux-laptop/>

作者：[Gayan](https://www.hecticgeek.com/author/gayan/) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


如何在 Ubuntu 16.04 LTS 上用 Tomb 加密文件

Summary: 如今，大多数人都认为文件加密是必要的，甚至在 Linux 系统上也是如此。

如今，大多数人都认为文件加密是必要的，甚至在 Linux 系统上也是如此。

![](/data/attachment/album/201802/18/234345rz1g9a15v97go1fg.png)

如今，大多数人都认为文件加密是必要的，甚至在 Linux 系统上也是如此。 如果你和我一样, 最初被 Ubuntu 所吸引是因为 Linux 系统强化的安全性，恐怕我有个坏消息要告诉你：Linux 已经成为它自身“成功”的受害者。 近年来，用户数量的大幅度增加导致了这类系统的攻击和盗窃活动呈指数级增长。

曾经有一个非常简单的解决方案来在像 Ubuntu 这样的 Linux 系统上加密文件：它叫做 [Truecrypt](https://www.fossmint.com/secure-encrypt-files-folders-with-truecrypt-in-linux/)。 直到 2015 年，它提供了不同程度的军事级别的加密，并且在大多数 Linux 系统中运行良好。不幸的是, 它已经停止开发了, 因此变得相当不安全。

### 替代品

幸运的是，除了 Truecrypt，还有一些选择。 Truecrypt 的直接继承者是 [Veracrypt](https://www.fossmint.com/veracrypt-is-a-secure-alternative-encryption-tool-to-truecrypt-for-linux/) ，它由一群开发者从 Truecrypt 获取源代码并保持更新的。

该项目已经发展成为令人印象深刻的独立系统，但现在渐已老迈。旧系统，尤其是那些处理安全问题的系统，只能更新多次而才不会引入漏洞。

出于这个原因，在其他许多方面，应该寻找一个更外围一些的加密软件。我选择的是 Tomb。

### 为什么是 Tomb

在某些方面，Tomb 与其他加密软件非常相似。它将加密文件存储在专用的“Tomb 文件夹”中，可以让你快速查看您已加密的文件。

它还使用与 Veracrypt 类似的 [AES-256](https://www.dyne.org/software/tomb/) 加密标准。这个标准适用于 NSA 、微软和 Apple，并被认为是最安全的加密算法之一。如果你不熟悉加密技术，则应该阅读一点[技术背景知识](https://thebestvpn.com/advanced-encryption-standard-aes/)，但如果你只想快速、安全地加密，请不要担心， Tomb 将不负所望。

Tomb 也有一些很大的不同之处。首先，它是专门为 GNU/Linux 系统开发的，可以解决一些更广泛的加密软件的兼容性问题。

第二，尽管 Tomb 是开源的，但它使用的是静态链接库，以至于其源代码难以审计。 这意味着一些操作系统发行版开发者并不认为它是自由的，但是当涉及到安全软件时，这实际上是一件好事：这意味着与完全“自由”软件相比, Tomb 被黑客攻击的可能性更小。

最后，它有几个先进的功能，如<ruby> 隐写术 <rt>  steganography </rt></ruby>，这使你可以将你的关键文件隐藏在其他文件中。 尽管 Tomb 主要是一个命令行工具，它也带有 GUI 界面—— gtomb，它允许初学者用图形化的方式使用它。

这是推销么? 好吧，在我告诉你如何使用 Tomb 之前，值得注意的是，没有一个加密软件能提供完全的保护。 Tomb 不会让你的计算机隐藏于你 ISP，也不会保护存储在云中的文件。如果你想对云存储进行完全加密，您需要使用 Tor 浏览器和零日志 VPN 登录到你喜欢的存储服务中。 这里有很多选项，但是 [Trust Zone](https://privacyaustralia.org/trust-zone-vpn-review/) 是一个很好的浏览器，而 [Tinc](https://www.howtoforge.com/tutorial/how-to-properly-set-up-tinc-vpn-on-ubuntu-linux/) 是一个很好的 VPN 工具。

说了这么多，如果你正在寻找 Ubuntu 16.04 上的快速、简单、安全的加密，Tomb 无疑是一条可行的路。让我们开始吧。

### 在 Ubuntu 16.04 上安装 Tomb

因为 Tomb 是专门为 Linux 设计的, 所以安装非常简单。

几年前，SparkyLinux （它本身就是一个非常好的 Debian 衍生产品）的开发者们将 “Tomb” 添加到他们的官方存储库中。 你可以通过在 Ubuntu 系统上添加这些存储库来安装它。

要做到这一点， 打开一个终端并添加一个存储库文件：

```
sudo vi /etc/apt/sources.list.d/sparky-repo.list

```

然后在文件中添加以下行：

```
deb https://sparkylinux.org/repo stable main
deb-src https://sparkylinux.org/repo stable main
deb https://sparkylinux.org/repo testing main
deb-src https://sparkylinux.org/repo testing main

```

保存并关闭该文件。

你现在需要安装 Sparky 公钥，使用下列步骤：

```
sudo apt-get install sparky-keyring

```

或者：

```
wget -O - https://sparkylinux.org/repo/sparkylinux.gpg.key | sudo apt-key add -

```

然后你需要使用标准的命令来更新你的存储库：

```
sudo apt-get update

```

然后简单地使用 `apt` 安装 Tomb：

```
sudo apt-get install tomb

```

如果你想要带有 GUI 的 Tomb，安装同样简单。只需使用 `apt` 来安装 gtomb：

```
sudo apt-get install gtomb

```

就是这样，你现在应该安装好了一个可以工作的 Tomb。 让我们看看如何使用它。

### 使用 Tomb

#### 通过命令行使用 Tomb

Tomb 主要是一个命令行工具，所以我将首先介绍这个用法。 如果你不喜欢使用终端，你可以跳过这节并查看下一部分。

实际上，不用说了。 如果你以前从来没有使用过命令行，那么 Tomb 是一个很好的开始，因为它使用简单的命令，只要你小心，那么你很少有机会把事情搞砸。

Tomb 实际上使用了一组以墓地为主题的非常有趣的命令集。 每个加密文件夹都被称为“tomb”（墓碑） ，而且（我很快就会讲到) ，它们可以使用类似的哥特式命令。

首先，让我们创造（挖）一个新的 tomb。你可以指定你的新 tomb 的名称和大小，所以让我们使用 “Tomb1”这个名称并指定大小为 100 MB。

你需要 root 权限，所以打开终端并键入（或复制） ：

```
sudo tomb dig -s 100 Tomb1.tomb

```

你应该会得到类似这样的输出：

```
tomb . Commanded to dig tomb Tomb1.tomb
tomb (*) Creating a new tomb in Tomb1.tomb
tomb . Generating Tomb1.tomb of 100MiB
100 blocks (100Mb) written.
100+0 records in
100+0 records out
-rw------- 1 Tomb1 Tomb1 100M Jul 4 18:53 Tomb1.tomb
tomb (*) Done digging  Tomb1
tomb . Your tomb is not yet ready, you need to forge a key and lock it:
tomb . tomb forge Tomb1.tomb.key
tomb . tomb lock Tomb1.tomb -k Tomb1.tomb.key

```

正如输出的帮助说明，你现在需要创建（打造）一个密钥文件来锁定你的 tomb：

```
sudo tomb forge Tomb1.tomb.key

```

如果在此时出现提及“活动交换分区”的错误，则需要停用所有活动交换分区:

```
sudo swapoff -a

```

然后再运行上面的 keyfile 命令。

生成密钥文件可能需要几分钟时间，这具体取决于系统的速度。然而，在完成后系统会要求你输入新密码以确保密钥的安全：

[![](/data/attachment/album/201802/18/234347zkqq58hi4hzsq13g.png)](https://www.howtoforge.com/images/how_to_setup_and_install_tomb_on_ubuntu_1604/big/tomb1.png)

输入两次，然后你的新密钥文件就会被制作出来。

你现在需要用你的新密钥来锁定你的 tomb。你可以这样做：

```
sudo tomb lock Tomb1.tomb -k Tomb1.tomb.key

```

你将被要求输入你的密码。 这样做, 你应该会得到如下的输出：

```
tomb . Commanded to lock tomb Tomb1.tomb

[sudo] Enter password for user Tomb1 to gain superuser privileges

tomb . Checking if the tomb is empty (we never step on somebody else's bones).
tomb . Fine, this tomb seems empty.
tomb . Key is valid.
tomb . Locking using cipher: aes-xts-plain64:sha256
tomb . A password is required to use key Tomb1.tomb.key
tomb . Password OK.
tomb (*) Locking Tomb1.tomb with Tomb1.tomb.key
tomb . Formatting Luks mapped device.
tomb . Formatting your Tomb with Ext3/Ext4 filesystem.
tomb . Done locking Tomb1 using Luks dm-crypt aes-xts-plain64:sha256
tomb (*) Your tomb is ready in Tomb1.tomb and secured with key Tomb1.tomb.key

```

现在一切都安排好了，你可以开始使用你的新 tomb 了。

这里有一个注意事项：因为我只是在告诉你该怎么做，所以我把我的密钥文件和 tomb 存放在同一个目录中（在这里是 `$HOME`）。 你不应该这样做——把你的密钥存放在别的地方，最好是在除了你之外没有人能找到的地方。

然而，你需要记住你把它放在哪里，因为你需要用它来打开你的 tomb。 要做到这一点, 请输入：

```
sudo tomb open Tomb1.tomb -k path/to/your/Tomb1.tomb.key

```

输入你的密码，然后你就可以进去了。 tomb 会输出一些类似以下的内容:

```
tomb (*) Success unlocking tomb Tomb1
tomb . Checking filesystem via /dev/loop0
fsck from util-linux 2.27.1
Tomb1: clean, 11/25168 files, 8831/100352 blocks
tomb (*) Success opening Tomb1.tomb on /media/Tomb1

```

然后你应该看到你的新 tomb 挂载在了 finder 窗口。

你现在可以从 tomb 中保存和打开文件，但是请注意，你需要 root权限才能这样做。

在你使用完之后需要用以下方法卸载你的 tomb：

```
sudo tomb close

```

或者，如果你想强制关闭所有的打开的 tomb, 你可以使用：

```
sudo tomb slam all

```

#### 使用带 GUI 的 Tomb

如果你不喜欢使用命令行，或者只是想要一个图形界面，你可以使用 gtomb。与许多图形用户界面包装器不同， gtomb 使用起来很容易。

让我们来看看如何使用 gtomb 建立一个新的 tomb。 首先，从菜单中启动 gtomb。 它可能会是这 样的：

[![](/data/attachment/album/201802/18/234350m92dlwxsmr8srw0r.png)](https://www.howtoforge.com/images/how_to_setup_and_install_tomb_on_ubuntu_1604/big/tomb2.png)

所有的事情都是一目了然的，但为了完整起见，我将详细介绍如何建立你的第一个 tomb。

首先，点击第一个选项“dig”。 点击确定，然后选择一个位置。

接下来，输入你的 tomb 的大小：

[![](/data/attachment/album/201802/18/234352wabaab6azagnfadk.png)](https://www.howtoforge.com/images/how_to_setup_and_install_tomb_on_ubuntu_1604/big/tomb3.png)

你现在有了一个新的 tomb，但是你需要在使用它之前做一把钥匙。 要做到这一点, 请在主菜单中 单击“forge”：

[![](/data/attachment/album/201802/18/234356f24geojn5dvtj5ro.png)](https://www.howtoforge.com/images/how_to_setup_and_install_tomb_on_ubuntu_1604/big/tomb4.png)

Tomb 会要求你输入两次密码，那就这样做。

然后通过点击来使用密钥锁定你的 tomb，你已经猜到了，“lock”。 要打开它, 请单击“open”并再次输入您的密码。

从上面的截图中你可以看到，使用 gtomb 是非常容易的，你不应该遇到任何问题。 大多数常见的任务都可以通过点击来完成，对于任何更复杂的事情，你可以使用命令行。

### 最后的想法

就是这样！你现在应该准备好你的第一个 tomb 了，并存储任何你想在 tomb 中保密和安全的信息，这些信息会更加安全。

你可以同时使用多个 tomb，并将它们中的文件绑定到你的 `$HOME` 目录，这样你的程序就不会感到困惑。

我希望这本指南能帮助你开始。 就像使用一个标准的文件夹一样使用你的 Tomb，但是对于更复杂的命令，你总是可以查看 [Tomb 官方指南](https://www.dyne.org/software/tomb/)。

---

via: <https://www.howtoforge.com/tutorial/how-to-install-and-use-tomb-file-encryption-on-ubuntu-1604/>

作者： [Dan Fries](https://www.howtoforge.com/) 选题： [lujun9972](https://github.com/lujun9972) 译者： [Auk7F7](https://github.com/Auk7F7) 校对： [wxy](https://github.com/wxy)

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


脚本编程之骰子游戏

Summary: Bunco：一个使你的“快艇”游戏看起来更复杂的掷骰子游戏。

Bunco：一个使你的“快艇”游戏看起来更复杂的掷骰子游戏。

>
> Bunco：一个使你的“快艇”游戏看起来更复杂的掷骰子游戏。
>
>
>

![](/data/attachment/album/201802/20/132105bq9fgubptg9011yu.jpg)

我已经有段时间没有编写游戏了，所以我觉得现在正是做一些这方面事情的时候。起初，我想“用脚本编一个 Halo游戏？”（LCTT 译注：Halo，光晕系列游戏），但我后来意识到这不太可能。来编一个叫 Bunco 的简单骰子游戏吧。你也许没有听说过，不过你母亲绝对知道 —— 当一群年轻女孩聚在当地的酒吧或者小酒馆的时候，这是个很受欢迎的游戏。

游戏一共六轮，有三个骰子，规则很简单。每次投三个骰子，投出的点数要和当前的轮数数字一致。如果三个骰子都和当前的轮数一致，(比如，在第三轮三个骰子都是 3)，你这一轮的分数就是 21。 如果三个骰子点数都相同但和轮数数字不同，你会得到最低的 Bunco 分数，只有 5 分。如果你投出的点数两者都不是，每一个和当前轮数相同的骰子得 1 分。

要想玩这个游戏，它还涉及到团队合作，每一队（包括赢的那队），每人付 5 美元现金，或赢家得到其他类似现金奖励，并规定什么样的情况下才是赢家，例如“最多 Buncos” 或“最大点数”的情况下胜利。在这里我会跳过这些，而只关注投骰子这一部分。

### 关于数学逻辑部分

在专注于编程这方面的事之前，我先简单说说游戏背后的数学逻辑。要是有一个适当重量的骰子投骰子会变得很容易，任意一个值出现概率都是 1/6。

完全随机小提示：不确定你的骰子是否每个面都是一样重量? 把它们扔进盐水里然后掷一下。YouTube 上有一些有趣的 D&D 世界的视频向你展示了怎么来做这个测试。

所以三个骰子点数一样的几率有多大? 第一个骰子 100% 会有一个值 (这儿没什么可说的)，所以很简单。第二个则有 16.66% 的概率和第一个骰子的值一样，接下来第三个骰子也是一样。 但当然，总概率是三个概率相乘的结果，所以最后，三个骰子值相等的概率是 2.7%。

接下来，每个骰子和当前轮数数字相同的概率都是 16.66%。从数学角度来说：0.166 \* 0.166 \* 0.166 = 0.00462 。

换句话说，你有 0.46% 的可能性投出 Bunco，比 200 次中出现一次的可能性还小一点。

实际上还可以更难。如果你有 5 个骰子，投出 Mini Bunco (也可以叫做 Yahtzee “快艇”) 的概率为 0.077%，如果你想所有的骰子的值都相同，假设都是 6，那概率就是 0.00012%，那就基本上没什么可能了。

### 开始编程吧

和所有游戏一样，最难的部分是有一个能生成真正的随机数的随机数发生器。这一部分在 shell 脚本中还是很难实现的，所以我需要先回避这个问题，并假设 shell 内置的随机数发生器就够用了。

不过好在内置的随机数发生器很好用。用 `$RANDOM` 就能得到一个 `0` 到 `MAXINT(32767)` 之间的随机值：

```
$ echo $RANDOM $RANDOM $RANDOM
10252 22142 14863

```

为了确保产生的值一定是 `1` - `6` 之中的某个值，使用取余函数：

```
$ echo $(( $RANDOM % 6 ))
3
$ echo $(( $RANDOM % 6 ))
0

```

哦！我忘了要加 `1`，下面是另一次尝试：

```
$ echo $(( ( $RANDOM % 6 ) + 1 ))
6

```

下面要实现投骰子这一功能。这个函数中你可以声明一个局部变量来存储生成的随机值：

```
rolldie()
{
   local result=$1
   rolled=$(( ( $RANDOM % 6 ) + 1 ))
   eval $result=$rolled
}

```

使用 `eval` 确保生成的随机数被实际存储在变量中。这一部分也很容易：

```
rolldie die1

```

这会为第一个骰子生成一个 `1` - `6` 之间的随机值存储到 `die1` 中。要掷 3 个骰子，很简单：

```
rolldie die1 ; rolldie die2 ; rolldie die3

```

现在判断下生成的值。首先，判断是不是 Bunco（3 个骰子值相同），然后是不是和当前轮数值也相同：

```
if [ $die1 -eq $die2 ] && [ $die2 -eq $die3 ] ; then
  if [ $die1 -eq $round ] ; then
    echo "BUNCO!"
    score=25
  else
    echo "Mini Bunco!"
    score=5
  fi

```

这可能是所有判断语句中最难的部分了，注意第一个条件语句中这种不常用的写法 ： `[ cond1 ] && [ cond2 ]`。如果你想写成 `cond1 -a cond2` ，这样也可以。在 shell 编程中，解决问题的方法往往不止一种。

代码剩下的部分很直白，你只需要判断每个骰子的值是不是和本轮数字相同：

```
if [ $die1 -eq $round ] ; then
  score=1
fi
if [ $die2 -eq $round ] ; then
  score=$(( $score + 1 ))
fi
if [ $die3 -eq $round ] ; then
  score=$(( $score + 1 ))
fi

```

唯一要注意的是当出现 Bunco/Mini Bunco 就不需要再统计本轮分数了。所以整个第二部分的判断语句都要写在第一个条件语句的 `else` 中（为了判断 3 个骰子值是否都相同）。

把所有的综合起来，然后在命令行中输入轮数，下面是现在的脚本执行后的结果：

```
$ sh bunco.sh 5
You rolled: 1 1 5
score = 1
$ sh bunco.sh 2
You rolled: 6 4 3
score = 0
$ sh bunco.sh 1
You rolled: 1 1 1
BUNCO!
score = 25

```

竟然这么快就出现 Bunco 了? 好吧，就像我说的，shell 内置的随机数发生器在随机数产生这方面可能有些问题。

你可以再写个脚本测试一下，去运行上述脚本几百次，然后看看 Bunco/Mini Bunco 出现次数所占的百分比。但是我想把这部分作为练习，留给亲爱的读者你们。不过，也许我下次会抽时间完成剩下的部分。

让我们完成这一脚本吧，还有分数统计和一次性执行 6 次投骰子（这次不用再在命令行中手动输入当前轮数了）这两个功能。这也很容易，因为只是将上面的内容整个嵌套在里面，换句话说，就是将一个复杂的条件嵌套结构全部写在了一个函数中：

```
BuncoRound()
{
   # roll, display, and score a round of bunco!
   # round is specified when invoked, score added to totalscore

   local score=0 ; local round=$1 ; local hidescore=0

   rolldie die1 ; rolldie die2 ; rolldie die3
   echo Round $round. You rolled: $die1 $die2 $die3

   if [ $die1 -eq $die2 ] && [ $die2 -eq $die3 ] ; then
     if [ $die1 -eq $round ] ; then
       echo "  BUNCO!"
       score=25
       hidescore=1
     else
       echo "  Mini Bunco!"
       score=5
       hidescore=1
     fi
   else
     if [ $die1 -eq $round ] ; then
       score=1
     fi
     if [ $die2 -eq $round ] ; then
       score=$(( $score + 1 ))
     fi
     if [ $die3 -eq $round ] ; then
       score=$(( $score + 1 ))
     fi
   fi

   if [ $hidescore -eq 0 ] ; then
     echo "  score this round: $score"
   fi

   totalscore=$(( $totalscore + $score ))
}

```

我承认，我忍不住自己做了一点改进，包括判断当前是 Bunco、Mini Bunco 还是其他需要计算分数的情况这一部分 （这就是 `$hidescore` 这一变量的作用）。

实现这个简直是小菜一碟，只要一个循环就好了：

```
for round in {1..6} ; do
  BuncoRound $round
done

```

这就是现在所写的整个程序。让我们执行一下看看结果：

```

$ sh bunco.sh 1
Round 1\. You rolled: 2 3 3
  score this round: 0
Round 2\. You rolled: 2 6 6
  score this round: 1
Round 3\. You rolled: 1 2 4
  score this round: 0
Round 4\. You rolled: 2 1 4
  score this round: 1
Round 5\. You rolled: 5 5 6
  score this round: 2
Round 6\. You rolled: 2 1 3
  score this round: 0
Game over. Your total score was 4

```

嗯。并不是很令人满意，可能是因为它只是游戏的一次完整执行。不过，你可以将脚本执行几百几千次，记下“Game over”出现的位置，然后用一些快速分析工具来看看你在每 6 轮中有几次得分超过 3 分。（要让 3 个骰子值相同，这个概率大概在 50% 左右）。

无论怎么说，这都不是一个复杂的游戏，但是它是一个很有意思的小程序项目。现在，如果有一个 20 面的骰子，每一轮游戏有好几十轮，每轮都掷同一个骰子，情况又会发生什么变化呢?

---

via: <http://www.linuxjournal.com/content/shell-scripting-bunco-game>

作者：[Dave Taylor](http://www.linuxjournal.com/users/dave-taylor) 译者：[wenwensnow](https://github.com/wenwensnow) 校对：[wxy](https://github.com/wxy)

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


菜鸟们，通过这几个例子，包你学会 uptime 命令的用法

Summary: 望名生义，uptime 命令告诉你系统启动了（运行了）多长时间。这是语法：

望名生义，uptime 命令告诉你系统启动了（运行了）多长时间。这是语法：

![](/data/attachment/album/201802/20/143517d5vkxnsiziu5lqbu.jpg)

Linux 小白，若对系统管理有兴趣，或想成为资深用户，就需要对命令行有扎实的功底。你需要知道很多命令，其中一个就是 `uptime`。文本我们会通过一些容易理解的案例来讲解一下这个命令的基本用法。

再开始前有必要说一下，文中的所有案例都在 Ubuntu 16.04 上测试过了。

### Linux uptime 命令

望名生义，`uptime` 命令告诉你系统<ruby> 启动 <rt>  up </rt></ruby>了（运行了）多长时间。这是语法：

```
uptime [options]

```

这个工具的 man 页是这么说的：

>
> `uptime`会在一行中显示下列信息：当前时间、系统运行了多久时间、当前登录的用户有多少，以及前 1、5 和 15 分钟系统的平均负载。
>
>
>

下面这些问答形式的案例应该会让你对 `uptime` 命令有更好的了解。

### Q1、如何使用 uptime 命令

`uptime` 的基础用法很简单 —— 只需要输入命令名称然后按下回车就行。

```
uptime

```

这是输出：

[![How to use the uptime command](/data/attachment/album/201802/20/143526ahnt5s5bhp7n75z3.png)](https://www.howtoforge.com/images/usage_of_pfsense_to_block_dos_attack_/big/uptime-basic-usage1.png)

这里，第一项是当前时间，`up` 表示系统正在运行，`5:53` 是系统启动的总时间，最后是系统的<ruby> 负载 <rt>  load </rt></ruby>信息。若你想深入了解，这里是 uptime man 页中关于最后一项信息的说明：

>
> 系统负载是处于<ruby> 可运行 <rt>  runnable </rt></ruby>或<ruby> 不可中断 <rt>  uninterruptable </rt></ruby>状态的进程的平均数。可运行状态的进程要么正在使用 CPU 要么在等待使用 CPU。 不可中断状态的进程则正在等待某些 I/O 访问，例如等待磁盘 IO。
>
>
> 有三个时间间隔的平均值。负载均值的意义根据系统中 CPU 的数量不同而不同，负载为 1 对于一个只有单 CPU 的系统来说意味着负载满了，而对于一个拥有 4 CPU 的系统来说则意味着 75% 的时间里都是空闲的。
>
>
>

### Q2、如何以更人性化的格式现实时间

若你只想知道系统运行了多长时间，而且希望以更人性化的格式来显示，那么可以使用 `-p` 项。

```
uptime -p

```

这是输出：

[![make the tool show up time in pretty format](/data/attachment/album/201802/20/143528r94ojuekjy5uyejm.png)](https://www.howtoforge.com/images/usage_of_pfsense_to_block_dos_attack_/big/uptime-p-option.png)

### Q3、如何让 uptime 显示系统启动的日期/时间

你也可以指定 `uptme` 显示系统开始运行的时间和日期。方法是使用 `-s` 命令项。

```
uptime -s

```

这是输出：

[![make uptime display date/time since when system is up](/data/attachment/album/201802/20/143529h21w9yi51bcziwie.png)](https://www.howtoforge.com/images/usage_of_pfsense_to_block_dos_attack_/big/uptime-s.png)

### Q4、如何获取版本信息和帮助信息

`-V` 获取版本信息，`-h` 获取帮助信息。

```
uptime -V

uptime -h

```

[![How to get version information and help](/data/attachment/album/201802/20/143531r8bxo18fobfwk65d.png)](https://www.howtoforge.com/images/usage_of_pfsense_to_block_dos_attack_/big/uptime-v-h.png)

### 结论

你可以看到，uptime 命令很容易理解也很容易使用。它没有提供很多的功能（命令选项也很少）。这里已经覆盖了它的所有功能了。因此只需要练习一下这些选项你就能在日常工作中使用它了。如果需要的话，你也可以查看它的 [man 页](https://linux.die.net/man/1/uptime)。

---

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

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

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


什么是网络爬虫？网络爬虫如何工作？

Summary: 作为一个狂热的互联网人，你在生活中一定遇到过网络爬虫（Web Crawler）这个词。那么什么是网络爬虫，谁使用网络爬虫？它是如何工作的？让我们在本文中讨论这些。

![](/data/attachment/album/201802/20/144220dz8isfp9ebsede8d.jpg)

作为一个狂热的互联网人，你在生活中一定遇到过<ruby> 网络爬虫 <rt>  Web Crawler </rt></ruby>这个词。那么什么是网络爬虫，谁使用网络爬虫？它是如何工作的？让我们在本文中讨论这些。

### 什么是网络爬虫？

[![web crawler source code sync](/data/attachment/album/201802/20/144221he4yp9n94l9svim9.jpg)](http://www.theitstuff.com/wp-content/uploads/2017/12/crawler.jpeg)

<ruby> 网络爬虫 <rt>  Web Crawler </rt></ruby>也被称为<ruby> 网络蜘蛛 <rt>  web-spider </rt></ruby>是一个在互联网中访问不同网站的各个页面的互联网软件或者机器人。网络爬虫从这些网页中检索各种信息并将其存储在其记录中。这些抓取工具主要用于从网站收集内容以改善搜索引擎的搜索。

### 谁使用网络爬虫？

大多数搜索引擎使用爬虫来收集来自公共网站的越来越多的内容，以便它们可以向用户提供更多相关内容。

[![search engines use web crawlers](/data/attachment/album/201802/20/144221y2ne1ndmn4dx1mk1.png)](http://www.theitstuff.com/wp-content/uploads/2017/12/sengine.png)

许多商业机构使用网络爬虫专门搜索人们的电子邮件地址和电话号码，以便他们可以向你发送促销优惠和其他方案。这基本上是垃圾邮件，但这是大多数公司创建邮件列表的方式。

黑客使用网络爬虫来查找网站文件夹中的所有文件，主要是 HTML 和 Javascript。然后他们尝试通过使用 XSS 来攻击网站。

### 网络爬虫如何工作？

网络爬虫是一个自动化脚本，它所有行为都是预定义的。爬虫首先从要访问的 URL 的初始列表开始，这些 URL 称为种子。然后它从初始的种子页面确定所有其他页面的超链接。网络爬虫然后将这些网页以 HTML 文档的形式保存，这些 HTML 文档稍后由搜索引擎处理并创建一个索引。

### 网络爬虫和 SEO

网络爬虫对 SEO，也就是<ruby> 搜索引擎优化 <rt>  Search Engine Optimization </rt></ruby>有很大的影响。由于许多用户使用 Google，让 Google 爬虫为你的大部分网站建立索引非常重要。这可以通过许多方式来完成，包括不使用重复的内容，并在其他网站上具有尽可能多的反向链接。许多网站被认为是滥用这些技巧，最终被引擎列入黑名单。

### robots.txt

`robots.txt` 是爬虫在抓取你的网站时寻找的一种非常特殊的文件。该文件通常包含有关如何抓取你的网站的信息。一些网站管理员故意不希望他们的网站被索引也可以通过使用 `robots.txt` 文件阻止爬虫。

### 总结

爬虫是一个小的软件机器人，可以用来浏览很多网站，并帮助搜索引擎从网上获得最相关的数据。

---

via: <http://www.theitstuff.com/web-crawler-web-crawlers-work>

作者：[Rishabh Kandari](http://www.theitstuff.com/author/reevkandari) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


在 Linux 中如何编写基本的 udev 规则

Summary: 理解 udev 背后的基本概念，学习如何写简单的规则。

理解 udev 背后的基本概念，学习如何写简单的规则。

![](/data/attachment/album/201802/20/150625yjhjrmmrzvsmmy6e.jpg)

### 读者对象

理解 udev 背后的基本概念，学习如何写简单的规则。

### 要求

* root 权限

### 难度

中等

### 约定

* `#` - 要求给定的命令使用 root 权限或者直接以一个 root 用户或者使用 `sudo` 命令去运行。
* `$` - 要求给定的命令以一个普通的非特权用户运行。

### 介绍

在 GNU/Linux 系统中，虽然设备的底层支持是在内核层面处理的，但是，它们相关的事件管理是在用户空间中通过 `udev` 来管理的。确切地说是由 `udevd` 守护进程来完成的。学习如何去写规则，并应用到发生的这些事件上，将有助于我们修改系统的行为并使它适合我们的需要。

### 规则如何组织

udev 规则是定义在一个以 `.rules` 为扩展名的文件中。那些文件主要放在两个位置：`/usr/lib/udev/rules.d`，这个目录用于存放系统安装的规则；`/etc/udev/rules.d/` 这个目录是保留给自定义规则的。

定义那些规则的文件的命名惯例是使用一个数字作为前缀（比如，`50-udev-default.rules`），并且以它们在目录中的词汇顺序进行处理的。在 `/etc/udev/rules.d` 中安装的文件，会覆盖安装在系统默认路径中的同名文件。

### 规则语法

如果你理解了 udev 规则的行为逻辑，它的语法并不复杂。一个规则由两个主要的节构成：`match` 部分，它使用一系列用逗号分隔的键定义了规则应用的条件，而 `action` 部分，是当条件满足时，我们执行一些动作。

### 测试案例

讲解可能的选项的最好方法莫过于配置一个真实的案例，因此，我们去定义一个规则作为演示，当鼠标被连接时禁用触摸板。显然，在该规则定义中提供的属性将反映我的硬件。

我们将在 `/etc/udev/rules.d/99-togglemouse.rules` 文件中用我们喜欢的文本编辑器来写我们的规则。一条规则定义允许跨多个行，但是，如果是这种情况，必须在一个换行字符之前使用一个反斜线（`\`）表示行的延续，就和 shell 脚本一样。这是我们的规则：

```
ACTION=="add" \
, ATTRS{idProduct}=="c52f" \
, ATTRS{idVendor}=="046d" \
, ENV{DISPLAY}=":0" \
, ENV{XAUTHORITY}="/run/user/1000/gdm/Xauthority" \
, RUN+="/usr/bin/xinput --disable 16"

```

我们来分析一下这个规则。

### 操作符

首先，对已经使用以及将要使用的操作符解释如下：

#### == 和 != 操作符

`==` 是相等操作符，而 `!=` 是不等于操作符。通过使用它们，我们可以确认规则上应用的键是否匹配各自的值。

#### 分配操作符 = 和 :=

`=` 是赋值操作符，是用于为一个键赋值。当我们想要赋值，并且想确保它不会被其它规则所覆盖，我们就需要使用 `:=` 操作符来代替，使用这个操作符分配的值，它就不能被改变。

#### += 和 -= 操作符

`+=` 和 `-=` 操作符各自用于从一个指定的键定义的值列表中增加或者移除一个值。

### 我们使用的键

现在，来分析一下在这个规则中我们使用的键。首先，我们有一个 `ACTION` 键：通过使用它，当在一个设备上发生了特定的事件，我们将指定我们要应用的规则的具体内容。有效的值有 `add`、`remove`  以及 `change`。

然后，我们使用 `ATTRS` 关键字去指定一个属性去匹配。我们可以使用 `udevadm info` 命令去列出一个设备属性，提供它的名字或者 `sysfs` 路径即可：

```
udevadm info -ap /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39':
    KERNEL=="input39"
    SUBSYSTEM=="input"
    DRIVER==""
    ATTR{name}=="Logitech USB Receiver"
    ATTR{phys}=="usb-0000:00:1d.0-1.2/input1"
    ATTR{properties}=="0"
    ATTR{uniq}==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010':
    KERNELS=="0003:046D:C52F.0010"
    SUBSYSTEMS=="hid"
    DRIVERS=="hid-generic"
    ATTRS{country}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1':
    KERNELS=="2-1.2:1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{bInterfaceNumber}=="01"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2':
    KERNELS=="2-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="98mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bcdDevice}=="3000"
    ATTRS{bmAttributes}=="a0"
    ATTRS{busnum}=="2"
    ATTRS{configuration}=="RQR30.00_B0009"
    ATTRS{devnum}=="12"
    ATTRS{devpath}=="1.2"
    ATTRS{idProduct}=="c52f"
    ATTRS{idVendor}=="046d"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Logitech"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="USB Receiver"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="removable"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="1401"
    ATTRS{version}==" 2.00"

    [...]

```

上面截取了运行这个命令之后的输出的一部分。正如你从它的输出中看到的那样，`udevadm` 从我们提供的指定路径开始，并且提供了所有父级设备的信息。注意设备的属性都是以单数的形式报告的（比如，`KERNEL`），而它的父级是以复数形式出现的（比如，`KERNELS`）。父级信息可以做为规则的一部分，但是同一时间只能有一个父级可以被引用：不同父级设备的属性混合在一起是不能工作的。在上面我们定义的规则中，我们使用了一个父级设备属性：`idProduct` 和 `idVendor`。

在我们的规则中接下来做的事情是，去使用 `ENV` 关键字：它既可以用于设置也可以用于去匹配环境变量。我们给 `DISPLAY` 和 `XAUTHORITY` 分配值。当我们使用 X 服务器程序进行交互去设置一些需要的信息时，这些变量是非常必要的：使用 `DISPLAY` 变量，我们指定服务器运行在哪个机器上，用的是哪个显示和屏幕；使用 `XAUTHORITY` 提供了一个文件路径，其包含了 Xorg 认证和授权信息。这个文件一般位于用户的家目录中。

最后，我们使用了 `RUN` 字：它用于运行外部程序。非常重要：这里没有立即运行，但是一旦所有的规则被解析，将运行各种动作。在这个案例中，我们使用 `xinput` 实用程序去改变触摸板的状态。我不想解释这里的 `xinput` 的语法，它超出了本文的范围，只需要注意这个触摸板的 ID 是 `16`。

规则设置完成之后，我们可以通过使用 `udevadm test` 命令去调试它。这个命令对调试非常有用，它并不真实去运行 `RUN` 指定的命令：

```
$ udevadm test --action="add" /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39

```

我们提供给命令的是使用 `--action` 选项，以及设备的 sysfs 路径的模拟动作。如果没有报告错误，说明我们的规则运行的很好。要在真实的环境中去使用它，我们需要重新加载规则：

```
# udevadm control --reload

```

这个命令将重新加载规则文件，但是，它只对重新加载之后发生的事件有效果。

我们通过创建一个 udev 规则了解了基本的概念和逻辑，这只是 udev 规则中众多的选项和可能的设置中的一小部分。udev 手册页提供了一个详尽的列表，如果你想深入了解，请参考它。

---

via: <https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux>

作者：[Egidio Docile](https://disqus.com/by/egidiodocile/) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


用一些超酷的功能使 Vim 变得更强大

![](/data/attachment/album/201802/21/092153sxdxup1o8xoxqlks.jpg)

Vim 是每个 Linux 发行版]中不可或缺的一部分，也是 Linux 用户最常用的工具（当然是基于终端的）。至少，这个说法对我来说是成立的。人们可能会在利用什么工具进行程序设计更好方面产生争议，的确 Vim 可能不是一个好的选择，因为有很多不同的 IDE 或其它类似于 Sublime Text 3，Atom 等使程序设计变得更加容易的成熟的文本编辑器。

### 我的感想

但我认为，Vim 应该从一开始就以我们想要的方式运作，而其它编辑器让我们按照已经设计好的方式工作，实际上不是我们想要的工作方式。我不会过多地谈论其它编辑器，因为我没有过多地使用过它们（我对 Vim 情有独钟）。

不管怎样，让我们用 Vim 来做一些事情吧，它完全可以胜任。

### 利用 Vim 进行程序设计

#### 执行代码

考虑一个场景，当我们使用 Vim 设计 C++ 代码并需要编译和运行它时，该怎么做呢。

(a). 我们通过 `Ctrl + Z` 返回到终端，或者利用 `:wq` 保存并退出。

(b). 但是任务还没有结束，接下来需要在终端上输入类似于 `g++ fileName.cxx` 的命令进行编译。

(c). 接下来需要键入 `./a.out` 执行它。

为了让我们的 C++ 代码在 shell 中运行，需要做很多事情。但这似乎并不是利用 Vim 操作的方法（ Vim 总是倾向于把几乎所有操作方法利用一两个按键实现）。那么，做这些事情的 Vim 的方式究竟是什么?

#### Vim 方式

Vim 不仅仅是一个文本编辑器，它是一种编辑文本的编程语言。这种帮助我们扩展 Vim 功能的编程语言是 “VimScript”（LCTT 译注： Vim 脚本）。

因此，在 VimScript 的帮助下，我们可以只需一个按键轻松地将编译和运行代码的任务自动化。

[![create functions in vim .vimrc](/data/attachment/album/201802/21/092153qfitt02ftv2ppz0u.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_orig.png)

以上是在我的 `.vimrc` 配置文件里创建的一个名为 `CPP()` 函数的片段。

#### 利用 VimScript 创建函数

在 VimScript 中创建函数的语法非常简单。它以关键字 `func` 开头，然后是函数名（在 VimScript 中函数名必须以大写字母开头，否则 Vim 将提示错误）。在函数的结尾用关键词 `endfunc`。

在函数的主体中，可以看到 `exec` 语句，无论您在 `exec` 关键字之后写什么，都会在 Vim 的命令模式上执行（记住，就是在 Vim 窗口的底部以 `:` 开始的命令）。现在，传递给 `exec` 的字符串是（LCTT 译注：`:!clear && g++ % && ./a.out`） -

[![vim functions commands & symbols](/data/attachment/album/201802/21/092153w9ll2l5glc2332cr.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_1_orig.png)

当这个函数被调用时，它首先清除终端屏幕，因此只能看到输出，接着执行 `g++` 处理你工作的文件，然后运行由前一步编译而形成的 `a.out` 文件。

#### 将 ctrl+r 映射为运行 C++ 代码

我将语句 `call CPP()` 映射到键组合 `Ctrl+r`，以便我现在可以按 `Ctrl+r` 来执行我的 C++ 代码，无需手动输入 `:call CPP()`，然后按 `Enter` 键。

#### 最终结果

我们终于找到了 Vim 方式的操作方法。现在，你只需按一个（组合）键，你编写的 C++ 代码就输出在你的屏幕上，你不需要键入所有冗长的命令了。这也节省了你的时间。

我们也可以为其他语言实现这类功能。

[![create function in vim for python](/data/attachment/album/201802/21/092154p3t3b1eweh761g13.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_2_orig.png)

对于Python：您可以按下 `Ctrl+e` 解释执行您的代码。

[![create function in vim for java](/data/attachment/album/201802/21/092154idydnd723dunqeve.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_3_orig.png)

对于Java：您现在可以按下 `Ctrl+j`，它将首先编译您的 Java 代码，然后执行您的 Java 类文件并显示输出。

### 进一步提高

所以，这就是如何在 Vim 中操作的方法。现在，我们来看看如何在 Vim 中实现所有这些。我们可以直接在 Vim 中使用这些代码片段，而另一种方法是使用 Vim 中的自动命令 `autocmd`。`autocmd` 的优点是这些命令无需用户调用，它们在用户所提供的任何特定条件下自动执行。

我想用 autocmd 实现这个，而不是对每种语言使用不同的映射，执行不同程序设计语言编译出的代码。

[![autocmd in vimrc](/data/attachment/album/201802/21/092154u3lkcdqwoohw6r60.png)](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_4_orig.png)

在这里做的是，为所有的定义了执行相应文件类型代码的函数编写了自动命令。

会发生什么？当我打开任何上述提到的文件类型的缓冲区， Vim 会自动将 `Ctrl + r` 映射到函数调用，而 `<CR>` 表示回车键，这样就不需要每完成一个独立的任务就按一次回车键了。

为了实现这个功能，您只需将函数片段添加到 `.vimrc` 文件中，然后将所有这些 `autocmd` 也一并添加进去。这样，当您下一次打开 Vim 时，Vim 将拥有所有相应的功能来执行所有具有相同绑定键的代码。

### 总结

就这些了。希望这些能让你更爱 Vim 。我目前正在探究 Vim 中的一些内容，正阅读文档，补充 `.vimrc` 文件，当我研究出一些成果后我会再次与你分享。

如果你想看一下我现在的 `.vimrc` 文件，这是我的 Github 账户的链接: [MyVimrc](https://github.com/phenomenal-ab/VIm-Configurations/blob/master/.vimrc)。

期待你的好评。

---

via: <http://www.linuxandubuntu.com/home/making-vim-even-more-awesome-with-these-cool-features>

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

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


会话与 Cookie：用户登录的原理是什么?

![](/data/attachment/album/201802/21/115419r2ix9xosmaqminbx.jpg)

Facebook、 Gmail、 Twitter 是我们每天都会用的网站（LCTT 译注：才不是呢）。它们的共同点在于都需要你登录进去后才能做进一步的操作。只有你通过认证并登录后才能在 twitter 发推，在 Facebook 上评论，以及在 Gmail上处理电子邮件。

[![gmail, facebook login page](/data/attachment/album/201802/21/115432ezu3wuucuuupsdt3.jpg)](http://www.theitstuff.com/wp-content/uploads/2017/10/Untitled-design-1.jpg)

那么登录的原理是什么？网站是如何认证的？它怎么知道是哪个用户从哪儿登录进来的？下面我们来对这些问题进行一一解答。

### 用户登录的原理是什么?

每次你在网站的登录页面中输入用户名和密码时，这些信息都会发送到服务器。服务器随后会将你的密码与服务器中的密码进行验证。如果两者不匹配，则你会得到一个错误密码的提示。如果两者匹配，则成功登录。

### 登录时发生了什么?

登录后，web 服务器会初始化一个<ruby> 会话 <rt>  session </rt></ruby>并在你的浏览器中设置一个 cookie 变量。该 cookie 变量用于作为新建会话的一个引用。搞晕了？让我们说的再简单一点。

### 会话的原理是什么?

服务器在用户名和密码都正确的情况下会初始化一个会话。会话的定义很复杂，你可以把它理解为“关系的开始”。

[![session beginning of a relationship or partnership](/data/attachment/album/201802/21/115432xboligovi3ylyrlg.png)](http://www.theitstuff.com/wp-content/uploads/2017/10/pasted-image-0-9.png)

认证通过后，服务器就开始跟你展开一段关系了。由于服务器不能象我们人类一样看东西，它会在我们的浏览器中设置一个 cookie 来将我们的关系从其他人与服务器的关系标识出来。

### 什么是 Cookie?

cookie 是网站在你的浏览器中存储的一小段数据。你应该已经见过他们了。

[![theitstuff official facebook page cookies](/data/attachment/album/201802/21/115433rxip79d1957z0bk1.png)](http://www.theitstuff.com/wp-content/uploads/2017/10/pasted-image-0-1-4.png)

当你登录后，服务器为你创建一段关系或者说一个会话，然后将唯一标识这个会话的会话 id 以 cookie 的形式存储在你的浏览器中。

### 什么意思?

所有这些东西存在的原因在于识别出你来，这样当你写评论或者发推时，服务器能知道是谁在发评论，是谁在发推。

当你登录后，会产生一个包含会话 id 的 cookie。这样，这个会话 id 就被赋予了那个输入正确用户名和密码的人了。

[![facebook cookies in web browser](/data/attachment/album/201802/21/115433jpxxfhxlz02fbcrv.png)](http://www.theitstuff.com/wp-content/uploads/2017/10/pasted-image-0-2-3-e1508926255472.png)

也就是说，会话 id 被赋予给了拥有这个账户的人了。之后，所有在网站上产生的行为，服务器都能通过他们的会话 id 来判断是由谁发起的。

### 如何让我保持登录状态?

会话有一定的时间限制。这一点与现实生活中不一样，现实生活中的关系可以在不见面的情况下持续很长一段时间，而会话具有时间限制。你必须要不断地通过一些动作来告诉服务器你还在线。否则的话，服务器会关掉这个会话，而你会被登出。

[![websites keep me logged in option](/data/attachment/album/201802/21/115434bwn14z1wudgptrgo.png)](http://www.theitstuff.com/wp-content/uploads/2017/10/pasted-image-0-3-3-e1508926314117.png)

不过在某些网站上可以启用“保持登录”功能，这样服务器会将另一个唯一变量以 cookie 的形式保存到我们的浏览器中。这个唯一变量会通过与服务器上的变量进行对比来实现自动登录。若有人盗取了这个唯一标识（我们称之为 cookie stealing），他们就能访问你的账户了。

### 结论

我们讨论了登录系统的工作原理以及网站是如何进行认证的。我们还学到了什么是会话和 cookies，以及它们在登录机制中的作用。

我们希望你们以及理解了用户登录的工作原理，如有疑问，欢迎提问。

---

via: <http://www.theitstuff.com/sessions-cookies-user-login-work>

作者：[Rishabh Kandari](http://www.theitstuff.com/author/reevkandari) 译者：[lujun9972](https://github.com/lujun9972) 校对：[wxy](https://github.com/wxy)

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


如何 Docker 化编译的软件

Summary: 我写了一个中等篇幅的评论解释了我如何用常规的方式为我想要的软件进行 Docker 化的。

![](/data/attachment/album/201802/21/121232xxx3wsf642xwv62m.jpg)

我最近在 [docker-library/php](https://github.com/docker-library/php) 仓库中关闭了大量问题，最老的（并且是最长的）讨论之一是关于安装编译扩展的依赖关系，我写了一个[中等篇幅的评论](https://github.com/docker-library/php/issues/75#issuecomment-353673374)解释了我如何用常规的方式为我想要的软件进行 Docker 化的。

我要在这里复制大部分的评论内容，或许扩展一点点，以便有一个更好的/更干净的链接！

我第一步是编写 `Dockerfile` 的原始版本：下载源码，运行 `./configure && make` 等，清理。然后我尝试构建我的原始版本，并希望在这过程中看到错误消息。（对，真的！）

错误信息通常以 `error: could not find "xyz.h"` 或 `error: libxyz development headers not found` 的形式出现。

如果我在 Debian 中构建，我会输入 `https://packages.debian.org/file:xyz.h`（用错误信息中头文件的名称替换 “xyz.h”），或者在谷歌中搜索像 “xyz.h debian” 这样的东西，找出我需要的包的名称。

如果我在 Alpine 中构建，我将使用 <https://pkgs.alpinelinux.org/contents> 进行类似的搜索。

“libxyz development headers” 在某种程度上也是一样的，但是根据我的经验，对于这些用 Google 对开发者来说效果更好，因为不同的发行版和项目会以不同的名字来调用这些开发包，所以有时候更难确切的知道哪一个是“正确”的。

当我得到包名后，我将这个包名称添加到我的 `Dockerfile` 中，清理之后，然后重复操作。最终通常会构建成功。偶尔我发现某些库不在 Debian 或 Alpine 中，或者是不够新的，由此我必须从源码构建它，但这些情况在我的经验中很少见 —— 因人而异。

我还会经常查看 Debian（通过 <https://sources.debian.org>）或 Alpine（通过 <https://git.alpinelinux.org/cgit/aports/tree>）我要编译的软件包源码，特别关注 `Build-Depends`（如 [`php7.0=7.0.26-1` 的 `debian/control` 文件](https://sources.debian.org/src/php7.0/7.0.26-1/debian/control/)）以及/或者 `makedepends` （如 [`php7` 的 `APKBUILD` 文件](https://git.alpinelinux.org/cgit/aports/tree/community/php7/APKBUILD?id=d0ca197f031f96d4664cafaa618aeccf94640a1e)）用于包名线索。

就我个人而言，我觉得这种侦探工作很有趣，也很有收获，但我意识到我可能是一个独特的生物。我偶尔使用的另一个技术是看是否有人已经 Docker 化了我想要的东西，这样我可以直接从他们的 `Dockerfile` 中知道我需要安装的东西。

对于特定的 PHP 扩展，几乎总是有人已经想出对于这个或那个模块需要的依赖，而我所要做的就是做一些轻量的工作找出它们。

不管怎样，这就是我的方法！希望这个有帮助，玩得愉快！

---

via: <https://tianon.github.io/post/2017/12/26/dockerize-compiled-software.html>

作者：[Tianon Gravi](https://tianon.github.io) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


Telnet，爱一直在

Summary: 登录远程服务器，你可能不会也从未考虑过它。但这并不意味着 telnet 命令在调试远程连接问题时不是一个实用的工具。

厉害了

![](/data/attachment/album/201802/22/105938exdcxkgw6hccg772.jpg)

Telnet，是系统管理员登录远程服务器的一种协议和工具。然而，由于所有的通信都没有加密，包括密码，都是明文发送的。Telnet 在 SSH 被开发出来之后就基本弃用了。

登录远程服务器，你可能不会也从未考虑过它。但这并不意味着 `telnet` 命令在调试远程连接问题时不是一个实用的工具。

本教程中，我们将探索使用 `telnet` 解决所有常见问题：“我怎么又连不上啦？”

这种讨厌的问题通常会在安装了像 Web服务器、邮件服务器、ssh 服务器、Samba 服务器等诸如此类的事之后遇到，用户无法连接服务器。

`telnet` 不会解决问题但可以很快缩小问题的范围。

`telnet` 用来调试网络问题的简单命令和语法：

```
telnet <hostname or IP> <port>

```

因为 `telnet` 最初通过端口建立连接不会发送任何数据，适用于任何协议，包括加密协议。

连接问题服务器有四个可能会遇到的主要问题。我们会研究这四个问题，研究它们意味着什么以及如何解决。

本教程默认已经在 `samba.example.com` 安装了 [Samba](https://www.samba.org/) 服务器而且本地客户无法连上服务器。

### Error 1 - 连接挂起

首先，我们需要试着用 `telnet` 连接 Samba 服务器。使用下列命令 (Samba 监听端口445)：

```
telnet samba.example.com 445

```

有时连接会莫名停止：

```
telnet samba.example.com 445
Trying 172.31.25.31...

```

这意味着 `telnet` 没有收到任何回应来建立连接。有两个可能的原因：

1. 你和服务器之间有个路由器宕掉了。
2. 防火墙拦截了你的请求。

为了排除第 1 点，对服务器上进行一个快速 [`mtr samba.example.com`](https://www.systutorials.com/docs/linux/man/8-mtr/) 。如果服务器是可达的，那么便是防火墙（注意：防火墙总是存在的）。

首先用 `iptables -L -v -n` 命令检查服务器本身有没有防火墙，没有的话你能看到以下内容：

```
iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination

```

如果你看到其他东西那可能就是问题所在了。为了检验，停止 `iptables` 一下并再次运行 `telnet samba.example.com 445` 看看你是否能连接。如果你还是不能连接看看你的提供商或企业有没有防火墙拦截你。

### Error 2 - DNS 问题

DNS 问题通常发生在你正使用的主机名没有解析到 IP 地址。错误如下：

```
telnet samba.example.com 445
Server lookup failure: samba.example.com:445, Name or service not known

```

第一步是把主机名替换成服务器的 IP 地址。如果你可以连上那么就是主机名的问题。

有很多发生的原因（以下是我见过的）：

1. 域名注册了吗？用 `whois` 来检验。
2. 域名过期了吗？用 `whois` 来检验。
3. 是否使用正确的主机名？用 `dig` 或 `host` 来确保你使用的主机名解析到正确的 IP。
4. 你的 **A** 记录正确吗？确保你没有偶然创建类似 `smaba.example.com` 的 **A** 记录。

一定要多检查几次拼写和主机名是否正确（是 `samba.example.com` 还是 `samba1.example.com`）？这些经常会困扰你，特别是比较长、难记或其它国家的主机名。

### Error 3 - 服务器没有侦听端口

这种错误发生在 `telnet` 可达服务器但是指定端口没有监听。就像这样：

```
telnet samba.example.com 445
Trying 172.31.25.31...
telnet: Unable to connect to remote host: Connection refused

```

有这些原因：

1. 你 **确定** 连接的是正确的服务器？
2. 你的应用服务器没有侦听预期的端口。在服务器上运行 `netstat -plunt` 来查看它究竟在干什么并看哪个端口才是对的，实际正在监听中的。
3. 应用服务器没有运行。这可能突然而又悄悄地发生在你启动应用服务器之后。启动服务器运行 `ps auxf` 或 `systemctl status application.service` 查看运行。

### Error 4 - 连接被服务器关闭

这种错误发生在连接成功建立但是应用服务器建立的安全措施一连上就将其结束。错误如下：

```
telnet samba.example.com 445
Trying 172.31.25.31...
Connected to samba.example.com.
Escape character is '^]'.
Connection closed by foreign host.

```

最后一行 `Connection closed by foreign host.` 意味着连接被服务器主动终止。为了修复这个问题，需要看看应用服务器的安全设置确保你的 IP 或用户允许连接。

### 成功连接

成功的 `telnet` 连接如下：

```
telnet samba.example.com 445
Trying 172.31.25.31...
Connected to samba.example.com.
Escape character is '^]'.

```

连接会保持一段时间只要你连接的应用服务器时限没到。

输入 `CTRL+]` 中止连接，然后当你看到 `telnet>` 提示，输入 `quit` 并按回车：

```
telnet samba.example.com 445
Trying 172.31.25.31...
Connected to samba.example.com.
Escape character is '^]'.
^]
telnet> quit
Connection closed.

```

### 总结

客户程序连不上服务器的原因有很多。确切原因很难确定，特别是当客户是图形用户界面提供很少或没有错误信息。用 `telnet` 并观察输出可以让你很快确定问题所在节约很多时间。

---

via: <https://bash-prompt.net/guides/telnet/>

作者：[Elliot Cooper](https://bash-prompt.net) 译者：[XYenChi](https://github.com/XYenChi) 校对：[wxy](https://github.com/wxy)

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


containerd 1.0 探索之旅

![](/data/attachment/album/201802/22/124722gibtz0ag72azo442.jpg)

我们在过去的文章中讨论了一些 containerd 的不同特性，它是如何设计的，以及随着时间推移已经修复的一些问题。containerd 被用于 Docker、Kubernetes CRI、以及一些其它的项目，在这些平台中事实上都使用了 containerd，而许多人并不知道 containerd 存在于这些平台之中，这篇文章就是为这些人所写的。我将来会写更多的关于 containerd 的设计以及特性集方面的文章，但是现在，让我们从它的基础知识开始。

![](/data/attachment/album/201802/22/124733dmzlyg59eg0i3rmh.jpg)

我认为容器生态系统有时候可能很复杂。尤其是我们所使用的术语。它是什么？一个运行时，还是别的？一个运行时 … containerd（它的发音是 “container-dee”）正如它的名字，它是一个容器守护进程，而不是一些人忽悠我的“<ruby> 收集 <rt>  contain </rt></ruby><ruby> 迷 <rt>  nerd </rt></ruby>”。它最初是作为 OCI 运行时（就像 runc 一样）的集成点而构建的，在过去的六个月中它增加了许多特性，使其达到了像 Docker 这样的现代容器平台以及像 Kubernetes 这样的编排平台的需求。

那么，你使用 containerd 能去做些什么呢？你可以拥有推送或拉取功能以及镜像管理。可以拥有容器生命周期 API 去创建、运行、以及管理容器和它们的任务。一个完整的专门用于快照管理的 API，以及一个其所依赖的开放治理的项目。如果你需要去构建一个容器平台，基本上你不需要去处理任何底层操作系统细节方面的事情。我认为关于 containerd 中最重要的部分是，它有一个版本化的并且有 bug 修复和安全补丁的稳定 API。

![](/data/attachment/album/201802/22/124741loyjfe3oyqbew3la.jpg)

由于在内核中没有一个 Linux 容器这样的东西，因此容器是多种内核特性捆绑在一起而成的，当你构建一个大型平台或者分布式系统时，你需要在你的管理代码和系统调用之间构建一个抽象层，然后将这些特性捆绑粘接在一起去运行一个容器。而这个抽象层就是 containerd 的所在之处。它为稳定类型的平台层提供了一个客户端，这样平台可以构建在顶部而无需进入到内核级。因此，可以让使用容器、任务、和快照类型的工作相比通过管理调用去 clone() 或者 mount() 要友好的多。与灵活性相平衡，直接与运行时或者宿主机交互，这些对象避免了常规的高级抽象所带来的性能牺牲。结果是简单的任务很容易完成，而困难的任务也变得更有可能完成。

![containerd](/data/attachment/album/201802/22/125521kllr1slfonf58qd2.jpg)

containerd 被设计用于 Docker 和 Kubernetes、以及想去抽象出系统调用或者在 Linux、Windows、Solaris 以及其它的操作系统上特定的功能去运行容器的其它容器系统。考虑到这些用户的想法，我们希望确保 containerd 只拥有它们所需要的东西，而没有它们不希望的东西。事实上这是不太可能的，但是至少我们想去尝试一下。虽然网络不在 containerd 的范围之内，它并不能做成让高级系统可以完全控制的东西。原因是，当你构建一个分布式系统时，网络是非常中心的地方。现在，对于 SDN 和服务发现，相比于在 Linux 上抽象出 netlink 调用，网络是更特殊的平台。大多数新的网络都是基于路由的，并且每次一个新的容器被创建或者删除时，都会请求更新路由表。服务发现、DNS 等等都需要及时被通知到这些改变。如果在 containerd 中添加对网络的管理，为了能够支持不同的网络接口、钩子、以及集成点，将会在 containerd 中增加很大的一块代码。而我们的选择是，在 containerd 中做一个健壮的事件系统，以便于多个消费者可以去订阅它们所关心的事件。我们也公开发布了一个 [任务 API](https://github.com/containerd/containerd/blob/master/api/services/tasks/v1/tasks.proto)，它可以让用户去创建一个运行任务，也可以在一个容器的网络命名空间中添加一个接口，以及在一个容器的生命周期中的任何时候，无需复杂的钩子来启用容器的进程。

在过去的几个月中另一个添加到 containerd 中的领域是完整的存储，以及支持 OCI 和 Docker 镜像格式的分布式系统。有了一个跨 containerd API 的完整的目录地址存储系统，它不仅适用于镜像，也适用于元数据、检查点、以及附加到容器的任何数据。

我们也花时间去 [重新考虑如何使用 “图驱动” 工作](https://blog.mobyproject.org/where-are-containerds-graph-drivers-145fc9b7255)。这些是叠加的或者允许镜像分层的块级文件系统，可以使你执行的构建更加高效。当我们添加对 devicemapper 的支持时，<ruby> 图驱动 <rt>  graphdrivers </rt></ruby>最初是由 Solomon 和我写的。Docker 在那个时候仅支持 AUFS，因此我们在叠加文件系统之后，对图驱动进行了建模。但是，做一个像 devicemapper/lvm 这样的块级文件系统，就如同一个堆叠文件系统一样，从长远来看是非常困难的。这些接口必须基于时间的推移进行扩展，以支持我们最初认为并不需要的那些不同的特性。对于 containerd，我们使用了一个不同的方法，像快照一样做一个堆叠文件系统而不是相反。这样做起来更容易，因为堆叠文件系统比起像 BTRFS、ZFS 以及 devicemapper 这样的快照文件系统提供了更好的灵活性。因为这些文件系统没有严格的父/子关系。这有助于我们去构建出 [快照的一个小型接口](https://github.com/containerd/containerd/blob/master/api/services/snapshots/v1/snapshots.proto)，同时还能满足 [构建者](https://blog.mobyproject.org/introducing-buildkit-17e056cc5317) 的要求，还能减少了需要的代码数量，从长远来看这样更易于维护。

![](/data/attachment/album/201802/22/125526ewawwyyyywtvl7gl.jpg)

你可以在 [Stephen Day 2017/12/7 在 KubeCon SIG Node 上的演讲](https://speakerdeck.com/stevvooe/whats-happening-with-containerd-and-the-cri)找到更多关于 containerd 的架构方面的详细资料。

除了在 1.0 代码库中的技术和设计上的更改之外，我们也将 [containerd 管理模式从长期 BDFL 模式转换为技术委员会](https://github.com/containerd/containerd/pull/1748)，为社区提供一个独立的可信任的第三方资源。

---

via: <https://blog.docker.com/2017/12/containerd-ga-features-2/>

作者：[Michael Crosby](https://blog.docker.com/author/michael/) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


如何使用 Ansible 创建 AWS ec2 密钥

Summary: 你需要使用 Ansible 的 ec2_key 模块。

![](/data/attachment/album/201802/22/134813ljp54nphdoucnldd.jpg)

**我想使用 Ansible 工具创建 Amazon EC2 密钥对。不想使用 AWS CLI 来创建。可以使用 Ansible 来创建 AWS ec2 密钥吗？**

你需要使用 Ansible 的 ec2\_key 模块。这个模块依赖于 python-boto 2.5 版本或者更高版本。 boto 是亚马逊 Web 服务的一个 Python API。你可以将 boto 用于 Amazon S3、Amazon EC2 等其他服务。简而言之，你需要安装 Ansible 和 boto 模块。我们一起来看下如何安装 boto 并结合 Ansible 使用。

### 第一步 - 在 Ubuntu 上安装最新版本的 Ansible

你必须[给你的系统配置 PPA 来安装最新版的 Ansible](https://www.cyberciti.biz/faq/ubuntu-sudo-add-apt-repository-command-not-found-error/)。为了管理你从各种 PPA（Personal Package Archives）安装软件的仓库，你可以上传 Ubuntu 源码包并编译，然后通过 Launchpad 以 apt 仓库的形式发布。键入如下命令 [apt-get 命令](https://www.cyberciti.biz/tips/linux-debian-package-management-cheat-sheet.html "See Linux/Unix apt-get command examples for more info")或者 [apt 命令](https://www.cyberciti.biz/faq/ubuntu-lts-debian-linux-apt-command-examples/ "See Linux/Unix apt command examples for more info")：

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install software-properties-common

```

接下来给你的系统的软件源中添加 `ppa:ansible/ansible`。

```
$ sudo apt-add-repository ppa:ansible/ansible

```

更新你的仓库并安装 Ansible：

```
$ sudo apt update
$ sudo apt install ansible

```

安装 boto：

```
$ pip3 install boto3

```

#### 关于在CentOS/RHEL 7.x上安装 Ansible 的注意事项

你[需要在 CentOS 和 RHEL 7.x 上配置 EPEL 源](https://www.cyberciti.biz/faq/installing-rhel-epel-repo-on-centos-redhat-7-x/)和 [yum命令](https://www.cyberciti.biz/faq/rhel-centos-fedora-linux-yum-command-howto/ "See Linux/Unix yum command examples for more info")

```
$ cd /tmp
$ wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ ls *.rpm
$ sudo yum install epel-release-latest-7.noarch.rpm
$ sudo yum install ansible

```

安装 boto：

```
$ pip install boto3

```

### 第二步 2 – 配置 boto

你需要配置 AWS credentials/API 密钥。参考 “[AWS Security Credentials](https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html)” 文档如何创建 API key。用 `mkdir` 命令创建一个名为 `~/.aws` 的目录，然后配置 API key：

```
$ mkdir -pv ~/.aws/
$ vi ~/.aws/credentials

```

```
[default]
aws_access_key_id = YOUR-ACCESS-KEY-HERE
aws_secret_access_key = YOUR-SECRET-ACCESS-KEY-HERE

```

还需要配置默认 [AWS 区域](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html)：

```
$ vi ~/.aws/config

```

输出样例如下：

```
[default]
region = us-west-1

```

通过创建一个简单的名为 `test-boto.py` 的 Python 程序来测试你的 boto 配置是否正确：

```
#!/usr/bin/python3
# A simple program to test boto and print s3 bucket names
import boto3
t = boto3.resource('s3')
for b in t.buckets.all():
 print(b.name)

```

按下面方式来运行该程序：

```
$ python3 test-boto.py

```

输出样例：

```
nixcraft-images
nixcraft-backups-cbz
nixcraft-backups-forum

```

上面输出可以确定 Python-boto 可以使用 AWS API 正常工作。

### 步骤 3 - 使用 Ansible 创建 AWS ec2 密钥

创建一个名为 `ec2.key.yml` 的剧本，如下所示：

```
---
- hosts: local
  connection: local
  gather_facts: no
  tasks:

 - name: Create a new EC2 key
   ec2_key:
   name: nixcraft-key
   region: us-west-1
   register: ec2_key_result

 - name: Save private key
   copy: content="{{ ec2_key_result.key.private_key }}" dest="./aws.nixcraft.pem" mode=0600
   when: ec2_key_result.changed

```

其中，

* `ec2_key:` – ec2 密钥对。
* `name: nixcraft_key` – 密钥对的名称。
* `region: us-west-1` – 使用的 AWS 区域。
* `register: ec2_key_result` – 保存生成的密钥到 ec2*key*result 变量。
* `copy: content="{{ ec2_key_result.key.private_key }}" dest="./aws.nixcraft.pem" mode=0600` – 将 `ec2_key_result.key.private_key` 的内容保存到当前目录的一个名为 `aws.nixcraft.pem` 的文件中。设置该文件的权限为 `0600` （unix 文件权限）。
* `when: ec2_key_result.changed` – 仅仅在 `ec2_key_result` 改变时才保存。我们不想覆盖你的密钥文件。

你还必须创建如下 `hosts` 文件：

```
[local]
localhost

```

如下运行你的剧本：

```
$ ansible-playbook -i hosts ec2.key.yml

```

![](/data/attachment/album/201802/22/134816pd989drucghpzg8c.jpg)

最后你应该有一个名为 `aws.nixcraft.pem 私钥，该私钥可以和 AWS EC2 一起使用。使用 [cat 命令](https://www.cyberciti.biz/faq/linux-unix-appleosx-bsd-cat-command-examples/ "See Linux/Unix cat command examples for more info")查看你的密钥：

```
$ cat aws.nixcraft.pem

```

如果你有 EC2 虚拟机，请按如下方式使用：

```
$ ssh -i aws.nixcraft.pem user@ec2-vm-dns-name

```

**查看有关 python 数据结构变量名的信息，比如 ec2*key*result.changed 和 ec2*key*result.key.private\_key**

你一定在想我是如何使用变量名的，比如 `ec2_key_result.changed` 和 `ec2_key_result.key.private_key`。它们在哪里定义过吗？变量的值是通过 API 调用返回的。简单地使用 `-v` 选项运行 `ansible-playbook` 命令来查看这样的信息：

```
$ ansible-playbook -v -i hosts ec2.key.yml

```

![](/data/attachment/album/201802/22/134816lzu6iy99q7u9ndiu.jpg)

### 我该如何删除一个密钥？

使用如下 `ec2-key-delete.yml`：

```
---
- hosts: local
  connection: local
  gather_facts: no
  tasks:

 - name: Delete a EC2 key
   ec2_key:
   name: nixcraft-key
   region: us-west-1
# absent means delete keypair
   state: absent

```

按照如下方式运行：

```
$ ansible-playbook -i hosts ec2-key-delete.yml

```

### 关于作者

作者是 nixCraft 的创始人，是一个经验丰富的系统管理员，DevOps 工程师，同时是一个 Linux 操作系统/Unix shell 脚本培训师。**通过 [RSS/XML 提要](https://www.cyberciti.biz/atom/atom.xml)或[每周邮件简讯](https://www.cyberciti.biz/subscribe-to-weekly-linux-unix-newsletter-for-sysadmin/)获得关于系统管理，Linux/Unix和开放源码主题的最新教程。**

---

via: <https://www.cyberciti.biz/faq/how-to-create-aws-ec2-key-using-ansible/>

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

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