在 Linux 上压缩文件的 5 种方法

tar是归档不是压缩。<br />
zstd基本上可以淘汰gzip和bzip2.

7z在哪里，在哪里，在哪里？

tar 不是打包吗？gz才是压缩 ！

tar可以打包并压缩，如tgz

>
> 在 Linux 系统上有很多可以用于压缩文件的工具，但它们的表现并不都是一样的，也不是所有的压缩效果都是一样的。在这篇文章中，我们比较其中的五个工具。
>
>
>

![](/data/attachment/album/202005/06/231536tgxma941yb8dgl53.jpg)

在 Linux 上有不少用于压缩文件的命令。最新最有效的一个方法是 `xz`，但是所有的方法都有节省磁盘空间和维护备份文件供以后使用的优点。在这篇文章中，我们将比较这些压缩命令并指出显著的不同。

### tar

`tar` 命令不是专门的压缩命令。它通常用于将多个文件拉入一个单个的文件中，以便容易地传输到另一个系统，或者将文件作为一个相关的组进行备份。它也提供压缩的功能，这就很有意义了，附加一个 `z` 压缩选项能够实现压缩文件。

当使用 `z` 选项为 `tar` 命令附加压缩过程时，`tar` 使用 `gzip` 来进行压缩。

就像压缩一组文件一样，你可以使用 `tar` 来压缩单个文件，尽管这种操作与直接使用 `gzip` 相比没有特别的优势。要使用 `tar` 这样做，只需要使用 `tar cfz newtarfile filename` 命令来标识要压缩的文件，就像标识一组文件一样，像这样：

```
$ tar cfz bigfile.tgz bigfile
            ^            ^
            |            |
            +- 新的文件  +- 将被压缩的文件

$ ls -l bigfile*
-rw-rw-r-- 1 shs shs 103270400 Apr 16 16:09 bigfile
-rw-rw-r-- 1 shs shs 21608325 Apr 16 16:08 bigfile.tgz
```

注意，文件的大小显著减少了。

如果你愿意，你可以使用 `tar.gz` 扩展名，这可能会使文件的特征更加明显，但是大多数的 Linux 用户将很可能会意识到与 `tgz` 的意思是一样的 – `tar` 和 `gz` 的组合来显示文件是一个压缩的 tar 文件。在压缩完成后，你将同时得到原始文件和压缩文件。

要将很多文件收集在一起并在一个命令中压缩出 “tar ball”，使用相同的语法，但要指定要包含的文件为一组，而不是单个文件。这里有一个示例：

```
$ tar cfz bin.tgz bin/*
          ^         ^
          |         +-- 将被包含的文件
          + 新的文件
```

### zip

`zip` 命令创建一个压缩文件，与此同时保留原始文件的完整性。语法像使用 `tar` 一样简单，只是你必需记住，你的原始文件名称应该是命令行上的最后一个参数。

```
$ zip ./bigfile.zip bigfile
updating: bigfile (deflated 79%)
$ ls -l bigfile bigfile.zip
-rw-rw-r-- 1 shs shs 103270400 Apr 16 11:18 bigfile
-rw-rw-r-- 1 shs shs  21606889 Apr 16 11:19 bigfile.zip
```

### gzip

`gzip` 命令非常容易使用。你只需要键入 `gzip`，紧随其后的是你想要压缩的文件名称。不像上述描述的命令，`gzip` 将“就地”“加密”文件。换句话说，原始文件将被“加密”文件替换。

```
$ gzip bigfile
$ ls -l bigfile*
-rw-rw-r-- 1 shs shs  21606751 Apr 15 17:57 bigfile.gz
```

### bzip2

像使用 `gzip` 命令一样，`bzip2` 将在你选择的文件“就地”压缩，不留下原始文件。

```
$ bzip bigfile
$ ls -l bigfile*
-rw-rw-r-- 1 shs shs  18115234 Apr 15 17:57 bigfile.bz2
```

### xz

`xz` 是压缩命令团队中的一个相对较新的成员，在压缩文件的能力方面，它是一个领跑者。像先前的两个命令一样，你只需要将文件名称提供给命令。再强调一次，原始文件被就地压缩。

```
$ xz bigfile
$ ls -l bigfile*
-rw-rw-r-- 1 shs shs 13427236 Apr 15 17:30 bigfile.xz
```

对于大文件来说，你可能会注意到 `xz` 将比其它的压缩命令花费更多的运行时间，但是压缩的结果却是非常令人赞叹的。

### 对比

大多数人都听说过“大小不是一切”。所以，让我们比较一下文件大小以及一些当你计划如何压缩文件时的问题。

下面显示的统计数据都与压缩单个文件相关，在上面显示的示例中使用 `bigfile`。这个文件是一个大的且相当随机的文本文件。压缩率在一定程度上取决于文件的内容。

#### 大小减缩率

当比较时，上面显示的各种压缩命产生下面的结果。百分比表示压缩文件与原始文件的比较效果。

```
-rw-rw-r-- 1 shs shs 103270400 Apr 16 14:01 bigfile
------------------------------------------------------
-rw-rw-r-- 1 shs shs 18115234 Apr 16 13:59 bigfile.bz2    ~17%
-rw-rw-r-- 1 shs shs 21606751 Apr 16 14:00 bigfile.gz     ~21%
-rw-rw-r-- 1 shs shs 21608322 Apr 16 13:59 bigfile.tgz    ~21%
-rw-rw-r-- 1 shs shs 13427236 Apr 16 14:00 bigfile.xz     ~13%
-rw-rw-r-- 1 shs shs 21606889 Apr 16 13:59 bigfile.zip    ~21%
```

`xz` 命令获胜，最终只有压缩文件 13% 的大小，但是所有这些压缩命令都相当显著地减少原始文件的大小。

#### 是否替换原始文件

`bzip2`、`gzip` 和 `xz` 命令都用压缩文件替换原始文件。`tar` 和 `zip` 命令不替换。

#### 运行时间

`xz` 命令似乎比其它命令需要花费更多的时间来“加密”文件。对于 `bigfile` 来说，大概的时间是：

```
命令      运行时间
tar       4.9 秒
zip       5.2 秒
bzip2    22.8 秒
gzip      4.8 秒
xz       50.4 秒
```

解压缩文件很可能比压缩时间要短得多。

#### 文件权限

不管你对压缩文件设置什么权限，压缩文件的权限将基于你的 `umask` 设置，但 `bzip2` 除外，它保留了原始文件的权限。

#### 与 Windows 的兼容性

`zip` 命令创建的文件可以在 Windows 系统以及 Linux 和其他 Unix 系统上使用（即解压），而无需安装其他工具，无论这些工具可能是可用还是不可用的。

### 解压缩文件

解压文件的命令与压缩文件的命令类似。在我们运行上述压缩命令后，这些命令用于解压缩 `bigfile`：

* tar： `tar xf bigfile.tgz`
* zip： `unzip bigfile.zip`
* gzip： `gunzip bigfile.gz`
* bzip2： `bunzip2 bigfile.gz2`
* xz： `xz -d bigfile.xz` 或 `unxz bigfile.xz`

### 自己运行压缩对比

如果你想自己运行一些测试，抓取一个大的且可以替换的文件，并使用上面显示的每个命令来压缩它 —— 最好使用一个新的子目录。你可能需要先安装 `xz`，如果你想在测试中包含它的话。这个脚本可能更容易地进行压缩，但是可能需要花费几分钟完成。

```
#!/bin/bash

# 询问用户文件名称
echo -n "filename> "
read filename

# 你需要这个，因为一些命令将替换原始文件
cp $filename $filename-2

# 先清理(以免先前的结果仍然可用)
rm $filename.*

tar cvfz ./$filename.tgz $filename > /dev/null
zip $filename.zip $filename > /dev/null
bzip2 $filename
# 恢复原始文件
cp $filename-2 $filename
gzip $filename
# 恢复原始文件
cp $filename-2 $filename
xz $filename

# 显示结果
ls -l $filename.*

# 替换原始文件
mv $filename-2 $filename
```

---

via: <https://www.networkworld.com/article/3538471/how-to-compress-files-on-linux-5-ways.html>

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

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


如何避免中间人攻击（MITM）

>
> 首先搞明白到底什么是中间人攻击（MITM），才能避免成为此类高科技窃听的受害者。
>
>
>

![](/data/attachment/album/202005/07/100655i7og1eqsw6o3ww81.jpg)

当你使用电脑发送数据或与某人在线通话的时候，你一定采取了某种程度的安全隐私手段。

但如果有第三方在你不知情的情况下窃听，甚至冒充某个你信任的商业伙伴窃取破坏性的信息呢？你的私人数据就这样被放在了危险分子的手中。

这就是臭名昭著的<ruby> 中间人攻击 <rt>  man-in-the-middle </rt></ruby>（MITM）。

### 到底什么是中间人攻击？

黑客潜入到你与受害者或是某个设备间的通信过程中，窃取敏感信息（多数是身份信息）进而从事各种违法行为的过程，就是一次中间人攻击。Scamicide 公司创始人 Steve J. J. Weisman 介绍说：

>
> “中间人攻击也可以发生在受害者与某个合法 app 或网页中间。当受害者以为自己面对的是正常 app 或网页时，其实 Ta 正在与一个仿冒的 app 或网页互动，将自己的敏感信息透露给了不法分子。”
>
>
>

中间人攻击诞生于 1980 年代，是最古老的网络攻击形式之一。但它却更为常见。Weisman 解释道，发生中间人攻击的场景有很多种：

* **攻陷一个未有效加密的 WiFi 路由器**：该场景多见于人们使用公共 WiFi 的时候。“虽然家用路由器也很脆弱，但黑客攻击公共 WiFi 网络的情况更为常见。”Weisman 说，“黑客的目标就是从毫无戒心的人们那里窃取在线银行账户这样的敏感信息。”
* **攻陷银行、金融顾问等机构的电子邮件账户**：“一旦黑客攻陷了这些电子邮件系统，他们就会冒充银行或此类公司给受害者发邮件”，Weisman 说，”他们以紧急情况的名义索要个人信息，诸如用户名和密码。受害者很容易被诱骗交出这些信息。”
* **发送钓鱼邮件**：窃贼们还可能冒充成与受害者有合作关系的公司，向其索要个人信息。“在多个案例中，钓鱼邮件会引导受害者访问一个伪造的网页，这个伪造的网页看起来就和受害者常常访问的合法公司网页一模一样。”Weisman 说道。
* **在合法网页中嵌入恶意代码**：攻击者还会把恶意代码（通常是 JavaScript）嵌入到一个合法的网页中。“当受害者加载这个合法网页时，恶意代码首先按兵不动，直到用户输入账户登录或是信用卡信息时，恶意代码就会复制这些信息并将其发送至攻击者的服务器。”网络安全专家 Nicholas McBride 介绍说。

### 有哪些中间人攻击的著名案例？

联想作为主流的计算机制造厂商，在 2014 到 2015 年售卖的消费级笔记本电脑中预装了一款叫做 VisualDiscovery 的软件，拦截用户的网页浏览行为。当用户的鼠标在某个产品页面经过时，这款软件就会弹出一个来自合作伙伴的类似产品的广告。

这起中间人攻击事件的关键在于：VisualDiscovery 拥有访问用户所有私人数据的权限，包括身份证号、金融交易信息、医疗信息、登录名和密码等等。所有这些访问行为都是在用户不知情和未获得授权的情况下进行的。联邦交易委员会（FTC）认定此次事件为欺诈与不公平竞争。2019 年，联想同意为此支付 8300 万美元的集体诉讼罚款。

### 我如何才能避免遭受中间人攻击？

* **避免使用公共 WiFi**：Weisman 建议，从来都不要使用公开的 WiFi 进行金融交易，除非你安装了可靠的 VPN 客户端并连接至可信任的 VPN 服务器。通过 VPN 连接，你的通信是加密的，信息也就不会失窃。
* **时刻注意：**对要求你更新密码或是提供用户名等私人信息的邮件或文本消息要时刻保持警惕。这些手段很可能被用来窃取你的身份信息。

如果不确定收到的邮件来自于确切哪一方，你可以使用诸如电话反查或是邮件反查等工具。通过电话反查，你可以找出未知发件人的更多身份信息。通过邮件反查，你可以尝试确定谁给你发来了这条消息。

通常来讲，如果发现某些方面确实有问题，你可以听从公司中某个你认识或是信任的人的意见。或者，你也可以去你的银行、学校或其他某个组织，当面寻求他们的帮助。总之，重要的账户信息绝对不要透露给不认识的“技术人员”。
* **不要点击邮件中的链接**：如果有人给你发了一封邮件，说你需要登录某个账户，不要点击邮件中的链接。相反，要通过平常习惯的方式自行去访问，并留意是否有告警信息。如果在账户设置中没有看到告警信息，给客服打电话的时候也*不要*联系邮件中留的电话，而是联系站点页面中的联系人信息。
* **安装可靠的安全软件**：如果你使用的是 Windows 操作系统，安装开源的杀毒软件，如 [ClamAV](https://www.clamav.net)。如果使用的是其他平台，要保持你的软件安装有最新的安全补丁。
* **认真对待告警信息**：如果你正在访问的页面以 HTTPS 开头，浏览器可能会出现一则告警信息。例如，站点证书的域名与你尝试访问的站点域名不相匹配。千万不要忽视此类告警信息。听从告警建议，迅速关掉页面。确认域名没有输入错误的情况下，如果情况依旧，要立刻联系站点所有者。
* **使用广告屏蔽软件**：弹窗广告（也叫广告软件攻击）可被用于窃取个人信息，因此你还可以使用广告屏蔽类软件。对个人用户来说，中间人攻击其实是很难防范的，因为它被设计出来的时候，就是为了让受害者始终蒙在鼓里，意识不到任何异常。有一款不错的开源广告屏蔽软件叫 [uBlock origin](https://github.com/gorhill/uBlock)。可以同时支持 Firefox 和 Chromium（以及所有基于 Chromium 的浏览器，例如 Chrome、Brave、Vivaldi、Edge 等），甚至还支持 Safari。

### 保持警惕

要时刻记住，你并不需要立刻就点击某些链接，你也并不需要听从某个陌生人的建议，无论这些信息看起来有多么紧急。互联网始终都在。你大可以先离开电脑，去证实一下这些人的真实身份，看看这些“无比紧急”的页面到底是真是假。

尽管任何人都可能遭遇中间人攻击，只要弄明白何为中间人攻击，理解中间人攻击如何发生，并采取有效的防范措施，就可以保护自己避免成为其受害者。

---

via: <https://opensource.com/article/20/4/mitm-attacks>

作者：[Jackie Lam](https://opensource.com/users/beenverified) 选题：[lujun9972](https://github.com/lujun9972) 译者：[tinyeyeser](https://github.com/tinyeyeser) 校对：[wxy](https://github.com/wxy)

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


新闻速读 | 黑掉微软定制的 Linux 操作系统，微软将支付最高 10 万美金

Summary: 更多：GitHub 宣布基于云端托管的 Codespaces 集成开发环境；Ubuntu 20.10 将为 ZFS 提供更多改进

![](/data/attachment/album/202005/07/110837ayocfyocsyzlcqs8.jpg)

#### 黑掉微软定制的 Linux 操作系统，微软将支付最高 10 万美金

微软去年为其 Azure Sphere 系统构建了一个紧凑的定制版 Linux，该系统旨在物联网（IoT）平台专用芯片上运行，其基本服务和应用在沙盒中隔离运行，以确保安全。微软现在希望黑客测试 Azure Sphere 的安全性，如果 Pluton 安全子系统或 Secure World 沙箱被攻破，微软将支付最高 10 万美元的奖励。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/975693.htm)

>
> 硬核老王点评：对于 IoT 系统，其安全漏洞带来的危害将更大，因此如何重视都不为过。
>
>
>

#### GitHub 宣布基于云端托管的 Codespaces 集成开发环境

GitHub Codespaces 正是基于微软的 VS Code 编辑器打造（改名前叫做 VS Code Online）。两者采用了相同的概念和技术，只不过现在直接被 GitHub 直接集成到了现有的服务中。该服务现正处于免费公测阶段，正式上线后的定价暂不得而知，但 Niyogi 表示将与 GitHub Actions 差不多。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/975803.htm)

>
> 硬核老王点评：被微软收购后的 GitHub，在收费服务方面动作频频，对原来一些收费的核心服务进行了免费，而转向增加了新的收费服务。
>
>
>

#### Ubuntu 20.10 将为 ZFS 提供更多改进

ZFS 将是 Ubuntu 20.10 的开发工作重点，可能会出现加密的 Ubuntu ZFS 安装。早在 Ubuntu 19.10 中，开发团队就已将 ZFS（OpenZFS/ZFSOnLinux）的实验性根文件系统添加到其桌面 Ubiquity 安装程序中，以作为实验性的选项。到了 Ubuntu 20.04 LTS，使用 ZFS 作为根文件系统仍是一个实验性的选项，但做了一些改进。

来源：[开源中国](https://www.oschina.net/news/115433/ubuntu-20-10-more-zfs-improvement)

>
> 硬核老王点评：与 ext 文件系统相比，ZFS 近些年得到的关注和技术进步似乎更多。
>
>
>

#### 谷歌携手盖茨基金会为发展中国家开发开源数字支付服务 Mojaloop

谷歌携手比尔和梅林达·盖茨基金会等组织成立非盈利机构 Mojaloop 基金会，致力于为发展中国家开发开源实时数字支付服务，通过让储蓄变得更容易，小企业变得更有效率，以帮助更多人摆脱贫困。基于 Mojaloop 的国家支付系统可能好处更多，因为它们将连接不同的银行和支付系统。这可能会让数字钱包、传统银行账户或汇款服务无缝互动，帮助提升现有支付服务的价值，而不是与它们竞争。

来源：[网易科技](https://www.cnbeta.com/articles/tech/975763.htm)

#### Sailfish OS 3.3 “Rokua” 发布

Sailfish OS（中文：旗鱼系统）是一款开源操作系统，其核心基于 Mer 项目。Mer 是开源且针对移动设备优化的 Linux 发行版，同时也是 MeeGo 的分支，主要应用于智能手机、平板电脑，以及其他消费电子产品。当 MeeGo 计划被中止后，社区开发者从 MeeGo 中分支出 Mer 项目，诺基亚前员工成立的 Jolla 公司又从 Mer 分支出 Sailfish OS。

来源：[开源中国](https://www.oschina.net/news/115428/sailfish-os-3-3-rokua-released)

>
> 硬核老王点评：作为在 iOS 和安卓二分天下的移动操作系统市场中为数不多的其它操作系统，旗鱼还是被寄予了很多期望。
>
>
>

#### 成人网站泄露 108 亿条数据

成人网站 CAM4 因错误配置的 ElasticSearch 数据库泄露了 108 亿条数据，包括名字、性取向、支付记录、电邮和聊天记录，总容量 7 TB。目前没有证据表明 CAM4 遭黑客入侵或数据库被恶意攻击者访问，但由于其数据库敞开了大门，所以并不意味着没有。

来源：[solidot](https://www.solidot.org/story?sid=64284)


线上图片请抛弃 PNG 和 JPG：使用 WebP

Summary: 了解一下这个开源的图片编辑工具来节省时间和空间。

然而这篇文章里面的插图还是png

我只想了解avif的进展如何

看起来webp的色彩有所调整，整体偏灰，但分辨率更高一点。

了解一下这个开源的图片编辑工具来节省时间和空间。

>
> 了解一下这个开源的图片编辑工具来节省时间和空间。
>
>
>

![](/data/attachment/album/202005/07/143932l22hot7ebhbbqjmm.jpg)

WebP 是 2010 年 Google 开发的一种图片格式，它为网页上的图片提供了卓越的无损和有损压缩。网站开发者们可以使用 WebP 来创建尺寸更小、细节更丰富的图片，以此来提高网站的速度。更快的加载速度对于网站的用户体验和网站的营销效果是至关重要的。

为了在所有设备和用户中达到最佳加载效果，你网站上的图片文件大小不应该超过 500 KB。

与 PNG 图片相比，WebP 无损图片通常至少要比 PNG 图片小 25%。在同等的 SSIM（<ruby> 结构相似度 <rt>  structural similarity </rt></ruby>）质量指标下，WebP 有损图片通常比 JPEG 图片小 25% 到 34%。

无损 WebP 也支持透明度。而在可接受有损 RGB 压缩的情况下，有损 WebP 也支持透明度，通常 PNG 文件大小比它大三倍。

Google 报告称，把动画 GIF 文件转换为有损 WebP 后文件大小减少了 64%，转换为无损 WebP 后文件大小减少了 19%。

WebP 文件格式是一种基于 RIFF（<ruby> 资源互换文件格式 <rt>  resource interchange file format </rt></ruby>）的文档格式。你可以用 [hexdump](https://opensource.com/article/19/8/dig-binary-files-hexdump) 看到文件的签名是 `52 49 46 46`（RIFF）：

```
$ hexdump --canonical pixel.webp
00000000  52 49 46 46 26 00 00 00  [...]  |RIFF&...WEBPVP8 |
00000010  1a 00 00 00 30 01 00 9d  [...]  |....0....*......|
00000020  0e 25 a4 00 03 70 00 fe  [...]  |.%...p...`....|
0000002e
```

独立的 libwebp 库作为 WebP 技术规范的参考实现，可以从 Google 的 [Git 仓库](https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html) 或 tar 包中获得。

全球在用的 80% 的 web 浏览器兼容 WebP 格式。本文撰写时，Apple 的 Safari 浏览器还不兼容。解决这个问题的方法是将 JPG/PNG 图片与 WebP 图片一起提供，有一些方法和 Wordpress 插件可以做到这一点。

### 为什么要这样做？

我的部分工作是设计和维护我们组织的网站。由于网站是个营销工具，而网站的速度是衡量用户体验的重要指标，我一直致力于提高网站速度，通过把图片转换为 WebP 来减少图片大小是一个很好的解决方案。

我使用了 web.dev 来检测其中一个网页，该工具是由 Lighthouse 提供服务的，遵循 Apache 2.0 许可证，可以在 <https://github.com/GoogleChrome/lighthouse> 找到。

据其官方描述，“LIghthouse 是一个开源的，旨在提升网页质量的自动化工具。你可以在任何公共的或需要鉴权的网页上运行它。它有性能、可用性、渐进式 web 应用、SEO 等方面的审计。你可以在 Chrome 浏览器的开发工具中运行 Lighthouse，也可以通过命令行或作为 Node 模块运行。你输入一个 URL 给 Lighthouse，它会对这个网页进行一系列的审计，然后生成这个网页的审计结果报告。从报告的失败审计条目中可以知道应该怎么优化网页。每条审计都有对应的文档解释为什么该项目是重要的，以及如何修复它。”

### 创建更小的 WebP 图片

我测试的页面返回了三张图片。在它生成的报告中，它提供了推荐和目标。我选择了它报告有 650 KB 的 `app-graphic` 图片。通过把它转换为 WebP 格式，预计可以把图片大小降到 61 KB，节省 589 KB。我在 Photoshop 中把它转换了，用默认的 WebP 设置参数保存它，它的文件大小为 44.9 KB。比预期的还要好！从下面的 Photoshop 截图中可以看出，两张图在视觉质量上完全一样。

![](/data/attachment/album/202005/07/144528m4jgucnozc4v0iqz.png)

*左图：650 KB（实际大小）。右图： 44.9 KB（转换之后的目标大小）。*

当然，也可以用开源图片编辑工具 [GIMP](http://gimp.org) 把图片导出为 WebP。它提供了几个质量和压缩的参数：

![](/data/attachment/album/202005/07/143538plu797s4wmhy9b1p.jpg)

另一张图放大后：

![](/data/attachment/album/202005/07/144549ee1ddngawdr01ari.png)

PNG（左图）和 WebP（右图），都是从 JPG 转换而来，两图对比可以看出 WebP 不仅在文件大小更小，在视觉质量上也更优秀。

### 把图片转换为 WebP

你也可以用 Linux 的命令行工具把图片从 JPG/PNG 转换为 WebP：

在命令行使用 `cwebp` 把 PNG 或 JPG 图片文件转换为 WebP 格式。你可以用下面的命令把 PNG 图片文件转换为质量参数为 80 的 WebP 图片。

```
cwebp -q 80 image.png -o image.webp
```

你还可以用 [Image Magick](https://imagemagick.org)，这个工具可能在你的发行版本软件仓库中可以找到。转换的子命令是 `convert`，它需要的所有参数就是输入和输出文件：

```
convert pixel.png pixel.webp
```

### 使用编辑器把图片转换为 WebP

要在图片编辑器中来把图片转换为 WebP，可以使用 [GIMP](https://en.wikipedia.org/wiki/GIMP)。从 2.10 版本开始，它原生地支持 WebP。

如果你是 Photoshop 用户，由于 Photoshop 默认不包含 WebP 支持，因此你需要一个转换插件。遵循 Apache License 2.0 许可证发布的 WebPShop 0.2.1 是一个用于打开和保存包括动画图在内的 WebP 图片的 Photoshop 模块，在 <https://github.com/webmproject/WebPShop> 可以找到。

为了能正常使用它，你需要把它放进 Photoshop 插件目录下的 `bin` 文件夹：

Windows x64 ：`C:\Program Files\Adobe\Adobe Photoshop\Plug-ins\WebPShop.8bi`

Mac：`Applications/Adobe Photoshop/Plug-ins/WebPShop.plugin`

### Wordpress 上的 WebP

很多网站是用 Wordpress 搭建的（我的网站就是）。因此，Wordpress 怎么上传 WebP 图片？本文撰写时，它还不支持。但是，当然已经有插件来满足这种需求，因此你可以在你的网站上同时准备 WebP 和 PNG/JPG 图片（为 Apple 用户）。

在 [Marius Hosting](https://mariushosting.com/) 有下面的[说明](https://mariushosting.com/how-to-upload-webp-files-on-wordpress/)：

>
> “直接向 Wordpress 上传 WebP 图片会怎样？这很简单。向你的主题 `functions.php` 文件添加几行内容就可以了。Wordpress 默认不支持展示和上传 WebP 文件，但是我会向你介绍一下怎么通过几个简单的步骤来让它支持。登录进你的 Wordpress 管理员界面，进入‘外观/主题编辑器’找到 `functions.php`。复制下面的代码粘贴到该文件最后并保存：
>
>
>
> ```
> //** *Enable upload for webp image files.*/
> function webp_upload_mimes($existing_mimes) {
>     $existing_mimes['webp'] = 'image/webp';
>     return $existing_mimes;
> }
> add_filter('mime_types', 'webp_upload_mimes');
> ```
>
> 如果你想在‘媒体/媒体库’时看到缩略图预览，那么你需要把下面的代码也添加到 `functions.php` 文件。为了找到 `functions.php` 文件，进入‘外观/主题编辑器’并搜索 `functions.php`，然后复制下面的代码粘贴到文件最后并保存：
>
>
>
> ```
> //** * Enable preview / thumbnail for webp image files.*/
> function webp_is_displayable($result, $path) {
>     if ($result === false) {
>         $displayable_image_types = array( IMAGETYPE_WEBP );
>         $info = @getimagesize( $path );
>
>         if (empty($info)) {
>             $result = false;
>         } elseif (!in_array($info[2], $displayable_image_types)) {
>             $result = false;
>         } else {
>             $result = true;
>         }
>     }
>
>     return $result;
> }
> add_filter('file_is_displayable_image', 'webp_is_displayable', 10, 2);
> ```
>
> ”
>
>
>

### WebP 和未来

WebP 是一个健壮而优化的格式。它看起来更好，压缩率更高，并具有其他大部分常见图片格式的所有特性。不必再等了，现在就使用它吧。

---

via: <https://opensource.com/article/20/4/webp-image-compression>

作者：[Jeff Macharyas](https://opensource.com/users/jeffmacharyas) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lxbwolf](https://github.com/lxbwolf) 校对：[wxy](https://github.com/wxy)

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


视频号：来了

Summary: 欢迎关注支持！

![](/data/attachment/album/202005/08/091514foaf28u9f2ch252l.jpg)

就在昨天，终于得到了微信官方的视频号公测邀请，于是，我们也开了一个视频号，和公众号同名，也叫“**Linux中国**”。大家如果已经能看视频号，可以扫描如下二维码关注我们，也可以在视频号中搜索“**Linux中国**”：

![](/data/attachment/album/202005/08/091535ryou6g8jv6ggbu58.jpeg)

说明：如果你的微信发现页没有“视频号”入口，并且设置里面也没有，那你可能无法关注（显示“功能暂未开放，无法查看”），需要等微信逐步灰度测试到才行。

这个视频号目前初期准备用来配合公众号传播一些有趣的技术视频；后期我也在考虑是否亲自出镜做一下直播，不知道大家支持不支持？（支持的点个在看）

目前已经发布了一些视频，是来源于几年前我们翻译合成的 Linux 基金会的《[如果这个世界没有 Linux](/article-7018-1.html)》系列视频（感谢 Linux 基金会，感谢字幕译者：@name1e5s、校对：@jerryling315 的贡献），可能许多后来关注我们的同学是没看过的，我就再次将家底翻出来给大家欣赏一下。

不过，如果你暂时还没有开通视频号看不到，那也不要紧，我会这几天陆续将这系列的六个视频都在公众号也推送一下。


将 Fedora 31 升级到 Fedora 32

![](/data/attachment/album/202005/08/094029mlse7bs2pip6g87s.png)

Fedora 32 [已经发布](/article-12164-1.html)。你可能想升级系统以获得 Fedora 中的最新功能。Fedora Workstation 有图形化的升级方法。另外，Fedora 提供了命令行方法，用于将 Fedora 31 升级到 Fedora 32。

升级前，请访问 [Fedora 32 个常见 bug 的维基页面](https://fedoraproject.org/wiki/Common_F32_bugs)，查看是否存在可能影响升级的问题。尽管 Fedora 社区试图确保升级正常进行，但是无法为用户可能使用的每种软硬件组合提供保证。

### 将 Fedora 31 Workstation 升级到 Fedora 32

在新版本发布不久之后就会出现通知，告诉你有可用的升级。你可以单击该通知启动 “GNOME 软件”。或者，你可以从 GNOME Shell 中选择“软件”。

在 “GNOME 软件”中选择<ruby> 更新 <rt>  Updates </rt></ruby>选项卡，你会看到一个页面通知你 Fedora 32 现在可用。

如果你在此页面看不到任何内容，请尝试使用左上方的重新加载按钮。发布后，所有系统可能都需要一段时间才能看到可用的升级。

选择<ruby> 下载 <rt>  Download </rt></ruby>获取升级包。你可以继续做事直到下载完成。然后使用 “GNOME 软件”重启系统并应用升级。升级需要时间，因此你可能需要喝杯咖啡，稍后再回来。

### 使用命令行

如果你是从 Fedora 的先前版本升级的，那么你可能对 `dnf upgrade` 插件很熟悉。这个方法是推荐和受支持的从 Fedora 31 升级到 Fedora 32 的方法。使用此插件将使你轻松地升级到 Fedora 32。

#### 1、更新软件并备份系统

在开始升级过程之前，请确保你有 Fedora 31 的最新软件。如果你安装了<ruby> 模块化软件 <rt>  modular software </rt></ruby>，这尤为重要。`dnf` 和 “GNOME 软件”的最新版本对某些模块化流的升级过程进行了改进。要更新软件，请使用 “GNOME 软件” 或在终端中输入以下命令。

```
sudo dnf upgrade --refresh
```

此外，在继续操作之前，请确保备份系统。有关备份的帮助，请参阅 Fedora Magazine 上的[备份系列](https://fedoramagazine.org/taking-smart-backups-duplicity/)。

#### 2、安装 DNF 插件

接下来，打开终端并输入以下命令安装插件：

```
sudo dnf install dnf-plugin-system-upgrade
```

#### 3、使用 DNF 开始更新

现在，你的系统已更新、已备份、并且已安装 DNF 插件，你可以在终端中使用以下命令开始升级：

```
sudo dnf system-upgrade download --releasever=32
```

这个命令将开始在本地下载所有的升级包，为升级做准备。如果你在升级的时候因为没有更新的包、依赖关系破损或退役的包而出现问题，请在输入上述命令时添加 `--allowerasing` 标志。这将允许 DNF 移除可能阻碍系统升级的软件包。

#### 4、重启并升级

当上一个命令完成了所有升级包的下载，你的系统就可以重新启动了。要将系统引导至升级过程，请在终端中输入以下命令：

```
sudo dnf system-upgrade reboot
```

此后，系统将重启。在许多版本之前，`fedup` 工具会在内核选择/启动页上创建一个新选项。使用 `dnf-plugin-system-upgrade` 包，你的系统会重启进入 Fedora 31 当前安装的内核；这个是正常的。在选择内核之后，你的系统会立即开始升级过程。

现在可能是喝杯咖啡休息的好时机！完成后，系统将重启，你将能够登录到新升级的 Fedora 32 系统。

![](/data/attachment/album/202005/08/094031hkrz75fe7oxrgtde.png)

### 解决升级问题

有时，升级系统时可能会出现意外问题。如果你遇到任何问题，请访问 [DNF 系统升级文档](https://docs.fedoraproject.org/en-US/quick-docs/dnf-system-upgrade/#Resolving_post-upgrade_issues)，以获取有关故障排除的更多信息。

如果升级时遇到问题，并且系统上安装了第三方仓库，那么在升级时可能需要禁用这些仓库。对于 Fedora 不提供的仓库的支持，请联系仓库的提供者。

---

via: <https://fedoramagazine.org/upgrading-fedora-31-to-fedora-32/>

作者：[Adam Šamalík](https://fedoramagazine.org/author/asamalik/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


新闻速读 | 黑客操纵一物联网僵尸网络 8 年，只为下载动漫视频

Summary: 更多：有黑客从微软私有 GitHub 库中窃取了 63.2GB 的源代码；Facebook iOS SDK 导致众多应用崩溃

![](/data/attachment/album/202005/08/105152eacdvdziyc8a6dbs.jpg)

#### 黑客操纵一物联网僵尸网络 8 年，只为下载动漫视频

据报道，这个名为“Cereals”的僵尸网络于 2012 年首次被发现，并于 2015 年达到顶峰，当时它积累了超过 1 万个“僵尸”。然而，尽管这个僵尸网络规模庞大，但大多数网络安全公司都没有发现它的踪迹。不过目前，“Cereals”正在慢慢消失，因为这些年来它所依赖的旧式 D-Link 设备已经开始老化，而且用户也在更换产品。此外，一个名为“Cr1ptT0r”的勒索病毒毒株在 2019 年冬天从许多 D-Link 系统中破坏了“Cereals”恶意软件，这也加速了这一僵尸网络的衰落。目前所有证据都表明，这个僵尸网络的作者据称是一个名叫 Stefan 的德国人，他在制作“Cereals”的过程中从未有任何犯罪意图，似乎只有一个目的——下载动画短片。

来源：[凤凰网科技](https://www.cnbeta.com/articles/tech/976031.htm)

>
> 硬核老王点评：这种僵尸网络的用途真是别开生面啊。
>
>
>

#### 成功在 iPhone 上运行的 postmarketOS 已经适配了 200 台移动设备

postmarketOS 已经在大约 [200](https://tuxphones.com/static/counter/) 台移动设备（包括手机和平板）上运行，这无疑是 Linux 领域的一个[重要成就](https://tuxphones.com/postmarketos-boots-200-linux-phones-tablets-sbcs/)。在这 200 台移动设备中，最值得关注的就是 [iPhone 7](https://blog.project-insanity.org/2020/04/16/running-postmarketos-on-iphone-7/) 了。经过开发者的逆向工程， iPhone 7 已成功引导了 postmarketOS，成为首款苹果 Linux 智能手机。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/975969.htm)

>
> 硬核老王点评：这种黑客精神才是真正有趣的黑客精神。
>
>
>

#### 有黑客从微软私有 GitHub 库中窃取了 63.2GB 的源代码

根据文件的目录列表截图显示，转储文件中涵盖了 Azure、Office 和部分 Windows runtimes。随后这条消息得到了数据泄露监控和防范服务机构 Under the Breach 推特账户的证实。需要注意的是，尽管此次泄露的源代码规模很大，但不代表黑客会获取到微软的核心商业机密，微软在 GitHub 仓库中存储的内容一般都是公开的，即便存储在私人仓库中的内容也是如此。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/976263.htm)

>
> 硬核老王点评：究竟发生了什么，私有仓库也不安全了么？
>
>
>

#### IBM 开源用于简化 AI 模型开发的 Elyra 工具包

“Jupyter Notebooks 现在是数据科学和人工智能（AI）模型开发的开放标准”，IBM 在官方博客文章中表示，“为了兑现我们对开源和 Jupyter 社区的承诺，IBM 宣布推出 Elyra，这是 Jupyter Notebook 的一组以开源 AI 为中心的扩展，更具体地说是新的 JupyterLab 用户界面。”

来源：[开源中国](https://www.oschina.net/news/115466/ibm-open-sources-elyra-ai-toolkit)

#### 全国首起暗网平台案告破，注册会员逾 6 万

无锡市公安局 7 日召开新闻通气会，对外发布该市警方破获的全国首起“暗网”平台案件详情。该案中，男子王某在“暗网”上搭建淫秽网站、传播淫秽物品牟利，被警方查获时，网站注册会员已达 6 万多名。检法部门认为：专案组获取的证据确凿、指向清晰、证据链完备，足以认定犯罪事实，可在“零口供”前提下对王某按涉嫌传播淫秽物品牟利罪予以提捕。

来源：[环球时报](https://www.cnbeta.com/articles/tech/976175.htm)

#### 欧盟正试图修正其糟糕的 Cookie 同意政策

对于许多互联网用户而言，欧盟的 Cookie 同意政策在浏览网络时是一种令人沮丧且不可避免的体验，它于 2018 年作为《一般数据保护条例》（GDPR）的一部分而出台，它要求用户在首次访问网站时同意被跟踪，但其中措辞往往有误导性，或者无法拒绝。为了让 cookie 同意更符合用户的意愿，欧盟本周发布了最新的指导方针，禁止对这些政策进行最糟糕的解释。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/976085.htm)

#### 伦敦帝国学院的新冠模型代码存在严重 bug

在新冠疫情爆发的初期，伦敦帝国学院的 MRC 全球传染病分析中心曾多次做出被广泛报道的预测，而它的预测被认为也对政府的公共政策决策产生影响。但众所周知，科学家并非是出色的程序员，他们写的代码可能存在严重问题，而根据这些代码做出的研究显然也会存在严重问题，更不用说公共政策决策。MRC 全球传染病分析中心发布在 Github 上的 COVID-19 CovidSim 模型就被发现其代码有严重缺陷，有软件开发者呼吁撤回所有基于这些代码的论文。科学家则感到被程序员的出言不逊冒犯了。

来源： [solidot](https://www.solidot.org/story?sid=64292)

>
> 硬核老王点评：来自程序员的鄙视。
>
>
>

#### Facebook iOS SDK 导致众多应用崩溃

开发者在 Facebook iOS SDK 的 Github 问题页面报告，多个版本的 SDK 导致了大量应用崩溃。Facebook SDK 被广泛用于身份验证和广告展示。受影响的流行应用包括了 Spotify、TikTok、Pinterest、Winno 等等

来源： [solidot](https://www.solidot.org/story?sid=64285)

>
> 硬核老王点评：除非绝对必要，不要轻易使用第三方 SDK。据说受此牵连，连统计应用崩溃的 Firebase Crashlytics 服务都崩溃了十几个小时。
>
>
>


在 Ubuntu 桌面中使用文件和文件夹

![](/data/attachment/album/202005/08/224609chff5qn5ccah56af.jpg)

>
> 此初学者教程讨论了在 Ubuntu 桌面上添加文件和文件夹时可能遇到的一些困难。
>
>
>

我认识一些习惯将所有重要/常用文件放在桌面上以便快速访问的人。

![](/data/attachment/album/202005/08/224831vhshoxzgypgmmwpg.jpg)

我不喜欢杂乱的桌面，但是我可以想象它实际上可能对某些人有所帮助。

在过去的几个版本中，很难在 Ubuntu 的默认 GNOME 桌面上添加文件。这并不是 Ubuntu 的错。

[GNOME](https://www.gnome.org/) 的开发者认为，桌面上没有图标和文件的存身之地。当你可以在菜单中轻松搜索文件时，无需将文件放在桌面上。这在部分情况下是事实。

这就是为什么 [GNOME 的文件管理器 Nautilus](https://wiki.gnome.org/Apps/Files) 的较新版本不能很好地支持桌面上的图标和文件的原因。

也就是说，在桌面上添加文件和文件夹并非没有可能。让我告诉你如何做。

### 在 Ubuntu 的桌面上添加文件和文件夹

![](/data/attachment/album/202005/08/224640b93fvzzeebdkfvrv.png)

我在本教程中使用的是 Ubuntu 20.04。对于其他 Ubuntu 版本，步骤可能会有所不同。

#### 将文件和文件夹添加到“桌面文件夹”

如果打开文件管理器，你应该在左侧边栏或文件夹列表中看到一个名为“桌面”的条目。此文件夹（以某种方式）代表你的桌面。

![Desktop folder can be used to add files to the desktop screen](/data/attachment/album/202005/08/224650siw0t0fsp0izaa09.png)

你添加到此文件夹的所有内容都会反映在桌面上。

![Anything added to the Desktop folder will be reflected on the desktop screen](/data/attachment/album/202005/08/224653qkz1j5mm50fsa00s.jpg)

如果你从“桌面文件夹”中删除文件，那么文件也会从桌面中删除。

#### 将文件拖放到桌面不起作用

现在，如果你尝试从文件管理器往桌面上拖放文件，它会不起使用。这不是一个 bug，它是一个使很多人恼火的功能。

一种临时方案是打开两个文件管理器。在其中一个打开“桌面”文件夹，然后将文件拖放到该文件夹中，它们将被添加到桌面上。

我知道这并不理想，但是你没有太多选择。

#### 你不能使用 Ctrl+C 和 Ctrl+V 在桌面上复制粘贴，请使用右键单击菜单

更恼人的是，你不能使用 `Ctrl+V`（著名的键盘快捷键）将文件粘贴到桌面上。

但是，你仍然可以使用右键单击，然后选择“粘贴”，将文件复制到桌面上。你甚至可以通过这种方式创建新文件夹。

![Right click menu can be used for copy-pasting files to desktop](/data/attachment/album/202005/08/224653wsj8q8f8b8fbp8s1.jpg)

是否有意义？对我来说不是，但这就是 Ubuntu 20.04 的方式。

#### 你无法使用 Delete 键删除文件和文件夹，请再次使用右键菜单

更糟糕的是，你无法使用 `Delete` 键或 `Shift+Delete` 键从桌面上删除文件。但是你仍然可以右键单击文件或文件夹，然后选择“移至回收站”来删除文件。

![Delete files from desktop using right click](/data/attachment/album/202005/08/224709cg2hh5hiz3gjggrg.jpg)

好了，你现在知道至少有一种方法可以在桌面上添加文件，但有一些限制。不幸的是，这还没有结束。

你无法在桌面上用名称搜索文件。通常，如果你开始输入 “abc”，那么以 “abc” 开头的文件会高亮显示。但是在这里不行。

我不知道为什么在桌面上添加文件受到了如此多的限制。值得庆幸的是，我不会经常使用它，否则我会感到非常沮丧。

如果有兴趣，你也可以阅读[在 Ubuntu 桌面上添加应用快捷方式](https://itsfoss.com/ubuntu-desktop-shortcut/)这篇文章。

---

via: <https://itsfoss.com/add-files-on-desktop-ubuntu/>

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

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


在 Linux 上使用开源软件创建 SDN

Summary: 使用开源路由协议栈 Quagga，使你的 Linux 系统成为一台路由器。

使用开源路由协议栈 Quagga，使你的 Linux 系统成为一台路由器。

>
> 使用开源路由协议栈 Quagga，使你的 Linux 系统成为一台路由器。
>
>
>

![](/data/attachment/album/202005/09/093541rqx3zr5dxn3yvnq6.jpg)

网络路由协议分为两大类：内部网关协议和外部网关协议。路由器使用内部网关协议在单个自治系统内共享信息。如果你用的是 Linux，则可以通过开源（GPLv2）路由协议栈 [Quagga](https://www.quagga.net/) 使其表现得像一台路由器。

### Quagga 是什么？

Quagga 是一个[路由软件包](https://en.wikipedia.org/wiki/Quagga_(software))，并且是 [GNU Zebra](https://www.gnu.org/software/zebra/) 的一个分支。它为类 Unix 平台提供了所有主流路由协议的实现，例如开放最短路径优先（OSPF），路由信息协议（RIP），边界网关协议（BGP）和中间系统到中间系统协议（IS-IS）。

尽管 Quagga 实现了 IPv4 和 IPv6 的路由协议，但它并不是一个完整的路由器。一个真正的路由器不仅实现了所有路由协议，而且还有转发网络流量的能力。 Quagga 仅仅实现了路由协议栈，而转发网络流量的工作由 Linux 内核处理。

### 架构

Quagga 通过特定协议的守护程序实现不同的路由协议。守护程序名称与路由协议相同，加了字母“d”作为后缀。Zebra 是核心，也是与协议无关的守护进程，它为内核提供了一个[抽象层](https://en.wikipedia.org/wiki/Abstraction_layer)，并通过 TCP 套接字向 Quagga 客户端提供 Zserv API。每个特定协议的守护程序负责运行相关的协议，并基于交换的信息来建立路由表。

![Quagga architecture](/data/attachment/album/202005/09/093747cpcrqrrzkvp5cke5.png "Quagga architecture")

### 环境

本教程通过 Quagga 实现的 OSPF 协议来配置动态路由。该环境包括两个名为 Alpha 和 Beta 的 CentOS 7.7 主机。两台主机共享访问 **192.168.122.0/24** 网络。

**主机 Alpha：**

IP：192.168.122.100/24 网关：192.168.122.1

**主机 Beta：**

IP：192.168.122.50/24 网关：192.168.122.1

### 安装软件包

首先，在两台主机上安装 Quagga 软件包。它存在于 CentOS 基础仓库中：

```
yum install quagga -y
```

### 启用 IP 转发

接下来，在两台主机上启用 IP 转发，因为它将由 Linux 内核来执行：

```
sysctl -w net.ipv4.ip_forward = 1
sysctl -p
```

### 配置

现在，进入 `/etc/quagga` 目录并为你的设置创建配置文件。你需要三个文件：

* `zebra.conf`：Quagga 守护程序的配置文件，你可以在其中定义接口及其 IP 地址和 IP 转发
* `ospfd.conf`：协议配置文件，你可以在其中定义将通过 OSPF 协议提供的网络
* `daemons`：你将在其中指定需要运行的相关的协议守护程序

在主机 Alpha 上，

```
 [root@alpha]# cat /etc/quagga/zebra.conf
interface eth0
 ip address 192.168.122.100/24
 ipv6 nd suppress-ra
interface eth1
 ip address 10.12.13.1/24
 ipv6 nd suppress-ra
interface lo
ip forwarding
line vty

[root@alpha]# cat /etc/quagga/ospfd.conf
interface eth0
interface eth1
interface lo
router ospf
 network 192.168.122.0/24 area 0.0.0.0
 network 10.12.13.0/24 area 0.0.0.0
line vty

[root@alphaa ~]# cat /etc/quagga/daemons
zebra=yes
ospfd=yes
```

在主机 Beta 上，

```
[root@beta quagga]# cat zebra.conf
interface eth0
 ip address 192.168.122.50/24
 ipv6 nd suppress-ra
interface eth1
 ip address 10.10.10.1/24
 ipv6 nd suppress-ra
interface lo
ip forwarding
line vty

[root@beta quagga]# cat ospfd.conf
interface eth0
interface eth1
interface lo
router ospf
 network 192.168.122.0/24 area 0.0.0.0
 network 10.10.10.0/24 area 0.0.0.0
line vty

[root@beta ~]# cat /etc/quagga/daemons
zebra=yes
ospfd=yes
```

### 配置防火墙

要使用 OSPF 协议，必须允许它通过防火墙：

```
firewall-cmd --add-protocol=ospf –permanent

firewall-cmd –reload
```

现在，启动 `zebra` 和 `ospfd` 守护程序。

```
# systemctl start zebra
# systemctl start ospfd
```

用下面命令在两个主机上查看路由表:

```
[root@alpha ~]# ip route show
default via 192.168.122.1 dev eth0 proto static metric 100
10.10.10.0/24 via 192.168.122.50 dev eth0 proto zebra metric 20
10.12.13.0/24 dev eth1 proto kernel scope link src 10.12.13.1
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.100 metric 100
```

你可以看到 Alpha 上的路由表包含通过 **192.168.122.50** 到达 **10.10.10.0/24** 的路由项，它是通过协议 zebra 获取的。同样，在主机 Beta 上，该表包含通过 **192.168.122.100** 到达网络 **10.12.13.0/24** 的路由项。

```
[root@beta ~]# ip route show
default via 192.168.122.1 dev eth0 proto static metric 100
10.10.10.0/24 dev eth1 proto kernel scope link src 10.10.10.1
10.12.13.0/24 via 192.168.122.100 dev eth0 proto zebra metric 20
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.50 metric 100
```

### 结论

如你所见，环境和配置相对简单。要增加复杂性，你可以向路由器添加更多网络接口，以为更多网络提供路由。你也可以使用相同的方法来实现 BGP 和 RIP 协议。

---

via: <https://opensource.com/article/20/4/quagga-linux>

作者：[M Umer](https://opensource.com/users/noisybotnet) 选题：[lujun9972](https://github.com/lujun9972) 译者：[messon007](https://github.com/messon007) 校对：[wxy](https://github.com/wxy)

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


新闻速读 > 2019 年 Python 开发者调查结果发布：Linux 最受欢迎

Summary: 更多：8000 元，100% 开源的笔记本电脑众筹；2020 年最抢手的编程语言是谷歌的 Go

![](/data/attachment/album/202005/09/110350a2jlteslml5fsehb.jpg)

#### 2019 年 Python 开发者调查结果发布：Linux 最受欢迎

近日，Python 官方发布了 2019 年 Python 开发者调查结果。84% 的受访者将 Python 作为主要语言；最常与 Python 一起使用的语言是 JavaScript，占比 43%；NumPy（63%）和 Pandas（55%）是最受欢迎的数据科学框架；超过一半的受访者都在使用 Requests 库；超过 2/3 的受访者使用 Linux 进行开发；最喜欢的 Python 开发工具是 PyCharm 和 VScode，接着是 Vim。[完整报告](https://www.jetbrains.com/lp/python-developers-survey-2019/#PythonVersions)

来源：[开源中国](https://www.oschina.net/news/115499/python-developers-survey-2019)

>
> 硬核老王点评：做开发的你不用 Linux，感觉总是差点什么。
>
>
>

#### 8000 元，100% 开源的笔记本电脑众筹

MNT Reform 主打开源，不仅搭载了开源系统（预装 Debian GNU/Linux 11），其硬件部分包括 CPU、主板、外壳等等也全部是开源的，用户甚至可以自己下载数据自行 3D 打印一套笔记本机身。MNT Reform 的另一个优势是模块化，其 CPU 与内存放在一个拥有 200 针 SODIMM 接口的模块上，用户可以更换升级。

来源：[快科技](https://news.mydrivers.com/1/687/687963.htm)

>
> 硬核老王点评：全部开源的笔记本一定是 RMS 的心头爱。
>
>
>

#### 2020 年最抢手的编程语言是谷歌的 Go

根据 HackerEarth 公司对来自 76 个国家超过 16,655 名开发者进行的[调查结果](https://www.hackerearth.com/recruit/developer-survey/#survey-report)显示，在最想了解的编程语言中 Go 名列前茅。调查发现，32% 的有经验的开发者选择 Go 作为他们想学习的编程语言，超过了 Python（24%）。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/976621.htm)

>
> 硬核老王点评：Go 语言的前景（钱景）可观，目前发展态势也很好。
>
>
>

#### 微软表示每月有 1.5 亿用户在体验免密登录

该公司在一篇博客文章中表示，得益于 Windows Hello、Microsoft Authenticator 、以及基于 FIDO2 的安全密钥方案，用户可以更加放心地轻松登录体验各项服务，包括 Azure、GitHub、Office 和 Xbox 。短六个月时间，这一数字就增长了近 5000 万。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/976717.htm)

>
> 硬核老王点评：这种采用 MFA 的免密认证要比使用简单密码的认证安全得多，也方便得多。
>
>
>

#### Ubuntu 20.04 LTS 对树莓派进行认证，以提供全面支持

在 Ubuntu 20.04 LTS 公开发布的同一天，所有经认证的树莓派上都已添加了对 Ubuntu Server 20.04 的全面支持，用户可以将 20.04 刷入到树莓派中。经过认证后，树莓派将每三周收到经过测试的更新和安全补丁。

来源：[开源中国](https://www.oschina.net/news/115505/ubuntu-20-04-lts-is-certified-for-the-raspberry-pi)

#### 安卓 App 奇葩的“链式启动”

MIUI 加入了“照明弹”功能，该功能可以把安卓 App 在后台的一举一动暴露在用户面前，很多人惊讶地发现，为数不少的 App 竟然会唤醒其他 App！例如只要你开启微博 App，就会唤起墨迹天气、百词斩、抖音、云闪付等 App——这，就是大名鼎鼎的“链式启动”。App 一旦接入了友盟、极光、个推等等这些推送 SDK，就会自带链式启动的特性。两个风马牛不相及的 App 之所以相互唤醒，就是这个原因。

来源：[太平洋电脑网](https://www.cnbeta.com/articles/tech/976589.htm)

>
> 硬核老王点评：可恶！
>
>
>

#### Google 翻译内核升级 称误差再降 55% 以上

Google 翻译搭载的 Google 的神经机器翻译（GNMT）系统使用了当前最先进的训练技术。十多年前，Google 发布了 Google 翻译，早年基于短语的统计机器翻译，这种翻译方式的劣势非常明显。而 GNMT 则将输入的句子作为一个整体翻译。现在，移动版和网页版的 Google 翻译的中英翻译每天进行大约 1800 万条翻译。

来源：[TechWeb](https://www.cnbeta.com/articles/tech/976523.htm)

>
> 硬核老王点评：似乎目前几个翻译服务都各有千秋，或许要是有个可以综合各个翻译服务的结果的 AI，可能翻译出来的结果会更好。
>
>
>


Fedora 32 Workstation 的新功能

![](/data/attachment/album/202005/09/203804j5d7qz67dd7qttra.jpg)

Fedora 32 Workstation 是我们免费的领先操作系统的[最新版本](/article-12164-1.html)。你现在可以从[官方网站](https://getfedora.org/workstation)下载它。Fedora 32 Workstation 中有几个新的且值得注意的变化。请阅读下面的详情。

### GNOME 3.36

Fedora 32 Workstation 包含了适合所有用户的 GNOME 桌面环境的最新版本。Fedora 32 Workstation 中的 GNOME 3.36 包含了许多更新和改进，包括：

#### 重新设计的锁屏界面

Fedora 32 中的锁屏是一种全新的体验。新设计消除了以前版本中使用的“窗口阴影”，并着重于易用性和速度。

![Unlock screen in Fedora 32](/data/attachment/album/202005/09/203805oqepuwz5zfumhmmp.gif)

#### 新的扩展程序

Fedora 32 有新的“扩展”应用，它可轻松管理你的 GNOME 扩展。过去，扩展是使用“软件”和/或“调整工具”来安装、配置和启用的。

![The new Extensions application in Fedora 32](/data/attachment/album/202005/09/203806kxxkq24xxb2b2nhq.png)

请注意，默认情况下，Fedora 32 上未安装这个“扩展”应用。需要使用“软件”进行搜索和安装，或在终端中使用以下命令：

```
sudo dnf install gnome-extensions-app
```

#### 重新组织的设置应用

敏锐的 Fedora 用户会注意到“设置”应用已重新组织。设置类别的结构更加扁平，因此可以一次看到更多设置。

此外，“关于”中现在有有关系统的更多信息，包括正在运行的窗口系统（例如 Wayland）。

![The reorganized settings application in Fedora 32](/data/attachment/album/202005/09/203807bpblihl545c55hch.png)

#### 重新设计的通知/日历弹出框

单击桌面顶部的“日期和时间”可切换“通知/日历”弹出窗口，其中有许多小的样式调整项。此外，弹出窗口现在有“请勿打扰”开关，可快速禁用所有通知。这在希望只显示屏幕而不显示个人通知时很有用。

![The new Notification / Calendar popover in Fedora 32 ](/data/attachment/album/202005/09/203808wt89ebrrotr9ubnx.png)

#### 重新设计的时钟应用

Fedora 32 完全重新设计了时钟。该设计在较小的窗口中效果更好。

![The Clocks application in Fedora 32](/data/attachment/album/202005/09/203809be3bz2yho1utyoe3.png)

GNOME 3.36 还提供了许多其他功能和增强。有关更多信息，请查看 [GNOME 3.36 的发布说明](https://help.gnome.org/misc/release-notes/3.36/)。

### 改进的内存不足处理

以前，如果系统内存不足，那么可能会遇到大量使用交换（也称为 [交换抖动](https://en.wikipedia.org/wiki/Thrashing_(computer_science))）–有时会导致 Workstation UI 变慢或在一段时间内无响应。Fedora 32 Workstation 现在默认启用 EarlyOOM。EarlyOOM 可以让用户在低内存的情况下，存在大量使用交换的情况下，更快速地恢复和恢复对系统的控制。

---

via: <https://fedoramagazine.org/whats-new-fedora-32-workstation/>

作者：[Ryan Lerch](https://fedoramagazine.org/author/ryanlerch/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


超算即服务：超级计算机如何上云

>
> 高性能计算（HPC）服务可能是一种满足不断增长的超级计算需求的方式，但依赖于使用场景，它们不一定比使用本地超级计算机好。
>
>
>

![](/data/attachment/album/202005/09/223805mrjfjzecr3hceais.jpg)

导弹和军用直升机上的电子设备需要工作在极端条件下。美国国防承包商<ruby> 麦考密克·史蒂文森公司 <rt>  McCormick Stevenson Corp. </rt></ruby>在部署任何物理设备之前都会事先模拟它所能承受的真实条件。模拟依赖于像 Ansys 这样的有限元素分析软件，该软件需要强大的算力。

几年前的一天，它出乎意料地超出了计算极限。

麦考密克·史蒂文森公司的首席工程师 Mike Krawczyk 说：“我们的一些工作会使办公室的计算机不堪重负。购买机器并安装软件在经济上或计划上都不划算。”相反，他们与 Rescale 签约，该公司销售其超级计算机系统上的处理能力，而这只花费了他们购买新硬件上所需的一小部分。

麦考密克·史蒂文森公司已成为被称为超级计算即服务或高性能计算即服务（两个紧密相关的术语）市场的早期采用者之一。根据国家计算科学研究所的定义，HPC 是超级计算机在计算复杂问题上的应用，而超级计算机是处理能力最先进的那些计算机。

无论叫它什么，这些服务都在颠覆传统的超级计算市场，并将 HPC 能力带给以前负担不起的客户。但这不是万能的，而且绝对不是即插即用的，至少现在还不是。

### HPC 服务实践

从最终用户的角度来看，HPC 即服务类似于早期大型机时代的批处理模型。 “我们创建一个 Ansys 批处理文件并将其发送过去，运行它，然后将结果文件取下来，然后导入到本地，” Krawczyk 说。

在 HPC 服务背后，云提供商在其自己的数据中心中运行超级计算基础设施，尽管这不一定意味着当你听到“超级计算机”时你就会看到最先进的硬件。正如 IBM OpenPOWER 计算技术副总裁 Dave Turek 解释的那样，HPC 服务的核心是“相互互连的服务器集合。你可以调用该虚拟计算基础设施，它能够在你提出问题时，使得许多不同的服务器并行工作来解决问题。”

理论听起来很简单。但都柏林城市大学数字商业教授 Theo Lynn 表示，要使其在实践中可行，需要解决一些技术问题。普通计算与 HPC 的区别在于那些互联互通 —— 高速的、低延时的而且昂贵的 —— 因此需要将这些互连引入云基础设施领域。在 HPC 服务可行之前，至少需要将存储性能和数据传输也提升到与本地 HPC 相同的水平。

但是 Lynn 说，一些制度创新相比技术更好的帮助了 HPC 服务的起飞。特别是，“我们现在看到越来越多的传统 HPC 应用采用云友好的许可模式 —— 这在过去是阻碍采用的障碍。”

他说，经济也改变了潜在的客户群。“云服务提供商通过向那些负担不起传统 HPC 所需的投资成本的低端 HPC 买家开放，进一步开放了市场。随着市场的开放，超大规模经济模型变得越来越多，更可行，成本开始下降。”

### 避免本地资本支出

HPC 服务对传统超级计算长期以来一直占据主导地位的私营部门客户具有吸引力。这些客户包括严重依赖复杂数学模型的行业，包括麦考密克·史蒂文森公司等国防承包商，以及石油和天然气公司、金融服务公司和生物技术公司。都柏林城市大学的 Lynn 补充说，松耦合的工作负载是一个特别好的用例，这意味着许多早期采用者将其用于 3D 图像渲染和相关应用。

但是，何时考虑 HPC 服务而不是本地 HPC 才有意义？对于德国的模拟烟雾在建筑物中的蔓延和火灾对建筑物结构部件的破坏的 hhpberlin 公司来说，答案是在它超出了其现有资源时。

Hpberlin 公司数值模拟的科学负责人 Susanne Kilian 说：“几年来，我们一直在运行自己的小型集群，该集群具有多达 80 个处理器核。……但是，随着应用复杂性的提高，这种架构已经越来越不足以支撑；可用容量并不总是够快速地处理项目。”

她说：“但是，仅仅花钱买一个新的集群并不是一个理想的解决方案：鉴于我们公司的规模和管理环境，不断地维护这个集群（定期进行软件和硬件升级）是不现实的。另外，需要模拟的项目数量会出现很大的波动，因此集群的利用率并不是真正可预测的。通常，使用率很高的阶段与很少使用或不使用的阶段交替出现。”通过转换为 HPC 服务模式，hhpberlin 释放了过剩的产能，并无需支付升级费用。

IBM 的 Turek 解释了不同公司在评估其需求时所经历的计算过程。对于拥有 30 名员工的生物科学初创公司来说，“你需要计算，但你真的不可能让 15% 的员工专门负责计算。这就像你可能也会说你不希望有专职的法律代表，所以你也会把它作为一项服务来做。”不过，对于一家较大的公司而言，最终归结为权衡 HPC 服务的运营费用与购买内部超级计算机或 HPC 集群的费用。

到目前为止，这些都是你采用任何云服务时都会遇到的类似的争论。但是，可以 HPC 市场的某些特殊性将使得衡量运营支出（OPEX）与资本支出（CAPEX）时选择前者。超级计算机不是诸如存储或 x86 服务器之类的商用硬件；它们非常昂贵，技术进步很快会使其过时。正如麦考密克·史蒂文森公司的 Krawczyk 所说，“这就像买车：只要车一开走，它就会开始贬值。”对于许多公司，尤其是规模较大，灵活性较差的公司，购买超级计算机的过程可能会陷入无望的泥潭。IBM 的 Turek 说：“你会被规划问题、建筑问题、施工问题、培训问题所困扰，然后必须执行 RFP。你必须得到 CIO 的支持。你必须与内部客户合作以确保服务的连续性。这是一个非常、非常复杂的过程，并没有很多机构有非常出色的执行力。”

一旦你选择走 HPC 服务的路线，你会发现你会得到你期望从云服务中得到的许多好处，特别是仅在业务需要时才需付费的能力，从而可以带来资源的高效利用。Gartner 高级总监兼分析师 Chirag Dekate 表示，当你对高性能计算有短期需求时，突发性负载是推动选择 HPC 服务的关键用例。

他说：“在制造业中，在产品设计阶段前后，HPC 活动往往会达到很高的峰值。但是，一旦产品设计完成，在其余产品开发周期中，HPC 资源的利用率就会降低。” 相比之下，他说：“当你拥有大型的、长期运行的工作时，云计算的经济性才会逐渐减弱。”

通过巧妙的系统设计，你可以将这些 HPC 服务突发活动与你自己的内部常规计算集成在一起。<ruby> 埃森哲 <rt>  Accenture </rt></ruby>实验室常务董事 Teresa Tung 举了一个例子：“通过 API 访问 HPC 可以与传统计算无缝融合。在模型构建阶段，传统的 AI 流水线可能会在高端超级计算机上进行训练，但是最终经过反复按预期运行的训练好的模型将部署在云端的其他服务上，甚至部署在边缘设备上。”

### 它并不适合所有的应用场景

HPC 服务适合批处理和松耦合的场景。这与一个常见的 HPC 缺点有关：数据传输问题。高性能计算本身通常涉及庞大的数据集，而将所有这些信息通过互联网发送到云服务提供商并不容易。IBM 的 Turek 说：“我们与生物技术行业的客户交流，他们每月仅在数据费用上就花费 1000 万美元。”

而钱并不是唯一的潜在问题。构建一个利用数据的工作流程，可能会对你的工作流程提出挑战，让你绕过数据传输所需的漫长时间。hhpberlin 的 Kilian 说：“当我们拥有自己的 HPC 集群时，当然可以随时访问已经产生的仿真结果，从而进行交互式的临时评估。我们目前正努力达到在仿真的任意时刻都可以更高效地、交互地访问和评估云端生成的数据，而无需下载大量的模拟数据。”

Mike Krawczyk 提到了另一个绊脚石：合规性问题。国防承包商使用的任何服务都需要遵从《国际武器交易条例》（ITAR），麦考密克·史蒂文森公司之所以选择 Rescale，部分原因是因为这是他们发现的唯一符合的供应商。如今，尽管有更多的公司使用云服务，但任何希望使用云服务的公司都应该意识到使用其他人的基础设施时所涉及的法律和数据保护问题，而且许多 HPC 场景的敏感性使得 HPC 即服务的这个问题更加突出。

此外，HPC 服务所需的 IT 治理超出了目前的监管范围。例如，你需要跟踪你的软件许可证是否允许云使用 —— 尤其是专门为本地 HPC 群集上运行而编写的软件包。通常，你需要跟踪 HPC 服务的使用方式，它可能是一个诱人的资源，尤其是当你从员工习惯的内部系统过渡到有可用的空闲的 HPC 能力时。例如，Avanade 全球平台高级主管兼 Azure 平台服务全球负责人 Ron Gilpin 建议，将你使用的处理核心的数量回拨给那些对时间不敏感的任务。他说：“如果一项工作只需要用一小时来完成而不需要在十分钟内就完成，那么它可以使用 165 个处理器而不是 1,000 个，从而节省了数千美元。”

### 对 HPC 技能的要求很高

一直以来，采用 HPC 的最大障碍之一就是其所需的独特的内部技能，而 HPC 服务并不能神奇使这种障碍消失。Gartner 的 Dekate 表示：“许多 CIO 将许多工作负载迁移到了云上，他们看到了成本的节约、敏捷性和效率的提升，因此相信在 HPC 生态中也可以达成类似的效果。一个普遍的误解是，他们可以通过彻底地免去系统管理员，并聘用能解决其 HPC 工作负载的新的云专家，从而以某种方式优化人力成本。”对于 HPC 即服务来说更是如此。

“但是 HPC 并不是一个主流的企业环境。” 他说。“你正在处理通过高带宽、低延迟的网络互联的高端计算节点，以及相当复杂的应用和中间件技术栈。许多情况下，甚至连文件系统层也是 HPC 环境所独有的。没有对应的技能可能会破坏稳定性。”

但是超级计算技能的供给却在减少，Dekate 将其称为劳动力“老龄化”，这是因为这一代开发人员将目光投向了新兴的初创公司，而不是学术界或使用 HPC 的更老套的公司。因此，HPC 服务供应商正在尽其所能地弥补差距。IBM 的 Turek 表示，许多 HPC 老手将总是想运行他们自己精心调整过的代码，并需要专门的调试器和其他工具来帮助他们在云端实现这一目标。但是，即使是 HPC 新手也可以调用供应商构建的代码库，以利用超级计算的并行处理能力。第三方软件提供商出售的交钥匙软件包可以减少 HPC 的许多复杂性。

埃森哲的 Tung 表示，该行业需要进一步加大投入才能真正繁荣。她说：“HPCaaS 已经创建了具有重大影响力的新功能，但还需要做的是使它易于被数据科学家、企业架构师或软件开发人员使用。这包括易用的 API、文档和示例代码。它包括解答问题的用户支持。仅仅提供 API 是不够的，API 需要适合特定的用途。对于数据科学家而言，这可能是以 Python 形式提供，并容易更换她已经在使用的框架。价值来自于使这些用户能够通过新的效率和性能最终使他们的工作得到改善，只要他们能够访问新的功能就可以了。” 如果供应商能够做到这一点，那么 HPC 服务才能真正将超级计算带给大众。

---

via: <https://www.networkworld.com/article/3534725/the-ins-and-outs-of-high-performance-computing-as-a-service.html>

作者：[Josh Fruhlinger](https://www.networkworld.com/author/Josh-Fruhlinger/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[messon007](https://github.com/messon007) 校对：[wxy](https://github.com/wxy)

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


使用 Beaker 浏览器浏览对等 Web

![](/data/attachment/album/202005/10/082745ztmi4kqh4iq449ll.jpg)

在过去 50 年中，我们所了解的互联网没有什么变化，全球的网民使用他们的设备从遍布在世界各地的服务器上检索数据。

一群专业的技术专家想改变现状，使互联网变成人们可以连接和直接分享信息的地方，而不是依赖一个中心服务器（去中心化）。

我们已经在 It’s FOSS 讨论过很多这样的去中心化的服务。[YouTube 竞品：LBRY](https://itsfoss.com/lbry/)、[Twitter 竞品：Mastodon](https://itsfoss.com/mastodon-open-source-alternative-twitter/) 是其中的两个例子。

今天我将要介绍另一个这样的产品，名为 [Beaker 浏览器](https://beakerbrowser.com/)，它的设计目标是浏览对等 Web。

![Beaker Browser](/data/attachment/album/202005/10/083036yeso1o0ok1o0n0o8.jpg)

### “对等 Web” 是什么？

根据 Beaker 浏览器的[开发者之一](https://pfrazee.hashbase.io/blog/what-is-the-p2p-web)的描述，“对等 Web 是一项实验性的技术 ……旨在提高我们掌控 Web 的能力。”

还有，他们说对等 Web 有三个主要原则：任何一点都可以成为服务器；多台计算机可以为同一个网站提供服务；没有后端。

从这些原则中你可以看出，对等 Web 的思想与 BitTorrent 很像，文件由多个对端做种，这些对端共同承担带宽负载。这减少了一个用户需要提供给他们的网站的总带宽。

![Beaker Browser Settings](/data/attachment/album/202005/10/082813xskck3cc47b6zb2z.jpg)

对等 Web 另一个重要的方面是创作者对于他们自己的想法的控制能力。当今年代，平台都是由庞大的组织控制的，往往拿你的数据为他们所用。Beaker 把数据的控制能力返还给了内容创造者。

### 使用 Beaker 浏览去中心化的 web

[Beaker 浏览器](https://beakerbrowser.com/) 是在 2016 年被创建的。该项目（及其周边技术）由[蓝链实验室](https://bluelinklabs.com/)的三人团队创建。Beaker 浏览器使用 [Dat 协议](https://www.datprotocol.com/)在计算机之间共享数据。使用 Dat 协议的网站以 `dat://` 而不是 `http://` 开头。

Dat 协议的优势如下：

* 快速 – 档案能立即从多个源同步。
* 安全 – 所有的更新都是有签名和经过完整性检查的。
* 灵活 – 可以在不修改档案 URL 的情况下迁移主机。
* 版本控制 – 每次修改都被写到只能追加的版本日志中。
* 去中心化 – 任何设备都可以作为承载档案的主机。

![Beaker Browser Seeding](/data/attachment/album/202005/10/082827y0qbju40lzp0j3to.jpg)

Beaker 浏览器本质上是阉割版的 Chromium，原生支持 `dat://` 地址，也可以访问普通的 `http://` 站点。

每次访问一个 dat 站点，在你请求时该站点的内容才会下载到你的计算机。例如，在一个站点上的 about 页面中有一张 Linux Torvalds 的图片，只有在你浏览到该站点的这个页面时，才会下载这张图片。

此外，当你浏览一个 dat 网站时，“[你会短暂性的](https://beakerbrowser.com/docs/faq/)重新上传或做种你从该网站上下载的所有文件。”你也可以选择为网站（主动）做种来帮助创造者。

![Beaker Browser Menu](/data/attachment/album/202005/10/082832j6dsizplps6ppwib.jpg)

由于 Beaker 的志向就是创建一个更开放的网络，因此你可以很容易地查看任何网站的源码。不像在大多数浏览器上你只能看到当前浏览的页面的源码那样，使用 Beaker 你能以类似 GitHub 的视图查看整个站点的结构。你甚至可以复刻这个站点，并托管你自己的版本。

除了浏览基于 dat 的网站外，你还可以创建自己的站点。在 Beaker 浏览器的菜单里，有创建新网站或空项目的选项。如果你选择了创建一个新网站，Beaker 会搭建一个小的演示站点，你可以使用浏览器里自带的编辑器来编辑。

然而，如果你像我一样更喜欢用 Markdown，你可以选择创建一个空项目。Beaker 会创建一个站点的结构，赋给它一个 `dat://` 地址。你只需要创建一个 `index.md` 文件后就行了。这有个[简短教程](https://beakerbrowser.com/docs/guides/create-a-markdown-site)，你可以看到更多信息。你也可以用创建空项目的方式搭建一个 web 应用。

![Beaker Browser Website Template](/data/attachment/album/202005/10/082833du6hzqquqoqu2xr6.jpg)

由于 Beaker 的角色是个 Web 服务器和站点做种者，当你关闭它或关机后你的站点就不可用了。幸运的是，你不必一直开着你的计算机或浏览器。你也可以使用名为 [Hashbase](https://hashbase.io/) 的做种服务或者你可以搭建一个 [homebase](https://github.com/beakerbrowser/homebase) 做种服务器。

虽然 Beaker [适用于](https://beakerbrowser.com/install/) Linux、Windows 和 macOS，但是在使用 Beaker 之前，还是要查阅下[各平台的教程](https://beakerbrowser.com/docs/guides/)。

### Beaker 浏览器不是大众可用的，但它有这个意图

当第一次接触到时，我对 Beaker 浏览器有极高的热情。（但是）如它现在的名字一样（烧杯），Beaker 浏览器仍是非常实验性的。我尝试浏览过的很多 dat 站点还不可用，因为用户并没有为站点做种。当站点恢复可用时 Beaker 确实可以选择通知你。

![Beaker Browser No Peer](/data/attachment/album/202005/10/082904jl72aa42av4jy2cg.jpg)

另一个问题是，Beaker 是真正阉割版的 Chromium。它不能安装扩展或主题。你只能使用白色主题和极少的工具集。我不会把 Beaker 浏览器作为常用浏览器，而且能访问 dat 网站并不是把它留在系统上的充分条件。

我曾经寻找一个能支持 `dat://` 协议的 Firefox 扩展。我确实找到了这样一款扩展，但它需要安装一系列其他的软件。相比而言，安装 Beaker 比安装那些软件容易点。

就如它现在的名字一样，Beaker 不适合我。也许在将来更多的人使用 Beaker 或者其他浏览器支持 dat 协议。那时会很有趣。目前而言，聊胜于无。

在使用 Beaker 的时间里，我用内建的工具创建了一个[网站](https://41bfbd06731e8d9c5d5676e8145069c69b254e7a3b710ddda4f6e9804529690c/)。不要担心，我已经为它做种了。

![Beaker Bowser Site Source](/data/attachment/album/202005/10/083011dzyaocy5qlqel34o.jpg)

你怎么看 Beaker 浏览器？你怎么看对等 Web？请尽情在下面评论。

如果你觉得本文有意思，请花点时间把它分享到社交媒体，Hacker News 或 [Reddit](https://reddit.com/r/linuxusersgroup)。

---

via: <https://itsfoss.com/beaker-browser/>

作者：[John Paul](https://itsfoss.com/author/john/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lxbwolf](https://github.com/lxbwolf) 校对：[wxy](https://github.com/wxy)

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


新闻速读 > McAfee 称疫情期间 52% 被远程攻击的 RDP 用户来自中国，原因是密码太简单

Summary: 更多：全球 31 家巨头成立 Open RAN 政策联盟，并不“只”针对华为；比 H.265 更先进！MPEG-5 编码标准落地：华为、高通、三星首批支持

![](/data/attachment/album/202005/10/094012hpbhzdebd8kzeex5.jpg)

#### McAfee 称疫情期间 52% 被远程攻击的 RDP 用户来自中国，原因是密码太简单

在疫情期间，全球众多企业越来越多地将微软 RDP 作为一种帮助员工在家工作的方式，受此影响，互联网 RDP 端口的数量从今年 1 月份的 300 万个增加到今年 3 月底的 450 万个。被盗的 RDP 证书中有 52% 来自中国用户，其中包括超过 2 万个注册账户。McAfee 的研究指出，大多数受攻击的 RDP 端口并不是由高级恶意软件造成的，而仅仅是由“暴力破解”简单密码造成的。更重要的是，有相当数量的被曝光的 RDP 端口根本不需要密码，许多端口使用“123456”这样的常见密码。

来源：[凤凰网科技](https://www.cnbeta.com/articles/tech/976795.htm)

>
> 硬核老王点评：强密码记不住，弱密码会被黑，所以，采用 MFA 这样的免密码认证方式（参见昨天的推送）可能是更好的做法。
>
>
>

#### 全球 31 家巨头成立 Open RAN 政策联盟，并不“只”针对华为

据法新社报道，本周 31 家全球科技和电信企业宣布成立 Open RAN 政策联盟，希望建立“开放并可互操作”5G 网络。与此同时，该联盟中却并没有传统设备商如华为、中兴、爱立信、诺基亚以及一些电信企业的参与。更需关注的是，这其中没有一家中国企业。这里解释一下 Open RAN，即开放无线接入网，Open 意指开放，通过软件开源化、接口开放化和硬件白盒化来实现模块化组建基站，基站也是无线接入网的重要组成。在 Open RAN 模式下，软件与硬件分离，专用硬件被通用硬件代替，运营商的基站将由多家厂商供应组成，比如 A 厂商提供 RAN 软件，B 厂商提供通用服务器，而服务器里的芯片又可由另一家通用芯片巨头 C 来提供。Open RAN 政策联盟的重点就在于政策，倡导有助于推动 Open RAN 采用的政府政策。

来源：[雷锋网](https://www.cnbeta.com/articles/tech/976883.htm)

>
> 硬核老王点评：开放是好的，但是针对性的意味比较重，是因为既得利益的传统电信设备厂商而被剔除在外吗？
>
>
>

#### 比 H.265 更先进！MPEG-5 编码标准落地：华为、高通、三星首批支持

当前 H.265 主要用于 4K、HDR（高动态范围）、WCG 视频（宽色域），MPEG-5 的使命在于让 4K、8K、VR/AR、HDR 以更快、更优质的方式普及。MPEG-5 EVC 有 Layer1（基本模式）和 Layer2（主模式）两个层级，Layer 1 免授权费，Layer 2 则包含所有的技术组件并支持单独开闭，至少 120 帧、10 位精度。测试数据显示，MPEG-5 EVC 在主模式下拥有和 H.265 相同的视频质量，但平均比特率降低 26%；基本模式相较于 H.264，平均比特率降低 31%，解码时间减少 60%。

来源：[快科技](https://news.mydrivers.com/1/687/687984.htm?tdsourcetag=s_pctim_aiomsg)

#### 真·中国芯笔记本来了：16nm 国产 x86 CPU、超窄边框

5 月 8 日，英众科技联手上海兆芯推出了基于 16nm 国产 x86 处理器的台式机、一体机、MINI-PC、笔记本、加固型笔记本及工控机等新品。

来源：[快科技](https://www.cnbeta.com/articles/tech/976993.htm)

#### 运营商首次“点名”国产 CPU 服务器进行大规模集采招标

5 月 7 日，中国电信在网站上发布 2020 年服务器集中采购项目货物招标集中资格预审公告。此次集采涉 3 个系列服务器的采购，分别对应 Intel 系列服务器（I系列）、AMD 系列服务器（A系列），以及包含华为鲲鹏系列或中科曙光旗下海光（Hygon）系列处理器（统称为 H 系列）的全国产化服务器。从数量上看，H 系列服务器预估采购数量达 11185 台，占总数的 19.9%；I 系列、A 系列的占比则分别为 79.4%、0.7%。

来源：[观察者网](https://www.cnbeta.com/articles/tech/976935.htm)

#### 自由硬件工具链：OpenROAD

现代的芯片设计周期一般长达 12 到 36 个月，这使得美国国防部的研发团队无力负担如此高昂的成本，OpenROAD 是 DARPA（美国国防高级研究计划局）的 IDEA 项目中的一个自由硬件工具链项目，用于解决对抗芯片设计中的复杂性以及大幅度降低成本等重要问题，最终目标是开发基于机器学习完成无人监督的自动化芯片设计的系统。

来源：[solidot](https://www.solidot.org/story?sid=64303)

#### 欧洲最大私人医院运营商遭勒索软件攻击

运营欧洲最大私人医院的德国 Fresenius 集团遭勒索软件攻击。Fresenius 称这起事故限制它的部分业务运作，但病人护理正常。Fresenius 总部位于德国，在一百多个国家雇佣了近 30 万人。网络攻击的罪魁祸首是名叫 Snake 的勒索软件。

来源：[solidot](https://www.solidot.org/story?sid=64308)

>
> 硬核老王点评：这个时期对医院和医疗机构的攻击，可见趁火打劫的毫无底线。
>
>
>

#### Google 和 Facebook 考虑全年远程办公

Google 发言人证实了该消息，表示大部分员工预计将在家工作到 2021 年。Facebook 也告知员工，如果乐意他们可以全年远程工作。

来源：[solidot](https://www.solidot.org/story?sid=64312)

>
> 硬核老王点评：需要做好长期备战的准备。
>
>
>


GNU 核心实用程序简介

>
> 大多数 Linux 系统管理员需要做的事情都可以在 GNU coreutils 或 util-linux 中找到。
>
>
>

![](/data/attachment/album/202005/10/172312hofgh88i3g6jajfj.jpg)

许多 Linux 系统管理员最基本和常用的工具主要包括在两套实用程序中：[GNU 核心实用程序（coreutils）](https://www.gnu.org/software/coreutils/coreutils.html)和 util-linux。它们的基本功能允许系统管理员执行许多管理 Linux 系统的任务，包括管理和操作文本文件、目录、数据流、存储介质、进程控制、文件系统等等。

这些工具是不可缺少的，因为没有它们，就不可能在 Unix 或 Linux 计算机上完成任何有用的工作。鉴于它们的重要性，让我们来研究一下它们。

### GNU coreutils

要了解 GNU 核心实用程序的起源，我们需要乘坐时光机进行一次短暂的旅行，回到贝尔实验室的 Unix 早期。[编写 Unix](https://en.wikipedia.org/wiki/History_of_Unix) 是为了让 Ken Thompson、Dennis Ritchie、Doug McIlroy 和 Joe Ossanna 可以继续他们在大型多任务和多用户计算机项目 [Multics](https://en.wikipedia.org/wiki/Multics) 上的工作：开发一个叫做《太空旅行》游戏的小东西。正如今天一样，推动计算技术发展的似乎总是游戏玩家。这个新的操作系统比 Multics（LCTT 译注：multi- 字头的意思是多数的）的局限性更大，因为一次只能有两个用户登录，所以被称为 Unics（LCTT 译注：uni- 字头的意思是单独的）。后来这个名字被改成了 Unix。

随着时间的推移，Unix 取得了如此巨大的成功，开始贝尔实验室基本上是将其赠送给大学，后来送给公司也只是收取介质和运输的费用。在那个年代，系统级的软件是在组织和程序员之间共享的，因为在系统管理这个层面，他们努力实现的是共同的目标。

最终，AT&T 公司的[老板们](https://en.wikipedia.org/wiki/Pointy-haired_Boss)决定，他们应该在 Unix 上赚钱，并开始使用限制更多的、昂贵的许可证。这发生在软件变得更加专有、受限和封闭的时期，从那时起，与其他用户和组织共享软件变得不可能。

有些人不喜欢这种情况，于是用自由软件来对抗。Richard M. Stallman（RMS），他带领着一群“反叛者”试图编写一个开放的、自由的可用操作系统，他们称之为 GNU 操作系统。这群人创建了 GNU 实用程序，但并没有产生一个可行的内核。

当 Linus Torvalds 开始编写和编译 Linux 内核时，他需要一套非常基本的系统实用程序来开始执行一些稍微有用的工作。内核并不提供命令或任何类型的命令 shell，比如 Bash，它本身是没有任何用处的，因此，Linus 使用了免费提供的 GNU 核心实用程序，并为 Linux 重新编译了它们。这让他拥有了一个完整的、即便是相当基本的操作系统。

你可以通过在终端命令行中输入命令 `info coreutils` 来了解 GNU 核心实用程序的全部内容。下面的核心实用程序列表就是这个信息页面的一部分。这些实用程序按功能进行了分组，以方便查找；在终端中，选择你想了解更多信息的组，然后按回车键。

```
* Output of entire files::       cat tac nl od base32 base64
* Formatting file contents::     fmt pr fold
* Output of parts of files::     head tail split csplit
* Summarizing files::            wc sum cksum b2sum md5sum sha1sum sha2
* Operating on sorted files::    sort shuf uniq comm ptx tsort
* Operating on fields::          cut paste join
* Operating on characters::      tr expand unexpand
* Directory listing::            ls dir vdir dircolors
* Basic operations::             cp dd install mv rm shred
* Special file types::           mkdir rmdir unlink mkfifo mknod ln link readlink
* Changing file attributes::     chgrp chmod chown touch
* Disk usage::                   df du stat sync truncate
* Printing text::                echo printf yes
* Conditions::                   false true test expr
* Redirection::                  tee
* File name manipulation::       dirname basename pathchk mktemp realpath
* Working context::              pwd stty printenv tty
* User information::             id logname whoami groups users who
* System context::               date arch nproc uname hostname hostid uptime
* SELinux context::              chcon runcon
* Modified command invocation::  chroot env nice nohup stdbuf timeout
* Process control::              kill
* Delaying::                     sleep
* Numeric operations::           factor numfmt seq
```

这个列表里有 102 个实用程序。它涵盖了在 Unix 或 Linux 主机上执行基本任务所需的许多功能。但是，很多基本的实用程序都缺失了，例如，`mount` 和 `umount` 命令不在这个列表中。这些命令和其他许多不在 GNU 核心实用程序中的命令可以在 util-linux 中找到。

### util-linux

util-linix 实用程序包中包含了许多系统管理员常用的其它命令。这些实用程序是由 Linux 内核组织发布的，这 107 条命令中几乎每一个都来自原本是三个单独的集合 —— fileutils、shellutils 和 textutils，2003 年它们被[合并成一个包](https://en.wikipedia.org/wiki/GNU_Core_Utilities)：util-linux。

```
agetty          fsck.minix      mkfs.bfs        setpriv
blkdiscard      fsfreeze        mkfs.cramfs     setsid
blkid           fstab           mkfs.minix      setterm
blockdev        fstrim          mkswap          sfdisk
cal             getopt          more            su
cfdisk          hexdump         mount           sulogin
chcpu           hwclock         mountpoint      swaplabel
chfn            ionice          namei           swapoff
chrt            ipcmk           newgrp          swapon
chsh            ipcrm           nologin         switch_root
colcrt          ipcs            nsenter         tailf
col             isosize         partx           taskset
colrm           kill            pg              tunelp
column          last            pivot_root      ul
ctrlaltdel      ldattach        prlimit         umount
ddpart          line            raw             unshare
delpart         logger          readprofile     utmpdump
dmesg           login           rename          uuidd
eject           look            renice          uuidgen
fallocate       losetup         reset           vipw
fdformat        lsblk           resizepart      wall
fdisk           lscpu           rev             wdctl
findfs          lslocks         RTC Alarm       whereis
findmnt         lslogins        runuser         wipefs
flock           mcookie         script          write
fsck            mesg            scriptreplay    zramctl
fsck.cramfs     mkfs            setarch
```

这些实用程序中的一些已经被淘汰了，很可能在未来的某个时候会从集合中被踢出去。你应该看看[维基百科的 util-linux 页面](https://en.wikipedia.org/wiki/Util-linux)来了解其中许多实用程序的信息，而 man 页面也提供了关于这些命令的详细信息。

### 总结

这两个 Linux 实用程序的集合，GNU 核心实用程序和 util-linux，共同提供了管理 Linux 系统所需的基本实用程序。在研究这篇文章的过程中，我发现了几个有趣的实用程序，这些实用程序是我从不知道的。这些命令中的很多都是很少需要的，但当你需要的时候，它们是不可缺少的。

在这两个集合里，有 200 多个 Linux 实用工具。虽然 Linux 的命令还有很多，但这些都是管理一个典型的 Linux 主机的基本功能所需要的。

---

via: <https://opensource.com/article/18/4/gnu-core-utilities>

作者: [David Both](https://opensource.com/users/dboth) 选题者: [lujun9972](https://github.com/lujun9972) 译者: [wxy](https://github.com/%E8%AF%91%E8%80%85ID) 校对: [wxy](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

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


使用 mergefs 增加虚拟存储

![](/data/attachment/album/202005/10/220750xyyry5mf8fydyqey.png)

如果你想在一个媒体项目中用到了多个磁盘或分区，不想丢失任何现有数据，但又想将所有文件都存放在一个驱动器下，该怎么办？这时，mergefs 就能派上用场！

[mergerfs](https://github.com/trapexit/mergerfs) 是一个联合文件系统，旨在简化存储和管理众多商业存储设备上的文件。

你需要从他们的 [GitHub](https://github.com/trapexit/mergerfs/releases) 页面获取最新的 RPM。Fedora 的版本名称中带有 “fc” 和版本号。例如，这是 Fedora 31 的版本： [mergerfs-2.29.0-1.fc31.x86\_64.rpm](https://github.com/trapexit/mergerfs/releases/download/2.29.0/mergerfs-2.29.0-1.fc31.x86_64.rpm)。

### 安装和配置 mergefs

使用 `sudo` 安装已下载的 mergefs 软件包：

```
$ sudo dnf install mergerfs-2.29.0-1.fc31.x86_64.rpm
```

现在，你可以将多个磁盘挂载为一个驱动器。如果你有一台媒体服务器，并且希望所有媒体文件都显示在一个地方，这将很方便。如果将新文件上传到系统，那么可以将它们复制到 mergefs 目录，mergefs 会自动将它们复制具有足够可用空间的磁盘上。

这是使你更容易理解的例子：

```
$ df -hT | grep disk
/dev/sdb1      ext4      23M  386K 21M 2% /disk1
/dev/sdc1      ext4      44M  1.1M 40M 3% /disk2

$ ls -l /disk1/Videos/
total 1
-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv

$ ls -l /disk2/Videos/
total 2
-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv
-rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv
```

在此例中挂载了两块磁盘，分别为 `disk1` 和 `disk2`。两个驱动器都有一个包含文件的 `Videos` 目录。

现在，我们将使用 mergefs 挂载这些驱动器，使它们看起来像一个更大的驱动器。

```
$ sudo mergerfs -o defaults,allow_other,use_ino,category.create=mfs,moveonenospc=true,minfreespace=1M /disk1:/disk2 /media
```

mergefs 手册页非常庞杂，因此我们将说明上面提到的选项。

* `defaults`：除非指定，否则将使用默认设置。
* `allow_other`：允许 `sudo` 或 `root` 以外的用户查看文件系统。
* `use_ino`：让 mergefs 提供文件/目录 inode 而不是 libfuse。虽然不是默认值，但建议你启用它，以便链接的文件共享相同的 inode 值。
* `category.create=mfs`：根据可用空间在驱动器间传播文件。
* `moveonenospc=true`：如果启用，那么如果写入失败，将进行扫描以查找具有最大可用空间的驱动器。
* `minfreespace=1M`：最小使用空间值。
* `disk1`：第一块硬盘。
* `disk2`：第二块硬盘。
* `/media`：挂载驱动器的目录。

看起来是这样的：

```
$ df -hT | grep disk
/dev/sdb1  ext4           23M      386K 21M 2% /disk1
/dev/sdc1  ext4           44M      1.1M 40M 3% /disk2

$ df -hT | grep media
1:2        fuse.mergerfs  66M      1.4M 60M 3% /media
```

你可以看到现在 mergefs 挂载显示的总容量为 66M，这是两块硬盘的总容量。

继续示例：

有一个叫 `Baby's second Xmas.mkv` 的 30M 视频。让我们将其复制到用 mergerfs 挂载的 `/media` 文件夹中。

```
$ ls -lh "Baby's second Xmas.mkv"
-rw-rw-r--. 1 curt curt 30M Apr 20 08:45 Baby's second Xmas.mkv
$ cp "Baby's second Xmas.mkv" /media/Videos/
```

这是最终结果：

```
$ df -hT | grep disk
/dev/sdb1  ext4          23M 386K 21M 2% /disk1
/dev/sdc1  ext4          44M 31M 9.8M 76% /disk2

$ df -hT | grep media
1:2        fuse.mergerfs 66M 31M 30M 51% /media
```

从磁盘空间利用率中可以看到，因为 `disk1` 没有足够的可用空间，所以 mergefs 自动将文件复制到 `disk2`。

这是所有文件详情：

```
$ ls -l /disk1/Videos/
total 1
-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv

$ ls -l /disk2/Videos/
total 30003
-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv
-rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 Baby's second Xmas.mkv
-rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv

$ ls -l /media/Videos/
total 30004
-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv
-rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 Baby's second Xmas.mkv
-rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv
-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv
```

当你将文件复制到 mergefs 挂载点时，它将始终将文件复制到有足够可用空间的硬盘上。如果池中的所有驱动器都没有足够的可用空间，那么你将无法复制它们。

---

via: <https://fedoramagazine.org/using-mergerfs-to-increase-your-virtual-storage/>

作者：[Curt Warfield](https://fedoramagazine.org/author/rcurtiswarfield/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


新闻速读 > elementaryOS 5.1.4 可以限制自己的使用时间

Summary: 更多：全球虚拟专用网络的使用量在 3 月呈爆炸式增长；Valve 出人意料地决定放弃 macOS 版的 SteamVR，未来将只专注于 Linux 和 Windows 系统

![](/data/attachment/album/202005/11/102818a3slld31lxoallrg.jpg)

#### elementaryOS 5.1.4 可以限制自己的使用时间

这次新的更新将家长控制重命名为“屏幕时间和限制”，也引入了新的功能，可以为任何账户设置特殊规则，包括你自己的账户，此前这只限于非管理员账户。系统设置的搜索也进行了大修，让你可以更容易找到特定的配置选项。此外，新的更新还包含了很多修复，包括视频、Gala 窗口管理器、照片应用和媒体键等。

来源：[softpedia](https://news.softpedia.com/news/elementaryos-5-1-4-is-a-massive-update-new-features-announced-529880.shtml)

>
> 硬核老王点评：现在自己的使用时间，这是怕自己上网成瘾么？
>
>
>

#### 全球虚拟专用网络的使用量在 3 月呈爆炸式增长

据英国虚拟专用网络研究和测试公司 Top10VPN.com 的研究报告显示，3 月 13 日至 3 月 23 日期间，美国的商用虚拟专用网络需求量猛增 41%。虚拟专用网络需求增幅最大的国家是在并未预料到的地方：埃及（224%）、斯洛文尼亚（169%）和智利（149%），最大的持续增长（两周或以上）是在埃及（154%）、秘鲁（119%）和南非（105%）。美国和英国有 51% 的人在公共 Wi-Fi 网络上使用虚拟专用网络来保护隐私。另有 44% 的受访者表示，匿名浏览是使用虚拟专用网络的主要原因，其次是安全通讯。

来源：[networkworld](https://www.networkworld.com/article/3542032/global-vpn-use-exploded-in-march.html)

>
> 硬核老王点评：“佛跳墙”还是有严肃的企业和个人用途的，惜乎这个缩写竟然是敏感词。
>
>
>

#### Valve 出人意料地决定放弃 macOS 版的 SteamVR，未来将只专注于 Linux 和 Windows 系统

SteamVR for macOS 发布于 2017 年年中。虽然不知道该公司为何做出这一决定，但 Valve 表示，开发者们会继续为苹果的操作系统构建应用，只是未来不会发布新的功能或 bug 修复。Valve 表示，从现在开始，它将只专注于 Windows 和 Linux 平台的开发。

来源：[softpedia](https://news.softpedia.com/news/valve-drops-steamvr-for-macos-as-linux-and-windows-now-the-key-focus-529884.shtml)

#### LLVM 10 被发现影响 Rust 性能 导致编译时间变长

外媒 Phoronix 在进行基准测试后[发现](https://www.phoronix.com/scan.php?page=news_item&px=Rust-Hurt-On-LLVM-10)，与 LLVM/Clang 9.0 相比，Clang 10.0 的基准测试结果整体上不错，至少没有出现明显的倒退。但与使用 LLVM 9.0 [相比](https://lists.llvm.org/pipermail/llvm-dev/2020-May/141482.html)，LLVM 10.0 会导致 Rust 编译时间变慢 7~8%。

来源：[开源中国](https://www.oschina.net/news/115541/rust-hurt-on-llvm-10)

#### 微软保留福利：Win7/8.1 仍可免费升级至 Win10

据外媒Windowslatest报道称，Windows 10的原始免费升级优惠已在多年前正式到期，但通过他们实际的测试体验后发现，免费升级的漏洞至今依旧有效。具体来说，Win 用户可以下载微软官方提供的 Media Creation Tool（媒体介质创建工具）,选择“Upgrade this PC now（现在升级这台电脑）”即可。不清楚微软何故至今保留着这个免费漏洞，也许是对 Win10 迟到 3 年才达成 10 亿用户量仍旧不满意。

来源：[快科技](https://www.cnbeta.com/articles/tech/977369.htm)

>
> 硬核老王点评：只要有利，那就睁一只眼闭一只眼吧。
>
>
>

#### 继 Chrome 之后，Edge 也将隐藏来自网站的垃圾通知

除了社交媒体平台外，其它线上业者也越来越多地要求获得新文章或内容的通知权限。跟随谷歌和 Mozilla 的脚步，微软现在正在测试一项新功能：将隐藏 Edge 浏览器内的通知弹出提示。这家科技巨头计划在今年晚些时候推出“更安静的通知”功能，以减少网络垃圾通知和权限请求。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/977297.htm)

>
> 硬核老王点评：再好的机制也会因滥用而被重重束缚。
>
>
>

#### 任天堂法务部遇挑战：马里奥 64 移植版已失控扩散

种子站、Youtube视频、谷歌搜索结果、Reddit 论坛帖子等比较容易找到的相关讨论都正在成为其法律公司的打击对象，可以说是火力全开重拳出击了。但问题是许多玩家都已经下载了可执行程序，并且通过社交媒体继续传播。后续上传的移植版视频也非常多，封不过来。

来源：[3DMGame](https://hot.cnbeta.com/articles/game/977249.htm)


GNU/Linux 系统下 nftables 防火墙的本地 IPS 能力部署实例

Summary: 通过使用新的 GNU/Linux 系统提供的 nftables 防火墙机制建设属于自己的本机 IPS 能力

![](/data/attachment/album/202005/11/150831cohylvolcyfxaza4.jpg)

随着各 GNU/Linux 系统厂商以及社区逐步开始采用新的内核作为其发行版本的默认内核，防火墙机制采用了更新的 nftables 防火墙机制。

尽管红帽公司提供了 firewalld.service 防火墙服务组件以及相关的配置管理命令 `firewall-config`、`firewall-cmd` 来对防火墙进行管理，但该服务组件目前还没有在其他发行版或者社区版本内得到统一使用。

为了更好的帮助读者朋友们理解该防火墙机制，笔者将自己在工作中直接使用 nftables 进行手工创建配置，从而使系统具有本地 IPS 能力的过程进行总结。

目前多数主流的新发行版 GNU/Linux 系统，默认安装完成后 systemd 系统和服务管理器中已经添加了新的 nftables.serivce 子服务配置文件。同时依然支持 iptables 规则和 `iptables` 命令，不过为了彻底将防火墙升级到 nftables 机制，我们可以在没有 firewalld.service 的发行版系统中直接启用 nftables.service 服务来使用新的防火墙。

通过执行命令 `vi /lib/systemd/system/nftables.service`，从该文件中的语句 `ExecStart=/usr/sbin/nft -f /etc/nftables.conf` 我们可以清楚的看到，nftables 防火墙的默认配置和规则文件一般都放置在系统的 `/etc/nftables.conf` 目录中，不过该默认配置文件中只包含一个名为 `inet filter` 的简单 IPv4/IPv6 防火墙列表。

inet 过滤器可以同时适用于 IPv4 和 IPv6 的规则，但不能用于 NAT 类型的链，只能用于过滤器类型的链。

为了保持和 iptables 防火墙的规则类比，便于用户熟悉，我们可以使用如下 `nftables` 命令创建相应的表和链来建立一个类似于传统 iptables 防火墙框架，创建过程如下：

### 1、创建 nft 表

与 iptables 中的表不同，nftables 中没有内置表，表的数量和名称由用户决定。但是，每个表只有一个地址簇，并且只适用于该簇的数据包。

表可以指定五个（ip、ip6、inet、arp、bridge）簇中的一个，用户可以依次执行如下命令：

```
nft add table ip filter
nft add table ip6 filter
nft add table bridge filter”
```

nftables 将为我们分别建立三个 `ip`、`ipv6`、`bridge` 簇并且表名均为 `filter` 的防火墙框架。

### 2、创建链

表包含链，链的目的是保存规则。

与 iptables 中的链不同，nftables 也没有内置链。这意味着与 iptables 不同，如果链不匹配 nftables 框架中的簇或钩子，则流经这些链的数据包不会被 nftables 触及。

链有两种类型。基础链是来自网络栈的数据包的入口点，其中指定了钩子，其实可以理解为 iptables 防火墙的默认规则。常规链可以理解为其它用户自定义的规则链。

使用如下命令为每一个表建立 `INPUT`、`FORWARD`、`OUTPUT` 链，并且设置基础链，其中 `ip` 簇 `filter` 表 `INPUT` 链默认为丢弃所有数据包的相应的命令格式如下。

添加 `ip` 簇 `filter` 表相应链命令集：

```
nft add chain ip filter INPUT { type filter hook input priority 0\; policy drop\; }

nft add chain ip filter FORWARD { type filter hook forward priority 0\; policy accept\; }

nft add chain ip filter OUTPUT { type filter hook output priority 0\; policy accept\; }
```

添加 `ipv6` 簇 `filter` 表相应链命令集：

```
nft add chain ip6 filter INPUT { type filter hook input priority 0\; policy accept\; }

nft add chain ip6 filter FORWARD { type filter hook forward priority 0\; policy accept\; }

nft add chain ip6 filter OUTPUT { type filter hook output priority 0\; policy accept\; }
```

添加 `bridge` 簇 `filter` 表相应链命令集：

```
nft add chain bridge filter INPUT { type filter hook input priority 0\; policy accept\; }

nft add chain bridge filter FORWARD { type filter hook forward priority 0\; policy accept\; }

nft add chain bridge filter OUTPUT { type filter hook forward priority 0\; policy accept\; }
```

### 3、添加规则

规则由语句或表达式构成，包含在链中。

将一条规则添加到链中使用如下语法：

```
nft add rule family table chain handle statement
```

规则添加到 handle 处，这是可选的。如果不指定，则规则添加到链的末尾，类似于 `iptables -A` 方法。

将规则插入到指定位置使用如下语法：

```
nft insert rule family table chain handle statement
```

如果未指定handle，则规则插入到链的开头，类似于 `iptables -I` 方法。

以下是用户根据自己的实际情况添加的具体规则：

放行本地回环接口 `lo` 的所有流量：

```
nft add rule ip filter INPUT iif lo accept
```

放行 `established`、`related` 状态的数据包，这一点很重要，因为多数对外访问的数据包在收到对端主机回包时多为这两种状态，如果在 INPUT 链中不放行该类型数据包，即使本机的 `OUTPUT` 链默认为 `ACCEPT`，让所有数据包出站，系统也会主动在 `INPUT` 链中丢弃掉相应的回包而导致数据无法交互。具体命令如下：

```
nft add rule ip filter INPUT ct state established,related accept
```

阻断存在重大安全隐患的系统端口，包括已经公布的比如勒索病毒等端口。nftables 在配置过程中，当用户使用端口进行添加后，nftables 会自动将端口转换为 service 模式，用户可以通过使用命令 `nft describe tcp dport` 对照查看。阻断安全隐患的系统端口具体命令如下：

```
nft add rule ip filter INPUT meta l4proto tcp tcp dport { loc-srv, 136, netbios-ns, netbios-dgm, netbios-ssn, microsoft-ds, 3389, radmin-port } counter drop

nft add rule ip filter INPUT meta l4proto udp udp dport { loc-srv, 136, netbios-ns, netbios-dgm, netbios-ssn, microsoft-ds, 3389, radmin-port } counter drop
```

对服务进行限流控制，防止 DDoS 攻击或者 CC 攻击造成系统服务中断，可以通过 `limit` 限制通信速率，以下是接受一个每秒最多 10 个 web 或者 https 或者 dns 查询请求的数据包，同时可以有 2 个包超出限制的规则具体命令：

```
nft add rule ip filter INPUT meta l4proto tcp tcp dport { 80,443,53 } ct state new limit rate 10/second burst 4 packets accept

nft add rule ip filter INPUT meta l4proto udp udp dport { 80,443,53 } ct state new limit rate 10/second burst 4 packets accept
```

### 总结

经过以上配置后，我们的主机就具有了很好的本机 IPS 能力。应对不论是面向南北跨路由器的访问流量，还是本地网络内的东西访问流量，常规的恶意扫描或者恶意攻击基本是够用了。

之后用户可以使用命令 `nft list ruleset > /etc/nftables.conf` 将这些规则保存在 nftables 的默认配置文件中，并使用 `systemctl enable nftables.service` 打开该服务的默认启动模式，之后系统将在开机时自动启动 nftables 防火墙并应用相应规则。

用户也可以通过命令 `vi /etc/nftables.conf` 来直接按照相应规则编辑该文件来修改防火墙配置，以确保自己的系统处于本机防火墙 IPS 能力的保护之下。

希望本文对你有用并能帮助到你。


FirewallD 防火墙使用概述

Summary: FirewallD 是由红帽发起的提供了支持网络/防火墙区域定义网络链接以及接口安全等级的动态防火墙管理工具。

![](/data/attachment/album/202005/11/163544f7dqi8e87hmebkeq.jpg)

FirewallD 是由红帽发起的提供了支持网络/防火墙<ruby> 区域 <rp>  （ </rp> <rt>  zone </rt> <rp>  ） </rp></ruby>定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4、IPv6 防火墙设置以及以太网桥接，并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。

由于 FirewallD 项目本身的自由软件特性，像 Debian Linux 社区发行版已经默认在软件仓库中收录了该防火墙组件软件包。随着各个新 GNU/Linux 发行版中防火墙引擎逐步从 iptables 向 nftables 迁移，FirewallD 是目前唯一能够支持该两种防火墙后端引擎的前端服务组件，用户掌握以后可以方便的进行防火墙配置并很好的规避了从 iptables 向 nftables 迁移带来的学习恐慌。

笔者通过查阅 RedHat 8 发行版网络配置手册，并结合自己在 Debian Linux 10 社区版上进行 FirewallD 防火墙的实际配置使用，对该服务组件的功能和日常使用进行整理。希望通过该文能帮助其他 Linux 用户掌握该防火墙，并通过该防火墙提高主机测网络安全防御能力，打造可信的网络安全环境。

### 一、安装

在 Debian Linux 10 社区版中使用如下命令：

```
apt-get install firewall-applet firewall-config firewalld
```

就可以直接进行 FirewallD 防火墙软件组件包的安装，其中：

* `firewall-applet` 为 FirewallD 托盘小程序，
* `firewall-config` 为 FirewallD 图形化系统配置管理工具
* `firewalld` 为 FirewallD 防火墙软件组件的主组件包，其中包含 `firewall-cmd`、`firewall-offline-cmd` 等命令行系统配置管理工具。

在 RedHat 8 下该防火墙组件默认已经进行了安装，如果用户进行特殊定制安装之后需要单独安装该软件组件可以使用命令

```
yum install firewall-config
```

直接进行安装即可。

笔者在两个系统装进行过安装对比，发现该软件组件包在两个系统上除了安装命令稍有差异外，其它从配置文件到 systemd 服务配置并没有任何区别。随后的内容将不再强调操作系统。

### 二、防火墙默认区域

* Block（阻塞）
任何对该区域的连接请求都会被以 IPv4 的 icmp-host-prohibited 信息或 IPv6 的 icmp6-adm-prohibited 信息所拒绝。只能从系统内部启动网络连接。
* Dmz（隔离）
用于你的隔离区内的电脑，此区域内可公开访问，可以有限地进入你的内部网络，仅仅接收经过选择的连接。
* Drop（丢弃）
对进入该区域的所有数据包丢弃，并且不进行任何回包，区域内主动发起连接的流入回程数据包允许通过，允许进行出方向的网络连接。
* External（外部）
用于在启用伪装的外部网络上使用，尤其路由器、防火墙认为在这个网络上的其它主机不可信。仅仅接收经过选择的连接。
* Home（家庭）
默认其他同区域内主机可信，仅仅接收经过选择的连接。同时默认放行 ssh、mdns、ipp-client、amba-client 与 dhcpv6-client 服务产生的连接。
* Internal（内部）
从描述中可以等同于家庭区域。
* Public（公开）
公共区域，也是防火墙配置的默认区域，防火墙认为该区域主机不可信。仅仅接收经过选择的连接。同时默认放行 ssh 与 dhcpv6-client 服务产生的连接。
* Trusted（可信）
可信区域，防火墙放行一切流量。等同于关闭防火墙功能。
* Work（工作）
工作区域，防火墙认为在这个网络上的其它主机不可信。仅仅接收经过选择的连接。同时默认放行 ssh、ipp-client 与 dhcpv6-client 服务产生的连接。

这些区域的命名不言自明，用户可以很快选择一个合适的安全区域，从而简化和避开很多安全问题。当然用户也可以根据自己的需要或者安全评估来根据自己的实际需求对相应安全域进行更个性化的配置，以适应自己的安全管理规范。尽管有些安全域的安全规则是相同的，但之所以还要在名字上有所区别，主要是为了从习惯上让用户更好区分不同域的独特使用场景，对用户来说更好理解和便于区分。

### 三、防火墙日常管理

#### 3.1、查看防火墙当前状态

查询状态：

```
firewall-cmd --state
```

更多的防火墙系统服务状态信息可以使用

```
systemctl status firewalld
```

在你配置新的防火墙规则之前，你需要了解如何通过命令查看当前防火墙配置。查看防火墙当前配置可以通过图形界面或者在终端模式下使用命令进行。

在图形界面下可以直接通过点击应用程序“firewall-config”图标或者在终端窗口中输入 `firewall-config` 命令进行防火墙配置。如果当前用户为非 root 用户，系统将弹出管理员认证窗口，用户正确输入管理员密码后，防火墙配置窗口就会打开，用户即可以按照窗口界面提供的功能进行操作。

用户也可以在命令行下使用 `firewall-cmd`工具进行防火墙配置。命令行工具虽然学习起来需要一定的时间，不过该工具可以完全在系统处于终端模式下进行各种复杂的防火墙全功能配置，用户有必要进行认真的学习和掌握。

#### 3.2、防火墙基础命令

FirewallD 使用了区域进行数据流的管理，当用户使用 `firewall-cmd --list-all` 命令时，如果没有使用 `--zone` 指定区域，那么系统将返回默认区域的当前配置状态。

默认区域由配置文件 `/etc/firewalld/firewalld.conf` 中的字段 `DefaultZone` 定义，初始状态下，默认区域被定义为 `public`（公共区域）。

用户可以使用命令：

```
firewall-cmd --get-zones
```

查看当前系统防火墙设置的的区域名列表，也可以使用命令：

```
firewall-cmd --get-default-zone
```

查看防火墙当前的默认区域；同时，可使用命令：

```
firewall-cmd --set-default-zone=[zonename]
```

或者通过直接编辑配置文件中 `DefaultZone` 字段的值进行默认区域的修改。

启动防火墙：

```
systemctl unmask firewalld
systemctl start firewalld
```

让防火墙随系统启动一起启动：

```
systemctl enable firewalld
```

停止防火墙：

```
systemctl stop firewalld
```

停止随系统启动：

```
systemctl disable firewalld
```

停止通过访问 firewalld D-Bus 接口和其他服务需要 firewalld 依赖导致的 firewalld 自动启动，更加干净的关闭 firewalld 服务：

```
systemctl mask firewalld
```

按照 RedHat 的官方文档定义，防火墙运行之后被称为运行时状态，保存了启动默认参数之后的配置被称为永久状态。在当前运行状态对防火墙进行的所有配置修改，系统即时生效，但重启后防火墙会恢复到它之前的永久状态，其实这一过程就是从保存之后的配置文件中加载相应配置参数的过程。

用户可以使用命令：

```
fiewall-cmd --runtime-to-permanent
```

对当前修改过的规则即时保存为永久配置，也可以使用命令 `firewall-cmd --permanent` 并在其后添加其它参数永久进行修改。

重新启动 firewalld 将关闭所有打开的端口并停止网络通信，需要使用命令：

```
firewall-cmd --reload
```

重新加载永久配置使之生效。

FirewallD 提供了一种系统受到攻击的紧急操作功能。假设攻击者对系统进行攻击，用户可以直接使用命令：

```
firewall-cmd --panic-on
```

关闭网络通信并且切断攻击者，而不用像之前那样通过物理拔除网线来进行断网操作，防止了系统在多网口环境中一次性插拔所有网线可能带来的混乱以及由此引发的系统恢复后延续问题。

需要恢复网络通信时用户只要使用命令：

```
firewall-cmd --panic-off
```

关闭恐慌模式即可，用户也可以使用命令：

```
firewall-cmd --query-panic
```

查询防火墙当前恐慌模式的状态。

#### 3.2、防火墙服务管理命令

用户可以通过命令行工具添加预定义的服务类型，防火墙会自动根据所需的端口并将其他设置修改为服务定义文件。

使用命令：

```
firewall-cmd --list-services
```

可以查看当前区域内被允许的服务。使用命令：

```
firewall-cmd --get-services
```

可以列出所有防火墙已经给定的预定义服务名称。使用命令：

```
firewall-cmd --add-service=<service-name>
```

可以添加具体服务，服务名称用户可以根据自己的实际需求从预定义服务名称中选取合适的服务名进行添加。完成之后用户可以使用命令：

```
firewall-cmd --runtime-to-permanent
```

将对运行时的修改保存为永久。用户可以通过命令 `firewall-config`、`firewall-cmd` 和 `firewall-offline-cmd`，或者通过直接将 `/usr/lib/firewalld/services` 目录的默认模板 XML 文件复制到 `/etc/firewalld/services` 目录中进行编辑来添加一个自定义服务类型。具体过程如下：

方法一：执行 `firewall-cmd –new-service=service-name`，系统将直接在 `/etc/firewalld/services` 目录下创建一个以 `.xml` 结尾的同名文件，自定义服务类型添加完成。

方法二：在相应目录使用编辑软件直接编辑好 XML 文件并执行 `firewall-cmd --new-service-from-file=service-name.xml`，系统将自动完成同名自定服务类型的添加。

端口作为特定系统服务的接收和区分网络流量并将其转发到系统服务的逻辑设备，系统守护进程通常侦听特定的服务端口。防火墙在默认的服务类型配置中已经定义了相应服务需要放行的对应的端口。当用户还需要在某个服务中放行特定的自定义端口或者端口段的时候可以通过 `firewall-cmd` 完成，格式如下：

```
firewall-cmd [--zone=zone_name] [--service=service_name] --add-port=port-number/port-type
```

这里需要说明的是 `--zone`、`--service` 为可选参数，如果用户不添加这两个参数执行命令时相当与在默认区域中直接添加了端口，当只选取了 `--zone` 参数时，命令执行的结果是在指定区域直接添加端口，此时与服务状态无关。只有在使用 `--service` 参数时才是在相应的服务中添加端口。

当用户需要删除一个端口时可以使用如下命令：

```
# firewall-cmd [--zone=zone_name] [--service=service_name] --remove-port=port-number/port-type
```

当用户需要向不同区域添加服务时，用户可以通过如下步逐进行：

```
# firewall-cmd --add-service=ssh --zone=drop
```

该命令将向区域 `drop` 中添加 `ssh` 服务，其实质就是放行 `ssh` 服务定义中的默认 `22` 端口入站方向的流量及连接。

在多网络接口主机中，可以使用如下方法将指定的网络接口添加到需要的区域中，从而实现每个接口的安全连接区域要求，实现真正的区域化网络安全管理。

使用命令：

```
firewall-cmd --get-active-zones
```

查看当前激活的安全区域和相应的网络接口配置。使用命令

```
firewall-cmd --zone=work --change-interface=ens3p0
```

则将网卡 `ens3p0` 加入到了 `work` 区域，之后所有通过该网卡的流量将受到区域安全规则的约束和限制，该配置是即时生效的并且会自动保存为永久配置。

用户需要将某个网卡加入到特定安全区域也可以直接使用：

```
vi /etc/sysconfig/network-scripts/ifcfg-connection-name
```

并在该文件下加入 `ZONE=zone-name` 行，该网卡即属于特定的安全区域。

用户可以对安全区域进行默认规则设置，默热规则包括三个选项 `ACCEPT`、`REJECT`、`DROP`，其中 `ACCEPT` 选项将放行所有流量，`REJECT`、`DROP` 选项将阻止所有进入该安全区域的流量，与 `REJECT` 不同的是 `DROP` 选项直接丢弃进入安全区域的数据包，并不会向该数据包的发起者回复任何信息。用户可以使用命令：

```
firewall-cmd --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>
```

进行相应安全区域的默认规则设置。

#### 3.3、使用区域根据来源来管理传入流量

你可以使用区域根据来源管理流入流量，这使你可以对传入流量进行排序，并将其路由到不同区域，以允许或禁止该流量可以到达的服务。

如果将源添加到区域，则该区域将变为活动状态，并且来自该源的任何传入流量将通过它。你可以为每个区域指定不同的设置，该设置将应用于来自给定来源的流量。即使你只有一个网络接口，也可以使用更多区域。

通过以下实例，我们可以将特定网段对 HTTP 的请求流量进行更细致的管理，使用命令：

```
firewall-cmd --zone=trusted --add-source=192.168.1.0/24
```

将该网段作为资源加入到 `trusted` 区中，通过命令：

```
firewall-cmd --zone=trusted --add-service=http
```

将 Web 服务添加到相同区域中，随后该目标地址产生的访问 Web 服务流量将可以顺利通过。

#### 3.4、防火墙锁机制

为了防止本地程序比如 KVM 虚拟机组件对防火墙的修改，FirewallD 还提供了一种锁闭机制来防止本地程序或者服务组件对防火墙配置的修改，并且该命令只有 root 用户本身才可以执行。

用户可以使用命令：

```
firewall-cmd --query-lockdown
```

查询防火墙锁闭状态，当需要锁闭时可以直接执行命令：

```
firewall-cmd --lockdown-on
```

恢复到非锁闭状态时可以执行命令：

```
firewall-cmd --lockdown-off
```

### 四、后记

FirewallD 防火墙组件作为 RedHat 对自由软件社区的贡献之一，具有很好的普适性，希望通过本文的讲解使更多的用户开始熟悉该防火墙软件组件，并将其作为主机本地侧防护很好的技术手段，不断提高主机自身的 IPS 能力。在当今网络环境复杂的形势下让主机具有更好的安全性和可用性。


Systemd 服务：响应变化

![](/data/attachment/album/202005/12/001037iz91uu9b15dqb9w3.jpg)

[我有一个这样的电脑棒](https://www.intel.com/content/www/us/en/products/boards-kits/compute-stick/stk1a32sc.html)（图1），我把它用作通用服务器。它很小且安静，由于它是基于 x86 架构的，因此我为我的打印机安装驱动没有任何问题，而且这就是它大多数时候干的事：与客厅的共享打印机和扫描仪通信。

![](/data/attachment/album/202005/11/235637fqr5snii7si5dgng.jpg)

*一个英特尔电脑棒。欧元硬币大小。*

大多数时候它都是闲置的，尤其是当我们外出时，因此我认为用它作监视系统是个好主意。该设备没有自带的摄像头，也不需要一直监视。我也不想手动启动图像捕获，因为这样就意味着在出门前必须通过 SSH 登录，并在 shell 中编写命令来启动该进程。

因此，我以为应该这么做：拿一个 USB 摄像头，然后只需插入它即可自动启动监视系统。如果这个电脑棒重启后发现连接了摄像头也启动监视系统就更加分了。

在先前的文章中，我们看到 systemd 服务既可以[手动启动或停止](/article-9700-1.html)，也可以[在满足某些条件时启动或停止](/article-9703-1.html)。这些条件不限于操作系统在启动或关机时序中达到某种状态，还可以在你插入新硬件或文件系统发生变化时进行。你可以通过将 Udev 规则与 systemd 服务结合起来实现。

### 有 Udev 支持的热插拔

Udev 规则位于 `/etc/udev/rules` 目录中，通常是由导致一个<ruby> 动作 <rt>  action </rt></ruby>的<ruby> 条件 <rt>  conditions </rt></ruby>和<ruby> 赋值 <rt>  assignments </rt></ruby>的单行语句来描述。

有点神秘。让我们再解释一次：

通常，在 Udev 规则中，你会告诉 systemd 当设备连接时需要查看什么信息。例如，你可能想检查刚插入的设备的品牌和型号是否与你让 Udev 等待的设备的品牌和型号相对应。这些就是前面提到的“条件”。

然后，你可能想要更改一些内容，以便以后可以方便使用该设备。例如，更改设备的读写权限：如果插入 USB 打印机，你会希望用户能够从打印机读取信息（用户的打印应用程序需要知道其模型、制造商，以及是否准备好接受打印作业）并向其写入内容，即发送要打印的内容。更改设备的读写权限是通过你之前阅读的“赋值” 之一完成的。

最后，你可能希望系统在满足上述条件时执行某些动作，例如在插入某个外部硬盘时启动备份程序以复制重要文件。这就是上面提到的“动作”的例子。

了解这些之后, 来看看以下几点:

```
ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="e207",
SYMLINK+="mywebcam", TAG+="systemd", MODE="0666", ENV{SYSTEMD_WANTS}="webcam.service"
```

规则的第一部分,

```
ACTION=="add", SUBSYSTEM=="video4linux",  ATTRS{idVendor}=="03f0",
ATTRS{idProduct}=="e207" [etc... ]
```

表明了执行你想让系统执行的其他动作之前设备必须满足的条件。设备必须被添加到（`ACTION=="add"`）机器上，并且必须添加到 `video4linux` 子系统中。为了确保仅在插入正确的设备时才应用该规则，你必须确保 Udev 正确识别设备的制造商（`ATTRS{idVendor}=="03f0"`）和型号（`ATTRS{idProduct}=="e207"`）。

在本例中，我们讨论的是这个设备（图2）：

![](/data/attachment/album/202005/12/000040vilf1ov3fgg4vovg.jpg)

*这个试验使用的是 HP 的摄像头。*

注意怎样用 `==` 来表示这是一个逻辑操作。你应该像这样阅读上面的简要规则：

>
> 如果添加了一个设备并且该设备由 video4linux 子系统控制，而且该设备的制造商编码是 03f0，型号是 e207，那么…
>
>
>

但是，你从哪里获取的这些信息？你在哪里找到触发事件的动作、制造商、型号等？你可要使用多个来源。你可以通过将摄像头插入机器并运行 `lsusb` 来获得 `IdVendor` 和 `idProduct` ：

```
lsusb
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 03f0:e207 Hewlett-Packard
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 04f2:b1bb Chicony Electronics Co., Ltd
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

我用的摄像头是 HP 的，你在上面的列表中只能看到一个 HP 设备。`ID` 提供了制造商和型号，它们以冒号（`:`）分隔。如果你有同一制造商的多个设备，不确定哪个是哪个设备，请拔下摄像头，再次运行 `lsusb` , 看看少了什么。

或者…

拔下摄像头，等待几秒钟，运行命令 `udevadmin monitor --environment` ，然后重新插入摄像头。当你使用的是HP摄像头时，你将看到：

```
udevadmin monitor --environment
UDEV  [35776.495221] add      /devices/pci0000:00/0000:00:1c.3/0000:04:00.0
    /usb3/3-1/3-1:1.0/input/input21/event11 (input)
.MM_USBIFNUM=00
ACTION=add
BACKSPACE=guess
DEVLINKS=/dev/input/by-path/pci-0000:04:00.0-usb-0:1:1.0-event
     /dev/input/by-id/usb-Hewlett_Packard_HP_Webcam_HD_2300-event-if00
DEVNAME=/dev/input/event11
DEVPATH=/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/
     usb3/3-1/3-1:1.0/input/input21/event11
ID_BUS=usb
ID_INPUT=1
ID_INPUT_KEY=1
ID_MODEL=HP_Webcam_HD_2300
ID_MODEL_ENC=HPx20Webcamx20HDx202300
ID_MODEL_ID=e207
ID_PATH=pci-0000:04:00.0-usb-0:1:1.0
ID_PATH_TAG=pci-0000_04_00_0-usb-0_1_1_0
ID_REVISION=1020
ID_SERIAL=Hewlett_Packard_HP_Webcam_HD_2300
ID_TYPE=video
ID_USB_DRIVER=uvcvideo
ID_USB_INTERFACES=:0e0100:0e0200:010100:010200:030000:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=Hewlett_Packard
ID_VENDOR_ENC=Hewlettx20Packard
ID_VENDOR_ID=03f0
LIBINPUT_DEVICE_GROUP=3/3f0/e207:usb-0000:04:00.0-1/button
MAJOR=13
MINOR=75
SEQNUM=3162
SUBSYSTEM=input
USEC_INITIALIZED=35776495065
XKBLAYOUT=es
XKBMODEL=pc105
XKBOPTIONS=
XKBVARIANT=
```

可能看起来有很多信息要处理，但是，看一下这个：列表前面的 `ACTION` 字段, 它告诉你刚刚发生了什么事件，即一个设备被添加到系统中。你还可以在其中几行中看到设备名称的拼写，因此可以非常确定它就是你要找的设备。输出里还显示了制造商的ID（`ID_VENDOR_ID = 03f0`）和型号（`ID_VENDOR_ID = 03f0`）。

这为你提供了规则条件部分需要的四个值中的三个。你可能也会想到它还给了你第四个，因为还有一行这样写道：

```
SUBSYSTEM=input
```

小心！尽管 USB 摄像头确实是提供输入的设备（键盘和鼠标也是），但它也属于 usb 子系统和其他几个子系统。这意味着你的摄像头被添加到了多个子系统，并且看起来像多个设备。如果你选择了错误的子系统，那么你的规则可能无法按你期望的那样工作，或者根本无法工作。

因此，第三件事就是检查网络摄像头被添加到的所有子系统，并选择正确的那个。为此，请再次拔下摄像头，然后运行：

```
ls /dev/video*
```

这将向你显示连接到本机的所有视频设备。如果你使用的是笔记本，大多数笔记本都带有内置摄像头，它可能会显示为 `/dev/video0` 。重新插入摄像头，然后再次运行 `ls /dev/video*`。

现在，你应该看到多一个视频设备（可能是`/dev/video1`）。

现在，你可以通过运行 `udevadm info -a /dev/video1` 找出它所属的所有子系统：

```
udevadm info -a /dev/video1

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:1c.3/0000:04:00.0
  /usb3/3-1/3-1:1.0/video4linux/video1':
 KERNEL=="video1"
 SUBSYSTEM=="video4linux"
 DRIVER==""
 ATTR{dev_debug}=="0"
 ATTR{index}=="0"
 ATTR{name}=="HP Webcam HD 2300: HP Webcam HD"

[etc...]
```

输出持续了相当长的时间，但是你感兴趣的只是开头的部分：`SUBSYSTEM =="video4linux"`。你可以将这行文本直接复制粘贴到你的规则中。输出的其余部分（为简洁未显示）为你提供了更多的信息，例如制造商和型号 ID，同样是以你可以复制粘贴到你的规则中的格式。

现在，你有了识别设备的方式吗，并明确了什么事件应该触发该动作，该对设备进行修改了。

规则的下一部分，`SYMLINK+="mywebcam", TAG+="systemd", MODE="0666"` 告诉 Udev 做三件事：首先，你要创建设备的符号链接（例如 `/dev/video1` 到 `/dev/mywebcam`。这是因为你无法预测系统默认情况下会把那个设备叫什么。当你拥有内置摄像头并热插拔一个新的时，内置摄像头通常为 `/dev/video0`，而外部摄像头通常为 `/dev/video1`。但是，如果你在插入外部 USB 摄像头的情况下重启计算机，则可能会相反，内部摄像头可能会变成 `/dev/video1` ，而外部摄像头会变成 `/dev/video0`。这想告诉你的是，尽管你的图像捕获脚本（稍后将看到）总是需要指向外部摄像头设备，但是你不能依赖它是 `/dev/video0` 或 `/dev/video1`。为了解决这个问题，你告诉 Udev 创建一个符号链接，该链接在设备被添加到 `video4linux` 子系统的那一刻起就不会再变，你将使你的脚本指向该链接。

第二件事就是将 `systemd` 添加到与此规则关联的 Udev 标记列表中。这告诉 Udev，该规则触发的动作将由 systemd 管理，即它将是某种 systemd 服务。

注意在这个两种情况下是如何使用 `+=` 运算符的。这会将值添加到列表中，这意味着你可以向 `SYMLINK` 和 `TAG` 添加多个值。

另一方面，`MODE` 值只能包含一个值（因此，你可以使用简单的 `=` 赋值运算符）。`MODE` 的作用是告诉 Udev 谁可以读或写该设备。如果你熟悉 `chmod`（你读到此文, 应该会熟悉），你就也会熟悉[如何用数字表示权限](https://chmod-calculator.com/)。这就是它的含义：`0666` 的含义是 “向所有人授予对设备的读写权限”。

最后， `ENV{SYSTEMD_WANTS}="webcam.service"` 告诉 Udev 要运行什么 systemd 服务。

将此规则保存到 `/etc/udev/rules.d` 目录名为 `90-webcam.rules`（或类似的名称）的文件中，你可以通过重启机器或运行以下命令来加载它：

```
sudo udevadm control --reload-rules && udevadm trigger
```

### 最后的服务

Udev 规则触发的服务非常简单：

```
# webcam.service

[Service]
Type=simple
ExecStart=/home/[user name]/bin/checkimage.sh
```

基本上，它只是运行存储在你个人 `bin/` 中的 `checkimage.sh` 脚本并将其放到后台。[这是你在先前的文章中看过的内容](/article-9700-1.html)。它看起来似乎很小，但那只是因为它是被 Udev 规则调用的，你刚刚创建了一种特殊的 systemd 单元，称为 `device` 单元。 恭喜。

至于 `webcam.service` 调用的 `checkimage.sh` 脚本，有几种方法从摄像头抓取图像并将其与前一个图像进行比较以检查变化（这是 `checkimage.sh` 所做的事），但这是我的方法：

```
#!/bin/bash
# This is the checkimage.sh script

mplayer -vo png -frames 1 tv:// -tv driver=v4l2:width=640:height=480:device=
    /dev/mywebcam &>/dev/null
mv 00000001.png /home/[user name]/monitor/monitor.png

while true
do
   mplayer -vo png -frames 1 tv:// -tv driver=v4l2:width=640:height=480:device=/dev/mywebcam &>/dev/null
   mv 00000001.png /home/[user name]/monitor/temp.png

   imagediff=`compare -metric mae /home/[user name]/monitor/monitor.png /home/[user name]
       /monitor/temp.png /home/[user name]/monitor/diff.png 2>&1 > /dev/null | cut -f 1 -d " "`
   if [ `echo "$imagediff > 700.0" | bc` -eq 1 ]
       then
           mv /home/[user name]/monitor/temp.png /home/[user name]/monitor/monitor.png
       fi

   sleep 0.5
done
```

首先使用[MPlayer](https://mplayerhq.hu/design7/news.html)从摄像头抓取一帧（`00000001.png`）。注意，我们怎样将 `mplayer` 指向 Udev 规则中创建的 `mywebcam` 符号链接，而不是指向 `video0` 或 `video1`。然后，将图像传输到主目录中的 `monitor/` 目录。然后执行一个无限循环，一次又一次地执行相同的操作，但还使用了[Image Magick 的 compare 工具](https://www.imagemagick.org/script/compare.php)来查看最后捕获的图像与 `monitor/` 目录中已有的图像之间是否存在差异。

如果图像不同，则表示摄像头的镜框里某些东西动了。该脚本将新图像覆盖原始图像，并继续比较以等待更多变动。

### 插线

所有东西准备好后，当你插入摄像头后，你的 Udev 规则将被触发并启动 `webcam.service`。 `webcam.service` 将在后台执行 `checkimage.sh` ，而 `checkimage.sh` 将开始每半秒拍一次照。你会感觉到，因为摄像头的 LED 在每次拍照时将开始闪。

与往常一样，如果出现问题，请运行：

```
systemctl status webcam.service
```

检查你的服务和脚本正在做什么。

### 接下来

你可能想知道：为什么要覆盖原始图像？当然，系统检测到任何动静，你都想知道发生了什么，对吗？你是对的，但是如你在下一部分中将看到的那样，将它们保持原样，并使用另一种类型的 systemd 单元处理图像将更好，更清晰和更简单。

请期待下一篇。

---

via: <https://www.linux.com/blog/intro-to-linux/2018/6/systemd-services-reacting-change>

作者：[Paul Brown](https://www.linux.com/users/bro66) 选题：[lujun9972](https://github.com/lujun9972) 译者：[messon007](https://github.com/messon007) 校对：[wxy](https://github.com/wxy)

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


新闻速读 > Python 开发者调查显示只有十分之一的人还在用 Python 2

Summary: 更多：比特币第三次采矿回报减半；人社部拟发布 2 个区块链职业：区块链工程技术员、区块链运营操作员

![](/data/attachment/album/202005/12/101352nhg8fipc8f0m3v3z.jpg)

#### Python 开发者调查显示只有十分之一的人还在用 Python 2

Python 2 已经结束支持，根据 Python 软件基金会和 JetBrains 发布的第三年度 Python 开发者调查，被调查者中只有十分之一的人还在用 Python 2。这项调查收到了 2.4 万多名开发者的回应。

来源：[solidot](https://www.solidot.org/story?sid=64327)

>
> 硬核老王点评：看来 Python 2 终究会被淘汰，向前看总是社区潮流，虽然不能完全向后兼容的 Python 3 当时在社区中引来了很多争议，但目前看起来社区已经过渡到了 Python 3 时代。同样的，还有 systemd 的成功。与这些形成鲜明对比的是 Perl 6 的惨淡局面和 Perl 语言的整体衰落。所以，抛弃历史包袱的不破不立式进步，成功或失败的原因在哪里呢？
>
>
>

#### 比特币第三次采矿回报减半

比特币第三次采矿回报减半提前于 5 月 12 日发生。比特币网络中运算难度是自动调节的，在最初的四年里会有 1050 0000 个 BTC 被制造出来，这个数值每四年减半，所以在第四到第八年中会有 525 0000 个BTC 被制造，在第 8 到第 12 年中会生产 262 5000 个BTC，以此类推。最终比特币的数额会趋近于 2100 0000 个BTC。区块的总数乘以每个区块的比特币值就是现存的比特币总数。2012 年 11 月 28 日，采矿回报从每区块 50 降至 25 BTC。第二次采矿回报减半发生在 2016 年 7 月 10 日。刚刚发生的是第三次，采矿回报从 12.5 减少到 6.25 BTC。第四次预计会在 2024 年 5 月 9 日发生。

来源：[solidot](https://www.solidot.org/story?sid=64329)

>
> 硬核老王点评：又一次减半，多少区块链圈的人如熬年般的关注这一刻。至于之后 BTC 乃至于区块链的发展，还需要拭目以待，不过我的看法总体是乐观的。
>
>
>

#### 人社部拟发布 2 个区块链职业：区块链工程技术员、区块链运营操作员

5 月 11 日，人力资源社会保障部对拟发布新职业信息进行公示，其中包括两个区块链职业。区块链工程技术人员：从事区块链架构设计、底层技术、系统应用、系统测试、系统部署、运行维护的工程技术人员。区块链应用操作员：运用区块链技术及工具，从事政务、金融、医疗、教育、养老等场景系统应用操作的人员。

来源：[人力资源社会保障部](http://www.mohrss.gov.cn/SYrlzyhshbzb/zwgk/gggs/tg/202005/t20200511_368176.html)

>
> 硬核老王点评：区块链也有了“正当”职业了。
>
>
>

#### Swift 现支持更多 Linux 发行版本，包括 Ubuntu 20.04

苹果开源了 Swift 编程语言，但 Swift 跨平台的进展比较缓慢，目前仅支持 macOS 和 Ubuntu。在今年 3 月下旬，Swift 开发团队表示，其即将推出的 5.3 版本的目标包括“增加对 Windows 和其他 Linux 发行版的支持”。在目前支持的 Ubuntu 16.04/18.04 两个发行版本之外，Swift 项目现在添加了对 Ubuntu 20.04、CentOS 8 和 Amazon Linux 2 这三个发行版本的支持。项目团队表示，在未来几个月内将会添加对更多 Linux 发行版本的支持。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/977633.htm)

>
> 硬核老王点评：Swift 没有之前那么受关注了，但是作为一个优秀的编程语言，如果在跨平台方面能取得更多进展，想必能得到更多关注和应用。
>
>
>

#### 罗永浩宣布 t.tt 域名新用途：曾花重金购买

“需要帮助的扶贫地区，如果你有好东西，想找人带货，我们很愿意义务做这样的事情。”今天罗永浩宣布了该域名的新用途——扶贫助农报名网址。罗永浩表示，接下来一段时期要做的是扶贫助农的活动，现在全国范围内，各地的那些县市，因为疫情经济活动受到很大的影响。所以他们手里有一些农产品、一些干货，那些好东西现在就不太好卖，所以呼吁让我们这行帮着做做扶贫助农活动，所以我们很愿意参与。

来源：[快科技](https://www.cnbeta.com/articles/tech/977507.htm)

>
> 硬核老王点评：至少从这个意义上看，还是值得支持的。
>
>
>


学会爱上 systemd

不错，再来电编写service的经验和技巧就好了！

>
> systemd 是所有进程之母，负责将 Linux 主机启动到可以做生产性任务的状态。
>
>
>

![](/data/attachment/album/202005/13/085016gy86wj713zh7xq71.jpg)

systemd（是的，全小写，即使在句子开头也是小写），是初始化程序（`init`）和 SystemV 初始化脚本的现代替代者。此外，它还有更多功能。

当我想到 `init` 和 SystemV 初始化时，像大多数系统管理员一样，我想到的是 Linux 的启动和关闭，而不是真正意义上的管理服务，例如在服务启动和运行后对其进行管理。像 `init` 一样，systemd 是所有进程之母，它负责使 Linux 主机启动到可以做生产性任务的状态。systemd 设定的一些功能比老的初始化程序要广泛得多，它要管理正在运行的 Linux 主机的许多方面，包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。

本系列文章是基于我的三期 Linux 培训课程《[使用和管理 Linux：从零开始进行学习系统管理](http://www.both.org/?page_id=1183)》部分内容的摘录，探讨了 systemd 在启动和启动完成后的功能。

### Linux 引导

Linux 主机从关机状态到运行状态的完整启动过程很复杂，但它是开放的并且是可知的。在详细介绍之前，我将简要介绍一下从主机硬件被上电到系统准备好用户登录的过程。大多数时候，“引导过程”被作为一个整体来讨论，但这是不准确的。实际上，完整的引导和启动过程包含三个主要部分：

* 硬件引导：初始化系统硬件
* Linux <ruby> 引导 <rp>  （ </rp> <rt>  boot </rt> <rp>  ） </rp></ruby>：加载 Linux 内核和 systemd
* Linux <ruby> 启动 <rp>  （ </rp> <rt>  startup </rt> <rp>  ） </rp></ruby>：systemd 为主机的生产性工作做准备

Linux 启动阶段始于内核加载了 `init` 或 systemd（取决于具体发行版使用的是旧的方式还是还是新的方式）之后。`init` 和 systemd 程序启动并管理所有其它进程，它们在各自的系统上都被称为“所有进程之母”。

将硬件引导与 Linux 引导及 Linux 启动区分开，并明确定义它们之间的分界点是很重要的。理解它们的差异以及它们每一个在使 Linux 系统进入生产状态所起的作用，才能够管理这些进程，并更好地确定大部分人所谓的“启动”问题出在哪里。

启动过程按照三步引导流程，使 Linux 计算机进入可进行生产工作的状态。当内核将主机的控制权转移到 systemd 时，启动环节开始。

### systemd 之争

systemd 引起了系统管理员和其它负责维护 Linux 系统正常运行人员的广泛争议。在许多 Linux 系统中，systemd 接管了大量任务，这在某些开发者和sysadmins群体中引起了反对和不和谐。

SystemV 和 systemd 是执行 Linux 启动环节的两种不同的方法。SystemV 启动脚本和 `init` 程序是老的方法，而使用<ruby> 目标 <rt>  target </rt></ruby>的 systemd 是新方法。尽管大多数现代 Linux 发行版都使用较新的 systemd 进行启动、关机和进程管理，但仍有一些发行版未采用。原因之一是某些发行版维护者和系统管理员喜欢老的 SystemV 方法，而不是新的 systemd。

我认为两者都有其优势。

#### 为何我更喜欢 SystemV

我更喜欢 SystemV，因为它更开放。使用 Bash 脚本来完成启动。内核启动 `init` 程序（这是一个编译后的二进制）后，`init` 启动 `rc.sysinit` 脚本，该脚本执行许多系统初始化任务。`rc.sysinit` 执行完后，`init` 启动 `/etc/rc.d/rc` 脚本，该脚本依次启动 `/etc/rc.d/rcX.d` 中由 SystemV 启动脚本定义的各种服务。其中 `X` 是待启动的运行级别号。

除了 `init` 程序本身之外，所有这些程序都是开放且易于理解的脚本。可以通读这些脚本并确切了解整个启动过程中发生的事情，但是我不认为有太多系统管理员真正做到这一点。每个启动脚本都被编了号，以便按特定顺序启动预期的服务。服务是串行启动的，一次只能启动一个服务。

systemd 是由 Red Hat 的 Lennart Poettering 和 Kay Sievers 开发的，它是一个由大型的、编译的二进制可执行文件构成的复杂系统，不访问其源码就无法理解。它是开源的，因此“访问其源代码”并不难，只是不太方便。systemd 似乎表现出对 Linux 哲学多个原则的重大驳斥。作为二进制文件，systemd 无法被直接打开供系统管理员查看或进行简单更改。systemd 试图做所有事情，例如管理正在运行的服务，同时提供明显比 SystemV 更多的状态信息。它还管理硬件、进程、进程组、文件系统挂载等。systemd 几乎涉足于现代 Linux 主机的每个方面，使它成为系统管理的一站式工具。所有这些都明显违反了“程序应该小，且每个程序都应该只做一件事并做好”的原则。

#### 为何我更喜欢 systemd

我更喜欢用 systemd 作为启动机制，因为它会根据启动阶段并行地启动尽可能多的服务。这样可以加快整个的启动速度，使得主机系统比 SystemV 更快地到达登录屏幕。

systemd 几乎可以管理正在运行的 Linux 系统的各个方面。它可以管理正在运行的服务，同时提供比SystemV 多得多的状态信息。它还管理硬件、进程和进程组、文件系统挂载等。systemd 几乎涉足于现代 Linux 操作系统的每方面，使其成为系统管理的一站式工具。（听起来熟悉吧？）

systemd 工具是编译后的二进制文件，但该工具包是开放的，因为所有配置文件都是 ASCII 文本文件。可以通过各种 GUI 和命令行工具来修改启动配置，也可以添加或修改各种配置文件来满足特定的本地计算环境的需求。

#### 真正的问题

你认为我不能喜欢两种启动系统吗？我能，我会用它们中的任何一个。

我认为，SystemV 和 systemd 之间大多数争议的真正问题和根本原因在于，在系统管理层面[没有选择权](http://www.osnews.com/story/28026/Editorial_Thoughts_on_Systemd_and_the_Freedom_to_Choose)。使用 SystemV 还是 systemd 已经由各种发行版的开发人员、维护人员和打包人员选择了（但有充分的理由）。由于 `init` 极端的侵入性，挖出并替换 `init` 系统会带来很多影响，会带来很多在发行版设计过程之外难以解决的后果。

尽管该选择实际上是为我而选的，但我的Linux主机能不能开机、能不能工作，这是我平时最关心的。作为最终用户，甚至是系统管理员，我主要关心的是我是否可以完成我的工作，例如写我的书和这篇文章，安装更新以及编写脚本来自动化所有事情。只要我能做我的工作，我就不会真正在意发行版中使用的启动系统。

在启动或服务管理出现问题时，我会在意。无论主机上使用哪种启动系统，我都足够了解如何沿着事件顺序来查找故障并进行修复。

#### 替换SystemV

以前曾有过用更现代的东西替代 SystemV 的尝试。大约在两个版本中，Fedora 使用了一个叫作 Upstart 的东西来替换老化的 SystemV，但是它没有取代 `init`，也没有提供我所注意到的任何变化。由于 Upstart 并未对 SystemV 的问题进行任何显著的改变，所以在这个方向上的努力很快就被放弃了，转而使用 systemd。

尽管大部分 Linux 开发人员都认可替换旧的 SystemV 启动系统是个好主意，但许多开发人员和系统管理员并不喜欢 systemd。与其重新讨论人们在 systemd 中遇到的或曾经遇到过的所有所谓的问题，不如带你去看两篇好文章，尽管有些陈旧，但它们涵盖了大多数内容。Linux 内核的创建者 Linus Torvalds 对 systemd 似乎不感兴趣。在 2014 年 ZDNet 的一篇文章《[Linus Torvalds 和其他人对 Linux 上的 systemd 的看法](https://www.zdnet.com/article/linus-torvalds-and-others-on-linuxs-systemd/)》中，Linus 清楚地表达了他的感受。

>
> “实际上我对 systemd 本身没有任何特别强烈的意见。我对一些核心开发人员有一些问题，我认为他们在对待错误和兼容性方面过于轻率，而且我认为某些设计细节是疯狂的（例如，我不喜欢二进制日志），但这只是细节，不是大问题。”
>
>
>

如果你对 Linus 不太了解的话，我可以告诉你，如果他不喜欢某事，他是非常直言不讳的，很明确，而且相当明确的表示不喜欢。他解决自己对事物不满的方式已经被社会更好地接受了。

2013 年，Poettering 写了一篇很长的博客，他在文章驳斥了[关于 systemd 的迷思](http://0pointer.de/blog/projects/the-biggest-myths.html)，同时对创建 systemd 的一些原因进行了深入的剖析。这是一分很好的读物，我强烈建议你阅读。

### systemd 任务

根据编译过程中使用的选项（不在本系列中介绍），systemd 可以有多达 69 个二进制可执行文件执行以下任务，其中包括：

* `systemd` 程序以 1 号进程（PID 1）运行，并提供使尽可能多服务并行启动的系统启动能力，它额外加快了总体启动时间。它还管理关机顺序。
* `systemctl` 程序提供了服务管理的用户接口。
* 支持 SystemV 和 LSB 启动脚本，以便向后兼容。
* 服务管理和报告提供了比 SystemV 更多的服务状态数据。
* 提供基本的系统配置工具，例如主机名、日期、语言环境、已登录用户的列表，正在运行的容器和虚拟机、系统帐户、运行时目录及设置，用于简易网络配置、网络时间同步、日志转发和名称解析的守护进程。
* 提供套接字管理。
* systemd 定时器提供类似 cron 的高级功能，包括在相对于系统启动、systemd 启动时间、定时器上次启动时间的某个时间点运行脚本。
* 它提供了一个工具来分析定时器规范中使用的日期和时间。
* 能感知分层的文件系统挂载和卸载功能可以更安全地级联挂载的文件系统。
* 允许主动的创建和管理临时文件，包括删除。
* D-Bus 的接口提供了在插入或移除设备时运行脚本的能力。这允许将所有设备（无论是否可插拔）都被视为即插即用，从而大大简化了设备的处理。
* 分析启动环节的工具可用于查找耗时最多的服务。
* 它包括用于存储系统消息的日志以及管理日志的工具。

### 架构

这些以及更多的任务通过许多守护程序、控制程序和配置文件来支持。图 1 显示了许多属于 systemd 的组件。这是一个简化的图，旨在提供概要描述，因此它并不包括所有独立的程序或文件。它也不提供数据流的视角，数据流是如此复杂，因此在本系列文章的背景下没用。

![系统架构](/data/attachment/album/202005/13/085112xl9ukqlulkugszo5.png "systemd architecture")

*图 1：systemd 的架构，作者 Shmuel Csaba Otto Traian (CC BY-SA 3.0)*

如果要完整地讲解 systemd 就需要一本书。你不需要了解图 1 中的 systemd 组件是如何组合在一起的细节。只需了解支持各种 Linux 服务管理以及日志文件和日志处理的程序和组件就够了。但是很明显， systemd 并不是某些批评者所宣称的那样，它是一个单一的怪物。

### 作为 1 号进程的 systemd

systemd 是 1 号进程（PID 1）。它的一些功能，比老的 SystemV3 `init` 要广泛得多，用于管理正在运行的 Linux 主机的许多方面，包括挂载文件系统以及启动和管理 Linux 生产主机所需的系统服务。与启动环节无关的任何 systemd 任务都不在本文讨论范围之内（但本系列后面的一些文章将探讨其中的一些任务）。

首先，systemd 挂载 `/etc/fstab` 所定义的文件系统，包括所有交换文件或分区。此时，它可以访问位于 `/etc` 中的配置文件，包括它自己的配置文件。它使用其配置链接 `/etc/systemd/system/default.target` 来确定将主机引导至哪个状态或目标。`default.target` 文件是指向真实目标文件的符号链接。对于桌面工作站，通常是 `graphical.target`，它相当于 SystemV 中的运行级别 5。对于服务器，默认值更可能是 `multi-user.target`，相当于 SystemV 中的运行级别 3。`emergency.target` 类似于单用户模式。<ruby> 目标 <rt>  target </rt></ruby>和<ruby> 服务 <rt>  service </rt></ruby>是 systemd 的<ruby> 单元 <rt>  unit </rt></ruby>。

下表（图 2）将 systemd 目标与老的 SystemV 启动运行级别进行了比较。systemd 提供 systemd 目标别名以便向后兼容。目标别名允许脚本（以及许多系统管理员）使用 SystemV 命令（如 `init 3`）更改运行级别。当然，SystemV 命令被转发给 systemd 进行解释和执行。

| systemd 目标 | SystemV 运行级别 | 目标别名 | 描述 |
| --- | --- | --- | --- |
| `default.target` |  |  | 此目标总是通过符号连接的方式成为 `multi-user.target` 或 `graphical.target` 的别名。systemd 始终使用 `default.target` 来启动系统。`default.target` 绝不应该设为 `halt.target`，`poweroff.target` 或 `reboot.target` 的别名。 |
| `graphic.target` | 5 | `runlevel5.target` | 带有 GUI 的 `multi-user.target`。 |
|  | 4 | `runlevel4.target` | 未用。在 SystemV 中运行级别 4 与运行级别 3 相同。可以创建并自定义此目标以启动本地服务，而无需更改默认的 `multi-user.target`。 |
| `multi-user.target` | 3 | `runlevel3.target` | 所有服务在运行，但仅有命令行界面（CLI）。 |
|  | 2 | `runlevel2.target` | 多用户，没有 NFS，其它所有非 GUI 服务在运行。 |
| `rescue.target` | 1 | `runlevel1.target` | 基本系统，包括挂载文件系统，运行最基本的服务和主控制台的恢复 shell。 |
| `emergency.target` | S |  | 单用户模式：没有服务运行；不挂载文件系统。这是最基本的工作级别，只有主控制台上运行的一个紧急 Shell 供用户与系统交互。 |
| `halt.target` |  |  | 停止系统而不关闭电源。 |
| `reboot.target` | 6 | `runlevel6.target` | 重启。 |
| `poweroff.target` | 0 | `runlevel0.target` | 停止系统并关闭电源。 |

*图 2：SystemV 运行级别与 systemd 目标和一些目标别名的比较*

每个目标在其配置文件中都描述了一个依赖集。systemd 启动必须的依赖项，这些依赖项是运行 Linux 主机到特定功能级别所需的服务。当目标配置文件中列出的所有依赖项被加载并运行后，系统就在该目标级别运行了。在图 2 中，功能最多的目标位于表的顶部，从顶向下，功能逐步递减。

systemd 还会检查老的 SystemV `init` 目录，以确认是否存在任何启动文件。如果有，systemd 会将它们作为配置文件以启动它们描述的服务。网络服务是一个很好的例子，在 Fedora 中它仍然使用 SystemV 启动文件。

图 3（如下）是直接从启动手册页复制来的。它显示了 systemd 启动期间一般的事件环节以及确保成功启动的基本顺序要求。

```
                                        cryptsetup-pre.target
                                                   |
 (various low-level                                v
     API VFS mounts:                 (various cryptsetup devices...)
  mqueue, configfs,                                |    |
  debugfs, ...)                                    v    |
  |                                  cryptsetup.target  |
  |  (various swap                                 |    |    remote-fs-pre.target
  |   devices...)                                  |    |     |        |
  |    |                                           |    |     |        v
  |    v                       local-fs-pre.target |    |     |  (network file systems)
  |  swap.target                       |           |    v     v                 |
  |    |                               v           |  remote-cryptsetup.target  |
  |    |  (various low-level  (various mounts and  |             |              |
  |    |   services: udevd,    fsck services...)   |             |    remote-fs.target
  |    |   tmpfiles, random            |           |             |             /
  |    |   seed, sysctl, ...)          v           |             |            /
  |    |      |                 local-fs.target    |             |           /
  |    |      |                        |           |             |          /
  \____|______|_______________   ______|___________/             |         /
                              \ /                                |        /
                               v                                 |       /
                        sysinit.target                           |      /
                               |                                 |     /
        ______________________/|\_____________________           |    /
       /              |        |      |               \          |   /
       |              |        |      |               |          |  /
       v              v        |      v               |          | /
  (various       (various      |  (various            |          |/
   timers...)      paths...)   |   sockets...)        |          |
       |              |        |      |               |          |
       v              v        |      v               |          |
 timers.target  paths.target   |  sockets.target      |          |
       |              |        |      |               v          |
       v              \_______ | _____/         rescue.service   |
                              \|/                     |          |
                               v                      v          |
                           basic.target         rescue.target    |
                               |                                 |
                       ________v____________________             |
                      /              |              \            |
                      |              |              |            |
                      v              v              v            |
                  display-    (various system   (various system  |
              manager.service     services        services)      |
                      |         required for        |            |
                      |        graphical UIs)       v            v
                      |              |            multi-user.target
 emergency.service    |              |              |
         |            \_____________ | _____________/
         v                          \|/
 emergency.target                    v
                              graphical.target
```

*图 3: systemd 启动图*

`sysinit.target` 和 `basic.target` 目标可以看作启动过程中的检查点。尽管 systemd 的设计目标之一是并行启动系统服务，但是某些服务和功能目标必须先启动，然后才能启动其它服务和目标。直到该检查点所需的所有服务和目标被满足后才能通过这些检查点。

当 `sysinit.target` 所依赖的所有单元都完成时，就会到达 `sysinit.target`。所有这些单元，包括挂载文件系统、设置交换文件、启动 Udev、设置随机数生成器种子、启动低层服务以及配置安全服务（如果一个或多个文件系统是加密的）都必须被完成，但在 `sysinit.target` 中，这些任务可以并行执行。

`sysinit.target` 启动了系统接近正常运行所需的所有低层服务和单元，它们也是进入 `basic.target` 所需的。

在完成 `sysinit.target` 之后，systemd 会启动实现下一个目标所需的所有单元。`basic.target` 通过启动所有下一目标所需的单元来提供一些额外功能。包括设置为各种可执行程序目录的路径、设置通信套接字和计时器之类。

最后，用户级目标 `multi-user.target` 或 `graphical.target` 被初始化。要满足 `graphical.target` 的依赖必须先达到 `multi-user.target`。图 3 中带下划线的目标是通常的启动目标。当达到这些目标之一时，启动就完成了。如果 `multi-user.target` 是默认设置，那么你应该在控制台上看到文本模式的登录界面。如果 `graphical.target` 是默认设置，那么你应该看到图形的登录界面。你看到的具体的 GUI 登录界面取决于你的默认显示管理器。

引导手册页还描述并提供了引导到初始化 RAM 磁盘和 systemd 关机过程的图。

systemd 还提供了一个工具，该工具列出了完整的启动过程或指定单元的依赖项。单元是一个可控的 systemd 资源实体，其范围可以从特定服务（例如 httpd 或 sshd）到计时器、挂载、套接字等。尝试以下命令并滚动查看结果。

```
systemctl list-dependencies graphical.target
```

注意，这会完全展开使系统进入 `graphical.target` 运行模式所需的顶层目标单元列表。也可以使用 `--all` 选项来展开所有其它单元。

```
systemctl list-dependencies --all graphical.target
```

你可以使用 `less` 命令来搜索诸如 `target`、`slice` 和 `socket` 之类的字符串。

现在尝试下面的方法。

```
systemctl list-dependencies multi-user.target
```

和

```
systemctl list-dependencies rescue.target
```

和

```
systemctl list-dependencies local-fs.target
```

和

```
systemctl list-dependencies dbus.service
```

这个工具帮助我可视化我正用的主机的启动依赖细节。继续花一些时间探索一个或多个 Linux 主机的启动树。但是要小心，因为 systemctl 手册页包含以下注释：

>
> “请注意，此命令仅列出当前被服务管理器加载到内存的单元。尤其是，此命令根本不适合用于获取特定单元的全部反向依赖关系列表，因为它不会列出被单元声明了但是未加载的依赖项。”
>
>
>

### 结尾语

即使在没有深入研究 systemd 之前，很明显能看出它既强大又复杂。显然，systemd 不是单一、庞大、独体且不可知的二进制文件。相反，它是由许多较小的组件和旨在执行特定任务的子命令组成。

本系列的下一篇文章将更详细地探讨 systemd 的启动，以及 systemd 的配置文件，更改默认的目标以及如何创建简单服务单元。

### 资源

互联网上有大量关于 systemd 的信息，但是很多都很简短、晦涩甚至是带有误导。除了本文提到的资源外，以下网页还提供了有关 systemd 启动的更详细和可靠的信息。

* Fedora 项目有一个很好的实用的 [systemd 指南](https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html)。它有你需要知道的通过 systemd 来配置、管理和维护 Fedora 主机所需的几乎所有知识。
* Fedora 项目还有一个不错的[速记表](https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet)，将老的 SystemV 命令与对比的 systemd 命令相互关联。
* 有关 systemd 的详细技术信息及创建它的原因，请查看 [Freedesktop.org](http://Freedesktop.org) 对 [systemd 描述](http://www.freedesktop.org/wiki/Software/systemd)。
* [Linux.com](http://Linux.com) 的“systemd 的更多乐趣”提供了更高级的 systemd [信息和技巧](https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/)。

还有针对 Linux 系统管理员的一系列技术性很强的文章，作者是 systemd 的设计师和主要开发者 Lennart Poettering。这些文章是在 2010 年 4 月至 2011 年 9 月之间撰写的，但它们现在和那时一样有用。关于 systemd 及其生态的其它许多好文都基于这些论文。

* [重新思考 1 号进程](http://0pointer.de/blog/projects/systemd.html)
* [systemd 系统管理员篇 I](http://0pointer.de/blog/projects/systemd-for-admins-1.html)
* [systemd 系统管理员篇 II](http://0pointer.de/blog/projects/systemd-for-admins-2.html)
* [systemd 系统管理员篇 III](http://0pointer.de/blog/projects/systemd-for-admins-3.html)
* [systemd 系统管理员篇 IV](http://0pointer.de/blog/projects/systemd-for-admins-4.html)
* [systemd 系统管理员篇 V](http://0pointer.de/blog/projects/three-levels-of-off.html)
* [systemd 系统管理员篇 VI](http://0pointer.de/blog/projects/changing-roots)
* [systemd 系统管理员篇 VII](http://0pointer.de/blog/projects/blame-game.html)
* [systemd 系统管理员篇 VIII](http://0pointer.de/blog/projects/the-new-configuration-files.html)
* [systemd 系统管理员篇 IX](http://0pointer.de/blog/projects/on-etc-sysinit.html)
* [systemd 系统管理员篇 X](http://0pointer.de/blog/projects/instances.html)
* [systemd 系统管理员篇 XI](http://0pointer.de/blog/projects/inetd.html)

---

via: <https://opensource.com/article/20/4/systemd>

作者：[David Both](https://opensource.com/users/dboth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[messon007](https://github.com/messon007) 校对：[wxy](https://github.com/wxy)

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


新闻速读 > 只要五分钟，骇客就能通过 Thunderbolt 漏洞窃取你的数据

Summary: 更多：Telegram 放弃了 17 亿美元的 TON 区块链项目；Pineloader 为 Linux 智能机提供了多启动支持

每个人对新闻会有自己的解读，你的点评还是自己留着好，避免祸从口出。

![](/data/attachment/album/202005/13/104041i28x35g32a32mum5.jpg)

#### 只要五分钟，骇客就能通过 Thunderbolt 漏洞窃取你的数据

安全专家 Björn Ruytenberg 日前在研究后发现，骇客只需利用一套被称作 Thunderspy 的技术，就可以轻松地在配有 Thunderbolt 连接口的 PC 或 Linux 电脑上窃取用户的加密数据。按照他的说法，在骇客能够亲手接触到设备的前提下，其实只需要螺丝刀、简易的便携硬件以及区区五分钟时间就能得手了。目前市面上仍有大部分来自各品牌的旧款机种要面临受到这类攻击的风险。

来源：[solidot](https://www.solidot.org/story?sid=64331)

>
> 硬核老王点评：物理安全是最后的防线。
>
>
>

#### Telegram 放弃了 17 亿美元的 TON 区块链项目

面对美国证券交易委员会（SEC）的强势监管，Telegram 已经放弃了 17 亿美元的 TON 加密货币项目，同时被要求向投资者退款。这家拥有 4 亿用户的消息应用运营商今日宣布，在与 SEC 开展了旷日持久的论战之后，其最终还是放弃了即将推出的 Telegram Open Network 区块链项目。TON 的溃败，意味着向公众发起各种空气币 ICO 的机会窗口，已被监管机构重重地关上。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/978375.htm)

>
> 硬核老王点评：这扇大门被关上了，从一定意义是制止了泡沫和欺诈的产生，而将会倒逼区块链领域产生新的创新。
>
>
>

#### Pineloader 为 Linux 智能机提供了多启动支持

爱好者们可以在一款手机上安装多个不同的 Linux 操作系统，然后在启动时轻松选择想用的那一个。尽管引导选择界面不支持触摸操作，但玩家可以通过音量加减来上下选择，然后轻击电源键来确认选择。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/978091.htm)

#### Win10 May 2020 Update 新安全功能保护电脑免遭不需要应用攻击

据了解，Windows 10 用户在互联网上搜索免费版本软件时经常会下载到名声不佳的应用程序。而许多声誉不佳的应用程序都会跟可能不受欢迎的应用程序捆绑在一起，如果运行了这些应用程序，其可能会减慢 Windows 10 的运行速度、插入广告甚至改变浏览器的搜索引擎。对此，Windows 10 May 2020 Update 在 Windows 安全程序中引入了新保护功能，其提供了针对可能不受欢迎的应用程序的保护，但目前该功能在默认情况下则是处于未启用状态。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/978355.htm)

#### Facebook 与内容审核员们和解：后者因心理创伤获赔 5200 万美元

据外媒报道，Facebook 同意支付 5200 万美元和解与内容审核员们的诉讼。后者声称因为反复查看儿童性侵和恐怖主义图片等令人不安的材料而产生心理创伤。这起和结案共覆盖逾 1 万名现任和前任 Facebook 审核员。律师称，这些人将每人收到 1000 美元医学排查费用，如有必要，还将额外获得治疗费用。

来源：[新浪科技](https://tech.sina.com.cn/i/2020-05-13/doc-iircuyvi2791511.shtml?cre=tianyi&mod=pctech&loc=10&r=25&rfunc=79&tj=none&tr=25)

>
> 硬核老王点评：内容审核终究还是一种人力活，做这个工作的人得有多高的心理耐受度？
>
>
>

#### Ubuntu Server 安装程序漏洞：将密码泄露到日志中

Subiquity 是 Ubuntu Server 的安装程序，它已经存在了近 3 年，但是直到上个月底发布的 Ubuntu 20.04 才将其作为默认支持工具。 Subiquity 一直以来维护得也比较粗糙，很快就有开发者发现了其中的一个严重漏洞。该漏洞被标记为 CVE 2020-11932，严重程度为“紧急”，不过，开发者目前已经修复了该漏洞。

来源：[开源中国](https://www.oschina.net/news/115601/ubuntu-server-subiquity-password-leak)

>
> 硬核老王点评：漏洞很严重，应该对这种转正后的应用做比较全面的审查。
>
>
>

#### 台积电 5nm 客户曝光：今年仅苹果华为，AMD 等明年加入

近日，一份台积电 5nm 工艺的客户名单曝光，2020 年，台积电只为两家公司量产 5nm 芯片，分别是苹果和华为海思，前者是 A14 和 A14X 处理器，华为海思的则是麒麟 1000 及网络处理器。2021-2022 年量产的客户及产品都将增多，除了华为和苹果，目前曝光的还有 6 家，分别是 AMD、博通、高通、英伟达、联发科和英特尔。

来源：[网易科技](https://tech.163.com/20/0513/09/FCGDOBD1000999LD.html)

#### 国外 5G 网速测试出炉，沙特第一，美国最慢

国外知名测试机构 Opensignal 近日发布了 8 个国家的 5G 网速测试报告，结果有 7 个国家的 5G 网速比 4G 和 WiFi 速度更快。排名第一的是沙特阿拉伯，美国是唯一 5G 网速比 WiFi 慢的国家，双方网速相差 5.5 倍。

来源：[网易科技](https://tech.163.com/20/0513/09/FCGDI31G000999LD.html)


修复 Ubuntu 中的 “Unable to parse package file” 错误

Summary: 完全不必惊慌。这真的很容易“修复”。

完全不必惊慌。这真的很容易“修复”。

过去，我已经讨论了许多 [Ubuntu 更新错误](https://itsfoss.com/ubuntu-update-error/)。如果你[使用命令行更新 Ubuntu](https://itsfoss.com/update-ubuntu/)，那可能会遇到一些“错误”。

其中一些“错误”基本上是内置功能，可防止对系统进行不必要的更改。在本教程中，我不会涉及那些细节。

在本文中，我将向你展示如何解决在更新系统或安装新软件时可能遇到的以下错误：

```
Reading package lists… Error!
E: Unable to parse package file /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease
E: The package lists or status file could not be parsed or opened.
```

在 Debian 中可能会遇到类似的错误：

```
E: Unable to parse package file /var/lib/apt/extended_states (1)
```

即使遇到 `The package cache file is corrupted` 也完全不必惊慌。这真的很容易“修复”。

### 在基于 Ubuntu 和 Debian 的 Linux 发行版中处理 “Unable to parse package file” 错误

![](/data/attachment/album/202005/13/162038ovbjb3vhv5hh5fh2.png)

以下是你需要做的。仔细查看 [Ubuntu](https://ubuntu.com/) 报错文件的名称和路径。

```
Reading package lists… Error!
E: Unable to parse package file /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease
E: The package lists or status file could not be parsed or opened.
```

例如，上面的错误是在报 `/var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease` 文件错误。

这让你想到这个文件不正确。现在，你需要做的就是删除该文件并重新生成缓存。

```
sudo rm <file_that_is_not_parsed>
```

因此，这里我可以使用以下命令：`sudo rm /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease`，然后使用 `sudo apt update` 命令重建缓存。

#### 给初学者的分步指导

如果你熟悉 Linux 命令，那么可能知道如何使用绝对路径删除文件。对于新手用户，让我指导你安全删除文件。

首先，你应该进入文件目录：

```
cd /var/lib/apt/lists/
```

现在删除无法解析的文件：

```
sudo rm archive.ubuntu.com_ubuntu_dists_bionic_InRelease
```

现在，如果你再次运行更新，将重新生成 apt 缓存。

```
sudo apt update
```

#### 有很多文件无法解析？

如果你在更新系统时有一个或两个文件无法解析，那么问题不大。但是，如果系统报错有十个或二十个此类文件，那么一一删除它们就太累了。

在这种情况下，你可以执行以下操作来删除整个缓存，然后再次生成它：

```
sudo rm -r /var/lib/apt/lists/*
sudo apt update
```

#### 解释这为何能解决问题

`/var/lib/apt` 是与 apt 软件包管理器相关的文件和数据的存储目录。`/var/lib/apt/lists` 是用于保存系统 `source.list` 中指定的每个软件包资源信息的目录。

简单点来说，`/var/lib/apt/lists` 保存软件包信息缓存。当你要安装或更新程序时，系统会在此目录中检查该软件包中的信息。如果找到了该包的详细信息，那么它将进入远程仓库并实际下载程序或其更新。

当你运行 `sudo apt update` 时，它将构建缓存。这就是为什么即使删除 `/var/lib/apt/lists` 目录中的所有内容，运行更新也会建立新的缓存的原因。

这就是处理文件无法解析问题的方式。你的系统报某个软件包或仓库信息以某种方式损坏（下载失败或手动更改 `sources.list`）。删除该文件（或所有文件）并重建缓存即可解决此问题。

#### 仍然有错误？

这应该能解决你的问题。但是，如果问题仍然存在，或者你还有其他相关问题，请在评论栏告诉我，我将尽力帮助你。

---

via: <https://itsfoss.com/unable-to-parse-package-file/>

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

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