Saya dapat mengubah waktu dengan dua metode berbeda:
- Mengubah kernel menjadi
ctime
cocok denganmtime
- Menulis skrip shell sederhana (namun hacky).
Metode 1:Mengubah kernel.
Saya men-tweak hanya beberapa baris di KERNEL_SRC/fs/attr.c
Modifikasi ini memperbarui waktu agar sesuai dengan waktu setiap kali waktu "ditentukan secara eksplisit".
Ada banyak cara untuk "mendefinisikan secara eksplisit" waktu, misalnya:
Di Linux:
touch -m --date="Wed Jun 12 14:00:00 IDT 2013" filename
Di Jawa (menggunakan Java 6 atau 7, dan mungkin lainnya):
long newModificationTime = TIME_IN_MILLIS_SINCE_EPOCH;
File myFile = new File(myPath);
newmeta.setLastModified(newModificationTime);
Ini adalah perubahan ke KERNEL_SRC/fs/attr.c
di notify_change
fungsi:
now = current_fs_time(inode->i_sb);
//attr->ia_ctime = now; (1) Comment this out
if (!(ia_valid & ATTR_ATIME_SET))
attr->ia_atime = now;
if (!(ia_valid & ATTR_MTIME_SET)) {
attr->ia_mtime = now;
}
else { //mtime is modified to a specific time. (2) Add these lines
attr->ia_ctime = attr->ia_mtime; //Sets the ctime
attr->ia_atime = attr->ia_mtime; //Sets the atime (optional)
}
(1) Baris ini, tanpa komentar, akan memperbarui waktu ke waktu jam saat ini setelah ada perubahan pada file. Kami tidak menginginkan itu, karena kami ingin mengatur waktu sendiri. Jadi, kami mengomentari baris ini. (Ini tidak wajib)
(2) Ini benar-benar inti dari solusinya. notify_change
fungsi dijalankan setelah file diubah, di mana metadata waktu perlu diperbarui. Jika tidak ada mtime yang ditentukan, maka mtime diatur ke waktu saat ini. Selain itu, jika mtime disetel ke nilai tertentu, kami juga menyetel waktu dan waktu ke nilai tersebut.
Metode ke-2:Skrip shell sederhana (namun hacky).
Penjelasan singkat:
- Ubah waktu sistem ke waktu target Anda
- Lakukan chmod pada file, waktu file sekarang mencerminkan waktu target
- Kembalikan waktu sistem kembali.
changectime.sh
#!/bin/sh
now=$(date)
echo $now
sudo date --set="Sat May 11 06:00:00 IDT 2013"
chmod 777 $1
sudo date --set="$now"
Jalankan ini sebagai berikut:./changectime.sh MYFILE
waktu file sekarang akan mencerminkan waktu dalam file.
Tentu saja, Anda mungkin tidak menginginkan file dengan izin 777. Pastikan Anda mengubah skrip ini sesuai kebutuhan sebelum menggunakannya.
Menyesuaikan jawaban ini dengan kasus Anda:
// Warning: Disk must be unmounted before this operation
String disk = "/dev/sda1";
// Update ctime
Runtime.getRuntime().exec("debugfs -w -R 'set_inode_field "+pathToMyFile+" ctime "+myCustomTime+"' "+disk);
// Drop vm cache so ctime update is reflected
Runtime.getRuntime().exec("echo 2 > /proc/sys/vm/drop_caches");
Saya ragu kita akan melihat metode yang nyaman di Standard Java API untuk melakukan ini, karena tidak ada Linux (man touch ) atau Windows (GetFileTime berfungsi pada MSDN) memberikan akses mudah ke bidang ini. Panggilan sistem asli hanya memberikan akses ke pembuatan/akses/modifikasi stempel waktu, begitu pula Java.