systemd下tmp目錄千萬不能掛重要數據

cd /tmp

-------------------------------------------------------------------------

touch --date=1999-09-09 -a -m test_1999-09-09

修改系統時間爲1999年或者比今年更早幾年的時間

touch test_1999-09-09

stat test_1999-09-09 查看時間

-------------------------------------------------------------------------

同上方法創建另一個文件,僅修改 sudo chown root:root 新文件

運行 systemd-tmpfiles --clean



也有網友遇到類似問題 http://bbs.archlinuxcn.org/viewtopic.php?id=2765   [求解]ArchLinux莫名其妙導致數據丟失,損失嚴重。。。


以下是我回復的內容

[code]


我這兩天遇到類似的問題
debian testing + archlinux
第一次兩臺 archlinux掉數據很嚴重,連繫統都起不來了,有一臺連/sys, /proc 這些都不見了
重裝系統後,發現又出現,這次是把兩臺機器的debian的數據給搞掉了,分析了幾次都有個共同點就是全都掛在/tmp/下
/tmp/debian , /tmp/arch64
通過 sudo journalctl 查看日誌發現,今天兩臺電腦debian系統掉數據前都打印了以下的信息
systemd[1]: Starting Cleanup of Temporary Directories...
搜索了一下發現systemd-tmpfiles-clean.service 會去調用,另外/usr/lib/systemd/system/systemd-tmpfiles-clean.timer 會自動定時15分鐘去調用一次
記得一兩個月前有一次掛了windows 7的C盤到/tmp/下拷幾個文件,然後重啓後發現windows進不去了,當時重裝系統沒注意

可以sudo systemctl start systemd-tmpfiles-clean.service
sudo journalctl -b | grep "Starting Clean" 來查看日誌
目前還在驗證到底是不是由它引起的

[/code]





可以做個測試,我準備拿個u盤來測試,用上面的方法
一定要修改 atime, ctime, mtime, 目前修改ctime只有修改系統時間的辦法
tmpfile.c的代碼大致看了一下遇到s.st_uid==0的時候會跳過,所以像root屬主的文件是會被保留的
目前像用戶掛上去的u盤之類的,如果使用 pcmanfm-qt之類的自動掛載會被掛到 /run下面,/run其實也是個tmpfs不過創建的方式不一樣

 $ mount| grep runrun on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755)tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=800064k,mode=700,uid=1000,gid=1000)

像這種會被保護,查看/run下的目錄屬主基本上都是root





/etc/tmpfiles.d/tmpdir.conf 文件的內容

#Type Path        Mode UID  GID  Age Argument#d    /run/user   0755 root root 10d -#L    /tmp/foobar -    -    -    -   /dev/nulld /tmp/debian  0755 arch arch 10d -d /tmp/mmc  0755 arch arch 10d -d /tmp/iso  0755 arch arch 10d -d /tmp/arch64 0755 arch arch 10d -d /tmp/android  0755 arch arch 10d -

我的debian掛在 /tmp/debian目錄下




測試結果出來了
掛了一個u盤,文件是跟我debian分區的一樣都是ext4
修改系統時間,創建幾個文件時間是很早前的,用stat來確認所有的atime,mtime, ctime (ctime非常關鍵)
然後運行systemd-tmpfile --clean ,其實systemd-tmpfiles-clean.service 也就是被 那個timer定時去執行一下,默認是15分鐘執行一次
結果是我的u盤和我的debian掛載分區上的舊文件全部給幹掉,竟然把我故意在/tmp/debian目錄下創建屬主爲root的臨時文件也給幹掉了



通過代碼發現會去解析好幾個目錄下的配置文件,其中/etc/tmpfiles.d就是其中一個
測試發現跟/etc/tmpfiles.d/tmpdir.conf配置關係很大
我將/etc/tmpfiles.d/tmpdir.conf中的 /tmp/mmc目錄給註釋了,然後在u盤上創建很老的文件,掛在/tmp/mmc下,此時執行systemd-tmpfile --clean是不會清掉舊文件的
當將 d /tmp/mmc  0755 arch arch 10d - 開啓後,再運行清理時,文件就消失了

之前創建/etc/tmpfiles.d/tmpdir.conf 是圖個方便,開起自動創建tmp目錄,看來還得換回rc.local的舊方式才行 rc-locale.service


==============================

man tmpfiles.d 其實修改 Age參數爲 - 也不會自動清理

#Type Path        Mode UID  GID  Age Argument

 #d /tmp/mmc  0755 arch arch 10d -    把10d , 10天去掉換成 -

改成 d /tmp/mmc  0755 arch arch - - 

tmpfiles會根據Age去比較文件的時候,如果比它更早的文件則刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章