2018年2月

精进你的系统管理能力和 Linux 技能,学习如何设置工具来简化管理多台机器。

你是否想精进你的系统管理能力和 Linux 技能?也许你的本地局域网上跑了一些东西,而你又想让生活更轻松一点--那该怎么办呢?在本文中,我会向你演示如何设置工具来简化管理多台机器。

远程管理工具有很多,SaltStack、Puppet、Chef,以及 Ansible 都是很流行的选择。在本文中,我将重点放在 Ansible 上并会解释它是如何帮到你的,不管你是有 5 台还是 1000 台虚拟机。

让我们从多机(不管这些机器是虚拟的还是物理的)的基本管理开始。我假设你知道要做什么,有基础的 Linux 管理技能(至少要有能找出执行每个任务具体步骤的能力)。我会向你演示如何使用这一工具,而是否使用它由你自己决定。

什么是 Ansible?

Ansible 的网站上将之解释为 “一个超级简单的 IT 自动化引擎,可以自动进行云供给、配置管理、应用部署、服务内部编排,以及其他很多 IT 需求。” 通过在一个集中的位置定义好服务器集合,Ansible 可以在多个服务器上执行相同的任务。

如果你对 Bash 的 for 循环很熟悉,你会发现 Ansible 操作跟这很类似。区别在于 Ansible 是 幕等的 idempotent 。通俗来说就是 Ansible 一般只有在确实会发生改变时才执行所请求的动作。比如,假设你执行一个 Bash 的 for 循环来为多个机器创建用户,像这样子:

for server in serverA serverB serverC; do ssh ${server} "useradd myuser"; done

这会在 serverA、serverB,以及 serverC 上创建 myuser 用户;然而不管这个用户是否存在,每次运行这个 for 循环时都会执行 useradd 命令。一个幕等的系统会首先检查用户是否存在,只有在不存在的情况下才会去创建它。当然,这个例子很简单,但是幕等工具的好处将会随着时间的推移变得越发明显。

Ansible 是如何工作的?

Ansible 会将 Ansible playbooks 转换成通过 SSH 运行的命令,这在管理类 UNIX 环境时有很多优势:

  1. 绝大多数类 UNIX 机器默认都开了 SSH。
  2. 依赖 SSH 意味着远程主机不需要有代理。
  3. 大多数情况下都无需安装额外的软件,Ansible 需要 2.6 或更新版本的 Python。而绝大多数 Linux 发行版默认都安装了这一版本(或者更新版本)的 Python。
  4. Ansible 无需主节点。他可以在任何安装有 Ansible 并能通过 SSH 访问的主机上运行。
  5. 虽然可以在 cron 中运行 Ansible,但默认情况下,Ansible 只会在你明确要求的情况下运行。

配置 SSH 密钥认证

使用 Ansible 的一种常用方法是配置无需密码的 SSH 密钥登录以方便管理。(可以使用 Ansible Vault 来为密码等敏感信息提供保护,但这不在本文的讨论范围之内)。现在只需要使用下面命令来生成一个 SSH 密钥,如示例 1 所示。

[09:44 user ~]$ ssh-keygen
Generating public/private rsa key pair。
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Created directory '/home/user/.ssh'。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa。
Your public key has been saved in /home/user/.ssh/id_rsa.pub。
The key fingerprint is:
SHA256:TpMyzf4qGqXmx3aqZijVv7vO9zGnVXsh6dPbXAZ+LUQ user@user-fedora
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|              E  |
|       o .   .。|
|   .  + S    o+。|
|  . .o * .  .+ooo|
| . .+o  o o oo+。*|
|。.ooo* o。*  .*+|
| . o+*BO.o+    .o|
+----[SHA256]-----+

示例 1 :生成一个 SSH 密钥

在示例 1 中,直接按下回车键来接受默认值。任何非特权用户都能生成 SSH 密钥,也能安装到远程系统中任何用户的 SSH 的 authorized_keys 文件中。生成密钥后,还需要将之拷贝到远程主机上去,运行下面命令:

ssh-copy-id root@servera

注意:运行 Ansible 本身无需 root 权限;然而如果你使用非 root 用户,你需要为要执行的任务配置合适的 sudo 权限。

输入 servera 的 root 密码,这条命令会将你的 SSH 密钥安装到远程主机上去。安装好 SSH 密钥后,再通过 SSH 登录远程主机就不再需要输入 root 密码了。

安装 Ansible

只需要在示例 1 中生成 SSH 密钥的那台主机上安装 Ansible。若你使用的是 Fedora,输入下面命令:

sudo dnf install ansible -y

若运行的是 CentOS,你需要为 EPEL 仓库配置额外的包:

sudo yum install epel-release -y

然后再使用 yum 来安装 Ansible:

sudo yum install ansible -y

对于基于 Ubuntu 的系统,可以从 PPA 上安装 Ansible:

sudo apt-get install software-properties-common -y
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible -y

若你使用的是 macOS,那么推荐通过 Python PIP 来安装:

sudo pip install ansible

对于其他发行版,请参见 Ansible 安装文档

Ansible Inventory

Ansible 使用一个 INI 风格的文件来追踪要管理的服务器,这种文件被称之为 库存清单 Inventory 。默认情况下该文件位于 /etc/ansible/hosts。本文中,我使用示例 2 中所示的 Ansible 库存清单来对所需的主机进行操作(为了简洁起见已经进行了裁剪):

[arch]
nextcloud
prometheus
desktop1
desktop2
vm-host15

[fedora]
netflix

[centos]
conan
confluence
7-repo
vm-server1
gitlab

[ubuntu]
trusty-mirror
nwn
kids-tv
media-centre
nas

[satellite]
satellite

[ocp]
lb00
ocp_dns
master01
app01
infra01

示例 2 : Ansible 主机文件

每个分组由中括号和组名标识(像这样 [group1] ),是应用于一组服务器的任意组名。一台服务器可以存在于多个组中,没有任何问题。在这个案例中,我有根据操作系统进行的分组(archubuntucentosfedora),也有根据服务器功能进行的分组(ocpsatellite)。Ansible 主机文件可以处理比这复杂的多的情况。详细内容,请参阅 库存清单文档

运行命令

将你的 SSH 密钥拷贝到库存清单中所有服务器上后,你就可以开始使用 Ansible 了。Ansible 的一项基本功能就是运行特定命令。语法为:

ansible -a "some command"

例如,假设你想升级所有的 CentOS 服务器,可以运行:

ansible centos -a 'yum update -y'

注意:不是必须要根据服务器操作系统来进行分组的。我下面会提到,Ansible Facts 可以用来收集这一信息;然而,若使用 Facts 的话,则运行特定命令会变得很复杂,因此,如果你在管理异构环境的话,那么为了方便起见,我推荐创建一些根据操作系统来划分的组。

这会遍历 centos 组中的所有服务器并安装所有的更新。一个更加有用的命令应该是 Ansible 的 ping 模块了,可以用来验证服务器是否准备好接受命令了:

ansible all -m ping

这会让 Ansible 尝试通过 SSH 登录库存清单中的所有服务器。在示例 3 中可以看到 ping 命令的部分输出结果。

nwn | SUCCESS => {
    "changed":false,
    "ping":"pong"
}
media-centre | SUCCESS => {
    "changed":false,
    "ping":"pong"
}
nas | SUCCESS => {
    "changed":false,
    "ping":"pong"
}
kids-tv | SUCCESS => {
    "changed":false,
    "ping":"pong"
}
...

示例 3 :Ansible ping 命令输出

运行指定命令的能力有助于完成快速任务(LCTT 译注:应该指的那种一次性任务),但是如果我想在以后也能以同样的方式运行同样的任务那该怎么办呢?Ansible playbooks 就是用来做这个的。

复杂任务使用 Ansible playbooks

Ansible 剧本 playbook 就是包含 Ansible 指令的 YAML 格式的文件。我这里不打算讲解类似 Roles 和 Templates 这些比较高深的内容。有兴趣的话,请阅读 Ansible 文档

在前一章节,我推荐你使用 ssh-copy-id 命令来传递你的 SSH 密钥;然而,本文关注于如何以一种一致的、可重复性的方式来完成任务。示例 4 演示了一种以冥等的方式,即使 SSH 密钥已经存在于目标主机上也能保证正确性的实现方法。

---
- hosts:all
  gather_facts:false
  vars:
    ssh_key:'/root/playbooks/files/laptop_ssh_key'
  tasks:
    - name:copy ssh key
      authorized_key:
        key:"{{ lookup('file',ssh_key) }}"
        user:root

示例 4:Ansible 剧本 “push ssh keys.yaml”

- hosts: 行标识了这个剧本应该在那个主机组上执行。在这个例子中,它会检查库存清单里的所有主机。

gather_facts: 行指明 Ansible 是否去搜索每个主机的详细信息。我稍后会做一次更详细的检查。现在为了节省时间,我们设置 gather_factsfalse

vars: 部分,顾名思义,就是用来定义剧本中所用变量的。在示例 4 的这个简短剧本中其实不是必要的,但是按惯例我们还是设置了一个变量。

最后由 tasks: 标注的这个部分,是存放主体指令的地方。每个任务都有一个 -name:。Ansbile 在运行剧本时会显示这个名字。

authorized_key: 是剧本所使用 Ansible 模块的名字。可以通过命令 ansible-doc -a 来查询 Ansible 模块的相关信息; 不过通过网络浏览器查看 文档 可能更方便一些。authorized\_key 模块 有很多很好的例子可以参考。要运行示例 4 中的剧本,只要运行 ansible-playbook 命令就行了:

ansible-playbook push_ssh_keys.yaml

如果是第一次添加 SSH 密钥,SSH 会提示你输入 root 用户的密码。

现在 SSH 密钥已经传输到服务器中去了,可以来做点有趣的事了。

使用 Ansible 收集信息

Ansible 能够收集目标系统的各种信息。如果你的主机数量很多,那它会特别的耗时。按我的经验,每台主机大概要花个 1 到 2 秒钟,甚至更长时间;然而有时收集信息是有好处的。考虑下面这个剧本,它会禁止 root 用户通过密码远程登录系统:

---
- hosts:all
  gather_facts:true
  vars:
  tasks:
    - name:Enabling ssh-key only root access
      lineinfile:
        dest:/etc/ssh/sshd_config
        regexp:'^PermitRootLogin'
        line:'PermitRootLogin without-password'
      notify:
        - restart_sshd
        - restart_ssh

  handlers:
    - name:restart_sshd
      service:
        name:sshd
        state:restarted
        enabled:true
      when:ansible_distribution == 'RedHat'
    - name:restart_ssh
      service:
        name:ssh
        state:restarted
        enabled:true
      when:ansible_distribution == 'Debian'

示例 5:锁定 root 的 SSH 访问

在示例 5 中 sshd_config 文件的修改是有条件 的,只有在找到匹配的发行版的情况下才会执行。在这个案例中,基于 Red Hat 的发行版与基于 Debian 的发行版对 SSH 服务的命名是不一样的,这也是使用条件语句的目的所在。虽然也有其他的方法可以达到相同的效果,但这个例子很好演示了 Ansible 信息的作用。若你想查看 Ansible 默认收集的所有信息,可以在本地运行 setup 模块:

ansible localhost -m setup |less

Ansible 收集的所有信息都能用来做判断,就跟示例 4 中 vars: 部分所演示的一样。所不同的是,Ansible 信息被看成是内置 变量,无需由系统管理员定义。

更近一步

现在可以开始探索 Ansible 并创建自己的基本了。Ansible 是一个富有深度、复杂性和灵活性的工具,只靠一篇文章不可能就把它讲透。希望本文能够激发你的兴趣,鼓励你去探索 Ansible 的功能。在下一篇文章中,我会再聊聊 Copysystemdserviceaptyumvirt,以及 user 模块。我们可以在剧本中组合使用这些模块,还可以创建一个简单的 Git 服务器来存储这些所有剧本。


via: https://opensource.com/article/17/7/automate-sysadmin-ansible

作者:Steve Ovens 译者:lujun9972 校对:wxy

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

当想要直接通过 Linux 命令行下载文件,马上就能想到两个工具:wget 和 cURL。它们有很多一样的特征,可以很轻易的完成一些相同的任务。

虽然它们有一些相似的特征,但它们并不是完全一样。这两个程序适用与不同的场合,在特定场合下,都拥有各自的特性。

cURL vs wget: 相似之处

wget 和 cURL 都可以下载内容。它们的核心就是这么设计的。它们都可以向互联网发送请求并返回请求项。这可以是文件、图片或者是其他诸如网站的原始 HTML 之类。

这两个程序都可以进行 HTTP POST 请求。这意味着它们都可以向网站发送数据,比如说填充表单什么的。

由于这两者都是命令行工具,它们都被设计成可脚本化。wget 和 cURL 都可以写进你的 Bash 脚本 ,自动与新内容交互,下载所需内容。

wget 的优势

 title=

wget 简单直接。这意味着你能享受它超凡的下载速度。wget 是一个独立的程序,无需额外的资源库,更不会做其范畴之外的事情。

wget 是专业的直接下载程序,支持递归下载。同时,它也允许你下载网页中或是 FTP 目录中的任何内容。

wget 拥有智能的默认设置。它规定了很多在常规浏览器里的事物处理方式,比如 cookies 和重定向,这都不需要额外的配置。可以说,wget 简直就是无需说明,开罐即食!

cURL 优势

 title=

cURL是一个多功能工具。当然,它可以下载网络内容,但同时它也能做更多别的事情。

cURL 技术支持库是:libcurl。这就意味着你可以基于 cURL 编写整个程序,允许你基于 libcurl 库中编写图形环境的下载程序,访问它所有的功能。

cURL 宽泛的网络协议支持可能是其最大的卖点。cURL 支持访问 HTTP 和 HTTPS 协议,能够处理 FTP 传输。它支持 LDAP 协议,甚至支持 Samba 分享。实际上,你还可以用 cURL 收发邮件。

cURL 也有一些简洁的安全特性。cURL 支持安装许多 SSL/TLS 库,也支持通过网络代理访问,包括 SOCKS。这意味着,你可以越过 Tor 来使用cURL。

cURL 同样支持让数据发送变得更容易的 gzip 压缩技术。

思考总结

那你应该使用 cURL 还是使用 wget?这个比较得看实际用途。如果你想快速下载并且没有担心参数标识的需求,那你应该使用轻便有效的 wget。如果你想做一些更复杂的使用,直觉告诉你,你应该选择 cRUL。

cURL 支持你做很多事情。你可以把 cURL 想象成一个精简的命令行网页浏览器。它支持几乎你能想到的所有协议,可以交互访问几乎所有在线内容。唯一和浏览器不同的是,cURL 不会渲染接收到的相应信息。


via: https://www.maketecheasier.com/curl-vs-wget/

作者:Nick Congleton 译者:CYLeft 校对:wxy

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

可能有时候你启动 Linux 时需要或者希望不使用 GUI(图形用户界面),也就是没有 X,而是选择命令行。不管是什么原因,幸运的是,直接启动进入 Linux 命令行非常简单。它需要在其他内核选项之后对引导参数进行简单的更改。此更改将系统引导到指定的运行级别。

​为什么要这样做?

如果你的系统由于无效配置或者显示管理器损坏或任何可能导致 GUI 无法正常启动的情况而无法运行 Xorg,那么启动到命令行将允许你通过登录到终端进行故障排除(假设你知道要怎么做),并能做任何你需要做的东西。引导到命令行也是一个很好的熟悉终端的方式,不然,你也可以为了好玩这么做。

​访问 GRUB 菜单

在启动时,你需要访问 GRUB 启动菜单。如果在每次启动计算机时菜单未设置为显示,那么可能需要在系统启动之前按住 SHIFT 键。在菜单中,需要选择 Linux 发行版条目。高亮显示后该条目,按下 e 编辑引导参数。

zorin os grub menu

较老的 GRUB 版本遵循类似的机制。启动管理器应提供有关如何编辑启动参数的说明。

​​指定运行级别

​会出现一个编辑器,你将看到 GRUB 会解析给内核的选项。移动到以 linux 开头的行(旧的 GRUB 版本可能是 kernel,选择它并按照说明操作)。这指定了要解析给内核的参数。在该行的末尾(可能会出现跨越多行,具体取决于你的终端分辨率),只需指定要引导的运行级别,即 3(多用户模式,纯文本)。

customize grub menu

按下 Ctrl-XF10 将使用这些参数启动系统。开机和以前一样。唯一改变的是启动的运行级别。

这是启动后的页面:

boot linux in command line

运行级别

你可以指定不同的运行级别,默认运行级别是 5 (多用户图形界面)。1 启动到“单用户”模式,它会启动进入 root shell。3 提供了一个多用户命令行系统。

从命令行切换

在某个时候,你可能想要运行显示管理器来再次使用 GUI,最快的方法是运行这个:

$ sudo init 5

就这么简单。就我个人而言,我发现命令行比使用 GUI 工具更令人兴奋和上手。不过,这只是我的个人偏好。


via: http://www.linuxandubuntu.com/home/how-to-boot-into-linux-command-line

作者:LinuxAndUbuntu 译者:geekpi 校对:wxy

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

 title=

Linus Torvalds 在周日发布了 Linux 的 4.15 版内核,比原计划发布时间晚了一周。了解这次发行版的关键更新。

Linus Torvalds 在周日(1 月 28 日)发布了 Linux 内核的 4.15 版,再一次比原计划晚了一周。延迟发布的罪魁祸首是 “Meltdown” 和 “Spectre” bug,由于这两个漏洞,使开发者不得不在这最后的周期中提交重大补丁。Torvalds 不愿意“赶工”,因此,他又给了一周时间去制作这个发行版本。

不出意外的话,这第一批补丁将是去修补前面提及的 Meltdown 和 Spectre 漏洞。为防范 Meltdown —— 这个影响 Intel 芯片的问题,在 x86 架构上开发者实现了页表隔离(PTI)。不论什么理由你如果想去关闭它,你可以使用内核引导选项 pti=off 去关闭这个特性。

Spectre v2 漏洞对 Intel 和 AMD 芯片都有影响,为防范它,内核现在带来了 retpoline 机制。Retpoline 要求 GCC 的版本支持 -mindirect-branch=thunk-extern 功能。由于使用了 PTI,Spectre 抑制机制可以被关闭,如果需要去关闭它,在引导时使用 spectre_v2=off 选项。尽管开发者努力去解决 Spectre v1,但是,到目前为止还没有一个解决方案,因此,在 4.15 的内核版本中并没有这个 bug 的修补程序。

对于在 ARM 上的 Meltdown 解决方案也将在下一个开发周期中推送。但是,对于 PowerPC 上的 bug,在这个发行版中包含了一个补救措施,那就是使用 L1-D 缓存的 RFI 冲刷特性

一个有趣的事情是,上面提及的所有受影响的新内核中,都带有一个 /sys/devices/system/cpu/vulnerabilities/ 虚拟目录。这个目录显示了影响你的 CPU 的漏洞以及当前应用的补救措施。

芯片带 bug (以及保守秘密的制造商)的问题重新唤起了开发可行的开源替代品的呼声。这使得已经合并到主线版本的内核提供了对 RISC-V 芯片的部分支持。RISC-V 是一个开源的指令集架构,它允许制造商去设计他们自己的基于 RISC-V 芯片的实现。并且因此也有了几个开源的芯片。虽然 RISC-V 芯片目前主要用于嵌入式设备,它能够去做像智能硬盘或者像 Arduino 这样的开发板,RISC-V 的支持者认为这个架构也可以用于个人电脑甚至是多节点的超级计算机上。

正如在上面提到的,对 RISC-V 的支持,仍然没有全部完成,它虽然包含了架构代码,但是没有设备驱动。这意味着,虽然 Linux 内核可以在 RISC-V 芯片上运行,但是没有可行的方式与底层的硬件进行实质的交互。也就是说,RISC-V 不会受到其它闭源架构上的任何 bug 的影响,并且对它的支持的开发工作也在加速进行,因为,RISC-V 基金会已经得到了一些行业巨头的支持

4.15 版新内核中的其它新特性

Torvalds 经常说他喜欢的事情是很无聊的。对他来说,幸运的是,除了 Spectre 和 Meltdown 引发的混乱之外,在 4.15 内核中的大部分其它东西都很普通,比如,对驱动的进一步改进、对新设备的支持等等。但是,还有几点需要重点指出,它们是:

  • AMD 对虚拟化安全加密的支持。它允许内核通过加密来实现对虚拟机内存的保护。加密的内存仅能够被使用它的虚拟机所解密。就算是 hypervisor 也不能看到它内部的数据。这意味着在云中虚拟机正在处理的数据,在虚拟机外的任何进程都看不到。
  • 由于 包含了显示代码, AMD GPU 得到了极大的提升,这使得 Radeon RX Vega 和 Raven Ridge 显卡得到了内核主线版本的支持,并且也在 AMD 显卡中实现了 HDMI/DP 音频。
  • 树莓派的爱好者应该很高兴,因为在新内核中, 7" 触摸屏现在已经得到原生支持,这将产生成百上千的有趣的项目。

要发现更多的特性,你可以去查看在 Kernel NewbiesPhoronix 上的内容。


via: https://www.linux.com/blog/intro-to-linux/2018/1/linux-kernel-415-unusual-release-cycle

作者:PAUL BROWN 译者:qhwdw 校对:wxy

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

在命令行工作时,有时您可能想要知道一个文件中的单词数量、字节数、甚至换行数量。如果您正在寻找这样做的工具,您会很高兴地知道,在 Linux 中,存在一个命令行实用程序,它被称为 wc ,它为您完成所有这些工作。在本文中,我们将通过简单易懂的例子来讨论这个工具。

但是在我们开始之前,值得一提的是,本教程中提供的所有示例都在 Ubuntu 16.04 上进行了测试。

Linux wc 命令

wc 命令打印每个输入文件的新行、单词和字节数。以下是该命令行工具的语法:

wc [OPTION]... [FILE]...

以下是 wc 的 man 文档的解释:

为每个文件打印新行、单词和字节数,如果指定多于一个文件,也列出总的行数。单词是由空格分隔的非零长度的字符序列。如果没有指定文件,或当文件为 `-`,则读取标准输入。

下面的 Q&A 样式的示例将会让您更好地了解 wc 命令的基本用法。

注意:在所有示例中我们将使用一个名为 file.txt 的文件作为输入文件。以下是该文件包含的内容:

hi
hello
how are you
thanks.

Q1. 如何打印字节数

使用 -c 命令选项打印字节数.

wc -c file.txt

下面是这个命令在我们的系统上产生的输出:

如何打印字节数

文件包含 29 个字节。

Q2. 如何打印字符数

要打印字符数,请使用 -m 命令行选项。

wc -m file.txt

下面是这个命令在我们的系统上产生的输出:

如何打印字符数

文件包含 29 个字符。

Q3. 如何打印换行数

使用 -l 命令选项来打印文件中的新行数:

wc -l file.txt

这里是我们的例子的输出:

如何打印换行数

Q4. 如何打印单词数

要打印文件中的单词数量,请使用 -w 命令选项。

wc -w file.txt

在我们的例子中命令的输出如下:

如何打印字数

这显示文件中有 6 个单词。

Q5. 如何打印最长行的显示宽度或长度

如果您想要打印输入文件中最长行的长度,请使用 -l 命令行选项。

wc -L file.txt

下面是在我们的案例中命令产生的结果:

如何打印最长行的显示宽度或长度

所以文件中最长的行长度是 11。

Q6. 如何从文件读取输入文件名

如果您有多个文件名,并且您希望 wc 从一个文件中读取它们,那么使用-files0-from 选项。

wc --files0-from=names.txt

如何从文件读取输入文件名

如你所见 wc 命令,在这个例子中,输出了文件 file.txt 的行、单词和字符计数。文件名为 file.txt 的文件在 name.txt 文件中提及。值得一提的是,要成功地使用这个选项,文件中的文件名应该用 NUL 终止——您可以通过键入Ctrl + v 然后按 Ctrl + Shift + @ 来生成这个字符。

结论

正如您所认同的一样,从理解和使用目的来看, wc 是一个简单的命令。我们已经介绍了几乎所有的命令行选项,所以一旦你练习了我们这里介绍的内容,您就可以随时在日常工作中使用该工具了。想了解更多关于 wc 的信息,请参考它的 man 文档


via: https://www.howtoforge.com/linux-wc-command-explained-for-beginners-6-examples/

作者:Himanshu Arora 译者:stevenzdg988 校对:wxy

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

现在(LCTT 译注:本文发表于 1 月初),每个人都知道一件关乎电脑安全的“大事”发生了,真见鬼,等每日邮报报道的时候,你就知道什么是糟糕了...

不管怎样,除了告诉你这篇写的及其出色的披露该问题的 Zero 项目的论文之外,我不打算去跟进这个问题已经被报道出来的细节。他们应该现在就直接颁布 2018 年的 Pwnie 奖,干的太棒了。

如果你想了解我们如何在内核中解决这些问题的技术细节,你可以保持关注了不起的 lwn.net,他们会把这些细节写成文章。

此外,这有一条很好的关于这些公告的摘要,包括了各个厂商的公告。

至于这些涉及的公司是如何处理这些问题的,这可以说是如何与 Linux 内核社区保持沟通的教科书般的例子。这件事涉及到的人和公司都知道发生了什么,我确定这件事最终会出现,但是目前我需要去关注的是如何修复这些涉及到的问题,然后不去点名指责,不管我有多么的想去这么做。

你现在能做什么

如果你的 Linux 系统正在运行一个正常的 Linux 发行版,那么升级你的内核。它们都应该已经更新了,然后在接下来的几个星期里保持更新。我们会统计大量在极端情况下出现的 bug ,这里涉及的测试很复杂,包括庞大的受影响的各种各样的系统和工作任务。如果你的 Linux 发行版没有升级内核,我强烈的建议你马上更换一个 Linux 发行版。

然而有很多的系统因为各种各样的原因(听说它们比起“传统”的企业发行版更多)不是在运行“正常的” Linux 发行版上。它们依靠长期支持版本(LTS)的内核升级,或者是正常的稳定内核升级,或者是内部的某人打造版本的内核。对于这部分人,这篇介绍了你能使用的上游内核中发生的混乱是怎么回事。

Meltdown – x86

现在,Linus 的内核树包含了我们当前所知的为 x86 架构解决 meltdown 漏洞的所有修复。开启 CONFIG_PAGE_TABLE_ISOLATION 这个内核构建选项,然后进行重构和重启,所有的设备应该就安全了。

然而,Linus 的内核树当前处于 4.15-rc6 这个版本加上一些未完成的补丁。4.15-rc7 版本要明天才会推出,里面的一些补丁会解决一些问题。但是大部分的人不会在一个“正常”的环境里运行 -rc 内核。

因为这个原因,x86 内核开发者在 页表隔离 page table isolation 代码的开发过程中做了一个非常好的工作,好到要反向移植到最新推出的稳定内核 4.14 的话,我们只需要做一些微不足道的工作。这意味着最新的 4.14 版本(本文发表时是 4.14.12 版本),就是你应该运行的版本。4.14.13 会在接下来的几天里推出,这个更新里有一些额外的修复补丁,这些补丁是一些运行 4.14.12 内核且有启动时间问题的系统所需要的(这是一个显而易见的问题,如果它不启动,就把这些补丁加入更新排队中)。

我个人要感谢 Andy Lutomirski、Thomas Gleixner、Ingo Molnar、 Borislav Petkov、 Dave Hansen、 Peter Zijlstra、 Josh Poimboeuf、 Juergen Gross 和 Linus Torvalds。他们开发出了这些修复补丁,并且为了让我能轻松地使稳定版本能够正常工作,还把这些补丁以一种形式融合到了上游分支里。没有这些工作,我甚至不敢想会发生什么。

对于老的长期支持内核(LTS),我主要依靠 Hugh Dickins、 Dave Hansen、 Jiri Kosina 和 Borislav Petkov 优秀的工作,来为 4.4 到 4.9 的稳定内核代码树分支带去相同的功能。我同样在追踪讨厌的 bug 和缺失的补丁方面从 Guenter Roeck、 Kees Cook、 Jamie Iles 以及其他很多人那里得到了极大的帮助。我要感谢 David Woodhouse、 Eduardo Valentin、 Laura Abbott 和 Rik van Riel 在反向移植和集成方面的帮助,他们的帮助在许多棘手的地方是必不可少的。

这些长期支持版本的内核同样有 CONFIG_PAGE_TABLE_ISOLATION 这个内核构建选项,你应该开启它来获得全方面的保护。

从主线版本 4.14 和 4.15 的反向移植是非常不一样的,它们会出现不同的 bug,我们现在知道了一些在工作中遇见的 VDSO 问题。一些特殊的虚拟机安装的时候会报一些奇怪的错,但这是只是现在出现的少数情况,这种情况不应该阻止你进行升级。如果你在这些版本中遇到了问题,请让我们在稳定内核邮件列表中知道这件事。

如果你依赖于 4.4 和 4.9 或是现在的 4.14 以外的内核代码树分支,并且没有发行版支持你的话,你就太不幸了。比起你当前版本内核包含的上百个已知的漏洞和 bug,缺少补丁去解决 meltdown 问题算是一个小问题了。你现在最需要考虑的就是马上把你的系统升级到最新。

与此同时,臭骂那些强迫你运行一个已被废弃且不安全的内核版本的人,他们是那些需要知道这是完全不顾后果的行为的人中的一份子。

Meltdown – ARM64

现在 ARM64 为解决 Meltdown 问题而开发的补丁还没有并入 Linus 的代码树,一旦 4.15 在接下来的几周里成功发布,他们就准备阶段式地并入 4.16-rc1,因为这些补丁还没有在一个 Linus 发布的内核中,我不能把它们反向移植进一个稳定的内核版本里(额……我们有这个规矩是有原因的)

由于它们还没有在一个已发布的内核版本中,如果你的系统是用的 ARM64 的芯片(例如 Android ),我建议你选择 Android 公共内核代码树,现在,所有的 ARM64 补丁都并入 3.184.44.9 分支 中。

我强烈建议你关注这些分支,看随着时间的过去,由于测试了已并入补丁的已发布的上游内核版本,会不会有更多的修复补丁被补充进来,特别是我不知道这些补丁会在什么时候加进稳定的长期支持内核版本里。

对于 4.4 到 4.9 的长期支持内核版本,这些补丁有很大概率永远不会并入它们,因为需要大量的先决补丁。而所有的这些先决补丁长期以来都一直在 Android 公共内核版本中测试和合并,所以我认为现在对于 ARM 系统来说,仅仅依赖这些内核分支而不是长期支持版本是一个更好的主意。

同样需要注意的是,我合并所有的长期支持内核版本的更新到这些分支后通常会在一天之内或者这个时间点左右进行发布,所以你无论如何都要关注这些分支,来确保你的 ARM 系统是最新且安全的。

Spectre

现在,事情变得“有趣”了……

再一次,如果你正在运行一个发行版的内核,一些内核融入了各种各样的声称能缓解目前大部分问题的补丁,你的内核可能就被包含在其中。如果你担心这一类的攻击的话,我建议你更新并测试看看。

对于上游来说,很好,现状就是仍然没有任何的上游代码树分支合并了这些类型的问题相关的修复补丁。有很多的邮件列表在讨论如何去解决这些问题的解决方案,大量的补丁在这些邮件列表中广为流传,但是它们尚处于开发前期,一些补丁系列甚至没有被构建或者应用到任何已知的代码树,这些补丁系列彼此之间相互冲突,这是常见的混乱。

这是由于 Spectre 问题是最近被内核开发者解决的。我们所有人都在 Meltdown 问题上工作,我们没有精确的 Spectre 问题全部的真实信息,而四处散乱的补丁甚至比公开发布的补丁还要糟糕。

因为所有的这些原因,我们打算在内核社区里花上几个星期去解决这些问题并把它们合并到上游去。修复补丁会进入到所有内核的各种各样的子系统中,而且在它们被合并后,会集成并在稳定内核的更新中发布,所以再次提醒,无论你使用的是发行版的内核还是长期支持的稳定内核版本,你最好并保持更新到最新版。

这不是好消息,我知道,但是这就是现实。如果有所安慰的话,似乎没有任何其它的操作系统完全地解决了这些问题,现在整个产业都在同一条船上,我们只需要等待,并让开发者尽快地解决这些问题。

提出的解决方案并非毫不重要,但是它们中的一些还是非常好的。一些新概念会被创造出来来帮助解决这些问题,Paul Turner 提出的 Retpoline 方法就是其中的一个例子。这将是未来大量研究的一个领域,想出方法去减轻硬件中涉及的潜在问题,希望在它发生前就去预见它。

其他架构的芯片

现在,我没有看见任何 x86 和 arm64 架构以外的芯片架构的补丁,听说在一些企业发行版中有一些用于其他类型的处理器的补丁,希望他们在这几周里能浮出水面,合并到合适的上游那里。我不知道什么时候会发生,如果你使用着一个特殊的架构,我建议在 arch-specific 邮件列表上问这件事来得到一个直接的回答。

结论

再次说一遍,更新你的内核,不要耽搁,不要止步。更新会在很长的一段时间里持续地解决这些问题。同样的,稳定和长期支持内核发行版里仍然有很多其它的 bug 和安全问题,它们和问题的类型无关,所以一直保持更新始终是一个好主意。

现在,有很多非常劳累、坏脾气、缺少睡眠的人,他们通常会生气地让内核开发人员竭尽全力地解决这些问题,即使这些问题完全不是开发人员自己造成的。请关爱这些可怜的程序猿。他们需要爱、支持,我们可以为他们免费提供的他们最爱的饮料,以此来确保我们都可以尽可能快地结束修补系统。


via: http://kroah.com/log/blog/2018/01/06/meltdown-status/

作者:Greg Kroah-Hartman 译者:hopefully2333 校对:wxy

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