背景

/var/opt/gitlab所在磁盘资源不足,现在希望将其无感迁移到**/data/opt/gitlab**

软链接方案

停止 GitLab 服务

1
sudo gitlab-ctl stop

迁移数据到新盘目录

1
2
sudo mkdir -p /data/opt/gitlab
sudo rsync -av --progress /var/opt/gitlab/ /data/opt/gitlab/

rsync 会保留文件权限和软链接,比 cp 安全。

rasync执行完后,使用diff指令确认下是否一致,如果不一致,则使用rsync继续进行迁移,直至无差异


备份原目录(以防回滚)

1
sudo mv /var/opt/gitlab /var/opt/gitlab.bak

建立软链接

1
sudo ln -s /data/opt/gitlab /var/opt/gitlab

权限检查

1
sudo chown -R git:git /data/opt/gitlab

GitLab 默认用户是 git,如果你有改过运行用户,替换成对应的用户名。


启动 GitLab

1
sudo gitlab-ctl start

验证

1
sudo gitlab-ctl status

确认服务正常,并检查网页是否可访问。


💡 注意事项

  • 差异可能是 缓存文件、日志、socket 文件 等(比如 tmp/log/hooks/ 下的文件)。

    这些文件通常不影响核心数据,可以忽略。

  • /data 要有足够权限和空间,并且最好挂载到一个稳定的磁盘上。

  • 成功运行一段时间后,可以删除 /var/opt/gitlab.bak 节省空间。


mount bind 挂载的方案

把 GitLab 数据迁到 /data/opt/gitlab,并挂载到 /var/opt/gitlab,这样系统层面和原目录完全一致,比软链接更稳定。

停止 GitLab 服务

1
sudo gitlab-ctl stop

创建新目录并迁移数据

1
2
sudo mkdir -p /data/opt/gitlab
sudo rsync -av --progress /var/opt/gitlab/ /data/opt/gitlab/

备份原目录

1
sudo mv /var/opt/gitlab /var/opt/gitlab.bak

创建挂载点目录

1
sudo mkdir -p /var/opt/gitlab

挂载(临时生效)

1
sudo mount --bind /data/opt/gitlab /var/opt/gitlab

设置开机自动挂载(永久生效)

编辑 /etc/fstab,在最后添加一行:

1
/data/opt/gitlab   /var/opt/gitlab   none   bind   0   0

保存后执行:

1
sudo mount -a

确保没有报错。


权限检查

1
sudo chown -R git:git /data/opt/gitlab

启动 GitLab

1
sudo gitlab-ctl start

验证

1
2
sudo gitlab-ctl status
mount | grep gitlab

确认挂载和服务都正常。


这样做完之后,**等一两周确认没问题再删除 /var/opt/gitlab.bak**,避免误操作导致数据丢失。

扩展:diff指令

基础指令

diff -r /var/opt/gitlab.bak /data/opt/gitlab

如果 两个目录完全一致,命令不会有任何输出。

如果有差异,会输出不同的文件路径和差异内容,例如:

1
2
Only in /var/opt/gitlab.bak: somefile.tmp
Files /var/opt/gitlab.bak/config/gitlab.rb and /data/opt/gitlab/config/gitlab

常用的几个变种

只比较文件列表(不比较内容):

1
diff -qr /var/opt/gitlab.bak /data/opt/gitlab

-q 表示只输出“是否不同”,不会显示具体内容。

如果你想更直观,可以用 rsync 做 dry-run 检查差异:

1
rsync -avnc /var/opt/gitlab.bak/ /data/opt/gitlab/

-n 表示只演示,不执行,能看到哪些文件不一致。