跳到正文

共享与服务

模块跑在被控端下,跑在真正拿着磁盘或者显卡的那台机器上:Samba、Gitea、Podman、ZFS 都是。服务页把它们发布出来的条目和你手写的条目汇到一起,推给每个客户端。

中枢自己不承载任何模块,等着它自己跑 Samba 的同学,那件事不会发生;中枢那台机器上也有被控端,勾它是以设备身份,不是以中枢身份。服务页只有四组,远程桌面能到客户端,但在这一页上没有组。手工能声明的只有网页、端口和文件三种,AI 由中枢自己声明,远程桌面由那台机器的被控端声明。离线的机器改不了,应用会被拒绝,不排队。Podman 要 4.4 以上才有 Quadlet,Debian 12 带的是 4.3.1。发行版没有预编译内核模块时,ZFS 会现场编译一个,往后每次升内核还要再编一次。

被控端承载什么

模块需要什么跑在哪里
Samba一块放共享的磁盘那台机器的被控端下
Gitea一块放仓库的磁盘那台机器的被控端下
Podman4.4 或者更新那台机器的被控端下
ZFS若干块裸盘,可能还要编内核模块那台机器的被控端下

四个模块页长得一样:最上面是「已启用的设备」和一个设备选择器,一条应用栏,下面才是那台机器自己的面板。这一段话是「运行被控端的机器。勾选一台就在它上面安装 {module},取消勾选就移除。」一台运行被控端的机器都没有时,它让你先去设备页装一台;模块还没落到任何机器上时,它让你在上面挑一台再应用。

打开模块页,在「已启用的设备」里勾上一台机器,点「应用设备」。

预期:先弹出安装确认框,标题是「应用 {name} 会改变这些机器上运行的东西」,里面写清楚要加第三方仓库、要编内核模块、要装哪些包还是要卸哪些包;确认之后模块装上,下面出现那台机器自己的面板。机器离线时被拒绝,提示「{device} 没有响应,没有在它上面做任何改动。」

第三方仓库那一条的原话是:这个软件不在发行版自己的仓库里,包会来自下面这个地址,并像发行版自己的包一样被信任。卸载那一条是:服务会停止,它的包会被移除,它写在包之外的东西留在机器上。

Samba

1. 在「Samba」页勾上 home-hub,点「应用设备」。

预期:模块装上,下面出现「用户」「共享」「当前连接」三栏。

2. 在「用户」里点「添加用户」,填 alex 和密码,点「应用用户」。

预期:提示是「创建账号、设置暂存的密码、吊销被移除的用户。」,待创建的行先写「应用时创建」。改一个人的密码,做法是把这个用户删掉再加一遍,没有单独的改密码。

3. 在「共享」里点「添加共享」,填 media 和目录,点「应用共享」。

预期:提示是「保存共享并重载服务。」,这一行旁边多一个复制地址的按钮。只读开关管的是「是否对所有人拒绝写入,不论他是谁」。Samba 的端口是 445。

Samba 页上的 media 共享

Gitea

1. 在「Gitea」页勾上一台机器,点「应用设备」。

预期:模块装上,下面出现「接入」和「管理员」两栏。

2. 填 Root URL,或者留空让它按机器地址推出来,点「应用接入设置」。

预期:提示是「重写 app.ini 并重启 Gitea。」Root URL 会写进克隆地址里。这一栏管的是必须和 hub 对得上的那部分,仓库、账号和其余一切都在 Gitea 自己里面管。

3. 点「创建管理员」。

预期:第一个管理员账号建好。服务还没起来时,这个按钮会提示先把服务起起来。

Gitea 页

容器

1. 在「容器」页勾上一台机器,点「应用设备」。

预期:模块装上,下面出现「声明的容器」「正在运行」「镜像源」三栏。

2. 点「添加容器」,填镜像、标签、端口和卷,点「应用容器」。

预期:提示是「首次启动要拉取镜像,可能要等一会儿。」每个容器变成默认网络上的一个 systemd 单元,起来之后出现在「正在运行」里。

镜像源那一栏「按顺序尝试,排在 docker.io 前面」,应用它「下次拉取时生效,不重启任何东西」。容器发布出来的端口,会变成每个客户端上端口面板里的一行。

容器页

WARNING

改过的容器会被重建,卷以外的文件会丢。

要留的东西放进卷里,再去改镜像标签或者端口。

ZFS

1. 在「ZFS」页勾上一台机器,点「应用设备」。

预期:模块装上;没装时页面写「在上面为这台机器启用 zfs 模块。」

2. 点「创建存储池」,挑盘,挑一种布局。

预期:四种布局各带一句话,单盘是没有冗余,镜像是完整副本,raidz1 能扛一块盘坏,raidz2 能扛两块。

3. 点「创建数据集」,挂载点留空就是 /存储池/名字

预期:数据集建好并挂上,随后可以拿它当 Samba 共享的目录。

ZFS 页

DANGER

选中的盘上还留着旧存储池或者旧文件系统的痕迹时,加进去会覆盖它们。

布局和池里已有的 vdev 不一致时,整个池只和最弱的那个 vdev 一样安全。

服务页

1. 打开「服务」页。

预期:四组,网页、端口、AI、文件,角标写着「{total} 项中有 {healthy} 项正常」。模块发布的行已经在里面了,每一行写明来源:由 {host} 上的 samba 模块发布、由 {host} 上的 Gitea 模块发布、由容器 {image} 发布、由 AI 网关发布、来自 {device} 的共享,或者手动声明。

服务页

2. 中枢没承载的东西,点「声明服务」。

预期:弹出「新建声明的服务」,要填名称、类别(网页、端口、文件)、主机、端口,以及这个类别自己的字段:网页还要协议和路径,文件还要共享名。主机填回环地址或者中枢自己持有的地址时,发给每台机器的是它连中枢用的那个地址;127.0.0.10.0.0.0::1localhost 都算中枢自己。文件类别端口留空就是 445。

声明一个服务

3. 文件类别可以点「扫描主机」。

预期:那台服务器导出的共享填进共享列表,每一个发布成单独一行。什么都没导出时它写「这台主机没有可声明的导出。」

4. 点「声明」。

预期:这一行出现在对应的组里,客户端下一帧就收到。删掉一条声明时提示「声明及其发布的每一行都会被移除,它指向的机器不受影响。」

客户端上看到什么

客户端面板按钮空的时候那行字
网页网页打开没有发布网页服务
端口端口连接,开着时是断开没有发布端口
AIAI配置,然后应用没有发布 AI 服务
文件文件配置,然后挂载,挂上之后是卸载没有发布共享
远程桌面远程桌面连接当前没有共享的远程桌面

客户端按这个顺序画出五个面板,哪一组没有条目也照样画。某一行当前不通时,它在客户端上是灰的,写着「当前无法访问」。

客户端窗口里的五个面板

Neutrino · 个人开发基础设施