资讯动态

银河麒麟源码编译SVN 1.8.14:依赖链拆解与避坑指南

发布时间:2026/10/20 19:56:22 来源:尧图企业网站定制
简介本资源面向在银河麒麟操作系统上部署版本控制服务的运维与开发人员提供一套完整的SVN环境搭建方案解决国产化平台下Subversion编译安装与服务器配置的实际问题。压缩包内共1个docx文档约202KB以图文步骤形式记录从源码编译到服务启动的全过程。内容涵盖apr、apr-util、SQLite及Subversion 1.8.14的下载与编译安装环境变量配置版本库创建以及svnserve.conf、passwd、authz三个核心文件的权限与用户配置并附有Windows客户端访问地址格式与Linux开机自启脚本的编写方法。已有2797人学习下载适合需要快速在银河麒麟上落地SVN服务、对照排查配置错误的中高级用户参考。1. 银河麒麟装 SVN为什么源码编译比 yum 更值得折腾在银河麒麟这类国产化 ARM 或 x86 服务器上yum install subversion经常拉不到包或者拉到的版本老得连svnserve.conf的语法都跟文档对不上。我见过太多人卡在这一步最后放弃版本管理靠 U 盘拷代码。其实源码编译这条路虽然步骤多但每一步都可控——apr、apr-util、sqlite 的版本你自己定装到哪个 prefix 你自己定出了问题能定位到具体哪个.so没链上。这篇笔记拆的就是一套在银河麒麟上从零编译 Subversion 1.8.14 的完整流程包含依赖组件的编译顺序、svnserve.conf首行顶格的玄学坑、以及开机自启脚本里绝对路径的血泪经验。适合需要在离线或半离线环境里搭 SVN 服务、又不想被系统源绑架的运维和开发。2. 编译前的依赖链拆解apr、apr-util、sqlite 谁先谁后2.1 为什么 Subversion 1.8.14 必须绑这三个组件Subversion 本身不处理网络传输和内存池它把这两件事分别交给了 APRApache Portable Runtime和 APR-util。APR 提供跨平台的文件、网络、线程抽象APR-util 则在 APR 之上封装了数据库、XML、加密等工具。而 SQLite 是 Subversion 1.8 之后用来存工作副本元数据的默认后端——没有它svn checkout出来的.svn目录会直接报错。版本搭配上有个硬约束Subversion 1.8.14 的configure脚本会检查 APR 版本是否 ≥ 1.3APR-util 是否 ≥ 1.3。我选的是 apr-1.6.5 和 apr-util-1.6.1这两个版本在银河麒麟的 gcc 7.x 环境下编译通过率最高。SQLite 用的是sqlite-amalgamation-3071501也就是 3.7.15.1 的合并源码——Subversion 1.8 的构建系统期望在源码根目录下有个sqlite-amalgamation文件夹里面放sqlite3.c和sqlite3.h而不是让你单独装一个系统级 SQLite。提示不要试图用系统自带的libsqlite3-dev糊弄过去Subversion 1.8.14 的build-outputs.mk会硬编码去找sqlite-amalgamation/sqlite3.c找不到就报sqlite3.c not found。2.2 依赖组件的编译顺序与参数先把四个压缩包传到/home/dmdba/svn/下解压。注意sqlite-amalgamation是 zip 包解压后得到的是sqlite-amalgamation-3071501目录里面直接就是sqlite3.c和sqlite3.h。这个目录不需要单独configure make它只是给 Subversion 编译时当源码用的。apr 和 apr-util 必须按顺序编译因为 apr-util 的configure要指定--with-apr指向 apr 的安装路径。# 切换到 root避免后续安装到 /usr/local 时权限不足 su - # 编译 apr-1.6.5 cd /home/dmdba/svn/apr-1.6.5 ./configure --prefix/usr/local/apr make make install # 编译 apr-util-1.6.1显式指定 apr 路径 cd /home/dmdba/svn/apr-util-1.6.1 ./configure --prefix/usr/local/apr-util --with-apr/usr/local/apr make make install--prefix决定了make install把库文件和头文件放到哪里。我习惯把 apr 和 apr-util 分开装而不是都塞进/usr/local这样后面 Subversion 的configure能精确指向不会跟系统里可能存在的旧版本打架。--with-apr是 apr-util 特有的参数告诉它去哪找 apr 的apr-1-config脚本。编译完成后检查一下/usr/local/apr/lib下有没有libapr-1.so/usr/local/apr-util/lib下有没有libaprutil-1.so。如果这两个文件在依赖链的前两环就稳了。2.3 Subversion 源码目录里塞 sqlite 的正确姿势Subversion 1.8.14 解压后进入源码根目录你会看到一堆.c和.h。这时候需要把 sqlite 的合并源码复制进去cd /home/dmdba/svn/subversion-1.8.14 # 创建 sqlite-amalgamation 目录把 sqlite3.c 和 sqlite3.h 拷进去 mkdir sqlite-amalgamation cp /home/dmdba/svn/sqlite-amalgamation-3071501/sqlite3.c sqlite-amalgamation/ cp /home/dmdba/svn/sqlite-amalgamation-3071501/sqlite3.h sqlite-amalgamation/这一步是 Subversion 1.8 构建系统的硬性要求。目录名必须是sqlite-amalgamation不能改成sqlite或sqlite3。拷贝完成后再跑configure./configure --prefix/usr/local/svn \ --with-apr/usr/local/apr \ --with-apr-util/usr/local/apr-util make make install--prefix/usr/local/svn把svn、svnadmin、svnserve这些可执行文件统一放到/usr/local/svn/bin下跟系统自带的/usr/bin/svn隔离。make的过程大概三到五分钟如果报sqlite3.c: No such file or directory回头检查sqlite-amalgamation目录名和文件位置。3. 环境变量与版本库初始化从 svnserve –version 到 svnadmin create3.1 环境变量写 /etc/profile 还是 /etc/profile.d编译安装完svnserve命令还不在 PATH 里。直接敲svnserve --version会提示command not found。常见做法是改/etc/profile在末尾追加vim /etc/profile # 在文件末尾加入 PATH$PATH:/usr/local/svn/bin # 保存退出后立即生效 source /etc/profile但这里有个细节/etc/profile是登录 shell 才会读的如果你用su -切 root 没问题但用su不带-就不会加载。更稳妥的做法是在/etc/profile.d/下新建一个svn.sh内容一样这样所有登录 shell 都会自动 source。不过原文用的是/etc/profile我照做也没出过问题只是每次改完记得source一下。验证安装svnserve --version如果输出里能看到svnserve, version 1.8.14说明二进制和动态库链接都正常。如果报error while loading shared libraries: libapr-1.so.0说明/usr/local/apr/lib不在ld.so.conf里需要追加一行并ldconfig。3.2 svnadmin create 之后目录里多了什么版本库根目录我选的是/home/svn/项目名假设为projectmkdir -p /home/svn/project svnadmin create /home/svn/projectsvnadmin create执行完/home/svn/project下会多出conf、db、hooks、locks、format、README.txt这几个条目。其中conf目录是配置核心db是版本数据存储hooks里放钩子脚本模板。很多人第一次看到db目录里一堆rev和revprops文件会懵其实那是 Berkeley DB 或 FSFS 的存储格式Subversion 1.8 默认用 FSFS比 BDB 更稳不容易因为进程崩溃而锁库。注意svnadmin create的路径必须是空目录或不存在目录。如果/home/svn/project下已经有文件命令会报svnadmin: E000002: Cant create repository at /home/svn/project, directory already exists and is not empty。3.3 三个配置文件的联动关系conf目录下的svnserve.conf、passwd、authz是联动的。svnserve.conf决定用哪个密码文件和权限文件passwd存用户名密码authz存路径级权限。先改svnserve.conf[general] anon-access none auth-access write password-db passwd authz-db authz这里有个被无数人踩过的坑[general]这一行必须顶格写前面不能有空格。如果[general]前面多了一个空格svnserve启动时会报svnserve: E000022: Error parsing config file而且报错信息不会告诉你具体哪一行有问题只说是配置文件解析错误。我当初在这卡了半小时最后用cat -A svnserve.conf才看到行首有个^I。再改passwd[users] admin 123456admin是用户名123456是密码。生产环境当然要换强密码但测试阶段先用简单的确认链路通不通。最后改authz[groups] g_admin admin [/] g_admin rw * [/]表示版本库根目录g_admin rw给g_admin组读写权限* 表示其他所有用户无任何权限。注意* 后面是空的不是* r或* 加空格空值就是拒绝。三个文件改完启动服务svnserve -d -r /home/svn-d是守护进程模式-r指定版本库根目录。这里路径只到/home/svn不要写成/home/svn/project否则客户端访问时 URL 会变成svn://ip/project/project。4. 避坑排查svnserve 启动失败、权限报错、客户端连不上的五种情况4.1 现象svnserve 启动后 ps 查不到进程原因svnserve -d -r /home/svn执行时如果/home/svn路径不存在或没有读权限进程会静默退出终端不报错。另一种可能是端口 3690 被占用。解决先ls -ld /home/svn确认目录存在且 root 可读再用ss -tlnp | grep 3690查端口。如果端口被占kill掉旧进程或换端口svnserve -d -r /home/svn --listen-port 3691。4.2 现象客户端 checkout 报 E170001 认证失败原因svnserve.conf里anon-access none和auth-access write没配对或者password-db指向的文件名写错。常见的是把password-db passwd写成了password-db passwrd。解决逐行核对svnserve.conf的四个参数确认passwd和authz文件名跟conf目录下实际文件一致。改完必须重启svnserve它不会热加载配置。4.3 现象authz 里配了 rw 但客户端只能读不能写原因authz的[/]只对根目录生效如果项目实际路径是/home/svn/project而客户端访问的是svn://ip/project那[/]对应的就是project这一层。但如果svnserve.conf里authz-db没启用所有权限配置都不生效。解决确认svnserve.conf里authz-db authz前面没有#注释。另外g_admin rw的rw必须小写RW或r w都会被解析成无效权限。4.4 现象开机自启脚本不执行原因/etc/rc.d/rc.local在某些银河麒麟版本里默认没有执行权限或者脚本里svnserve用了相对路径启动时环境变量还没加载。解决chmod x /etc/rc.d/rc.local并且脚本里写绝对路径/usr/local/svn/bin/svnserve -d -r /home/svn。用which svnserve确认绝对路径不要凭记忆写。4.5 现象Windows 客户端能连但 Linux 客户端报 SSL 错误原因svn://协议本身不加密不存在 SSL 错误。如果报 SSL 相关错误说明客户端把 URL 写成了https://或svnssh://。解决确认 URL 格式为svn://服务器IP/project不要加https。如果确实需要加密那是另一个话题不在本次源码编译范围内。5. 开机自启与版本验证一个脚本加一条命令的收尾技巧开机自启这件事原文给的是在/root下建svn.sh然后塞进rc.local。我照做之后发现一个隐患rc.local的执行时机在网络服务之前如果svnserve启动时网络还没就绪虽然进程在但客户端连不上。后来我改成用systemd单元但银河麒麟某些版本对自定义 unit 支持不完整所以最稳的还是rc.local加一个sleep 3。脚本内容如下#!/bin/bash # /root/svn.sh sleep 3 /usr/local/svn/bin/svnserve -d -r /home/svnsleep 3是给网络栈留初始化时间。chmod 777 svn.sh其实给大了chmod x就够但原文用 777 我也没改反正 root 目录下别人也进不来。然后编辑/etc/rc.d/rc.local在末尾加一行/root/svn.sh。重启后验证ps -ef | grep svnserve如果看到svnserve -d -r /home/svn的进程说明自启成功。再跑一次svnserve --version确认环境变量在重启后依然有效。版本验证还有一个技巧用svnadmin --version看它链接的 APR 和 SQLite 版本。输出里会显示- with APR 1.6.5和- with SQLite 3.7.15.1如果这两个版本跟你编译时的一致说明整个依赖链没有串到系统旧库。从那以后我每次在银河麒麟上编译完 SVN都会强制走一遍svnadmin --version加ps -ef | grep svnserve加客户端svn list三连确认二进制、进程、权限三层都通。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑