在 Linux 上创建一个加密文件保险库

# 在 Linux 上创建一个加密文件保险库

>
> 使用 Linux 统一密钥设置（LUKS）为物理驱动器或云存储上的敏感文件创建一个加密保险库。
>
>
>

<img src="content_image/album_202104_14_151220l5zkkxiukgzix54k.jpg" alt="" title="Secure safe">

最近，我演示了如何在 Linux 上使用<ruby> 统一密钥设置 <rt>  Linux Unified Key Setup </rt></ruby>（[LUKS](https://gitlab.com/cryptsetup/cryptsetup/blob/master/README.md)）和 `cryptsetup` 命令 [实现全盘加密](https://opensource.com/article/21/3/encryption-luks)。虽然加密整个硬盘在很多情况下是有用的，但也有一些原因让你不想对整个硬盘进行加密。例如，你可能需要让一个硬盘在多个平台上工作，其中一些平台可能没有集成 [LUKS](https://gitlab.com/cryptsetup/cryptsetup/blob/master/README.md)。此外，现在是 21 世纪，由于云的存在，你可能不会使用物理硬盘来处理所有的数据。

几年前，有一个名为 [TrueCrypt](https://en.wikipedia.org/wiki/TrueCrypt) 的系统，允许用户创建加密的文件保险库，可以通过 TrueCrypt 解密来提供读/写访问。这是一项有用的技术，基本上提供了一个虚拟的便携式、完全加密的驱动器，你可以在那里存储重要数据。TrueCrypt 项目关闭了，但它可以作为一个有趣的模型。

幸运的是，LUKS 是一个灵活的系统，你可以使用它和 `cryptsetup` 在一个独立的文件中创建一个加密保险库，你可以将其保存在物理驱动器或云存储中。

下面就来介绍一下怎么做。

### 1、建立一个空文件

首先，你必须创建一个预定大小的空文件。就像是一种保险库或保险箱，你可以在其中存储其他文件。你使用的命令是 `util-linux` 软件包中的 `fallocate`：

```
$ fallocate --length 512M vaultfile.img

```

这个例子创建了一个 512MB 的文件，但你可以把你的文件做成任何你想要的大小。

### 2、创建一个 LUKS 卷

接下来，在空文件中创建一个 LUKS 卷：

```
$ cryptsetup --verify-passphrase \
    luksFormat vaultfile.img

```

### 3、打开 LUKS 卷

要想创建一个可以存储文件的文件系统，必须先打开 LUKS 卷，并将其挂载到电脑上：

```
$ sudo cryptsetup open \
    --type luks vaultfile.img myvault
$ ls /dev/mapper
myvault

```

### 4、建立一个文件系统

在你打开的保险库中建立一个文件系统：

```
$ sudo mkfs.ext4 -L myvault /dev/mapper/myvault

```

如果你现在不需要它做什么，你可以关闭它：

```
$ sudo cryptsetup close myvault

```

### 5、开始使用你的加密保险库

现在一切都设置好了，你可以在任何需要存储或访问私人数据的时候使用你的加密文件库。要访问你的保险库，必须将其挂载为一个可用的文件系统：

```
$ sudo cryptsetup open \
    --type luks vaultfile.img myvault
$ ls /dev/mapper
myvault
$ sudo mkdir /myvault
$ sudo mount /dev/mapper/myvault /myvault

```

这个例子用 `cryptsetup` 打开保险库，然后把保险库从 `/dev/mapper` 下挂载到一个叫 `/myvault` 的新目录。和 Linux 上的任何卷一样，你可以把 LUKS 卷挂载到任何你想挂载的地方，所以除了 `/myvault`，你可以用 `/mnt` 或 `~/myvault` 或任何你喜欢的位置。

当它被挂载后，你的 LUKS 卷就会被解密。你可以像读取和写入文件一样读取和写入它，就像它是一个物理驱动器一样。

当使用完你的加密保险库时，请卸载并关闭它：

```
$ sudo umount /myvault
$ sudo cryptsetup close myvault

```

### 加密的文件保险库

你用 LUKS 加密的镜像文件和其他文件一样，都是可移动的，因此你可以将你的保险库存储在硬盘、外置硬盘，甚至是互联网上。只要你可以使用 LUKS，就可以解密、挂载和使用它来保证你的数据安全。轻松加密，提高数据安全性，不妨一试。

---

via: <https://opensource.com/article/21/4/linux-encryption>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


硬核观察 | 安全研究人员根据修复补丁，直接在网上公开了 Chrome 漏洞

Summary: 更多：• FreeBSD 13.0 发布 • Apache 软件基金会撤下了大量的 Hadoop 相关项目

# 硬核观察 | 安全研究人员根据修复补丁，直接在网上公开了 Chrome 漏洞

### 安全研究人员根据修复补丁，直接在网上公开了 Chrome 漏洞

一名印度安全研究人员[公布](https://therecord.media/security-researcher-drops-chrome-and-edge-zero-day-on-twitter/)了一个最近发现的漏洞的概念验证利用代码，该漏洞存在于 V8 JavaScript 引擎中，影响了谷歌 Chrome、微软 Edge 以及 Opera 和 Brave 等其他基于 Chromium 的浏览器。

该漏洞在上周举行的 Pwn2Own 黑客大赛中被使用，参赛选手因此赢得了 10 万美元的奖金。根据比赛规则，关于这个漏洞的细节被交给了 Chrome 安全团队，谷歌将修复补丁提交到了 V8 引擎，但尚未及时发布到 Chromium 浏览器中（本文发布时已更新修复）。结果，另外一位安全研究人员根据该补丁重现了该漏洞，并将其发布到了 GitHub 上，并通过 Twitter 公之于众。

研究人员所发布的并非完全武器化的漏洞，利用也需要一定的条件。但这件事凸显了“开源补丁间隙”问题，在安全补丁传递到下游之前的空隙期间，可能带来更大的安全风险。

### FreeBSD 13.0 发布

[新版本](https://www.freebsd.org/releases/13.0R/relnotes/)包含了大量的软件更新；64 位 ARM 架构现在与 x86\_64 并列成为一级架构；ZFS 采用 OpenZFS 实现；LLVM Clang 11 成为默认的编译器工具链；移除了各种过时的老版本工具，如旧版的 GDB、GCC 和 Binutils；以及因为质量原因，这次对 WireGuard 的支持未能加入。其它[亮点可参见基金会文章](https://freebsdfoundation.org/blog/freebsd-release-13-0-highlights/)。

这是一个值得关注的大版本，可惜的是 WireGuard 没能进入。

### Apache 软件基金会撤下了大量的 Hadoop 相关项目

从 4 月 1 日开始，Apache 软件基金会（ASF）宣布至少有 19 个开源项目退居“<ruby> 阁楼 <rt>  Attic </rt></ruby>”，其中 [13 个与大数据相关](https://www.zdnet.com/article/apache-software-foundation-retires-slew-of-hadoop-related-projects/)，10 个是 Hadoop 生态系统的一部分。ASF 表示这是常规的项目退役高峰，经过了项目管理委员会到董事会的投票，这些项目被放到了“阁楼”。

这或许是 ASF 内部进行清仓，但是似乎也能表明，Hadoop 已经在优胜劣汰中处于劣势，让位于 Spark 了。


6 个提升 Linux 服务器安全的开源工具和技巧

Summary: 使用开源工具来保护你的 Linux 环境不被入侵。

使用开源工具来保护你的 Linux 环境不被入侵。

# 6 个提升 Linux 服务器安全的开源工具和技巧

>
> 使用开源工具来保护你的 Linux 环境不被入侵。
>
>
>

<img src="content_image/album_202104_15_082334ltqtgg40tu7l80rd.jpg" alt="" title="People work on a computer server with devices">

如今我们的许多个人和专业数据都可以在网上获得，因此无论是专业人士还是普通互联网用户，学习安全和隐私的基本知识是非常重要的。作为一名学生，我通过学校的 CyberPatriot 活动获得了这方面的经验，在那里我有机会与行业专家交流，了解网络漏洞和建立系统安全的基本步骤。

本文基于我作为初学者迄今所学的知识，详细介绍了六个简单的步骤，以提高个人使用的 Linux 环境的安全性。在我的整个旅程中，我利用开源工具来加速我的学习过程，并熟悉了与提升 Linux 服务器安全有关的更高层次的概念。

我使用我最熟悉的 Ubuntu 18.04 版本测试了这些步骤，但这些步骤也适用于其他 Linux 发行版。

### 1、运行更新

开发者们不断地寻找方法，通过修补已知的漏洞，使服务器更加稳定、快速、安全。定期运行更新是一个好习惯，可以最大限度地提高安全性。运行它们：

```
sudo apt-get update && apt-get upgrade

```

### 2、启用防火墙保护

[启用防火墙](https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd) 可以更容易地控制服务器上的进站和出站流量。在 Linux 上有许多防火墙应用程序可以使用，包括 [firewall-cmd](https://opensource.com/article/20/2/firewall-cheat-sheet) 和 <ruby> 简单防火墙 <rt>  Uncomplicated Firewall </rt></ruby>（[UFW](https://wiki.ubuntu.com/UncomplicatedFirewall)）。我使用 UFW，所以我的例子是专门针对它的，但这些原则适用于你选择的任何防火墙。

安装 UFW：

```
sudo apt-get install ufw

```

如果你想进一步保护你的服务器，你可以拒绝传入和传出的连接。请注意，这将切断你的服务器与世界的联系，所以一旦你封锁了所有的流量，你必须指定哪些出站连接是允许从你的系统中发出的：

```
sudo ufw default deny incoming
sudo ufw default allow outgoing

```

你也可以编写规则来允许你个人使用所需要的传入连接：

```
ufw allow <service>

```

例如，允许 SSH 连接：

```
ufw allow ssh

```

最后，启用你的防火墙：

```
sudo ufw enable

```

### 3、加强密码保护

实施强有力的密码政策是保持服务器安全、防止网络攻击和数据泄露的一个重要方面。密码策略的一些最佳实践包括强制要求最小长度和指定密码年龄。我使用 libpam-cracklib 软件包来完成这些任务。

安装 libpam-cracklib 软件包：

```
sudo apt-get install libpam-cracklib

```

强制要求密码的长度：

* 打开 `/etc/pam.d/common-password` 文件。
* 将 `minlen=12` 行改为你需要的任意字符数，从而改变所有密码的最小字符长度要求。

为防止密码重复使用：

* 在同一个文件（`/etc/pam.d/common-password`）中，添加 `remember=x` 行。
* 例如，如果你想防止用户重复使用他们最后 5 个密码中的一个，使用 `remember=5`。

要强制要求密码年龄：

* 在 `/etc/login.defs` 文件中找到以下几行，并用你喜欢的时间（天数）替换。例如：

```
PASS_MIN_AGE: 3
PASS_MAX_AGE: 90
PASS_WARN_AGE: 14

```

强制要求字符规格：

* 在密码中强制要求字符规格的四个参数是 `lcredit`（小写）、`ucredit`（大写）、`dcredit`（数字）和 `ocredit`（其他字符）。
* 在同一个文件（`/etc/pam.d/common-password`）中，找到包含 `pam_cracklib.so` 的行。
	+ 在该行末尾添加以下内容：`lcredit=-a ucredit=-b dcredit=-c ocredit=-d`。
	+ 例如，下面这行要求密码必须至少包含一个每种字符。你可以根据你喜欢的密码安全级别来改变数字。`lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1`。

### 4、停用容易被利用的非必要服务。

停用不必要的服务是一种最好的做法。这样可以减少开放的端口，以便被利用。

安装 systemd 软件包：

```
sudo apt-get install systemd

```

查看哪些服务正在运行：

```
systemctl list-units

```

[识别](http://www.yorku.ca/infosec/Administrators/UNIX_disable.html) 哪些服务可能会导致你的系统出现潜在的漏洞。对于每个服务可以：

* 停止当前正在运行的服务：`systemctl stop <service>`。
* 禁止服务在系统启动时启动：`systemctl disable <service>`。
* 运行这些命令后，检查服务的状态：`systemctl status <service>`。

### 5、检查监听端口

开放的端口可能会带来安全风险，所以检查服务器上的监听端口很重要。我使用 [netstat](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/netstat) 命令来显示所有的网络连接：

```
netstat -tulpn

```

查看 “address” 列，确定 [端口号](https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers)。一旦你找到了开放的端口，检查它们是否都是必要的。如果不是，[调整你正在运行的服务](https://opensource.com/article/20/5/systemd-units)，或者调整你的防火墙设置。

### 6、扫描恶意软件

杀毒扫描软件可以有用的防止病毒进入你的系统。使用它们是一种简单的方法，可以让你的服务器免受恶意软件的侵害。我首选的工具是开源软件 [ClamAV](https://www.clamav.net/)。

安装 ClamAV：

```
sudo apt-get install clamav

```

更新病毒签名：

```
sudo freshclam

```

扫描所有文件，并打印出被感染的文件，发现一个就会响铃：

```
sudo clamscan -r --bell -i /

```

你可以而且应该设置为自动扫描，这样你就不必记住或花时间手动进行扫描。对于这样简单的自动化，你可以使用 [systemd 定时器](https://opensource.com/article/20/7/systemd-timers) 或者你的 [喜欢的 cron](https://opensource.com/article/21/2/linux-automation) 来做到。

### 保证你的服务器安全

我们不能把保护服务器安全的责任只交给一个人或一个组织。随着威胁环境的不断迅速扩大，我们每个人都应该意识到服务器安全的重要性，并采用一些简单、有效的安全最佳实践。

这些只是你提升 Linux 服务器的安全可以采取的众多步骤中的一部分。当然，预防只是解决方案的一部分。这些策略应该与严格监控拒绝服务攻击、用 [Lynis](https://opensource.com/article/20/5/linux-security-lynis) 做系统分析以及创建频繁的备份相结合。

你使用哪些开源工具来保证服务器的安全？在评论中告诉我们它们的情况。

---

via: <https://opensource.com/article/21/4/securing-linux-servers>

作者：[Sahana Sreeram](https://opensource.com/users/sahanasreeram01gmailcom) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


开源为你带来竞争优势的 4 种方式

Summary: 使用开源技术可以帮助组织获得更好的业务结果。

开源成就未来！

使用开源技术可以帮助组织获得更好的业务结果。

# 开源为你带来竞争优势的 4 种方式

>
> 使用开源技术可以帮助组织获得更好的业务结果。
>
>
>

<img src="content_image/album_202104_15_085345a2aani3axxj7wcis.jpg" alt="" title="Open ethernet cords.">

构建技术栈是每个组织的主要决策。选择合适的工具将让团队获得成功，选择错误的解决方案或平台会对生产率和利润率产生毁灭性影响。为了在当今快节奏的世界中脱颖而出，组织必须明智地选择数字解决方案，好的数字解决方案可以提升团队行动力与运营敏捷性。

这就是为什么越来越多的组织都采用开源解决方案的原因，这些组织来自各行各业，规模有大有小。根据 [麦肯锡](https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/developer-velocity-how-software-excellence-fuels-business-performance#) 最近的报告，高绩效组织的最大区别是采用不同的开源方案。

采用开源技术可以帮助组织提高竞争优势、获得更好业务成果的原因有以下四点。

### 1、可拓展性和灵活性

可以说，技术世界发展很快。例如，在 2014 年之前，Kubernetes 并不存在，但今天，它却令人印象深刻，无处不在。根据 CNCF [2020 云原生调查](https://www.cncf.io/blog/2020/11/17/cloud-native-survey-2020-containers-in-production-jump-300-from-our-first-survey/)，91% 的团队正在以某种形式使用 Kubernetes。

组织投资开源的一个主要原因是因为开源赋予组织行动敏捷性，组织可以迅速地将新技术集成到技术栈中。这与传统方法不同，在传统方法中，团队需要几个季度甚至几年来审查、实施、采用软件，这导致团队不可能实现火速转变。

开源解决方案完整地提供源代码，团队可以轻松将软件与他们每天使用的工具连接起来。

简而言之，开源让开发团队能够为手头的东西构建完美的工具，而不是被迫改变工作方式来适应不灵活的专有工具。

### 2、安全性和高可信的协作

在数据泄露备受瞩目的时代，组织需要高度安全的工具来保护敏感数据的安全。

专有解决方案中的漏洞不易被发现，被发现时为时已晚。不幸的是，使用这些平台的团队无法看到源代码，本质上是他们将安全性外包给特定供应商，并希望得到最好的结果。

采用开源的另一个主要原因是开源工具使组织能够自己把控安全。例如，开源项目——尤其是拥有大型开源社区的项目——往往会收到更负责任的漏洞披露，因为每个人在使用过程中都可以彻底检查源代码。

由于源代码是免费提供的，因此披露通常伴随着修复缺陷的详细建议解决方案。这些方案使得开发团队能够快速解决问题，不断增强软件。

在远程办公时代，对于分布式团队来说，在知道敏感数据受到保护的情况下进行协作比以往任何时候都更重要。开源解决方案允许组织审核安全性、完全掌控自己数据，因此开源方案可以促进远程环境下高可信协作方式的成长。

### 3、不受供应商限制

根据 [最近的一项研究](https://solutionsreview.com/cloud-platforms/flexera-68-percent-of-cios-worry-about-vendor-lock-in-with-public-cloud/)，68% 的 CIO 担心受供应商限制。当你受限于一项技术中，你会被迫接受别人的结论，而不是自己做结论。

当组织更换供应商时，专有解决方案通常会 [给你带走数据带来挑战](https://www.computerworld.com/article/3428679/mattermost-makes-case-for-open-source-as-team-messaging-market-booms.html)。另一方面，开源工具提供了组织需要的自由度和灵活性，以避免受供应商限制，开源工具可以让组织把数据带去任意地方。

### 4、顶尖人才和社区

随着越来越多的公司 [接受远程办公](https://mattermost.com/blog/tips-for-working-remotely/)，人才争夺战变得愈发激烈。

在软件开发领域，获得顶尖人才始于赋予工程师先进工具，让工程师在工作中充分发挥潜力。开发人员 [越来越喜欢开源解决方案](https://opensource.com/article/20/6/open-source-developers-survey) 而不是专有解决方案，组织应该强烈考虑用开源替代商业解决方案，以吸引市场上最好的开发人员。

除了雇佣、留住顶尖人才更容易，公司能够通过开源平台利用贡献者社区，得到解决问题的建议，从平台中得到最大收益。此外，社区成员还可以 [直接为开源项目做贡献](https://mattermost.com/blog/100-most-popular-mattermost-features-invented-and-contributed-by-our-amazing-open-source-community/)。

### 开源带来自由

开源软件在企业团队中越来越受到欢迎——[这是有原因的](https://mattermost.com/blog/100-most-popular-mattermost-features-invented-and-contributed-by-our-amazing-open-source-community/)。它帮助团队灵活地构建完美的工作工具，同时使团队可以维护高度安全的环境。同时，开源允许团队掌控未来方向，而不是局限于供应商的路线图。开源还帮助公司接触才华横溢的工程师和开源社区成员。

---

via: <https://opensource.com/article/21/4/open-source-competitive-advantage>

作者：[Jason Blais](https://opensource.com/users/jasonblais) 选题：[lujun9972](https://github.com/lujun9972) 译者：[DCOLIVERSUN](https://github.com/DCOLIVERSUN) 校对：[wxy](https://github.com/wxy)

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


硬核观察 | 加密货币交易所第一股 Coinbase 上市，创始人致谢中本聪

Summary: 更多：• 华为提供适配套件可以将 App 对 GMS 的依赖替换为 HMS • System76 正在为其 Pop!_OS Linux 开发新桌面

谢谢你，无论你是谁。

也就手持了一百多万比特币而已嘛

来自江苏南京的 Chrome Mobile 89.0|Android 10 用户

# 硬核观察 | 加密货币交易所第一股 Coinbase 上市，创始人致谢中本聪

### 加密货币交易所第一股 Coinbase 上市，创始人致谢中本聪

4 月 14 日，加密货币交易所 Coinbase 正式登陆纳斯达克。其发行价为 250 美元，开盘价 381 美元，最高报 429.54 美元。随后一路走低，截至收盘，报 328.28 美元，涨幅 31.31%，市值达 653.93 亿美元。

Coinbase 的联合创始人在 Twitter 上回顾了 Coinbase 的历程，并隔空喊话中本聪：谢谢你，无论你是谁。

此外，在 Coinbase 上市前，比特币价格突破 64000 美元，再次刷新历史记录。Coinbase 上市后，比特币股价一度升至 64829 美元，此后有所回落。

加密货币行业应该感谢中本聪，无论他是谁，但不是每个人都感谢他。

### 华为提供适配套件可以将 App 对 GMS 的依赖替换为 HMS

华为与欧洲领先的企业应用解决方案提供商 Bluesource 合作开发了 Choice SDK，可以将适配谷歌 GMS 的 App 轻松转换为适配华为的 HMS。该套件最初是为了向奥地利市场的华为移动设备用户提供自家的 App 服务。后来转为[开源软件](https://github.com/bluesource/ChoiceSDK)，据称已被奥地利国家电视广播公司、奥地利联邦铁路、奥地利邮政服务等 App 所采用。

虽然有些艰难，但是 HMS 的生态发展很快，这样的工具会有助于推进发展。

### System76 正在为其 Pop!\_OS Linux 开发新桌面

System76 是一家销售运行 Linux 的笔记本电脑、PC 和服务器的美国公司，它正在为其Pop!\_OS 发行版开发一种新的基于 GNOME 的桌面 GUI，名为 [COSMIC](https://blog.system76.com/post/648371526931038208/cosmic-to-arrive-in-june-release-of-popos-2104)，[计划发布](https://www.theregister.com/2021/04/14/system_76_introduces_cosmic_desktop/)在其 6 月份的下一个 Pop!\_OS 版本中。从 GitHub 上的[代码](https://github.com/pop-os/cosmic)来看，COSMIC 似乎是基于 GNOME 3.38 而不是新发布的 GNOME 40。

System76 正在邀请 Windows 和 macOS 测试用户，而不是邀请 Linux 用户测试，因为它的自然市场是那些因隐私问题而心灰意冷的 Windows 用户，或者是那些希望运行更像运行在大多数服务器和移动设备上的操作系统的开发者和技术人员。

额，不邀请 Linux 用户测试——这让人有点失望啊！


使用 Git 工作树对你的代码进行自由实验

# 使用 Git 工作树对你的代码进行自由实验

>
> 获得自由尝试的权利，同时在你的实验出错时可以安全地拥有一个新的、链接的克隆存储库。
>
>
>

<img src="content_image/album_202104_16_085512x3auafu5uaymk52u.jpg" alt="" title="Science lab with beakers">

Git 的设计部分是为了进行实验。如果你知道你的工作会被安全地跟踪，并且在出现严重错误时有安全状态存在，你就不会害怕尝试新的想法。不过，创新的部分代价是，你很可能会在这个过程中弄得一团糟。文件会被重新命名、移动、删除、更改、切割成碎片；新的文件被引入；你不打算跟踪的临时文件会在你的工作目录中占据一席之地等等。

简而言之，你的工作空间变成了纸牌屋，在“快好了！”和“哦，不，我做了什么？”之间岌岌可危地平衡着。那么，当你需要把仓库恢复到下午的一个已知状态，以便完成一些真正的工作时，该怎么办？我立刻想到了 `git branch` 和 [git stash](/article-13293-1.html) 这两个经典命令，但这两个命令都不是用来处理未被跟踪的文件的，而且文件路径的改变和其他重大的转变也会让人困惑，它们只能把工作暂存（`stash`）起来以备后用。解决这个需求的答案是 Git 工作树。

### 什么是 Git 工作树

Git <ruby> 工作树 <rt>  worktree </rt></ruby>是 Git 仓库的一个链接副本，允许你同时签出多个分支。工作树与主工作副本的路径是分开的，它可以处于不同的状态和不同的分支上。在 Git 中新建工作树的好处是，你可以在不干扰当前工作环境的情况下，做出与当前任务无关的修改、提交修改，然后在以后合并。

直接从 `git-worktree` 手册中找到了一个典型的例子：当你正在为一个项目做一个令人兴奋的新功能时，你的项目经理告诉你有一个紧急的修复工作。问题是你的工作仓库（你的“工作树”）处于混乱状态，因为你正在开发一个重要的新功能。你不想在当前的冲刺中“偷偷地”进行修复，而且你也不愿意把变更暂存起来，为修复创建一个新的分支。相反，你决定创建一个新的工作树，这样你就可以在那里进行修复：

```
$ git branch | tee
* dev
trunk
$ git worktree add -b hotfix ~/code/hotfix trunk
Preparing ../hotfix (identifier hotfix)
HEAD is now at 62a2daf commit

```

在你的 `code` 目录中，你现在有一个新的目录叫做 `hotfix`，它是一个与你的主项目仓库相连的 Git 工作树，它的 `HEAD` 停在叫做 `trunk` 的分支上。现在你可以把这个工作树当作你的主工作区来对待。你可以把目录切换到它里面，进行紧急修复、提交、并最终删除这个工作树：

```
$ cd ~/code/hotfix
$ sed -i 's/teh/the/' hello.txt
$ git commit --all --message 'urgent hot fix'

```

一旦你完成了你的紧急工作，你就可以回到你之前的任务。你可以控制你的热修复何时被集成到主项目中。例如，你可以直接将变更从其工作树推送到项目的远程存储库中：

```
$ git push origin HEAD
$ cd ~/code/myproject

```

或者你可以将工作树存档为 TAR 或 ZIP 文件：

```
$ cd ~/code/myproject
$ git archive --format tar --output hotfix.tar master

```

或者你可以从单独的工作树中获取本地的变化：

```
$ git worktree list
/home/seth/code/myproject  15fca84 [dev]
/home/seth/code/hotfix     09e585d [master]

```

从那里，你可以使用任何最适合你和你的团队的策略合并你的变化。

### 列出活动工作树

你可以使用 `git worktree list` 命令获得工作树的列表，并查看每个工作树签出的分支：

```
$ git worktree list
/home/seth/code/myproject  15fca84 [dev]
/home/seth/code/hotfix     09e585d [master]

```

你可以在任何一个工作树中使用这个功能。工作树始终是连接的（除非你手动移动它们，破坏 Git 定位工作树的能力，从而切断连接）。

### 移动工作树

Git 会跟踪项目 `.git` 目录下工作树的位置和状态：

```
$ cat ~/code/myproject/.git/worktrees/hotfix/gitdir
/home/seth/code/hotfix/.git

```

如果你需要重定位一个工作树，必须使用 `git worktree move`；否则，当 Git 试图更新工作树的状态时，就会失败：

```
$ mkdir ~/Temp
$ git worktree move hotfix ~/Temp
$ git worktree list
/home/seth/code/myproject  15fca84 [dev]
/home/seth/Temp/hotfix     09e585d [master]

```

### 移除工作树

当你完成你的工作时，你可以用 `remove` 子命令删除它：

```
$ git worktree remove hotfix
$ git worktree list
/home/seth/code/myproject  15fca84 [dev]

```

为了确保你的 `.git` 目录是干净的，在删除工作树后使用 `prune` 子命令：

```
$ git worktree remove prune

```

### 何时使用工作树

与许多选项一样，无论是标签还是书签还是自动备份，都要靠你来跟踪你产生的数据，否则可能会变得不堪重负。不要经常使用工作树，要不你最终会有 20 份存储库的副本，每份副本的状态都略有不同。我发现最好是创建一个工作树，做需要它的任务，提交工作，然后删除树。保持简单和专注。

重要的是，工作树为你管理 Git 存储库的方式提供了更好的灵活性。在需要的时候使用它们，再也不用为了检查另一个分支上的内容而争先恐后地保存工作状态了。

---

via: <https://opensource.com/article/21/4/git-worktree>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


如何在 Fedora 上安装 Steam

Summary: 由于 Steam，你可以在 Linux 上玩成百上千的游戏。

fedora安装软件时，如果想用table补全一个软件名会卡半天。有没有什么好的解决办法？百度没找到什么有质量的答案。

由于 Steam，你可以在 Linux 上玩成百上千的游戏。

# 如何在 Fedora 上安装 Steam

Steam 对 Linux 游戏玩家来说是最好的东西了。由于 Steam，你可以在 Linux 上玩成百上千的游戏。

如果你还不知道，Steam 是最流行的 PC 游戏平台。2013 年，它开始可以在 Linux 使用。[Steam 最新的 Proton 项目](https://itsfoss.com/steam-play-proton/) 允许你在 Linux 上玩为 Windows 平台创建的游戏。这让 Linux 游戏库增强了许多倍。

Steam 提供了一个桌面客户端，你可以用它从 Steam 商店下载或购买游戏，然后安装并玩它。

过去我们曾讨论过 [在 Ubuntu 上安装 Steam](https://itsfoss.com/install-steam-ubuntu-linux/)。在这个初学者教程中，我将向你展示在 Fedora Linux 上安装 Steam 的步骤。

### 在 Fedora 上安装 Steam

要在 Fedora 上使用 Steam，你必须使用 RMPFusion 软件库。[RPMFusion](https://rpmfusion.org/) 是一套第三方软件库，其中包含了 Fedora 选择不与它们的操作系统一起发布的软件。它们提供自由（开源）和非自由（闭源）的软件库。由于 Steam 在非自由软件库中，你将只安装那一个。

我将同时介绍终端和图形安装方法。

#### 方法 1：通过终端安装 Steam

这是最简单的方法，因为它需要的步骤最少。只需输入以下命令即可启用仓库：

```
sudo dnf install https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

```

你会被要求输入密码。然后你会被要求验证是否要安装这些仓库。你同意后，仓库安装就会完成。

要安装 Steam，只需输入以下命令：

```
sudo dnf install steam

```

输入密码后按 `Y` 接受。安装完毕后，打开 Steam，玩一些游戏。

#### 方法 2：通过 GUI 安装 Steam

你可以从软件中心 [启用 Fedora 上的第三方仓库](https://itsfoss.com/fedora-third-party-repos/)。打开软件中心并点击菜单。

在 “软件仓库” 窗口中，你会看到顶部有一个 “第三方软件仓库”。点击 “安装” 按钮。当提示你输入密码时，就完成了。

安装了 Steam 的 RPM Fusion 仓库后，更新你系统的软件缓存（如果需要），并在软件中心搜索 Steam。

安装完成后，打开 GNOME 软件中心，搜索 Steam。找到 Steam 页面后，点击安装。当被问及密码时，输入你的密码就可以了。

安装完 Steam 后，启动应用，输入你的 Steam 帐户详情或注册它，然后享受你的游戏。

### 将 Steam 作为 Flatpak 使用

Steam 也可以作为 Flatpak 使用。Fedora 上默认安装 Flatpak。在使用该方法安装 Steam 之前，我们必须安装 Flathub 仓库。

首先，在浏览器中打开 [Flatpak 网站](https://www.flatpak.org/setup/Fedora/)。现在，点击标有 “Flathub repository file” 的蓝色按钮。浏览器会询问你是否要在 GNOME 软件中心打开该文件。点击确定。在 GNOME 软件中心打开后，点击安装按钮。系统会提示你输入密码。

如果你在尝试安装 Flathub 仓库时出现错误，请在终端运行以下命令：

```
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

```

安装好 Flathub 仓库后，你需要做的就是在 GNOME 软件中心搜索 Steam。找到后，安装它，你就可以开始玩了。

Flathub 版本的 Steam 也有几个附加组件可以安装。其中包括一个 DOS 兼容工具和几个 [Vulkan](https://developer.nvidia.com/vulkan) 和 Proton 工具。

我想这应该可以帮助你在 Fedora 上使用 Steam。享受你的游戏 :smiley:

---

via: <https://itsfoss.com/install-steam-fedora/>

作者：[John Paul](https://itsfoss.com/author/john/) 选题：[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/) 荣誉推出


硬核观察 | Slackware 还活着，准备发布 15.0

Summary: 更多：• 谷歌 Project Zero 团队调整漏洞披露时限 • 世界首位官方认证半机械人出现

# 硬核观察 | Slackware 还活着，准备发布 15.0

### Slackware 还活着，准备发布 15.0

Slackware 是至今仍在维护的历史最悠久的 Linux 发行版。它的上一个稳定版本 [Slackware 14.2 还是在 2016 年发布的](http://www.slackware.com/index.html)。最近，它刚刚发布了 15.0 Beta。主要[变化](https://www.debugpoint.com/2021/04/slackware-15-0-beta/)包括：KDE Plasma 5.21、Xfce 4.16 和 GNOME 3.36/3.38，内核版本为 Linux Kernel 5.10.x。

天哪，居然又复活了，这是我用过的第一个 Linux 发行版，第一次安装时我遇到了 LILO 错误：满屏幕的 01010101…… 而不知所措。

### 谷歌 Project Zero 团队调整漏洞披露时限

之前，谷歌 Project Zero 的研究人员会给软件厂商 90 天的时间来修复安全漏洞。当 bug 被修复后，或者在 90 天时间窗口结束时，谷歌研究人员会在网上公布漏洞的细节。[新的时限](https://googleprojectzero.blogspot.com/2021/04/policy-and-disclosure-2021-edition.html)为每次安全漏洞披露增加了 30 天的缓冲期，这样终端用户就有足够的时间来修补软件。此外，对于已经被主动利用的零日漏洞，也在原有的 7 天的基础上增加了 3 天。

其实，有时候你就是给厂商再多时间，它也不着急，不到 DeadLine 不着急。

### 世界首位官方认证半机械人出现

一位出生时便患有严重的色盲症的男子，看到的世界都是黑白的，成为了世界上第一位头骨植入天线的人，也是政府合法认可与批准的改造人。通过在头骨中植入了天线扩充色彩感知的传感系统，使得他可以通过天线振动频率来感觉不同的色彩，甚至是普通人看不到的红外线紫外线等元素。他在手术之后，大约用了 5 周时间将每种颜色与每种声音相匹配，又用了 5 个月时间破译每种频率，现在他已经可以通过声音“听出”特定的颜色，弥补了他人生之中的最大遗憾。

科幻小说和现实的距离越来越近了……


用开源的 VeraCrypt 加密你的文件

Summary: VeraCrypt 提供跨平台的开源文件加密功能。

VeraCrypt 提供跨平台的开源文件加密功能。

# 用开源的 VeraCrypt 加密你的文件

>
>  VeraCrypt 提供跨平台的开源文件加密功能。
>
>
>

许多年前，有一个名为 [TrueCrypt](https://en.wikipedia.org/wiki/TrueCrypt) 的加密软件。它的源码是可以得到的，尽管没有任何人声称曾对它进行过审计或贡献过。它的作者是（至今仍是）匿名的。不过，它是跨平台的，易于使用，而且真的非常有用。

TrueCrypt 允许你创建一个加密的文件“保险库”，在那里你可以存储任何类型的敏感信息（文本、音频、视频、图像、PDF 等）。只要你有正确的口令，TrueCrypt 就可以解密保险库，并在任何运行 TrueCrypt 的电脑上提供读写权限。这是一项有用的技术，它基本上提供了一个虚拟的、可移动的、完全加密的驱动器（除了文件以外），你可以在其中安全地存储你的数据。

TrueCrypt 最终关闭了，但一个名为 VeraCrypt 的替代项目迅速兴起，填补了这一空白。[VeraCrypt](https://www.veracrypt.fr/en/Home.html) 基于 TrueCrypt 7.1a，比原来的版本有许多改进（包括标准加密卷和引导卷的算法的重大变化）。在 VeraCrypt 1.12 及以后的版本中，你可以使用自定义迭代来提高加密安全性。更好的是，VeraCrypt 可以加载旧的 TrueCrypt 卷，所以如果你是 TrueCrypt 用户，可以很容易地将它们转移到 VeraCrypt 上。

### 安装 VeraCrypt

你可以从 [VeraCrypt 下载页面](https://www.veracrypt.fr/en/Downloads.html) 下载相应的安装文件，之后在所有主流平台上安装 VeraCrypt。

另外，你也可以自己从源码构建它。在 Linux 上，它需要 wxGTK3、makeself 和通常的开发栈（Binutils、GCC 等）。

当你安装后，从你的应用菜单中启动 VeraCrypt。

### 创建一个 VeraCrypt 卷

如果你刚接触 VeraCrypt，你必须先创建一个 VeraCrypt 加密卷（否则，你没有任何东西可以解密）。在 VeraCrypt 窗口中，点击左侧的 “Create Volume” 按钮。

在出现的 VeraCrypt 的卷创建向导窗口中，选择要创建一个加密文件容器还是要加密整个驱动器或分区。向导将为你的数据创建一个保险库，所以请按照提示进行操作。

在本文中，我创建了一个文件容器。VeraCrypt 容器和其他文件很像：它保存在硬盘、外置硬盘、云存储或其他任何你能想到的存储数据的地方。与其他文件一样，它可以被移动、复制和删除。与大多数其他文件不同的是，它可以\_容纳\_更多的文件，这就是为什么我认为它是一个“保险库”，而 VeraCrypt 开发者将其称为“容器”。它的开发者将 VeraCrypt 文件称为“容器”，是因为它可以包含其他数据对象；它与 LXC、Kubernetes 和其他现代 IT 机制所流行的容器技术无关。

#### 选择一个文件系统

在创建卷的过程中，你会被要求选择一个文件系统来决定你放在保险库中的文件的存储方式。微软 FAT 格式是过时的、非日志型，并且限制了卷和文件的大小，但它是所有平台都能读写的一种格式。如果你打算让你的 VeraCrypt 保险库跨平台，FAT 是你最好的选择。

除此之外，NTFS 适用于 Windows 和 Linux。开源的 EXT 系列适用于 Linux。

### 挂载 VeraCrypt 加密卷

当你创建了 VeraCrypt 卷，你就可以在 VeraCrypt 窗口中加载它。要挂载一个加密库，点击右侧的 “Select File” 按钮。选择你的加密文件，选择 VeraCrypt 窗口上半部分的一个编号栏，然后点击位于 VeraCrypt 窗口左下角的 “Mount” 按钮。

你挂载的卷在 VeraCrypt 窗口的可用卷列表中，你可以通过文件管理器访问该卷，就像访问一个外部驱动器一样。例如，在 KDE 上，我打开 [Dolphin](https://en.wikipedia.org/wiki/Dolphin_%28file_manager%29)，进入 `/media/veracrypt1`，然后我就可以把文件复制到我的保险库里。

只要你的设备上有 VeraCrypt，你就可以随时访问你的保险库。在你手动在 VeraCrypt 中挂载之前，文件都是加密的，在那里，文件会保持解密，直到你再次关闭卷。

### 关闭 VeraCrypt 卷

为了保证你的数据安全，当你不需要打开 VeraCrypt 卷时，关闭它是很重要的。这样可以保证数据的安全，不被人窥视，且不被人趁机犯罪。

关闭 VeraCrypt 容器和打开容器一样简单。在 VeraCrypt 窗口中选择列出的卷，然后点击 “Dismount”。你就不能访问保险库中的文件了，其他人也不会再有访问权。

### VeraCrypt 轻松实现跨平台加密

有很多方法可以保证你的数据安全，VeraCrypt 试图为你提供方便，而无论你需要在什么平台上使用这些数据。如果你想体验简单、开源的文件加密，请尝试 VeraCrypt。

---

via: <https://opensource.com/article/21/4/open-source-encryption>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[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/) 荣誉推出


我使用 Git cherry-pick 命令的 3 个理由

Summary: “遴选”可以解决 Git 仓库中的很多问题。以下是用 git cherry-pick 修复错误的三种方法。

# 我使用 Git cherry-pick 命令的 3 个理由

>
> “遴选”可以解决 Git 仓库中的很多问题。以下是用 `git cherry-pick` 修复错误的三种方法。
>
>
>

<img src="content_image/album_202104_17_174429qw1im6if6mf6zi9i.jpg" alt="" title="Measuring and baking a cherry pie recipe">

在版本控制系统中摸索前进是一件很棘手的事情。对于一个新手来说，这可能是非常难以应付的，但熟悉版本控制系统（如 Git）的术语和基础知识是开始为开源贡献的第一步。

熟悉 Git 也能帮助你在开源之路上走出困境。Git 功能强大，让你感觉自己在掌控之中 —— 没有哪一种方法会让你无法恢复到工作版本。

这里有一个例子可以帮助你理解“<ruby> 遴选 <rt>  cherry-pick </rt></ruby>”的重要性。假设你已经在一个分支上做了好几个提交，但你意识到这是个错误的分支！你现在该怎么办？你现在要做什么？要么在正确的分支上重复所有的变更，然后重新提交，要么把这个分支合并到正确的分支上。等一下，前者太过繁琐，而你可能不想做后者。那么，还有没有办法呢？有的，Git 已经为你准备好了。这就是“遴选”的作用。顾名思义，你可以用它从一个分支中手工遴选一个提交，然后转移到另一个分支。

使用遴选的原因有很多。以下是其中的三个原因。

### 避免重复性工作

如果你可以直接将相同的提交复制到另一个分支，就没有必要在不同的分支中重做相同的变更。请注意，遴选出来的提交会在另一个分支中创建带有新哈希的新提交，所以如果你看到不同的提交哈希，请不要感到困惑。

如果您想知道什么是提交的哈希，以及它是如何生成的，这里有一个说明可以帮助你。提交哈希是用 [SHA-1](https://en.wikipedia.org/wiki/SHA-1) 算法生成的字符串。SHA-1 算法接收一个输入，然后输出一个唯一的 40 个字符的哈希值。如果你使用的是 [POSIX](https://opensource.com/article/19/7/what-posix-richard-stallman-explains) 系统，请尝试在您的终端上运行这个命令：

```
$ echo -n "commit" | openssl sha1

```

这将输出一个唯一的 40 个字符的哈希值 `4015b57a143aec5156fd1444a017a32137a3fd0f`。这个哈希代表了字符串 `commit`。

Git 在提交时生成的 SHA-1 哈希值不仅仅代表一个字符串。它代表的是：

```
sha1(
    meta data
        commit message
        committer
        commit date
        author
        authoring date
    Hash of the entire tree object
)

```

这就解释了为什么你对代码所做的任何细微改动都会得到一个独特的提交哈希值。哪怕是一个微小的改动都会被发现。这是因为 Git 具有完整性。

### 撤销/恢复丢失的更改

当你想恢复到工作版本时，遴选就很方便。当多个开发人员在同一个代码库上工作时，很可能会丢失更改，最新的版本会被转移到一个陈旧的或非工作版本上。这时，遴选提交到工作版本就可以成为救星。

#### 它是如何工作的？

假设有两个分支：`feature1` 和 `feature2`，你想把 `feature1` 中的提交应用到 `feature2`。

在 `feature1` 分支上，运行 `git log` 命令，复制你想遴选的提交哈希值。你可以看到一系列类似于下面代码示例的提交。`commit` 后面的字母数字代码就是你需要复制的提交哈希。为了方便起见，您可以选择复制前六个字符（本例中为 `966cf3`）。

```
commit 966cf3d08b09a2da3f2f58c0818baa37184c9778 (HEAD -> master)
Author: manaswinidas <me@example.com>
Date:   Mon Mar 8 09:20:21 2021 +1300

   add instructions

```

然后切换到 `feature2` 分支，在刚刚从日志中得到的哈希值上运行 `git cherry-pick`：

```
$ git checkout feature2
$ git cherry-pick 966cf3.

```

如果该分支不存在，使用 `git checkout -b feature2` 来创建它。

这里有一个问题。你可能会遇到下面这种情况：

```
$ git cherry-pick 966cf3
On branch feature2
You are currently cherry-picking commit 966cf3d.

nothing to commit, working tree clean
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

   git commit --allow-empty

Otherwise, please use 'git reset'

```

不要惊慌。只要按照建议运行 `git commit --allow-empty`：

```
$ git commit --allow-empty
[feature2 afb6fcb] add instructions
Date: Mon Mar 8 09:20:21 2021 +1300

```

这将打开你的默认编辑器，允许你编辑提交信息。如果你没有什么要补充的，可以保存现有的信息。

就这样，你完成了你的第一次遴选。如上所述，如果你在分支 `feature2` 上运行 `git log`，你会看到一个不同的提交哈希。下面是一个例子：

```
commit afb6fcb87083c8f41089cad58deb97a5380cb2c2 (HEAD -> feature2)
Author: manaswinidas <[me@example.com][4]>
Date:   Mon Mar 8 09:20:21 2021 +1300
   add instructions

```

不要对不同的提交哈希感到困惑。这只是区分 `feature1` 和 `feature2` 的提交。

### 遴选多个提交

但如果你想遴选多个提交的内容呢？你可以使用：

```
git cherry-pick <commit-hash1> <commit-hash2>... <commit-hashn>

```

请注意，你不必使用整个提交的哈希值，你可以使用前五到六个字符。

同样，这也是很繁琐的。如果你想遴选的提交是一系列的连续提交呢？这种方法太费劲了。别担心，有一个更简单的方法。

假设你有两个分支：

* `feature1` 包括你想复制的提交（从更早的 `commitA` 到 `commitB`）。
* `feature2` 是你想把提交从 `feature1` 转移到的分支。

然后：

1. 输入 `git checkout <feature1>`。
2. 获取 `commitA` 和 `commitB` 的哈希值。
3. 输入 `git checkout <branchB>`。
4. 输入 `git cherry-pick <commitA>^..<commitB>` （请注意，这包括 `commitA` 和 `commitB`）。
5. 如果遇到合并冲突，[像往常一样解决](https://opensource.com/article/20/4/git-merge-conflict)，然后输入 `git cherry-pick --continue` 恢复遴选过程。

### 重要的遴选选项

以下是 [Git 文档](https://git-scm.com/docs/git-cherry-pick) 中的一些有用的选项，你可以在 `cherry-pick` 命令中使用。

* `-e`、`--edit`：用这个选项，`git cherry-pick` 可以让你在提交前编辑提交信息。
* `-s`、`--signoff`：在提交信息的结尾添加 `Signed-off by` 行。更多信息请参见 `git-commit(1)` 中的 signoff 选项。
* `-S[<keyid>]`、`--pgg-sign[=<keyid>]`：这些是 GPG 签名的提交。`keyid` 参数是可选的，默认为提交者身份；如果指定了，则必须嵌在选项中，不加空格。
* `--ff`：如果当前 HEAD 与遴选的提交的父级提交相同，则会对该提交进行快进操作。

下面是除了 `--continue` 外的一些其他的后继操作子命令：

* `--quit`：你可以忘记当前正在进行的操作。这可以用来清除遴选或撤销失败后的后继操作状态。
* `--abort`：取消操作并返回到操作序列前状态。

下面是一些关于遴选的例子：

* `git cherry-pick master`：应用 `master` 分支顶端的提交所引入的变更，并创建一个包含该变更的新提交。
* `git cherry-pick master~4 master~2'：应用`master` 指向的第五个和第三个最新提交所带来的变化，并根据这些变化创建两个新的提交。

感到不知所措？你不需要记住所有的命令。你可以随时在你的终端输入 `git cherry-pick --help` 查看更多选项或帮助。

---

via: <https://opensource.com/article/21/3/git-cherry-pick>

作者：[Manaswini Das](https://opensource.com/users/manaswinidas) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


硬核观察 | LLVM 12 已释出 3 天，但是连发布公告都没写完

Summary: 更多：• Firefox 88 将停止支持 FTP • 近三万家企业使用的代码覆盖量软件陷入软件供应链黑客事件

LLVM: 懂的都懂

# 硬核观察 | LLVM 12 已释出 3 天，但是连发布公告都没写完

### LLVM 12 已释出 3 天，但是连发布公告都没写完

LLVM 编译器套装项目是一个已经有 18 年历史的重要项目，其更新也算活跃，在很多方面都已经超过了 GCC。4 月 14 日，LLVM 释出了最新的 12.0.0。主要新特性和变化可以参见发布公告。然而，[发布公告](https://releases.llvm.org/12.0.0/docs/ReleaseNotes.html)还没编写完。

没料到 LLVM 在文档更新方面居然拖拖拉拉的，这是觉得没人看么，还是懂的人自然懂？

### Firefox 88 将停止支持 FTP

Mozilla 是在去年宣布它计划从浏览器中移除内置的 FTP 实现。即在 4 月 19 日释出的 Firefox 88 将[关闭 FTP 实现](https://blog.mozilla.org/addons/2021/04/15/built-in-ftp-implementation-to-be-removed-in-firefox-90/)，在 Firefox 90 将移除 FTP。在停止支持之后，浏览器将会用外部应用打开 ftp:// 链接。

在 Chrome 之后，Firefox 也将停止支持 FTP 协议。这种老旧的网络协议其实是该逐渐淘汰了，虽然更老的协议如 TFTP 依旧在很狭窄的场景中有使用。

### 近三万家企业使用的代码覆盖量软件陷入软件供应链黑客事件

Codecov 被认为是科技行业衡量代码覆盖率的首选厂商。该公司的工具可以帮助开发人员了解和测量测试套件执行的代码行数，并被广泛部署在大型科技企业的开发管道中。该公司宣称，有超过 29000 家企业使用其代码覆盖率洞察力来检查代码质量和维护代码覆盖率。

该公司表示，该[黑客事件](https://www.securityweek.com/codecov-bash-uploader-dev-tool-compromised-supply-chain-hack)发生在四个月前，但直到 2021 年 4 月 1 日才被 Codecov 的一位客户在野发现。其 Bash Uploader 脚本的被替换版本可能导致任何通过 CI 运行器传递的凭证、令牌或密钥被泄露。

软件行业越来越全球化，形成了一条条供应链，在这个链条中任何一个环节出现的问题，都可能通过链条进行放大。对供应链的管理，需要更有预防和响应机制。


使用 systemd 定时器代替 cron 作业

Summary: 定时器提供了比 cron 作业更为细粒度的事件控制。

RHEL7下执行最后一条命令报错

systemd-analyze calendar --iterations=5 '*-2-29 0:0:0'

错误：

systemd-analyze: unrecognized option '--iterations=5'

这个是为什么呢？

定时器提供了比 cron 作业更为细粒度的事件控制。

# 使用 systemd 定时器代替 cron 作业

>
> 定时器提供了比 cron 作业更为细粒度的事件控制。
>
>
>

<img src="content_image/album_202104_18_104406dgszkj3eeibkea55.jpg" alt="" title="Team checklist">

我正在致力于将我的 [cron](https://opensource.com/article/17/11/how-use-cron-linux) 作业迁移到 systemd 定时器上。我已经使用定时器多年了，但通常来说，我的学识只足以支撑我当前的工作。但在我研究 [systemd 系列](https://opensource.com/users/dboth) 的过程中，我发现 systemd 定时器有一些非常有意思的能力。

与 cron 作业类似，systemd 定时器可以在特定的时间间隔触发事件（shell 脚本和程序），例如每天一次或在一个月中的特定某一天（或许只有在周一生效），或在从上午 8 点到下午 6 点的工作时间内每隔 15 分钟一次。定时器也可以做到 cron 作业无法做到的一些事情。举个例子，定时器可以在特定事件发生后的一段时间后触发一段脚本或者程序去执行，例如开机、启动、上个任务完成，甚至于定时器调用的上个服务单元的完成的时刻。

### 操作系统维护的计时器

当在一个新系统上安装 Fedora 或者是任意一个基于 systemd 的发行版时，作为系统维护过程的一部分，它会在 Linux 宿主机的后台中创建多个定时器。这些定时器会触发事件来执行必要的日常维护任务，比如更新系统数据库、清理临时目录、轮换日志文件，以及更多其他事件。

作为示例，我会查看一些我的主要工作站上的定时器，通过执行 `systemctl status *timer` 命令来展示主机上的所有定时器。星号的作用与文件通配相同，所以这个命令会列出所有的 systemd 定时器单元。

```
[root@testvm1 ~]# systemctl status *timer
● mlocate-updatedb.timer - Updates mlocate database every day
     Loaded: loaded (/usr/lib/systemd/system/mlocate-updatedb.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
    Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
   Triggers: ● mlocate-updatedb.service

Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Updates mlocate database every day.

● logrotate.timer - Daily rotation of log files
     Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
    Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
   Triggers: ● logrotate.service
       Docs: man:logrotate(8)
             man:logrotate.conf(5)

Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily rotation of log files.

● sysstat-summary.timer - Generate summary of yesterday's process accounting
     Loaded: loaded (/usr/lib/systemd/system/sysstat-summary.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
    Trigger: Fri 2020-06-05 00:07:00 EDT; 15h left
   Triggers: ● sysstat-summary.service

Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Generate summary of yesterday's process accounting.

● fstrim.timer - Discard unused blocks once a week
     Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
    Trigger: Mon 2020-06-08 00:00:00 EDT; 3 days left
   Triggers: ● fstrim.service
       Docs: man:fstrim

Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Discard unused blocks once a week.

● sysstat-collect.timer - Run system activity accounting tool every 10 minutes
     Loaded: loaded (/usr/lib/systemd/system/sysstat-collect.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
    Trigger: Thu 2020-06-04 08:50:00 EDT; 41s left
   Triggers: ● sysstat-collect.service

Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Run system activity accounting tool every 10 minutes.

● dnf-makecache.timer - dnf makecache --timer
     Loaded: loaded (/usr/lib/systemd/system/dnf-makecache.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
    Trigger: Thu 2020-06-04 08:51:00 EDT; 1min 41s left
   Triggers: ● dnf-makecache.service

Jun 02 08:02:33 testvm1.both.org systemd[1]: Started dnf makecache –timer.

● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
     Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
     Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
    Trigger: Fri 2020-06-05 08:19:00 EDT; 23h left
   Triggers: ● systemd-tmpfiles-clean.service
       Docs: man:tmpfiles.d(5)
             man:systemd-tmpfiles(8)

Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily Cleanup of Temporary Directories.

```

每个定时器至少有六行相关信息：

* 定时器的第一行有定时器名字和定时器目的的简短介绍
* 第二行展示了定时器的状态，是否已加载，定时器单元文件的完整路径以及预设信息。
* 第三行指明了其活动状态，包括该定时器激活的日期和时间。
* 第四行包括了该定时器下次被触发的日期和时间和距离触发的大概时间。
* 第五行展示了被定时器触发的事件或服务名称。
* 部分（不是全部）systemd 单元文件有相关文档的指引。我虚拟机上输出中有三个定时器有文档指引。这是一个很好（但非必要）的信息。
* 最后一行是计时器最近触发的服务实例的日志条目。

你也许有一些不一样的定时器，取决于你的主机。

### 创建一个定时器

尽管我们可以解构一个或多个现有的计时器来了解其工作原理，但让我们创建我们自己的 [服务单元](https://opensource.com/article/20/5/manage-startup-systemd) 和一个定时器去触发它。为了保持简单，我们将使用一个相当简单的例子。当我们完成这个实验之后，就能更容易理解其他定时器的工作原理以及发现它们正在做什么。

首先，创建一个运行基础东西的简单的服务，例如 `free` 命令。举个例子，你可能想定时监控空余内存。在 `/etc/systemd/system` 目录下创建如下的 `myMonitor.server` 单元文件。它不需要是可执行文件：

```
# This service unit is for testing timer units
# By David Both
# Licensed under GPL V2
#

[Unit]
Description=Logs system statistics to the systemd journal
Wants=myMonitor.timer

[Service]
Type=oneshot
ExecStart=/usr/bin/free

[Install]
WantedBy=multi-user.target

```

这大概是你能创建的最简单的服务单元了。现在我们查看一下服务状态同时测试一下服务单元确保它和我们预期一样可用。

```
[root@testvm1 system]# systemctl status myMonitor.service
● myMonitor.service - Logs system statistics to the systemd journal
     Loaded: loaded (/etc/systemd/system/myMonitor.service; disabled; vendor preset: disabled)
     Active: inactive (dead)
[root@testvm1 system]# systemctl start myMonitor.service
[root@testvm1 system]#

```

输出在哪里呢？默认情况下，systemd 服务单元执行程序的标准输出（`STDOUT`）会被发送到系统日志中，它保留了记录供现在或者之后（直到某个时间点）查看。（在本系列的后续文章中，我将介绍系统日志的记录和保留策略）。专门查看你的服务单元的日志，而且只针对今天。`-S` 选项，即 `--since` 的缩写，允许你指定 `journalctl` 工具搜索条目的时间段。这并不代表你不关心过往结果 —— 在这个案例中，不会有过往记录 —— 如果你的机器以及运行了很长时间且堆积了大量的日志，它可以缩短搜索时间。

```
[root@testvm1 system]# journalctl -S today -u myMonitor.service
-- Logs begin at Mon 2020-06-08 07:47:20 EDT, end at Thu 2020-06-11 09:40:47 EDT. --
Jun 11 09:12:09 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 11 09:12:09 testvm1.both.org free[377966]:               total        used        free      shared  buff/cache   available
Jun 11 09:12:09 testvm1.both.org free[377966]: Mem:       12635740      522868    11032860        8016     1080012    11821508
Jun 11 09:12:09 testvm1.both.org free[377966]: Swap:       8388604           0     8388604
Jun 11 09:12:09 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
[root@testvm1 system]#

```

由服务触发的任务可以是单个程序、一组程序或者是一个脚本语言写的脚本。通过在 `myMonitor.service` 单元文件里的 `[Service]` 块末尾中添加如下行可以为服务添加另一个任务：

```
ExecStart=/usr/bin/lsblk

```

再次启动服务，查看日志检查结果，结果应该看上去像这样。你应该在日志中看到两条命令的结果输出：

```
Jun 11 15:42:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 11 15:42:18 testvm1.both.org free[379961]:               total        used        free      shared  buff/cache   available
Jun 11 15:42:18 testvm1.both.org free[379961]: Mem:       12635740      531788    11019540        8024     1084412    11812272
Jun 11 15:42:18 testvm1.both.org free[379961]: Swap:       8388604           0     8388604
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sda             8:0    0  120G  0 disk
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─sda1          8:1    0    4G  0 part /boot
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: └─sda2          8:2    0  116G  0 part
Jun 11 15:42:18 testvm1.both.org lsblk[379962]:   ├─VG01-root 253:0    0    5G  0 lvm  /
Jun 11 15:42:18 testvm1.both.org lsblk[379962]:   ├─VG01-swap 253:1    0    8G  0 lvm  [SWAP]
Jun 11 15:42:18 testvm1.both.org lsblk[379962]:   ├─VG01-usr  253:2    0   30G  0 lvm  /usr
Jun 11 15:42:18 testvm1.both.org lsblk[379962]:   ├─VG01-tmp  253:3    0   10G  0 lvm  /tmp
Jun 11 15:42:18 testvm1.both.org lsblk[379962]:   ├─VG01-var  253:4    0   20G  0 lvm  /var
Jun 11 15:42:18 testvm1.both.org lsblk[379962]:   └─VG01-home 253:5    0   10G  0 lvm  /home
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sr0            11:0    1 1024M  0 rom
Jun 11 15:42:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
Jun 11 15:42:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.

```

现在你知道了你的服务可以按预期工作了，在 `/etc/systemd/system` 目录下创建 `myMonitor.timer` 定时器单元文件，添加如下代码：

```
# This timer unit is for testing
# By David Both
# Licensed under GPL V2
#

[Unit]
Description=Logs some system statistics to the systemd journal
Requires=myMonitor.service

[Timer]
Unit=myMonitor.service
OnCalendar=*-*-* *:*:00

[Install]
WantedBy=timers.target

```

在 `myMonitor.timer` 文件中的 `OnCalendar` 时间格式，`*-*-* *:*:00`，应该会每分钟触发一次定时器去执行 `myMonitor.service` 单元。我会在文章的后面进一步探索 `OnCalendar` 设置。

到目前为止，在服务被计时器触发运行时观察与之有关的日志记录。你也可以跟踪计时器，跟踪服务可以让你接近实时的看到结果。执行 `journalctl` 时带上 `-f` 选项：

```
[root@testvm1 system]# journalctl -S today -f -u myMonitor.service
-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --

```

执行但是不启用该定时器，看看它运行一段时间后发生了什么：

```
[root@testvm1 ~]# systemctl start myMonitor.service
[root@testvm1 ~]#

```

一条结果立即就显示出来了，下一条大概在一分钟后出来。观察几分钟日志，看看你有没有跟我发现同样的事情：

```
[root@testvm1 system]# journalctl -S today -f -u myMonitor.service
-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --
Jun 13 08:39:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 13 08:39:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
Jun 13 08:39:19 testvm1.both.org free[630566]:               total        used        free      shared  buff/cache   available
Jun 13 08:39:19 testvm1.both.org free[630566]: Mem:       12635740      556604    10965516        8036     1113620    11785628
Jun 13 08:39:19 testvm1.both.org free[630566]: Swap:       8388604           0     8388604
Jun 13 08:39:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sda             8:0    0  120G  0 disk
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─sda1          8:1    0    4G  0 part /boot
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: └─sda2          8:2    0  116G  0 part
Jun 13 08:39:19 testvm1.both.org lsblk[630567]:   ├─VG01-root 253:0    0    5G  0 lvm  /
Jun 13 08:39:19 testvm1.both.org lsblk[630567]:   ├─VG01-swap 253:1    0    8G  0 lvm  [SWAP]
Jun 13 08:39:19 testvm1.both.org lsblk[630567]:   ├─VG01-usr  253:2    0   30G  0 lvm  /usr
Jun 13 08:39:19 testvm1.both.org lsblk[630567]:   ├─VG01-tmp  253:3    0   10G  0 lvm  /tmp
Jun 13 08:39:19 testvm1.both.org lsblk[630567]:   ├─VG01-var  253:4    0   20G  0 lvm  /var
Jun 13 08:39:19 testvm1.both.org lsblk[630567]:   └─VG01-home 253:5    0   10G  0 lvm  /home
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sr0            11:0    1 1024M  0 rom
Jun 13 08:40:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 13 08:40:46 testvm1.both.org free[630572]:               total        used        free      shared  buff/cache   available
Jun 13 08:40:46 testvm1.both.org free[630572]: Mem:       12635740      555228    10966836        8036     1113676    11786996
Jun 13 08:40:46 testvm1.both.org free[630572]: Swap:       8388604           0     8388604
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sda             8:0    0  120G  0 disk
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─sda1          8:1    0    4G  0 part /boot
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: └─sda2          8:2    0  116G  0 part
Jun 13 08:40:46 testvm1.both.org lsblk[630574]:   ├─VG01-root 253:0    0    5G  0 lvm  /
Jun 13 08:40:46 testvm1.both.org lsblk[630574]:   ├─VG01-swap 253:1    0    8G  0 lvm  [SWAP]
Jun 13 08:40:46 testvm1.both.org lsblk[630574]:   ├─VG01-usr  253:2    0   30G  0 lvm  /usr
Jun 13 08:40:46 testvm1.both.org lsblk[630574]:   ├─VG01-tmp  253:3    0   10G  0 lvm  /tmp
Jun 13 08:40:46 testvm1.both.org lsblk[630574]:   ├─VG01-var  253:4    0   20G  0 lvm  /var
Jun 13 08:40:46 testvm1.both.org lsblk[630574]:   └─VG01-home 253:5    0   10G  0 lvm  /home
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sr0            11:0    1 1024M  0 rom
Jun 13 08:40:46 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
Jun 13 08:40:46 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
Jun 13 08:41:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 13 08:41:46 testvm1.both.org free[630580]:               total        used        free      shared  buff/cache   available
Jun 13 08:41:46 testvm1.both.org free[630580]: Mem:       12635740      553488    10968564        8036     1113688    11788744
Jun 13 08:41:46 testvm1.both.org free[630580]: Swap:       8388604           0     8388604
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sda             8:0    0  120G  0 disk
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─sda1          8:1    0    4G  0 part /boot
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: └─sda2          8:2    0  116G  0 part
Jun 13 08:41:47 testvm1.both.org lsblk[630581]:   ├─VG01-root 253:0    0    5G  0 lvm  /
Jun 13 08:41:47 testvm1.both.org lsblk[630581]:   ├─VG01-swap 253:1    0    8G  0 lvm  [SWAP]
Jun 13 08:41:47 testvm1.both.org lsblk[630581]:   ├─VG01-usr  253:2    0   30G  0 lvm  /usr
Jun 13 08:41:47 testvm1.both.org lsblk[630581]:   ├─VG01-tmp  253:3    0   10G  0 lvm  /tmp
Jun 13 08:41:47 testvm1.both.org lsblk[630581]:   ├─VG01-var  253:4    0   20G  0 lvm  /var
Jun 13 08:41:47 testvm1.both.org lsblk[630581]:   └─VG01-home 253:5    0   10G  0 lvm  /home
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sr0            11:0    1 1024M  0 rom
Jun 13 08:41:47 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
Jun 13 08:41:47 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.

```

别忘了检查下计时器和服务的状态。

你在日志里大概至少注意到两件事。第一，你不需要特地做什么来让 `myMonitor.service` 单元中 `ExecStart` 触发器产生的 `STDOUT` 存储到日志里。这都是用 systemd 来运行服务的一部分功能。然而，它确实意味着你需要小心对待服务单元里面执行的脚本和它们能产生多少 `STDOUT`。

第二，定时器并不是精确在每分钟的 :00 秒执行的，甚至每次执行的时间间隔都不是刚好一分钟。这是特意的设计，但是有必要的话可以改变这种行为（如果只是它挑战了你的系统管理员的敏感神经）。

这样设计的初衷是为了防止多个服务在完全相同的时刻被触发。举个例子，你可以用例如 Weekly，Daily 等时间格式。这些快捷写法都被定义为在某一天的 00:00:00 执行。当多个定时器都这样定义的话，有很大可能它们会同时执行。

systemd 定时器被故意设计成在规定时间附近随机波动的时间点触发，以避免同一时间触发。它们在一个时间窗口内半随机触发，时间窗口开始于预设的触发时间，结束于预设时间后一分钟。根据 `systemd.timer` 的手册页，这个触发时间相对于其他已经定义的定时器单元保持在稳定的位置。你可以在日志条目中看到，定时器在启动后立即触发，然后在每分钟后的 46 或 47 秒触发。

大部分情况下，这种概率抖动的定时器是没事的。当调度类似执行备份的任务，只需要它们在下班时间运行，这样是没问题的。系统管理员可以选择确定的开始时间来确保不和其他任务冲突，例如 01:05:00 这样典型的 cron 作业时间，但是有很大范围的时间值可以满足这一点。在开始时间上的一个分钟级别的随机往往是无关紧要的。

然而，对某些任务来说，精确的触发时间是个硬性要求。对于这类任务，你可以向单元文件的 `Timer` 块中添加如下声明来指定更高的触发时间跨度精确度（精确到微秒以内）：

```
AccuracySec=1us

```

时间跨度可用于指定所需的精度，以及定义重复事件或一次性事件的时间跨度。它能识别以下单位：

* `usec`，`us`，`µs`
* `msec`，`ms`
* `seconds`，`second`，`sec`，`s`
* `minutes`，`minute`，`min`，`m`
* `hours`，`hour`，`hr`，`h`
* `days`，`day`，`d`
* `weeks`，`week`，`w`
* `months`，`month`，`M`（定义为 30.44 天）
* `years`，`year`，`y`（定义为 365.25 天）

所有 `/usr/lib/systemd/system` 中的定时器都指定了一个更宽松的时间精度，因为精准时间没那么重要。看看这些系统创建的定时器的时间格式：

```
[root@testvm1 system]# grep Accur /usr/lib/systemd/system/*timer
/usr/lib/systemd/system/fstrim.timer:AccuracySec=1h
/usr/lib/systemd/system/logrotate.timer:AccuracySec=1h
/usr/lib/systemd/system/logwatch.timer:AccuracySec=12h
/usr/lib/systemd/system/mlocate-updatedb.timer:AccuracySec=24h
/usr/lib/systemd/system/raid-check.timer:AccuracySec=24h
/usr/lib/systemd/system/unbound-anchor.timer:AccuracySec=24h
[root@testvm1 system]#

```

看下 `/usr/lib/systemd/system` 目录下部分定时器单元文件的完整内容，看看它们是如何构建的。

在本实验中不必让这个定时器在启动时激活，但下面这个命令可以设置开机自启：

```
[root@testvm1 system]# systemctl enable myMonitor.timer

```

你创建的单元文件不需要是可执行的。你同样不需要启用服务，因为它是被定时器触发的。如果你需要的话，你仍然可以在命令行里手动触发该服务单元。尝试一下，然后观察日志。

关于定时器精度、事件时间规格和触发事件的详细信息，请参见 systemd.timer 和 systemd.time 的手册页。

### 定时器类型

systemd 定时器还有一些在 cron 中找不到的功能，cron 只在确定的、重复的、具体的日期和时间触发。systemd 定时器可以被配置成根据其他 systemd 单元状态发生改变时触发。举个例子，定时器可以配置成在系统开机、启动后，或是某个确定的服务单元激活之后的一段时间被触发。这些被称为单调计时器。“单调”指的是一个持续增长的计数器或序列。这些定时器不是持久的，因为它们在每次启动后都会重置。

表格 1 列出了一些单调定时器以及每个定时器的简短定义，同时有 `OnCalendar` 定时器，这些不是单调的，它们被用于指定未来有可能重复的某个确定时间。这个信息来自于 `systemd.timer` 的手册页，有一些不重要的修改。

| 定时器 | 单调性 | 定义 |
| --- | --- | --- |
| `OnActiveSec=` | X | 定义了一个与定时器被激活的那一刻相关的定时器。 |
| `OnBootSec=` | X | 定义了一个与机器启动时间相关的计时器。 |
| `OnStartupSec=` | X | 定义了一个与服务管理器首次启动相关的计时器。对于系统定时器来说，这个定时器与 `OnBootSec=` 类似，因为系统服务管理器在机器启动后很短的时间后就会启动。当以在每个用户服务管理器中运行的单元进行配置时，它尤其有用，因为用户的服务管理器通常在首次登录后启动，而不是机器启动后。 |
| `OnUnitActiveSec=` | X | 定义了一个与将要激活的定时器上次激活时间相关的定时器。 |
| `OnUnitInactiveSec=` | X | 定义了一个与将要激活的定时器上次停用时间相关的定时器。 |
| `OnCalendar=` |  | 定义了一个有日期事件表达式语法的实时（即时钟）定时器。查看 `systemd.time(7)` 的手册页获取更多与日历事件表达式相关的语法信息。除此以外，它的语义和 `OnActiveSec=` 类似。 |

*Table 1: systemd 定时器定义*

单调计时器可使用同样的简写名作为它们的时间跨度，即我们之前提到的 `AccuracySec` 表达式，但是 systemd 将这些名字统一转换成了秒。举个例子，比如你想规定某个定时器在系统启动后五天触发一次事件；它可能看起来像 `OnBootSec=5d`。如果机器启动于 `2020-06-15 09:45:27`，这个定时器会在 `2020-06-20 09:45:27` 或在这之后的一分钟内触发。

### 日历事件格式

日历事件格式是定时器在所需的重复时间触发的关键。我们开始看下一些 `OnCalendar` 设置一起使用的格式。

与 crontab 中的格式相比，systemd 及其计时器使用的时间和日历格式风格不同。它比 crontab 更为灵活，而且可以使用类似 `at` 命令的方式允许模糊的日期和时间。它还应该足够熟悉使其易于理解。

systemd 定时器使用 `OnCalendar=` 的基础格式是 `DOW YYYY-MM-DD HH:MM:SS`。DOW（星期几）是选填的，其他字段可以用一个星号（`*`）来匹配此位置的任意值。所有的日历时间格式会被转换成标准格式。如果时间没有指定，它会被设置为 `00:00:00`。如果日期没有指定但是时间指定了，那么下次匹配的时间可能是今天或者明天，取决于当前的时间。月份和星期可以使用名称或数字。每个单元都可以使用逗号分隔的列表。单元范围可以在开始值和结束值之间用 `..` 指定。

指定日期有一些有趣的选项，波浪号（`~`）可以指定月份的最后一天或者最后一天之前的某几天。`/` 可以用来指定星期几作为修饰符。

这里有几个在 `OnCalendar` 表达式中使用的典型时间格式例子。

| 日期事件格式 | 描述 |
| --- | --- |
| `DOW YYYY-MM-DD HH:MM:SS` |  |
| `*-*-* 00:15:30` | 每年每月每天的 0 点 15 分 30 秒 |
| `Weekly` | 每个周一的 00:00:00 |
| `Mon *-*-* 00:00:00` | 同上 |
| `Mon` | 同上 |
| `Wed 2020-*-*` | 2020 年每个周三的 00:00:00 |
| `Mon..Fri 2021-*-*` | 2021 年的每个工作日（周一到周五）的 00:00:00 |
| `2022-6,7,8-1,15 01:15:00` | 2022 年 6、7、8 月的 1 到 15 号的 01:15:00 |
| `Mon *-05~03` | 每年五月份的下个周一同时也是月末的倒数第三天 |
| `Mon..Fri *-08~04` | 任何年份 8 月末的倒数第四天，同时也须是工作日 |
| `*-05~03/2` | 五月末的倒数第三天，然后 2 天后再来一次。每年重复一次。注意这个表达式使用了波浪号（`~`）。 |
| `*-05-03/2` | 五月的第三天，然后每两天重复一次直到 5 月底。注意这个表达式使用了破折号（`-`）。 |

*Table 2: `OnCalendar` 事件时间格式例子*

### 测试日历格式

systemd 提供了一个绝佳的工具用于检测和测试定时器中日历时间事件的格式。`systemd-analyze calendar` 工具解析一个时间事件格式，提供标准格式和其他有趣的信息，例如下次“经过”（即匹配）的日期和时间，以及距离下次触发之前大概时间。

首先，看看未来没有时间的日（注意 `Next elapse` 和 `UTC` 的时间会根据你当地时区改变）:

```
[student@studentvm1 ~]$ systemd-analyze calendar 2030-06-17
  Original form: 2030-06-17
Normalized form: 2030-06-17 00:00:00
    Next elapse: Mon 2030-06-17 00:00:00 EDT
       (in UTC): Mon 2030-06-17 04:00:00 UTC
       From now: 10 years 0 months left
[root@testvm1 system]#

```

现在添加一个时间，在这个例子中，日期和时间是当作无关的部分分开解析的：

```
[root@testvm1 system]# systemd-analyze calendar 2030-06-17 15:21:16
  Original form: 2030-06-17
Normalized form: 2030-06-17 00:00:00
    Next elapse: Mon 2030-06-17 00:00:00 EDT
       (in UTC): Mon 2030-06-17 04:00:00 UTC
       From now: 10 years 0 months left

  Original form: 15:21:16
Normalized form: *-*-* 15:21:16
    Next elapse: Mon 2020-06-15 15:21:16 EDT
       (in UTC): Mon 2020-06-15 19:21:16 UTC
       From now: 3h 55min left
[root@testvm1 system]#

```

为了把日期和时间当作一个单元来分析，可以把它们包在引号里。你在定时器单元里 `OnCalendar=` 时间格式中使用的时候记得把引号去掉，否则会报错：

```
[root@testvm1 system]# systemd-analyze calendar "2030-06-17 15:21:16"
Normalized form: 2030-06-17 15:21:16
    Next elapse: Mon 2030-06-17 15:21:16 EDT
       (in UTC): Mon 2030-06-17 19:21:16 UTC
       From now: 10 years 0 months left
[root@testvm1 system]#

```

现在我们测试下 Table2 里的例子。我尤其喜欢最后一个：

```
[root@testvm1 system]# systemd-analyze calendar "2022-6,7,8-1,15 01:15:00"
  Original form: 2022-6,7,8-1,15 01:15:00
Normalized form: 2022-06,07,08-01,15 01:15:00
    Next elapse: Wed 2022-06-01 01:15:00 EDT
       (in UTC): Wed 2022-06-01 05:15:00 UTC
       From now: 1 years 11 months left
[root@testvm1 system]#

```

让我们看一个例子，这个例子里我们列出了时间表达式的五个经过时间。

```
[root@testvm1 ~]# systemd-analyze calendar --iterations=5 "Mon *-05~3"
  Original form: Mon *-05~3
Normalized form: Mon *-05~03 00:00:00
    Next elapse: Mon 2023-05-29 00:00:00 EDT
       (in UTC): Mon 2023-05-29 04:00:00 UTC
       From now: 2 years 11 months left
       Iter. #2: Mon 2028-05-29 00:00:00 EDT
       (in UTC): Mon 2028-05-29 04:00:00 UTC
       From now: 7 years 11 months left
       Iter. #3: Mon 2034-05-29 00:00:00 EDT
       (in UTC): Mon 2034-05-29 04:00:00 UTC
       From now: 13 years 11 months left
       Iter. #4: Mon 2045-05-29 00:00:00 EDT
       (in UTC): Mon 2045-05-29 04:00:00 UTC
       From now: 24 years 11 months left
       Iter. #5: Mon 2051-05-29 00:00:00 EDT
       (in UTC): Mon 2051-05-29 04:00:00 UTC
       From now: 30 years 11 months left
[root@testvm1 ~]#

```

这些应该为你提供了足够的信息去开始测试你的 `OnCalendar` 时间格式。`systemd-analyze` 工具可用于其他有趣的分析，我会在这个系列的下一篇文章来探索这些。

### 总结

systemd 定时器可以用于执行和 cron 工具相同的任务，但是通过按照日历和单调时间格式去触发事件的方法提供了更多的灵活性。

虽然你为此次实验创建的服务单元通常是由定时器调用的，你也可以随时使用 `systemctl start myMonitor.service` 命令去触发它。可以在一个定时器中编写多个维护任务的脚本；它们可以是 Bash 脚本或者其他 Linux 程序。你可以通过触发定时器来运行所有的脚本来运行服务，也可以按照需要执行单独的脚本。

我会在下篇文章中更加深入的探索 systemd 时间格式的用处。

我还没有看到任何迹象表明 cron 和 at 将被废弃。我希望这种情况不会发生，因为至少 `at` 在执行一次性调度任务的时候要比 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/)。

此外，还有一系列深度的技术文章，是由 systemd 的设计者和主要实现者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间，但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章：

* [Rethinking PID 1](http://0pointer.de/blog/projects/systemd.html)
* [systemd for Administrators，Part I](http://0pointer.de/blog/projects/systemd-for-admins-1.html)
* [systemd for Administrators，Part II](http://0pointer.de/blog/projects/systemd-for-admins-2.html)
* [systemd for Administrators，Part III](http://0pointer.de/blog/projects/systemd-for-admins-3.html)
* [systemd for Administrators，Part IV](http://0pointer.de/blog/projects/systemd-for-admins-4.html)
* [systemd for Administrators，Part V](http://0pointer.de/blog/projects/three-levels-of-off.html)
* [systemd for Administrators，Part VI](http://0pointer.de/blog/projects/changing-roots)
* [systemd for Administrators，Part VII](http://0pointer.de/blog/projects/blame-game.html)
* [systemd for Administrators，Part VIII](http://0pointer.de/blog/projects/the-new-configuration-files.html)
* [systemd for Administrators，Part IX](http://0pointer.de/blog/projects/on-etc-sysinit.html)
* [systemd for Administrators，Part X](http://0pointer.de/blog/projects/instances.html)
* [systemd for Administrators，Part XI](http://0pointer.de/blog/projects/inetd.html)

---

via: <https://opensource.com/article/20/7/systemd-timers>

作者：[David Both](https://opensource.com/users/dboth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[tt67wq](https://github.com/tt67wq) 校对：[wxy](https://github.com/wxy)

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


为什么我喜欢用 bspwm 来做我的 Linux 窗口管理器

Summary: 在 Fedora Linux 上安装、配置并开始使用 bspwm 窗口管理器。

外文网

外文网

在 Fedora Linux 上安装、配置并开始使用 bspwm 窗口管理器。

# 为什么我喜欢用 bspwm 来做我的 Linux 窗口管理器

>
> 在 Fedora Linux 上安装、配置并开始使用 bspwm 窗口管理器。
>
>
>

有些人喜欢重新布置家具。还有的人喜欢尝试新鞋或定期重新装修他们的卧室。我呢，则是尝试 Linux 桌面。

在对网上看到的一些不可思议的桌面环境流口水之后，我对一个窗口管理器特别好奇：[bspwm](https://github.com/baskerville/bspwm)。

我喜欢 [i3](https://i3wm.org/) 窗口管理器已经有一段时间了，我很喜欢它的布局方式和上手的便捷性。但 bspwm 的某些特性吸引了我。有几个原因让我决定尝试一下：

* 它\_只是\_一个窗口管理器（WM）。
* 它由几个易于配置的脚本管理。
* 它默认支持窗口之间的间隙。

可能是最需要指出的第一个原因是它只是一个窗口管理器。和 i3 一样，默认情况下没有任何图形化的那些花哨东西。你当然可以随心所欲地定制它，但\_你\_需要付出努力来使它看起来像你想要的。这也是它吸引我的部分原因。

虽然它可以在许多发行版上使用，但在我这个例子中使用的是 Fedora Linux。

### 安装 bspwm

bspwm 在大多数常见的发行版中都有打包，所以你可以用系统的包管理器安装它。下面这个命令还会安装 [sxkhd](https://github.com/baskerville/sxhkd)，这是一个 X 窗口系统的守护程序，它“通过执行命令对输入事件做出反应”；还有 [dmenu](https://linux.die.net/man/1/dmenu)，这是一个通用的 X 窗口菜单：

```
dnf install bspwm sxkhd dmenu

```

因为 bspwm 只是一个窗口管理器，所以没有任何内置的快捷键或键盘命令。这也是它与 i3 等软件的不同之处。所以，在你第一次启动窗口管理器之前，请先配置一下 `sxkhd`：

```
systemctl start sxkhd
systemctl enable sxkhd

```

这样就可以在登录时启用 `sxkhd`，但你还需要一些基本功能的配置：

```
curl https://raw.githubusercontent.com/baskerville/bspwm/master/examples/sxhkdrc --output ~/.config/sxkhd/sxkhdrc

```

在你深入了解之前，不妨先看看这个文件，因为有些脚本调用的命令可能在你的系统中并不存在。一个很好的例子是调用 `urxvt` 的 `super + Return` 快捷键。把它改成你喜欢的终端，尤其是当你没有安装 `urxvt` 的时候：

```
#
# wm independent hotkeys
#

# terminal emulator
super + Return
        urxvt

# program launcher
super + @space
        dmenu_run

```

如果你使用的是 GDM、LightDM 或其他显示管理器（DM），只要在登录前选择 `bspwm` 即可。

### 配置 bspwm

当你登录后，你会看到屏幕上什么都没有。这不是你感觉到的空虚感。而是无限可能性！你现在可以开始摆弄桌面环境的所有部分了。你现在可以开始摆弄这些年你认为理所当然的桌面环境的所有部分了。从头开始构建并不容易，但一旦你掌握了诀窍，就会非常有收获。

任何窗口管理器最困难的是掌握快捷键。你开始会很慢，但在很短的时间内，你就可以只使用键盘在系统中到处操作，在你的朋友和家人面前看起来像一个终极黑客。

你可以通过编辑 `~/.config/bspwm/bspwmrc`，在启动时添加应用，设置桌面和显示器，并为你的窗口应该如何表现设置规则，随心所欲地定制系统。有一些默认设置的例子可以让你开始使用。键盘快捷键都是由 `sxkhdrc` 文件管理的。

还有更多的开源项目可以安装，让你的电脑看起来更漂亮，比如用于桌面背景的 [Feh](https://github.com/derf/feh)、状态栏的 [Polybar](https://github.com/polybar/polybar)、应用启动器的 [Rofi](https://github.com/davatorium/rofi)，还有 [Compton](https://github.com/chjj/compton) 可以给你提供阴影和透明度，可以让你的电脑看起来焕然一新。

玩得愉快！

---

via: <https://opensource.com/article/21/4/bspwm-linux>

作者：[Stephen Adams](https://opensource.com/users/stevehnh) 选题：[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/) 荣誉推出


Summary: 更多：• 微软正在统一所有平台的 Edge 代码库 • FTP 协议诞生五十周年

然而GCC用 C++ 重写了

# 硬核观察 | Linus Torvalds 青睐 Rust，并称 C++ 是“一门垃圾语言”

### Linus Torvalds 青睐 Rust，并称 C++ 是“一门垃圾语言”

谷歌现在支持用 Rust 来开发安卓操作系统，也在[评估](https://security.googleblog.com/2021/04/rust-in-linux-kernel.html)将 Rust 用于 Linux 内核的开发。Linux 创始人 Linus Torvalds 对此[表示](https://itwire.com/open-source/rust-support-in-linux-may-be-possible-by-5-14-release-torvalds.html)，“目前 Linux 内核对 Rust 的支持还没到位，或许需要等到 5.14 时。”在 Linux 内核中支持 Rust 的第一个补丁已经发布了，已经为之后的支持打好了基础。

而在谈及 C++ 时，Torvalds 说，“C++ 解决不了 C 的任何问题，而且只会让事情变得更糟。它真的是一种垃圾语言。……任何说‘用 C++ 重写内核’的人都太无知了。”

Torvalds 对 C++ 是深恶痛绝的，看来 Rust 有望成为 Torvalds 的新宠，不知道他是不是已经在用 Rust 编程了？

### 微软正在统一所有平台的 Edge 代码库

当微软推出 PC 上的新的基于 Chromium 的 Edge 浏览器时，它还改变了 iOS 和安卓上的 Edge 浏览器的徽标，让人觉得这是一个统一的新 Edge 家族。但实际情况是，iOS 和安卓上的 Edge 浏览器和 PC 上的并不一样。在 iOS 上，Edge 浏览器目前使用的是 WebKit 渲染引擎，而在安卓上使用的是 Blink 渲染引擎。

而现在，微软正在向安卓的金丝雀测试人员提供一个新 Edge 浏览器的版本：这个版本与 PC 上的新 Edge 有着相同的内核。微软官员[表示](https://www.thurrott.com/cloud/web-browsers/microsoft-edge/247834/microsoft-to-move-to-a-single-edge-codebase)，他们的目标是让新的 Edge 成为一个真正的跨平台浏览器，基于相同的核心代码库。当然，这不是说手机端的 Edge 浏览器会复制桌面端浏览器每一个功能。

统一代码库当然是不错的，不过对于 iOS ，或许还是得受限于 Apple 政策而不能更换渲染引擎。

### FTP 协议诞生五十周年

1971 年 4 月 16 日是 [RFC 114](https://tools.ietf.org/html/rfc114) 文档的发表日期，它标志着 FTP 协议的[诞生](https://www.filestash.app/2021/04/16/ftp-is-50-years-old/)。当时 TCP/IP 还不存在，telnet 还很新鲜。后来 FTP 陆续加入了对 TCP/IP 的支持、引入了安全扩展 FTPS、支持 IPv6 等等。

昨天我们[报道](/article-13306-1.html)过，和 Chrome 一样，Firefox 也将要取消浏览器对 FTP 支持。但在 50 年后的今天，互联网上仍然有数百万台 FTP 服务器。

这里面或许有部分原因是 FTP 协议不够安全，但是我觉得更主要是的现在 HTTP 协议已经逐渐取代了 FTP 协议用来分享文件的作用。


用这个开源工具让你的数据对老板友好起来

Summary: 企业数据分析旨在将数据可视化带给日常商务用户。

企业数据分析旨在将数据可视化带给日常商务用户。

# 用这个开源工具让你的数据对老板友好起来

>
> 企业数据分析旨在将数据可视化带给日常商务用户。
>
>
>

<ruby> 企业数据分析 <rt>  Enterprise Data Analytics </rt></ruby>（[EDA](https://eda.jortilles.com/en/jortilles-english/)） 是一个网页应用，它可以通过一个简单、清晰的界面来获取信息。

在巴塞罗那开源分析公司 [Jortilles](https://www.jortilles.com/) 工作几年后，我们意识到，现代世界强制性地收集数据，但普通人没有简单的方法来查看或解释这些数据。有一些强大的开源工具可用于此目的，但它们非常复杂。我们找不到一个工具设计成能让没有什么技术能力的普通人轻松使用。

我们之所以开发 EDA，是因为我们认为获取信息是现代组织的要求和义务，并希望为每个人提供获取信息的机会。

### 可视化你的数据

EDA 使用人们已经理解的商业术语提供了一个数据模型。你可以选择你想要的信息，并可以以你想要的方式查看它。它的目标是对用户友好，同时又功能强大。

EDA 通过元数据模型将数据库中的信息可视化和丰富化。它可以从 BigQuery、Postgres、[MariaDB、MySQL](https://opensource.com/article/20/10/mariadb-mysql-cheat-sheet) 和其他一些数据库中读取数据。这就把技术性的数据库模型转化为熟悉的商业概念。

它还设计为加快信息传播的速度，因为它可以利用已经存储在数据库中的数据。EDA 可以发现数据库的拓扑结构，并提出业务模型。如果你设计了一个好的数据库模型，你就有了一个好的业务模型。EDA 还可以连接到生产服务器，提供实时分析。

这种数据和数据模型的结合意味着你和你组织中的任何人都可以分析其数据。然而，为了保护数据，你可以定义数据安全，可以精确到行，以授予正当的人访问正当的数据。

EDA 的一些功能包括：

* 自动生成数据模型
* 一致的数据模型，防止出现不一致的查询
* 高级用户的 SQL 模式
* 数据可视化：
	+ 标准图表（如柱状图、饼状图、线状图、树状图）
	+ 地图整合（如 geoJSON shapefile、纬度、经度）
	+ 电子邮件提醒，可通过关键绩效指标 （KPI） 来定义
* 私人和公共信息控制，以启用私人和公共仪表板，你可以通过链接分享它。
* 数据缓存和程序刷新。

### 如何使用 EDA

用 EDA 实现数据可视化的第一步是创建数据模型。

#### 创建数据模型

首先，在左侧菜单中选择 “New Datasource”。

接下来，选择你的数据存储的数据库系统（如 Postgres、MariaDB、MySQL、Vertica、SqlServer、Oracle、Big Query），并提供连接参数。

EDA 将自动为你生成数据模型。它读取表和列，并为它们定义名称以及表之间的关系。你还可以通过添加虚拟视图或 geoJSON 图来丰富你的数据模型。

#### 制作仪表板

现在你已经准备好制作第一个仪表板了。在 EDA 界面的主页面上，你应该会看到一个 “New dashboard” 按钮。点击它，命名你的仪表板，并选择你创建的数据模型。新的仪表板将出现一个面板供你配置。

要配置面板，请单击右上角的 “Configuration” 按钮，并选择你要做的事情。在 “Edit query” 中，选择你要显示的数据。这将出现一个新的窗口，你的数据模型由实体和实体的属性表示。选择你要查看的实体和你要使用的属性。例如，对于名为 “Customers” 的实体，你可能会显示 “Customer Name”，对于 “Sales” 实体，你可能希望显示 “Total Sales”。

接下来，运行一个查询，并选择你想要的可视化。

你可以添加任意数量的面板、过滤器和文本字段，所有这些都有说明。当你保存仪表板后，你可以查看它，与同事分享，甚至发布到互联网上。

### 获取 EDA

最快的方法是用 [公开演示](https://demoeda.jortilles.com/) 来查看 EDA。但如果你想自己试一试，可以用 Docker 获取最新的 EDA 版本：

```
$ docker run -p 80:80 jortilles / eda: latest

```

我们还有一个 SaaS 选项，适用于任何想要使用 EDA 而无需进行安装、配置和持续更新的用户。你可以在我们的网站上查看 [云选项](https://eda.jortilles.com)。

如果你想看看它的实际运行情况，你可以在 YouTube 上观看一些 [演示](https://youtu.be/cBAAJbohHXQ)。

EDA 正在持续开发中，你可以在 GitHub 上找到它的 [源代码](https://github.com/jortilles/EDA)。

---

via: <https://opensource.com/article/21/4/visualize-data-eda>

作者：[Juanjo Ortilles](https://opensource.com/users/jortilles) 选题：[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/) 荣誉推出


Stratis 加密入门

Summary: Stratis 在其 官方网站 上被描述为“易于使用的 Linux 本地存储管理”。

nice job

# Stratis 加密入门

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

Stratis 在其 [官方网站](https://stratis-storage.github.io/) 上被描述为“*易于使用的 Linux 本地存储管理*”。请看这个 [短视频](https://www.youtube.com/watch?v=CJu3kmY-f5o)，快速演示基础知识。该视频是在 Red Hat Enterprise Linux 8 系统上录制的。视频中显示的概念也适用于 Fedora 中的 Stratis。

Stratis 2.1 版本引入了对加密的支持。继续阅读以了解如何在 Stratis 中开始加密。

### 先决条件

加密需要 Stratis 2.1 或更高版本。这篇文章中的例子使用的是 Fedora 33 的预发布版本。Stratis 2.1 将用在 Fedora 33 的最终版本中。

你还需要至少一个可用的块设备来创建一个加密池。下面的例子是在 KVM 虚拟机上完成的，虚拟磁盘驱动器为 5GB（`/dev/vdb`）。

### 在内核密钥环中创建一个密钥

Linux 内核<ruby> 密钥环 <rt>  keyring </rt></ruby>用于存储加密密钥。关于内核密钥环的更多信息，请参考 `keyrings` 手册页（`man keyrings`）。

使用 `stratis key set` 命令在内核钥匙圈中设置密钥。你必须指定从哪里读取密钥。要从标准输入中读取密钥，使用 `-capture-key` 选项。要从文件中读取密钥，使用 `-keyfile-path <file>` 选项。最后一个参数是一个密钥描述。它将稍后你创建加密的 Stratis 池时使用。

例如，要创建一个描述为 `pool1key` 的密钥，并从标准输入中读取密钥，可以输入：

```
# stratis key set --capture-key pool1key
Enter desired key data followed by the return key:

```

该命令提示我们输入密钥数据/密码，然后密钥就创建在内核密钥环中了。

要验证密钥是否已被创建，运行 `stratis key list`：

```
# stratis key list
Key Description
pool1key

```

这将验证是否创建了 `pool1key`。请注意，这些密钥不是持久的。如果主机重启，在访问加密的 Stratis 池之前，需要再次提供密钥（此过程将在后面介绍）。

如果你有多个加密池，它们可以有一个单独的密钥，也可以共享同一个密钥。

也可以使用以下 `keyctl` 命令查看密钥：

```
# keyctl get_persistent @s
318044983
# keyctl show
Session Keyring
 701701270 --alswrv      0     0  keyring: _ses
 649111286 --alswrv      0 65534   \_ keyring: _uid.0
 318044983 ---lswrv      0 65534   \_ keyring: _persistent.0
1051260141 --alswrv      0     0       \_ user: stratis-1-key-pool1key

```

### 创建加密的 Stratis 池

现在已经为 Stratis 创建了一个密钥，下一步是创建加密的 Stratis 池。加密池只能在创建池时进行。目前不可能对现有的池进行加密。

使用 `stratis pool create` 命令创建一个池。添加 `-key-desc` 和你在上一步提供的密钥描述（`pool1key`）。这将向 Stratis 发出信号，池应该使用提供的密钥进行加密。下面的例子是在 `/dev/vdb` 上创建 Stratis 池，并将其命名为 `pool1`。确保在你的系统中指定一个空的/可用的设备。

```
# stratis pool create --key-desc pool1key pool1 /dev/vdb

```

你可以使用 `stratis pool list` 命令验证该池是否已经创建：

```
# stratis pool list
Name                     Total Physical   Properties
pool1   4.98 GiB / 37.63 MiB / 4.95 GiB      ~Ca, Cr

```

在上面显示的示例输出中，`~Ca` 表示禁用了缓存（`~` 否定了该属性）。`Cr` 表示启用了加密。请注意，缓存和加密是相互排斥的。这两个功能不能同时启用。

接下来，创建一个文件系统。下面的例子演示了创建一个名为 `filesystem1` 的文件系统，将其挂载在 `/filesystem1` 挂载点上，并在新文件系统中创建一个测试文件：

```
# stratis filesystem create pool1 filesystem1
# mkdir /filesystem1
# mount /stratis/pool1/filesystem1 /filesystem1
# cd /filesystem1
# echo "this is a test file" > testfile

```

### 重启后访问加密池

当重新启动时，你会发现 Stratis 不再显示你的加密池或它的块设备：

```
# stratis pool list
Name   Total Physical   Properties

```

```
# stratis blockdev list
Pool Name   Device Node   Physical Size   Tier

```

要访问加密池，首先要用之前使用的相同的密钥描述和密钥数据/口令重新创建密钥：

```
# stratis key set --capture-key pool1key
Enter desired key data followed by the return key:

```

接下来，运行 `stratis pool unlock` 命令，并验证现在可以看到池和它的块设备：

```
# stratis pool unlock
# stratis pool list
Name                      Total Physical   Properties
pool1   4.98 GiB / 583.65 MiB / 4.41 GiB      ~Ca, Cr
# stratis blockdev list
Pool Name   Device Node   Physical Size   Tier
pool1       /dev/dm-2          4.98 GiB   Data

```

接下来，挂载文件系统并验证是否可以访问之前创建的测试文件：

```
# mount /stratis/pool1/filesystem1 /filesystem1/
# cat /filesystem1/testfile
this is a test file

```

### 使用 systemd 单元文件在启动时自动解锁 Stratis 池

可以在启动时自动解锁 Stratis 池，无需手动干预。但是，必须有一个包含密钥的文件。在某些环境下，将密钥存储在文件中可能会有安全问题。

下图所示的 systemd 单元文件提供了一个简单的方法来在启动时解锁 Stratis 池并挂载文件系统。欢迎提供更好的/替代方法的反馈。你可以在文章末尾的评论区提供建议。

首先用下面的命令创建你的密钥文件。确保用之前输入的相同的密钥数据/密码来代替`passphrase`。

```
# echo -n passphrase > /root/pool1key

```

确保该文件只能由 root 读取：

```
# chmod 400 /root/pool1key
# chown root:root /root/pool1key

```

在 `/etc/systemd/system/stratis-filesystem1.service` 创建包含以下内容的 systemd 单元文件：

```
[Unit]
Description = stratis mount pool1 filesystem1 file system
After = stratisd.service

[Service]
ExecStartPre=sleep 2
ExecStartPre=stratis key set --keyfile-path /root/pool1key pool1key
ExecStartPre=stratis pool unlock
ExecStartPre=sleep 3
ExecStart=mount /stratis/pool1/filesystem1 /filesystem1
RemainAfterExit=yes

[Install]
WantedBy = multi-user.target

```

接下来，启用服务，使其在启动时运行：

```
# systemctl enable stratis-filesystem1.service

```

现在重新启动并验证 Stratis 池是否已自动解锁，其文件系统是否已挂载。

### 结语

在今天的环境中，加密是很多人和组织的必修课。本篇文章演示了如何在 Stratis 2.1 中启用加密功能。

---

via: <https://fedoramagazine.org/getting-started-with-stratis-encryption/>

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

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


硬核观察 | 废弃电厂重启成为比特币矿场

Summary: 更多：• 纽约警察带机器狗出警带走了嫌疑人 • 谷歌 FloC 招致大量反对

更多：• 纽约警察带机器狗出警带走了嫌疑人 • 谷歌 FloC 招致大量反对

# 硬核观察 | 废弃电厂重启成为比特币矿场

### 废弃电厂重启成为比特币矿场

十年前，纽约的 [Greenidge](https://greenidgellc.com/) 燃煤发电厂被废弃了，而如今，新的业主[重新启用](https://www.nysfocus.com/2021/04/13/new-york-bitcoin-mining-threat/)该工厂，用 106 兆瓦发电机，以天然气为燃料为比特币矿机提供能源。自去年 4 月以来，比特币的价格上涨了 800%，挖矿活动异常有利可图。为了搭上这股热潮，该工厂的新业主计划在明年年底前将处理比特币交易的电力增加四倍。环保人士担心纽约其他几十座退役或即将退役的化石燃料发电厂也效仿此做法。

我觉得相对于其它行业的能耗和环保影响，比特币还是很环保的，至少比游戏机环保。

### 纽约警察带机器狗出警带走了嫌疑人

纽约警察将一名戴着手铐的男子带离公共住宅区时，一只机器人执法犬在他们身后小跑。这条机器狗由波士顿动力公司制造，自去年 10 月以来，它被派往美国大都市的犯罪现场。[警察表示](https://gothamist.com/news/nypd-deploys-alarming-robot-dog-manhattan-public-housing-complex)，他们带着这只机器人狗出警，不过没有使用它。

以后，不只是机器警犬，可能还有机器警察和无处不在的摄像头。

### 谷歌 FloC 招致大量反对

谷歌新发布的 Chrome 浏览器中带有其所谓的 FLoC 技术，希望替代第三方 Cookie，改善用户隐私，并同时为浏览器用户提供有针对性的广告。

但这招致了大量的反对，基于 Chromium 的 Brave、Vivaldi 等浏览器明确表示将删除 FLoC 相关的代码。[Vivaldi 称](https://vivaldi.com/blog/no-google-vivaldi-users-will-not-get-floced/)，“我们不会支持 FLoC API，并计划禁用它，无论它是如何实施的。它并不能保护隐私，当然也不利于用户。”而提供了全球 41% 的网站的 WordPress 核心团队提出了一项[提案](https://make.wordpress.org/core/2021/04/18/proposal-treat-floc-as-a-security-concern/)，要求默认屏蔽 FLoC 标识符。WordPress 将 FLoC 视作安全问题处理，急迫到等不及 7 月份发布的下一个主要版本，发布了修订版本阻止它，并将该补丁向下移植回各个旧版本的 WordPress。

按 Vivaldi 的说法，“你可能会访问一个高度个人化的网站，该网站可能使用或不使用 FLoC 广告，现在你访问的每一个其他网站都会被告知你的 FLoC ID，这表明你曾访问过某种特定的网站。”

姑且不论谷歌的初衷如何，但是目前的 FLoC 实现，非但没有解决第三方 Cookie 的问题，而且可能会变本加厉。


7个管理家目录的 Git 技巧

Summary: 这是我怎样设置 Git 来管理我的家目录的方法。

这是我怎样设置 Git 来管理我的家目录的方法。

# 7个管理家目录的 Git 技巧

>
> 这是我怎样设置 Git 来管理我的家目录的方法。
>
>
>

我有好几台电脑。一台笔记本电脑用于工作，一台工作站放在家里，一台树莓派（或四台），一台 [Pocket CHIP](https://opensource.com/article/17/2/pocketchip-or-pi)，一台 [运行各种不同的 Linux 的 Chromebook](https://opensource.com/article/21/2/chromebook-linux)，等等。我曾经在每台计算机上或多或少地按照相同的步骤设置我的用户环境，也经常告诉自己让每台计算机都略有不同。例如，我在工作中比在家里更经常使用 [Bash 别名](https://opensource.com/article/17/5/introduction-alias-command-line-tool)，并且我在家里使用的辅助脚本可能对工作没有用。

这些年来，我对各种设备的期望开始相融，我会忘记我在家用计算机上建立的功能没有移植到我的工作计算机上，诸如此类。我需要一种标准化我的自定义工具包的方法。使我感到意外的答案是 Git。

Git 是版本跟踪软件。它以既可以用在非常大的开源项目也可以用在极小的开源项目而闻名，甚至最大的专有软件公司也在用它。但是它是为源代码设计的，而不是用在一个装满音乐和视频文件、游戏、照片等的家目录。我听说过有人使用 Git 管理其家目录，但我认为这是程序员们进行的一项附带实验，而不是像我这样的现实生活中的用户。

用 Git 管理我的家目录是一个不断发展的过程。随着时间的推移我一直在学习和适应。如果你决定使用 Git 管理家目录，则可能需要记住以下几点。

### 1、文本和二进制位置

当由 Git 管理时，除了配置文件之外，你的家目录对于所有内容而言都是“无人之地”。这意味着当你打开主目录时，除了可预见的目录的列表之外，你什么都看不到。不应有任何杂乱无章的照片或 LibreOffice 文档，也不应有 “我就在这里放一分钟” 的临时文件。

原因很简单：使用 Git 管理家目录时，家目录中所有 *未* 提交的内容都会变成噪音。每次执行 `git status` 时，你都必须翻过去之前 Git 未跟踪的任何文件，因此将这些文件保存在子目录（添加到 `.gitignore` 文件中）至关重要。

许多 Linux 发行版提供了一组默认目录：

* `Documents`
* `Downloads`
* `Music`
* `Photos`
* `Templates`
* `Videos`

如果需要，你可以创建更多。例如，我把创作的音乐（`Music`）和购买来聆听的音乐（`Albums`）区分开来。同样，我的电影（`Cinema`）目录包含了其他人的电影，而视频（`Videos`）目录包含我需要编辑的视频文件。换句话说，我的默认目录结构比大多数 Linux 发行版提供的默认设置更详细，但是我认为这样做有好处。如果没有适合你的目录结构，你更会将其存放在家目录中，因为没有更好的存放位置，因此请提前考虑并规划好适合你的工作目录。你以后总是可以添加更多，但是最好先开始擅长的。

### 2、、设置最优的 `.gitignore`

清理家目录后，你可以像往常一样将其作为 Git 存储库实例化：

```
$ cd
$ git init .

```

你的 Git 仓库中还没有任何内容，你的家目录中的所有内容均未被跟踪。你的第一项工作是筛选未跟踪文件的列表，并确定要保持未跟踪状态的文件。要查看未跟踪的文件：

```
$ git status
  .AndroidStudio3.2/
  .FBReader/
  .ICEauthority
  .Xauthority
  .Xdefaults
  .android/
  .arduino15/
  .ash_history
[...]

```

根据你使用家目录的时间长短，此列表可能很长。简单的是你在上一步中确定的目录。通过将它们添加到名为 `.gitignore` 的隐藏文件中，你告诉 Git 停止将它们列为未跟踪文件，并且永远不对其进行跟踪：

```
$ \ls -lg | grep ^d | awk '{print $8}' >> ~/.gitignore

```

完成后，浏览 `git status` 所示的其余未跟踪文件，并确定是否有其他文件需要排除。这个过程帮助我发现了几个陈旧的配置文件和目录，这些文件和目录最终被我全部丢弃了，而且还发现了一些特定于一台计算机的文件和目录。我在这里非常严格，因为许多配置文件在自动生成时会表现得更好。例如，我从不提交我的 KDE 配置文件，因为许多文件包含了诸如最新文档之类的信息以及其他机器上不存在的其他元素。

我会跟踪我的个性化配置文件、脚本和实用程序、配置文件和 Bash 配置，以及速查表和我经常引用的其他文本片段。如果有软件主要负责维护的文件，则将其忽略。当对一个文件不确定时，我将其忽略。你以后总是可以取消忽略它（通过从 `.gitignore` 文件中删除它）。

### 3、了解你的数据

我使用的是 KDE，因此我使用开源扫描程序 [Filelight](https://utils.kde.org/projects/filelight) 来了解我的数据概况。Filelight 为你提供了一个图表，可让你查看每个目录的大小。你可以浏览每个目录以查看占用了空间的内容，然后回溯调查其他地方。这是一个令人着迷的系统视图，它使你可以以全新的方式看待你的文件。

使用 Filelight 或类似的实用程序查找不需要提交的意外数据缓存。例如，KDE 文件索引器（Baloo）生成了大量特定于其主机的数据，我绝对不希望将其传输到另一台计算机。

### 4、不要忽略你的 `.gitignore` 文件

在某些项目中，我告诉 Git 忽略我的 `.gitignore` 文件，因为有时我要忽略的内容特定于我的工作目录，并且我不认为同一项目中的其他开发人员需要我告诉他们 `.gitignore` 文件应该是什么样子。因为我的家目录仅供我使用，所以我 *不* 会忽略我的家目录的 `.gitignore` 文件。我将其与其他重要文件一起提交，因此它已在我的所有系统中被继承。当然，从家目录的角度来看，我所有的系统都是相同的：它们具有一组相同的默认文件夹和许多相同的隐藏配置文件。

### 5、不要担心二进制文件

我对我的系统进行了数周的严格测试，确信将二进制文件提交到 Git 绝对不是明智之举。我试过 GPG 加密的密码文件、试过 LibreOffice 文档、JPEG、PNG 等等。我甚至有一个脚本，可以在将 LibreOffice 文件添加到 Git 之前先解压缩，提取其中的 XML，以便仅提交 XML，然后重新构建 LibreOffice 文件，以便可以在 LibreOffice 中继续工作。我的理论是，提交 XML 会比使用 ZIP 文件（LibreOffice 文档实际上就是一个 ZIP 文件）会让 Git 存储库更小一些。

令我惊讶的是，我发现偶尔提交一些二进制文件并没有大幅增加我的 Git 存储库的大小。我使用 Git 已经很长时间了，我知道如果我要提交几千兆的二进制数据，我的存储库将会受到影响，但是偶尔提交几个二进制文件也不是不惜一切代价要避免的紧急情况。

有了这种信心，我将字体 OTF 和 TTF 文件添加到我的标准主存储库，以及 GDM 的 `.face` 文件以及其他偶尔小型二进制 Blob 文件。不要想太多，不要浪费时间去避免它。只需提交即可。

### 6、使用私有存储库

即使托管方提供了私人帐户，也不要将你的主目录提交到公共 Git 存储库。如果你像我一样，拥有 SSH 密钥、GPG 密钥链和 GPG 加密的文件，这些文件不应该出现在任何人的服务器上，而应该出现在我自己的服务器上。

我在树莓派上 [运行本地 Git 服务器](https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6)（这比你想象的要容易），因此我可以在家里时随时更新任何一台计算机。我是一名远程工作者，所以通常情况下就足够了，但是我也可以在旅行时通过 [虚拟私人网络](https://www.redhat.com/sysadmin/run-your-own-vpn-libreswan) 访问我的计算机。

### 7、要记得推送

Git 的特点是，只有当你告诉它要推送改动时，它才会把改动推送到你的服务器上。如果你是 Git 的老用户，则此过程可能对你很自然。对于可能习惯于 Nextcloud 或 Syncthing 自动同步的新用户，这可能需要一些时间来适应。

### Git 家目录

使用 Git 管理我的常用文件，不仅使我在不同设备上的生活更加便利。我知道我拥有所有配置和实用程序脚本的完整历史记录，这会鼓励我尝试新的想法，因为如果结果变得 *很糟糕*，则很容易回滚我的更改。Git 曾将我从在 `.bashrc` 文件中一个欠考虑的 `umask` 设置中解救出来、从深夜对包管理脚本的拙劣添加中解救出来、从当时看似很酷的 [rxvt](https://opensource.com/article/19/10/why-use-rxvt-terminal) 配色方案的修改中解救出来，也许还有其他一些错误。在家目录中尝试 Git 吧，因为这些提交会让家目录融合在一起。

---

via: <https://opensource.com/article/21/4/git-home>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[stevenzdg988](https://github.com/stevenzdg988) 校对：[wxy](https://github.com/wxy)

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


将你的安卓手机屏幕投射到 Linux

qh-ydj@qhydj-ThinkPad-T410:~$ sudo apt install scrcpy

[sudo] qh-ydj 的密码：

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

正在读取状态信息... 完成

E: 无法定位软件包 scrcpy

sudo snap install scrcpy

# 将你的安卓手机屏幕投射到 Linux

>
> 使用 Scrcpy 可以把你的手机屏幕变成一个“应用”，与在树莓派或任何其他基于 Linux 的设备上的应用一起运行。
>
>
>

要远离我们日常使用的电子产品是很难的。在熙熙攘攘的现代生活中，我想确保我不会错过手机屏幕上弹出的来自朋友和家人的重要信息。我也很忙，不希望迷失在令人分心的事情中，但是拿起手机并且回复信息往往会使我分心。

更糟糕的是，有很多的设备。幸运地是，大多数的设备（从功能强大的笔记本电脑到甚至不起眼的树莓派）都可以运行 Linux。因为它们运行的是 Linux，所以我为一种设置找到的解决方案几乎都适用于其他设备。

### 普遍适用

我想要一种无论我使用什么屏幕，都能统一我生活中不同来源的数据的方法。

我决定通过把手机屏幕复制到电脑上来解决这个问题。本质上，我把手机变成了一个“应用”，可以和我所有的其他程序运行在一起。这有助于我将注意力集中在桌面上，防止我走神，并使我更容易回复紧急通知。

听起来有吸引力吗？你也可以这样做。

### 设置 Scrcpy

[Scrcpy](https://github.com/Genymobile/scrcpy) 俗称屏幕复制（Screen Copy），是一个开源的屏幕镜像工具，它可以在 Linux、Windows 或者 macOS 上显示和控制安卓设备。安卓设备和计算机之间的通信主要是通过 USB 连接和<ruby> 安卓调试桥 <rt>  Android Debug Bridge </rt></ruby>（ADB）。它使用 TCP/IP，且不需要 root 权限访问。

Scrcpy 的设置和配置非常简单。如果你正在运行 Fedora，你可以从 COPR 仓库安装它：

```
$ sudo dnf copr enable zeno/scrcpy
$ sudo dnf install scrcpy -y

```

在 Debian 或者 Ubuntu 上：

```
$ sudo apt install scrcpy

```

你也可以自己编译 Scrcpy。即使是在树莓派上，按照 [Scrcpy 的 GitHub 主页](https://github.com/Genymobile/scrcpy/blob/master/BUILD.md) 上的说明来构建也不需要很长时间。

### 设置手机

Scrcpy 安装好后，你必须启用 USB 调试并授权每个设备（你的树莓派、笔记本电脑或者工作站）为受信任的控制器。

打开安卓上的“设置”应用程序。如果“开发者选项”没有被激活，按照安卓的 [说明来解锁它](https://developer.android.com/studio/debug/dev-options)。

接下来，启用“USB 调试”。

然后通过 USB 将手机连接到你的树莓派或者笔记本电脑（或者你正在使用的任何设备），如果可以选择的话，将模式设置为 [PTP](https://en.wikipedia.org/wiki/Picture_Transfer_Protocol)。如果你的手机不能使用 PTP，将你的手机设置为用于传输文件的模式（而不是，作为一个<ruby> 叠接 <rt>  tethering </rt></ruby>或者 MIDI 设备）。

你的手机可能会提示你授权你的电脑，这是通过它的 RSA 指纹进行识别的。你只需要在你第一次连接的时候操作即可，在之后你的手机会识别并信任你的计算机。

使用 `lsusb` 命令确认设置：

```
$ lsusb
Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 011 Device 004: ID 046d:c21d Logitech, Inc. F310 Gamepad
Bus 005 Device 005: ID 0951:1666 Kingston Technology DataTraveler G4
Bus 005 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 004 Device 001: ID 18d1:4ee6 Google Inc. Nexus/Pixel Device (PTP + debug)
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

```

然后执行 `scrcpy` 以默认设置运行。

性能和响应能力取决于你使用什么设备来控制你的手机。在树莓派派上，一些动画可能会变慢，甚至有时候会响应滞后。Scrcpy 提供了一个简单的解决办法：降低 Scrcpy 显示图像的位速率和分辨率使得你的计算机能够容易显示动画。使用以下命令来实现：

```
$ scrcpy --bit-rate 1M --max-size 800

```

尝试不同的值来找到一个适合你的值。为了使键入更方便，在选定一个命令之后，可以考虑 [创建自己的 Bash 别名](https://opensource.com/article/19/7/bash-aliases)。

### 剪断连线

Scrcpy 开始运行后，你甚至可以通过 WiFi 连接你的手机和计算机。Scrcpy 安装过程也会安装 `adb`，它是一个与安卓设备通信的命令。Scrcpy 也可以使用这个命令与你的设备通信，`adb` 可以通过 TCP/IP 连接。

要尝试的话，请确保你的手机通过 WiFi 连在与你的计算机所使用的相同的无线网络上。依然不要断开你的手机与 USB 的连接！

接下来，通过手机中的“设置”，选择“关于手机”来获取你手机的 IP 地址。查看“状态”选项来获得你的地址。它通常是 192.168 或者 10 开头。

或者，你也可以使用 `adb` 来获得你手机的IP地址：

```
$ adb shell ip route | awk '{print $9}'

To connect to your device over WiFi, you must enable TCP/IP connections. This, you must do through the adb command:
$ adb tcpip 5555
Now you can disconnect your mobile from USB.
Whenever you want to connect over WiFi, first connect to the mobile with the command adb connect. For instance, assuming my mobile's IP address is 10.1.1.22, the command is:
$ adb connect 10.1.1.22:5555

```

连接好之后，你就可以像往常一样运行 Scrcpy 了。

### 远程控制

Scrcpy 很容易使用。你可以在终端或者 [一个图形界面应用](https://opensource.com/article/19/9/mirror-android-screen-guiscrcpy) 中尝试它。

你是否在使用其它的屏幕镜像工具？如果有的话，请在评论中告诉我们吧。

---

via: <https://opensource.com/article/21/3/android-raspberry-pi>

作者：[Sudeshna Sur](https://opensource.com/users/sudeshna-sur) 选题：[lujun9972](https://github.com/lujun9972) 译者：[ShuyRoy](https://github.com/ShuyRoy) 校对：[wxy](https://github.com/wxy)

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


Summary: 更多：• 火星直升机“灵巧号”成功首飞，GitHub 为使用的开源项目颁发徽章 • 中国开通全球规模最大的互联网试验设施主干网

效率低些没问题<br />
问题是能完美翻译不？

# 硬核观察 | 龙芯推出自主指令集 LoongArch，可翻译支持 MIPS/ARM/x86

### 龙芯推出自主指令集 LoongArch，可翻译支持 MIPS/ARM/x86

最近，龙芯宣布推出 LoongArch 指令集，拥有 2500 多条自主指令。该指令集可以通过二进制翻译的方式兼容 MIPS、ARM 及 x86 处理器。当然，翻译其他指令面临效率问题，LoongArch 对 MIPS 指令的翻译效率是 100%，对 ARM 可以达到 90%。而对于 x86，在 Linux 下翻译的效率可达 80%，Windows 下的效率则减少到 70%，不过后续还会有更多的优化。

龙芯的目标是到 2025 年消除指令集之间的壁垒，彻底搞定不同指令集的兼容问题。龙芯找了国内外的知识产权团队作了梳理，对于使用二进制翻译别的指令集系统，是没有专利权纠纷的。之后，龙芯还会继续进行知识产权分析，并建立 LoongArch 上游社区分支，同时组建 LoongArch 联盟，一方面免费开放 LoongArch，另一方面要在高校推广，取代 RISC-V。

自主指令集固然很重要，而兼容现有主流指令集也很重要，祝龙芯成功！

### 火星直升机“灵巧号”成功首飞，GitHub 为使用的开源项目颁发徽章

美国宇航局今天创造了历史，完成了在另一个星球上进行的首次动力飞行。火星直升机“灵巧号”成功地飞上了火星的天空，进行了一次短暂的旅行。

“灵巧号”使用了商用配件，大量采用了开源项目，这包括 Linux、FPrime、cUrl 以及大量 Python 项目。GitHub 宣布，为在火星直升机上使用的开源项目做过贡献的开发者颁发“[火星 2020 直升机贡献者](https://docs.github.com/en/github/setting-up-and-managing-your-github-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-badge)”徽章。

有拿到了直升机贡献者徽章的同学可以炫耀一下~~

### 中国开通全球规模最大的互联网试验设施主干网

据新华社报道，4 月 20 日，“未来互联网试验设施 FITI”高性能主干网开通仪式在清华大学举行。FITI 是当前全球规模最大的互联网试验设施，是我国信息领域第一个国家重大科技基础设施项目：未来网络试验设施的重要组成部分。FITI 主干网核心节点分布在全国 31 个省区市，核心节点间的带宽达到 200G，同时支持不少于 4096 个大规模试验网络，实现了与国内外 IPv4/IPv6 试验设施的互联互通。

希望将来的互联网越来越好，越来越互联互通吧。


groff 程序员的 5 个标志

Summary: 学习一款老派的文本处理软件 groff，就像是学习骑自行车。

学习一款老派的文本处理软件 groff，就像是学习骑自行车。

# groff 程序员的 5 个标志

>
> 学习一款老派的文本处理软件 groff，就像是学习骑自行车。
>
>
>

<img src="content_image/album_202104_20_221218y34lew4gewqw2xg2.jpg" alt="" title="Typewriter in the grass">

我第一次发现 Unix 系统是在 20 世纪 90 年代早期，当时我还在大学读本科。我太喜欢这个系统了，所以我将家里电脑上的 MS-DOS 也换成了 Linux 系统。

在 90 年代早期至中期，Linux 所缺失的一个东西是<ruby> 字处理软件 <rt>  word processor </rt></ruby>。作为其他桌面操作系统的标准办公程序，字处理软件能让你轻松地编辑文本。我经常在 DOS 上使用字处理软件来撰写课程论文。直到 90 年代末，我都没能找到一款 Linux 原生的字处理软件。直到那时，文字处理是我在第一台电脑上保留双启动的少有的原因之一，那样我可以偶尔切换到 DOS 系统写论文。

后来，我发现 Linux 提供了一款文字处理软件：GNU troff，它一般称为 [groff](https://en.wikipedia.org/wiki/Groff_(software))，是经典的文本处理系统 troff 的一个现代实现。troff 是 “<ruby> 排版工快印 <rt>  typesetter roff </rt></ruby>” 的简称，是 nroff 系统的改进版本，而 nroff 又是最初的 roff 系统的新实现。roff 表示<ruby> 快速印出 <rt>  run off </rt></ruby>，比如“快速印出”一份文档。

利用文本处理系统，你在纯文本编辑器里编辑内容，通过<ruby> 宏 <rt>  macro </rt></ruby>或其他处理命令来添加格式。然后将文件输入文本处理系统，比如 groff，来生成适合打印的格式化输出。另一个知名的文本处理系统是 LaTeX，但是 groff 已经满足我的需求，而且足够简单。

经过一点实践，我发现在 Linux 上使用 groff 来撰写课程论文与使用字处理软件一样容易。尽管我现在不再使用 groff 来写文档了，我依然记得它的那些宏和命令。如果你也是这样并且在那么多年之前学会了使用 groff 写作，你可能会认出这 5 个 groff 程序员的标志。

### 1、你有一个喜欢的宏集

输入由宏点缀的纯文本，你便能在 groff 里对文档进行格式化。groff 里的宏是行首为单个句点（`.`）的短命令。例如：如果你想在输出里插入几行，宏命令 `.sp 2` 会添加两个空行。groff 还具有其他一些基本的宏，支持各种各样的格式化。

为了能让作者更容易地格式化文档，groff 还提供了不同的 <ruby> 宏集 <rt>  macro set </rt></ruby>，即一组能够让你以自己的方式格式化文档的宏的集合。我学会的第一个宏集是 `-me` 宏集。这个宏集的名称其实是 `e`，你在处理文件时使用 `-me` 选项来指定这个 `e` 宏集。

groff 还包含其他宏集。例如，`-man` 宏集以前是用于格式化 Unix 系统内置的 <ruby> 手册页 <rt>  manual page </rt></ruby> 的标准宏集，`-ms` 宏集经常用于格式化其他一些技术文档。如果你学会了使用 groff 写作，你可能有一个喜欢的宏集。

### 2、你想专注于内容而非格式

使用 groff 写作的一个很好的特点是，你能专注于你的 *内容*，而不用太担心它看起来会怎么样。对于技术作者而言这是一个很实用的特点。对专业作家来说，groff 是一个很好的、“不会分心”的写作环境。至少，使用 groff `-T` 选项所支持的任何格式来交付内容时你不用担心，这包括 PDF、PostScript、HTML、以及纯文本。不过，你无法直接从 groff 生成 LibreOffice ODT 文件或者 Word DOC 文件。

一旦你使用 groff 写作变得有信心之后，宏便开始 *消失*。用于格式化的宏变成了背景的一部分，而你纯粹地专注于眼前的文本内容。我已经使用 groff 写了足够多内容，以至于我甚至不再看见那些宏。也许，这就像写代码，而你的大脑随意换档，于是你就像计算机一样思考，看到的代码就是一组指令。对我而言，使用 groff 写作就像那样：我仅仅看到文本，而我的大脑将宏自动地翻译成格式。

### 3、你喜欢怀旧复古的感觉

当然，使用一个更典型的字处理软件来写你的文档可能更 *简单*，比如 LibreOffice Writer、甚至 Google Docs 或 Microsoft Word。而且对于某些种类的文档，桌面型字处理软件才是正确的选择。但是，如果你想要这种怀旧复古的感觉，使用 groff 写作很难被打败。

我承认，我的大部分写作是用 LibreOffice Writer 完成的，它的表现很出色。但是当我渴望以一种怀旧复古的方式去做时，我会打开编辑器用 groff 来写文档。

### 4、你希望能到处使用它

groff 及其同类软件在几乎所有的 Unix 系统上都是标准软件包。此外，groff 宏不会随系统而变化。比如，`-me` 宏集在不同系统上都应该相同。因此，一旦你在一个系统上学会使用宏，你能在下一个系统上同样地使用它们。

另外，因为 groff 文档就是纯文本文档，所以你能使用任何你喜欢的编辑器来编辑文档。我喜欢使用 GNU Emacs 来编辑我的 groff 文档，但是你可能使用 GNOME Gedit、Vim、其他你 [最喜欢的文本编辑器](https://opensource.com/article/21/2/open-source-text-editors)。大部分编辑器会支持这样一种模式，其中 groff 宏会以不同的颜色高亮显示，帮助你在处理文件之前便能发现错误。

### 5、你使用 -me 写了这篇文章

当我决定要写这篇文章时，我认为最佳的方式便是直接使用 groff。我想要演示 groff 在编写文档方面是多么的灵活。所以，虽然你正在网上读这篇文章，但是它最初是用 groff 写的。

我希望这激发了你学习如何使用 groff 撰写文档的兴趣。如果你想学习 `-me` 宏集里更高级的函数，参考 Eric Allman 的《Writing papers with groff using -me》，你应该能在系统的 groff 文档找到这本书，文件名为 `meintro.me`。这是一份很好的参考资料，还解释了使用 `-me` 宏集格式化论文的其他方式。

我还提供了这篇文章的原始草稿，其中使用了 `-me` 宏集。下载这个文件并保存为 `five-signs-groff.me`，然后运行 groff 处理来查看它。`-T` 选项设置输出类型，比如 `-Tps` 用于生成 PostScript 输出，`-Thtml` 用于生成 HTML 文件。比如：

```
groff -me -Thtml five-signs-groff.me > five-signs-groff.html

```

---

via: <https://opensource.com/article/21/4/groff-programmer>

作者：[Jim Hall](https://opensource.com/users/jim-hall) 选题：[lujun9972](https://github.com/lujun9972) 译者：[liweitianux](https://github.com/liweitianux) 校对：[wxy](https://github.com/wxy)

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


怎样在 Linux 中使用动态和静态库

Summary: 了解 Linux 如何使用库，包括静态库和动态库的差别，有助于你解决依赖问题。

了解 Linux 如何使用库，包括静态库和动态库的差别，有助于你解决依赖问题。

# 怎样在 Linux 中使用动态和静态库

>
> 了解 Linux 如何使用库，包括静态库和动态库的差别，有助于你解决依赖问题。
>
>
>

Linux 从某种意义上来说就是一堆相互依赖的静态和动态库。对于 Linux 系统新手来说，库的整个处理过程简直是个迷。但对有经验的人来说，被构建进操作系统的大量共享代码对于编写新应用来说却是个优点。

为了让你熟悉这个话题，我准备了一个小巧的 [应用例子](https://github.com/hANSIc99/library_sample) 来展示在普通的 Linux 发行版（在其他操作系统上未验证）上是经常是如何处理库的。为了用这个例子来跟上这个需要动手的教程，请打开命令行输入：

```
$ git clone https://github.com/hANSIc99/library_sample
$ cd library_sample/
$ make
cc -c main.c -Wall -Werror
cc -c libmy_static_a.c -o libmy_static_a.o -Wall -Werror
cc -c libmy_static_b.c -o libmy_static_b.o -Wall -Werror
ar -rsv libmy_static.a libmy_static_a.o libmy_static_b.o
ar: creating libmy_static.a
a - libmy_static_a.o
a - libmy_static_b.o
cc -c -fPIC libmy_shared.c -o libmy_shared.o
cc -shared -o libmy_shared.so libmy_shared.o
$ make clean
rm *.o

```

当执行完这些命令，这些文件应当被添加进目录下（执行 `ls` 来查看）：

```
my_app
libmy_static.a
libmy_shared.so

```

### 关于静态链接

当你的应用链接了一个静态库，这个库的代码就变成了可执行文件的一部分。这个动作只在链接过程中执行一次，这些静态库通常以 `.a` 扩展符结尾。

静态库是多个<ruby> 目标 <rt>  object </rt></ruby>文件的<ruby> 归档 <rt>  archive </rt></ruby>（[ar](https://en.wikipedia.org/wiki/Ar_%28Unix%29)）。这些目标文件通常是 ELF 格式的。ELF 是 <ruby>   可执行可链接格式  <rt>  Executable and Linkable Format </rt></ruby> 的简写，它与多个操作系统兼容。

`file` 命令的输出可以告诉你静态库 `libmy_static.a` 是 `ar` 格式的归档文件类型。

```
$ file libmy_static.a
libmy_static.a: current ar archive

```

使用 `ar -t`，你可以看到归档文件的内部。它展示了两个目标文件：

```
$ ar -t libmy_static.a
libmy_static_a.o
libmy_static_b.o

```

你可以用 `ax -x <archive-file>` 命令来提取归档文件的文件。被提出的都是 ELF 格式的目标文件：

```
$ ar -x libmy_static.a
$ file libmy_static_a.o
libmy_static_a.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

```

### 关于动态链接

动态链接指的是使用共享库。共享库通常以 `.so` 的扩展名结尾（“<ruby> 共享对象 <rt>  shared object </rt></ruby>” 的简写）。

共享库是 Linux 系统中依赖管理的最常用方法。这些共享库在应用启动前被载入内存，当多个应用都需要同一个库时，这个库在系统中只会被加载一次。这个特性减少了应用的内存占用。

另外一个值得注意的地方是，当一个共享库的 bug 被修复后，所有引用了这个库的应用都会受益。但这也意味着，如果一个 bug 还没被发现，那所有相关的应用都会遭受这个 bug 影响（如果这个应用使用了受影响的部分）。

当一个应用需要某个特定版本的库，但是<ruby> 链接器 <rt>  linker </rt></ruby>只知道某个不兼容版本的位置，对于初学者来说这个问题非常棘手。在这个场景下，你必须帮助链接器找到正确版本的路径。

尽管这不是一个每天都会遇到的问题，但是理解动态链接的原理总是有助于你修复类似的问题。

幸运的是，动态链接的机制其实非常简洁明了。

为了检查一个应用在启动时需要哪些库，你可以使用 `ldd` 命令，它会打印出给定文件所需的动态库：

```
$ ldd my_app
        linux-vdso.so.1 (0x00007ffd1299c000)
        libmy_shared.so => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007f56b869b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f56b8881000)

```

可以注意到 `libmy_shared.so` 库是代码仓库的一部分，但是没有被找到。这是因为负责在应用启动之前将所有依赖加载进内存的动态链接器没有在它搜索的标准路径下找到这个库。

对新手来说，与常用库（例如 `bizp2`）版本不兼容相关的问题往往十分令人困惑。一种方法是把该仓库的路径加入到环境变量 `LD_LIBRARY_PATH` 中来告诉链接器去哪里找到正确的版本。在本例中，正确的版本就在这个目录下，所以你可以导出它至环境变量：

```
$ LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH

```

现在动态链接器知道去哪找库了，应用也可以执行了。你可以再次执行 `ldd` 去调用动态链接器，它会检查应用的依赖然后加载进内存。内存地址会在对象路径后展示：

```
$ ldd my_app
        linux-vdso.so.1 (0x00007ffd385f7000)
        libmy_shared.so => /home/stephan/library_sample/libmy_shared.so (0x00007f3fad401000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f3fad21d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3fad408000)

```

想知道哪个链接器被调用了，你可以用 `file` 命令：

```
$ file my_app
my_app: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=26c677b771122b4c99f0fd9ee001e6c743550fa6, for GNU/Linux 3.2.0, not stripped

```

链接器 `/lib64/ld-linux-x86–64.so.2` 是一个指向 `ld-2.30.so` 的软链接，它也是我的 Linux 发行版的默认链接器：

```
$ file /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: symbolic link to ld-2.31.so

```

回头看看 `ldd` 命令的输出，你还可以看到（在 `libmy_shared.so` 边上）每个依赖都以一个数字结尾（例如 `/lib64/libc.so.6`）。共享对象的常见命名格式为：

```
libXYZ.so.<MAJOR>.<MINOR>

```

在我的系统中，`libc.so.6` 也是指向同一目录下的共享对象 `libc-2.31.so` 的软链接。

```
$ file /lib64/libc.so.6
/lib64/libc.so.6: symbolic link to libc-2.31.so

```

如果你正在面对一个应用因为加载库的版本不对导致无法启动的问题，有很大可能你可以通过检查整理这些软链接或者确定正确的搜索路径（查看下方“动态加载器：[ld.so](http://ld.so)”一节）来解决这个问题。

更为详细的信息请查看 [ldd 手册页](https://www.man7.org/linux/man-pages/man1/ldd.1.html)。

#### 动态加载

动态加载的意思是一个库（例如一个 `.so` 文件）在程序的运行时被加载。这是使用某种特定的编程方法实现的。

当一个应用使用可以在运行时改变的插件时，就会使用动态加载。

查看 [dlopen 手册页](https://www.man7.org/linux/man-pages/man3/dlopen.3.html) 获取更多信息。

#### 动态加载器：[ld.so](http://ld.so)

在 Linux 系统中，你几乎总是正在跟共享库打交道，所以必须有个机制来检测一个应用的依赖并将其加载进内存中。

`ld.so` 按以下顺序在这些地方寻找共享对象：

1. 应用的绝对路径或相对路径下（用 GCC 编译器的 `-rpath` 选项硬编码的）
2. 环境变量 `LD_LIBRARY_PATH`
3. `/etc/ld.so.cache` 文件

需要记住的是，将一个库加到系统库归档 `/usr/lib64` 中需要管理员权限。你可以手动拷贝 `libmy_shared.so` 至库归档中来让应用可以运行，而避免设置 `LD_LIBRARY_PATH`。

```
unset LD_LIBRARY_PATH
sudo cp libmy_shared.so /usr/lib64/

```

当你运行 `ldd` 时，你现在可以看到归档库的路径被展示出来：

```
$ ldd my_app
        linux-vdso.so.1 (0x00007ffe82fab000)
        libmy_shared.so => /lib64/libmy_shared.so (0x00007f0a963e0000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f0a96216000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0a96401000)

```

### 在编译时定制共享库

如果你想你的应用使用你的共享库，你可以在编译时指定一个绝对或相对路径。

编辑 `makefile`（第 10 行）然后通过 `make -B` 来重新编译程序。然后 `ldd` 输出显示 `libmy_shared.so` 和它的绝对路径一起被列出来了。

把这个：

```
CFLAGS =-Wall -Werror -Wl,-rpath,$(shell pwd)

```

改成这个（记得修改用户名）：

```
CFLAGS =/home/stephan/library_sample/libmy_shared.so

```

然后重新编译：

```
$ make

```

确认下它正在使用你设定的绝对路径，你可以在输出的第二行看到：

```
$ ldd my_app
    linux-vdso.so.1 (0x00007ffe143ed000)
        libmy_shared.so => /lib64/libmy_shared.so (0x00007fe50926d000)
        /home/stephan/library_sample/libmy_shared.so (0x00007fe509268000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fe50909e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe50928e000)

```

这是个不错的例子，但是如果你在编写给其他人用的库，它是怎样工作的呢？新库的路径可以通过写入 `/etc/ld.so.conf` 或是在 `/etc/ld.so.conf.d/` 目录下创建一个包含路径的 `<library-name>.conf` 文件来注册至系统。之后，你必须执行 `ldconfig` 命令来覆写 `ld.so.cache` 文件。这一步有时候在你装了携带特殊的共享库的程序来说是不可省略的。

查看 [ld.so 的手册页](https://www.man7.org/linux/man-pages/man8/ld.so.8.html) 获取更多详细信息。

### 怎样处理多种架构

通常来说，32 位和 64 位版本的应用有不同的库。下面列表展示了不同 Linux 发行版库的标准路径：

**红帽家族**

* 32 位：`/usr/lib`
* 64 位：`/usr/lib64`

**Debian 家族**

* 32 位：`/usr/lib/i386-linux-gnu`
* 64 位：`/usr/lib/x86_64-linux-gnu`

**Arch Linux 家族**

* 32 位：`/usr/lib32`
* 64 位：`/usr/lib64`

[FreeBSD](https://opensource.com/article/20/5/furybsd-linux)（技术上来说不算 Linux 发行版）

* 32 位：`/usr/lib32`
* 64 位：`/usr/lib`

知道去哪找这些关键库可以让库链接失效的问题成为历史。

虽然刚开始会有点困惑，但是理解 Linux 库的依赖管理是一种对操作系统掌控感的表现。在其他应用程序中运行这些步骤，以熟悉常见的库，然后继续学习怎样解决任何你可能遇到的库的挑战。

---

via: <https://opensource.com/article/20/6/linux-libraries>

作者：[Stephan Avenwedde](https://opensource.com/users/hansic99) 选题：[lujun9972](https://github.com/lujun9972) 译者：[tt67wq](https://github.com/tt67wq) 校对：[wxy](https://github.com/wxy)

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


Summary: 更多：• 明尼苏达大学开发者被禁止向 Linux 内核提供代码 • Google 资助开发 OpenSSL 的替代品 Rustls

# 硬核观察 | Grafana、Loki 和 Tempo 改用 AGPLv3 许可证

### Grafana、Loki 和 Tempo 改用 AGPLv3 许可证

过去几年，多个知名的开源项目如 Elastic、Redis Labs 和 MongoDB 出于盈利考虑而修改许可证，切换到非自由的商业授权许可证（SSPL）。开发 Grafana 以及 Loki 和 Tempo 等开源项目的 Grafana Labs 公司决定不这么做，它[宣布](https://grafana.com/blog/2021/04/20/grafana-loki-tempo-relicensing-to-agplv3/)旗下核心开源项目采用的许可证从 Apache License 2.0 切换到 AGPL v3，允许其他人自由修改和提供服务，但修改的版本需要回馈上游。Grafana Labs 公司表示，它这么做是试图在开源和社区的“价值创造”以及商业化策略的“价值获取”上取得平衡。

这也是一个不错的尝试，就是不知道 AGPL 是否能适当的保护开源项目，并与商业组织取得合适的平衡。

### 明尼苏达大学开发者被禁止向 Linux 内核提供代码

明尼苏达大学的 Qiushi Wu（博士生）和 Kangjie Lu（助理教授）提交了一篇研究论文《[通过伪装的提交在开源软件中隐蔽地引入漏洞](https://cse.umn.edu/cs/news/paper-accepted-ieee-symposium-security-and-privacy-2021)》，[以看似有益的提交实际上引入了其他关键问题](https://github.com/QiushiWu/QiushiWu.github.io/blob/main/papers/OpenSourceInsecurity.pdf)。而根据最近 Linux 内核接到的一些补丁来看，他们选择了 Linux 内核项目来进行他们的实验。

负责维护 Linux 内核的格雷（GKH）是仅次于 Linus 的负责人，他对这种行为进行了强烈谴责！但是发送这些补丁的人认为这只是他们写的一个静态分析器提交的补丁，最多只是质量不佳。格雷认为这些是谎言，愤怒之下决定禁止该大学向 Linux 内核提交代码，并撤销了他们之前提交的补丁。

简直是够了，Linux 内核不是试验场，供任何人随意摆弄。

### Google 资助开发 OpenSSL 的替代品 Rustls

许多 SSL/TLS 库由于是用 C 语言编写的，所以安全问题由来已久。通过使用 Rust 开发的 OpenSSL 替代品 Rustls，开发人员可以尽可能确保代码是内存安全的，这将大大减少安全问题的数量。

互联网安全研究组（ISRG）宣布，谷歌已经为 Rust 开发者提供了资金，以对 Rustls 进行改进。ISRG 将使用 Rustls 来使 Apache HTTP 服务器更加安全。

期待看到 Rustls 能证明 Rust 的成功。


明尼苏达大学研究人员为什么被踢出 Linux 内核贡献者？

Summary: 明尼苏达大学的研究人员被踢出了 Linux 贡献群体，Linux 内核社区撤销了之前他们提交的所有 Linux 内核代码，并且，以后默认拒绝所有来自该大学的内核贡献！发生了什么？是什么让 Linux 内核社区勃然大怒？

《论通过伪装提交在开源软件中隐蔽地引入漏洞的可行性》，至少在Linux内核这样活跃的开源项目里这么做还是十分困难的，也算是证明了开源的优越吧

这些孙子怎么不在自己家里测一下炸弹是否能够爆炸呢?

K liu 的补丁已经通过了审查，只是在合并到内核之前被他自己撤销了，这件事实际证明了一个很久之前就有很多人怀疑的事情，现有的内核审查方式能在多大程度上阻止恶意补丁？K liu的做法相当于扒下来皇帝的新装，所以linux内核社区非常震怒也是自然的，不过我觉得他们更应该考虑如何去改进审查流程。

这种人说不定真能做出来这样的事情呢

来自112.28.175.241的 Chromium 72.0|GNU/Linux 用户

不尊重别人的劳动成果，自己树靶子自己打，无良，外网的评论一样是批判。

# 明尼苏达大学研究人员为什么被踢出 Linux 内核贡献者？

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

正如我们昨天报道的，明尼苏达大学的研究人员被踢出了 Linux 贡献群体，Linux 内核社区撤销了之前他们提交的所有 Linux 内核代码，并且，以后默认拒绝所有来自该大学的内核贡献！

发生了什么？是什么让 Linux 内核社区勃然大怒？

这一切始于 2021 年 4 月 6 日对 Linux 内核的一个看似无辜的补丁。明尼苏达大学的一名博士生（Aditya Pakki）提交了一个一共只修改/增加了两行的[小补丁](https://lore.kernel.org/lkml/20210407000913.2207831-1-pakki001@umn.edu/)：

```
Signed-off-by: Aditya Pakki <pakki001@umn.edu>
---
 net/rds/message.c | 1 +
 net/rds/send.c    | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/net/rds/message.c b/net/rds/message.c
index 071a261fdaab..90ebcfe5fe3b 100644
--- a/net/rds/message.c
+++ b/net/rds/message.c
@@ -180,6 +180,7 @@ void rds_message_put(struct rds_message *rm)
 		rds_message_purge(rm);

 		kfree(rm);
+		rm = NULL;
 	}
 }
 EXPORT_SYMBOL_GPL(rds_message_put);
diff --git a/net/rds/send.c b/net/rds/send.c
index 985d0b7713ac..fe5264b9d4b3 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -665,7 +665,7 @@ static void rds_send_remove_from_sock(struct list_head *messages, int status)
 unlock_and_drop:
 		spin_unlock_irqrestore(&rm->m_rs_lock, flags);
 		rds_message_put(rm);
-		if (was_on_sock)
+		if (was_on_sock && rm)
 			rds_message_put(rm);
 	}

```

由于这个补丁很简单，而且似乎改善了代码的质量，它最初得到了一些成员的支持，但后来[在 4 月 9 日受到了 Eric Dumazet 的质疑](https://lore.kernel.org/lkml/bd3c84bc-6ae0-63e9-61f2-5cf64a976531@gmail.com/)。

而在 4 月 19 日，资深的内核贡献者 [Al Viro 斥责该贡献者](https://lore.kernel.org/lkml/YH4Aa1zFAWkITsNK@zeniv-ca.linux.org.uk/)提交了一个“没有修复任何东西的补丁”。他指出了提交垃圾代码补丁的两种可能性：

>
> 简单地说，这个补丁要么显示出完全缺乏理解，要么显示出有人不真诚地行事。如果是后者[1]，我可以建议尊敬的社会学家们滚蛋，不要再用故意喷出的排泄物来测试审核者了？
>
>
>

如果你觉得他用词太激烈了，这背后是有原因和历史的。

前不久，明尼苏达大学的博士生 Qiushi Wu 和助理教授 Kangjie Lu（看起来是中国人或华裔？）提交了一篇研究论文《[论通过伪装提交在开源软件中隐蔽地引入漏洞的可行性](https://github.com/QiushiWu/QiushiWu.github.io/blob/main/papers/OpenSourceInsecurity.pdf)》。据之前发布在明尼苏达大学的一篇[新闻稿（已被删除）](https://cse.umn.edu/cs/news/paper-accepted-ieee-symposium-security-and-privacy-2021)，该论文被 2021 年 IEEE 安全与隐私研讨会接受：

>
> CS&E 很荣幸地与大家分享博士生 Qiushi Wu 和助理教授 Kangjie Lu 为即将举行的[第 42 届 IEEE 安全与隐私研讨会](https://www.ieee-security.org/TC/SP2021/program-papers.html)所撰写的论文。IEEE S&P 是展示计算机安全和电子隐私发展的首要论坛，并将该领域的研究人员和从业人员聚集在一起。
>
>
> 他们的论文《论通过伪装提交在开源软件中隐蔽地引入漏洞的可行性》集中讨论了开源软件的供应链安全。
>
>
> “这项工作影响深远，”Lu 教授说，“供应链安全已经成为当今的一个重要话题。我们的论文已经引起了安全界和开源社区的极大兴趣。”
>
>
> Wu 和 Lu 将在 5 月的虚拟会议期间展示他们的研究。
>
>
>

研究人员正在测试通过伪装提交在开源软件中隐蔽引入漏洞的可行性，也就是说，以看似有益的提交实际上引入了其他关键问题。结合最近发生的一些软件供应链攻击事件，看起来这是一篇很有意义的论文，也难怪会被 IEEE 会议接受。

然而，似乎他们选择了 Linux 内核项目来进行他们的实验来完成论文。Al Viro 发现，Aditya Pakki 的“无用补丁”很可能是这项研究的一部分。

对 Aditya Pakki 提交的[另外一个补丁](https://lore.kernel.org/linux-nfs/20210407001658.2208535-1-pakki001@umn.edu/)：

```
 	}
-	gss_release_msg(gss_msg);
+	if (gss_msg)
+		gss_release_msg(gss_msg);
 }
```

GKH [警告称](https://lore.kernel.org/linux-nfs/YH5%2Fi7OvsjSmqADv@kroah.com/)，不要浪费内核维护者的时间提交这种补丁，Greg Kroah-Hartman（GKH）是仅次于 Linus Torvalds 的内核项目负责人：

>
> 请停止提交已知无效的补丁。你的教授正在玩弄审查程序，以便用一些奇怪的、怪异的方式实现一篇论文。
> 这是不对的，这是在浪费我们的时间，我们将不得不**再次**向你的大学报告此事……
>
>
>

显然，这不是唯一引起争议的补丁请求。而 [Leon Romanovsky 指出](https://lore.kernel.org/linux-nfs/YH+zwQgBBGUJdiVK@unreal/)，还有 3 个这样的补丁来自同一个研究人员，并认为这些补丁增加了安全漏洞：

> 他们故意引入内核错误。昨天，我看了一下从 Aditya 那里接受的 4 个补丁，其中 3 个增加了各种严重的安全 “漏洞”。

面对这些公开抨击，该大学的研究人员 Aditya Pakki [认为自己是受害者，指责内核维护者的态度](https://lore.kernel.org/linux-nfs/YH%2FfM%2FTsbmcZzwnX@kroah.com/)：

>
> 敬请停止胡乱指责，这近乎诽谤。
>
>
> 这些补丁是作为我写的一个新的静态分析器的一部分发送的，它的灵敏度显然不是很高。我发送补丁的目的是希望得到反馈。我们不是 Linux 内核方面的专家，反复发表这些言论让人听了很反感。
>
>
> 显然，这一步错了，但你的先入为主的偏见是如此强烈，你提出的指控毫无根据，这种怀疑也不会带来任何好处。
>
>
> 这种态度不仅让人讨厌，而且对新手和非专家也是一种恐吓，我再也不会发送任何补丁了。
>
>
>

这激怒了 GKH，[他说：](https://lore.kernel.org/linux-nfs/YH%2FfM%2FTsbmcZzwnX@kroah.com/)

>
> 你和你的团队，已经公开承认发送了有缺陷的补丁，以了解内核社区对它们的反应，并且发表了一篇基于这项工作的论文。现在你又提交了一系列新的有明显错误的补丁，那么我应该对这样的事情怎么看？
>
>
> 它们显然不是由一个有智慧的静态分析工具创建的，因为它们都是完全不同的模式的结果，而且所有这些显然根本没有修复任何东西。 那么，除了你和你的团队在继续通过发送这种无稽之谈的补丁对内核社区的开发者进行试验之外，我还能想到什么？
>
>
> ……
>
>
> 任何有 C 语言知识的人，只要花几分钟就能看出你提交的文件根本没有任何作用，所以认为一个工具创造了它们，然后你认为它们是一个有效的“修复”，这完全是你的疏忽，而不是我们的疏忽。你才是有错的人，我们的工作不是成为你创造的工具的测试对象。
>
>
> ……
>
>
> 我们的社区不喜欢被实验，也不喜欢通过提交已知的补丁来“测试”，这些补丁要么是故意什么都不做，要么是故意引入错误的。 如果你想做这样的工作，我建议你找一个不同的社区来进行你的实验，这里不欢迎你。
>
>
> 正因为如此，我现在不得不禁止你的大学今后的所有贡献，并撕掉你以前的贡献，因为它们显然是以恶意的方式提交的，目的就是为了造成问题。
>
>
>

随后，GKH 撤销了明尼苏达大学提交的大量[补丁](https://lore.kernel.org/lkml/20210421130105.1226686-1-gregkh@linuxfoundation.org/)，GKH 表示：

>
> 我一直想这么做，但最近的事件终于迫使我这么做了。
>
>
> ……
>
>
> 这个小组提交的所有文件都必须从内核树上撤销，并需要再次进行审查，以确定它们是否真的是一个有效的修复。 在这项工作完成之前，请删除这些变更，以确保没有问题被引入代码库。
>
>
> 这个补丁集包含了“简单”的修正，还有 68 个需要人工审查的修正。 其中一些不能被恢复，因为它们已经被恢复了，或者被确定其为无效的后续补丁所修复。这证明这些提交的文件几乎都是错误的。
>
>
> 我将和其他一些内核开发者一起工作，以确定这些还原是否真的是有效的变更，如果是的话，以后会重新正确提交。就目前而言，还是安全为上。
>
>
> 我将通过我的开发树进行，所以维护者们不需要担心这个问题，但他们应该意识到，未来任何从 umn.edu 地址来的人提交的文件应该被默认拒绝，除非确定它实际上是一个有效的修复（即他们提供证据，你可以验证它，但是说真的，为什么要浪费你的时间做那些额外的工作？）
>
>
>

对此，你怎么看？

本文参考信息： lore.kernel.org、news.itsfoss.com。


开源供应链：一个有关信任的问题

# 开源供应链：一个有关信任的问题

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

共同作者：Curtis Franklin, Jr

开源软件通常被认为比专有软件更安全、更有保障，因为如果用户愿意，他们可以从源代码编译软件。他们知道在他们环境中运行的代码的来源。在他们的环境中运行的代码每个部分都可以被审查，也可以追溯每段代码的开发者。

然而，用户和提供者们正在逐渐远离完全控制软件所带来的复杂性，而在转而追求软件的便捷和易用。

VMware 副总裁兼首席开源官 Dirk Hohndel 说：“当我看到在一个有关网络安全和隐私的讲座中，演讲者运行 `docker run` 命令来安装和运行一些从互联网上下载的随机二进制文件时，我经常会大吃一惊。这两件事似乎有点相左。”

软件供应链，即将应用程序从编码、打包、分发到最终用户的过程是相当复杂的。如果其中有一环出现错误，可能会导致软件存在潜在的风险，特别是对于开源软件。一个恶意行为者可以访问后端，并在用户不知情或不受控的情况下向其插入任何可能的恶意代码。

这样的问题不单单存在于云原生领域，在现代应用开发中很常见，这包括 JavaScript、NPM、PyPI、RubyGems 等等。甚至连 Mac 上的 Homebrew 过去也是通过源代码提供，由用户自己编译。

“如今，你只需要下载二进制文件并安装它，并期望其源代码并没有被恶意修改过。”Hohndel 说，“作为一个行业，我们需要更加关注我们的开源代码供应。这对我来说是非常重要的事，我正努力让更多的人意识到其重要性。”

然而，这不仅仅是一个二进制与源代码的关系。只运行一个二进制文件，而不必从源代码构建所有东西有着巨大的优势。当软件开发需求发生转变时候，这种运行方式允许开发人员在过程中更加灵活和响应更快。通过重用一些二进制文件，他们可以在新的开发和部署中快速地循环。

Hohndel 说：“如果有办法向这些软件添加签名，并建立一个‘即时’验证机制，让用户知道他们可以信任此软件，那就更好了。”

Linux 发行版解决了这个问题，因为发行版充当了看门人的角色，负责检查进入受支持的软件存储库的软件包的完整性。

“像通过 Debian 等发行版提供的软件包都使用了密钥签名。要确保它确实是发行版中应包含的软件，需要进行大量工作。开发者们通过这种方式解决了开源供应链问题。”Hohndel 说。

但是，即使在 Linux 发行版上，人们也希望简化事情，并以正确性和安全性换取速度。现在，诸如 AppImage、Snap 和 Flatpack 之类的项目已经采用了二进制方式，从而将开源供应链信任问题带入了 Linux 发行版。这和 Docker 容器的问题如出一辙。

“理想的解决方案是为开源社区找到一种设计信任系统的方法，该系统可以确保如果二进制文件是用受信任网络中的密钥签名的，那么它就可以被信任，并允许我们可靠地返回源头并进行审核，” Hohndel 建议。

但是，所有这些额外的步骤都会产生成本，大多数项目开发者要么不愿意，或无力承担。一些项目正在尝试寻找解决该问题的方法。例如，NPM 已开始鼓励提交软件包的用户正确认证和保护其账户安全，以提高平台的可信度。

### 开源社区善于解决问题

Hohndel 致力于解决开源供应链问题，并正试图让更多开发者意识到其重要性。去年，VMware 收购了 Bitnami，这为管理由 VMware 所签名的开源软件提供了一个良机。

“我们正在与各种上游开源社区进行交流，以提高对此的认识。我们还在讨论技术解决方案，这些方案将使这些社区更容易解决潜在的开源供应链问题。” Hohndel 说。

开源社区历来致力于确保软件质量，这其中也包括安全性和隐私性。不过，Hohndel 说：“我最担心的是，在对下一个新事物感到兴奋时，我们经常忽略了需要的基础工程原则。”

最终，Hohndel 认为答案将来自开源社区本身。 “开源是一种工程方法论，是一种社会实验。开源就是人们之间相互信任、相互合作、跨国界和公司之间以及竞争对手之间的合作，以我们以前从未有过的方式。”他解释说。

---

via: <https://www.linux.com/articles/open-source-supply-chain-a-matter-of-trust/>

作者：[Swapnil Bhartiya](https://www.linux.com/author/swapnil/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Kevin3599](https://github.com/kevin3599) 校对：[wxy](https://github.com/wxy)

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


Summary: 更多：• WSL2 已提供对 GUI 应用程序的初步支持 • 勒索软件组织向苹果勒索五千万美元

# 硬核观察 | 人们真正从 Stack Overflow 复制和粘贴的频率是多少？

### 人们真正从 Stack Overflow 复制和粘贴的频率是多少？

Stack Overflow 的灵感来自于其创始人对那些把编码问题的答案放在付费墙后面的网站的失望。因此，也一直有一种调侃说程序员从 Stack Overflow 网站上复制代码。现在，Stack Overflow 花了两周时间对在他们网站上按下 Ctrl-C 的行为进行[统计](https://stackoverflow.blog/2021/04/19/how-often-do-people-actually-copy-and-paste-from-stack-overflow-now-we-know/)。其中有些结果让人意外：

每四个访问 Stack Overflow 问题的用户中，就有一个在访问该页面的五分钟内复制了一些东西。两周内，在 7 百万个帖子和评论中，总共做了 4 千万次复制。人们从答案中复制的频率是问题的 10 倍，是评论的 35 倍。人们从代码块中复制的频率是周围文本的 10 倍以上。令人惊讶的是，在没有被接受的答案的问题上复制的次数比在被接受的问题上复制的次数多。

所以，如果你曾经因为从 Stack Overflow 上复制代码而不是从头开始写代码而感到难过，请原谅你自己吧。

### WSL2 已提供对 GUI 应用程序的初步支持

微软给这一功能起了一个名字叫 [WSLg](https://devblogs.microsoft.com/commandline/the-initial-preview-of-gui-app-support-is-now-available-for-the-windows-subsystem-for-linux-2/)。这意味着我们不仅可以借助 WSL 来执行命令行程序，也能够在 Windows 10 上更好地运行跨平台的 Linux GUI 应用。对于开发者来说，这也方便了他们在 Linux 环境中对相关程序进行测试。WSL 上的 Linux GUI 应用程序，还提供了对音频 / 麦克风的开箱即用支持，以及对 GPU 加速的 3D 图形支持。

以后，不知道是 Linux 吃了 Windows，还是 Windows 吃了 Linux。

### 勒索软件组织向苹果勒索五千万美元

为苹果公司代工 MacBooks 等产品的广达电脑公司遭到了勒索软件 REvil 的攻击，攻击者窃取了该公司现有和未来产品的工程制造图纸，索要五千万美元赎金。广达拒绝了这一要求，REvil 组织现在[将勒索目标对准了苹果公司](https://www.theverge.com/2021/4/21/22396283/apple-schematics-leak-ransomware-quanta-supplier-leak)，要求苹果在五月一日前支付五千万美元。它已公开的产品图纸是苹果刚刚宣布的新款 iMac。

你自己防得了勒索还不行，还得保证你的下游工厂也一样安全才行。


用开源工具定制 Mac 终端主题的 4 个步骤

Summary: 用开源工具让你的终端窗口在 Mac 上漂亮起来。

赞！用上了

用开源工具让你的终端窗口在 Mac 上漂亮起来。

# 用开源工具定制 Mac 终端主题的 4 个步骤

>
> 用开源工具让你的终端窗口在 Mac 上漂亮起来。
>
>
>

你是否曾经厌倦了在你的 macOS 电脑上看到同样老式的终端窗口？如果是这样，使用开源的 Oh My Zsh 框架和 Powerlevel10k 主题为你的视图添加一些点缀。

这个基本的逐步教程将让你开始定制你的 macOS 终端。如果你是一个 Linux 用户，请查看 Seth Kenlon 的指南 [为 Zsh 添加主题和插件](https://opensource.com/article/19/9/adding-plugins-zsh) 以获得深入指导。

### 步骤 1：安装 Oh My Zsh

[Oh My Zsh](https://ohmyz.sh/) 是一个开源的、社区驱动的框架，用于管理你的 Z shell （Zsh） 配置。

Oh My Zsh 是在 MIT 许可下发布的。使用以下命令安装：

```
$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

```

### 步骤 2：安装 Powerlevel10k 字体

Powerlevel10k 是一个 MIT 许可的 Zsh 主题。在安装 Powerlevel10k 之前，你需要为你的终端安装自定义字体。

到 [Powerlevel10 GitHub](https://github.com/romkatv/powerlevel10k) 页面，在 `README` 中 搜索 “fonts”。安装自定义字体的步骤会根据你的操作系统而有所不同。这只需要简单地点击-下载-安装的系列操作。

### 步骤 3：安装 Powerlevel10k 主题

接下来，运行以下命令安装 Powerlevel10k：

```
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

```

完成后，用文本编辑器，比如 [Vim](https://opensource.com/resources/what-vim)，打开 `~/.zshrc` 配置文件，设置行 `ZSH_THEME="powerlevel10k/powerlevel10k`，然后保存文件。

### 步骤 4：完成 Powerlevel10 的设置

打开一个新的终端，你应该看到 Powerlevel10k 配置向导。如果没有，运行 `p10k configure` 来调出配置向导。如果你在步骤 2 中安装了自定义字体，那么图标和符号应该正确显示。将默认字体更改为 `MeslowLG NF`。

当你完成配置后，你应该会看到一个漂亮的终端。

就是这些了！你应该可以享受你美丽的新终端了。

---

via: <https://opensource.com/article/21/4/zsh-mac>

作者：[Bryant Son](https://opensource.com/users/brson) 选题：[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/) 荣誉推出


硬核观察 | Ubuntu 21.04 发布，进一步和微软密切关系

Summary: 更多：• Sophos 称第一季度的恶意软件流量中有一半是 TLS 加密的 • ARK 称比特币挖矿可能对地球有好处

我坚持比特币会崩。现在只是有利可图无数人削尖脑袋往里挤，所以往上涨，无利可图的时候就得崩。而这东西必然会到无利可图的时候，因为本身不生产任何东西，单纯的消耗能源资源。反之，如果不崩，将来发展到能够大范围流通，那也需要它有个合理固定的价值。不管它是发展得好还是差它都得先崩一次。

# 硬核观察 | Ubuntu 21.04 发布，进一步和微软密切关系

### Ubuntu 21.04 发布，进一步和微软密切关系

这个新版本代号是“多毛河马”，Wayland 取代 [X.org](http://x.org/) 成为默认显示服务器桌面。不过 [X.Org](http://x.org/) 会话仍然保留，在需要时可以切换。Ubuntu 21.04 使用的是 GNOME 3.38 桌面，没有换到最新的 GNOME 40 上，但是官方带来了一个新的暗色主题。Ubuntu 21.04 使用的是 Linux 5.11 内核。Ubuntu 21.04 可在此[下载](https://ubuntu.com/download)，需要说明的是，这个版本不是长期支持版。

另外，Canonical 和微软已经宣布对 Ubuntu 上的微软 SQL 服务器进行性能优化和联合支持。Canonical CEO Mark 说，“在 Ubuntu 上提供原生的活动目录集成和认证的微软 SQL 服务器对我们的企业客户来说是重中之重。”我认为，这些出现在一个非 LTS 版本中，更多还属于一种试水的感觉吧，或许到下一个 LTS 版本才会有企业正式使用。

### Sophos 称第一季度的恶意软件流量中有一半是 TLS 加密的

英国信息安全公司 Sophos [估计](https://www.theregister.com/2021/04/21/sophos_research/)，仅在 2021 年的前三个月，它观察到的恶意软件流量中就有仅一半是使用 TLS 来加密其 C&C 流量以及数据渗出的。而 2020 这一数字是 23%。TLS 是支撑 HTTPS 网络连接等的加密协议，它隐藏了网络流量的内容，使其免受外部检查。恶意者对 TLS 的滥用意味着防御者的生活变得更加艰难。

Sophos 说，“恶意软件使用 TLS 的总体增长，很大一部分与越来越多地使用受 TLS 保护的合法网络和云服务，如 Discord、Pastebin、GitHub 和谷歌的云服务作为恶意软件组件的存储库有关。”

这就是道高一尺魔高一丈，TLS 保护了隐私和安全的同时，也保护了恶意软件流量。

### ARK 称比特币挖矿可能对地球有好处

比特币挖矿通常被抨击为大量消耗能源，但女股神 Wood 麾下的 ARK 投资管理机构称，“加密货币挖矿可以推动对太阳能的投资，拥有比特币的世界，在处于均衡状态时，会从可再生的无碳能源中产生更多的电力。”鉴于 ARK 在加密货币领域的大量投资，其在推广加密货币的绿色节能方面具有明显的利益动机，上述观点未被其他研究人员广泛接受。花旗集团最近就表示，比特币挖矿的功耗自 2015 年以来已跃升 66 倍；BCA 研究公司则表示，对环境的担忧可能会随着时间的推移侵蚀比特币的价值。

环保只是用来攻击比特币的一个方面，重点其实还是比特币这些加密货币对世界是否有意义。我觉得，这需要时间来证明。


用 Sigil 在 Linux 上创建和编辑 EPUB 文件

# 用 Sigil 在 Linux 上创建和编辑 EPUB 文件

Sigil 是一个开源的 Linux、Windows 和 MacOS 上的 EPUB 编辑器。你可以使用 Sigil 创建一个新的 EPUB 格式的电子书，或编辑现有的 EPUB 电子书（以 `.epub` 扩展结尾的文件）。

如果你感到好奇，EPUB 是一个标准的电子书格式，并被几个数字出版集团认可。它被许多设备和电子阅读器支持，除了亚马逊的 Kindle。

### Sigil 让你创建或编辑 EPUB 文件

[Sigil](https://sigil-ebook.com/) 是一个允许你编辑 EPUB 文件的开源软件。当然，你可以从头开始创建一个新的 EPUB 文件。

很多人在 [创建或编辑电子书时非常相信 Calibre](https://itsfoss.com/create-ebook-calibre-linux/)。它确实是一个完整的工具，它有很多的功能，支持的格式不只是 EPUB 格式。然而，Calibre 有时可能需要过多的资源。

Sigil 只专注于 EPUB 书籍，它有以下功能：

* 支持 EPUB 2 和 EPUB 3（有一定的限制）
* 提供代码视图预览
* 编辑 EPUB 语法
* 带有多级标题的目录生成器
* 编辑元数据
* 拼写检查
* 支持正则查找和替换
* 支持导入 EPUB、HTML 文件、图像和样式表
* 额外插件
* 多语言支持的接口
* 支持 Linux、Windows 和 MacOS

Sigil 不是你可以直接输入新书章节的 [所见即所得](https://www.computerhope.com/jargon/w/wysiwyg.htm) 类型的编辑器。由于 EPUB 依赖于 XML，因此它专注于代码。可以将其视为用于 EPUB 文件的 [类似于 VS Code 的代码编辑器](https://itsfoss.com/best-modern-open-source-code-editors-for-linux/)。出于这个原因，你应该使用一些其他 [开源写作工具](https://itsfoss.com/open-source-tools-writers/)，以 epub 格式导出你的文件（如果可能的话），然后在 Sigil 中编辑它。

Sigil 有一个 [Wiki](https://github.com/Sigil-Ebook/Sigil/wiki) 来提供一些安装和使用 Sigil 的文档。

### 在 Linux 上安装 Sigil

Sigil 是一款跨平台应用，支持 Windows 和 macOS 以及 Linux。它是一个流行的软件，有超过十年的历史。这就是为什么你应该会在你的 Linux 发行版仓库中找到它。只要在你的发行版的软件中心应用中寻找它就可以了。

你可能需要事先启用 universe 仓库。你也可以在 Ubuntu发行版中使用 `apt` 命令：

```
sudo apt install sigil

```

Sigil 有很多对 Python 库和模块的依赖，因此它下载和安装了大量的包。

我不会列出 Fedora、SUSE、Arch 和其他发行版的命令。你可能已经知道如何使用你的发行版的软件包管理器，对吧？

你的发行版提供的版本不一定是最新的。如果你想要 Sigil 的最新版本，你可以查看它的 GitHub 仓库。

* [Sigil 的 GitHub 仓库](https://github.com/Sigil-Ebook/Sigil)

### 并不适合所有人，当然也不适合用于阅读 ePUB 电子书

我不建议使用 Sigil 阅读电子书。Linux 上有 [其他专门的应用来阅读 .epub 文件](https://itsfoss.com/open-epub-books-ubuntu-linux/)。

如果你是一个必须处理 EPUB 书籍的作家，或者如果你在数字化旧书，并在各种格式间转换，Sigil 可能是值得一试。

我还没有大量使用 过 Sigil，所以我不提供对它的评论。我让你去探索它，并在这里与我们分享你的经验。

---

via: <https://itsfoss.com/sigile-epub-editor/>

作者：[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/) 荣誉推出