核心是解耦数据与系统生命周期:需停服务、rsync同步、更新配置(datadir/socket/pid/log)、修复权限/selinux上下文、fstab按uuid挂载,最后验证启动与开机自启。

安全转移重要目录(如 /home、/var/lib/mysql、/var/lib/docker 等)到独立磁盘,核心不是“移动文件”,而是“解耦数据生命周期与系统生命周期”。只要路径变了、权限乱了、SELinux 拦了、服务找不到 socket 或 pid 文件,就可能启动失败甚至系统无法登录。下面按真实运维逻辑分步说明。
确认迁移必要性与目标路径
别一上来就复制。先执行三步诊断:
- 查当前目录实际使用:
df -h /home或SELECT @@datadir;(MySQL/MariaDB) - 确认瓶颈是否真实:根分区使用率 >90%?
lsof +L1 | grep mysql看是否有被删除但仍被进程占用的大文件(“幽灵占用”) - 验证目标磁盘可用性:
lsblk -f查设备名和文件系统类型;df -h /mnt/data确保挂载点已存在且空间充足
准备新分区并挂载到临时位置
避免直接操作正在使用的挂载点。推荐流程:
- 用
fdisk /dev/sdb创建主分区(如/dev/sdb1),再运行partprobe刷新内核识别 - 格式化为生产推荐的 XFS:
mkfs.xfs -f -n ftype=1 /dev/sdb1(ftype=1 支持 Docker overlay2 和 SELinux 扩展属性) - 创建临时挂载点:
mkdir /mnt/data-new,然后挂载:mount /dev/sdb1 /mnt/data-new - 若需 LVM 灵活性,可跳过 fdisk,直接用
pvcreate /dev/sdb; vgcreate vg_data /dev/sdb; lvcreate -l 100%FREE -n lv_home vg_data,再mkfs.xfs和挂载
停服务 + rsync 同步 + 校验
必须停止对应服务(systemctl stop mariadb、systemctl stop docker、图形界面用户需切到 tty2 登录),再操作:
- 用
rsync -av --delete-after --exclude='*.sock' --exclude='mysql.sock' /var/lib/mysql/ /mnt/data-new/mysql/(注意源路径末尾斜杠!) - 立刻做一致性校验:
rsync -av --checksum /var/lib/mysql/ /mnt/data-new/mysql/ - 对
/home这类多用户目录,建议在单用户模式(systemctl isolate rescue.target)下操作,避免用户进程锁文件
更新配置 + 修复权限与安全上下文
这是最容易出错的环节:
- 修改服务配置文件:MariaDB 要改
my.cnf中的datadir、socket、pid-file、log-error四项;Docker 改/etc/docker/daemon.json的data-root - 设对属主:
chown -R mysql:mysql /mnt/data-new/mysql(或docker:docker、root:rootfor /home) - 设对权限:
chmod 750 /mnt/data-new/mysql;父目录/mnt/data-new不能是 777,否则服务拒绝启动 - SELinux 必须处理:
semanage fcontext -a -t mysqld_db_t "/mnt/data-new/mysql(/.*)?",再restorecon -Rv /mnt/data-new/mysql - 最后更新
/etc/fstab:用UUID=xxx(查blkid)替代设备名,加defaults,xfs_nospace_ok(XFS 推荐)
切换挂载 + 验证 + 清理
不要直接卸载原挂载点。稳妥做法:
- 先卸载旧路径:
umount /home(若已挂载) - 把新分区挂到目标位置:
mount /dev/sdb1 /home - 手动启动服务测试:
systemctl start mariadb && mysql -S /mnt/data-new/mysql/mysql.sock -e "SELECT 1;" - 重启机器验证开机自动挂载和服务自启是否正常
- 确认无误后,再清理原位置残留:
rm -rf /var/lib/mysql/*(仅当它已不被挂载时)











