首页 / 资讯中心 / 文章详情

银河麒麟装SVN全指南:从基础安装到故障排查

银河麒麟装SVN全指南:从基础安装到故障排查 ★ FEATURED ARTICLE
简介面向银河麒麟等国产操作系统环境下的运维与开发人员这份实战指南系统整理了SVN服务器的完整搭建流程。文档从编译安装前置组件入手逐一给出apr、apr-util、SQLite与Subversion的源码下载、configure参数和make安装命令并说明了环境变量添加与生效方法可帮助读者避开常见的依赖与路径踩坑问题。包体为一个docx文档大小约202KB适合对照步骤边做边查已有2788人浏览学习。文档内容覆盖版本库创建、svnserve.conf/passwd/authz三个文件的权限配置、svnserve启动方式及开机自启脚本设置同时给出了客户端访问地址格式与常见配置错误提示例如svnserve.conf首行不能留空、用户名口令与权限分组写法等。整个文档按操作顺序分步书写重点标注了命令行与常用参数无论是初次接触编译安装还是需要为项目快速搭建SVN服务这份笔记都能提供完整参考有效减少试错时间。1. 银河麒麟装SVN从一次代码资产迁移说起某项目X在旧服务器上跑了三年的SVN仓库要整体迁到银河麒麟机器上。原以为yum install一把梭结果默认软件源里压根没这个包找到离线rpm又缺依赖好不容易装上svnserve.conf改了却一直不生效查了半天发现是行首多了个空格。这个标题要解决的就是这类“看着简单、做起来处处别扭”的部署工作在银河麒麟上把SVN客户端和服务端真正跑起来让团队能正常提交、能按权限拉取、断电重启后服务还能自动拉起。适合三类人要接管代码仓库的运维、需要本地提交历史的开发者、做旧仓库迁移的负责人。如果你正对着麒麟终端发呆不知道从哪敲第一行命令这篇文章就是你需要的路线图。2. 装SVN前先回答两个问题系统是什么形态源里有什么2.1 先看系统和软件源yum还是apt源里有没有subversion我拿到一台银河麒麟第一件事不是装包而是确认系统的口味。银河麒麟桌面版和服务器版的包管理器不一样有的镜像默认走yum有的走apt直接敲错命令会得到一堆误导报错。cat /etc/os-release uname -r uname -m if command -v yum /dev/null; then echo yum manager; fi if command -v apt /dev/null; then echo apt manager; fi yum search subversion 2/dev/null这段脚本的作用是先看发行版标识和版本号再确认内核和架构x86_64还是aarch64这决定你后面找的安装包平台最后探测可用的包管理器并直接搜索subversion。如果yum search有结果说明默认源里有包直接进入第3章如果没结果就要考虑挂载系统安装光盘作为本地源或用离线rpm包。常见做法是优先把默认软件源修通而不是一上来就去下载第三方包因为subversion依赖apr、apr-util、sqlite等一串库手工装rpm很容易陷入缺一个补一个的死循环。如果你和我一样不太想跟依赖较劲就把系统ISO挂载成本地仓库sudo mount /dev/cdrom /mnt sudo sh -c echo [local] namelocal baseurlfile:///mnt/Packages enabled1 gpgcheck0 /etc/yum.repos.d/local.repo sudo yum clean all yum makecache说明一下最后两行的参数baseurl指向光盘里的Packages目录gpgcheck0是跳过签名校验因为这是内网挂载的介质风险可控如果你们的镜像源放在HTTP服务器上把baseurl换成http地址就行。装完之后确认yum makecache有没有真正拉到索引没拉到就去看/etc/yum.repos.d/local.repo的路径是不是多写了一层Packages这个路径写错非常常见。2.2 先想清楚你只要客户端还是连服务端一起搭很多人搜这个关键词是冲着“能checkout代码”来的这其实只需要客户端如果把仓库也放在这台机器上才需要服务端。这两个场景的安装策略完全不同缺省装法虽然都能用但你会多维护一堆用不上的东西。我自己一般先按这个表判断使用场景需要装的组件对应命令连接到已有SVN服务器日常提交代码客户端svn服务器上新建仓库供多人访问服务端svnserve浏览器里看代码、走HTTP协议服务端加Apache模块httpd mod_dav_svn在银河麒麟上subversion这个包会同时带来svn和svnserve两个命令所以装一个包两端都齐了。真正的差别在服务端多了仓库初始化、配置文件和守护进程三块任务。另外注意麒麟系统上有时候bin目录里看不到svnserve别急着以为装坏了先运行/usr/bin/svnserve --version确认之后再排查PATH环境变量很多时候只是用户环境变量没更新而已。3. 在银河麒麟上装好SVN客户端最小命令与图形界面选择3.1 最小安装命令与第一次checkout如果默认软件源里有subversion客户端的最小安装就这么两行sudo yum install -y subversion svn --version第一行会把svn、svnserve以及依赖的apr库一起装好第二行用来确认安装路径和库版本输出里能看到svn版本、编译的SSL支持以及已启用的认证方式。有些机器上默认没改PATH/usr/bin/svn可能不在用户环境变量里先which svn看一眼找不到就用/usr/bin/svn --version这种情况多见于从源码编译安装的用户。安装完到用起来还差一次真实连接验证。拿一台服务器地址是192.0.2.10、仓库名proj-demo举例mkdir -p ~/work cd ~/work svn co svn://192.0.2.10/proj-demosvn co后面跟的URL格式是svn://主机名或IP/仓库名端口默认3690。命令成功后会提示版本号和checkout的目录。如果提示无法解析主机名把主机名改成IP再试提示连接被拒绝则多半是服务端没起或防火墙问题这个放到第5章讲。我建议第一次验证别用空仓库最好在服务端先建一个带目录结构的仓库checkout后能看到目录层级才算真正通了。这一步值得专门做一次线上很多“装好了”其实只是svn命令能敲出来真去拉代码就翻车。3.2 图形界面缺菜单怎么办不同客户端工具的出路银河麒麟的软件源里默认搜不到rapidsvn这类图形客户端是常态不少同事装完命令行svn后发现桌面右键菜单里没有任何SVN入口就以为失败了。其实图形界面和命令行是两个独立的程序菜单习惯由特定文件管理器插件提供默认源没打包这个插件装不上非常正常。我的建议是分情况处理。日常就是改改配置文件、提交下脚本用命令行svn就够不需要图形界面我用习惯了反而觉得命令行更快。新手或产品同学需要可视化对比版本常见做法是装rapidsvn如果yum search rapidsvn没结果就自己编译安装但这东西依赖wxWidgets编译一顿几小时我一般直接劝退。更省事的方案是用SVN命令行加diff工具或者让浏览器走HTTP视图前提是服务端搭了Apache。这里还有一个高频翻车点某些教程会叫你去修改桌面文件关联让右键菜单里多出“SVN Update”之类的动作。银河麒麟桌面版的文件管理器框架跟常规Linux发行版不同这个操作经常失效。别在菜单上花太多时间命令行能用业务就不卡。说到底图形界面只是锦上添花仓库能通、能提交、能回滚才是真正要紧的事。4. 银河麒麟上的SVN服务端仓库初始化、配置与systemd托管4.1 初始化仓库目录规划、svnadmin create与属主调整服务端的第一步不是启动进程而是先决定仓库放哪。常见做法是建一个独立的系统用户svnuser仓库统一放在/var/svn/repos下。这样svnserve进程不以root身份跑被攻击或误操作时影响面能控制住。sudo groupadd svn sudo useradd -r -g svn -d /var/svn -s /sbin/nologin svnuser sudo mkdir -p /var/svn/repos sudo svnadmin create /var/svn/repos/proj-demo sudo chown -R svnuser:svn /var/svn/repos/proj-demo sudo chmod 600 /var/svn/repos/proj-demo/conf/passwd这段脚本的要点在最后两行chown把仓库属主从root改成svnuser否则svnserve以svnuser身份启动后没有写权限chmod是为下一节做准备passwd文件里是明文账号密码权限太松等于把口令发给所有能登录这台机器的人。如果以后要新增仓库重复svnadmin create和chown两步就行。create之后先看一眼仓库结构/var/svn/repos/proj-demo下会有conf、db、hooks、format这些目录。format文件里是仓库格式版本号2表示FSFS较新的格式如果是旧的BDB格式建议迁移不过银河麒麟上svnadmin默认就是FSFS一般不用操心这个。4.2 配置svnserve.conf四个参数决定访问模型仓库的conf目录下有svnserve.conf、passwd、authz三个文件svnserve.conf是总闸。下面是一份单人维护也能直接用的配置重点是去掉了文件里的注释行[general] anon-access none auth-access write password-db passwd authz-db authz这四个参数的语义按表格记参数可选值说明anon-accessread / write / none匿名用户访问权限公网仓库按需放read内网一律noneauth-accessread / write / none认证用户权限开发仓库填writepassword-db文件名指定账号密码文件默认相对conf目录authz-db文件名指定路径级授权文件不配则所有登录用户对全部路径可写passwd文件的格式非常简单用户名后跟一个等号和口令admin 一个足够长的随机口令。个人的实验环境用明文口令问题不大如果对安全要求高SVN还支持SASL加密认证但银河麒麟上要装cyrus-sasl相关包并改配置小团队用不上我一般不引入这个复杂度。authz文件的作用是分目录收权示例如下[groups] dev user1,user2 [/] * r dev rw[groups]定义用户组[/]表示仓库根目录是所有用户dev是组引用。这里最容易理解错的是 r这个规则它表示未登录的匿名用户也能读如果你在svnserve.conf里已经写了anon-access none这里再给读权限并不冲突但为了内网数据安全我习惯直接把那行删掉只保留dev rw。改完配置文件之后记得确认文件里没有Windows换行符和行首空格否则SVN会静默忽略整行配置。4.3 用systemd托管svnserve开机自启与退出重拉银河麒麟基于Linux体系服务托管默认就是systemd。直接用svnserve -d启动属于临时方案机器重启就没了所以要写一个服务单元文件。用vim打开路径sudo vim /etc/systemd/system/svnserve.service内容如下[Unit] DescriptionSubversion server Afternetwork.target [Service] Typeforking Usersvnuser Groupsvn ExecStart/usr/bin/svnserve -d -r /var/svn/repos Restarton-failure RestartSec3 [Install] WantedBymulti-user.target随后执行sudo systemctl daemon-reload sudo systemctl enable --now svnserve systemctl status svnserve单独说明几个关键字段Typeforking表示svnserve启动后会把主进程转入后台符合它的守护进程模式-r /var/svn/repos是仓库根目录这个参数决定了客户端URL里只能写到根以下的仓库名写绝对路径反而会暴露系统目录结构Restarton-failure让进程非正常退出时自动拉起配合RestartSec3设置重启间隔。如果status卡在failed先journalctl -u svnserve -n 50看日志多半是仓库路径权限或配置文件语法问题少部分情况是进程已存在端口被占。5. 银河麒麟SVN踩坑指南五类高频故障的排查与修复5.1 svnserve.conf改了不生效行首空格让整行被静默忽略现象配置文件里把anon-access改成了none客户端依然能匿名读取。原因SVN的配置解析器对行首空白极其敏感行首多一个空格这一行就被当成无效配置跳过解析器还不报错悬得很。解决用cat -A svnserve.conf把行尾符号也显示出来排查是否有^MWindows换行符残留和行首空格有的话把格式统一。改完配置记得sudo systemctl restart svnserveSVN不会热加载配置文件不重启就是改了等于没改。这条是最容易让人挠头的我第一次遇到时排查了半个下午。5.2 启动报错缺依赖库svnserve: error while loading shared libraries: libapr-1.so.0现象svnserve装好后一执行就报找不到共享库客户端也连不上服务端。原因部分离线的rpm包安装时没有把apr、apr-util关联带上SVN的运行依赖没有落地。多见于从旧系统拷贝二进制文件或手工解包rpm的场景。解决ldd /usr/bin/svnserve看一下缺的具体是哪个库然后用yum install apr apr-util补齐。补齐后再ldd确认所有依赖都解析到了真实路径。最怕的是多个源混用导致链接到老版本库检查/usr/lib和/usr/lib64下有没有多套库文件有冲突时就要理清LD_LIBRARY_PATH指向哪个版本。装完之后从客户端再测一次握手确认不是只把库文件凑齐了但链路没通。5.3 提交时提示Cant get lock仓库像卡死一样现象所有客户端执行commit都报“repository is locked”但svnserve进程还活着看仓库目录也没人手动操作。原因非正常断电或kill -9进程导致仓库db目录里残留了未完成的事务锁文件。这也是SVN仓库用久之后的典型问题越老的仓库越容易出现。解决先svnadmin lstxns /var/svn/repos/proj-demo列出未完成事务确认全是旧事务后执行svnadmin recover /var/svn/repos/proj-demo让仓库自愈再svnadmin verify走一遍完整性检查。恢复期间要暂停所有客户端提交请求别一边recover一边有人写数据不然等于边修边制造新问题。如果recover之后还有报错把db目录下的锁文件手动清掉也可以但前提是你确认没有活跃事务正在跑。5.4 本机提交正常其他机器连不上3690端口现象在服务器本机svn co能成功别的机器一连接就报连接超时或拒绝。原因银河麒麟默认启用的firewalld把svnserve的3690/tcp挡在外面。本机能连是因为回环流量不走防火墙规则所以这个坑非常隐蔽服务端看起来一切正常远端就是进不来。解决放行端口并重载规则sudo firewall-cmd --permanent --add-port3690/tcp sudo firewall-cmd --reload端口放行后从客户端telnet 192.0.2.10 3690测一下能通就往下走。别一上来就关selinux这是惯常的粗暴做法放行端口已经能解决绝大多数问题。如果端口放行后仍然超时再去看云平台安全组或者机房防火墙有没有在下层拦截这层最容易忽略。5.5 迁移旧仓库后提交报错权限拒绝但root能写现象用tar把整个仓库从旧机器拷到麒麟环境svnserve启动正常一提交就报Permission denied但root手动写文件没问题。原因tar包保留了原机器uid旧机器上仓库属主是uid 501新环境svnuser的uid是别的值进程访问仓库文件时权限校验失败。这个问题在从其他Linux发行版迁移过来时特别常见因为各种发行版对系统用户的uid分配不一致。解决chown -R svnuser:svn /var/svn/repos/proj-demo重新归属再用svnadmin verify验证完整性。顺便对比db目录和hooks目录的文件属主这两个地方最容易残留不一致。迁移类的场景我建议拷完仓库后第一件事就是find /var/svn -not -user svnuser -ls看一遍把所有非属主文件全部一次性修正不要等报错再处理。6. 让SVN更顺手钩子脚本和HTTP访问怎么取舍6.1 用post-commit钩子做提交审计SVN的hooks目录下放了仓库生命周期脚本没启用的时候都是.tmpl后缀复制一份去掉后缀就能用。最常见也值得先做的是post-commit它会在每次提交完成后被调用。下面是一个把提交记录追加到审计日志的写法sudo vim /var/svn/repos/proj-demo/hooks/post-commit内容如下#!/bin/bash REPOS$1 REV$2 /usr/bin/svn log $REPOS -r $REV /var/log/svn/post-commit.log 21脚本里的$1是仓库路径$2是提交版本号svn log把该版本的提交说明追加写入审计日志。写完之后记得chmod x post-commit并确认属主是svnuser脚本没有执行权限会被静默丢弃。做之前先在命令行手跑一遍确认日志路径的父目录对svnuser有写权限不然这个钩子就是个摆设。同理如果你想拦特定操作pre-commit钩子可以在提交落库之前做校验比如禁止提交某个临时文件类型直接在脚本里加一段文件名匹配再exit 1就行。6.2 什么时候上mod_dav_svn什么时候继续用svnserve服务端不只有svnserve一条路还可以装在Apache里通过HTTP访问。这个选择不难做如果团队里有人需要在浏览器里直接浏览代码历史或者公司网络只放行80/443端口那就值得上mod_dav_svn如果只是小巧的命令行仓库继续用svnserve反而省心。我不建议主力仓库直接上Apache方案因为它把认证、权限、进程模型叠了三层排查链路太长银河麒麟的默认源里httpd相关模块也经常不全。但给小团队开一个只读的浏览器入口依然是个不错的补充。装好之后用http://服务器IP/svn/proj-demo访问配置时注意避免在Location根路径下写Require all granted宁可先拒绝后精确放行让权限收得紧一点。距离这个环境跑起来其实只差一次真实的迁移演练。我自己的习惯是停服务、复制仓库、在新机器verify完整再让一个同事从checkout开始走一遍验收流程。上次图快没做verify隔两天就摸出一个被截断的版本文件这种后悔药真的不想吃第二回所以在交付之前把这一步做成固定动作。按第4、5章的步骤走完希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站