低端社论:Linux 发行版和操作系统是否已经过时?一键安装 VPS 应用是否已经完成了我们向 Web 的转型? 低端社论:Linux 发行版和操作系统是否已经过时?一键安装 VPS 应用是否已经完成了我们向 Web 的转型?

低端社论:Linux 发行版和操作系统是否已经过时?一键安装 VPS 应用是否已经完成了我们向 Web 的转型?

汤姆·诺特·奥莱斯

我有个朋友是硬件工程师。每次见到他,我都会好奇我正在使用的笔记本电脑或服务器内部的硬件究竟有多少运作原理。当然,有时候我又不太关注硬件。现在我们大多数人不都是这样吗?

前段时间,我和一位年轻的朋友聊起了前端工程和现代Web应用。当谈到操作系统时,他简单地说了句:“我更喜欢把它们抽象化。” 这句话一直萦绕在我心头。“把它们抽象化”是不是委婉地说“不用太在意”呢?

几年前,我听过保罗·维克西的一场演讲。他的演讲主题是,由于加密技术的普遍应用,互联网正逐渐变成一条“哑管道”。他认为,现在要观察某人的计算机使用情况,必须在终端端进行,要么在加密之前,要么在解密之后。这一切是否意味着网络传输的内容很可能被“抽象化”了?现代网络的“哑性”是否意味着我们现在需要将注意力更加直接地集中在硬件上?

Linux 发行版太棒了!

和你们中的许多人一样,亲爱的读者们,这些年来我也用过不少不同的Linux发行版。每个发行版都有其精彩之处!我喜欢Debian的自由度。Red Hat有Rawhide。如果你的硬件需要专有驱动程序,Ubuntu很容易就能正常运行。Gentoo会让你知道你的系统可以编译你使用的每个程序。《Linux From Scratch》这本书则能让你更深入地了解系统的交互方式。其他发行版也各有特色,例如不同的C库、静态二进制文件、漂亮的默认图形界面等等……

最近几天,我一直在和购买了VPS服务的客户们交流。我发现,每位客户对Linux发行版和服务器配置都有自己的偏好。这完全没问题!

|– 网络设置

不过,在我自己搭建的 Linux 系统中,我当然可以尝试一些奇特的配置。其中一个让我印象深刻的奇特之处在于,网络配置竟然存在一种与发行版无关的方法。尽管每个发行版都有其自身一套完善的网络配置命令,但似乎所有发行版都可以使用iproute2 套件。因此,有时我会直接使用 iproute2 套件,而不是发行版自带的网络工具。我是否已经“抽象化”了发行版的网络配置部分呢?

|– 包装系统

除了发行版特有的网络配置之外,每个发行版还有自己独特的软件包系统。因此,在不同的发行版上安装同一个应用程序需要使用不同的命令。而且,每个发行版的软件包系统对软件应用程序进行分组的方式也各不相同。

此外,同一软件通过不同的软件包管理系统安装时,默认配置也会有所不同。实际上,不同发行版的软件包管理系统本身就是用不同的语言编写的,例如 Perl 和 Python。

我们如何才能“抽象化”掉特定发行版的软件包系统?我们如何在不使用软件包系统的情况下安装应用程序?我们至少可以尝试:静态编译、解释型语言和容器化。

静态编译

有时可以通过静态编译来制作一个可以在各种发行版上运行的应用程序,这样所需的库就包含在应用程序本身中,而不是让应用程序依赖于各种发行版中可能不同的库。

静态编译的一个问题是,库通常不会像动态链接发行版提供的库那样单独且快速地更新。

一个相关的解决方案是静态链接到部分依赖项,而不是全部。用于编译著名的yabs.sh bench 脚本的Holy Build Box就采用了这种部分静态链接的方法。

口译语言

除了静态编译之外,Linux 发行版乃至操作系统应用程序安装的另一种方法是使用Java、 JavaScriptPython 等解释型语言。每个操作系统都配备了相应的解释器。由于操作系统各自拥有不同的解释器,同一段应用程序代码就可以在不同平台上运行。

容器化和自托管

近年来容器化技术已被广泛接受,成为解决应用程序在不同Linux发行版以及非Linux操作系统上良好运行问题的又一有效方案。LXC和Docker就是容器化项目的例子。Docker尤其流行。Docker容器化提供了一个统一的运行环境,使得应用程序的安装可以跨越Linux发行版甚至操作系统。

上个月,我们在 Low End Talk 论坛上发起了一个名为“你在自托管什么?”的讨论帖。该帖探讨了大量用户自托管应用程序的情况,其中许多应用程序都运行在 Docker 容器中。

几天前,我第一次了解到CapRover,它是一款使用 Docker 的“应用程序和数据库部署及 Web 服务器管理器”。

LEB 正在撰写另一篇文章,介绍 CapRover 令人惊叹的一键式 Web 界面,该界面允许安装 200 多个应用程序。

LEB 计划撰写第二篇文章,介绍如何在Slackware Linux 上安装 Docker 和 CapRover,Slackware Linux 可能是目前仍可用的最古老的 Linux 发行版。

Slackware 上的 Docker 安装可能与发行版无关,这或许并不令人意外。希望 Docker 安装能让 CapRover 在 Slackware 上运行,从而在这个最古老的 Linux 发行版上,通过一键式 Web 界面安装 200 多个应用程序。

总结性问题

本文开头我们讨论了硬件抽象化。现在,CapRover 有可能在 Slackware 的 Docker 容器中运行,这是否意味着 Slackware 本身也被抽象化了?通过 Web 界面实现与发行版无关的网络配置和与操作系统无关的应用程序安装,是否意味着所有操作系统都被抽象化了?CapRover 的 Web 界面是否意味着除了浏览器之外的一切都被抽象化了?

附言:回到硬件?

想起 Paul Vixie,我反复收听 Oxide.computer 于 2019 年 12 月 15 日播出的On the Metal播客,嘉宾是“开放固件之父” Ron Minnich

这个播客精彩地探讨了固件的历史,从上世纪90年代末到本世纪初的开源固件开发,到当前的闭源二进制固件现状。54分07秒处提到了System76笔记本电脑,55分38秒处提到了Chromebook。以下是文字稿的节选,大约从55分45秒开始,讨论了System76笔记本电脑相对开放的启动系统,以及Chromebook经过验证的启动系统。发言者是Ron Minnich:

他们真是太棒了。我要[听不清 00:55:48]。System76,我喜欢他们的一点是,他们从一开始就秉持着“做正确的事。我们要构建开放系统,并且让它们运行Coreboot。我们要想办法让它运行起来”的理念,而且他们也遵循着每个人都必须遵循的道路。你会得到别人设计的东西,然后你要让它满足你的需求。

我跟那里的人聊过,他们说,在很多方面,最新款的产品在设计上都受到了他们的巨大影响,而且我觉得它们本身就是很棒的设备。拿在手里感觉很好,而且,我还可以克隆Coreboot仓库,为System76构建固件镜像,然后把它烧录到机器上。

如果我所在的公司固件里可能包含一些我不愿相信的内容,我可以重新刷写一遍。我认为,任何意识到固件攻击有多严重的人都会对此深有体会。System76 的另一个优点是,它提供了很高的可配置性,比如内存大小、NVMe 容量等等,以及操作系统发行版。

在我看来,Chromebook 绝对已经做到了极致,而且我已经使用它们很长时间了,它们完全彻底地做到了,当它开机并显示一个没有任何警告的屏幕时,我可以相信它正在运行正确的软件,对吧?

我现在用的是 Chromebook 写这篇文章。下次需要买新笔记本电脑的时候,我可能会考虑 System76 和其他一些采用更开放固件的笔记本电脑。拥有一台不追求硬件抽象的笔记本电脑应该会很棒!:)