2020年6月

如果你有一台老旧的 PC,或者是基于单板计算机的小型系统,你可能希望运行的是一个占用资源较少且易于下载的 Linux 版本。在这里,我们来看看占用资源非常小的 Linux 发行版。除了 Damn Small Linux 之外,这里列出的所有 Linux 发行版都是最近才更新的。每个发行版都可以在内存不足 1GB 的机器上运行,而且大多数发行版都可以在更小资源内运行。以下排列以字母排序。

Alpine Linux

Alpine Linux - 130MB download

下载:130 MB

Alpine Linux 最初是针对虚拟服务器和设备的,它直接运行在内存中。它以安全为重点,面向最终用户的功能较少,但如果你需要的话,也可以支持桌面功能。上一次公开发布是在 2019 年 10 月。

antiX Linux

antiX Linux - about 1GB download

下载:约 1GB

antiX 发行版声称完全不含 systemd —— 这是现代 Linux 发行版的基本构件。相反,antiX 提供了“antiX Magic”(我不确定那是什么)。我会告诉你,这个安装程序很复杂,有很多选项。这是一个基于 Debian 的构建版。最后一次更新是在去年 10 月份。

ArchBang

ArchBang - 600-700MB download

下载:600 - 700MB

ArchBang 是一款受 CrunchBang 启发的发行版,其使用 Arch Linux 的 Openbox 窗口管理器。最近一次发布是在 2019 年 11 月。

Bodhi Linux

Bodhi Linux - 700MB download

下载:700MB

Bodhi 是一款基于 Ubuntu 的轻量级发行版,这款发行版采用的是 Moksha(一种基于 Enlightenment 的桌面)。它的模块化和可定制性很强,可以让用户构建非常简单或合理的系统。它最近刚刚更新过。

BunsenLabs Helium

BunsenLabs Linux Helium - 600MB to 1.2GB download

下载: 600MB 至 1.2GB

前有 CrunchBang 和 CrunchBang++,今有 BunsenLabs Helium 和 ArchBang,这两者都是在 CrunchBang++ 发行版的基础上构建的。Helium 基于 Debian,采用 Openbox 窗口管理器。最新的版本是在 2019 年 7 月发布的。

Damn Small Linux

Damn Small Linux - 50MB download

下载:50MB

Damn Small Linux 自 2008 年以来一直没有正式发布,虽然 2012 年曾经有过一个候选版本。如果你有旧的硬件,这应该没什么问题,但不要在互联网上多用,因为较新的漏洞还没有打补丁。其最轻量级的形式可以在 16MB 的内存中运行,完全加载也只需要 128MB 内存。

Elive

Elive - 2.4GB download

下载:2.4GB

Elive 是一款即用版 Enlightenment 发行版,其中还包含了 Elpanel 控制面板。按照真正的 Linux 风格,它的口号是:“虽然 Elive 并不适合所有人,但你是例外吗?” 它只要 256MB 内存就能运行。Elive 最后一次更新是在 2019 年 10 月。

Linux Lite

Linux Lite - 1.4GB download

下载:1.4GB

Linux Lite 并不像一些微型发行版那样小,但它也不会让你感到多么庞大。它配备了你需要的所有组件,基于 Ubuntu,运行着一个令人感到愉快的 Linux 桌面环境。它可以在 768MB 内存中运行,但 1GB 内存更好。它最近刚刚更新。

Lubuntu

Lubuntu - 1.6GB download

下载:1.6GB

Lubuntu 名字的意思是“轻量级 Ubuntu”,顾名思义,你就知道这个发行版是怎么回事了。它是使用 LXQt 桌面环境构建的,你可以选择你想安装什么典型的 Ubuntu 软件包。它也是最近刚刚更新的。

LXLE

LXLE - 1.2GB download

下载:1.2GB

LXLE 基于 Ubuntu,有一个非常具体的口号:“重新唤醒那台老旧的 PC。”它的设计理念是拥有丰富的功能和应用,可以让你把一台老旧的 PC 变成一台可以工作的台式机,基本的 PC 使用所需的一切都有。最后一次公开发布是在 2019 年 9 月。

Puppy Linux

Puppy Linux - around 300 MB download

下载:约 300MB

Linux 从来都不会让事情变得简单,Puppy Linux 也不例外。Puppy Linux 并不是一个发行版,而是有 11 个不同版本的 Puppy Linux。它不再像以前那样小,1GB 的内存运行的比较好。尽管如此,它是最早的轻量级发行版之一。它最后一次更新是在 2019 年 3 月。

Raspberry Pi OS

Raspberry Pi OS - 400MB - 1.2GB

下载:400MB 至 1.2GB

Raspberry Pi OS(以前叫 Raspbian)是一个适用于树莓派的 Debian 发行版。在这里列出的所有发行版中,Raspberry Pi OS 是我日常使用的一个。我在三台正在运行的树莓派服务器上运行着它,另外还有几台暂时不活跃的服务器也加载着它。我不使用 Linux 图形界面。相反,我连接到一个 OctoPi 网络界面,可以让我控制我的 3D 打印机。最近刚刚更新。

SliTaz

SliTaz - 50MB download

下载:50MB

SliTaz 是一款完全运行在内存中的 Linux,可以通过 CD-ROM 或 USB 盘启动。它的体积很小,只有 50MB 左右,但具有强大的安全功能,可以只安装基础系统,或安装一个精简的 X 环境。最新的滚动发布是在 2018 年。

SparkyLinux 基础版

SparkyLinux base edition - 540MB download

下载:540MB

Sparky 是另一个基于 Debian 的发行版,它的设计是为了让家庭用户能有一个相对简单的开箱即用的 Enlightenment 体验,尽管它确实支持大约 20 个窗口管理器和桌面环境。它在 2019 年 11 月进行了更新。

Tiny Core Linux

Tiny Core Linux — 11MB download

下载:11MB

有三个版本,最小的是 11MB 的下载。在没有图形界面的情况下,Tiny Core Linux 的运行内存为 64MB。最后一次更新是在 2019 年 1 月。

结语

就是这些了,你用过哪个轻量级发行版?如果有我们没有提及的轻量级发行版,也可以在下面留言。

FastAPI 是一个使用 Python 编写的 Web 框架,还应用了 Python asyncio 库中最新的优化。本文将会介绍如何搭建基于容器的开发环境,还会展示如何使用 FastAPI 实现一个小型 Web 服务。

起步

我们将使用 Fedora 作为基础镜像来搭建开发环境,并使用 Dockerfile 为镜像注入 FastAPI、Uvicornaiofiles 这几个包。

FROM fedora:32
RUN dnf install -y python-pip \
    && dnf clean all \
    && pip install fastapi uvicorn aiofiles
WORKDIR /srv
CMD ["uvicorn", "main:app", "--reload"]

在工作目录下保存 Dockerfile 之后,执行 podman 命令构建容器镜像。

$ podman build -t fastapi .
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/fastapi latest 01e974cabe8b 18 seconds ago 326 MB

下面我们可以开始创建一个简单的 FastAPI 应用程序,并通过容器镜像运行。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello Fedora Magazine!"}

将上面的代码保存到 main.py 文件中,然后执行以下命令开始运行:

$ podman run --rm -v $PWD:/srv:z -p 8000:8000 --name fastapi -d fastapi
$ curl http://127.0.0.1:8000
{"message":"Hello Fedora Magazine!"

这样,一个基于 FastAPI 的 Web 服务就跑起来了。由于指定了 --reload 参数,一旦 main.py 文件发生了改变,整个应用都会自动重新加载。你可以尝试将返回信息 "Hello Fedora Magazine!" 修改为其它内容,然后观察效果。

可以使用以下命令停止应用程序:

$ podman stop fastapi

构建一个小型 Web 服务

接下来我们会构建一个需要 I/O 操作的应用程序,通过这个应用程序,我们可以看到 FastAPI 自身的特点,以及它在性能上有什么优势(可以在这里参考 FastAPI 和其它 Python Web 框架的对比)。为简单起见,我们直接使用 dnf history 命令的输出来作为这个应用程序使用的数据。

首先将 dnf history 命令的输出保存到文件。

$ dnf history | tail --lines=+3 > history.txt

在上面的命令中,我们使用 tail 去除了 dnf history 输出内容中无用的表头信息。剩余的每一条 dnf 事务都包括了以下信息:

  • id:事务编号(每次运行一条新事务时该编号都会递增)
  • command:事务中运行的 dnf 命令
  • date:执行事务的日期和时间

然后修改 main.py 文件将相关的数据结构添加进去。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class DnfTransaction(BaseModel):
    id: int
    command: str
    date: str

FastAPI 自带的 pydantic 库让你可以轻松定义一个数据类,其中的类型注释对数据的验证也提供了方便。

再增加一个函数,用于从 history.txt 文件中读取数据。

import aiofiles

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class DnfTransaction(BaseModel):
    id: int
    command: str
    date: str


async def read_history():
    transactions = []
    async with aiofiles.open("history.txt") as f:
        async for line in f:
            transactions.append(DnfTransaction(
                id=line.split("|")[0].strip(" "),
                command=line.split("|")[1].strip(" "),
                date=line.split("|")[2].strip(" ")))
    return transactions

这个函数中使用了 aiofiles 库,这个库提供了一个异步 API 来处理 Python 中的文件,因此打开文件或读取文件的时候不会阻塞其它对服务器的请求。

最后,修改 root 函数,让它返回事务列表中的数据。

@app.get("/")
async def read_root():
    return await read_history()

执行以下命令就可以看到应用程序的输出内容了。

$ curl http://127.0.0.1:8000 | python -m json.tool
[
{
"id": 103,
"command": "update",
"date": "2020-05-25 08:35"
},
{
"id": 102,
"command": "update",
"date": "2020-05-23 15:46"
},
{
"id": 101,
"command": "update",
"date": "2020-05-22 11:32"
},
....
]

总结

FastAPI 提供了一种使用 asyncio 构建 Web 服务的简单方法,因此它在 Python Web 框架的生态中日趋流行。要了解 FastAPI 的更多信息,欢迎查阅 FastAPI 文档

本文中的代码可以在 GitHub 上找到。


via: https://fedoramagazine.org/use-fastapi-to-build-web-services-in-python/

作者:Clément Verna 选题:lujun9972 译者:HankChow 校对:wxy

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

众所周知 Linux 可以在启动时添加服务。例如,如果要在启动时添加 Apache Httpd 服务,你可以在 chkconfigsystemctl 命令的帮助下完成此操作。

有时你需要在启动时添加自定义脚本、命令或服务,该怎么做?你可以使用以下三种方法来做到。

在本文中,我们将通过示例向你展示如何使用这些方法。

方法 1:如何使用 /etc/rc.d/rc.local 文件在重启或启动时运行脚本或命令

传统上,/etc/rc.local 文件是在切换到多用户运行级别的过程结束时,在所有正常的计算机服务启动之后执行的。

此方法也适用于 systemd 系统。

你需要将你的脚本位置添加到 /etc/rc.d/rc.local 文件中以在启动时运行。

确保该文件有运行权限:

# chmod +x /etc/rc.d/rc.local

作为演示,我们将创建一个简单的示例脚本。你可以根据需要创建任何脚本。

# vi /opt/scripts/run-script-on-boot.sh

#!/bin/bash
date > /root/on-boot-output.txt
hostname >> /root/on-boot-output.txt

脚本完成后,设置可执行权限:

# chmod +x /opt/scripts/run-script-on-boot.sh

最后,将该脚本添加到文件底部:

# vi /etc/rc.d/rc.local

/opt/scripts/run-script-on-boot.sh

重启系统进行检查:

# reboot

方法 2:如何使用 crontab 在重启或启动时执行命令或脚本

cron 在特定时间在后台自动执行计划的作业。可以在 cron 任务中使用特殊的字符串 @reboot 来完成。@reboot 是一个特殊的字符串,它允许用户在启动时运行任何命令或脚本。

此示例在系统重启时运行 /opt/scripts/run-script-on-boot.sh 文件。我们将使用与上面相同的脚本。

为此,只需在 crontab 文件中添加以下条目:

# crontab -e

@reboot /opt/scripts/run-script-on-boot.sh

重启系统进行检查:

# reboot

方法 3:如何使用 systemd 服务单元在重启或启动时运行命令或脚本

此方法仅适用于 systemd 系统。该方法非常简单。

我们将使用上面相同的脚本进行演示。

为此,你需要创建一个 systemd 启动脚本并将其放在 /etc/systemd/system/ 目录中。

这是我们的示例 systemd 启动单元脚本:

# vi sample-on-boot-script.service

[Unit]
Description=Run a Custom Script at Startup
After=default.target

[Service]
ExecStart=/opt/scripts/run-script-on-boot.sh

[Install]
WantedBy=default.target

将单元脚本放置在 systemd 所在位置后,运行以下命令更新 systemd 配置文件并启用服务:

# systemctl daemon-reload
# systemctl enable sample-on-boot-script.service

重启系统进行检查:

# reboot

额外提示

如果你想在后台运行脚本,你需要在最后加上 & 符号

/Path/To/My_Script &

如果你想以不同用户运行命令,使用以下格式:

su - $USER -c /Path/To/My_Script

via: https://www.2daygeek.com/execute-run-linux-scripts-command-at-reboot-startup/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:geekpi 校对:wxy

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

联想正在验证其 Think 品牌旗下工作站运行 Linux 系统的能力

联想集团今天宣布将对其 ThinkPad 和 ThinkStation 的工作站型号 PC(包括塔式机以及笔记本)全线产品进行认证,以确保购买到它们的消费者能够在其上运行 Linux。这一变化意味着购买者可以做到开箱即用,不必担心任何形式的兼容性问题,也意味着用户将能够获得安全补丁、驱动程序更新、固件更新和BIOS更新。该公司还表示,他们将把驱动程序上传到 Linux 内核,所以最终可以做到打开计算机就都能马上正常运行。

来源:cnBeta.COM

硬核老王点评:这应该是一条对 Linux 的利好消息。

研究发现即便是发现账号泄露之后用户也很少换密码

这一结果不是基于调查数据而是真实的用户浏览器流量。这项研究采用了卡内基梅隆大学 Security Behavior Observatory (SBO)项目收集的用户数据,出于学术研究的目的,用户自愿选择分享完整的浏览器流量。

来源: solidot

硬核老王点评:与其换一个记不住的密码,不如抱有侥幸心理,觉得自己没啥值得被窃取的。——大概就是这样想的吧。

隐私浏览器 Brave 月活跃用户数量突破 1500 万

Brave 是一款开源网络浏览器,旨在通过屏蔽广告和网站跟踪器保护用户隐私。较去年 11 月 Brave 1.0 发布时增长 50%,较去年同期增长 125%(2.25 倍)。日活跃用户也有明显的增长,每天使用 Brave 浏览的用户从一年前的 200 万增长到 530 万。

来源:cnBeta.COM

谷歌因跟踪“隐身模式”用户信息被起诉:要求至少赔偿 50 亿美元

这起诉讼指控就算用户使用了谷歌所谓的“隐身模式”,但他们在网上浏览的内容和地点等信息仍然会被谷歌收集。诉状称,无论用户是否点击了谷歌推送的广告,谷歌都可以通过谷歌分析、谷歌广告管理以及其他应用程序和网站插件(包括智能手机应用程序)秘密收集用户数据。尽管用户可能会将“隐身浏览模式”视为一个保护私人信息的避风港,但计算机安全研究人员长期以来一直担心,谷歌及其竞争对手可能会通过跟踪不同浏览模式下的用户身份,将隐身浏览模式和普通互联网浏览模式产生的数据结合起来,以扩大用户的个人资料。

来源:新浪科技

硬核老王点评:前一段时间小米也被曝出类似情况,不过小米马上就做了改正。

使用树莓派或其它单板机创建一个“家庭私有云”。

构建一个家庭实验室可以是一个有趣的方式,可以让你学习的新概念和实验新技术时还能自娱自乐。得益于以 树莓派 为首的单板计算机(SBC)的流行,在舒适的家里就可以轻松构建一个多计算机实验室。比起试图在主流的云服务商建立的相同配置,创建一个“家庭私有云”以花更少的钱来体验到云原生技术,也是一个极好的方法。

这篇文章阐述如何修改树莓派或其它的单板机的磁盘镜像,预配置主机的 SSH,并禁用首次启动时强制竞选交互配置的服务。这是一个让你的设备“即启动,即运行”的极好方法,类似于云端实例。之后,你可以使用自动化的流程通过 SSH 连接来进行更专业和更深入的配置。

此外, 当向你的实验室添加更多的树莓派时,修改磁盘镜像可以来让你只需要将该镜像写到一个 SD 卡、放入树莓派中就可以了!

 title=

解压缩和挂载镜像

对于这个项目,你需要修改一个服务器磁盘镜像。在测试期间,我使用 Fedora Server 31 ARM。在你下载该磁盘镜像并验证其校验和之后,你需要将其解压缩并挂载其到宿主机的文件系统的某个位置上,以便你可以根据需要修改它。

你可以使用 xz 命令通过 --decompress 参数来解压缩 Fedora 服务器镜像:

xz --decompress Fedora-Server-armhfp-X-y.z-sda.raw.xz

这会留下一个解压缩后的原始磁盘镜像(它会自动地替换 .xz 压缩文件)。这个原始磁盘镜像就像它听起来的那样:一个包含格式化后安装好的磁盘上的所有数据的文件。这包含分区信息、启动分区、root 分区以及其它分区。你需要挂载你打算在其中进行修改的分区,但是要做到这一点,你需要知道磁盘镜像中的分区起始位置和扇区大小,这样你才可以挂载该文件正确的扇区。

幸运的是,你可以在一个磁盘镜像上使用 fdisk 命令,就像在实际磁盘上使用一样容易。使用 --list-l 参数来查看分区的列表和其信息:

# 使用 fdisk 来列出原始镜像文件的分区:
$ fdisk -l Fedora-Server-armhfp-31-1.9-sda.raw
Disk Fedora-Server-armhfp-X-y.z-sda.raw: 3.2 GiB, 3242196992 bytes, 6332416 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdaad9f57

Device                               Boot   Start     End Sectors  Size Id Type
Fedora-Server-armhfp-X-y.z-sda.raw1         8192  163839  155648   76M  c W95 F
Fedora-Server-armhfp-X-y.z-sda.raw2 *     163840 1163263  999424  488M 83 Linux
Fedora-Server-armhfp-X-y.z-sda.raw3      1163264 6047743 4884480  2.3G 83 Linux

你需要的所有信息都可在上面的输出中获得。第 3 行表示扇区大小(包括逻辑和物理的):512 字节 / 512 字节。

设备列表显示的是原始磁盘镜像中的分区。第一个,Fedora-Server-armhfp-X-y.z-sda.raw1 毫无疑问是引导程序分区,因为它是第一个,很小(仅仅 76MB),而且类型被标识为 c,即 W95 FAT32(LBA),这是一个从 SD 卡启动的 FAT32 分区。

第二个分区也不是非常大,只有 488MB。这个分区是一个 Linux 原生类型分区(Id 83),它可能是包含内核和 initramfs 的 Linux 启动分区。

第三个分区可能是你需要的东西:它有 2.3GB 大小,所以在它其中应该有发行版的主要部分,并且它是一个 Linux 原生分区类型,这也是在预料之中的。这个分区应该包含了你需要修改的分区和数据。

第三个分区从扇区 1163264 开始(在 fdisk 的输出中被显示为 Start 列),所以你的挂载偏移量是 595591168,计算方法是将扇区大小(512)乘以起始扇区(1163264)(即 512 * 1163264)。这意味着你需要以偏移量 595591168 挂载该文件,才能挂载到正确位置。

装备了这些信息,现在你可以将第三个分区挂载到你的家目录中了:

$ mkdir ~/mnt
$ sudo mount -o loop,offset=595591168 Fedora-Server-armhfp-X-y.z-sda.raw ~/mnt
$ ls ~/mnt

直接在磁盘镜像中作业

在磁盘镜像被解压缩和被挂载到宿主机上的一个位置后,就可以修改镜像以符合你的需求。在我看来,对镜像进行更改的最简单的方法是使用 chroot 来将你会话的工作根目录更改为挂载镜像的工作根目录。不过,有点棘手。

在你改变了根目录后,你的会话将使用新的根目录下的二进制文件。除非你是在一个 ARM 系统做这些所有的操作,否则解压缩后的磁盘镜像的架构将与你正在使用的宿主机系统不同。即使在 chroot 环境中,宿主机系统也无法使用一个不同架构的二进制文件。至少,不能在本机使用。

幸运的是,这里有一个解决方案:qemu-user-static。来自 Debian Wiki 的说明:

“[qemu-user-static] 提供了用户模式的仿真二进制文件,是静态构建的。在这个模式中,QEMU 可以在一个 CPU 上启动为另一个 CPU 编译的 Linux 进程 …… 如果安装了 binfmt-support 软件包,qemu-user-static 软件包会注册提供的仿真器可以处理的二进制文件格式,以便其能够直接运行其他架构的二进制文件。”

这正是你需要在 chroot 环境中非本地架构中工作所需的。如果宿主机系统是 Fedora,使用 DNF 来安装 qemu-user-static 软件包,并重新启动 systemd-binfmt.service

# 使用 DNF 启用非本地的 arch chroot 环境,添加新的二进制文件格式信息
# 输出镜像了精简
$ dnf install qemu-user-static
$ systemctl restart systemd-binfmt.service

使用这种方法,你一个能够更改根目录到挂载的磁盘镜像,运行 uname 命令来验证一切都在正常:

sudo chroot ~/mnt/ /usr/bin/uname -a -r
Linux marvin 5.5.16-200.fc31.x86_64 #1 SMP Wed Apr 8 16:43:33 UTC 2020 armv7l armv7l armv7l GNU/Linux

在 chroot 环境中运行 uname 将在输出中显示 armv7l,这个原始磁盘镜像的架构, 而不是宿主机的架构。一切如预期,可以继续修改镜像了。

修改磁盘镜像

现在你可以直接切换到这个基于 ARM 的磁盘镜像中,并在该环境中工作了,你可以对镜像自身镜像修改了。你需要设置该镜像,以便它能够启动并可立即访问,而不需要在树莓派上做任何额外的设置。为此,你需要安装并启用 sshd(OpenSSH 守护进程),并为 SSH 访问添加授权密码。

为了使其表现得更像一个云环境,实现在家里建立私有云的梦想,添加一个本地用户,给予该用户 sudo 权限,并(为了像云端的重度用户一样)允许该用户无需密码就可以使用 sudo

所以,你将做的事情是:

  • 安装并启用 SSHD(SSHD 已经在 Fedora ARM 镜像中安装并启用,但是你可能需要为你发行版手动执行这些工作)
  • 设置一个本地用户
  • 允许本地用户来使用 sudo(无需密码,可选)
  • 添加授权密钥
  • 允许 root 使用授权密码镜像 SSH(可选)

我使用 GitHub 功能,它允许你上传你的 SSH 公钥,并在 https://github.com/.keys 处可访问。我发现这是一种很方便的分发公钥的方法,不过我生性多疑,我总是检查下载的密钥是否与我预期的匹配。如果你不想使用这种方法,你可以从你宿主机中复制你公钥到 chroot 环境中,或者你可以将公钥托管在你控制的 Web 服务器上以便使用相同的工作流。

要开始修改磁盘镜像,再次切换根目录到挂载的磁盘镜像中,这次启动一个 shell,以便可以运行多个命令:

# 为了简洁起见,省略了这些命令的输出(如果有的话) 
$ sudo chroot ~/mnt /bin/bash

# 安装 openssh-server ,并启用它 (在 Fedora 上已经完成)
$ dnf install -y openssh-server
$ systemctl enable sshd.service

# 允许 root 使用授权密码访问 SSH
$ mkdir /root/.ssh

# 下载或者另外添加授权密码文件,你的公共密码
# 将 URL 替换为你自己公共密码的路径
$ curl <https://github.com/clcollins.keys> -o /root/.ssh/authorized_keys
$ chmod 700 /root/.ssh
$ chmod 600 /root/.ssh/authorized_keys

# 添加一个本地用户,并放置他们到 wheel 组中
# 将组和用户更改为您想要的一切
useradd -g chris -G wheel -m -u 1000 chris

# 下载并添加你的授权密码
# 像你上面所做的那样更改 home 目录和URL
mkdir /home/chris/.ssh
curl <https://github.com/clcollins.keys> -o /home/chris/.ssh/authorized_keys
chmod 700 /home/chris/.ssh
chmod 600 /home/chris/.ssh/authorized_keys
chown -R chris.chris /home/chris/.ssh/

# 允许 wheel 组( 使用你的本地用户) 不需要使用密码来使用 suso
echo "%wheel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/91-wheel-nopasswd

这就是树莓派或其它单板机在首次启动时需要完成设置 SSH 的全部工作。不过,每个发行版都有自己的特点。例如,Raspbian 已经包含一个本地用户:pi,并且不使用 wheel 组。因此对于 Raspbian 来说,最好使用现有用户,或者删除 pi 用户,并使用另一个用户来替换它。

在 Fedora ARM 的情况下,镜像会在首次引导启动时提示你完成设置。这会破坏你在上面所做的修改的目的,尤其是在设置完成之前,它会完全阻止启动。你的目标是使树莓派的功能类似于私有云的基础设施的一部分一样运行,而这个工作流程包括在主机启动时通过 SSH 远程设置主机。 禁用初始化设置,它由 initial-setup.service 控制:

# 对多用户和图形目标禁用 initial-setup.service
unlink /etc/systemd/system/multi-user.target.wants/initial-setup.service
unlink /etc/systemd/system/graphical.target.wants/initial-setup.service

当你在 chroot 环境时,你可以对你系统做任何你想做的其它更改,或者就放在那里,在第一次启动后,按照云原生的工作流通过 SSH 进行配置。

重新压缩并安装修改后的镜像

完成了这些更改后,剩下的就是重新压缩磁盘镜像,并将其安装其到你的树莓派的 SD 卡上。

确保退出 chroot 环境,然后卸载磁盘镜像:

$ sudo umount ~/mnt/

就像最初解压缩镜像一样,你可以再次使用 xz 命令来压缩镜像。通过使用 --keep 参数,xz 将保留原始的镜像,而不是清理掉它。虽然这会占用更多的磁盘空间,但保留下来的未压缩镜像将允许你对正在处理的镜像进行增量更改,而不需要每次都对其进行解压缩。这对于在测试和调整镜像时节省时间是非常好的。

# 压缩压缩磁盘镜像为一个 .xz 文件,但保留原始磁盘镜像
xz --compress Fedora-Server-armhfp-31-1.9-sda.raw --keep

压缩过程将花费一些时间,所以趁着这个时间站起来,舒展身体,让你的血液再次流动。

在压缩完成后,可以将新的、已修改过的磁盘镜像复制到 SD 卡上,以便与树莓派一起使用。标准的 dd 方法将镜像放置到 SD 卡上也很好用,但是我喜欢使用 Fedora 的 arm-image-installer,因为它因为它在处理未经编辑的镜像时提供了一些选项。它对编辑过的镜像也很好用,并且比 dd 命令更友好一些。

确保检查 SD 卡在哪个磁盘驱动器上,并用 --media 参数使用它:

# 使用 arm-image-installer 来复制已修改的磁盘镜像到 SD 卡上
arm-image-installer --image=Fedora-Server-armhfp-X-y.z-sda.raw.xz --target=rpi3 --media=/dev/sdc --norootpass --resizefs -y

现在,你已经为树莓派或其它单板机准备好了一个新的、已修改的 Fedora Server ARM 镜像,准备好启动并立即 SSH 到你的修改镜像中。这种方法也可以用来做其它的修改,并且你也可以使用其它发行版的原始磁盘镜像,如果你更喜欢它们,而不是 Fedora 的话。这是一个开始构建家庭实验室私有云的良好基础。在以后的文章中,我将指导你使用云技术和自动化建立一个家庭实验室。

延伸阅读

为了学习如何做这篇文章中的事情,我做了很多研究。以下是我找到的两个对学习如何定制磁盘映像和使用非原生架构最有帮助的资料。它们对我从“不知道自己在做什么”到“我能够完成它!”非常有帮助。


via: https://opensource.com/article/20/5/disk-image-raspberry-pi

作者:Chris Collins 选题:lujun9972 译者:robsean 校对:wxy

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

在上一篇文章中,我们探讨了如何在 Fedora 中用命令行控制防火墙

现在你将看到如何“添加”、“删除”和“列出”服务、协议和端口,以便“阻止”或“允许”它们。

简短回顾

首先,最好检查一下防火墙的状态,看它是否正在运行。如我们先前所学,你可以使用状态选项(firewall-cmd ‐‐state)来得到。

下一步是获取网络接口适用的 zone 。例如,我使用的桌面有两个网络接口:一个物理接口(enp0s3),代表我实际的网卡,和虚拟接口(virbr0),它由 KVM 等虚拟化软件使用。要查看哪些域处于活动状态,请运行 firewall-cmd ‐‐get-active-zones

现在,你知道了你感兴趣的域,可以使用 firewall-cmd ‐‐info-zone=FedoraWorkstation 这样的命令列出该域的规则。

读取区域信息

要显示特定域的信息,请运行 firewall-cmd ‐‐zone=ZoneName ‐‐list-all,或使用以下命令显示默认域的信息:

[dan@localhost ~]$ firewall-cmd --list-all
FedoraWorkstation (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3
sources:
services: dhcpv6-client mdns samba-client ssh
ports: 1025-65535/udp 1025-65535/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

现在,让我们查看输出。第一行表明以下信息关联的域以及该域当前是否在使用中。

target: default:告诉我们这是默认域。可以通过 ‐‐set-default-zone=ZoneName‐‐get-default-zone 设置或获取。

icmp-block-inversion 表明是否阻止 ICMP 请求。例如,如果机器响应来自网络上其他机器的 ping 请求。

interfaces 字段显示接受此域的所有接口。

处理服务、端口和协议

现在,重点关注 servicesportsprotocols 所在行。默认情况下,防火墙将阻止所有端口、服务和协议,而只允许列出的。

在这里,你可以看到允许的服务是非常基本的客户端服务。例如,访问网络上的共享文件夹(samba-client)、与 DNS 服务器通信或通过 SSH(ssh 服务)连接到计算机。你可以将 service 视为与端口组合的协议,例如 ssh 服务使用 SSH 协议,并且按照惯例使用 22 端口。通过允许 ssh 服务,你实际上所做的就是允许传入的连接在默认 22 端口上使用 SSH 协议。

请注意,根据经验,名称中带有 client 字样的服务是指传出连接,也就是你使用你的 IP 作为源对外部的连接,与之相反的是 ssh 服务,比如,它将接受传入连接(监听来自外部的连接)。

你可以在文件 /etc/services 中查找服务。例如,如果你想知道这些服务使用什么端口和协议:

[dan@localhost ~]$ cat /etc/services | grep ssh
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol

你可以看到 SSH 同时使用 TCP 和 UDP 的 22 端口。此外,如果你希望查看所有可用的服务,只需使用 firewall-cmd --get-services

打开端口

如果要阻止端口、服务或协议,请确保在此处未列出它们。展开来说,如果要允许服务,那么需要将它添加到列表中。

假设你要打开 5000 端口用于 TCP 连接。为此,请运行:

sudo firewall-cmd --zone=FedorwaWorkstation --permanent --add-port=5000/tcp

请注意,你需要指定规则适用的域。添加规则时,还需要如上指定它是 tcp 还是 udp 端口。--permanent 参数将规则设置为即使系统重启后也可以保留。

再次查看你所在区域的信息:

[dan@localhost ~]$ firewall-cmd --list-all
FedoraWorkstation (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3
sources:
services: dhcpv6-client mdns samba-client ssh
ports: 1025-65535/udp 1025-65535/tcp 5000/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

类似地,如果你想从列表删除该端口,请运行:

sudo firewall-cmd --zone=FedorwaWorkstation --permanent --remove-port=5000/tcp

相同的 remove‐‐remove-protocol‐‐remove-service) 和 add‐‐add-protocol‐‐add-service)选项同样适用于服务协议


via: https://fedoramagazine.org/how-to-manage-network-services-with-firewall-cmd/

作者:dan01 选题:lujun9972 译者:geekpi 校对:wxy

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