☰
旧主机变身家用云底座:飞牛OS+Docker部署全记录与避坑指南
2026/10/7 17:33:11 网站建设 项目流程

最近我把一台吃灰快一年的旧主机翻了出来,给它起了一个不算严肃的项目代号——cloudflare-os。先说明白,这个名字跟CDN服务商Cloudflare没有关系,我只是想给手里这台小主机一个响亮的代号:我希望它像名字里那个词一样稳,不要动不动就出问题。它要在我家里扮演的角色也很简单:一台24小时开机的家用云底座。底层跑Linux,上面部署一个NAS系统负责存储和文件分享,再用Docker挂几个容器,把下载、监控存储、远程备份这些事全部收拢到一起。

这篇博文就是这次折腾的完整记录:从系统选型、虚拟机预演、物理机刷入飞牛OS,到overlay2目录疯涨、os error 5权限报错、网络唤醒失效这些坑,每一步是怎么想的、怎么排查的、最后怎么解决的,都会写清楚。如果你手里正好有一台退役小主机、一块矿渣主板、甚至只是想在虚拟机里先体验一把NAS系统,这篇值得你对照着操作。文章尽量不堆术语,遇到绕不过去的概念我会用大白话拆开讲。

1. cloudflare-os的整体设计:把一台旧机器变成“家用云底座”

1.1 为什么叫cloudflare-os:一台“家用云底座”的目标拆解

先说这个代号怎么来的。我把家庭自托管服务分成存储、应用、入口三层,这三层经常各自为政——NAS归NAS,Docker容器归Docker容器,访问入口还要单独搞一套。云服务商对外卖的东西本质上是“托管好的稳定底座”,而我希望自己家里也能有这样的底座。于是我给项目起名cloudflare-os,就是在提醒自己:别搞成三天两头重建的玩具,要向真正的云服务看齐。

硬件只是普通小主机,可能跟你手里的没什么两样:一个多盘位机箱、一块低功耗主板、几条内存。真正的重点在软件层。我的最终目标是这样一个“家用云底座”:

  • 一套长期稳定运行Linux系统,作为一切的地基;
  • 一个看得见摸得着的Web管理界面,能管用户、管存储、管共享;
  • 一个Docker运行环境,支撑各种应用容器;
  • 一套通用的访问入口,包括SMB/FTP等文件协议;
  • 一套备份与快照习惯,保证出问题时能快速回滚。

这五块加起来,才配得上“家用云底座”四个字。少任何一块,用起来都会觉得别扭:没有Web界面就只能天天敲命令行,没有容器环境就只能把应用硬装进系统,污染越来越大,最后崩到重装。

1.2 系统选型对比:为什么Linux加NAS系统组合最能打

网上类似项目常用方案主要有三类:直接装Windows、装一个纯Linux发行版、或者装一个NAS系统(如TrueNAS、群晖引导、飞牛OS fnOS)。我把它们放在一起对比过:

系统资源占用上手难度Docker支持Web管理适合场景
Windows Server高中一般有需要跑Windows专属软件的场景
Ubuntu Server低偏高好无熟练的Linux玩家
飞牛OS(fnOS)低低好完善家用NAS、新手自托管
Cachy OS(Arch衍生)低较高好可选性能优先的发烧友

我的选择很清楚:底层用Linux发行版,管理界面用飞牛OS。原因有三。第一,Linux的资源占用在退役小主机上太重要了,多出来几百MB内存留给容器更值。第二,飞牛OS这类系统的Web管理做得比传统发行版友好太多,用户管理、存储管理、共享设置都能点鼠标解决,对只想把服务跑起来的人来说,这是巨大的时间节省。第三,Docker兼容性没差别,容器本质上跑在同样的Linux内核上,上面是什么管理外壳其实不影响。

顺带说一句手机生态。小米澎湃OS、荣耀MagicOS这些是手机厂商做的系统,跟桌面/服务器OS完全是两条赛道。当年抱着一加7 Pro折腾氢OS、研究手机解锁玩机的热情,其实和现在逮着NAS系统折腾,是同一股劲儿。我见过有人拿“OpenHarmony是用什么语言写的”来对比桌面系统,其实没有可比性:OpenHarmony内核和底层框架以C/C++为主,上层应用框架大量用JavaScript/TypeScript和ArkTS,服务端Linux还是C和Linux系统调用那套老传统。真要研究操作系统本身,rCore-Tutorial-Book用Rust从零写内核的实验,倒是更能摸到门道。这个话题放到最后再说。

2. 不得不懂的底层细节:文件系统、内存交换与权限模型

不管你用哪个OS做底座,都会撞上三个底层概念:文件系统占满、内存交换、权限拒绝。这三件事我都踩了一遍,而且每一个都能写出一屏报错。先讲最让我头疼的overlay2。

2.1 overlay2空间越占越大?先学会算这笔账

装好飞牛OS后第一件事就是装Docker,可没跑两个星期,系统盘突然告警,查了一圈发现/var/lib/docker/overlay2占了绝大部分空间。这就是“飞牛OS overlay2文件占用大”这个搜索词背后最普遍的场景。

overlay2是Docker默认的存储驱动,原理可以理解成千层蛋糕:底层是一堆只读镜像层,最上面一层临时存放容器运行中产生的写入数据。问题是这堆“蛋糕渣”会越积越多——构建镜像时的临时层、反复拉取和更新留下的旧镜像层、删除容器后没回收干净的写层,全都堆在overlay2目录里。App拉取镜像时用了缓存,docker build时每执行一条RUN指令都会产生一个新层,次数多了存储自然失控。

排查思路从大到小:

  • 先看整体用量:du -sh /var/lib/docker/overlay2
  • 用docker system df看镜像、容器、卷各占多少
  • 用docker ps -a看有没有长期运行却没清理的旧容器

清理手段按顺序来:

  • docker container prune --filter "status=exited":清掉退出容器
  • docker image prune -a:注意会清掉没被任何容器引用的镜像,删前确认
  • docker system prune -a --volumes:这是一把双刃剑,匿名卷也会删,如果有数据库容器挂在匿名卷里,千万别乱用

更治本的办法是限制日志。很多容器默认把日志打到宿主机的/var/lib/docker/containers目录,一旦日志无限增长,系统盘照样爆。我现在的习惯是启动容器时直接限制日志大小。更普适的做法是在/etc/docker/daemon.json里统一配置:

{ "log-driver": "json-file", "log-opts": { "max-size": "50m", "max-file": "3" } }

改完重启Docker,再滚动清理一次旧容器。说白了,overlay2占空间不是玄学,是没做配额和回收。

2.2 小内存机器首选:Cachy OS默认开启的zram配置解析

内存交换是第二个坑。我家这台小主机内存只有8GB,跑NAS加两三个容器压力不小,动不动就swap到磁盘卡成PPT。后来研究Cachy OS的默认配置,发现它默认就启用了zram,这给了我启发。

zram简单说就是把一部分内存拿来做压缩交换设备:把不常用的内存页压缩后塞在一个内存块里,需要时再解压读回。比起传统swap,zram不用写磁盘,速度明显快很多,尤其适合内存紧张但不富裕的机器。Cachy OS作为性能向的Arch衍生版,默认装好后在/etc/systemd/zram-generator.conf里就能看到类似配置:

[zram0] zram-size = ram / 2 compression-algorithm = zstd

也就是把内存的一半拿去做压缩交换。我在飞牛OS的宿主机上也配了同样的方案。安装zram-generator工具后,在同一个配置文件里写入上述内容,然后执行systemctl daemon-reload并重启zram相关服务,即可在swapon --show里看到zram0。

注意一点:zram不能完全替代传统swap。当内存真的撑满需要大量腾挪时,zram本身也占内存,压缩操作也有CPU开销。所以正确的做法是“zram为主,传统swap兜底”,给磁盘swap留一个小分区或swap文件。配上这个方案后,8GB小内存跑容器总算没那么狼狈了。

2.3 os error 5拒之门外:一次解决权限报错的通用排查

第三个坑也是最抽象的:后台服务莫名报“error: 拒绝访问。(os error 5)”。第一次看到这个报错时,我第一反应是网络被拦了,查了半天才发现os error 5根本不是网络问题,而是操作系统的错误码5,对应的是“权限被拒绝”(EACCES)。这个词在系统编程里很常见,翻译成人话就是:当前进程想去读写某个文件或目录,但系统不允许。

典型场景有几个:

  • 服务以某个用户身份运行,用户对挂载盘没有写权限;
  • 目录挂载后被SELinux或AppArmor策略拦截;
  • FTP用户上传时目标目录的属主不是该用户;
  • 后台服务尝试在受保护目录(如/root或/etc)写入文件。

我那次报错正是FTP上传到挂载盘时出现的。排查过程列在这里:

  1. 先用whoami确认当前用户,再用id确认用户组;
  2. 用ls -ld看目录属主和权限,必要时用getfacl看ACL;
  3. 手动切换到这个用户尝试写文件来复现问题;
  4. 如果复现,看mount结果里目录的权限选项是否限制了写,例如ro就是只读;
  5. 如果文件系统没问题,检查SELinux布定期:getenforce和audit2why。

修复倒不复杂。最常见的是改属主或加用户组:

chown -R ftpuser:ftpusers /data/shared usermod -aG ftpusers ftpuser

或者,服务是用systemd管理的,在单元文件里指定User=和Group=,再配置ReadWritePaths=。核心思路一句话:报错告诉你“不能写”,你就要想清楚“是谁在写、往哪里写、有什么权限”。

3. 实操实录:从虚拟预演到物理机落地的完整部署流程

底层概念捋清了,下面把整条部署流程走一遍。我强烈建议第一次接触这类项目的人,别一上来就在物理机上刷机,先虚拟机预演。

3.1 先虚拟机预演还是直接刷机?我的部署顺序与理由

我这次选的是“虚拟机验证系统,再决定物理机刷机”。虚拟机的好处有三:一是系统装坏能秒回滚快照,不用U盘重刷;二是能提前确认引导方式、驱动、磁盘方案是否合理;三是不占额外硬件,用手里正在用的电脑也能跑。宿主机用Proxmox VE、VMware Workstation、VirtualBox都行,参数无非是CPU几核、内存给多少、磁盘给多大。我用的参考配置是4核CPU、8GB内存、64GB虚拟磁盘,网卡用virtio,这个配置跑飞牛OS加几个容器足够流畅了。

安装过程本身很常规:把飞牛OS的ISO挂到虚拟光驱,启动进安装界面,选择目标磁盘,等待写入和重启。这里最容易卡住的是网络识别,虚拟机的virtio网卡需要对应驱动,在Linux发行版里通常已经内置,Windows虚拟机才需要额外加载virtio-win驱动。如果你在虚拟机里发现网卡死活不通,多半就是这个原因。

另外,虚拟机里经常会出现一个和拖放有关的报错:“dnd: error: drag and drop to guest not possible”。这通常是因为虚拟机缺少Guest Tools或增强驱动。解决办法就是在虚拟机里挂载对应的工具镜像(open-vm-tools或virtio驱动包)安装一遍,装完重启拖放功能才能正常。这个错误和系统本身没关系。

3.2 我家云/OES Plus刷飞牛OS:旧硬件变成NAS的关键步骤

虚拟机验证完,就可以动手刷物理机。二手市场常见的“我家云”“OES Plus”这类设备,本质上是以前跑云存储或终端服务的小主机,芯片方案以Rockchip这类ARM为主。刷机步骤和手机刷机很像:需要进入刷机模式(掩膜ROM模式或Loader模式),然后用烧录工具把系统镜像写到Flash里。

具体固件略有差别,但大方向固定:

  1. 下载对应设备的固件和USB烧录工具;
  2. 断开硬盘,用短接或按键进入刷机模式,让电脑把设备识别为可编程设备;
  3. 载入镜像,点击烧录,等待进度条跑完;
  4. 接回硬盘,上电进入第一次启动,等待系统初始化完成。

这里有几个注意点。第一,刷机前尽量把原固件备份出来,万一刷坏还能救。第二,ARM主板对设备树很敏感,选错固件版本可能出现网卡不识别、存储挂不上、甚至启动黑屏,遇到这种情况先换固件再看硬件。第三,刷完后第一件事不是装应用,而是去看系统盘、日志、时间同步是否都正常,再进到Web界面里确认存储池状态。

3.3 网络唤醒配置:让家里的NAS随叫随到

这台机器当NAS用不可能永远开在桌边,我更希望它平时休眠,要用的时候随叫随到。于是第三个实践项是配置网络唤醒(Wake-on-LAN)。有人专门在搜“HP主机安装飞牛OS如何开启网络唤醒”,说明这块的坑确实不少。

网络唤醒的原理并不复杂:网卡在待机状态下仍然监听网络,收到一个魔术包(Magic Packet)后触发电源开机。要让它在你的机器上生效,需要三处都对齐:

  • BIOS:把Wake-on-LAN选项设为Enabled,部分HP主机还涉及高级电源管理(比如AC Recovery、ErP)。ErP模式开得越狠,待机功耗越低,但网卡剩余供电可能就不够,导致WOL失效;
  • 系统内网卡驱动:默认可能没开启WOL,用ethtool检查并设置:
ethtool enp3s0 ethtool -s enp3s0 wol g

但重启后设置会丢,推荐写一个systemd服务在开机时执行同样命令;

  • 网络侧:魔术包要从设备所在局域网发到目标网卡MAC地址,所以用手机App或脚本发送时,要么在同一个局域网,要么通过路由器的端口转发或远程管理入口把包送进来。

我在宿主上直接为网卡写了systemd服务,内容很简单:

[Unit] Description=Enable Wake-on-LAN [Service] Type=oneshot ExecStart=/usr/sbin/ethtool -s enp3s0 wol g [Install] WantedBy=multi-user.target

启用后执行systemctl enable wol.service。测试时找一个局域网里的工具发魔术包,看关机状态下的机器能不能起来。如果你的机器接着显示器,先按一下开机键确认能正常开机,再逐步排查WOL链路。

3.4 FTP服务与存储布局:EasyNVR也能稳定写入

存储这块,除了Web界面的SMB共享,我还需要FTP。原因很现实:家里有些老设备和监控录像机对SMB的兼容性参差不齐,FTP反而是最通用的。建FTP的第一步是装服务端,我用的是vsftpd,这是Linux下最老牌、最稳的FTP服务之一。

关键配置项如下:

anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 chroot_local_user=YES pasv_enable=YES pasv_min_port=30000 pasv_max_port=31000

关闭匿名访问,只允许本地用户登录,用户登录后锁定在自己的主目录里,被动模式的端口范围限定在30000到31000。注意两点:一是如果你开了防火墙,除了21端口,这段被动模式端口也要放行,否则客户端会卡在“正在连接”;二是chroot开启后,用户如果对主目录没有写权限,反而会在登录时报错,这又回到了前面权限的话题。所以主目录要么属主就是该用户,要么把共享目录挂载进去。

具体到我家的使用:飞牛OS里新建了一个media用户,主目录指向存储池里的媒体目录,把电影、监控录像目录统一放在里面。EasyNVR这类流媒体监控软件写入FTP目录时,只要目录可写、被动端口放行,基本不会出幺蛾子。装好后再用lftp验证一轮:

lftp media@nas-ip > put testfile.txt

上传成功,说明目录权限、网络端口、账号认证全通了。

顺便说一个特别基础但很多人容易踩的小常识:Windows习惯用反斜杠\作为路径分隔符,Linux和macOS用正斜杠/,网址URL里也统一用/。FTP客户端里写路径时一定要用/,否则服务端不认。这个小知识点不复杂,但确实能解释很多“路径找不到”的奇怪问题。

4. 常见问题排查实录与避坑速查

走到这一步,一台能用的“家用云底座”基本成型。但真正让我花时间最多的,反而是部署后那一堆报错。下面把这次折腾中遇到的典型故障汇总成表,方便以后直接对照。

4.1 高频报错对照速查表:一眼定位问题

报错/现象常见原因排查方向与示例
error: 拒绝访问。(os error 5)目录/文件权限不足(EACCES)检查运行用户、目录属主、SELinux;chown/chmod修复
dnd: error: drag and drop to guest not possible虚拟机未安装增强驱动(virtio驱动、open-vm-tools)虚拟机内挂载驱动ISO安装并重启
repomd.xml [errno -1]yum源不可达或证书异常curl -I检查源URL,更换可用镜像源
/var/lib/docker/overlay2占满容器日志、悬空镜像、孤儿卷docker system df统计,prune清理并限制日志
网络唤醒无效BIOS未开WOL、网卡没设置、魔术包没到、ErP限制ethtool查看wol,检查BIOS和ErP,同网段测试
刷机后网卡/存储不识别设备树或固件版本不对换与设备型号匹配的固件,核对刷机步骤
swap一直吃满卡顿内存不足,zram或swap配置不合理加zram、限制容器内存,调整传统swap大小

这张表是我这轮实操中真实遇到或高频看到的问题。遇到问题时先别慌,照着“常见原因”一列排查,大概率能省下半天。

4.2 折腾完这轮项目,我总结的几条“时间黑洞”经验

除了具体报错,这轮项目还让我记住几条通用经验,分享出来比列一百条命令都有用。

第一,数据目录和系统目录一定要分开。很多初学者习惯把Docker数据、下载文件全放在系统盘默认路径,结果overlay2一膨胀,系统盘先爆,连系统都进不去。我的做法是:装系统时单独划分一个大分区挂载为独立数据目录,把共享和容器数据都往那里放,系统盘保持纯净,出问题直接快照回滚。

第二,大动作前先做快照。在虚拟机或飞牛OS里给系统盘拍快照,成本极低,收益极高。我这次刷机前给虚拟机制作快照,刷完物理机即使翻车,也能立刻回到虚拟机里的可用状态继续排查。

第三,日志必须有限制。无论是Docker容器日志还是系统journald,默认配置都可能无限增长。容器日志按前面说的加max-size,系统日志则把SystemMaxUse限制一下,比如500M。看似不起眼的小事,能避免无数次“空间去哪了”的深夜排查。

第四,升级和折腾要分阶段。我就犯过一次,一次性改了一堆配置,然后系统起不来,根本不知道是哪一步改坏的。正确姿势是一次只改一个变量,改完验证一轮再动下一处。

第五,如果对OS本身感兴趣,可以顺着rCore-Tutorial-Book这样的实验去理解内核、系统调用、错误码这些概念。等你看过Rust写的内核实验,再回头看os error 5、权限模型这些报错,会有完全不一样的体会。

最后分享一个小习惯:每次改完配置,在备忘录里记一条“时间轴”,把哪一天改了哪些东西写清楚,不需要多正式,TXT就行。踩过几次坑之后,我越来越觉得家庭服务器这套东西,稳定比性能更重要,而稳定恰恰是靠这些不起眼的习惯堆出来的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询