拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

银河麒麟V10源码编译SVN 1.8.14:依赖编译与配置避坑指南

银河麒麟V10源码编译SVN 1.8.14:依赖编译与配置避坑指南

简介:本资源面向在银河麒麟操作系统上部署版本控制服务的运维与开发人员,聚焦于从源码编译搭建完整SVN环境这一典型场景,帮助读者解决国产化平台下组件依赖复杂、配置项繁多的问题。压缩包内共1个docx文档,约202KB,以图文步骤形式记录操作要点,便于对照执行与查阅。内容涵盖apr、apr-util、SQLite与Subversion的下载编译安装,环境变量配置,版本库创建,以及svnserve.conf、passwd、authz三个核心文件的权限与用户配置,并延伸至服务启动、Windows客户端访问及开机自启脚本设置。目前已有2788人学习,适合需要快速落地SVN服务、排查配置错误的中级运维人员参考。

1. 银河麒麟装 SVN:为什么源码编译比 yum 更值得折腾

在银河麒麟 V10 上装 SVN,很多人第一反应是yum install subversion,但实际跑起来经常遇到版本对不上、依赖拉不全、离线环境直接卡死的情况。尤其是 ARM 架构的银河麒麟系统,官方源里的 SVN 版本往往停在 1.8 甚至更早,而项目上又要求用 1.8.14 这个特定版本做版本管理。这时候源码编译就成了绕不开的路。

这份资源给的就是一套完整的源码编译方案:从 apr、apr-util、sqlite 三个依赖开始,到 subversion-1.8.14 本体编译,再到版本库创建、svnserve.conf 三件套配置、开机自启脚本。整套流程在银河麒麟 V10 SP1 上验证过,适合需要在国产化环境里搭 SVN 服务端、又不想被包管理器版本绑架的运维和开发。下面按实际动手顺序拆开讲。

2. 依赖三件套:apr、apr-util、sqlite 的编译顺序不能乱

2.1 为什么 apr 必须第一个编

SVN 的底层网络通信和内存池管理全靠 APR(Apache Portable Runtime)。apr-util 又依赖 apr 的头文件和库,sqlite 则是 SVN 用来存版本库元数据的嵌入式数据库。这三个的编译顺序是硬性的:apr → apr-util → sqlite → subversion。顺序错了,configure 阶段就会报找不到 apr 的错。

下载地址在项目正文里给了 archive.apache.org 的归档链接,我一般会先把三个包传到/home/dmdba/svn/下统一解压。注意银河麒麟默认可能没装wget,离线环境直接用 U 盘或 scp 传。

# 切换到 root,避免后续 make install 权限不足 su - root # 进入工作目录 cd /home/dmdba/svn/ # 解压三个依赖包 tar -zxvf apr-1.6.5.tar.gz tar -zxvf apr-util-1.6.1.tar.gz unzip sqlite-amalgamation-3071501.zip

解压完先别急着编 sqlite,它不需要./configure,后面直接拷进 SVN 源码目录就行。

2.2 apr 和 apr-util 的 configure 参数

编译 apr 时--prefix指定安装路径,我习惯统一放到/usr/local/下,方便后面 SVN 的--with-apr直接指过去。

cd /home/dmdba/svn/apr-1.6.5 ./configure --prefix=/usr/local/apr make && make install

--prefix=/usr/local/apr这个参数决定了头文件去/usr/local/apr/include找,库文件去/usr/local/apr/lib找。如果这台机器之前装过系统自带的 apr,/usr/local/apr能避免和/usr/lib下的旧版本冲突。

apr-util 的 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写成了/usr/local/apr/带尾部斜杠,某些版本的 configure 脚本会拼出双斜杠路径导致检测失败。不带斜杠最稳。

2.3 sqlite 的特殊处理方式

sqlite-amalgamation 包解压出来是一个sqlite-amalgamation-3071501目录,里面就一个sqlite3.c和一个sqlite3.h。SVN 编译时需要的是把这个目录整个拷到 subversion 源码的sqlite-amalgamation子目录下,而不是单独编译安装 sqlite。

# 确认 sqlite 解压后的目录名 ls /home/dmdba/svn/sqlite-amalgamation-3071501/ # 应该看到 sqlite3.c 和 sqlite3.h # 等 subversion 解压后,把整个目录拷进去 # 这一步放到下一章 subversion 编译前做

常见做法是先把 subversion 源码解压好,再执行拷贝。如果先拷了但目录名不对,SVN 的 configure 会报cannot find sqlite3.c。

3. 编译 subversion-1.8.14:configure 参数与 sqlite 嵌入

3.1 解压与 sqlite 目录对接

subversion-1.8.14 的源码包解压后,根目录下没有sqlite-amalgamation文件夹,需要手动创建并把 sqlite 的源码放进去。

cd /home/dmdba/svn/ tar -zxvf subversion-1.8.14.tar.gz cd subversion-1.8.14 # 创建 sqlite-amalgamation 目录并拷贝源码 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/

注意目录名必须是sqlite-amalgamation,这是 SVN 的 configure 脚本硬编码查找的路径。拷完后ls sqlite-amalgamation/应该能看到两个文件。

3.2 configure 三参数与 make 编译

subversion 的 configure 需要同时指定 apr 和 apr-util 的路径:

./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/下。--with-apr和--with-apr-util分别指向前面编好的两个依赖。如果 configure 输出里看到checking for APR... yes和checking for APR-util... yes,说明依赖识别成功。

make 过程在 ARM 架构的银河麒麟上大概需要 3 到 5 分钟,具体看 CPU 核数。如果 make 报错sqlite3.c: No such file or directory,回头检查 3.1 的拷贝步骤。

3.3 环境变量与版本验证

装完后 svn 命令还不在 PATH 里,需要改/etc/profile:

vim /etc/profile # 在末尾加入: PATH=$PATH:/usr/local/svn/bin # 保存退出后使配置生效 source /etc/profile

验证安装结果:

svnserve --version

正常输出会显示svnserve, version 1.8.14。如果提示command not found,先确认/usr/local/svn/bin/svnserve文件存在,再检查 PATH 是否拼写正确。我一般会额外跑一句which svnserve确认实际调用的路径。

4. 版本库创建与 svnserve.conf 三件套配置

4.1 svnadmin create 与目录结构

版本库根目录选/home/svn/,项目名假设为project:

mkdir -p /home/svn/project svnadmin create /home/svn/project

执行完svnadmin create后,/home/svn/project/下会多出conf、db、hooks、locks、format、README.txt这些文件和目录。其中conf下就是需要改的三个配置文件:svnserve.conf、passwd、authz。

4.2 svnserve.conf 的顶格陷阱

svnserve.conf的配置项必须顶格写,行首不能有空格。这是最容易翻车的地方——用 vi 编辑时如果开了自动缩进,粘贴进去的配置前面会带空格,SVN 启动时直接报配置错误。

[general] anon-access = none auth-access = write password-db = passwd authz-db = authz

anon-access = none表示匿名用户无任何权限,auth-access = write表示认证用户可读写。password-db和authz-db分别指向同目录下的passwd和authz文件。

注意:vi 里用:set paste关闭自动缩进再粘贴,能避免顶格问题。

4.3 passwd 与 authz 的权限模型

passwd文件定义用户和密码:

[users] admin = 123456

authz文件定义群组和目录权限:

[groups] g_admin = admin [/] @g_admin = rw * =

[/]表示对版本库根目录的权限配置,@g_admin = rw给 g_admin 群组读写权限,* =表示其他所有用户无权限。这里* =后面留空就是拒绝,不要写成* = none,SVN 不认这个写法。

配置完三个文件后启动服务:

svnserve -d -r /home/svn

-d是守护进程模式,-r /home/svn指定版本库根目录。注意路径只到/home/svn,不要写到/home/svn/project,否则客户端访问时 URL 会多一层。

Windows 客户端访问地址格式:svn://服务器IP/project。比如svn://123.206.73.117/project。

5. 避坑排查:从配置报错到开机自启失效

5.1 svnserve.conf 首行留空导致启动失败

现象:svnserve -d -r /home/svn执行后无报错,但客户端连接提示Authentication error或直接拒绝。

原因:svnserve.conf的[general]段前有空白行,或者配置项行首有空格。SVN 解析配置文件时对首行和缩进敏感。

解决:用cat -A svnserve.conf查看,如果行首出现^I或空格,用:set paste重新编辑,确保[general]和所有配置项都顶格。

5.2 客户端能拉取但提交报权限不足

现象:svn checkout正常,svn commit提示Authorization failed。

原因:authz里[/]的权限写成了r而不是rw,或者用户不在g_admin群组里。

解决:检查authz中@g_admin = rw是否拼写正确,以及passwd里的用户名是否和authz的群组成员一致。改完不需要重启 svnserve,配置是每次请求时读取的。

5.3 开机自启脚本路径写相对路径

现象:重启银河麒麟后ps -ef | grep svnserve看不到进程。

原因:/root/svn.sh里写的是svnserve -d -r /home/svn,但开机时环境变量还没加载,找不到 svnserve 命令。

解决:脚本里用绝对路径/usr/local/svn/bin/svnserve -d -r /home/svn。用which svnserve确认绝对路径。

#!/bin/bash /usr/local/svn/bin/svnserve -d -r /home/svn

赋执行权限chmod 777 /root/svn.sh,然后在/etc/rc.d/rc.local末尾加/root/svn.sh。

5.4 make install 后 svn 命令找不到

现象:source /etc/profile后svn --version仍然提示command not found。

原因:PATH 拼写错误,或者/usr/local/svn/bin下确实没有可执行文件。

解决:先ls /usr/local/svn/bin/确认 svn、svnadmin、svnserve 是否存在。如果存在,检查/etc/profile里 PATH 那行有没有多余空格或拼写错误。实在不行直接在命令行export PATH=$PATH:/usr/local/svn/bin临时验证。

5.5 防火墙拦截 3690 端口

现象:服务端ps能看到 svnserve,但 Windows 客户端连接超时。

原因:银河麒麟默认防火墙没放行 SVN 的 3690 端口。

解决:firewall-cmd --add-port=3690/tcp --permanent然后firewall-cmd --reload。如果用的是 iptables,对应加一条 ACCEPT 规则。

6. 开机自启脚本的绝对路径写法与验证习惯

开机自启这块,我踩过最深的坑就是脚本里用了相对路径。当时在命令行手动执行/root/svn.sh一切正常,重启后就是起不来。后来bash -x /root/svn.sh跟了一遍才发现,开机时/etc/rc.d/rc.local的执行环境 PATH 极简,svnserve根本不在搜索路径里。

所以脚本里所有命令都写绝对路径,这是铁律:

#!/bin/bash # SVN 开机自启脚本 # 注意:所有命令必须用绝对路径,开机时环境变量未加载 /usr/local/svn/bin/svnserve -d -r /home/svn

写完脚本后,我一般会做三步验证:第一步chmod 777 /root/svn.sh确保可执行;第二步bash /root/svn.sh手动跑一遍确认不报错;第三步ps -ef | grep svnserve确认进程起来了。然后reboot重启,重启后再ps -ef | grep svnserve复查一次。只有重启后进程还在,才算真正验证通过。

还有一个细节:/etc/rc.d/rc.local文件本身在某些银河麒麟版本上默认没有执行权限,需要chmod +x /etc/rc.d/rc.local。如果加了脚本路径但重启后没生效,先检查这个文件的权限。

另外,如果后续要改版本库根目录或者加新项目,记得svnserve的-r参数指向的是根目录,新增项目只需要在/home/svn/下svnadmin create新目录,然后改authz加权限即可,不用重启服务。这个习惯让我在管理多个项目时省了不少事。

从那以后我每次配完 SVN 都强制走一遍「手动执行脚本 → 查进程 → 重启 → 再查进程」的流程,再也没出现过开机自启失效的问题。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表