KeyarchOS上afuse源码编译安装全流程:解决FUSE3兼容与自动挂载配置

发布时间:2026/10/3 14:11:31
KeyarchOS上afuse源码编译安装全流程:解决FUSE3兼容与自动挂载配置 1. 从需求说起为什么要在KeyarchOS上安装afuse先说下背景。KeyarchOS这个系统很多朋友可能已经接触过了它是一款面向服务器和数据中心场景的国产Linux发行版内核版本跟主流发行版保持同步基础的包管理、系统服务、网络配置这些跟RHEL系的习惯比较接近。正因为它是国产系统很多软件源里的包并不像Ubuntu、CentOS那么全尤其是像afuse这种相对小众的FUSE工具官方源里基本找不到现成的RPM包只能走源码编译这条路。afuse是什么它全称是Automatic FUSE Mount也就是FUSE文件系统的自动挂载工具。它的核心作用就是当你访问一个尚未挂载的目录时afuse会帮你自动触发挂载操作而不再需要手动执行mount命令或者等待开机脚本去挂载。举个最直观的例子我习惯把远程的NFS目录、SSHFS目录都配置成用户态挂载但是服务器重启之后这些目录全部丢失还得手动去挂有一次忘了挂载脚本跑了一半就报错。后来换成afuse我只需要访问那个路径它自己就挂上了这种体验对习惯了NAS、云存储、跨主机共享目录的人来说差别非常大。不过需要注意的是afuse的工作原理和传统的autofs内核级自动挂载不太一样。afuse完全运行在用户态基于FUSE实现它对你的挂载方式没有强约束支持NFS、SSHFS、S3FS、CIFS等几乎所有FUSE支持的文件系统类型也可以挂载本地目录。正因为它运行在用户态所以不需要修改/etc/fstab也不需要root权限去改内核配置普通用户在自己的家目录下就能实现自动挂载。这个特性在做开发环境、实验环境、个人工作站时特别实用。既然KeyarchOS的源里没有afuse那我当时就踩了一路的坑——从源码包下载、编译依赖、FUSE3兼容性、头文件缺失到最后的自动挂载配置问题一个接一个。这篇文章就把整个安装流程和排坑过程完整记录下来给同样在KeyarchOS或者其他国产Linux发行版上折腾afuse的朋友做个参考。2. 环境准备与依赖问题最容易被忽略的第一道坎2.1 KeyarchOS版本与内核确认安装之前先确认系统环境这一步虽然基础但能避免后面很多莫名其妙的问题。我当时是在一台Intel x86_64架构的物理机上操作的系统是KeyarchOS的服务器版本。可以用以下命令确认系统信息cat /etc/os-release uname -r uname -m gcc --version/etc/os-release会显示系统的名称和版本信息uname -r确认内核版本。afuse本身对内核版本要求不苛刻它依赖的是FUSE内核模块也就是说你的内核必须是支持FUSE的。好在KeyarchOS默认内核都带着FUSE模块这点跟标准内核保持一致。确认FUSE模块是否可用用这个命令ls -l /dev/fuse如果能看到/dev/fuse这个设备文件说明FUSE基本没问题。如果没有可能需要先加载模块modprobe fuse对于国产Linux发行版而言还有一点要注意部分系统为了安全考虑对设备节点的权限控制比较严格。如果你是以普通用户身份使用afuse需要确认自己有没有权限访问/dev/fuse最直接的方式是把自己加入到相应的用户组或者临时用root验证一下能不能正常工作。2.2 gcc、make、pkg-config等基础构建工具的安装afuse是C语言写的编译需要gcc和make而configure脚本还会依赖pkg-config来检查FUSE的库文件。这些工具如果系统里没有会直接在./configure阶段就报错而且报错信息很隐晦不是一个直接告诉你说缺依赖的提示而是告诉你某个头文件找不到、某个库文件找不到。所以建议先把基础构建链全部备齐yum install -y gcc make pkg-configKeyarchOS的软件包管理器跟RHEL系一样是yum/dnf。如果用的是较新版本可能dnf更通用不过yum这个命令一般也能用。安装完成后验证一下gcc --version make --version pkg-config --version2.3 FUSE头文件与库的兼容性问题重点中的重点afuse源码本身是好几年前写的它最早是为FUSE 2.x版本设计的。而现代Linux发行版包括KeyarchOS装的基本都是FUSE 3.x。FUSE 3对API做了不少调整最典型的就是fuse_main和fuse_argv这类函数的结构变了头文件的路径也不一样。源码编译时如果直接报错fuse.h找不到或者fuse_opt_parse未声明基本都是FUSE版本不匹配惹的祸。在KeyarchOS上需要显式安装FUSE的开发包yum install -y fuse fuse-devel安装完成后确认一下FUSE版本pkg-config --modversion fuse如果输出的是2.x那恭喜你后面会顺利一点。如果输出的是3.x那你需要调整编译参数或者考虑获取afuse针对FUSE3的补丁版本。我当时的环境输出是3.10也就是说afuse原来的源码直接编译大概率会失败。我还遇到过一个很隐蔽的问题KeyarchOS里fuse-devel安装的头文件路径是/usr/include/fuse3/而afuse的configure脚本默认去找/usr/include/fuse.h。这个路径不匹配直接导致./configure阶段就报错说找不到fuse库。解决办法是设置CFLAGS和LDFLAGS把include路径指过去这个我在后面的编译步骤里会详细写。3. 获取afuse源码与源码结构简析3.1 从哪下载、怎么验证afuse的源码包在GitHub上有官方仓库也打了不少release标签。我当时下载的是0.4.1版本的源码归档对应标题里的0.4.1-3里的0.4.1主版本。下载方式有两种一种是通过git直接克隆一种是下载打包好的tar.gz。wget https://github.com/mastax/afuse/archive/refs/tags/v0.4.1.tar.gz tar -zxvf afuse-0.4.1.tar.gz cd afuse-0.4.1如果你的网络访问GitHub不方便也可以找一些源码镜像站注意比对一下文件的sha256值和官方仓库里的校验值是否一致。源码包很小只有几十KB下载很快但是这不代表后续过程就轻松编译才是真正的考验。3.2 afuse源码的关键文件阅读指南拿到源码后先别急着编译我建议快速浏览一遍关键文件这样后面出问题时你知道去哪里改。afuse的源码目录很精简核心文件就几个src/afuse.c主程序入口解析命令行参数调用fuse_main进入事件循环。src/afuse_loop.c核心逻辑所在实现了目录递归扫描、挂载触发、后台进程管理等。src/afuse_op.cFUSE操作回调的实现比如getattr、readdir这些。configure.acautoconf的输入文件构建脚本的源头。如果你是打算绕过autotools直接手动编译那只要能搞定这三个源文件对应的依赖关系就行。我当时是没有改动源码只是调整了编译参数最后也编译通过了。如果你遇到FUSE3 API不兼容的报错可能需要小改一下源码比如把fuse_main(argec, argv, afuse_ops, NULL)改成fuse_main(argec, argv, afuse_ops, NULL)这类适配性改动。这类改动具体要看报错信息来定没有统一答案。4. 编译安装全流程configure、make、make install的完整命令与参数调整4.1 常规configure流程FUSE2环境适用如果你的系统pkg-config查到的FUSE版本是2.x那直接走标准流程就行./configure --prefix/usr make -j4 sudo make install--prefix/usr是为了让afuse的二进制安装到/usr/bin这不符合FHS其实/usr路径下也是合法的。也有人喜欢装在/usr/local如果你后面要打包RPM建议统一装到/usr这样打包时路径映射会简单一些。4.2 针对FUSE3环境的编译参数调整KeyarchOS实测在KeyarchOS上pkg-config查到的FUSE版本是3.x时直接configure会报错我当时看到的信息类似这样checking for FUSE... no configure: error: Package requirements (fuse 2.2) were not met: No package fuse found这里的fuse不是指系统没有FUSE而是pkg-config找不到名字叫fuse的.pc文件。FUSE3的.pc文件叫fuse3.pcafuse的configure只认fuse.pc。解法有几种我当时采用的是最直接的一种——写一个假的fuse.pc指向fuse3.pc不过后来发现更省事的办法是设置环境变量让pkg-config把fuse3.pc当fuse.pc使用当然这需要修改.pc文件的搜索路径export PKG_CONFIG_PATH/usr/lib64/pkgconfig export CFLAGS-I/usr/include/fuse3 export LIBS-lfuse3 ./configure --prefix/usr如果你照着这个做有可能还会遇到另外的坑-lfuse3这个库名在某些系统上不存在。实际上FUSE3的库文件在多数发行版里叫libfuse3.so链接器可以用-lfuse3找到。也有个别系统叫libfuse.so.3这种情况要改成-l:libfuse.so.3这种精确匹配的方式。设置完环境变量后重新configure再执行make实测是可以编译通过的。加个-j4并行编译速度很快整个编译过程不到一分钟就结束了。4.3 安装与安装后验证sudo make install which afuse afuse --help如果afuse --help能正常输出用法说明二进制没问题。此时再用ldd /usr/bin/afuse看一下动态库依赖确认它能找到libfuse3.soldd /usr/bin/afuse正常情况下应该能看到libfuse3.so.3之类的输出。如果显示not found说明动态库加载路径有问题检查一下/etc/ld.so.conf.d/下有没有fuse3的配置或者直接exportLD_LIBRARY_PATH。5. 编译过程中遇到的报错全集与根因分析这部分我觉得单独列出来详细记录整个过程中遇到的问题因为你会发现与其说是安装一个软件不如说是在驯服一个旧软件。afuse最后一次更新是很久以前跟现代系统的兼容问题不是一两个而是成系列的。5.1 error: fatal error: fuse.h: No such file or directory报错现场In file included from afuse.h:25, from afuse.c:26: afuse_loop.h:25:10: fatal error: fuse.h: No such file or directory根因FUSE3的头文件路径变了从/usr/include/fuse.hFUSE2变成了/usr/include/fuse3/fuse.hFUSE3而afuse源码里写的是#include fuse.h所以找不到。解法方案A把FUSE3头文件软链接到旧路径如ln -s /usr/include/fuse3/fuse.h /usr/include/fuse.h但不要忘了fuse3下面还有其它头文件最好是整个目录软链。方案B编译时加-I/usr/include/fuse3我用的就是这个。CFLAGS-I/usr/include/fuse3 ./configure --prefix/usr如果你软链了整个目录有一个好处是编译时的路径解析更省事但对系统来说不太干净。我个人偏向用CFLAGS的方式改的是编译参数不动系统的目录结构。5.2 error: unknown type name fuse_argv报错现场afuse.c: In function main: afuse.c:46:11: error: unknown type name fuse_argv根因FUSE3把fuse_argv这个类型挪了位置或者改了名字在FUSE2里它是全局可用的结构体FUSE3里变成了fuse_cmdline_opts等新结构直接使用旧类型名就编译不过。解法这个需要动源码。afuse的main函数里用fuse_argv的地方其实是用来做参数解析的在FUSE3下应该改成struct fuse_args args FUSE_ARGS_INIT(argc, argv);然后后续所有使用fuse_argv的地方替换成args。这个改动说起来简单但涉及的代码行数不少我当时改了之后就遇到了下一个报错。5.3 error: struct fuse_conn_info has no member named async_read报错现场afuse_op.c: In function afuse_fuse_init: afuse_op.c:32:15: error: struct fuse_conn_info has no member named async_read根因async_read是FUSE2时代的字段FUSE3里已经删除了。调用init回调时不再需要手动开启异步读FUSE3默认就支持。解法把init回调里关于async_read的赋值直接注释掉或者删掉。顺着这个思路你会发现FUSE2时代的好多操作在FUSE3里都变了比如readdir回调的参数数量、getattr的签名等。需要挨个编译验证。如果你改到这里说明你的进度已经推进到比较深的位置了。我当时一路改下来发现afuse对FUSE2的依赖比想象中深得多如果你的版本对应不上我建议找一下社区里已经适配FUSE3的afuse分支比如一些打包维护者的fork比自己从头改要快得多。6. afuse的基本用法命令行参数逐项拆解afuse装好之后重要的是会配置。它的命令行参数不多但每个都值得弄明白因为你配置错误时八成都是参数没配对。6.1 核心参数详解afuse的运行方式很有意思你指定一个挂载点目录afuse把自己挂上去然后你访问这个目录下的任何子路径时它会根据规则决定要不要触发挂载。规则就是两个参数-o mount_cmd和-o unmount_cmd。mount_cmd当访问一个不存在的子目录时afuse会调用这个命令来挂载它。unmount_cmd当子目录一段时间没用时afuse会调用这个命令来卸载它。举个最简单的例子我想让/mnt/auto_user这个目录下所有以用户名命名的子目录都自动挂载对应NAS上的用户主目录afuse -o mount_cmdmount -t nfs nas_server:/home/%r /mnt/auto_user/%r -o unmount_cmdumount /mnt/auto_user/%r /mnt/auto_user这里的%r是一个占位符代表你实际访问的路径。比如你访问/mnt/auto_user/alice那么%r就是alicemount_cmd就变成了mount -t nfs nas_server:/home/alice /mnt/auto_user/alice。还需要注意mount_cmd和unmount_cmd中的shell命令是在afuse进程的上下文里执行的不是独立的shell进程所以如果你要用管道、重定向、通配符需要额外包一层sh -c ...。别问我是怎么知道的配置不当的时候你会发现目录访问直接卡死没有任何副作用提示。6.2 常用组合SSHFS afuse我个人用的最多的组合是SSHFS afuse。这样我访问一个远端目录时不需要手动sshfs也不需要提前挂载只需要走进那个目录afuse -o mount_cmdsshfs -o allow_other,reconnect %rremote_host:/ /mnt/sshfs/%r -o unmount_cmdfusermount -u /mnt/sshfs/%r /mnt/sshfs访问/mnt/sshfs/project时afuse会执行sshfs projectremote_host:/ /mnt/sshfs/project。这样每台主机只需要一个目录登录终端的时候按需挂载体验非常好。不过这里有个前提SSH要配置了密钥登录否则自动挂载时会卡在密码输入交互上。6.3 参数说明表格一目了然对于命令行参数我建议重点记这几个参数作用常见取值-o mount_cmd触发挂载时执行的命令mount/sshfs/s3fs等-o unmount_cmd超时后卸载的命令umount/fusermount -u-o timeout空闲多少秒后卸载默认60单位秒-o auto_unmount进程退出时自动卸载--o fsname设置FUSE文件系统名任意字符串-d调试模式前台运行--f前台运行-timeout这个参数值得单独强调一下默认值是60秒意味着一个目录被挂载后如果60秒内没人访问afuse就会执行unmount_cmd把它卸掉。这个时间对于某些场景来说太短了比如你挂载了一个目录里面有个程序在后台慢慢遍历文件遍历到一半被卸载了程序瞬间报错。我当时就把timeout调到了600省掉很多麻烦。7. 在KeyarchOS上实现开机自启与systemd服务配置到了这一步afuse已经能手动运行了但服务器场景下面临的另一个问题是开机后不会自动启动。我之前就是吃了这个亏——重启之后忘了手动跑afuse结果一些依赖自动挂载的脚本全部失败。所以我的建议是直接把afuse配置成systemd服务一步到位。7.1 编写systemd unit文件新建一个service文件/etc/systemd/system/afuse.service内容如下[Unit] DescriptionAFUSE Auto Mount Daemon Afternetwork-online.target remote-fs.target Wantsnetwork-online.target [Service] Typesimple Userroot ExecStart/usr/bin/afuse -o mount_cmdmount -t nfs4 nas_server:/home/%r /mnt/auto/%r -o unmount_cmdumount /mnt/auto/%r -o timeout600 /mnt/auto Restarton-failure RestartSec5 [Install] WantedBymulti-user.target几个设计点说明一下Afternetwork-online.target确保网络就绪后再启动afuse否则网络盘挂载命令会立即失败。Typesimple表示afuse一直以前台方式运行不带-f参数时默认是后台daemon但systemd管理时最好让它前台运行所以ExecStart里其实应该加个-f参数才对或者把Type改成forking。这里我实际用的是Typeforking配合原来的daemon模式。两种方案各有利弊后续小节细说。Restarton-failure让进程崩溃时自动拉起。7.2 前台与后台的正确选择这里有个容易踩的细节afuse默认是fork到后台运行的。如果你在systemd里配置Typesimplesystemd会认为afuse进程已经退出因为前者fork完就返回了从而标记服务失败。两种正确做法在ExecStart命令里加-f参数让afuse前台运行配Typesimple不加-f但把Type改成forking并加PIDFile参数。我最终采用的是第一种简单直接systemd能精确追踪主进程的退出状态。配置如下ExecStart/usr/bin/afuse -f -o mount_cmd... -o unmount_cmd... /mnt/auto7.3 启动与验证systemctl daemon-reload systemctl enable afuse.service systemctl start afuse.service systemctl status afuse.service如果状态显示active(running)说明已经起来了。此时可以试着访问一个自动挂载目录比如ls /mnt/auto/testuser然后执行mount | grep afuse或者findmnt查看挂载情况。如果一切正常你会看/mnt/auto/testuser已经被真实挂载了。8. 常见故障排查与验证技巧前面说的是标准的安装路径现实中总会有些意外。这一节把几个高频故障集中整理一下供你对照排查。8.1 访问目录卡死不返回这大概是我遇到过的最致命的问题ls一个afuse管理的目录时命令卡住不动像死锁了一样。出现这个问题的原因通常是mount_cmd里的命令执行失败了但afuse还在等待它返回。挂载命令可能是网络不可达、权限不足、命令不存在等。解决方式是先确认挂载命令能否手动执行成功比如sudo mount -t nfs4 nas_server:/home/testuser /mnt/auto/testuser如果手动执行也失败那问题不在afuse在底层挂载。如果手动成功但afuse卡住那多半是afuse执行挂载命令的上下文与手动不同检查一下环境变量或者改成sh -c ...包一层。8.2 目录可以访问但无法写入访问目录正常读取列表也正常但创建文件时报Permission denied。这个问题的典型原因是FUSE挂载时的权限参数不对比如SSHFS挂载时没有-o allow_other导致非root用户无法写入。还有可能是挂载点目录的owner不对你访问的目录下面创建出的子目录owner是root当前用户没有写权限。解决方法是给mount_cmd加上对应的权限参数并检查一下挂载点目录本身有没有写入权限。8.3 开机自启动后afuse挂载失败系统重启后systemd服务正常启动了日志里能看到afuse在运行但实际访问挂载目录时一直失败。这个大概率是网络未就绪导致的挂载命令失败。开机阶段network-online.target虽然声明网络就绪但某些网络文件系统需要额外的等待时间比如NFS端口需要协商。解决办法是在systemd里加一个延迟启动或者在mount_cmd里加上重试逻辑mount_cmdfor i in 1 2 3 4 5; do mount -t nfs4 nas:/home/%r /mnt/auto/%r break; sleep 2; done这个方法比较粗暴但很有效。8.4 排查思路的优先级顺序如果你面对的是一个afuse不工作的综合问题我建议按这个顺序排查afuse --help验证二进制可执行。手动执行afuse前台模式加-d参数观察调试输出。手动执行mount_cmd里的原始命令确认底层挂载没问题。逐步缩小范围是不管访问哪个目录都失败还是只有某一个目录会失败。检查/var/log/messages或journalctl -u afuse中的日志。8.5 afuse调试模式我在排查问题时最喜欢用的是-d参数。它会进入debug模式在前台运行并输出大量FUSE层和afuse内部逻辑的日志。你访问目录时能看到afuse解析路径、匹配mount规则、执行外部命令的全过程基本能把问题定位到具体某一行逻辑。afuse -d -o mount_cmd... -o unmount_cmd... /mnt/auto9. 高级用法多挂载规则与脚本封装如果你已经成功让afuse跑起来了那恭喜你前面的折腾没有白费。接下来可以更进一步把它用得更顺手一些。9.1 同一个afuse进程内支持多套规则afuse本身只能设置一套mount_cmd和unmount_cmd如果需要不同类型的自动挂载比如一个目录挂NFS另一个目录挂SSHFS有两种做法开多个afuse进程各自绑定不同的挂载点。用shell脚本作为mount_cmd根据%r的内容分发到不同的挂载命令。第二种方式更优雅挂载点只有一个脚本内部根据访问路径动态选择挂载方式。比如写一个/usr/local/bin/afuse_mount.sh#!/bin/bash DIR$1 case $DIR in nfs-*) mount -t nfs4 nas_server:/home/${DIR#nfs-} /mnt/auto/$DIR ;; ssh-*) sshfs ${DIR#ssh-}remote_host:/ /mnt/auto/$DIR ;; *) echo Unsupported prefix 2 exit 1 ;; esacmount_cmd这样配置-o mount_cmd/usr/local/bin/afuse_mount.sh %r这个思路很好用等于把afuse变成了一个自动挂载分发器你要挂什么类型的文件系统都通过脚本去分发。同理也可以做unmount的分发脚本。9.2 用systemd的EnvironmentFile管理配置当你有多套afuse配置时我更建议把挂载规则抽出来放到一个配置文件中这样你不用每次改systemd unit文件再daemon-reload。做法是在service文件里指定EnvironmentFile[Service] EnvironmentFile/etc/afuse/afuse.env ExecStart/usr/bin/afuse -f -o mount_cmd$MOUNT_CMD -o unmount_cmd$UNMOUNT_CMD $MOUNTPOINT然后/etc/afuse/afuse.env文件里写入MOUNT_CMDmount -t nfs4 nas_server:/home/%r /mnt/auto/%r UNMOUNT_CMDumount /mnt/auto/%r MOUNTPOINT/mnt/auto这样以后调整挂载参数、挂载点、timeout时间只需要改env文件然后systemctl restart afuse。9.3 结合inotify实现更聪明的自动挂载还有一个小技巧afuse触发挂载的机制是访问时挂载也就是当你的程序或者shell进入一个目录时afuse会监听到VFS的访问请求然后才执行mount_cmd。这个机制在某些场景下很顺手但如果你希望目录被创建后立刻预挂载比如备份脚本要事先确保目录可用可以配合一个inotify监听脚本当察觉有新目录被mkdir时就去ls一下该目录触发afuse挂载。这个玩法就比较进阶了不过它能补齐afuse的按访问挂载模式的一个重要短板。10. 卸载流程与运维注意事项讲完了安装和配置最后说说卸载和日常维护。这件事看似简单但关键点在于顺序不能错。10.1 卸载afuse的完整顺序如果你确认不需要afuse了卸载时先停服务、再卸挂载、最后移除软件包systemctl stop afuse.service systemctl disable afuse.service rm /etc/systemd/system/afuse.service systemctl daemon-reload然后卸载所有由afuse自动挂载的目录注意此时如果你直接umount /mnt/auto会失败因为afuse进程还活着。正确顺序是先停服务再用fusermount -u /mnt/auto卸载afuse自己fusermount -u /mnt/auto最后清理源码目录和已安装的二进制rm -f /usr/bin/afuse rm -rf /usr/share/man/man1/afuse.1 rm -rf ~/afuse-0.4.110.2 日常运维的注意力重点几个日常运维建议都是我在实际使用中踩出来的日志监控afuse的日志主要集中在stderr和syslog配置systemd后日志统一到journalctl定时查一下有没有大面积的挂载失败。时间同步NFS这类文件系统对时间很敏感建议保持chronyd或ntpd正常运行。挂载点权限afuse运行用户必须是挂载点和目标目录都有权限的用户否则挂载成功但访问失败。文件系统类型差异不同的文件系统NFS、SSHFS、S3FS挂载参数差异很大更换后端时记得同步修改mount_cmd。10.3 与autofs的简单对比再回到最开始的话题为什么我敢说afuse在某些场景下比autofs更实用autofs是内核态自动挂载配置在/etc/auto.master里修改配置需要重启服务排错相对复杂。afuse是用户态工具配置灵活一条命令行就能搞定支持所有的FUSE类文件系统。afuse的缺点是没有autofs那么原生也没有内置的像Timeout、间接映射等复杂规则但胜在轻量、简单、灵活。如果你需要在KeyarchOS上做一个轻量级的自动挂载方案afuse确实是个值得折腾的选项。配置好之后它的便利性会让你觉得前面踩的那些坑都值了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询