分类 技术 下的文章

搭建一个通过容器分发应用的可复用系统可能很复杂,但这儿有个好方法。

一个用于将源代码转换成可运行的应用的构建系统是由工具和流程共同组成。在转换过程中还涉及到代码的受众从软件开发者转变为最终用户,无论最终用户是运维的同事还是部署的同事。

在使用容器搭建了一些构建系统后,我觉得有一个不错的可复用的方法值得分享。虽然这些构建系统被用于编译机器学习算法和为嵌入式硬件生成可加载的软件镜像,但这个方法足够抽象,可用于任何基于容器的构建系统。

这个方法是以一种易于使用和维护的方式搭建或组织构建系统,但并不涉及处理特定编译器或工具容器化的技巧。它适用于软件开发人员构建软件,并将可维护镜像交给其他技术人员(无论是系统管理员、运维工程师或者其他一些头衔)的常见情况。该构建系统被从终端用户中抽象出来,这样他们就可以专注于软件。

为什么要容器化构建系统?

搭建基于容器的可复用构建系统可以为软件团队带来诸多好处:

  • 专注:我希望专注于应用的开发。当我调用一个工具进行“构建”时,我希望这个工具集能生成一个随时可用的二进制文件。我不想浪费时间在构建系统的查错上。实际上,我宁愿不了解,或者说不关心构建系统。
  • 一致的构建行为:无论在哪种使用情况下,我都想确保整个团队使用相同版本的工具集并在构建时得到相同的结果。否则,我就得不断地处理“我这咋就是好的”的麻烦。在团队项目中,使用相同版本的工具集并对给定的输入源文件集产生一致的输出是非常重要。
  • 易于部署和升级:即使向每个人都提供一套详细说明来安装一个项目的工具集,也可能会有人翻车。问题也可能是由于每个人对自己的 Linux 环境的个性化修改导致的。在团队中使用不同的 Linux 发行版(或者其他操作系统),情况可能还会变得更复杂。当需要将工具集升级到下一版本时,问题很快就会变得更糟糕。使用容器和本指南将使得新版本升级非常简单。

对我在项目中使用的构建系统进行容器化的这些经验显然很有价值,因为它可以缓解上述问题。我倾向于使用 Docker 作为容器工具,虽然在相对特殊的环境中安装和网络配置仍可能出现问题,尤其是当你在一个使用复杂代理的企业环境中工作时。但至少现在我需要解决的构建系统问题已经很少了。

漫步容器化的构建系统

我创建了一个教程存储库,随后你可以克隆并检查它,或者按照本文内容进行操作。我将逐个介绍存储库中的文件。这个构建系统非常简单(它运行 gcc),从而可以让你专注于这个构建系统结构上。

构建系统需求

我认为构建系统中有两个关键点:

  • 标准化构建调用:我希望能够指定一些形如 /path/to/workdir 的工作目录来构建代码。我希望以如下形式调用构建:
./build.sh /path/to/workdir

为了使得示例的结构足够简单(以便说明),我将假定输出也在 /path/to/workdir 路径下的某处生成。(否则,将增加容器中显示的卷的数量,虽然这并不困难,但解释起来比较麻烦。)

  • 通过 shell 自定义构建调用:有时,工具集会以出乎意料的方式被调用。除了标准的工具集调用 build.sh 之外,如果需要还可以为 build.sh 添加一些选项。但我一直希望能够有一个可以直接调用工具集命令的 shell。在这个简单的示例中,有时我想尝试不同的 gcc 优化选项并查看效果。为此,我希望调用:
./shell.sh /path/to/workdir

这将让我得到一个容器内部的 Bash shell,并且可以调用工具集和访问我的工作目录(workdir),从而我可以根据需要尝试使用这个工具集。

构建系统的架构

为了满足上述基本需求,这是我的构架系统架构:

 title=

在底部的 workdir 代表软件开发者用于构建的任意软件源码。通常,这个 workdir 是一个源代码的存储库。在构建之前,最终用户可以通过任何方式来操纵这个存储库。例如,如果他们使用 git 作为版本控制工具的话,可以使用 git checkout 切换到他们正在工作的功能分支上并添加或修改文件。这样可以使得构建系统独立于 workdir 之外。

顶部的三个模块共同代表了容器化的构建系统。最左边的黄色模块代表最终用户与构建系统交互的脚本(build.shshell.sh)。

在中间的红色模块是 Dockerfile 和相关的脚本 build_docker_image.sh。开发运营者(在这个例子中指我)通常将执行这个脚本并生成容器镜像(事实上我多次执行它直到一切正常为止,但这是另一回事)。然后我将镜像分发给最终用户,例如通过 容器信任注册库 container trusted registry 进行分发。最终用户将需要这个镜像。另外,他们将克隆构建系统的存储库(即一个与教程存储库等效的存储库)。

当最终用户调用 build.sh 或者 shell.sh 时,容器内将执行右边的 run_build.sh 脚本。接下来我将详细解释这些脚本。这里的关键是最终用户不需要为了使用而去了解任何关于红色或者蓝色模块或者容器工作原理的知识。

构建系统细节

把教程存储库的文件结构映射到这个系统结构上。我曾将这个原型结构用于相对复杂构建系统,因此它的简单并不会造成任何限制。下面我列出存储库中相关文件的树结构。文件夹 dockerize-tutorial 能用构建系统的其他任何名称代替。在这个文件夹下,我用 workdir 的路径作参数调用 build.shshell.sh

dockerize-tutorial/
├── build.sh
├── shell.sh
└── swbuilder
    ├── build_docker_image.sh
    ├── install_swbuilder.dockerfile
    └── scripts
        └── run_build.sh

请注意,我上面特意没列出 example_workdir,但你能在教程存储库中找到它。实际的源码通常存放在单独的存储库中,而不是构建工具库中的一部分;本教程为了不必处理两个存储库,所以我将它包含在这个存储库中。

如果你只对概念感兴趣,本教程并非必须的,因为我将解释所有文件。但是如果你继续本教程(并且已经安装 Docker),首先使用以下命令来构建容器镜像 swbuilder:v1

cd dockerize-tutorial/swbuilder/
./build_docker_image.sh
docker image ls  # resulting image will be swbuilder:v1

然后调用 build.sh

cd dockerize-tutorial
./build.sh ~/repos/dockerize-tutorial/example_workdir

下面是 build.sh 的代码。这个脚本从容器镜像 swbuilder:v1 实例化一个容器。而这个容器实例映射了两个卷:一个将文件夹 example_workdir 挂载到容器内部路径 /workdir 上,第二个则将容器外的文件夹 dockerize-tutorial/swbuilder/scripts 挂载到容器内部路径 /scripts 上。

docker container run                              \
    --volume $(pwd)/swbuilder/scripts:/scripts    \
    --volume $1:/workdir                          \
    --user $(id -u ${USER}):$(id -g ${USER})      \
    --rm -it --name build_swbuilder swbuilder:v1  \
    build

另外,build.sh 还会用你的用户名(以及组,本教程假设两者一致)去运行容器,以便在访问构建输出时不出现文件权限问题。

请注意,shell.shbuild.sh 大体上是一致的,除了两点不同:build.sh 会创建一个名为 build_swbuilder 的容器,而 shell.sh 则会创建一个名为 shell_swbuilder 的容器。这样一来,当其中一个脚本运行时另一个脚本被调用也不会产生冲突。

两个脚本之间的另一处关键不同则在于最后一个参数:build.sh 传入参数 buildshell.sh 则传入 shell。如果你看了用于构建容器镜像的 Dockerfile,就会发现最后一行包含了下面的 ENTRYPOINT 语句。这意味着上面的 docker container run 调用将使用 buildshell 作为唯一的输入参数来执行 run_build.sh 脚本。

# run bash script and process the input command
ENTRYPOINT [ "/bin/bash", "/scripts/run_build.sh"]

run\_build.sh 使用这个输入参数来选择启动 Bash shell 还是调用 gcc 来构建 helloworld.c 项目。一个真正的构建系统通常会使用 Makefile 而非直接运行 gcc

cd /workdir

if [ $1 = "shell" ]; then    
    echo "Starting Bash Shell"
    /bin/bash
elif [ $1 = "build" ]; then
    echo "Performing SW Build"
    gcc helloworld.c -o helloworld -Wall
fi

在使用时,如果你需要传入多个参数,当然也是可以的。我处理过的构建系统,构建通常是对给定的项目调用 make。如果一个构建系统有非常复杂的构建调用,则你可以让 run_build.sh 调用 workdir 下最终用户编写的特定脚本。

关于 scripts 文件夹的说明

你可能想知道为什么 scripts 文件夹位于目录树深处而不是位于存储库的顶层。两种方法都是可行的,但我不想鼓励最终用户到处乱翻并修改里面的脚本。将它放到更深的地方是一个让他们更难乱翻的方法。另外,我也可以添加一个 .dockerignore 文件去忽略 scripts 文件夹,因为它不是容器必需的部分。但因为它很小,所以我没有这样做。

简单而灵活

尽管这一方法很简单,但我在几个相当不同的构建系统中使用过,发现它相当灵活。相对稳定的部分(例如,一年仅修改数次的给定工具集)被固定在容器镜像内。较为灵活的部分则以脚本的形式放在镜像外。这使我能够通过修改脚本并将更改推送到构建系统存储库中,轻松修改调用工具集的方式。用户所需要做的是将更改拉到本地的构建系统存储库中,这通常是非常快的(与更新 Docker 镜像不同)。这种结构使其能够拥有尽可能多的卷和脚本,同时使最终用户摆脱复杂性。


via: https://opensource.com/article/20/4/how-containerize-build-system

作者:Ravi Chandran 选题:lujun9972 译者:LazyWolfLin 校对:wxy

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

让大家觉得你一次就能写出完美的代码,并让你的补丁更容易审核和合并。

软件开发是混乱的。有很多错误的转折、有需要修复的错别字、有需要修正的错误、有需要稍后纠正的临时和粗陋的代码,还有在以后的开发过程中发现一次又一次的问题。有了版本控制,在创建“完美”的最终产品(即准备提交给上游的补丁)的过程中,你会有一个记录着每一个错误转折和修正的原始记录。就像电影中的花絮一样,它们会让人有点尴尬,有时也会让人觉得好笑。

如果你使用版本控制来定期保存你的工作线索,然后当你准备提交审核的东西时,又可以隐藏所有这些私人草稿工作,并只提交一份单一的、完美的补丁,那不是很好吗?git rebase -i,是重写历史记录的完美方法,可以让大家觉得你一次就写出了完美的代码!

git rebase 的作用是什么?

如果你不熟悉 Git 的复杂性,这里简单介绍一下。在幕后,Git 将项目的不同版本与唯一标识符关联起来,这个标识符由父节点的唯一标识符的哈希以及新版本与其父节点的差异组成。这样就形成了一棵修订树,每个签出项目的人都会得到自己的副本。不同的人可以把项目往不同的方向发展,每个方向都可能从不同的分支点开始。

 title=

左边是 origin 版本库中的主分支,右边是你个人副本中的私有分支。

有两种方法可以将你的工作与原始版本库中的主分支整合起来:一种是使用合并:git merge,另一种是使用变基:git rebase。它们的工作方式非常不同。

当你使用 git merge 时,会在主分支(master)上创建一个新的提交,其中包括所有来自原始位置(origin)的修改和所有本地的修改。如果有任何冲突(例如,如果别人修改了你也在修改的文件),则将这些冲突标记出来,并且你有机会在将这个“合并提交”提交到本地版本库之前解决这些冲突。当你将更改推送回父版本库时,所有的本地工作都会以分支的形式出现在 Git 版本库的其他用户面前。

但是 git rebase 的工作方式不同。它会回滚你的提交,并从主分支(master)的顶端再次重放这些提交。这导致了两个主要的变化。首先,由于你的提交现在从一个不同的父节点分支出来,它们的哈希值会被重新计算,并且任何克隆了你的版本库的人都可能得到该版本库的一个残破副本。第二,你没有“合并提交”,所以在将更改重放到主分支上时会识别出任何合并冲突,因此,你需要在进行 变基 rebase 之前先修复它们。现在,当你现在推送你的修改时,你的工作不会出现在分支上,并且看起来像是你是在主分支的最新的提交上写入了所有的修改。

 title=

合并提交(左)保留了历史,而变基(右)重写历史。

然而,这两种方式都有一个缺点:在你准备好分享代码之前,每个人都可以看到你在本地处理问题时的所有涂鸦和编辑。这就是 git rebase--interactive(或简写 -i)标志发挥作用的地方。

git rebase -i 登场

git rebase 的最大优点是它可以重写历史。但是,为什么仅止于假装你从后面的点分支出来呢?有一种更进一步方法可以重写你是如何准备就绪这些代码的:git rebase -i,即交互式的 git rebase

这个功能就是 Git 中的 “魔术时光机” 功能。这个标志允许你在做变基时对修订历史记录进行复杂的修改。你可以隐藏你的错误! 将许多小的修改合并到一个崭新的功能补丁中! 重新排列修改历史记录中的显示顺序!

 title=

当你运行 git rebase -i 时,你会进入一个编辑器会话,其中列出了所有正在被变基的提交,以及可以对其执行的操作的多个选项。默认的选择是选择(Pick)。

  • Pick:会在你的历史记录中保留该提交。
  • Reword:允许你修改提交信息,可能是修复一个错别字或添加其它注释。
  • Edit:允许你在重放分支的过程中对提交进行修改。
  • Squash:可以将多个提交合并为一个。
  • 你可以通过在文件中移动来重新排序提交。

当你完成后,只需保存最终结果,变基操作就会执行。在你选择修改提交的每个阶段(无论是用 rewordeditsquash 还是发生冲突时),变基都会停止,并允许你在继续提交之前进行适当的修改。

上面这个例子的结果是 “One-liner bug fix” 和 “Integate new header everywhere” 被合并到一个提交中,而 “New header for docs website” 和 “D'oh - typo. Fixed” 合并到另一个提交中。就像变魔术一样,其他提交的工作还在你的分支中,但相关的提交已经从你的历史记录中消失了!

这使得使用 git send-email 或者用你新整理好的补丁集在父版本库中创建一个拉取请求,然后来提交一个干净的补丁给上游项目变得很容易。这有很多好处,包括让你的代码更容易审核,更容易接受,也更容易合并。


via: https://opensource.com/article/20/4/git-rebase-i

作者:Dave Neary 选题:lujun9972 译者:wxy 校对:wxy

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

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

 title=

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

 title=

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

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

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

 title=

从闪存盘启动后,桌面环境将自动加载。除了“家”、“文件系统”和“回收站”图标外,实时桌面还有用于配置 Xorg 的工具、入门指南、FuryBSD 安装程序和系统信息程序的图标。除了这些额外功能以及一些自定义的 Xfce 设置和壁纸外,桌面环境除了基本的 Xfce 应用和 Firefox 之外并没有其他功能。

 title=

此时仅加载基本的图形驱动,但足以检查 FuryBSD 是否支持系统的有线和无线网络接口。如果网络接口没有一个能自动工作,那么 Getting Started.txt 文件包含有关尝试配置网络接口和其他配置任务的说明。如果至少有一个网络接口有效,那么可以使用 Configure Xorg 应用安装 Intel、NVidia 或 VirtualBox 图形驱动。它将下载并安装驱动,并且需要重新启动 Xorg。如果系统未自动重新登录到实时镜像用户,那么密码为 furybsd(你可以使用它来登录)。配置后,图形驱动将转移到已安装的系统中。

 title=

如果一切都可以在实时环境中正常运行,那么 FuryBSD 安装程序可以将 FuryBSD 配置并安装到计算机上。该安装程序在终端中运行,但提供与大多数其他 BSD 和 Linux 安装程序相同的选项。系统将要求用户设置系统的主机名、配置 ZFS 存储、设置 root 密码,添加至少一个非 root 用户以及配置时间和日期。完成后,系统可以引导到预装有 Xfce (或 KDE)的 FreeBSD 中。FuryBSD 完成了所有困难的工作,甚至还花了很多精力使桌面看起来更漂亮。

如上所述,桌面环境没有大量预装软件,因此几乎肯定要安装额外的软件包。最快的方法是在终端中使用 pkg 命令。该命令的行为很像 dnfapt,因此使用过其中之一的来自 Linux 发行版的用户在查找和安装软件包时应该感到很熟悉。FreeBSD 的软件包集合非常多,因此大多数知名的开源软件包都可用。

如果用户在没有太多 FreeBSD 经验的情况下尝试 FuryBSD,应查阅 FreeBSD 手册,以了解有关如何以 FreeBSD 的方式操作。有任何 Linux 发行版或其他 BSD 使用经验的用户应该能弄清很多事情,但是手册可以帮助你弄清一些差异。进一步了解 FreeBSD 的一个很好的资源是 Michael W. Lucas 的 《Absolute FreeBSD,第三版》。


via: https://opensource.com/article/20/5/furybsd-linux

作者:Joshua Allen Holm 选题:lujun9972 译者:geekpi 校对:wxy

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

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

在“安装 Ubuntu 20.04 之后要做的事”一文中,一些读者提到他们用 .deb 文件安装软件遇到了麻烦。

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

从 19.10 升级到 Ubuntu 20.04直到今天都没有遇到这个问题。

我下载了 .deb 文件来安装 Rocket Chat Messenger,然后双击该文件安装时,文件用存档管理器打开。这不是我所期望的。

DEB files opened with Archive Manager instead of Software Center

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

在 Ubuntu 20.04 中安装 deb 文件

由于某些原因,在 Ubuntu 20.04 中 deb 文件的默认打开程序被设置为存档管理器。存档管理器是用于解压 zip 和其他压缩文件。

解决此问题的方法非常简单。在 Ubuntu 中更改默认应用,将打开 DEB 文件从“存档管理器”改到“软件安装”。让我告诉你步骤。

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

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

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

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

忽视的 bug 还是愚蠢的功能?

为什么会用存档管理器打开 deb 文件让人无法理解。我确实希望这是一个 bug,而不是像在 Ubuntu 20.04 中不允许在桌面上拖放文件这样的怪异功能。

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

你可以了解更多有关使用 gdebi 并默认设为安装 deb 文件的工具


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

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

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

树莓派 是一款不可缺少的单板电脑,在很多工作中都能派上用场。不相信?只要看看这个树莓派项目列表,就能了解这个小小的设备能做什么。

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

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

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

在 SD 卡上安装树莓派操作系统比以前容易得多。你只需下载树莓派镜像就可以快速地安装任何树莓派操作系统。请看下面的官方视频,你就知道有多简单。

你也可以使用 NOOBS 新开箱即用软件 New Out Of the Box Software )在树莓派上轻松安装各种的操作系统。你还可以从他们的 NOOBS 官方下载页面提到的支持的零售商列表中获得预装 SD 卡。

欢迎在他们的官方文档中了解更多关于安装操作系统的信息。

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

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

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

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

注意: 排名不分先后。

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

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

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

Raspbian OS 是被积极地维护着的,它也是最流行的树莓派操作系统之一。你可以使用 NOOBS 或参照官方文档来安装它。

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

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

Ubuntu MATE 的树莓派定制版是值得安装的非常不错的轻量级发行版。它还被广泛用于 NVIDIA 的 Jetson Nano。换言之,你可以在树莓派的很多场景下使用它。

为了更好地帮助你,我们还有一份详细的教程:怎样在树莓派上安装 Ubuntu MATE

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

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

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

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

4、LibreELEC:适合做媒体服务器

我们已经有一个 Linux 下可用的媒体服务器软件,LibreELEC 在列表中。

它是一个很棒的轻量级操作系统,让你可以在树莓派上安装 KODI。你可以尝试使用树莓派镜像工具来安装它。

你可以很容易地找到他们的官方下载页面,并找到适合你板卡的安装镜像。

5、OSMC:适合做媒体服务器

OSMC 是另一个 Linux 下流行的媒体服务器软件。如果要把树莓派板作为媒体中心设备,那么 OSMC 是你可以向他人推荐的操作系统之一。

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

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

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

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

如果你想了解,我们也有篇详细介绍 RISC OS 的文章。简而言之,RISC OS 也是为诸如树莓派的现代基于 ARM 的单板计算机定制的。它的用户界面很简单,更专注于性能。

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

7、Mozilla WebThings Gateway:适合 IoT 项目

作为 Mozilla 的 IoT 设备的开源实现的一部分,WebThings Gateway 让你可以监控和控制所有连接的 IoT 设备。

你可以参考官方文档来检查所需的环境,遵照指导把安装到树莓派上。它确实是适合 IoT 应用的最有用的树莓派操作系统之一。

8、Ubuntu Core:适合 IoT 项目

Ubuntu Core 是又一个树莓派操作系统,适用于潜在的 IoT 应用,或者只是测试一下 Snap。

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

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

DietPi 是一款轻量级的 Debian 操作系统,它还宣称比 “Raspbian Lite” 操作系统更轻量。

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

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

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

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

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

如果你想了解,我们也有一篇介绍 Lakka Linux 的文章。或者直接上手吧!

11、RetroPie:适合复古游戏

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

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

12、Kali Linux:适合低成本渗透

想要在你的树莓派上尝试和学习一些道德黑客技巧吗?Kali Linux 会是最佳选择。是的,Kali Linux 通常在最新的树莓派一发布就会支持它。

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

13、OpenMediaVault:适合网络附加存储(NAS)

如果你想在极简的硬件上搭建 NAS 解决方案,树莓派可以帮助你。

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

14、ROKOS:适合加密挖矿

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

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

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

当今年代,很多用户都在寻找专注于安全和隐私的发行版本。如果你也是其中一员,你可以试试在树莓派上安装 Alpine Linux。

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

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

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

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

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

这是 KDE 一个正在开发中的项目。在树莓派上安装 KDE “等离子大屏” 后,你可以把普通电视变成智能电视。

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

“等离子大屏”也集成了 MyCroft 开源 AI 作为声控。

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

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

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

Manjaro Linux ARM 版也支持最新的树莓派 4。它为你的树莓派或任何树莓派替代品提供了 XFCE 和 KDE Plasma 变体。

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

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

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

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

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

20、FreeBSD

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

如果你不知道的话,我们有一篇关于 FreeBSD 项目的详细文章。

一旦你按照他们的官方说明安装好之后,你可以利用它来进行任何 DIY 实验,或者只是把它作为一个轻量级的桌面系统来完成特定的任务。

21、NetBSD

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

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

结语

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

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


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

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

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

FirewallD 是由红帽发起的提供了支持网络/防火墙 区域 zone 定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 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-cmdfirewall-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-configfirewall-cmdfirewall-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 行,该网卡即属于特定的安全区域。

用户可以对安全区域进行默认规则设置,默热规则包括三个选项 ACCEPTREJECTDROP,其中 ACCEPT 选项将放行所有流量,REJECTDROP 选项将阻止所有进入该安全区域的流量,与 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 能力。在当今网络环境复杂的形势下让主机具有更好的安全性和可用性。