首先,这个题目是不完全正确的,因为经过各种尝试,gitlab的仓库直接备份到远端,拷贝回来后是不能使用的!表现为gitlab中能看到项目,但每个项目的内容都无法读取出来,页面上会有报错提示。所以,最终采用的是实时备份gitlab的备份库!
最初的需求是,gitlab部署在centos7服务器上,然后nas网络存储在另一台windows服务器,因此想把gitlab的代码仓库同步到网络存储服务器上。
下面把本次的整个经过记录下来,以便有类似需求的朋友参考,以免走很多弯路。
最终的成功解决方案,在文章最后。
一、失败方案:挂载网络共享文件夹,让gitlab仓库直接使用这个文件夹
首先把这个贴出来,是想绝了大家的想法,这种方式压根行不通。原因容我细细道来。
在有将gitlab代码仓库实时同步到远端的需求时,第一想法就是:“能不能直接挂载nas网络存储位置到本地,然后让gitlab直接使用它?”。
1.使用winows服务器的文件夹共享
我在windows服务器(备份目的,ip:192.168.0.107,nas服务器,上面多块磁盘做了raid)上,启用了windows的文件夹共享功能,并创建了名为“gitlab”的用户,密码设置为123456。之后在比如F:\shared_repository共享文件夹上,设置gitlab账号的共享权限,把所有访问权限都打开。
然后在Cenos7(备份源,ip:192.168.0.105)上,使用mount命令挂载这个网络地址到本机的“/home/shared_repository”:
mount -t cifs -o username=gitlab,password=123456,uid=git,gid=git,dir_mode=0700,file_mode=0700 //192.168.0.107/shared_repository /home/shared_repository
映射后,测试了在Centos7的挂载目录“/home/shared_repository”中创建文件,对文件做增删改操作,实际上都是在windows服务器上对应的“shared_repository”文件夹中进行的。
这一步成功!
接下来,就是修改gitlab的配置文件,让它的仓库位置,使用这个挂载的网络位置:
vim /etc/gitlab/gitlab.rb
修改仓库路径:
#git_data_dirs({
"default" => {
"path" => "/home/shared_repository" #修改到我们挂载的路径
}
})
然后,根据gitlab的教程,需要重新配置一下:
gitlab-ctl reconfigure
这里会报错!提示在上面挂载的路径中创建的文件夹的权限不正确!
然后为了测试,我们手动在挂载的路径/home/shared_repository中创建文件1.txt,使用chmod修改他的权限,发现完全和普通路径中修改权限不一样!
比如,我们chmod 500 1.txt,期望得到:-r-x------的权限,但实际上修改后的权限为:-r-xr-xr-x。
再尝试chmod 400 1.txt,应该修改为:-r--------的权限,但实际上是:-r--r--r--。
结论是:无法正确的按照当前用户权限、组权限和其他用户权限,通过chmod给“挂载的路径中的文件、文件夹授权”!
而gitlab的仓库,会在仓库路径中,创建多个“不同用户权限、不同组权限、不同其他用户权限”的多个文件或文件夹。因此,上面reconfigure时就会报错!
从而,我们无法通过“修改gitlab仓库位置为挂载的网络路径”来实现同步gitlab的代码仓库!
2.更换备份目标服务器的文件系统为ext3
然后,我认为可能是因为“windows下的ntfs文件系统,无法存储文件的权限信息(在inode中)”。
所以,把windows服务器下的共享文件夹所在分区,整个格式化为“ext3”分区,然后通过安装驱动和软件,让windows服务器能够识别这个分区。
接下来,再在windows服务器上安装nfs服务器(hanewin),把共享目录export出来(已经设置umask=000,最大权限)。
然后在Centos7中挂载为“nfs”网络文件系统:
mount -t nfs 192.168.0.107:/shared_repository /home/shared_repository
然后,重复上面的配置gitlab仓库的步骤,发现依旧报错!依旧无法正确修改mount