Изменение даты доступа, изменения и изменения файла к той же прошлой дате

Для полезности, которую я разрабатываю, было бы целесообразно, если бы я мог установить все три именованные даты, связанные с файлами в какой-либо директории, на какую-то дату в прошлом.

Я знаю, что я могу использовать touch для установки дат доступа и изменения, но мне нужно, чтобы все три были одинаковыми (использовались как контрольная точка / дата).

Есть ли способ, которым я могу это сделать (root-access ok)

Редактировать:

  1. Я нашел это: http://blog.commandlinekungfu.com/2010/02/episode-80-time-bandits.html, который предлагает (только для ext2 / 3/4):

    # debugfs -w -R 'set_inode_field / pathtofile ctime 200901010101' filedevice

где «200901010101» является образцом даты-времени; и этот https://stackoverflow.com/a/5518031/15161, чтобы найти «filedevice», о котором говорилось выше:

 df /pathtofile | awk 'NR == 2 {print $1}' 

Я пробовал это в тестовом файле, но вызов debugfs занял слишком много времени, и я нажал Ctrl-C'd. (Так что я действительно не знаю, будет ли это работать …)

  1. Другая идея, возможно, заключается в использовании виртуальной машины с системной датой, установленной на прошлую дату, которую я хочу, но я не знаю, как это установить.

  2. Это относится к (2), но не использует виртуальную машину, с http://www.shellhacks.com/en/Faking-a-Files-Access-Modify-and-Change-TimeStamps-in-Linux :

В качестве возможного временного решения вы можете установить системное время на время, которое вы хотите наложить, затем коснитесь файла и затем восстановите системное время.

 NOW=$(date) && date -s "2030-08-15 21:30:11" && touch file.txt && date -s "$NOW" 

но я не уверен, насколько это безопасно / рискованно.

Вы не можете изменить ctime без «обмана», и для этого требуется root. См. Как изменить дату изменения файла?

Поскольку вы проводите тестирование, я бы пошел с подходом VM. Запустите программу на виртуальной машине. Вы можете установить системную дату внутри виртуальной машины так, как вам нравится (просто не забудьте настроить NTP).

В качестве альтернативы, если вы тестируете приложение (в отличие от целой системы), вы можете подделывать его время чтения файла через LD_PRELOAD ( аналогичный пример ) или ptrace (более сложный, но работает даже против статически связанных двоичных файлов). Это не подходит ко всем сценариям, это действительно зависит от того, какие потенциальные ошибки вы тестируете. libfaketime позволяет запустить программу и заставить ее полагать, что она работает в другое время; он также может запоминать фальшивые временные метки, поэтому вы можете использовать его и не писать лишний низкоуровневый код.