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*PasswordAuthentication\s+.*/PasswordAuthentication no/" /etc/ssh/sshd_config
sudo sed -ri "s/^#?\s*PermitRootLogin\s+.*/PermitRootLogin no/" /etc/ssh/sshd_config

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

grep -E '^\s*#?\s*PasswordAuthentication\s+(yes|no)' /etc/ssh/sshd_config | \
grep -vq 'PasswordAuthentication no' && echo "❌ PasswordAuthentication 未禁用" || echo "✅ PasswordAuthentication 已禁用"
grep -E '^\s*#?\s*PermitRootLogin\s+(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'

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

以上。

文档参考