飞牛 fnOS 初始化配置记录

fnOS 是基于 Debian 定制的 NAS 系统,初始配置与原生 Debian Server 区别不大。但 可能是出于后续扩展或定制的考虑, fnOS 移除了部分非核心功能,例如不支持为用户创建 home 目录、不支持静态路由配置等。因此,参考《Debian Server 初始化设置 SOP》的流程,我也整理了一份适用于 fnOS 的初始化配置记录,供后续使用。

SOP,即 Standard Operating Procedure,意为「标准作业程序」。

准备工作

在你成功安装并启动 fnOS、创建第一个存储空间后,即可开始接下来的配置。 但在开始之前,需要做一些基础的准备工作。

首先,开启 fnOS 的 SSH 功能。默认 SSH 端口为 22,你可以此时将其修改为如 2662 这类 不常见未被系统占用 的端口。

接着,登录 SSH。fnOS 默认禁止用户使用 root 账户登录,因此我们使用安装 fnOS 后创建的第一个用户来登录 SSH。

在终端中使用以下命令登录:

ssh mikusa@192.168.31.123 -p 2662

系统配置

进入终端后,先将当前用户设置为变量,方便后面使用:

USERNAME=mikusa

SUDO免密

使用 visudo 配置当前用户可以无需输入密码执行 sudo 命令:

sudo visudo

滚动到 最后 添加以下内容,mikusa 为你的用户名:

mikusa ALL=(ALL) NOPASSWD: ALL

CTRL+X 保存退出。

注意要将这段配置加在组规则的后面,以免被组规则覆盖。

用户目录

fnOS 没有像 DSM 那样有个创建「家目录」的配置项,也可能是 fnOS 并没有计划引入这个概念。因此,为了顺利配置 ZSH,我们需要手动创建用户的家目录:

sudo mkdir /home/$USERNAME

授予权限:

sudo chown $USERNAME:Users /home/$USERNAME

软件源

fnOS 默认使用的是清华镜像源,非官方源,因此无需替换。但如果不想用清华镜像,也可以替换成科大或是别的镜像源。

科大:

sed -i.bak 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

阿里:

sed -i.bak 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list

腾讯:

sed -i.bak 's/deb.debian.org/mirrors.tencent.com/g' /etc/apt/sources.list

静态路由

fnOS 尚不支持在网页端配置静态路由。如果有静态路由的需求,需要手动添加,例如:

sudo ip route add 11.0.0.0/8 via 192.168.31.4

但重启 fnOS 后命令就会失效,因此需要配置成系统服务自启动。

先创建脚本文件:

sudo vim /usr/local/bin/add-static-route.sh

粘贴如下内容并保存,自行更换目标网段,确保目标网段与网关 IP 是你实际环境所需的值:

#!/bin/bash
ip route add 11.0.0.0/8 via 192.168.31.4

添加权限:

sudo chmod +x /usr/local/bin/add-static-route.sh

接着创建服务:

sudo vim /etc/systemd/system/static-route.service

粘贴以下内容并保存:

[Unit]
Description=Add static route
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/add-static-route.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

随后,执行以下命令启用并启动该服务:

sudo systemctl daemon-reexec
sudo systemctl enable static-route.service
sudo systemctl start static-route.service

执行以下命令测试:

ip route | grep 11.0.0.0

如果有类似输出:

11.0.0.0/8 via 192.168.31.4 dev ens18

就说明配置成功,后续重启 fnOS 也可以自动添加静态路由。

QEMU Guest Agent

安装 QEMU Guest Agent 可以增强 fnOS 与宿主机(比如 Proxmox)之间的交互能力。如:IP 地址可以自动识别、运行状态更加精准,还可以使用「关机」而不是「强制关机」关闭虚拟机。

需要在虚拟机 选项 菜单中找到 QEMU Guest Agent 并设置为 启用,然后在 fnOS 终端中执行:

sudo apt update
sudo apt install qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent

随后在 Proxmox 中重启虚拟机或直接刷新状态,就可以看到具体效果了。

用户配置

fnOS 的多用户功能我还没搞明白,不如说当前 fnOS 多用户的配置还处于十分早期的阶段,不像 DSM 有一套非常完善的配置流程。因此,本文的用户配置仅针对管理员用户。

SSH

创建 .ssh 文件夹并授权:

mkdir -p ~/.ssh && chmod 700 ~/.ssh && cd ~/.ssh

如果你已有 SSH 公钥,将其添加到 authorized_keys 文件中(替换下方内容为你的公钥):

echo 'ssh-ed25519 XXXXXXXXXXXXXXXXX' > authorized_keys

如果没有,可以使用 ssh-keygen -t ed25519 生成,并拷贝私钥至本地保存。

随后修改权限:

chmod 600 ~/.ssh/authorized_keys

接着修改 SSH 配置,关闭密码 & root 用户登录:

sudo sed -ri "s/^#?s*PasswordAuthentications+.*/PasswordAuthentication no/" /etc/ssh/sshd_config
sudo sed -ri "s/^#?s*PermitRootLogins+.*/PermitRootLogin no/" /etc/ssh/sshd_config

可以使用以下命令测试配置是否生效:

grep -E '^s*#?s*PasswordAuthentications+(yes|no)' /etc/ssh/sshd_config | 
grep -vq 'PasswordAuthentication no' && echo "❌ PasswordAuthentication 未禁用" || echo "✅ PasswordAuthentication 已禁用"
grep -E '^s*#?s*PermitRootLogins+(yes|no|prohibit-password|without-password)' /etc/ssh/sshd_config | 
grep -vq 'PermitRootLogin no' && echo "❌ PermitRootLogin 未禁用" || echo "✅ PermitRootLogin 已禁用"

如果输出

✅ PasswordAuthentication 已禁用
✅ PermitRootLogin 已禁用

则代表配置成功。

接着新开一个终端,使用密钥方式测试 SSH 登录是否成功。测试成功后,再执行:

sudo service sshd restart

重载 SSH 配置。

ZSH

安装 zsh 和 autojump:

sudo apt install zsh autojump -y

安装后会提示切换到 zsh,接着使用官方脚本一键安装 ohmyzsh:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

如果网络不顺,可以使用清华镜像源安装:

git clone https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.git
cd ohmyzsh/tools
REMOTE=https://mirrors.tuna.tsinghua.edu.cn/git/ohmyzsh.git sh install.sh

再安装一些 zsh 必要插件。这里就没有啥靠谱镜像了,请自备代理或自查镜像源:

git clone https://github.com/zsh-users/zsh-autosuggestions.git ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting

将插件添加到配置中。先备份一下原始文件:

cp ~/.zshrc ~/.zshrc.bak

追加插件:

sed -i.bak 's/plugins=((.*))/plugins=(1 autojump zsh-autosuggestions zsh-syntax-highlighting docker docker-compose)/' ~/.zshrc

重载 ZSH:

source ~/.zshrc

可以尝试使用 powerlevel10k 主题:

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git 
${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

修改 .zshrc 中的主题配置:

sed -i 's/^ZSH_THEME=.*/ZSH_THEME="powerlevel10k/powerlevel10k"/' ~/.zshrc

重载配置:

source ~/.zshrc

这时会弹出配置流程,全英文的。如果实在不知道咋配置,随便瞎按一通后,下载 C佬 提供的预配置 p10k 替换:

wget -O ~/.p10k.zsh https://gist.githubusercontent.com/Xm798/9afccda2e2b26b913854d36c96438344/raw/9acd0a1316895b6bc5485af043d38025f54926bd/.p10k.zsh

source ~/.zshrc 重载 zsh,确认插件与主题已生效。

另外,需要预先安装 Nerd-Fonts 字体,才能获得最佳的图标显示效果。由于我用得不多,使用的是 CodeNewRoman Nerd Font Mono 字体,你可以点击 这里 直接下载压缩包,或从 Nerd Fonts 项目中选择你喜欢的字体。解压后全部安装进系统。

在 Windows 终端中把这个字体加上。

显示效果大概是这样:

DOCKER

如果需要在终端中直接使用 docker 命令,先将当前用户加入 docker 用户组:

usermod -aG docker $USERNAME

才能正常使用 docker 以及 docker compose 相关的命令。

CODE SERVER

这部分内容是由群友 @青山蓝山 提供的。

如果不方便直接使用终端通过 SSH 连接 Linux 主机,可以尝试安装 code-server,这样就可以通过网页版 VS Code 远程操控主机。在 code-server 的内置终端中连接宿主机 SSH,即可获得几乎等同于本地 VS Code 的使用体验。

先安装 code-server:

services:
  code-server:
    image: linuxserver/code-server:latest
    container_name: code-server
    ports:
      - 8443:8443
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
      - PASSWORD=${PASSWORD} #可选
      - HASHED_PASSWORD= #可选
    #  - SUDO_PASSWORD=password #可选
    #  - SUDO_PASSWORD_HASH= #可选
    #  - PROXY_DOMAIN=code-server.my.domain #可选
    #  - DEFAULT_WORKSPACE=/config/workspace #可选
    volumes:
      - ./config:/config
      - ${WORKSPACE_PATH}:/config/workspace #默认工作目录
      - /vol1/1000/docker:/docker #其他需要操作的文件夹都可以挂载进来
    restart: always
  • 端口默认是 8443,有需要可以修改
  • fnOS 第一个用户的 PUIDPGID 分别是 10001001
  • PASSWORD 变量设置一个密码,用于 Web 登录,尽量随机并复杂
  • 默认的工作目录是容器内的 /config/workspace ,你可以将操作频繁的文件夹映射到这里,例如 /home/mikusa 。这样启动 code-server 后,默认启动的便是这个文件夹

你可以在 compose.yml 同目录创建一个 .env 文件,存储这些变量:

PUID=1000
PGID=1001
TZ=Asia/Shanghai
PASSWORD=Your_Password_Here
WORKSPACE_PATH=/home/mikusa

启动 code-server 后,使用设置的密码登录。

如果有反向代理的需求,可以参考以下配置。

Caddy:

code.server.com {
  reverse_proxy http://code-server:8443
}

Nginx:

#省略常规配置
    location / {
        proxy_pass http://code-server:8443;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_set_header Accept-Encoding gzip;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket 支持
        proxy_http_version 1.1;
        proxy_read_timeout 3600s;
    }

可以使用 code-server 内置的终端连接宿主机,在本地映射到容器内 /config 的文件夹中,找到 .ssh 文件夹。然后像Windows本地连接远程主机一样,新建一个 config 文件,填入主机配置:

Host fnos
    HostName 192.168.31.123
    Port 2662
    User mikusa
    IdentityFile ~/.ssh/fnos

把私钥文件复制到 config 同级目录,修改权限,否则会报错:

chmod 600 ~/.ssh/fnos

远程主机配置过 p10k 主题后,code-server 可能因为缺少字体导致显示不正常,解决方法很简单。在本地安装 nerd font 字体后,在 code-server 设置中,添加字体家族名。例如:

'MesloLGM NF','CodeNewRoman Nerd Font Mono'

注意需要使用英文单引号包裹,使用英文逗号分隔多个字体。

以上。

文档参考