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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


GNU 核心实用程序简介

# GNU 核心实用程序简介

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

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

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

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

### GNU coreutils

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

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

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

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

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

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

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

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

### util-linux

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

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

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

### 总结

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

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

---

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

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

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


使用 mergefs 增加虚拟存储

# 使用 mergefs 增加虚拟存储

<img src="content_image/album_202005_10_220750xyyry5mf8fydyqey.png" alt="" title="">

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

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

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

### 安装和配置 mergefs

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

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

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

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

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

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

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

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

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

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

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

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

看起来是这样的：

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

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

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

继续示例：

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

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

这是最终结果：

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

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

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

这是所有文件详情：

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

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

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

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

---

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

### 1、创建 nft 表

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

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

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

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

### 2、创建链

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

### 3、添加规则

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

### 总结

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

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

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

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


FirewallD 防火墙使用概述

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

# FirewallD 防火墙使用概述

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

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

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

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

### 一、安装

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

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

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

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

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

```
yum install firewall-config
```

直接进行安装即可。

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

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

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

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

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

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

查询状态：

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

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

```
systemctl status firewalld
```

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

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

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

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

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

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

用户可以使用命令：

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

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

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

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

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

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

启动防火墙：

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

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

```
systemctl enable firewalld
```

停止防火墙：

```
systemctl stop firewalld
```

停止随系统启动：

```
systemctl disable firewalld
```

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

```
systemctl mask firewalld
```

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

用户可以使用命令：

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使用命令：

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使用命令：

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

用户可以使用命令：

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

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

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

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

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

### 四、后记

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


Systemd 服务：响应变化

# Systemd 服务：响应变化

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

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

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

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

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

### 有 Udev 支持的热插拔

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

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

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

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

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

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

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

规则的第一部分,

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

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

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

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

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

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

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

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

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

或者…

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

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

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

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

```
SUBSYSTEM=input
```

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

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

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

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

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

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

```
udevadm info -a /dev/video1

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

 looking at device '/devices/pci0000:00/0000:00:1c.3/0000:04:00.0
  /usb3/3-1/3-1:1.0/video4linux/video1':
 KERNEL=="video1"
 SUBSYSTEM=="video4linux"
 DRIVER==""
 ATTR{dev_debug}=="0"
 ATTR{index}=="0"
 ATTR{name}=="HP Webcam HD 2300: HP Webcam HD"

[etc...]
```

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

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

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

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

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

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

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

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

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

### 最后的服务

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

```
# webcam.service

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

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

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

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

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

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

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

   sleep 0.5
done
```

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

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

### 插线

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

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

```
systemctl status webcam.service
```

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

### 接下来

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

请期待下一篇。

---

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


学会爱上 systemd

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

# 学会爱上 systemd

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

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

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

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

### Linux 引导

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

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

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

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

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

### systemd 之争

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

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

我认为两者都有其优势。

#### 为何我更喜欢 SystemV

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

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

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

#### 为何我更喜欢 systemd

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

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

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

#### 真正的问题

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

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

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

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

#### 替换SystemV

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

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

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

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

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

### systemd 任务

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

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

### 架构

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

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

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

### 作为 1 号进程的 systemd

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

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

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

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

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

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

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

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

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

*图 3: systemd 启动图*

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

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

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

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

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

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

systemd 还提供了一个工具，该工具列出了完整的启动过程或指定单元的依赖项。单元是一个可控的 systemd 资源实体，其范围可以从特定服务（例如 httpd 或 sshd）到计时器、挂载、套接字等。尝试以下命令并滚动查看结果。

```
systemctl list-dependencies graphical.target
```

注意，这会完全展开使系统进入 `graphical.target` 运行模式所需的顶层目标单元列表。也可以使用 `--all` 选项来展开所有其它单元。

```
systemctl list-dependencies --all graphical.target
```

你可以使用 `less` 命令来搜索诸如 `target`、`slice` 和 `socket` 之类的字符串。

现在尝试下面的方法。

```
systemctl list-dependencies multi-user.target
```

和

```
systemctl list-dependencies rescue.target
```

和

```
systemctl list-dependencies local-fs.target
```

和

```
systemctl list-dependencies dbus.service
```

这个工具帮助我可视化我正用的主机的启动依赖细节。继续花一些时间探索一个或多个 Linux 主机的启动树。但是要小心，因为 systemctl 手册页包含以下注释：

>
> “请注意，此命令仅列出当前被服务管理器加载到内存的单元。尤其是，此命令根本不适合用于获取特定单元的全部反向依赖关系列表，因为它不会列出被单元声明了但是未加载的依赖项。”
>
>
>

### 结尾语

即使在没有深入研究 systemd 之前，很明显能看出它既强大又复杂。显然，systemd 不是单一、庞大、独体且不可知的二进制文件。相反，它是由许多较小的组件和旨在执行特定任务的子命令组成。

本系列的下一篇文章将更详细地探讨 systemd 的启动，以及 systemd 的配置文件，更改默认的目标以及如何创建简单服务单元。

### 资源

互联网上有大量关于 systemd 的信息，但是很多都很简短、晦涩甚至是带有误导。除了本文提到的资源外，以下网页还提供了有关 systemd 启动的更详细和可靠的信息。

* Fedora 项目有一个很好的实用的 [systemd 指南](https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html)。它有你需要知道的通过 systemd 来配置、管理和维护 Fedora 主机所需的几乎所有知识。
* Fedora 项目还有一个不错的[速记表](https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet)，将老的 SystemV 命令与对比的 systemd 命令相互关联。
* 有关 systemd 的详细技术信息及创建它的原因，请查看 [Freedesktop.org](http://Freedesktop.org) 对 [systemd 描述](http://www.freedesktop.org/wiki/Software/systemd)。
* [Linux.com](http://Linux.com) 的“systemd 的更多乐趣”提供了更高级的 systemd [信息和技巧](https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/)。

还有针对 Linux 系统管理员的一系列技术性很强的文章，作者是 systemd 的设计师和主要开发者 Lennart Poettering。这些文章是在 2010 年 4 月至 2011 年 9 月之间撰写的，但它们现在和那时一样有用。关于 systemd 及其生态的其它许多好文都基于这些论文。

* [重新思考 1 号进程](http://0pointer.de/blog/projects/systemd.html)
* [systemd 系统管理员篇 I](http://0pointer.de/blog/projects/systemd-for-admins-1.html)
* [systemd 系统管理员篇 II](http://0pointer.de/blog/projects/systemd-for-admins-2.html)
* [systemd 系统管理员篇 III](http://0pointer.de/blog/projects/systemd-for-admins-3.html)
* [systemd 系统管理员篇 IV](http://0pointer.de/blog/projects/systemd-for-admins-4.html)
* [systemd 系统管理员篇 V](http://0pointer.de/blog/projects/three-levels-of-off.html)
* [systemd 系统管理员篇 VI](http://0pointer.de/blog/projects/changing-roots)
* [systemd 系统管理员篇 VII](http://0pointer.de/blog/projects/blame-game.html)
* [systemd 系统管理员篇 VIII](http://0pointer.de/blog/projects/the-new-configuration-files.html)
* [systemd 系统管理员篇 IX](http://0pointer.de/blog/projects/on-etc-sysinit.html)
* [systemd 系统管理员篇 X](http://0pointer.de/blog/projects/instances.html)
* [systemd 系统管理员篇 XI](http://0pointer.de/blog/projects/inetd.html)

---

via: <https://opensource.com/article/20/4/systemd>

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

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


Summary: 更多：Telegram 放弃了 17 亿美元的 TON 区块链项目；Pineloader 为 Linux 智能机提供了多启动支持

每个人对新闻会有自己的解读，你的点评还是自己留着好，避免祸从口出。

# 新闻速读 > 只要五分钟，骇客就能通过 Thunderbolt 漏洞窃取你的数据

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

#### 只要五分钟，骇客就能通过 Thunderbolt 漏洞窃取你的数据

安全专家 Björn Ruytenberg 日前在研究后发现，骇客只需利用一套被称作 Thunderspy 的技术，就可以轻松地在配有 Thunderbolt 连接口的 PC 或 Linux 电脑上窃取用户的加密数据。按照他的说法，在骇客能够亲手接触到设备的前提下，其实只需要螺丝刀、简易的便携硬件以及区区五分钟时间就能得手了。目前市面上仍有大部分来自各品牌的旧款机种要面临受到这类攻击的风险。

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

>
> 硬核老王点评：物理安全是最后的防线。
>
>
>

#### Telegram 放弃了 17 亿美元的 TON 区块链项目

面对美国证券交易委员会（SEC）的强势监管，Telegram 已经放弃了 17 亿美元的 TON 加密货币项目，同时被要求向投资者退款。这家拥有 4 亿用户的消息应用运营商今日宣布，在与 SEC 开展了旷日持久的论战之后，其最终还是放弃了即将推出的 Telegram Open Network 区块链项目。TON 的溃败，意味着向公众发起各种空气币 ICO 的机会窗口，已被监管机构重重地关上。

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

>
> 硬核老王点评：这扇大门被关上了，从一定意义是制止了泡沫和欺诈的产生，而将会倒逼区块链领域产生新的创新。
>
>
>

#### Pineloader 为 Linux 智能机提供了多启动支持

爱好者们可以在一款手机上安装多个不同的 Linux 操作系统，然后在启动时轻松选择想用的那一个。尽管引导选择界面不支持触摸操作，但玩家可以通过音量加减来上下选择，然后轻击电源键来确认选择。

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

#### Win10 May 2020 Update 新安全功能保护电脑免遭不需要应用攻击

据了解，Windows 10 用户在互联网上搜索免费版本软件时经常会下载到名声不佳的应用程序。而许多声誉不佳的应用程序都会跟可能不受欢迎的应用程序捆绑在一起，如果运行了这些应用程序，其可能会减慢 Windows 10 的运行速度、插入广告甚至改变浏览器的搜索引擎。对此，Windows 10 May 2020 Update 在 Windows 安全程序中引入了新保护功能，其提供了针对可能不受欢迎的应用程序的保护，但目前该功能在默认情况下则是处于未启用状态。

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

#### Facebook 与内容审核员们和解：后者因心理创伤获赔 5200 万美元

据外媒报道，Facebook 同意支付 5200 万美元和解与内容审核员们的诉讼。后者声称因为反复查看儿童性侵和恐怖主义图片等令人不安的材料而产生心理创伤。这起和结案共覆盖逾 1 万名现任和前任 Facebook 审核员。律师称，这些人将每人收到 1000 美元医学排查费用，如有必要，还将额外获得治疗费用。

来源：[新浪科技](https://tech.sina.com.cn/i/2020-05-13/doc-iircuyvi2791511.shtml?cre=tianyi&mod=pctech&loc=10&r=25&rfunc=79&tj=none&tr=25)

>
> 硬核老王点评：内容审核终究还是一种人力活，做这个工作的人得有多高的心理耐受度？
>
>
>

#### Ubuntu Server 安装程序漏洞：将密码泄露到日志中

Subiquity 是 Ubuntu Server 的安装程序，它已经存在了近 3 年，但是直到上个月底发布的 Ubuntu 20.04 才将其作为默认支持工具。 Subiquity 一直以来维护得也比较粗糙，很快就有开发者发现了其中的一个严重漏洞。该漏洞被标记为 CVE 2020-11932，严重程度为“紧急”，不过，开发者目前已经修复了该漏洞。

来源：[开源中国](https://www.oschina.net/news/115601/ubuntu-server-subiquity-password-leak)

>
> 硬核老王点评：漏洞很严重，应该对这种转正后的应用做比较全面的审查。
>
>
>

#### 台积电 5nm 客户曝光：今年仅苹果华为，AMD 等明年加入

近日，一份台积电 5nm 工艺的客户名单曝光，2020 年，台积电只为两家公司量产 5nm 芯片，分别是苹果和华为海思，前者是 A14 和 A14X 处理器，华为海思的则是麒麟 1000 及网络处理器。2021-2022 年量产的客户及产品都将增多，除了华为和苹果，目前曝光的还有 6 家，分别是 AMD、博通、高通、英伟达、联发科和英特尔。

来源：[网易科技](https://tech.163.com/20/0513/09/FCGDOBD1000999LD.html)

#### 国外 5G 网速测试出炉，沙特第一，美国最慢

国外知名测试机构 Opensignal 近日发布了 8 个国家的 5G 网速测试报告，结果有 7 个国家的 5G 网速比 4G 和 WiFi 速度更快。排名第一的是沙特阿拉伯，美国是唯一 5G 网速比 WiFi 慢的国家，双方网速相差 5.5 倍。

来源：[网易科技](https://tech.163.com/20/0513/09/FCGDI31G000999LD.html)


Summary: 完全不必惊慌。这真的很容易“修复”。

完全不必惊慌。这真的很容易“修复”。

# 修复 Ubuntu 中的 “Unable to parse package file” 错误

过去，我已经讨论了许多 [Ubuntu 更新错误](https://itsfoss.com/ubuntu-update-error/)。如果你[使用命令行更新 Ubuntu](https://itsfoss.com/update-ubuntu/)，那可能会遇到一些“错误”。

其中一些“错误”基本上是内置功能，可防止对系统进行不必要的更改。在本教程中，我不会涉及那些细节。

在本文中，我将向你展示如何解决在更新系统或安装新软件时可能遇到的以下错误：

```
Reading package lists… Error!
E: Unable to parse package file /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease
E: The package lists or status file could not be parsed or opened.
```

在 Debian 中可能会遇到类似的错误：

```
E: Unable to parse package file /var/lib/apt/extended_states (1)
```

即使遇到 `The package cache file is corrupted` 也完全不必惊慌。这真的很容易“修复”。

### 在基于 Ubuntu 和 Debian 的 Linux 发行版中处理 “Unable to parse package file” 错误

<img src="content_image/album_202005_13_162038ovbjb3vhv5hh5fh2.png" alt="" title="">

以下是你需要做的。仔细查看 [Ubuntu](https://ubuntu.com/) 报错文件的名称和路径。

```
Reading package lists… Error!
E: Unable to parse package file /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease
E: The package lists or status file could not be parsed or opened.
```

例如，上面的错误是在报 `/var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease` 文件错误。

这让你想到这个文件不正确。现在，你需要做的就是删除该文件并重新生成缓存。

```
sudo rm <file_that_is_not_parsed>
```

因此，这里我可以使用以下命令：`sudo rm /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease`，然后使用 `sudo apt update` 命令重建缓存。

#### 给初学者的分步指导

如果你熟悉 Linux 命令，那么可能知道如何使用绝对路径删除文件。对于新手用户，让我指导你安全删除文件。

首先，你应该进入文件目录：

```
cd /var/lib/apt/lists/
```

现在删除无法解析的文件：

```
sudo rm archive.ubuntu.com_ubuntu_dists_bionic_InRelease
```

现在，如果你再次运行更新，将重新生成 apt 缓存。

```
sudo apt update
```

#### 有很多文件无法解析？

如果你在更新系统时有一个或两个文件无法解析，那么问题不大。但是，如果系统报错有十个或二十个此类文件，那么一一删除它们就太累了。

在这种情况下，你可以执行以下操作来删除整个缓存，然后再次生成它：

```
sudo rm -r /var/lib/apt/lists/*
sudo apt update
```

#### 解释这为何能解决问题

`/var/lib/apt` 是与 apt 软件包管理器相关的文件和数据的存储目录。`/var/lib/apt/lists` 是用于保存系统 `source.list` 中指定的每个软件包资源信息的目录。

简单点来说，`/var/lib/apt/lists` 保存软件包信息缓存。当你要安装或更新程序时，系统会在此目录中检查该软件包中的信息。如果找到了该包的详细信息，那么它将进入远程仓库并实际下载程序或其更新。

当你运行 `sudo apt update` 时，它将构建缓存。这就是为什么即使删除 `/var/lib/apt/lists` 目录中的所有内容，运行更新也会建立新的缓存的原因。

这就是处理文件无法解析问题的方式。你的系统报某个软件包或仓库信息以某种方式损坏（下载失败或手动更改 `sources.list`）。删除该文件（或所有文件）并重建缓存即可解决此问题。

#### 仍然有错误？

这应该能解决你的问题。但是，如果问题仍然存在，或者你还有其他相关问题，请在评论栏告诉我，我将尽力帮助你。

---

via: <https://itsfoss.com/unable-to-parse-package-file/>

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

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


如何利用 SSL/TLS 保护你的 Linux 邮件服务

Summary: 通过理解安全证书来保护你的 Linux 邮件服务。

通过理解安全证书来保护你的 Linux 邮件服务。

# 如何利用 SSL/TLS 保护你的 Linux 邮件服务

>
> 通过理解安全证书来保护你的 Linux 邮件服务。
>
>
>

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

通常，不管你是通过<ruby> 简单邮件传输协议 <rt>  Simple Mail Transport Protocol </rt></ruby>（SMTP）或者<ruby> 互联网消息访问协议 <rt>  Internet Message Access Protocol </rt></ruby>（IMAP）或<ruby> 邮局协议 <rt>  Post Office Protocol </rt></ruby>（POP）发送或者接受邮件，邮件服务默认都是以无保护的明文来传输数据。近来随着数据加密成为越来越多程序的共识，你需要<ruby> 安全套接层 <rt>  Secure Sockets Layer </rt></ruby>/<ruby> 传输层安全性 <rt>  Transport Layer Security </rt></ruby>（SSL/TLS）的安全证书来保护你的邮件服务。

首先，快速回顾一下邮件服务和协议的基本流程。邮件通过 SMTP 从 TCP 端口 25 发出。这个协议依靠 DNS <ruby> 邮件交换服务器 <rt>  Mail eXchanger </rt></ruby>（MX）记录的地址信息来传输邮件。当邮件到达邮件服务器后，可以被以下两种服务中的任意一种检索：使用 TCP 端口 143 的 IMAP，或者使用 TCP 端口 110 的 POP3（邮局协议第 3 版）。然而，以上服务都默认使用明文传输邮件和认证信息。这非常的不安全！

为了保护电子邮件数据和认证，这些服务都增加了一个安全功能，使它们可以利用 SSL/TLS 证书对数据流和通讯进行加密封装。SSL/TLS 是如何加密数据的细节不在本文讨论范围，有兴趣的话可以阅读 [Bryant Son 关于互联网安全的文章](/article-11699-1.html)了解更多细节。概括的说，SSL/TLS 加密是一种基于公钥和私钥的算法。

通过加入这些安全功能后，这些服务将监听在新的 TCP 端口：

| 服务 | 默认 TCP 端口 | SSL/TLS 端口 |
| --- | --- | --- |
| SMTP | 25 | 587 |
| IMAP | 143 | 993 |
| POP3 | 110 | 995 |

### 生成 SSL/TLS 证书

[OpenSSL](https://www.openssl.org/) 可以生成免费的 SSL/TLS 证书，或者你也可以从公共<ruby> 证书颁发机构 <rt>  Certificate Authoritie </rt></ruby>（CA）购买。过去，生成自签发证书十分简单而且通用，但是由于安全被日益重视，大部分的邮件客户端是不信任自签发证书的，除非手动设置。

如果你只是自己使用或者做做测试，那就使用自签发证书省点钱吧。但是如果很多人或者客户也需要使用的话，那最好还是从受信任的证书颁发机构购买。

不管是哪种情况，开始请求新证书的过程是使用 Linux 系统上的 OpenSSL 工具来创建一个<ruby> 证书签发请求 <rt>  Certificate Signing Request </rt> （CSR）：</ruby>

```
$ openssl req -new -newkey rsa:2048 -nodes -keyout mail.mydomain.key -out mail.mydomain.csr
```

这个命令会为你想保护的服务同时生成一个新的 CSR 文件和一个私匙。它会询问你一些证书相关的问题，如：位置、服务器的<ruby> 完全合规域名 <rt>  Fully Qualified Domain Name </rt></ruby>（FQDN）、邮件联系信息等等。当你输入完这些信息后，私钥和 CSR 文件就生成完毕了。

#### 如果你想生成自签发证书

如果你想要生成自签发证书的话，在运行以上 CSR 命令之前，你必须先创建一个[自己的根 CA](https://en.wikipedia.org/wiki/Root_certificate)。你可以通过以下方法创建自己的根 CA。

```
$ openssl genrsa -des3 -out myCA.key 2048
```

命令行会提示你输入一个密码。请输入一个复杂点的密码而且不要弄丢了，因为这将会是根 CA 私钥的密码，正如其名称所示，它是你的证书中所有信任关系的根。

接下来，生成根 CA 证书：

```
$ openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem
```

在回答完一些问题后，你就拥有一个有效期为 5 年的根 CA 证书了。

用之前生成的 CSR 文件，你可以请求生成一个新证书，并由您刚才创建的根 CA 签名。

```
$ openssl x509 -req -in mail.mydomain.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out mail.mydomain.pem -days 1825 -sha256
```

输入你的根 CA 私钥的密码来创建和签署证书。

现在你有了配置电子邮件服务以增强安全性所需的两个文件：私匙文件 `mail.mydomain.key` 和公开证书文件 `mail.mydomain.pem`。

#### 如果你愿意购买证书

如果你愿意从机构购买证书，则需要上传 CSR 文件到证书颁发机构的系统中，它将会被用于生成 SSL/TLS 证书。证书可作为文件下载，比如 `mail.mydomain.pem`。很多 SSL 机构也需要你下载一个中间证书。如果是这样的话，你必须把这个两个证书合并成一个，这样电子邮件服务就可以将这两个证书结合起来处理。可以使用以下命令把你的证书和第三方中间证书合并在一起：

```
$ cat mail.mydomain.pem gd_bundle-g2-g1.crt > mail.mydomain.pem
```

值得一提的是 `.pem` 文件后缀代表<ruby> 隐私增强邮件 <rt>  Privacy-Enhanced Mail </rt></ruby>。

现在你就有全部的设置邮件服务安全所需文件了：私匙文件 `mail.mydomain.key` 和组合的公开证书文件 `mail.mydomain.pem`。

### 为你的文件生成一个安全的文件夹

不管你是的证书是自签发的或者从机构购买，你都需要生成一个安全的，管理员拥有的文件夹用于保存这两个文件。可以使用以下命令来生成：

```
$ mkdir /etc/pki/tls
$ chown root:root /etc/pki/tls
$ chmod 700 /etc/pki/tls
```

在复制文件到 `/etc/pki/tls` 后，再次设置这些文件的权限：

```
$ chmod 600 /etc/pki/tls/*
```

### 配置你的 SMTP 和 IMAP 服务

接下来，让 SMTP 和 IMAP 服务使用新的安全证书。我们用 `postfix` 和 `dovecot` 来作为例子。

用你顺手的编辑器来编辑 `/etc/postfix/main.cf` 文件。添加以下几行：

```
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/mail.mydomain.pem
smtpd_tls_key_file = /etc/pki/tls/mail.mydomain.key
```

### 自定义选项

以下选项可以启用或禁用各种加密算法，协议等等：

```
smtpd_tls_eecdh_grade = strong
smtpd_tls_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = high
smtpd_tls_security_level=may
smtpd_tls_ciphers = high
tls_preempt_cipherlist = yes
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtpd_tls_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
```

编辑 `/etc/dovecot/dovecot.conf` 文件，添加以下三行：

```
ssl = required
ssl_cert = </etc/pki/tls/mail.mydomain.pem
ssl_key = </etc/pki/tls/mail.mydomain.key
```

添加下列更多选项来启用或禁用各种加密算法、协议等等（我把这些留给你来理解）：

```
ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:ALL:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SSLv2
ssl_prefer_server_ciphers = yes
ssl_protocols = !SSLv2 !SSLv3 !TLSv1 !TLSv1.1
ssl_min_protocol = TLSv1.2
```

### 设置 SELinux 上下文

如果你的 Linux 发行版启用了 SELinux，请为你的新证书文件设置正确的 SELinux 上下文。

对于 Postfix 设置 SELinux：

```
$ chcon -u system_u -t cert_t mail.mydomain.*
```

对于 Dovecot 设置 SELinux：

```
$ chcon -u system_u -t dovecot_cert_t mail.mydomain.*
```

重启这些服务，并与你相应更新过的电子邮件客户端配置连接。有些电子邮件客户端会自动探测到新的端口，有些则需要你手动更新。

### 测试配置

用 `openssl` 命令行和 `s_client` 插件来简单测试一下：

```
$ openssl s_client -connect mail.mydomain.com:993
$ openssl s_client -starttls imap -connect mail.mydomain.com:143
$ openssl s_client -starttls smtp -connect mail.mydomain.com:587
```

这些测试命令会打印出很多信息，关于你使用的连接、证书、加密算法、会话和协议。这不仅是一个验证新设置的好方法，也可以确认你使用了适当的证书，以及在 postfix 或 dovecot 配置文件中定义的安全设置正确。

保持安全！

---

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

作者：[Marc Skinner](https://opensource.com/users/marc-skinner) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Acceleratorrrr](https://github.com/Acceleratorrrr) 校对：[wxy](https://github.com/wxy)

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


新闻速读 > 华为否认提交给 Linux 内核的不安全补丁 HKSP 来自官方

Summary: 更多：阿里云自研数据仓库 AnalyticDB 再捧 TPC 全球冠军；腾讯受益于疫情收入大涨

# 新闻速读 > 华为否认提交给 Linux 内核的不安全补丁 HKSP 来自官方

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

#### 华为否认提交给 Linux 内核的不安全补丁 HKSP 来自官方

上周有华为工程师为 Linux 内核提交了一个内核强化补丁 HKSP（华为内核自我防护Huawei Kernel Self Protection），不过在代码检查后，该补丁被发现存在安全漏洞。根据 ZDNet 的消息，华为已经在周一的一份声明中表示，尽管该项目的名称中使用了“华为”，并且该项目是由其一名顶级安全工程师开发的，但华为并未正式参与 HKSP 项目。华为同时也表示，该项目代码从未在任何正式的华为产品中实际使用过：“这只是个人用于与开源社区 Openwall 进行技术讨论的演示代码。”

来源：[开源中国](https://www.oschina.net/news/115632/huawei-denies-involvement-in-buggy-linux-kernel-patch-proposal?tdsourcetag=s_pctim_aiomsg)

>
> 硬核老王点评：本来是一个普普通通的代码质量问题，但在有些人解读之下却浮想联翩。不过，个人项目冠名华为这样的行为在该公司是允许的吗？
>
>
>

#### 阿里云自研数据仓库 AnalyticDB 再捧 TPC 全球冠军

5月14日，TPC 官网正式公布，阿里云自研的 AnalyticDB 通过了TPC-DS全流程测试，将前世界纪录的性能提升了29%，并把单位成本降低了三分之二，成功夺得全球数据仓库的桂冠。

来源：[CSDN](https://mp.weixin.qq.com/s/rpZ8gbEw-Ak9_7Sc2eQShg)

>
> 硬核老王点评：似乎对阿里云热衷于得到各种比赛的冠军已经有点麻木了。
>
>
>

#### 腾讯受益于疫情收入大涨

新冠病毒疫情带动“宅经济”发展，中国最大的游戏和互联网巨头腾讯控股周三公布，首季度净利按年增长 6%，而按非国际财务报告准则（Non-GAAP）净利增幅更达29%，内地防疫家居隔离带动其网络游戏及网络广告收入增长。然而，随着内地各地陆续复工复产，腾讯预期，游戏的用户使用时长及游戏内消费活动将大致回复正常水平，但公司相信，游戏行业已从结构上扩大了其长期受众及吸引力。

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

>
> 硬核老王点评：虽然不能说游戏是邪恶的，但是一家公司因为这种情况带来的这种收入大涨，怎么也感觉有点不对味。当然，曾经有信誓旦旦不做游戏的公司最终也是投资了游戏行业，其实想想公司都是为牟利而生的，也就不足为怪了。只希望这些公司在牟利的同时不要忘记社会责任感。
>
>
>

#### Deno 1.0 发布

Deno 是作者 Ryan Dahl 在 Node 之后的又一大作，它是一个新的运行时，用于在 Web 浏览器之外执行 JavaScript 和 TypeScript，其采用 Rust 编写而成。Deno 试图提供一个独立的工具来快速编写复杂功能的脚本，它将始终是单个可执行文件。就像 Web 浏览器一样，它知道如何获取外部代码。在 Deno 中，单个文件可以定义任意复杂的行为，而无需任何其它工具。Ryan Dahl 认为过去他在设计 Node 时犯了一些错误，包括安全性、构建系统、package.json、node\_modules、index.js 等等，并表示 Node 存在的种种不足导致有许多严重问题且不可回避，当前 JavaScript 和周围的软件基础架构已经发生了巨大的变化，值得进行简化，于是他重新设计了 Deno 这门脚本语言。

来源：[开源中国](https://www.oschina.net/news/115625/deno-1-0-released)

>
> 硬核老王点评：确实 Node.JS 在取得成功的同时，也暴露出之前的一些先天不足。这个值得期待。
>
>
>

#### 最冷清的应用商店：Windows 10 商店

无论是 iOS 还是 Android，系统内置的应用商店都门庭若市。然而在 Windows 10 上，情况却截然不同——自带的应用商店门可罗雀，时至今日，绝大部分用户在 Windows 10 中安装软件的主流方式，依然是自行下载软件安装，Windows 10 商店似乎已然是一个鸡肋般的存在。

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

>
> 硬核老王点评：这样比起来，Linux 桌面的应用商店（软件中心）或许更被用户所接受。
>
>
>

#### CreepRank 算法帮助谷歌 Play 商店剔除了 813 款 Android 蠕虫应用

据悉，来自纽约大学、康奈尔科技学院、以及 NortonLifeLock（原赛门铁克）的学者们，对这些蠕虫软件展开了深入的分析。这里提到的蠕虫，特指不具有完整的间谍或追踪功能的移动 App 。即便如此，别有用心的开发者仍可借此对用户展开间接追踪、骚扰、欺诈或威胁他人。研究团队开发的 CreepRank 算法，能够识别移动 App 中疑似的蠕虫行为，然而对每款 App 进行打分。

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

#### UCloud 发布物联网边缘网关 IoT Edge，实现边云协同

用户可以将 UIoT Edge 运行系统直接安装到符合要求的 X86、ARM 硬件网关。该系统实现了子设备数据的采集、解析、清洗、加工、缓存，本地场景的实时控制与联动，可广泛应用于工业制造、能源电气、智慧社区、物业楼宇、智能农业、新零售等领域。UIoT Edge 边缘网关提供子设备接入、函数计算、消息路由、一键部署/远程运维和本地 Web Portal 五大功能。目前，UIoT Edge进入公测阶段。

来源：[UCloud](https://mp.weixin.qq.com/s/B6JNQvkyOca25o1V6hIMHQ)


用于各种用途的最佳树莓派操作系统

# 用于各种用途的最佳树莓派操作系统

[树莓派](https://www.raspberrypi.org/) 是一款不可缺少的单板电脑，在很多工作中都能派上用场。不相信？只要[看看这个树莓派项目列表](https://itsfoss.com/raspberry-pi-projects/)，就能了解这个小小的设备能做什么。

考虑到树莓派用途这么多，为它选择一个合适的操作系统就极其重要。当然，你可以用 Linux 做很多事，但专门为特定目的配置的操作系统可以为你节省大量的时间和精力。

因此，本文中我要介绍一些专门为树莓派量身定制的流行且实用的操作系统。

### 由于有树莓派镜像工具，安装任何操作系统到树莓派上都很容易

[在 SD 卡上安装树莓派操作系统](/article-12136-1.html)比以前容易得多。你只需下载[树莓派镜像](https://www.raspberrypi.org/downloads/)就可以快速地安装任何树莓派操作系统。请看下面的官方视频，你就知道有多简单。

你也可以使用 [NOOBS](https://www.raspberrypi.org/downloads/noobs/)（<ruby> 新开箱即用软件 <rt>  New Out Of the Box Software </rt></ruby>）在树莓派上轻松安装各种的操作系统。你还可以从他们的 [NOOBS 官方下载页面](https://www.raspberrypi.org/downloads/noobs/)提到的支持的零售商列表中获得预装 SD 卡。

欢迎在他们的[官方文档](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)中了解更多关于安装操作系统的信息。

* [下载树莓派操作系统](https://www.raspberrypi.org/downloads/)

现在你知道了怎么安装它（以及从哪儿获取），让我来重点介绍几个有用的树莓派操作系统，希望对你有所帮助。

### 适用于树莓派的各种操作系统

请注意，我花了一些精力筛选出了那些被积极维护的树莓派操作系统项目。如果某个项目在不久的将来会停止维护，请在评论区告诉我，我会更新本文。

另一件事是，我关注到现在最新的版本是树莓派 4，但是下面的列表不应被认为是树莓派 4 的操作系统列表，这些系统应该也能用于树莓派 3、3B+ 和其他变种，但是请参照项目的官方网站了解详细信息。

**注意：** 排名不分先后。

#### 1、Raspbian OS：官方的树莓派操作系统

Raspbian OS 是官方支持的树莓派板卡操作系统。它集成了很多工具，用于教育、编程以及其他广泛的用途。具体来说，它包含了 Python、Scratch、Sonic Pi、Java 和其他一些重要的包。

最初，Raspbian OS 是基于 Debian 的，并预装了大量有用的包。因此，当你安装 Raspbian OS 后，你可能就不需要特意安装基本工具了 — 你会发现大部分工具已经提前安装好了。

Raspbian OS 是被积极地维护着的，它也是最流行的树莓派操作系统之一。你可以使用 [NOOBS](https://www.raspberrypi.org/downloads/noobs/) 或参照[官方文档](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)来安装它。

* [Raspbian OS](https://www.raspbian.org/)

#### 2、Ubuntu MATE：适合通用计算需求

尽管 Raspbian 是官方支持的操作系统，但它的特点不是最新、最大的软件包。因此，如果你想更快的更新，想用最新的包，你可以试试 Ubuntu MATE 的树莓派版本。

Ubuntu MATE 的树莓派定制版是值得安装的非常不错的轻量级发行版。它还被广泛用于 [NVIDIA 的 Jetson Nano](https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-nano/)。换言之，你可以在树莓派的很多场景下使用它。

为了更好地帮助你，我们还有一份详细的教程：[怎样在树莓派上安装 Ubuntu MATE](/article-10817-1.html)。

* [Ubuntu MATE for Raspberry Pi](https://ubuntu-mate.org/raspberry-pi/)

#### 3、Ubuntu Server：把树莓派作为一台 Linux 服务器来使用

如果你计划把你的树莓派当作项目的某个服务器来使用，那么安装 Ubuntu Server 会是一个不错的选择。

Ubuntu Server 有 32 位和 64 位的镜像。你可以根据你的板卡类型（是否支持 64 位）来选择对应的操作系统。

然而，值得注意的一点是 Ubuntu Server 不是为桌面用户定制的。因此，你需要留意 Ubuntu Server 默认不会安装图形用户界面。

* [Ubuntu Server](https://ubuntu.com/download/raspberry-pi)

#### 4、LibreELEC：适合做媒体服务器

我们已经有一个 [Linux 下可用的媒体服务器软件](https://itsfoss.com/best-linux-media-server/)，LibreELEC 在列表中。

它是一个很棒的轻量级操作系统，让你可以在树莓派上安装 [KODI](https://kodi.tv/)。你可以尝试使用树莓派镜像工具来安装它。

你可以很容易地找到他们的[官方下载页面](https://libreelec.tv/downloads_new/)，并找到适合你板卡的安装镜像。

* [LibreELEC](https://libreelec.tv/)

#### 5、OSMC：适合做媒体服务器

OSMC 是另一个 Linux 下[流行的媒体服务器软件](https://itsfoss.com/best-linux-media-server/)。如果要把树莓派板作为媒体中心设备，那么 OSMC 是你可以向他人推荐的操作系统之一。

类似 LibreELEC，OSMC 也运行 KODI，可以帮助你管理你的媒体文件和欣赏你已有的素材。

OSMC 没有正式提及对树莓派 4 的支持。因此，如果你的树莓派是树莓派 3 或更早的版本，那么应该没有问题。

* [OSMC](https://osmc.tv/)

#### 6、RISC OS：最初的 ARM 操作系统

RISC OS 最初是为 ARM 设备打造的，至今已有近 30 年左右的历史。

如果你想了解，我们也有篇详细介绍 [RISC OS](https://itsfoss.com/risc-os-is-now-open-source/) 的文章。简而言之，RISC OS 也是为诸如树莓派的现代基于 ARM 的单板计算机定制的。它的用户界面很简单，更专注于性能。

同样的，这并不是为树莓派 4 量身定做的。因此，如果你的树莓派是 3 或更早的版本，你可以试一下。

* [RISC OS](https://www.riscosopen.org/content/)

#### 7、Mozilla WebThings Gateway：适合 IoT 项目

作为 Mozilla 的 [IoT 设备的开源实现](https://iot.mozilla.org/about/)的一部分，WebThings Gateway 让你可以监控和控制所有连接的 IoT 设备。

你可以参考[官方文档](https://iot.mozilla.org/docs/gateway-getting-started-guide.html)来检查所需的环境，遵照指导把安装到树莓派上。它确实是适合 IoT 应用的最有用的树莓派操作系统之一。

* [WebThings Gateway](https://iot.mozilla.org/gateway/)

#### 8、Ubuntu Core：适合 IoT 项目

Ubuntu Core 是又一个树莓派操作系统，适用于潜在的 [IoT](https://en.wikipedia.org/wiki/Internet_of_things) 应用，或者只是测试一下 Snap。

Ubuntu Core 是专门为 IoT 设备或者具体来说是树莓派定制的。我不会刻意宣传它 —— 但是 Ubuntu Core 是一款适合树莓派板卡的安全操作系统。你可以自己尝试一下！

* [Ubuntu Core](https://ubuntu.com/download/raspberry-pi-core)

#### 9、DietPi：轻量级树莓派操作系统

DietPi 是一款轻量级的 [Debian](https://www.debian.org/) 操作系统，它还宣称比 “Raspbian Lite” 操作系统更轻量。

虽然它被视作一款轻量级的树莓派操作系统，但它提供了很多功能，可以在多个使用场景中派上用场。从简单的软件安装包到备份解决方案，还有很多功能值得探索。

如果你想安装一个低内存占用而性能相对更好的操作系统，你可以尝试一下 DietPi。

* [DietPi](https://dietpi.com/)

#### 10、Lakka Linux：打造复古的游戏主机

想让你的树莓派变成一个复古的游戏主机？

Lakka Linux 发行版本最初是建立在 RetroArch 模拟器上的。因此，你可以立刻在树莓派上获得所有的复古游戏。

如果你想了解，我们也有一篇介绍 [Lakka Linux](/article-10158-1.html) 的文章。或者直接上手吧！

* [Lakka](http://www.lakka.tv/)

#### 11、RetroPie：适合复古游戏

RetroPie 是另一款可以让树莓派变成复古游戏主机的树莓派操作系统。它提供了几个配置工具，让你可以自定义主题，或者调整模拟器即可拥有最好的复古游戏。

值得注意的是它不包含任何有版权的游戏。你可以试一下，看看它是怎么工作的！

* [RetroPie](https://retropie.org.uk/)

#### 12、Kali Linux：适合低成本渗透

想要在你的树莓派上尝试和学习一些道德黑客技巧吗？[Kali Linux](/article-10690-1.html) 会是最佳选择。是的，Kali Linux 通常在最新的树莓派一发布就会支持它。

Kali Linux 不仅适合树莓派，它也支持很多其他设备。尝试一下，玩得愉快！

* [Kali Linux](https://www.offensive-security.com/kali-linux-arm-images/)

#### 13、OpenMediaVault：适合网络附加存储（NAS）

如果你想在极简的硬件上搭建 [NAS](https://en.wikipedia.org/wiki/Network-attached_storage) 解决方案，树莓派可以帮助你。

OpenMediaVault 最初是基于 Debian Linux 的，提供了大量功能，如基于 Web 的管理能力、插件支持，等等。它支持大多数树莓派型号，因此你可以尝试下载并安装它！

* [OpenMediaVault](https://www.openmediavault.org/)

#### 14、ROKOS：适合加密挖矿

如果你对加密货币和比特币很感兴趣，那么 ROKOS 会吸引你。

ROKOS 是基于 Debian 的操作系统，基本上可以让你把你的树莓派变成一个节点，同时预装了相应的驱动程序和软件包。当然，在安装之前你需要了解它是怎么工作的。因此，如果你对此不太了解，我建议你先调研下。

* [ROKOS](https://rokos.space/)

#### 15、Alpine Linux：专注于安全的轻量级 Linux

当今年代，很多用户都在寻找专注于安全和[隐私的发行版本](https://itsfoss.com/privacy-focused-linux-distributions/)。如果你也是其中一员，你可以试试在树莓派上安装 Alpine Linux。

如果你是个树莓派新手，它可能不像你想象的那样对用户友好（或者说对初学者来说容易上手）。但是，如果你想尝试一些不一样的东西，那么你可以试试 Alpine Linux 这个专注于安全的 Linux 发行版本。

* [Alpine Linux](https://alpinelinux.org/)

#### 16、Kano OS：适合儿童教育的操作系统

如果你在寻找一款能让学习变得有趣还能教育儿童的树莓派操作系统，那么 Kano OS 是个不错的选择。

它正在积极维护中，而且 Kano OS 上的桌面集成的用户体验相当简单，玩起来也很有趣，可以让孩子们从中学习。

* [Kano OS](https://kano.me/row/downloadable)

#### 17、KDE Plasma Bigscreen：把普通电视转换为智能电视

这是 KDE 一个正在开发中的项目。在树莓派上安装 [KDE “等离子大屏”](/article-12063-1.html) 后，你可以把普通电视变成智能电视。

你不需要特殊的遥控器来控制电视，你可以使用普通的遥控器。

“等离子大屏”也集成了 [MyCroft 开源 AI](https://itsfoss.com/mycroft-mark-2/) 作为声控。

这个项目还在测试阶段，所以如果你想尝试，可能会有一些错误和问题。

* [Plasma Bigscreen](https://plasma-bigscreen.org/#download-jumpto)

#### 18、Manjaro Linux：为你提供多功能的桌面体验

如果你想在树莓派上寻找一个基于 Arch 的 Linux 发行版，那么 Manjaro Linux 应该是一个很好的补充，它可以做很多事情，适合一般的计算任务。

Manjaro Linux ARM 版也支持最新的树莓派 4。它为你的树莓派或任何[树莓派替代品](/article-10823-1.html)提供了 XFCE 和 KDE Plasma 变体。

此外，它似乎还提供了树莓派设备上最快/最好的体验之一。如果你还没试过，那就试试吧!

* [Manjaro ARM](https://manjaro.org/download/#raspberry-pi-4)

#### 19、Volumio：作为一个开源音乐播放器使用

想做一个廉价的音乐发烧友系统？Volumio 应该可以帮到你。

它是一个自由而开源的操作系统（[GitHub](https://github.com/volumio)），还支持集成多个设备的能力。你可以通过一个简单的 Web 控制界面，对所有连接的设备进行管理。除了免费版之外，它还提供了一个高级版，可以让你获得独家功能。

它也确实支持最新的树莓派 4。所以，如果你对调整已有的家庭立体声系统有一定的兴趣，想要获得最佳的音质，不妨试试这个。

* [Volumio](https://volumio.org/)

#### 20、FreeBSD

不想使用 Linux 发行版？不用担心，你也可以用 FreeBSD 在树莓派上安装一个类 UNIX 操作系统。

如果你不知道的话，我们有一篇关于 [FreeBSD 项目](https://itsfoss.com/freebsd-interview-deb-goodkin/)的详细文章。

一旦你按照他们的[官方说明](https://www.freebsdfoundation.org/freebsd/how-to-guides/installing-freebsd-for-raspberry-pi/)安装好之后，你可以利用它来进行任何 DIY 实验，或者只是把它作为一个轻量级的桌面系统来完成特定的任务。

* [FreeBSD](https://www.freebsd.org/)

#### 21、NetBSD

NetBSD 是另一个令人印象深刻的类 UNIX 操作系统，你可以在树莓派上安装。它的目标是成为一个跨多个系统的便携式操作系统。

如果你在其他系统中使用过它，你可能已经知道它的好处了。然而，它不仅仅是一个轻量级的便携式操作系统，它的特点是拥有一套有用的功能，可以完成各种任务。

* [NetBSD](https://www.netbsd.org/)

### 结语

我相信还有很多为树莓派定制的操作系统 — 但是我尽力列出了被积极维护的最流行的或最有用的操作系统。

如果你觉得我遗漏了最合适树莓派的操作系统，尽情在下面的评论去告诉我吧！

---

via: <https://itsfoss.com/raspberry-pi-os/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lxbwolf](https://github.com/lxbwolf) 校对：[wxy](https://github.com/wxy)

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


无法在 Ubuntu 20.04 上安装 Deb 文件？这是你需要做的！

Summary: 双击 .deb 文件后无法通过 Ubuntu 20.04 的软件中心安装？你不是唯一遇到此问题的人。本教程展示了解决方法。

gdebi 好久每更新了。

来自39.152.20.153的 Chrome 83.0|GNU/Linux 用户

# 无法在 Ubuntu 20.04 上安装 Deb 文件？这是你需要做的！

>
> 双击.deb 文件后无法通过 Ubuntu 20.04 的软件中心安装？你不是唯一遇到此问题的人。本教程展示了解决方法。
>
>
>

在“[安装 Ubuntu 20.04 之后要做的事](/article-12183-1.html)”一文中，一些读者提到他们[用 .deb 文件安装软件](https://itsfoss.com/install-deb-files-ubuntu/)遇到了麻烦。

我发现这很奇怪，因为使用 deb 文件安装程序是最简单的方法之一。你要做的就是双击下载的文件，它会在软件中心中打开（默认情况下）。单击安装，它要求你输入密码，并在几秒钟/分钟内安装了该软件。

我[从 19.10 升级到 Ubuntu 20.04](https://itsfoss.com/upgrade-ubuntu-version/)直到今天都没有遇到这个问题。

我下载了 .deb 文件来安装 [Rocket Chat Messenger](https://rocket.chat/)，然后双击该文件安装时，文件用存档管理器打开。这不是我所期望的。

“修复”很简单，我将在本教程中向你展示。

### 在 Ubuntu 20.04 中安装 deb 文件

由于某些原因，在 Ubuntu 20.04 中 deb 文件的默认打开程序被设置为存档管理器。存档管理器是用于[解压 zip](https://itsfoss.com/unzip-linux/) 和其他压缩文件。

解决此问题的方法非常简单。[在 Ubuntu 中更改默认应用](https://itsfoss.com/change-default-applications-ubuntu/)，将打开 DEB 文件从“存档管理器”改到“软件安装”。让我告诉你步骤。

**步骤 1：**右键单击下载的 .deb 文件，然后选择**属性**：

**步骤 2：**进入“**打开方式**”标签，选择“**软件安装**”，然后点击“**设置为默认**”。

这样，以后所有的 .deb 文件都将通过“软件安装”即软件中心打开。

双击 .deb 文件确认，看看是否在软件中心中打开。

### 忽视的 bug 还是愚蠢的功能？

为什么会用存档管理器打开 deb 文件让人无法理解。我确实希望这是一个 bug，而不是像[在 Ubuntu 20.04 中不允许在桌面上拖放文件](https://itsfoss.com/add-files-on-desktop-ubuntu/)这样的怪异功能。

既然我们在讨论 deb 文件的安装，就让我告诉你一个不错的工具 [gdebi](https://launchpad.net/gdebi)。它是一个轻量级应用，其唯一目的是安装 DEB 文件。有时它也可以处理依赖关系。

你可以了解更多有关[使用 gdebi 并默认设为安装 deb 文件的工具](https://itsfoss.com/gdebi-default-ubuntu-software-center/)。

---

via: <https://itsfoss.com/cant-install-deb-file-ubuntu/>

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

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


Summary: 更多：收太多了，Zerodium 宣布暂停收买 iOS 漏洞利用；自 2016 年以来 Mandrake Android 恶意软件一直在窃取用户数据

# 新闻速读 > Ubuntu Touch OTA-12 正式发布，提供完整 Unity8 使用体验

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

#### Ubuntu Touch OTA-12 正式发布，提供完整 Unity8 使用体验

号称“史上最大版本更新”的 Ubuntu Touch OTA-12 已正式发布。相比较此前几个版本，本次更新带来了巨大改进，其中最大的亮点就是提供了完整的 Unity8 体验，开发团队解释说，导入 Canonical 的最终修改已经完成。对于那些在手机上寻找更精致的 Linux 体验的用户来说，这是一个值得尝试的重要版本。

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

>
> 硬核老王点评：这真是一个值得期待的版本。或许我们该找些这方面的内容分享给大家。
>
>
>

#### 收太多了，Zerodium 宣布暂停收买 iOS 漏洞利用

Zerodium 是一个漏洞利用获取平台，旨在向研究人员支付一定的费用来收买零日安全漏洞，然后转手卖给政府和执法机构等客户。然而本周，Zerodium 竟然宣布 —— 由于短期内提交的 iOS 漏洞利用程序太多，其计划在未来 2~3 个月内不再购买此类内容。据悉，Zerodium 专注于高风险的漏洞，通常每个功能完善的 iOS 漏洞利用会被给予 10 万到 200 万美元的奖励。

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

>
> 硬核老王点评：iOS 也一样不安全啊。
>
>
>

#### 自 2016 年以来 Mandrake Android 恶意软件一直在窃取用户数据

Bitdefender 指出，其行为与大多数常见的威胁有所不同。Mandrake 并不致力于感染更多的设备，而是希望从用特定用户手上榨取更多的数据。之所以谷歌 Play 商店迟迟未能揪出这款恶意软件，是因为 Mandrake 并未直接将这部分内容包含在程序本体。只有在接到指示之后，才会开启加载恶意行为的过程。此外为了给维持用户眼中“可信赖”的错误印象，开发者对“正经功能”的反馈响应也很是积极，甚至某些 App 还有与之关联的社交媒体活跃账号。

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

>
> 硬核老王点评：某些流行安卓软件表示，用得着这么费劲么？
>
>
>

#### 我国有线数字电视缴费用户降至 1.42 亿

报告显示，今年一季度，我国有线电视用户总量净减 310.4 万户，降到了 2.06 亿户，有线电视在用户家庭电视收视的份额降至 45.58%。其中，有线数字用户净减 202 万户，总数为 1.90 亿户，有线数字电视缴费用户为 1.42 亿户，净减 196.2 万户。今年一季度，广电宽带用户总量为 4186.9 万户，季度净减少 57.7 万户，首次出现负增长；在 2019 年四季度，广电宽带用户为 4244.6 万户。

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

>
> 硬核老王点评：除了疫情影响，这可能也是一种时代变化。
>
>
>

#### 世界最大主权财富基金遭遇网络攻击：被骗走 1000 万美元

作为全球最大的主权财富基金 Norfund 基金因网络诈骗，被骗子轻而易举的骗走1000万美元，而骗子是利用了所谓“泄露的付款数据”这一缺陷来作案的。挪威主权基金 Norfund（也被称为挪威国家基金）的资金来源于著名的北海油田收益，目前市值超过 1 万亿美元。该基金表示，有黑客操纵了该组织的一笔交易，将一笔原本打算借给柬埔寨一家小额信贷机构的贷款转入受骗子控制的一个账户，结果导致该基金在 3 月份被骗 1 亿克朗（约为 1000 万美元）。

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

#### Reddit 推出基于以太坊的代币

知名线上论坛 Reddit 正在对两款基于以太坊的加密货币令牌展开公测，贡献内容的用户将获得相应的奖励。作为新发起的“社区积分”计划的一部分，名为 $MOONS 和 $BRICKS 的两款代币将分别发放给 reddit 上的 /r/Cryptocurrency 和 /r/FortniteBR 坛友。目前该项目仍处于公测阶段，预计会持续到 2020 年夏季。

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

#### LibreOffice 7.0 首个 Alpha 版本发布：增强和微软 Office 文档兼容性

本周文档基金会推出了 LibreOffice 7.0 的首个 Alpha 版本。LibreOffice 7.0 预估将会在今年8月份推出，并对该生产力套件中的每一个应用进行了大规模的改进。在该版本中有一个值得关注的改进就是对 .DOCX 文档的导入和导出过滤功能，大大提高了和微软 Office 文档的兼容性。

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


Ubuntu 默认壁纸历代记

Summary: 你喜欢哪张呢？

剪影的创意不错，不过某些版本感觉作画有些崩坏

# Ubuntu 默认壁纸历代记

自从 2004 年 Ubuntu 发布第一个版本 4.10 以来，到前不久[刚刚发布的 20.04 LTS](/article-12142-1.html)，Ubuntu 已经发布了 32 个大版本。在这些版本中，每个版本都会带有一张默认壁纸，这十六年来，我们可以从这些默认壁纸中感受到 Ubuntu 之美的变迁。

我们特别收集了所有这 32 个版本的默认壁纸，以飨读者。

（说明，下列壁纸是我们收集来的最高精度的壁纸，但是在上传和压缩过程中可能会损失精度，如果喜欢某一张的话，可以自行搜索合适尺寸和精度的壁纸。）

### 比较”土”的 4.10 - 7.10

最早期 Ubuntu 的这些默认壁纸，可以是说是很“土”了，不过想想那个时期的计算机审美，也略可理解。

#### Ubuntu 4.10 Warty Warthog

#### Ubuntu 5.04 Hoary Hedgehog

#### Ubuntu 5.10 Breezy Badger

#### Ubuntu 6.06 Dapper Drake

#### Ubuntu 6.10 Edgy Eft

#### Ubuntu 7.04 Feisty Fawn

#### Ubuntu 7.10 Gutsy Gibbon

### 试图突破的 Ubuntu 8.04 - 9.10

在经过了几代灰突突的抽象壁纸之后，在 2008 年的两个版本当中尝试使用了更具形象感的壁纸，以切合该版本的吉祥物，但很快，这种努力就被放弃了。

#### Ubuntu 8.04 Hardy Heron

#### Ubuntu 8.10 Intrepid Ibex

#### Ubuntu 9.04 Jaunty Jackalope

#### Ubuntu 9.10 Karmic Koala

### 紫色滥觞的开始 Ubuntu 10.04 - 13.10

从 Ubuntu 10.04 开始，Ubuntu 壁纸就进入了紫薯，哦不，紫色时代，从此紫色就成了 Ubuntu 的形象色。

#### Ubuntu 10.04 Lucid Lynx

#### Ubuntu 10.10 Maverick Meerkat

#### Ubuntu 11.04 Natty Narwhal

#### Ubuntu 11.10 Oneiric Ocelot

#### Ubuntu 12.04 Precise Pangolin

#### Ubuntu 12.10 Quantal Quetzal

#### Ubuntu 13.04 Raring Ringtail

#### Ubuntu 13.10 Saucy Salamander

### “以刚克柔”的 14.04 - 17.04

从 Ubuntu 14.04 开始，Ubuntu 默认壁纸一改之前的柔性线条，开始在壁纸中大量使用各种直线、折线，这种变化一直延续到现在。此外，14.10 是唯一一个没有新壁纸的大版本，它的默认壁纸和 Ubuntu 14.04 一样（虽然很多版本的壁纸变化也很细微）。

#### Ubuntu 14.04 Trusty Tahr & Ubuntu 14.10 Utopic Unicorn

#### Ubuntu 15.04 Vivid Vervet

#### Ubuntu 15.10 Wily Werewolf

#### Ubuntu 16.04 LTS Xenial Xerus

#### Ubuntu 16.10 Yakkety Yak

#### Ubuntu 17.04 Zesty Zapus

### 剪影动物时代 Ubuntu 17.10

从 Ubuntu 17.10 这个 AA 版本开始，Ubuntu 的默认壁纸在原来的基础上开始加入吉祥物的剪影。

#### Ubuntu 17.10 Artful Aardvark

#### Ubuntu 18.04 LTS Bionic Beaver

#### Ubuntu 18.10 Cosmic Cuttlefish

#### Ubuntu 19.04 Disco Dingo

#### Ubuntu 19.10 Eoan Ermine

#### Ubuntu 20.04 LTS Focal Fossa

看了这些壁纸，你喜欢那张呢？


Ubuntu Studio 将用 KDE Plasma 桌面环境替换 Xfce

Summary: Ubuntu Studio 是一个流行的 Ubuntu 官方变种，它是为从事音频制作、视频、图形、摄影和书籍出版的创意内容创建者量身定制的。它提供了许多多媒体内容创建应用，开箱即用，体验极佳。

KDE的标题栏还是太丑，太宽了

# Ubuntu Studio 将用 KDE Plasma 桌面环境替换 Xfce

[Ubuntu Studio](https://ubuntustudio.org/) 是一个流行的 [Ubuntu 官方变种](https://itsfoss.com/which-ubuntu-install/)，它是为从事音频制作、视频、图形、摄影和书籍出版的创意内容创建者量身定制的。它提供了许多多媒体内容创建应用，开箱即用，体验极佳。

在最近的 20.04 LTS 版本发布之后，Ubuntu Studio 团队在其[官方公告](https://ubuntustudio.org/2020/04/ubuntu-studio-20-04-lts-released/)中强调了一些非常重要的内容。而且，也许不是每个人都注意到关键信息，即 Ubuntu Studio 的未来。

Ubuntu Studio 20.04 将是带有 [Xfce 桌面环境](https://xfce.org)的最后一个版本。将来的所有发行版都将改用 [KDE Plasma](https://kde.org/plasma-desktop)。

### 为什么 Ubuntu Studio 放弃 XFCE？

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

据他们的澄清，Ubuntu Studio 并不专注于任何特定的外观/感受，而是旨在提供最佳的用户体验。同时，KDE 被证明是一个更好的选择。

>
> 事实证明，Plasma 为图形艺术家和摄影师提供了更好的工具，例如在 Gwenview、Krita 甚至文件管理器 Dolphin 中都可以看出。此外，它对 Wacom 平板的支持比其他任何桌面环境都更好。
>
>
> 它已经变得如此之好，以至于现在大部分 Ubuntu Studio 团队成员都在使用通过 Ubuntu Studio 安装程序添加了 Ubuntu Studio 的 Kubuntu 作为日常工作使用。既然我们中的这么多人都在使用 Plasma，因此在我们的下一个版本中过渡到 Plasma 似乎是个好时机。
>
>
>

当然，每一个桌面环境都是针对不同的用户量身定制的。在此，他们认为 KDE Plasma 是最适合取代 XFCE 的桌面环境，可以为所有用户提供更好的用户体验。

尽管我不确定用户对此会有何反应，因为每个用户都有不同的偏好。如果现有用户对 KDE 没有问题，那就没什么大问题。

值得注意的是，Ubuntu Studio 还提到了为什么 KDE 可能是它们的更好选择：

>
> 在没有 Akonadi 的情况下，Plasma 桌面环境的资源使用与 Xfce 一样轻量级，甚至更轻。Fedora Jam 和 KXStudio 等其他以音频为重点的 Linux 发行版在历史上一直使用 KDE Plasma 桌面环境，并且在音频方面做得很好。
>
>
>

此外，他们还强调了 [Jason Evangelho 在福布斯杂志上的一篇文章](https://www.forbes.com/sites/jasonevangelho/2019/10/23/bold-prediction-kde-will-steal-the-lightweight-linux-desktop-crown-in-2020)，其中一些基准测试表明 KDE 几乎与 Xfce 一样轻量级。尽管这是一个好的迹象，我们仍然需要等待用户试驾 KDE 驱动的 Ubuntu Studio。只有这样，我们才能观察到 Ubuntu Studio 放弃 XFCE 桌面环境的决定是否正确。

### 更改后，Ubuntu Studio 用户将发生什么变化？

在带有 KDE 的 Ubuntu Studio 20.10 及更高版本上的整体工作流程可能会受到影响（或改善）。

但是，升级过程（从 20.04 到 20.10）会导致系统损坏。因此，全新安装 Ubuntu Studio 20.10 或更高版本将是唯一的方法。

他们还提到，他们还会不断评估与预安装的应用是否存在重复。所以，相信在未来的日子里，更多的细节也会随之而来。

Ubuntu Studio 是最近一段时间内第二个改变了主桌面环境的发行版。先前，[Lubuntu](https://itsfoss.com/lubuntu-20-04-review/) 从 LXDE 切换到 LXQt。

你如何看待这种变化？欢迎在下面的评论中分享你的想法。

---

via: <https://itsfoss.com/ubuntu-studio-opts-for-kde/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[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: 更多：上游 Linux 开发者反对 -O3 级别的内核优化；Chrome 将从 8 月起屏蔽占用过多资源的广告

# 新闻速读 > 微软总裁布拉德·史密斯坦承微软曾错误地站在 Linux 的历史对立面

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

#### 微软总裁布拉德·史密斯坦承微软曾错误地站在 Linux 的历史对立面

近日，微软总裁布拉德·史密斯在麻省理工学院计算机科学与人工智能实验室主持的一场谈话期间承认：“我个人的观点是，当开源社区在本世纪初开始爆发时，微软曾错误地站在了历史的对立面”。事实上，微软的 Azure 云计算平台，多年来一直支持各种 Linux 发行版，甚至在 Azure Sphere 上使用了基于 Linux 的操作系统来构建物联网应用程序的开发平台。2016 年的 Build 开发者大会上，微软郑重宣布了对 Linux 的喜爱。此外在 Windows 10 操作系统上，软件巨头也提供了“Windows Linux 子系统”（简称 WSL）近年来。

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

>
> 硬核老王点评：微软这样大的一个公司，自从纳德拉上台之后能够迅速转向拥抱开源，非常值得钦佩。
>
>
>

#### 上游 Linux 开发者反对 -O3 级别的内核优化

WireGuard 作者 Jason A. Donenfeld 上周建议在使用新发布的 GCC 10 编译器或更高的版本时，将内核的默认编译优化级别由 -O2 设置为 -O3。Jason 解释道，GCC 10 对 -O2 进行了改进，以便在使用 -flto 时缩短编译时间，不过这似乎是以牺牲性能为代价来实现的。而现在的 -O3 优化不存在和 10 年前同样的错误，所以当 gcc >= 10 时，他提交的补丁会将 Linux 内核的编译优化默认设置为 -O3 级别。不过将内核默认编译优化级别设置为 -O3 的提案遭到了广泛的反对，因为这不一定会让内核变得更快，反而有可能会引入因优化而导致出现的特殊特性，甚至会产生让代码变得更慢的地方。Linus Torvalds 也进行了表态，他不认为这是一个明智的想法，尤其是 GCC -O3 级别的优化有时会导致出现问题。GCC 开发者 Richard Biener 也写道，他不建议在内核中使用 -O3 级别的优化。

来源：[开源中国](https://www.oschina.net/news/115696/linux-upstream-against-o3-optimize-kernal)

>
> 硬核老王点评：过犹不及，对于内核这样的复杂工程，极致优化不是最好的选择。
>
>
>

#### Chrome 将从 8 月起屏蔽占用过多资源的广告

Google 对可能遭到屏蔽的广告设定了三个阈值：消耗的网络浏览 4MB，在任意 30 秒内占用了 15 秒的 CPU 时间，总的 CPU 占用达到了 60 秒。Google 将首先在未来几个月内进行试验，然后在 8 月底释出的新 Chrome 稳定版中正式包含该功能。

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

>
> 硬核老王点评：很多广告确实太过分了，值得期待。
>
>
>

#### Reddit 前 500 子论坛中有 92 个被 5 个人控制

Reddit 是美国最受欢迎的论坛类社交网站，根据官方博客去年底在年度总结中提供的数据，它的月活用户超过了 4.3 亿。在 Reddit 上，用户可以自由的创建子站。许多热门的子站都由相同的人管理，Reddit 用户的统计发现，在前 500 子站中，有 92 个都是由相同的五名版主管理。

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

>
> 硬核老王点评：“专业”人士总是能控制更多资源。
>
>
>

#### Windows 初步加入对 DNS-over-HTTPS (DoH) 的支持

如果在 Windows 10 中启用了 DoH，那么操作系统将会通过 DoH 而不是传统的 DNS 去解析域名。浏览器如 Firefox 和 Chrome 已经加入了对 DoH 的支持，但受到了部分工程师和系统管理员的批评，认为会给企业系统管理员带来麻烦，是将操作系统级的控制权占为己有。通过开发 DoH 客户端，微软恢复了在操作系统层次的控制。

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

>
> 硬核老王点评：我觉得倒是好事，不能说是恢复了在操作系统层面的控制。
>
>
>

#### Gartner 公司称 COVID-19 冲击企业钱包，IT 支出将下降 8％

Gartner 本周表示，受 COVID-19 大流行病的影响，预计 2020 年全球 IT 支出总额将达到 3.4 万亿美元，比 2019 年下降 8%。Gartner 在 1 月份曾预测 2020 年全球 IT 支出总额将达到 3.9 万亿美元，比 2019 年增长 3.4%。

来源：[networkworld](https://www.networkworld.com/article/3544008/gartner-it-spending-will-drop-8-as-covid-19-hits-enterprise-wallets.html)

>
> 硬核老王点评：由预期增长到降低，新冠病毒带来的影响不可忽视，而且这一影响可能还要很久。
>
>
>


使用 FreeBSD 作为桌面操作系统

Summary: FuryBSD 的实时桌面环境能让你在实际使用之前先尝试。

FuryBSD 的实时桌面环境能让你在实际使用之前先尝试。

# 使用 FreeBSD 作为桌面操作系统

>
> FuryBSD 的实时桌面环境能让你在实际使用之前先尝试。
>
>
>

[FreeBSD](https://www.freebsd.org) 是一个很棒的操作系统，但是从设计上讲，它并没有自带桌面环境。如果不从 FreeBSD 的 [ports 和软件包集](https://www.freebsd.org/ports/)安装其他软件，那么 FreeBSD 仅能体验命令行。下面的截图显示了在安装过程中选择了每个“可选系统组件”后，登录 FreeBSD 12.1 的样子。

FreeBSD 可以用各种桌面环境中的任何一种来变成桌面操作系统，但是这需要时间、精力和[遵循大量书面说明](https://www.freebsdfoundation.org/freebsd/how-to-guides/installing-a-desktop-environment-on-freebsd/)。使用使用 desktop-installer 包（为用户提供基于文本的菜单并帮助自动执行大部分过程）仍然非常耗时。这两种方法的最大问题是，用户可能在花了很多时间进行设置之后，可能会发现他们的硬件系统与 FreeBSD 不完全兼容。

[FuryBSD](https://www.furybsd.org) 通过提供实时桌面镜像来解决此问题，用户可以在安装之前对其进行评估。目前，FuryBSD 提供 Xfce 镜像和 KDE 镜像。每个镜像都提供了一个已预安装桌面环境的 FreeBSD。如果用户试用该镜像并发现其硬件工作正常，那么他们可以安装 FuryBSD，并拥有一个由 FreeBSD 驱动的即用桌面操作系统。在本文中，我会使用 Xfce 镜像，但 KDE 镜像的工作原理完全一样。

对于安装过 Linux 发行版、BSD 或任何其他类 Unix 的开源操作系统的人，FuryBSD 的上手过程应该很熟悉。从 FuryBSD 网站下载 ISO，将它复制到闪存盘，然后从闪存盘启动计算机。如果从闪存盘引导失败，请确保“安全引导”已禁用。

从闪存盘启动后，桌面环境将自动加载。除了“家”、“文件系统”和“回收站”图标外，实时桌面还有用于配置 Xorg 的工具、入门指南、FuryBSD 安装程序和系统信息程序的图标。除了这些额外功能以及一些自定义的 Xfce 设置和壁纸外，桌面环境除了基本的 Xfce 应用和 Firefox 之外并没有其他功能。

此时仅加载基本的图形驱动，但足以检查 FuryBSD 是否支持系统的有线和无线网络接口。如果网络接口没有一个能自动工作，那么 `Getting Started.txt` 文件包含有关尝试配置网络接口和其他配置任务的说明。如果至少有一个网络接口有效，那么可以使用 Configure Xorg 应用安装 Intel、NVidia 或 VirtualBox 图形驱动。它将下载并安装驱动，并且需要重新启动 Xorg。如果系统未自动重新登录到实时镜像用户，那么密码为 `furybsd`（你可以使用它来登录）。配置后，图形驱动将转移到已安装的系统中。

如果一切都可以在实时环境中正常运行，那么 FuryBSD 安装程序可以将 FuryBSD 配置并安装到计算机上。该安装程序在终端中运行，但提供与大多数其他 BSD 和 Linux 安装程序相同的选项。系统将要求用户设置系统的主机名、配置 ZFS 存储、设置 root 密码，添加至少一个非 root 用户以及配置时间和日期。完成后，系统可以引导到预装有 Xfce （或 KDE）的 FreeBSD 中。FuryBSD 完成了所有困难的工作，甚至还花了很多精力使桌面看起来更漂亮。

如上所述，桌面环境没有大量预装软件，因此几乎肯定要安装额外的软件包。最快的方法是在终端中使用 `pkg` 命令。该命令的行为很像 `dnf` 和 `apt`，因此使用过其中之一的来自 Linux 发行版的用户在查找和安装软件包时应该感到很熟悉。FreeBSD 的软件包集合非常多，因此大多数知名的开源软件包都可用。

如果用户在没有太多 FreeBSD 经验的情况下尝试 FuryBSD，应查阅 [FreeBSD 手册](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/)，以了解有关如何以 FreeBSD 的方式操作。有任何 Linux 发行版或其他 BSD 使用经验的用户应该能弄清很多事情，但是手册可以帮助你弄清一些差异。进一步了解 FreeBSD 的一个很好的资源是 Michael W. Lucas 的 《[Absolute FreeBSD，第三版](https://nostarch.com/absfreebsd3)》。

---

via: <https://opensource.com/article/20/5/furybsd-linux>

作者：[Joshua Allen Holm](https://opensource.com/users/holmja) 选题：[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: 更多：又一次抛弃 Windows，德国慕尼黑再次拥抱开源；欧洲多台超级计算机中毒，沦为挖矿肉鸡

# 新闻速读 > 开源让软件更加安全了吗？

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

#### 开源让软件更加安全了吗？

近日，软件和芯片设计公司 Synopsys 发布《2020年开源安全和风险分析报告》，指出不安全的开源软件已无处不在。一方面，99%的审计代码库中至少包含一个开源组件，另一方面，经过审核的代码库中有75％包含具有已知安全漏洞的开源组件，老化和废弃的开源组件也无处不在。3 月，安全和许可证合规性管理解决方案提供商 WhiteSource 同样发布了一份《2019年开源组件安全漏洞现状报告》。统计显示，2019年公开的开源软件漏洞数量激增至6000多个，增幅达近50%，原因包含开源软件应用的扩大。开源软件漏洞数量的上升可以归因于开放源组件的广泛采用，过去几年开源社区的大量增长，以及媒体对最近一些数据泄露事件的报道，（使得人们）对开放源代码安全的关注提高。

来源：[开源中国](https://my.oschina.net/editorial-story/blog/4280022)

>
> 硬核老王点评：安全与否和广泛性有关。
>
>
>

#### 又一次抛弃 Windows，德国慕尼黑再次拥抱开源

最近当选的慕尼黑执政联盟在一项联合协议中表示，在技术和经济可行的情况下，该市将重点放在开放标准和自由开源软件上。联盟将执政到 2026 年，原则是只要不涉及任何机密或个人数据，市政府相关软件都将开源，微软 Windows 与 Office 等软件再次被抛弃。这一决定受到不少批评，毕竟此前慕尼黑已经尝试过从微软系软件切换到 Linux，再从 Linux 切换到 Win 10。这一过程中的经济成本巨大，花费时间也比较长。

来源：[开源中国](https://www.oschina.net/news/115715/munich-shift-back-to-opensource-again)

>
> 硬核老王点评：反复带来的是更多的损失。
>
>
>

#### 欧洲多台超级计算机中毒，沦为挖矿肉鸡

据悉周一英国爱丁堡大学首先公布了 ARCHER 超级计算机遭到攻击的报告。同一天德国超级计算机管理组织 bwHPC 宣布因为类似的安全问题，旗下 5 台超级计算机/高性能计算集群现起关闭。周四更多被感染的超级计算机浮出水面。目前尚不清楚究竟是什么人或组织实施了这些攻击，但据安全公司分析，黑客是通过窃取 SSH 凭证获得了超级计算机的访问权限，而大学内部人士因为有权访问这些超级计算机而最有嫌疑。实际上被劫持的 SSH 登录名分别属于加拿大、中国和波兰的大学。所有恶意软件的文件名和网络指示器都证明它们的源头可能是同一个地方。

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

>
> 硬核老王点评：其实就是 SSH 凭证管理不善，没有更高级别的安全管理措施，超级计算机也并不比普通服务器更安全。
>
>
>

#### NVIDIA 与开源社区合作，将 GPU 加速带入 Spark 3.0

NVIDIA 方面宣布与开源社区达成合作，为 Apache Spark 3.0 带来端到端的 GPU 加速。按照计划，随着 Spark 3.0 于春季晚些时候发布，数据科学家和机器学习工程师将首次能够把革命性的 GPU 加速应用于普遍使用 SQL 数据库操作进行的 ETL（提取、转换和加载）数据处理工作负载中。

来源：[开源中国](https://www.oschina.net/news/115712/nvidia-accelerates-apache-spark)

#### 192 个违规收集个人信息的 App 被责令改正，包括“猎豹清理大师”

今年第一季度，全国公安机关网安部门依法查处违法违规收集公民个人信息 App 服务单位 386 个，其中，97 个 App 被予以行政处罚，192 个 App 被依法责令改正违法行为，51 个 App 被下架、停运。十大案例为： 猎豹清理大师、印象笔记、好孕帮、不背单词、哈弗智家、完美校园、天然工坊、随手借、每日瑜伽、Paintly。

来源：[人民公安报](https://www.cnbeta.com/articles/tech/979903.htm)

>
> 硬核老王点评： 这些你安装几个？
>
>
>

#### 《Half-Life：Alyx》更新支持 Linux、Vulkan 和关卡编辑

在今日公布的更新中，Valve 为《Alyx》添加了许多新功能，比如原生支持 Linux（不再需要 Proton）、Vulkan 图形 API、且提供了关卡编辑工具。

来源：[cnBeta.COM](https://hot.cnbeta.com/articles/game/979889.htm)

#### 勒索软件攻击者向纽约律所勒索 4200 万美元

纽约律所 Grubman Shire Meiselas & Sacks (GSMS) 上周遭到了勒索软件 REvil (Sodinokibi) 的攻击，在加密计算机系统中的文件前勒索软件先窃取了其内部文件。攻击者 5 月 7 日在暗网发布信息，公布了一些窃取到的文件截图，给律所一周时间协商和支付赎金。14 日是截止日期，REvil 背后的运营者发布了第二则信息，称律所只愿意支付 36.5 万美元，而他们的要求是 2100万美元，因此现在他们把赎金增加了一倍至 4200 万美元。作为惩罚，REvil 黑客发布了 2.4 GB 大小的文档，其中包含了 Lady Gaga 的法律文书，大部分是演出合同。

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

>
> 硬核老王点评：勒索者恼羞成怒。
>
>
>


9 个用于前端 Web 开发的开源 CSS 框架

Summary: 探索开源 CSS 框架，找到适合你的项目的框架。

探索开源 CSS 框架，找到适合你的项目的框架。

# 9 个用于前端 Web 开发的开源 CSS 框架

>
> 探索开源 CSS 框架，找到适合你的项目的框架。
>
>
>

当大多数人想到 Web 开发时，通常会想到 HTML 或 JavaScript。他们通常会忘记对网站的欣赏能力有更大影响的技术：<ruby>   级联样式表  <rt>  cascading style sheets </rt></ruby>（简称 CSS）。据维基百科的说法，CSS 既是网页中最重要的部分，也是最常被遗忘的部分，尽管它是万维网的三大基石技术之一。

本文将探讨九种流行的、强大的、开源的框架，是这些框架让构建漂亮的网站前端的 CSS 开发变得简单明了。

| 名称 | 介绍 | 许可证 |
| --- | --- | --- |
| [Bootstrap](https://github.com/twbs/bootstrap) | 最流行的 CSS 框架，来自 Twitter | MIT |
| [PatternFly](https://github.com/patternfly/patternfly) | 开源框架，来自 Red Hat | MIT |
| [MDC Web](https://github.com/material-components/material-components-web) | Material Design 组件开源框架，来自 Google | MIT |
| [Pure](https://github.com/pure-css/pure) | 开源框架，来自 Yahoo | BSD |
| [Foundation](https://github.com/foundation/foundation-sites) | 前端框架，来自 Zurb 基金会 | MIT |
| [Bulma](https://github.com/jgthms/bulma) | 现代 CSS 框架，基于 Flexbox | MIT |
| [Skeleton](https://github.com/dhg/Skeleton) | 轻量级 CSS 框架 | MIT |
| [Materialize](https://github.com/Dogfalo/materialize) | 基于 Material Design 的 CSS 框架 | MIT |
| [Bootflat](https://github.com/bootflat/bootflat.github.io) | 开源 Flat UI 工具，基于 Bootstrap 3.3.0 | MIT |

### Bootstrap

[Bootstrap](https://en.wikipedia.org/wiki/Cascading_Style_Sheets) 无疑是最流行的 CSS 框架，它是所有前端 Web 设计的开端。Bootstrap 由 Twitter 开发，提供了可用性、功能性和可扩展性。

Bootstrap 还提供了大量的[例子](https://getbootstrap.com/docs/4.4/examples/)来帮助你入门。

使用 Bootstrap，你可以将不同的组件和布局拼接在一起，创造出有趣的页面设计。它还提供了大量详细的文档。

Bootstrap 的 [GitHub](https://github.com/twbs/bootstrap) 仓库有超过 19000 个提交和 1100 个贡献者。它基于 MIT 许可证，所以（和这个列表中的所有框架一样）你也可以加入并贡献。

### PatternFly

[PatternFly](https://www.patternfly.org) 是由 Red Hat 开发的一个开源的（MIT 许可证）CSS 框架。PatternFly 采取了与 Bootstrap 不同的方法：Bootstrap 是为任何对创建一个漂亮网站感兴趣的人而设计的，而 PatternFly 主要针对企业级应用开发者，它提供的组件，如条形图、图表和导航，对于创建强大的、指标驱动的仪表盘非常有吸引力。事实上，Red Hat 在其产品（如 OpenShift）的设计中也使用了这个 CSS 框架。

除了静态 HTML 之外，PatternFly 还支持 ReactJS 框架，ReactJS 是 Facebook 开发的一个流行的 JavaScript 框架。

PatternFly 有许多高级组件，如条形图、图表、[模态窗口](https://en.wikipedia.org/wiki/Modal_window)和布局等，适用于企业级应用。

PatternFly 的 [GitHub](https://github.com/patternfly/patternfly) 页面列出了超过 1050 个提交和 44 个贡献者。PatternFly 得到了很多人的关注，欢迎大家踊跃贡献。

### MDC Web

凭借其大获成功的安卓平台，谷歌以一个名为 [Material Design](https://material.io) 的概念制定了自己的标准设计准则。Material Design 标准旨在体现在所有谷歌的产品中，这些标准也可以面向大众，并且在 MIT 许可证下开源。

Material Design 有许多“用于创建用户界面的交互式构建块”的[组件](https://material.io/components/)。这些按钮、卡片、背景等可用于创建网站或移动应用程序的任何类型的用户界面。

维护人员为不同的平台提供了详尽的文档。

还有分步教程，其中包含用于实现不同目标的练习。

Material 组件的 GitHub 页面承载了面向不同平台的存储库，包括用于网站开发的 [Material Web 组件（MDC Web）](https://github.com/material-components/material-components-web)。MDC Web 有超过 5700 个提交和 349 个贡献者。

### Pure

Bootstrap、Patternfly 和 MDC Web 都是非常强大的 CSS 框架，但是它们可能相当的笨重和复杂。如果你想要一个轻量级的 CSS 框架，它更接近于自己编写 CSS，但又能帮助你建立一个漂亮的网页，可以试试 [Pure.css](https://purecss.io)。Pure 是一个轻量级的 CSS 框架，它的体积很小。它是由 Yahoo 开发的，在 BSD 许可证下开源。

尽管体积小，但 Pure 提供了建立一个漂亮网页的很多必要的组件。

Pure 的 [GitHub](https://github.com/pure-css/pure) 页面显示它有超过 565 个提交和 59 个贡献者。

### Foundation

[Foundation](https://get.foundation) 号称是世界上最先进的响应式前端框架。它提供了先进的功能和教程，用于构建专业网站。

该框架被许多公司、组织甚至政客[使用](https://zurb.com/responsive)，并且有大量的文档可用。

Foundation 的 [GitHub](https://github.com/foundation/foundation-sites) 页面显示有近 17000 个提交和 1000 个贡献者。和这个列表中的大多数其他框架一样，它也是在 MIT 许可证下提供的。

### Bulma

[Bulma](https://bulma.io) 是一个基于 Flexbox 的开源框架，在 MIT 许可证下提供。Bulma 是一个相当轻量级的框架，因为它只需要一个 CSS 文件。

Bulma 有简洁明快的文档，让你可以很容易地选择你想要探索的主题。它也有很多网页组件，你可以直接拿起来在设计中使用。

Bulma 的 [GitHub](https://github.com/jgthms/bulma) 页面列出了 1400 多个提交和 300 多个贡献者。

### Skeleton

如果连 Pure 都觉得太重了，那么还有一个叫 [Skeleton](http://getskeleton.com) 的更轻量级框架。Skeleton 库只有 400 行左右的长度，而且这个框架只提供了开始你的 CSS 框架之旅的基本组件。

尽管它很简单，但 Skeleton 提供了详细的文档，可以帮助你马上上手。

Skeleton 的 [GitHub](https://github.com/dhg/Skeleton) 列出了 167 个提交和 22 个贡献者。然而，它不是很活跃，它的最后一次更新是在 2014 年，所以在使用之前可能需要一些维护。由于它是在 MIT 许可证下发布的，你可以自行维护。

### Materialize

[Materialize](https://materializecss.com) 是一个基于 Google 的 Material Design 的响应式前端框架，带有由 Materialize 的贡献者开发的附加主题和组件。

Materialize 的文档页面非常全面，而且相当容易理解。它的组件页面包括按钮、卡片、导航等等。

Materialize 是 MIT 许可证下的开源项目，它的 [GitHub](https://github.com/Dogfalo/materialize) 列出了超过 3800 个提交和 250 个贡献者。

### Bootflat

[Bootflat](http://bootflat.github.io) 是由 Twitter 的 Bootstrap 衍生出来的一个开源 CSS 框架。与 Bootstrap 相比， Bootflat 更简单，框架组件更轻量级。

Bootflat 的[文档](http://bootflat.github.io/documentation.html)几乎像是受到了宜家的启发 —— 它显示的是每个组件的图片，没有太多的文字。

Bootflat 是在 MIT 许可证下提供的，其 [GitHub](https://github.com/bootflat/bootflat.github.io) 页面包括 159 个提交和 8 个贡献者。

### 你应该选择哪个 CSS 框架？

对于开源的 CSS 框架，你有很多选择，这取决于你想要的工具功能有多丰富或简单。就像所有的技术决定一样，没有一个正确的答案，只有在给定的时间和项目中才有正确的选择。

尝试一下其中的一些，看看要在下一个项目中使用哪个。另外，我有没有错过任何有趣的开源 CSS 框架？请在下面的评论中分享你的反馈和想法。

---

via: <https://opensource.com/article/20/4/open-source-css-frameworks>

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


我的 Linux 故事：从 8 位发烧友到 Unix 系统管理员

Summary: 我是如何从一个电脑爱好者成为职业系统管理员和 Linux 粉丝的。

我是如何从一个电脑爱好者成为职业系统管理员和 Linux 粉丝的。

# 我的 Linux 故事：从 8 位发烧友到 Unix 系统管理员

>
> 我是如何从一个电脑爱好者成为职业系统管理员和 Linux 粉丝的。
>
>
>

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

故事得从 1980 年中期我父母给家里购买[苹果 ][c](https://en.wikipedia.org/wiki/Apple_IIc) 开始。尽管很喜欢打游戏，但我还是很快被实用又好玩的 BASIC 编程迷住了。那个年代的人们还是把电脑当作小一点的打字机对待，所以拥有“高级电脑技能”的人可以轻松使用他们的魔法。

以用 BASIC 和点阵打印机自动生成惩罚作业来举个例子。被罚写两百遍道歉时，我问老师我可不可以用打字代替手写。经过同意后，我写了 5 行 BASIC 语句来自动生成作业。另外一个小技巧是用非可视化文本编辑器，比如用 AppleWorks 微调字体、行距和边距，把学期论文“拉长”到要求的篇幅。

对电脑的痴迷很快让我得到了带有内存驱动卡和 x86 协处理器的苹果 ][gs。那时候，调制解调器和 BBS 刚开始火起来，有了这样的双处理器系统后，我就可以安装各种琳琅满目的软件。但是由于调制解调器 2400bps 的速度限制，对我每天都要下载几 KB 的有趣东西形成了阻碍。我对苹果痴迷一段时间，不久之后就换了。

### 探索 Unix

我的本科专业是计算机信息系统，研究生专业是计算机科学。本科教育主要使用个人电脑，很少涉及大型分时系统。研究生的时候才开始真正有意思起来，拨号进入带有互联网连接的 Unix 简直打开了新世界的大门。尽管我依然用着我的双处理器 ][gs 来使用调制解调器还有写写论文，不过 Unix 系统真正吸引了我的注意力，因为它可以访问通用的 Telnet 游戏、文件传输协议（FTP）、在线邮箱和进行 C 语言编程。当时 Gopher 非常受欢迎，特别是在我们这群终端用户当中。

被分到学院计算机部门是我研究生命运的转折点，这个部门主管学校的计算机服务。学生们可以使用 X Window 终端来登录基于 [Ultrix](https://en.wikipedia.org/wiki/Ultrix) 的系统。大部分都是灰度的黑白界面，彩色处理在当时非常占用 CPU，也很影响系统性能。也有一些彩色系统还不错，但是这些机器都很慢。

我很喜欢那个时候，我有系统管理员权限而且工作是维护系统和网络。我有一些很好的导师，他们对我选择从事系统管理员而不是程序员起了关键作用（尽管我至今仍然热爱编程）。

### 从 Unix 到 Linux

稀缺是创造之母，当需要分享匮乏的学校电脑系统资源的时候，我们学生们变得富有创造力。需要用电脑的学生是 Ultrix 工作站承受量的三到五倍，所以寻找资源往往是个难题（特别是要交付项目的时候）。在不需要图形化显示的时候，我们有一个 56k 的点对点协议的调制解调器池可供远程系统访问接入。但是找到一个有空余资源的机器并共享系统进行源码编译通常会导致进度缓慢。和大部分人一样，我发现晚上工作通常会有所帮助，但我还需要其它一些东西让我的项目迭代快一点。

后来学校的一个系统管理员建议我去看一个免费提供的 Unix 系统。那就是 Linux，它被装在 3.5 英寸的软盘里。多亏我们学校超快的 T1 线路，我很容易就搜索到新闻组和其他资源来学习如何下载它。它全是基于 32 位的英特尔 PC 机的，而我并没有这一类的设备。

幸运的是，我在学校的工作让我有机会接触到堆积如山的废旧电脑，所以命运的齿轮又开始旋转起来。

我找到了足够多的废旧 PC 组装了一个可靠的 80386 PC，带有足够内存（我确定不到 1GB），它有一个能用的显卡、一个细缆（同轴）以太网卡和一个硬盘。我所用的镜像是 Linux 内核 0.98，我不记得它是不是正式发行版的一部分了（可能是 SLS）。我所记得的是，它有一系列的软盘镜像，第一张软盘启动内核和一个最小安装程序，然后格式化硬盘，接着要求插入每个后续的软盘来安装 GNU 核心实用程序。在核心实用程序装好并引导系统之后，你可以下载和安装其他的软件包镜像，比如编译器之类的。

这是我学术道路上巨大的福音。在没有运行 X Window 显示服务器的情况下，这台电脑性能比学校的 Ultrix 工作站强很多。学校允许我把这台机器连到校园网络，挂载学校的学生网络文件系统（NFS）共享，并且能直接访问互联网。因为我的研究生课程用 [GCC](https://en.wikipedia.org/wiki/GNU_Compiler_Collection)（还有 Perl 4）来完成大部分学生作业，所以我可以在本地进行开发工作。这使得我可以独享关键资源，从而使我能够更快速地迭代我的项目。

但是，这个方案不是完美的。硬件有时会有点不稳定（这可能就是它们被丢弃的原因），但我都能搞定。真正让我感受到的是 Linux 和 Ultrix 在操作系统和系统库层面的差异。我开始理解移植软件到其他操作系统的意义，我可以自由地在任何地方开发，但是我必须以 Ultrix 编译的二进制文件交付项目。在一个平台上完美运行的 C 语言代码可能在另一个平台出错。这非常令人沮丧，但是我可能本能的察觉到了早期 Linux 解引用空指针的方法。Linux 倾向于把它作为空操作处理，但是 Ultrix 会立即触发核心转储和段错误 [SIGSEGV](https://en.wikipedia.org/wiki/Segmentation_fault)。这是我第一次程序移植时的重大发现，正好在要交作业的几天之前。这同时对我研究 C++ 造成了一些麻烦，因为我粗心地同时使用了 `malloc()`/`free()` 和自动[构造函数和析构函数](https://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm)处理，让我的项目到处都是空指针炸弹。

研究生课程快结束的时候，我升级到了一台性能野兽工作站：一颗英特尔 486DX2 66MHz 芯片、一块 SCSI 硬盘、一块光驱和一个 1024x768 RGB 显示器，并且还用一个 16550 UART 串口卡完美地匹配了我的新 US Robotics V.Everything 牌调制解调器。它可以双启动 Windows 和 Linux 系统，但更重要的是显卡和 CPU 的速度让我的开发环境幸福感倍增。那台旧的 386 依然在学校服役，不过我我现在大部分繁重的功课和钻研都转移到了家里。

和 [Mike Harris](/article-11831-1.html) 关于 90 年代的 Linux 故事类似，我真的对当时流行的 CD 集合很着迷。我住的附近有家新开的 Micro Center 计算机商店，这个宝库充满了电脑配件、高级专业书籍和你能想到的各种 Linux（以及免费的 Unix）CD。我还记得 [Yggdrasil](https://en.wikipedia.org/wiki/Yggdrasil_Linux/GNU/X) 和 [Slackware](http://slackware.com) 是我最喜欢的发行版。真正让人难以置信的是 CD 存储空间的巨大容量 —— 650MB！使它成为获得软件的必不可少的载体。是的，你可以用 56k 的速度下载，但是真的很慢。更别提大部分人负担不起存档这么多供以后使用的闲置数据。

### 而到了今天

就是这些开启了我长达 25 年的系统管理员的职业生涯和开源软件的乐趣。Linux 一直是我事业和个人开发中的重要组成部分。最近我依旧醉心于 Linux（主要是 CentOS、RedHat 和 Ubuntu)，但也经常从 [FreeBSD](https://www.freebsd.org/) 和其他炫酷开源软件中得到乐趣。

Linux 让我来到了 Opensource.com，我希望在这里能回馈社区，为新一代电脑爱好者出一份力。

---

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

作者：[James Farrell](https://opensource.com/users/jamesf) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Accelerator](https://github.com/Acceleratorrrr) 校对：[wxy](https://github.com/wxy)

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