tôi đã có thể thay đổi ctime với hai phương pháp khác nhau:
- Thay đổi hạt nhân để
ctime
phù hợp với mtime
- Viết một kịch bản đơn giản (nhưng hacky).
Phương pháp thứ nhất: Thay đổi hạt nhân.
Tôi đã tinh chỉnh chỉ một vài dòng trong KERNEL_SRC/fs/attr.c
Sửa đổi này cập nhật thời gian để phù hợp với thời gian đó bất cứ khi nào mtime được "xác định rõ ràng".
Có rất nhiều cách để "xác định một cách rõ ràng" các sự mtime, ví dụ:
Trong Linux:
touch -m --date="Wed Jun 12 14:00:00 IDT 2013" filename
Trong Java (sử dụng Java 6 hoặc 7, và có lẽ những người khác):
long newModificationTime = TIME_IN_MILLIS_SINCE_EPOCH;
File myFile = new File(myPath);
newmeta.setLastModified(newModificationTime);
đây là sự thay đổi để KERNEL_SRC/fs/attr.c
trong notify_change
chức năng:
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) Dòng này, không được chú trọng, sẽ cập nhật thời gian ctime thành thời gian đồng hồ hiện tại khi có thay đổi đối với tệp. Chúng tôi không muốn điều đó, vì chúng tôi muốn tự mình đặt thời gian. Vì vậy, chúng tôi bình luận dòng này ra. (Điều này không bắt buộc)
(2) Đây thực sự là mấu chốt của giải pháp.Hàm notify_change
được thực thi sau khi một tệp đã được thay đổi, trong đó siêu dữ liệu thời gian cần được cập nhật. Nếu không có mtime nào được chỉ định, thì mtime được đặt thành thời gian hiện tại. Khác, nếu mtime được đặt thành một giá trị cụ thể, chúng tôi cũng đặt ctime và atime thành giá trị đó.
Phương pháp thứ hai: Kịch bản lệnh shell đơn giản (nhưng hack).
giải thích tóm tắt: 1) Thay đổi thời gian hệ thống thời gian mục tiêu của bạn 2) Thực hiện một chmod vào file, file ctime nay phản ánh thời gian mục tiêu 3) Hoàn nguyên thời gian hệ thống lại.
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"
Run này như sau: myfile ./changectime.sh
ctime của tập tin bây giờ sẽ phản ánh thời gian trong file.
Tất nhiên, có thể bạn không muốn tệp có 777 quyền. Đảm bảo rằng bạn sửa đổi kịch bản này theo nhu cầu của bạn trước khi sử dụng nó.
Trong thiết bị đầu cuối Linux, cho đầu ra ls, nó hiển thị thời gian sửa đổi lần cuối, bạn có thử sửa đổi điều đó không? –
Có. Tôi đã sửa đổi thành công lần sửa đổi lần cuối bằng cách sử dụng dòng mã đầu tiên ở trên. – Eitan