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