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 信息有影響