ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

旧主机变身家用云底座:飞牛OS+Docker部署全记录与避坑指南

旧主机变身家用云底座:飞牛OS+Docker部署全记录与避坑指南 最近我把一台吃灰快一年的旧主机翻了出来给它起了一个不算严肃的项目代号——cloudflare-os。先说明白这个名字跟CDN服务商Cloudflare没有关系我只是想给手里这台小主机一个响亮的代号我希望它像名字里那个词一样稳不要动不动就出问题。它要在我家里扮演的角色也很简单一台24小时开机的家用云底座。底层跑Linux上面部署一个NAS系统负责存储和文件分享再用Docker挂几个容器把下载、监控存储、远程备份这些事全部收拢到一起。这篇博文就是这次折腾的完整记录从系统选型、虚拟机预演、物理机刷入飞牛OS到overlay2目录疯涨、os error 5权限报错、网络唤醒失效这些坑每一步是怎么想的、怎么排查的、最后怎么解决的都会写清楚。如果你手里正好有一台退役小主机、一块矿渣主板、甚至只是想在虚拟机里先体验一把NAS系统这篇值得你对照着操作。文章尽量不堆术语遇到绕不过去的概念我会用大白话拆开讲。1. cloudflare-os的整体设计把一台旧机器变成“家用云底座”1.1 为什么叫cloudflare-os一台“家用云底座”的目标拆解先说这个代号怎么来的。我把家庭自托管服务分成存储、应用、入口三层这三层经常各自为政——NAS归NASDocker容器归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玩家飞牛OSfnOS低低好完善家用NAS、新手自托管Cachy OSArch衍生低较高好可选性能优先的发烧友我的选择很清楚底层用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 statusexited清掉退出容器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简单说就是把一部分内存拿来做压缩交换设备把不常用的内存页压缩后塞在一个内存块里需要时再解压读回。比起传统swapzram不用写磁盘速度明显快很多尤其适合内存紧张但不富裕的机器。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上传到挂载盘时出现的。排查过程列在这里先用whoami确认当前用户再用id确认用户组用ls -ld看目录属主和权限必要时用getfacl看ACL手动切换到这个用户尝试写文件来复现问题如果复现看mount结果里目录的权限选项是否限制了写例如ro就是只读如果文件系统没问题检查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里。具体固件略有差别但大方向固定下载对应设备的固件和USB烧录工具断开硬盘用短接或按键进入刷机模式让电脑把设备识别为可编程设备载入镜像点击烧录等待进度条跑完接回硬盘上电进入第一次启动等待系统初始化完成。这里有几个注意点。第一刷机前尽量把原固件备份出来万一刷坏还能救。第二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] DescriptionEnable Wake-on-LAN [Service] Typeoneshot ExecStart/usr/sbin/ethtool -s enp3s0 wol g [Install] WantedBymulti-user.target启用后执行systemctl enable wol.service。测试时找一个局域网里的工具发魔术包看关机状态下的机器能不能起来。如果你的机器接着显示器先按一下开机键确认能正常开机再逐步排查WOL链路。3.4 FTP服务与存储布局EasyNVR也能稳定写入存储这块除了Web界面的SMB共享我还需要FTP。原因很现实家里有些老设备和监控录像机对SMB的兼容性参差不齐FTP反而是最通用的。建FTP的第一步是装服务端我用的是vsftpd这是Linux下最老牌、最稳的FTP服务之一。关键配置项如下anonymous_enableNO local_enableYES write_enableYES local_umask022 chroot_local_userYES pasv_enableYES pasv_min_port30000 pasv_max_port31000关闭匿名访问只允许本地用户登录用户登录后锁定在自己的主目录里被动模式的端口范围限定在30000到31000。注意两点一是如果你开了防火墙除了21端口这段被动模式端口也要放行否则客户端会卡在“正在连接”二是chroot开启后用户如果对主目录没有写权限反而会在登录时报错这又回到了前面权限的话题。所以主目录要么属主就是该用户要么把共享目录挂载进去。具体到我家的使用飞牛OS里新建了一个media用户主目录指向存储池里的媒体目录把电影、监控录像目录统一放在里面。EasyNVR这类流媒体监控软件写入FTP目录时只要目录可写、被动端口放行基本不会出幺蛾子。装好后再用lftp验证一轮lftp medianas-ip put testfile.txt上传成功说明目录权限、网络端口、账号认证全通了。顺便说一个特别基础但很多人容易踩的小常识Windows习惯用反斜杠\作为路径分隔符Linux和macOS用正斜杠/网址URL里也统一用/。FTP客户端里写路径时一定要用/否则服务端不认。这个小知识点不复杂但确实能解释很多“路径找不到”的奇怪问题。4. 常见问题排查实录与避坑速查走到这一步一台能用的“家用云底座”基本成型。但真正让我花时间最多的反而是部署后那一堆报错。下面把这次折腾中遇到的典型故障汇总成表方便以后直接对照。4.1 高频报错对照速查表一眼定位问题报错/现象常见原因排查方向与示例error: 拒绝访问。(os error 5)目录/文件权限不足EACCES检查运行用户、目录属主、SELinuxchown/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就行。踩过几次坑之后我越来越觉得家庭服务器这套东西稳定比性能更重要而稳定恰恰是靠这些不起眼的习惯堆出来的。
返回列表