Backup

為 ext4fs 文件系統上的文件/目錄複製或恢復 crtime

  • June 7, 2020

想知道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。其實很容易。

引用自:https://unix.stackexchange.com/questions/591384