使用的gitlab是用docker启动的,数据目录的owner/group信息被意外全部更改成了root:root导致服务不可用。最终通过复原文件所有者的方式恢复了服务。
步骤如下:
1. 打包备份gitlab所有的数据目录(我们的是/data/gitlab/data;/data/gitlab/config;/data/gitlab/logs),并清空目录下的所有文件;
2. 删除gitlab-ce容器,重新从docker镜像启动一个新的gitlab-ce容器,让它生成新的文件,以备后续修正使用。为了让gitlab生成所有需要的文件,启动后,在新服务中新建了user/group/progect等;
3. 获取gitlab数据目录下所有的文件及其owner/group信息,存到owner.txt中,脚本如下:
1 #!/bin/bash 2 function filedic(){ 3 for line in `ls -l $1` 4 do 5 filename=`echo $line| awk -F " " '{print $9}'` 6 if test -n "${filename}" 7 then 8 groupname=`echo $line | awk -F " " '{print $4}'` 9 ownername=`echo $line | awk -F " " '{print $3}'` 10 if [ -d $1"/"$filename ] 11 then 12 echo $1"/"$filename $groupname $ownername 13 filedic $1"/"$filename 14 else 15 echo $1"/"$filename $groupname $ownername 16 fi 17 18 fi 19 done 20 21 22 } 23 24 IFS=$'\n' 25 INIT_PATH="/data/gitlab"; 26 filedic $INIT_PATH
4. 停掉新服务,将新产生的gitlab的数据文件打包备份,并清空gitlab的数据文件(即/data/gitlab/data;/data/gitlab/config;/data/gitlab/logs下的所有文件,现在这些目录下的文件都是新容器产生的,我们要把它们删除,然后恢复成旧的数据文件)
5. 将第1步中备份的旧数据文件恢复到原目录中,其中logs文件可以删除
6. 比对owner.txt中的文件所有者信息,修改上一步恢复的数据文件;脚本如下:
1 #!/bin/bash 2 3 cat /data/gitlab/script/owner.txt| 4 while read line 5 do 6 echo $line 7 path=`echo $line| awk -F " " '{print $1}'` 8 groupname=`echo $line| awk -F " " '{print $2}'` 9 ownername=`echo $line| awk -F " " '{print $3}'` 10 if [ -d "$path" -o -f "$path" ] 11 then 12 echo $path $groupname $ownername 13 chown $ownername:$groupname $path 14 fi 15 done
其中还有一些postgresql的数据文件目录,需要统一全部修改,一般包括global/data及base目录。具体可以通过docker的启动日志查看,我是通过一遍一遍的启动才修改完全部文件的。。。。。。。。。。。
7. 经过多次启动,查看报错日志,修改数据文件所有者信息,最终服务启动成功。查看仓库---都在;测试提交---正常!!!
8. 提醒:不要自己作死。。。不要动gitlab的数据文件。。。多做备份