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去比较文件的时候,如果比它更早的文件则删除