/etc/fstab,/etc/mtab,/proc/mounts的區別
現在的 Linux 系統裡一般都有這麼三個檔案:/etc/fstab,/etc/mtab,和 /proc/mounts,比較容易讓人迷惑。簡單解釋一下。
/etc/fstab 是隻讀不寫的,它提供的是系統上掛載裝置的靜態資訊,比如 mount -a 就會掛載 /etc/fstab 裡面指定的檔案系統。
/etc/mtab 是供 mount/umount 進行讀寫的,是相對動態的。讀的話,比如你在掛載一個檔案系統時缺少一個引數,它就會自動去/etc/mtab 或者 /etc/fstab 裡去查,如果找到的話,只要一個引數也夠。寫的話,比如你umount了一個檔案系統,umount 就會刪掉/etc/mtab 裡面的相關記錄。
看似上面的這兩個檔案已經夠用了,但是新的情況出現了。Linux 核心引入了一個 mount namespace,是給container用的。因為這個的出現,Linux 不得不引入 /proc/mounts。為什麼呢?因為記錄 mount 資訊的 /etc/mtab 是全域性的,也就是說,就算你的某個程序有自己的 namespace,但只要還和外面共享同一個 /etc/mtab,那麼,裡面進行umount/mount操作的資訊也會被記錄到/etc/mtab裡,外面也會看到!凌亂了!由此可見,我們不能有全域性的mtab,腫麼辦呢?/proc/mounts 出來了,有人可能覺得它也是全域性的啊!可你仔細看一下的話會發現,它其實是到 /proc/self/mounts 的一個符號連結!如此以來,container 裡面的 /proc/mounts 和外面的當然就不會一樣了!聰明啊!
所以,/etc/mtab 已經過時了,應該被拋棄,或者直接符號連結到/proc/mounts。同理,檢視系統上掛載的檔案系統的話,直接呼叫無引數的mount也是不妥的,因為那樣也是讀 /etc/mtab。我們應該使用 util-linux-ng 提供的一個新命令: findmnt,它是讀的 /proc/self/mountinfo。