尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
银河麒麟下SVN源码编译安装及配置实战指南
简介面向在银河麒麟操作系统中自建SVN版本控制服务的中高级运维人员与项目管理员这份资料以Word文档形式提供完整的源码安装流程。正文以subversion-1.8.14、apr-1.6.5、apr-util-1.6.1、sqlite-amalgamation-3071501的版本选择为起点先交代下载地址与解压方式再逐项说明configure编译参数、make install安装、/etc/profile环境变量写入、svnadmin create建库以及svnserve.conf、passwd、authz三文件的权限与口令配置文档同时给出版本库目录规划、服务启停等关键环节的校验方式便于分阶段排错。对易错环节也有专门提醒如配置首行不可留空、svnserve路径尽量写绝对地址、/root/svn.sh加入rc.local实现开机自启并附Windows客户端访问地址写法。包体为单个docx文件压缩包约202KB命令和配置示例均可直接对照使用。已有2788人学习下载适合希望通过一份文档快速完成银河麒麟SVN环境部署并减少排错时间的实操型读者。1. 银河麒麟上的SVN源码编译是绕不开的一条路在一台银河麒麟服务器上装SVN听起来就是yum install subversion一条命令的事但真正上手后会发现问题没那么简单默认软件源里的subversion版本老旧而且经常缺依赖更麻烦的是如果需要在内网环境离线部署或者要跟老版本客户端保持协议兼容官方源未必能满足需求。这种情况下源码编译安装就成了最可控的路径。这篇实战笔记面向的是需要在麒麟系统上自建SVN服务器的运维或开发我会把从下载源码、编译安装、初始化版本库到配置权限、设置开机自启的完整链路走一遍顺便把那些文档里不会写的坑一并交代了。2. 编译安装全流程apr、apr-util、Subversion 的依赖顺序与 configure 参数2.1 为什么必须手动编译 apr 和 apr-utilSubversion 从 1.7 开始就完全依赖 APRApache Portable Runtime库来处理文件系统操作和网络通信这套库它自己不带必须预先装好。在很多 Linux 发行版上可以用包管理器直接安装 apr 和 apr-util 的开发包但在银河麒麟这种环境下常见做法还是从源码编译因为这样可以把库装到自定义目录避免污染系统默认的 /usr/lib后续卸载也更简单。需要明确一个关键点apr 和 apr-util 是两个独立的源码包apr-util 依赖 apr 的安装结果所以编译顺序不能乱。整个链路的正确顺序是apr → apr-util → subversion。如果把顺序颠倒configure 阶段就会报错说找不到 apr。2.2 下载源码包版本选择与校验在开始编译之前先把所有需要的源码包下载到同一台机器上。这里以 subversion 1.8.14 为例这个版本在兼容性和稳定性之间比较均衡适合内网环境长期运行。# 在用户目录下创建统一的工作目录 mkdir -p /home/dmdba/svn cd /home/dmdba/svn # 下载 apr 和 apr-util以 1.6.5 / 1.6.1 为例 wget https://archive.apache.org/dist/apr/apr-1.6.5.tar.gz wget https://archive.apache.org/dist/apr/apr-util-1.6.1.tar.gz # 下载 subversion 1.8.14 wget http://archive.apache.org/dist/subversion/subversion-1.8.14.tar.gz # 下载 sqlite amalgamationsubversion 1.8 编译时需要 wget http://www.sqlite.org/sqlite-amalgamation-3071501.zip这里要注意 sqlite 这个包。subversion 1.8 的编译过程需要 SQLite 的 amalgamation 源码文件但它是用来编译进 subversion 内部的并不需要单独安装到系统里。下载完以后把 zip 解压等到 configure subversion 时直接用--with-sqlite参数指向解压目录里的sqlite3.c文件即可。2.3 编译安装 aprprefix 参数决定一切apr 的编译是三段式里最简单的一步但 prefix 的设定会影响后面 apr-util 和 subversion 的 configure 路径所以最好一次想清楚。这里把 apr 安装到/usr/local/apr与系统自带的任何 apr 分开。cd /home/dmdba/svn/apr-1.6.5 ./configure --prefix/usr/local/apr make make install这段命令的逻辑是--prefix/usr/local/apr指定 apr 安装的根目录所有头文件、库文件、可执行文件都会装到这个目录下。make负责把源码编译成二进制make install把编译产物复制到 prefix 指定位置。整个过程中如果出现make报错多半是系统缺少编译工具链先执行yum install gcc gcc-c make补上。2.4 编译安装 apr-util必须显式指定 apr 的路径apr-util 是 apr 的扩展库它本身不包含完整的 APR 功能而是提供数据库连接池、XML 解析等扩展能力。所以 configure 时必须通过--with-apr告诉它 apr 装在哪里。cd /home/dmdba/svn/apr-util-1.6.1 ./configure --prefix/usr/local/apr-util --with-apr/usr/local/apr make make install这一步最常见的翻车点是--with-apr路径写错。如果安装时赋给 apr 的 prefix 是/usr/local/apr但这里写成了/usrconfigure 就会在/usr/include下找不到apr_pools.h之类的头文件直接中断。另一个容易踩的坑是apr-util 在 configure 时还可能检查expat库——这是 XML 解析依赖在麒麟系统上通常已经默认安装如果没有需要先yum install expat-devel。2.5 编译安装 subversion--with-sqlite 是隐藏的关键参数subversion 的编译参数稍微多一点除了要指定 apr 和 apr-util 之外还必须给出 sqlite3.c 的路径。这里用到的 sqlite amalgamation 是单个 C 文件由其源码自动生成subversion 会把它编进自己的 FSFS 存储后端里。# 先解压 sqlite并记住解压目录 cd /home/dmdba/svn unzip sqlite-amalgamation-3071501.zip cd /home/dmdba/svn/subversion-1.8.14 ./configure \ --prefix/usr/local/svn \ --with-apr/usr/local/apr \ --with-apr-util/usr/local/apr-util \ --with-sqlite/home/dmdba/svn/sqlite-amalgamation-3071501/sqlite3.c make make installconfigure 的过程会比较长正常会输出一串 checking ... 的检查项。如果某一个依赖缺失configure 会在最后明确提示缺少什么常见的如APR not found、sqlite amalgamation not found按提示修复即可。编译完成后/usr/local/svn/bin下应该有svn、svnserve、svnadmin三个核心可执行文件。这里要专门提醒一句--with-sqlite指向的一定是sqlite3.c文件本身不是它的目录也不是sqlite3.h。很多人在这里写错configure 报Cannot find sqlite3.c之后才发现路径指错了。2.6 环境变量配置与安装验证编译安装完成后需要把/usr/local/svn/bin加进 PATH这样直接在命令行敲svn就能调起客户端工具不用每次带全路径。echo PATH$PATH:/usr/local/svn/bin /etc/profile source /etc/profile which svn svnserve --versionsource /etc/profile的作用是让当前 shell 立即读取最新的环境变量配置而不用重新登录。验证时先which svn确认 PATH 生效再用svnserve --version检查服务端程序是否正常。如果版本信息能正常打印说明编译安装这一步就算全部完成了。3. 建库与权限模型svnserve.conf、passwd、authz 三个文件的逐项配置3.1 版本库目录结构与 svnadmin create 的使用编译安装只是把 SVN 的服务端程序准备好真正要跑起来还需要创建版本库。SVN 本身不强制要求目录结构但这里采用一个统一根目录下放多个独立版本库的方式后续扩展和维护都更方便。mkdir -p /home/svn/project svnadmin create /home/svn/projectsvnadmin create会在 project 目录下生成一个完整的版本库骨架里面包括conf/配置文件目录、db/存储数据的目录、hooks/钩子脚本目录等。创建完成后检查一下 conf 目录里面有svnserve.conf、passwd、authz三个默认文件这是接下来要重点操作的三个文件。svnadmin是 SVN 的管理工具与svnserve服务进程和svn客户端是不同的组件。create子命令专门用于初始化新库日常维护还会用到svnadmin verify来校验库的完整性。3.2 svnserve.conf先认清 anon-access 与 auth-access 的差异svnserve.conf 是 SVN 服务端最核心的配置文件。这里有一个经常被误解的点anon-access是控制匿名用户权限的auth-access是控制已验证用户权限的两者独立生效。如果只想让匿名用户完全不可访问必须明确写anon-access none而不是留空或注释掉。[general] anon-access none auth-access write password-db passwd authz-db authz realm project使用 vi 编辑时很多人都会在这个文件上翻车原因在于 SVN 对格式要求比较严格。[general]组下面的每一项配置等号两边有没有空格都可以但配置项名称必须顶格写行首不能留空格更不能有不可见的 BOM 标记。realm是版本库的认证域名称会在客户端连接时显示帮助用户区分要连接的是哪个库建议设置成有辨识度的项目名。3.3 passwd用户名与密码的格式陷阱passwd 文件用来定义 SVN 用户和密码格式非常简洁但有一个细节容易被忽略密码支持明文也支持用{SHA}之类的方案做摘要存储但明文密码对格式更敏感行尾多一个空格都会导致认证失败。[users] admin 123456 dev_liu abc123这里定义了两个用户admin 和 dev_liu等号左边是用户名右边是密码。需要注意passwd 文件里的用户是 SVN 自己的用户体系与操作系统用户完全独立不需要跟系统用户一一对应。在实际项目里常见做法是给每个项目成员建一个独立账号而不是大家共用同一个这样在版本库历史里才能清晰区分操作者。另外passwd 文件的权限建议设置为 600仅所有者可读写不要图省事用 777。某些 SVN 版本对配置文件的权限有过检查权限过宽会导致服务启动时拒绝加载配置这一点在后面的避坑章节里会专门展开。3.4 authz路径级别的读写权限控制authz 是 SVN 的权限控制文件支持按用户、按组、按路径设置读写权限。它的概念模型相对简单但实际配置里容易写出冲突的规则。[groups] g_admin admin g_dev dev_liu [/] g_admin rw g_dev r * [/project] g_admin rw g_dev rw这段配置的含义是在[groups]段定义了 g_admin 和 g_dev 两个组[/]表示对版本库根目录设置权限g_admin 组有读写权限g_dev 组只有读权限* 表示其他任何用户都无权限。[/project]是对 project 目录单独授权——这里用(rw)给 g_dev 组开放了写权限实现根目录只读、特定目录可写的细分控制。* 这一行等于号后面是空的表示拒绝所有未明确授权的用户访问。如果不想做这个限制可以注释掉这一行但默认情况下建议保留避免匿名用户或新加用户意外获得根目录访问权。权限匹配的顺序是先匹配具体路径再回退到上级路径最后命中*规则。所以[/project]的规则会覆盖[/]下 g_dev 的只读权限实现更细粒度的控制。3.5 启动 svnserve-d 与 -r 参数的正确理解配置全部就绪后就可以启动服务了。svnserve 的启动参数有两个关键选项-d表示以守护进程方式在后台运行-r指定版本库的根目录。svnserve -d -r /home/svn启动后验证一下进程是否正常存在ps -ef | grep svnserve注意-r参数的路径只到/home/svn而不是具体的/home/svn/project。因为在-r模式下客户端访问的 URL 是svn://服务器IP/project路径中的project会被映射到根目录下的同名目录如果-r直接指定成/home/svn/project客户端 URL 就要写成svn://服务器IP/缺少项目名后面对多库管理很不方便。这里还有个容易混淆的点svnserve -d -r /home/svn启动后客户端访问的路径是相对根目录的。如果后来又建了一个新库/home/svn/other_project客户端直接访问svn://IP/other_project即可不需要重启 svnserve。4. 常见问题排查字符集、权限与配置文件的三类翻车现场4.1 svnserve.conf 首行留空格导致配置不生效使用 vi 编辑 svnserve.conf 时如果文件第一行不小心按了空格或 TabSVN 服务在读取配置时会报错svnserve.conf: 第1行: 选项期望一个字符串同时服务启动失败或读取不到后续配置。原因SVN 的配置解析器要求配置项必须顶格写行首空白字符会被当作非法前缀SVN 对格式的容忍度比 Linux 下其他 ini 配置低得多。解决把光标移到第一行行首连续按x删除空格然后:wq保存。如果文件已经带 BOM 头最稳妥的办法是:set nobomb去掉 BOM 再保存。4.2 编译时报 apr-util 找不到、APR 版本不匹配编译 subversion 时configure 报错/usr/local/apr/bin/apr-1-config: No such file or directory。原因最常见的是 apr-util 安装时--with-apr参数没有指向 apr 的 prefix 路径导致 apr-util 的 config 文件里记录的是一个无效路径。也有可能是 apr 编译时装到了/usr/local/apr但 subversion 的--with-apr-util参数写成了/usr/local/apr-util之外的其他目录。解决回到 apr-util 目录重新 configure确认--with-apr/usr/local/apr中的路径真实存在。如果还不放心直接检查/usr/local/apr/bin/apr-1-config文件是否存在确保它存在后再重新编译 subversion。这种情况我一般会建议把三个源码包全部删除重新编译因为 apr-util 的 config 文件里记录了编译时的绝对路径路径一旦错后续很难只靠参数修正。4.3 客户端连接超时但服务端进程正常svnserve 进程已经起来了ps -ef也能看到但客户端用svn://协议访问时提示连接超时。原因绝大多数情况是系统防火墙没有放行 TCP 3690 端口。银河麒麟默认使用 firewalld 管理防火墙规则svnserve 默认监听在 3690如果该端口未放行外部流量会被拦截。另一种可能是-r参数指向的根目录本身不存在导致服务端虽然启动但无法正确解析客户端请求路径。解决先确认监听端口执行netstat -tlnp | grep 3690查看进程是否正常绑定。然后添加防火墙例外规则firewall-cmd --permanent --add-port3690/tcp firewall-cmd --reload如果客户端与服务器在同一台机器上测试先绕过防火墙因素用svn://localhost/project连接能通就确定是端口放行的问题。遇到这种问题我一般会同时检查/etc/sysconfig/iptables如果系统用 iptables和 firewalld 两条线避免排查方向跑偏。5. 开机自启与 Windows 端验证脚本化部署的收尾细节5.1 自启脚本的绝对路径陷阱SVN 服务搭好后最怕的就是服务器重启后 svnserve 没起来项目成员开始报抱怨连不上。银河麒麟的开机自启沿用传统的 rc.local 机制但有个细节rc.local 的执行环境很干净不会加载登录 shell 的 PATH所以脚本里必须使用 svnserve 的绝对路径。#!/bin/bash # svn 自启动脚本 /usr/local/svn/bin/svnserve -d -r /home/svn把这个脚本保存为/root/svn.sh然后赋予执行权限并加入开机启动chmod x /root/svn.sh echo /root/svn.sh /etc/rc.d/rc.local chmod x /etc/rc.d/rc.local脚本里/usr/local/svn/bin/svnserve是绝对路径而不是直接用svnserve -d -r /home/svn原因前面说了rc.local 执行阶段环境变量未必包含/usr/local/svn/bin。查 svnserve 绝对路径可以先用which svnserve确认再把全路径写进脚本。另外/etc/rc.d/rc.local本身也需要可执行权限否则系统启动时不会执行它。5.2 重启后快速验证进程检查与端口探测重启服务器后很多人直接去看进程却发现ps -ef | grep svnserve输出一片空白于是判定自启失败。这里建议用两个步骤联合验证# 第一步检查进程是否存在 ps -ef | grep svnserve | grep -v grep # 第二步检查端口是否已监听 netstat -tlnp | grep 3690如果进程不存在但端口在监听说明服务可能以别的名字或方式启动如果进程和端口都不在先检查/etc/rc.d/rc.local的权限和脚本本身的执行权限再看脚本里有没有写绝对路径。实际操作中我发现很多自启失败不是因为脚本内容写错而是忘了给 rc.local 加执行权限。5.3 Windows 客户端访问与版本库状态检查从 Windows 客户端验证是最直观的收尾方式。TortoiseSVN 安装后在资源管理器里右键选择 SVN Checkout输入svn://服务器IP/project正常情况下会弹出认证窗口输入之前配置的 admin 账号密码就能连上。如果认证失败优先检查 passwd 文件里有没有多余空格或者密码被误改如果访问被拒绝看 authz 文件里用户的权限设置。服务器端还可以用一个快速命令检查版本库健康状态svnlook youngest /home/svn/projectsvnlook youngest会返回版本库中最新的版本号。如果返回 0 或空说明库是新建的但还没有任何提交如果返回错误说明库目录结构损坏要考虑svnadmin verify做完整性检查。在项目正式使用前我一般会先提交一个初始文件测试确认写入正常后再对外放行。其实整个链路跑通后你会发现最耗时间的往往不是编译本身而是三个配置文件里那些看不见的空格和权限问题。从那以后我每次搭 SVN 都会强制走一遍三件事编译后先svnserve --version验环境、配置后先svn://localhost本地测通、重启前先chmod x检查脚本权限。这套流程看起来多花了五分钟但省掉的是后面反复排查的半天。希望这份笔记能帮你少走这些弯路。本文还有配套的精品资源点击获取
RELATED

相关推荐

初创企业建站选型实测:BBWEYY、Codex+亚马逊AWS、比文云与Dreamweaver的低成本验证与上线速度对比(含TaoToken统一Key接入)

初创企业建站选型实测:BBWEYY、Codex+亚马逊AWS、比文云与Dreamweaver的低成本验证与上线速度对比(含TaoToken统一Key接入)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/12 11:33:35
AI日报制作全流程:从信息采集到深度解读的实操指南

AI日报制作全流程:从信息采集到深度解读的实操指南

1. 一份AI日报的诞生逻辑每天早上八点半,我会准时打开自己的信息聚合面板,把过去24小时里散落在各个角落的AI动态过一遍。这个习惯坚持了快两年,起因很简单——信息太碎了,碎到你刷一上午手机,可能只记住了三条真正有用…

📅 2026/10/12 11:33:35
ESP8266开关控制负载:GPIO驱动与安全隔离实战指南

ESP8266开关控制负载:GPIO驱动与安全隔离实战指南

1. 为什么“开关控制负载”是ESP8266入门真正的分水岭很多人把MicroPython ESP8266入门理解成“点亮LED”或“串口打印Hello World”,但真正跨过那道门槛的,从来不是语法,而是第一次亲手让一块芯片去驱动现实世界中的物理设备。开关控制负载—…

📅 2026/10/12 11:33:35
MORE NEWS

更多资讯

📰

Nginx双机主备高可用:Keepalived+VIP漂移实战与避坑指南

1. 为什么单台Nginx扛不住,双机主备到底在解决什么问题很多团队在项目初期都习惯把Nginx往一台机器上一装,配好反向代理和负载均衡就完事了。流量小的时候确实没问题,单机跑个几千QPS跟玩似的。但一旦业务上了规模,或者对可用性有…

📰

跨时钟域亚稳态详解:从D触发器原理到同步器设计与MTBF量化

先讲一个我调板时遇到的场景:某块主控板上的FPGA和外部ADC通过各自独立的晶振时钟工作,接口信号在逻辑分析仪上一切正常,仿真波形也干干净净,但设备连续跑了一天之后,系统偶尔会出现一次“莫名其妙”的寄存器跳变&…

📰

CAN与CAN-FD总线深度解析:从物理层到工程实战的硬实时通信之道

1. 为什么我说CAN总线是"沙子到车辙"系列里最扎实的一章"从沙子到车辙"这个系列写到第4章,前面几章我聊了芯片怎么从硅砂变成逻辑门、软件怎么从汇编跑成实时任务,但说实话,真正让我觉得"这玩意儿总算能跟机械硬碰硬…

📰

ARM Cortex-A9体系结构深度解析:工作状态、运行模式与存储格式

1. 从一颗芯片说起:为什么ARM Cortex-A9至今仍是嵌入式学习的绝佳样本如果你翻过任何一本讲嵌入式体系结构的教材,或者拆解过任何一款2010年前后的主流消费电子产品,大概率会跟ARM Cortex-A9这个名字打上照面。它不算新,甚至可以说…

📰

空中机器人入门:四旋翼原理与旋转矩阵学习笔记

直接写正文。两周刷完Aerial Robotics前两章,趁着热乎劲把课程笔记和作业里踩过的坑一起整理出来。这门课是空中机器人领域的入门基石,前两周的内容设计得很聚焦:第一周带你把四旋翼的机械结构和飞行原理吃透,第二周开始上数学工具…

📰

AI芯片软硬件协同设计实战:从指令集到编译器的全链路优化

1. 从一颗芯片的诞生说起:为什么软硬件必须一起设计一颗AI芯片从概念到量产,中间要经过架构设计、RTL实现、物理设计、流片、封装、驱动开发、编译器适配、框架对接等十几个大环节。很多刚入行的朋友会下意识地把这些环节分成两拨:硬件工程师…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬