ext4fs ファイルシステムからファイル/ディレクトリのcrtimeをコピーまたは復元する

ext4fs ファイルシステムからファイル/ディレクトリのcrtimeをコピーまたは復元する

2020年にLinuxでinode /ファイル/ディレクトリの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_locrtimeを覚えておいてください。これは(たとえば、最初の)とcrtime_hi(2番目)の2つのフィールドです。

その後、ターゲットディスクに対して次のことができます。

# 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始めるのに良い方法だと思いますが、まだ私にとってはとても難しいです。

ベストアンサー1

実際、私は自分で解決しました。しようとしないと、何ができるかは決してわかりません:-)

確かにそうです安全すべてのファイルシステムが読み書きでマウントされている場合でも機能します。

#! /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。実際にはとても簡単です。

おすすめ記事