Backup
為 ext4fs 文件系統上的文件/目錄複製或恢復 crtime
想知道2020年有沒有辦法在Linux中復製或恢復inode/files/directories的crtime(創建時間)。我在還有全盤備份的時候不小心刪除了一個文件夾,但是cp -a和rsync都沒有可以恢復/複製文件/目錄crtimes。
我找到了一種使用 debugfs 實現它的方法,但它非常複雜,我需要自動化它(我有數百個已刪除的文件/目錄)。
對於源磁碟,您可以這樣做:
# debugfs /dev/sdXX # stat /path Inode: 432772 Type: directory Mode: 0700 Flags: 0x80000 Generation: 3810862225 Version: 0x00000000:00000006 User: 1000 Group: 1000 Project: 0 Size: 4096 File ACL: 0 Links: 5 Blockcount: 8 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x5db96479:184bb16c -- Wed Oct 30 15:22:49 2019 atime: 0x5b687c70:ee4dff18 -- Mon Aug 6 21:50:56 2018 mtime: 0x5db96479:184bb16c -- Wed Oct 30 15:22:49 2019 crtime: 0x5b687c70:d35d1348 -- Mon Aug 6 21:50:56 2018 Size of extra inode fields: 32 Extended attributes: security.selinux (40) EXTENTS: (0):1737229
記住crtime,這是兩個欄位,
crtime_lo
(是的,第一個)和crtime_hi
(第二個)然後對於目標磁碟執行以下操作:
# debugfs -w /dev/sdYY # set_inode_field /path crtime_lo 0x${1st_value_from_earlier} # set_inode_field /path crtime_hi 0x${2nd_value_from_earlier}
也許在 debugfs 手冊中我還缺少其他可以幫助我做到這一點的東西,所以如果人們能提供幫助,我會很高興。
-f cmd_file
確實似乎是一個不錯的開始方式,但對我來說還是有點太難了。
我實際上已經自己解決了。在你嘗試之前你永遠不知道你能做什麼:-)
即使所有文件系統都以讀寫方式掛載,它也必須安全執行。
#! /bin/bash dsk_src=/dev/sdc4 # source disk with original timestamps mnt_src=/mnt/sdc4 # source disk mounted at this path dsk_dst=/dev/sda4 # destination disk directory=user/.thunderbird # the leading slash _must_ be omitted cd $mnt_src || exit 1 find $directory -depth | while read name; do read crtime_lo crtime_hi < <(debugfs -R "stat \"/$name\"" $dsk_src 2>/dev/null | awk '/crtime:/{print $2}' | sed 's/0x//;s/:/ /') echo "File: $name" echo "crtime_lo: $crtime_lo" echo "crtime_hi: $crtime_hi" debugfs -w $dsk_dst -R "set_inode_field \"/$name\" crtime_lo 0x$crtime_lo" debugfs -w $dsk_dst -R "set_inode_field \"/$name\" crtime_hi 0x$crtime_hi" done
如果人們有興趣,我可以調整腳本以允許在一個分區內使用它,例如在執行之後
cp -a
。其實很容易。