2021年2月

西北大学开发出猴脸识别系统

报道,西北大学的科研团队正依托人工智能等新技术,研发“猴脸识别技术”,用于识别秦岭地区的数千只川金丝猴。目前,猴脸识别技术处于实验推广阶段,可识别约 200 只秦岭金丝猴。科研人员称,每只金丝猴,采集了七八百张图像样本,识别成功率达到 94%。

虽然这是一则严肃的科技新闻,但是我还是忍俊不禁想笑。不过严肃的说,这样的人脸识别技术才是技术不作恶的典范。

Kodi 19 “Matrix” 发布,支持 AV1、HDR 和 tvOS

Kodi 是一个开源的媒体中心,最初是为 XBOX 游戏机设计的,但很快被移植到 Windows 和 Linux 等其他平台上,并最终移植到低成本的 Android 电视盒和树莓皮等单板电脑上。

在 Kodi 18 发布两年多后,开发者刚刚宣布推出 Kodi 19 “Matrix”。这个版本由近 50 名个人开源开发者贡献,约 5000 次提交,增加、更改或删除了约 60 万行代码。

Kodi 是难得的精致的开源软件,用了两年时光开发出来的 Kodi 19,值得试试,更多的变化,这里不一一赘述,大家自行体验吧。

非 systemd 的 Debian 分支 Devuan 3.1 发布

Devuan 是 Debian 的一个分支,旨在提供没有 systemd 的 Debian,专注于初始化系统的独立性,从最初的 pre-alpha 版本到现在已经六年了。

这个版本中新提供了 Runit 初始化系统,现在支持 Runit、SysVinit 和 OpenRC 等方式。在此版本中,还允许在安装过程中排除非自由固件。

要说对自由的热爱,Debian 是个典型代表,而要说对自由和传统的狂热,那 Devuan 当之无愧。

WoeUSB 可以在 Linux 中制作 Windows 启动盘,并帮助你的朋友解锁他们罢工的机器。

 title=

人们经常要求我帮助他们恢复被锁死或损坏的 Windows 电脑。有时,我可以使用 Linux USB 启动盘来挂载 Windows 分区,然后从损坏的系统中传输和备份文件。

有的时候,客户丢失了他们的密码或以其他方式锁死了他们的登录账户凭证。解锁账户的一种方法是创建一个 Windows 启动盘来修复计算机。微软允许你从网站下载 Windows 的副本,并提供创建 USB 启动盘的工具。但要使用它们,你需要一台 Windows 电脑,这意味着,作为一个 Linux 用户,我需要其他方法来创建一个 DVD 或 USB 启动盘。我发现在 Linux 上创建 Windows USB 很困难。我的可靠工具,如 Etcher.ioPopsicle(适用于 Pop!\_OS)和 UNetbootin,或者从命令行使用 dd 来创建可启动媒体,都不是很成功。

直到我发现了 WoeUSB-ng,一个 GPL 3.0 许可的 Linux 工具,它可以为 Windows Vista、7、8 和 10 创建一个 USB 启动盘。这个开源软件有两个程序:一个命令行工具和一个图形用户界面 (GUI) 版本。

安装 WoeUSB-ng

GitHub 仓库包含了在 Arch、Ubuntu、Fedora 或使用 pip3 安装 WoeUSB-ng 的说明。

如果你是受支持的 Linux 发行版,你可以使用你的包管理器安装 WoeUSB-ng。或者,你可以使用 Python 的包管理器 pip 来安装应用程序。这在任何 Linux 发行版中都是通用的。这些方法在功能上没有区别,所以使用你熟悉的任何一种。

我运行的是 Pop!\_OS,它是 Ubuntu 的衍生版本,但由于对 Python 很熟悉,我选择了 pip3 安装:

$ sudo pip3 install WoeUSB-ng

创建一个启动盘

你可以从命令行或 GUI 版本使用 WoeUSB-ng。

要从命令行创建一个启动盘,语法要求命令包含 Windows ISO 文件的路径和一个设备。(本例中是 /dev/sdX。使用 lsblk 命令来确定你的驱动器)

$ sudo woeusb --device Windows.iso /dev/sdX

你也可以启动该程序,以获得简单易用的界面。在 WoeUSB-ng 应用程序窗口中,找到 Windows.iso 文件并选择它。选择你的 USB 目标设备(你想变成 Windows 启动盘的驱动器)。这将会删除这个驱动器上的所有信息,所以要谨慎选择,然后仔细检查(再三检查)你的选择!

当你确认正确选择目标驱动器后,点击 Install 按钮。

 title=

创建该介质需要 5 到 10 分钟,这取决于你的 Linux 电脑的处理器、内存、USB 端口速度等。请耐心等待。

当这个过程完成并验证后,你将有可用的 Windows USB 启动盘,以帮助其他人修复 Windows 计算机。

帮助他人

开源就是为了帮助他人。很多时候,你可以通过使用基于 Linux 的系统救援 CD 来帮助 Windows 用户。但有时,唯一的帮助方式是直接从 Windows 中获取,而 WoeUSB-ng 是一个很好的开源工具,它可以让这成为可能。


via: https://opensource.com/article/21/2/linux-woeusb

作者:Don Watkins 选题:lujun9972 译者:geekpi 校对:wxy

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

市面上有很多自动化工具。我可以举几个例子,例如 Puppet、Chef、CFEngine、Foreman、Katello、Saltstock、Space Walk,它们被许多组织广泛使用。

自动化工具可以做什么?

自动化工具可以自动执行例行任务,无需人工干预,从而使 Linux 管理员的工作变得更加轻松。这些工具允许用户执行配置管理,应用程序部署和资源调配。

为什么喜欢 Ansible?

Ansible 是一种无代理的自动化工具,使用 SSH 执行所有任务,但其它工具需要在客户端节点上安装代理。

什么是 Ansible?

Ansible 是一个开源、易于使用的功能强大的 IT 自动化工具,通过 SSH 在客户端节点上执行任务。

它是用 Python 构建的,这是当今世界上最流行、最强大的编程语言之一。两端都需要使用 Python 才能执行所有模块。

它可以配置系统、部署软件和安排高级 IT 任务,例如连续部署或零停机滚动更新。你可以通过 Ansible 轻松执行任何类型的自动化任务,包括简单和复杂的任务。

在开始之前,你需要了解一些 Ansible 术语,这些术语可以帮助你更好的创建任务。

Ansible 如何工作?

Ansible 通过在客户端节点上推送称为 ansible 模块的小程序来工作,这些模块临时存储在客户端节点中,通过 JSON 协议与 Ansible 服务器进行通信。

Ansible 通过 SSH 运行这些模块,并在完成后将其删除。

模块是用 Python 或 Perl 等编写的一些脚本。

控制节点,用于控制剧本的全部功能,包括客户端节点(主机)。

  • 控制节点 Control node :使用 Ansible 在受控节点上执行任务的主机。你可以有多个控制节点,但不能使用 Windows 系统主机当作控制节点。
  • 受控节点 Managed node :控制节点配置的主机列表。
  • 清单 Inventory :控制节点管理的一个主机列表,这些节点在 /etc/ansible/hosts 文件中配置。它包含每个节点的信息,比如 IP 地址或其主机名,还可以根据需要对这些节点进行分组。
  • 模块 Module :每个模块用于执行特定任务,目前有 3387 个模块。
  • 点对点 ad-hoc :它允许你一次性运行一个任务,它使用 /usr/bin/ansible 二进制文件。
  • 任务 Task :每个 动作 Play 都有一个任务列表。任务按顺序执行,在受控节点中一次执行一个任务。
  • 剧本 Playbook :你可以使用剧本同时执行多个任务,而使用点对点只能执行一个任务。剧本使用 YAML 编写,易于阅读。将来,我们将会写一篇有关剧本的文章,你可以用它来执行复杂的任务。

测试环境

此环境包含一个控制节点(server.2g.lab)和三个受控节点(node1.2g.labnode2.2g.labnode3.2g.lab),它们均在虚拟环境中运行,操作系统分别为:

System PurposeHostnameIP AddressOS
Ansible Control Nodeserver.2g.lab192.168.1.7Manjaro 18
Managed Node1node1.2g.lab192.168.1.6CentOS7
Managed Node2node2.2g.lab192.168.1.5CentOS8
Managed Node3node3.2g.lab192.168.1.9Ubuntu 18.04
User: daygeek

前置条件

  • 在 Ansible 控制节点和受控节点之间启用无密码身份验证。
  • 控制节点必须是 Python 2(2.7 版本) 或 Python 3(3.5 或更高版本)。
  • 受控节点必须是 Python 2(2.6 或更高版本) 或 Python 3(3.5 或更高版本)。
  • 如果在远程节点上启用了 SELinux,则在 Ansible 中使用任何与复制、文件、模板相关的功能之前,还需要在它们上安装 libselinux-python

如何在控制节点上安装 Ansible

对于 Fedora/RHEL 8/CentOS 8 系统,使用 DNF 命令 来安装 Ansible。

注意:你需要在 RHEL/CentOS 系统上启用 EPEL 仓库,因为 Ansible 软件包在发行版官方仓库中不可用。

$ sudo dnf install ansible

对于 Debian/Ubuntu 系统,使用 APT-GET 命令APT 命令 来安装 Ansible。

配置下面的 PPA 以便在 Ubuntu 上安装最新稳定版本的 Ansible。

$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible

对于 Debian 系统,配置以下源列表:

$ echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main" | sudo tee -a /etc/apt/sources.list.d/ansible.list
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
$ sudo apt update
$ sudo apt install ansible

对于 Arch Linux 系统,使用 Pacman 命令 来安装 Ansible:

$ sudo pacman -S ansible

对于 RHEL/CentOS 系统,使用 YUM 命令 来安装 Ansible:

$ sudo yum install ansible

对于 openSUSE 系统,使用 Zypper 命令 来安装 Ansible:

$ sudo zypper install ansible

或者,你可以使用 Python PIP 包管理工具 来安装:

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
$ sudo pip install ansible

在控制节点上检查安装的 Ansible 版本:

$ ansible --version

ansible 2.9.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.8/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.1 (default, Jan  8 2020, 23:09:20) [GCC 9.2.0]

如何在受控节点上安装 Python?

使用以下命令在受控节点上安装 python:

$ sudo yum install -y python
$ sudo dnf install -y python
$ sudo zypper install -y python
$ sudo pacman -S python
$ sudo apt install -y python

如何在 Linux 设置 SSH 密钥身份验证(无密码身份验证)

使用以下命令创建 ssh 密钥,然后将其复制到远程计算机。

$ ssh-keygen
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]

具体参考这篇文章《在 Linux 上设置 SSH 密钥身份验证(无密码身份验证)》。

如何创建 Ansible 主机清单

/etc/ansible/hosts 文件中添加要管理的节点列表。如果没有该文件,则可以创建一个新文件。以下是我的测试环境的主机清单文件:

$ sudo vi /etc/ansible/hosts

[web]
node1.2g.lab
node2.2g.lab

[app]
node3.2g.lab

让我们看看是否可以使用以下命令查找所有主机。

$ ansible all --list-hosts

 hosts (3):
   node1.2g.lab
   node2.2g.lab
   node3.2g.lab

对单个组运行以下命令:

$ ansible web --list-hosts

 hosts (2):
   node1.2g.lab
   node2.2g.lab

如何使用点对点命令执行任务

一旦完成主机清单验证检查后,你就可以上路了。干的漂亮!

语法:

ansible [pattern] -m [module] -a "[module options]"

Details:
========
ansible: A command
pattern: Enter the entire inventory or a specific group
-m [module]: Run the given module name
-a [module options]: Specify the module arguments

使用 Ping 模块对主机清单中的所有节点执行 ping 操作:

$ ansible all -m ping

node3.2g.lab | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
node1.2g.lab | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
node2.2g.lab | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

所有系统都返回了成功,但什么都没有改变,只返回了 pong 代表成功。

你可以使用以下命令获取可用模块的列表。

$ ansible-doc -l

当前有 3387 个内置模块,它们会随着 Ansible 版本的递增而增加:

$ ansible-doc -l | wc -l
3387

使用 command 模块对主机清单中的所有节点执行命令:

$ ansible all -m command -a "uptime"

node3.2g.lab | CHANGED | rc=0 >>
 18:05:07 up  1:21,  3 users,  load average: 0.12, 0.06, 0.01
node1.2g.lab | CHANGED | rc=0 >>
 06:35:06 up  1:21,  4 users,  load average: 0.01, 0.03, 0.05
node2.2g.lab | CHANGED | rc=0 >>
 18:05:07 up  1:25,  3 users,  load average: 0.01, 0.01, 0.00

对指定组执行 command 模块。

检查 app 组主机的内存使用情况:

$ ansible app -m command -a "free -m"

node3.2g.lab | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           1993        1065          91           6         836         748
Swap:          1425           0        1424

要对 web 组运行 hostnamectl 命令,使用以下格式:

$ ansible web -m command -a "hostnamectl"

node1.2g.lab | CHANGED | rc=0 >>
   Static hostname: CentOS7.2daygeek.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 002f47b82af248f5be1d67b67e03514c
           Boot ID: dc38f9b8089d4b2d9304e526e00c6a8f
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-957.el7.x86_64
      Architecture: x86-64
node2.2g.lab | CHANGED | rc=0 >>
   Static hostname: node2.2g.lab
         Icon name: computer-vm
           Chassis: vm
        Machine ID: e39e3a27005d44d8bcbfcab201480b45
           Boot ID: 27b46a09dde546da95ace03420fe12cb
    Virtualization: oracle
  Operating System: CentOS Linux 8 (Core)
       CPE OS Name: cpe:/o:centos:centos:8
            Kernel: Linux 4.18.0-80.el8.x86_64
      Architecture: x86-64

参考:Ansible 文档


via: https://www.2daygeek.com/install-configure-ansible-automation-tool-linux-quick-start-guide/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:MjSeven 校对:wxy

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

火星车上的 CPU 速度和你淘汰的树莓派差不多

这次毅力号火星车上搭载的机巧号无人直升飞机作为演示项目,其所使用的 CPU 是技术人员有意从网上采购的商业成品硬件:高通骁龙 801,运行频率为 500Hz,对,你没看错,不是 500MHz —— 这是小米 3 所使用的 CPU,甚至其运行频率还专门调整到极低。

不过,这也比火星车上的 CPU 更快。NASA 最新的通用处理器是 ARM A53 变体,和树莓派 3 的 CPU 同属 A53 系列。也就是说,耗资 27 亿美元的火星车上的 CPU 的速度不会比你的淘汰的树莓派更快了。这是因为 NASA 级别的 CPU 和芯片必须满足 NASA 的高性能太空飞行计算辐射标准。这些定制化的处理器需要经过多年的设计工作和测试,才能获得太空飞行的认证。

看看自己的手机,顿时感觉高大上多了,比火星车都厉害。

开发者称 Chrome 比 Safari 多用 10 倍内存

开发者在 macOS Big Sur 上进行了测试。在打开两个标签页时,Chrome 的内存使用量达到了 1GB,而 Safari 只用了 80MB。而在打开 54 个标签页的情况下,与 Safari 相比,谷歌 Chrome 每个标签页的内存使用量多了 24 倍。测试时,这两款浏览器都没有安装任何扩展。根据他的调查,Chrome 浏览器每个打开的标签页使用了 290MB 的内存,而 Safari 浏览器每个打开的标签页只使用了 12MB。

Chrome 的吃内存问题其实由来已久,不过现在有点变本加厉,我觉得是时候看看换个浏览器了。

Linux 桌面用户安全意识方面落后

最近,Linux Mint 发布了一篇公告督促用户更新其 Linux 系统。据它的服务器端统计表明,大约只有 30% 的用户在一周内内应用了更新。而甚至约有 5% 到 30% 的用户仍在运行 Linux Mint 17,而它早在 2019 年 4 月就已经结束支持。当然,之所以有很多用户停留在 Linux Mint 17,有部分原因是因为现在有机制告诉用户什么时候有新版本可用,但在 Linux Mint 17.x 的时候还没有这些机制。

就我了解到的情况,不只是 Linux Mint,很多 Linux 桌面用户都不太积极更新自己的计算机。可见在安全意识方面,Linux 桌面用户也并不比 Windows 用户高多少。

通过深入了解 JavaScript 的高级概念之一:闭包,更好地理解 JavaScript 代码的工作和执行方式。

 title=

在《JavaScript 如此受欢迎的 4 个原因》中,我提到了一些高级 JavaScript 概念。在本文中,我将深入探讨其中的一个概念: 闭包 closure

根据 Mozilla 开发者网络(MDN),“闭包是将一个函数和对其周围的状态(词法环境)的引用捆绑在一起(封闭)的组合。”简而言之,这意味着在一个函数内部的函数可以访问其外部(父)函数的变量。

为了更好地理解闭包,可以看看作用域及其执行上下文。

下面是一个简单的代码片段:

var hello = "Hello";

function sayHelloWorld() {
    var world = "World";
    function wish() {
        var year = "2021";
        console.log(hello + " " + world + " "+ year);
    }
    wish();
}
sayHelloWorld();

下面是这段代码的执行上下文:

 title=

每次创建函数时(在函数创建阶段)都会创建闭包。每个闭包有三个作用域。

  • 本地作用域(自己的作用域)
  • 外部函数范围
  • 全局范围

我稍微修改一下上面的代码来演示一下闭包:

var hello = "Hello";

var sayHelloWorld = function() {
    var world = "World";
    function wish() {
        var year = "2021";
        console.log(hello + " " + world + " "+ year);
    }
    return wish;
}
var callFunc = sayHelloWorld();
callFunc();

内部函数 wish() 在执行之前就从外部函数返回。这是因为 JavaScript 中的函数形成了闭包

  • sayHelloWorld 运行时,callFunc 持有对函数 wish 的引用。
  • wish 保持对其周围(词法)环境的引用,其中存在变量 world

私有变量和方法

本身,JavaScript 不支持创建私有变量和方法。闭包的一个常见和实用的用途是模拟私有变量和方法,并允许数据隐私。在闭包范围内定义的方法是有特权的。

这个代码片段捕捉了 JavaScript 中闭包的常用编写和使用方式:

var resourceRecord = function(myName, myAddress) {
    var resourceName = myName;
    var resourceAddress = myAddress;
    var accessRight = "HR";
    return {
        changeName: function(updateName, privilege) {
            // only HR can change the name
            if (privilege === accessRight ) {
                resourceName = updateName;
                return true;
            } else {
                return false;
            }
        },  
        changeAddress: function(newAddress) {
            // any associate can change the address
            resourceAddress = newAddress;          
        },  
        showResourceDetail: function() {
            console.log ("Name:" + resourceName + " ; Address:" + resourceAddress);
        }
    }
}
// Create first record
var resourceRecord1 = resourceRecord("Perry","Office");
// Create second record
var resourceRecord2 = resourceRecord("Emma","Office");
// Change the address on the first record
resourceRecord1.changeAddress("Home");
resourceRecord1.changeName("Perry Berry", "Associate"); // Output is false as only an HR can change the name
resourceRecord2.changeName("Emma Freeman", "HR"); // Output is true as HR changes the name
resourceRecord1.showResourceDetail(); // Output - Name:Perry ; Address:Home
resourceRecord2.showResourceDetail(); // Output - Name:Emma Freeman ; Address:Office

资源记录(resourceRecord1resourceRecord2)相互独立。每个闭包通过自己的闭包引用不同版本的 resourceNameresourceAddress 变量。你也可以应用特定的规则来处理私有变量,我添加了一个谁可以修改 resourceName 的检查。

使用闭包

理解闭包是很重要的,因为它可以更深入地了解变量和函数之间的关系,以及 JavaScript 代码如何工作和执行。


via: https://opensource.com/article/21/2/javascript-closures

作者:Nimisha Mukherjee 选题:lujun9972 译者:wxy 校对:wxy

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

Viper 浏览器是一个基于 Qt 的浏览器,它提供了简单易用的用户体验,同时考虑到隐私问题。

虽然大多数流行的浏览器都运行在 Chromium 之上,但像 FirefoxBeaker 浏览器以及其他一些 chrome 替代品这样独特的替代品不应该停止存在。

尤其是考虑到谷歌最近可能想到从 Chromium 中剥离谷歌浏览器特有的功能,并给出了滥用的借口。

在寻找更多的 Chrome 替代品时,我在 Mastodon 上看到了一个有趣的项目 “Viper 浏览器”。

Viper 浏览器:一个基于 Qt5 的开源浏览器

注意:Viper 浏览器是一个只有几个贡献者的相当新的项目。它缺乏某些功能,我将在下文提及。

Viper 是一款有趣的 Web 浏览器,在利用 QtWebEngine 的同时,它专注于成为一个强大而又轻巧的选择。

QtWebEngine 借用了 Chromium 的代码,但它不包括连接到 Google 平台的二进制文件和服务。

我花了一些时间使用它并进行一些日常浏览活动,我必须说,我对它相当感兴趣。不仅仅是因为它是一个简单易用的东西(浏览器可以那么复杂),而且它还专注于增强你的隐私,为你提供添加不同的广告阻止选项以及一些有用的选项。

虽然我认为它并不是为所有人准备的,但还是值得一看的。在你继续尝试之前,让我简单介绍一下它的功能。

Viper 浏览器的功能

我将列出一些你会发现有用的关键功能:

  • 管理 cookies 的能力
  • 多个预设选项以选择不同的广告屏蔽器网络。
  • 简单且易于使用
  • 隐私友好的默认搜索引擎 - Startpage (你可以更改)
  • 能够添加用户脚本
  • 能够添加新的 user-agent
  • 禁用 JavaScript 的选项
  • 能够阻止图像加载

除了这些亮点之外,你还可以轻松地调整隐私设置,以删除你的历史记录、清理已有 cookies,以及一些更多的选项。

在 Linux 上安装 Viper 浏览器

它只是在发布页提供了一个 AppImage 文件,你可以利用它在任何 Linux 发行版上进行测试。

如果你需要帮助,你也可以参考我们的在 Linux 上使用 AppImage 文件指南。如果你好奇,你可以在 GitHub 上探索更多关于它的内容。

我对使用 Viper 浏览器的看法

我不认为这是一个可以立即取代你当前浏览器的东西,但如果你有兴趣测试尝试提供 Chrome 替代品的新项目,这肯定是其中之一。

当我试图登录我的谷歌账户时,它阻止了我,说它可能是一个不安全的浏览器或不支持的浏览器。因此,如果你依赖你的谷歌帐户,这是一个令人失望的消息。

但是,其他社交媒体平台也可以与 YouTube 一起正常运行(无需登录)。不支持 Netflix,但总体上浏览体验是相当快速和可用的。

你可以安装用户脚本,但 Chrome 扩展还不支持。当然,这要么是有意为之,要么是在开发过程中特别考虑到它是一款隐私友好型的网络浏览器。

总结

考虑到这是一个鲜为人知但对某些人来说很有趣的东西,你对我们有什么建议吗? 是一个值得关注的开源项目么?

请在下面的评论中告诉我。


via: https://itsfoss.com/viper-browser/

作者:Ankush Das 选题:lujun9972 译者:geekpi 校对:wxy

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