Linux 下 Inode 被 Vim 修改
问题来源
在本地开发项目的时候,docker 容器中运行的某个服务依赖外部宿主机挂载的配置文件 config.ini
,当我在宿主机上使用 vim
编辑文件之后,向容器中的进程发送信号 reload,进程日志中可以看见进程已经收到信号并进行了文件 reload
,但实际上外部配置的 config.ini
文件没有生效
排查
容器中的配置文件内容还是原来的,没有更新,所以即使重载了不会有任何变化。宿主机中的配置文件内容确实已经是最新。对比 inode 索引值发现两个文件的值不一样了。再次进行测试观察文件 inode 索引值的变化,发现使用 vim
修改后的 inode 值发生了变化,也就是说在 vim
执行 :wq
命令的时候,将原来文件的 inode 信息释放了,并修改了源文件的 inode 值
vim 修改 inode 的原因
经过排查后发现在 macOs 系统下使用 vim 修改文件不会有有 inode 变更的情况发生,怀疑这和 vim 版本的具体实现有关系
可以发现,在不同平台的 vim 版本下,修改文件时候 是否修改 inode
信息可能是有不同表现的(注意:这里我们都没有修改 vim 影响 inode 变更的相关配置)
LInux 下原生 Vim 修改 inode 的可能原因
- Vim 版本:7.4.1689
- 系统:Ubuntu 16.04
被修改的文件,只要 other 的权限中包含写 (w) 权限,vim 在保存时,将不会修改 inode 信息
实验步骤:
- 创建文件,other 没有写权限
- 使用 vim 修改并保存文件
ls -il xxx
观察 inode 索引值被修改- 执行
chmod o+w xxx
给文 other 添加写权限 - 再使用 vim 修改并保存文件
ls -il xxx
观察 inode 索引值不变
不同系统环境,不同版本的 Vim,以及不同的文件权限,都可能对 Vim 是否修改文件 inode 信息有影响