ファイル作成日を取得するLinuxカーネルインターフェイスはまだありませんか?


21

長い間、Linuxはファイル作成日を気にしませんでした。なぜなら、Linuxが一般的に使用しているファイルシステムはどれもそれらをサポートしていないからです。ただし、現在では、一般的に使用されている2つのファイルシステム(NTFSとext4)の両方でファイルの作成日が記録されています。

statこのコマンドは、しかし、まだ出力Birth: -我々はext4のはのは、使用して日付を作成し、ファイルを保存している見ることができるにもかかわらず、ext4ファイルシステム上にdebugfs -R 'stat <inode_number>' /dev/file_device

私はこれである理由の中に見たとき、私は他の誰かがすでにいました最近提出され、その上にバグレポートを、とに通じ、応答リンク上流の問題ファイル[単純にその情報を取得するために、現時点でなしのLinuxカーネルインターフェースがある」と述べていること作成日]"。明らかであるように私には注目に値すると思われる、まだの人はその要求されているように、ケースstat年間、ディスプレイにこの情報を(してstat出力しBirth、フィールドを、それは明らかにまだそれをサポートしていないにも関わらず!彼らは見越して、それを追加しましたか?)

それでは、ファイル作成日を取得するためのLinuxカーネルインターフェースが現在ないというのは本当ですか?これを実装する計画はありますか?


1
背景については、superuser.com / a / 703927/38062を参照してください。を使用している場合は、unix.stackexchange.com / a / 304245/5132をお楽しみくださいdebugfs
JdeBP

1
わーい!Linusが承認するのはわずか6年:
ジェズ

ZFSまた、ファイル作成時間を記録し、拡張属性を介してそれらを取得できるようにします。
気味悪い

回答:


15

編集:良いニュース、statx()マージされているので、リリース4.11で利用可能になるはずです。


xstat()の作業(現在statx())は2016年に改訂されました。

今回のプロセスはもう少し規律がありました(バイクの脱落が少なく、後からいつでも追加できるため、物議を醸す属性を削除することに同意しました)。残念ながら、正確なインターフェイスにはまだ異議があり、最近の参照は見ていません。


リンクした記事は、サブスクリプションなしでは利用できません。このメールですか? lkml.org/lkml/2017/3/5/149それに リンクしている場合は無料です。
ジェズ

@ジェズ修正。LWNリンクは7日後に利用可能になります。
sourcejedi

gitソースからコンパイルされた最新のcoreutils(8.27.37-02b65a-dirty)を使用して、Xubuntu 17.04でカーネル4.11.2を実行しています。statはまだ空の出生時間を報告します。どうしましたか?
shrx

4

一般的に使用されているファイルシステムはどれもそれらをサポートしていないため

私が伝えることができることから(リンク、メモリ、およびグーグルの束をごめん、参照としてここにリストするのに十分なまとまりのないもの)、それは下線システムが作成時間属性をサポートしていなかったからではなく、便利な機能であることに同意します。

http://www.pathname.com/fhs/pub/fhs-2.3.htmlを参照してください

POSIXは3つのタイムスタンプを配置します。それらはどれも作成時間ではありません。

正しく覚えていれば、引数は次のようになりました。

> Give me a use case where we can't already do that using what we already have.
< Some examples were submitted
> All of these are convoluted beyond usefulness. 
> Ok, Ok, *maybe* a couple of these don't suck. 
> Now how do you see handling file systems that don't track this?
< several ideas that were not the same. 
< Basically everyone had a special case that would work, but not 
< one that always works. Fight about fallbacks and other special handling. 
> Ok, lets table that for now. What should we call this field
< At least 6 different answers emerged.
> So, you want to break POSIX standards, 
> you can't really come up with a good reason why, 
> you can't come up with a good fall back, and 
> you can't even come up with a name. 
> Sounds like it's specific to the file system to me, and that 
> should be "extended data" accessible by tools and not as 
> a core stat in the Kernel.

今、これの多くは記憶であり、いくつかの古いメーリングリストを読んでいます。私も議論の中心にはいませんでした。組み込みLinuxシステム用のファットドライバーでのオフショット作業のために、私はメーリングリストに載っていました。確かにもっと権威ある情報源があるので、私が気にかけただけの何かの記憶よりも確かだからです。

誰も良いユースケースを思い付くことができないという事実と、作成時間をサポートしない他の40の一般的に使用されるファイルシステムのフィールドを処理する方法に誰も同意できないという事実の組み合わせであることを覚えていますフィールドの名前を考え出すことでさえ、大きな議論になりました。


2
それをサポートするファイルシステムの作成時間は、常に拡張統計としてアクセス可能であることに注意してください。これらの拡張統計を取得するための実装はかなり異なるため、lsやfindなどのツールにはありません。引数は、lsは情報を取得するためにファイルシステムの詳細を知る必要があり、それはlsの目的ではありません。
coteyr

1
debugfsディスクイメージからフィールドを読み取るようなものを使用することは、インターフェイスではありません。とにかく特権アクセスが必要になります。
イルカチュ

実装を考慮する前に実際にこれを変更する場所はPOSIX自体にあるため、引数があったようです。:)
ジェシーアデルマン

2

誕生時期は、ext4だけでなく、いくつかのLinuxネイティブファイルシステムです。

Linuxカーネルのバージョン4.11(2017年4月)以降、それを取得するための新しいstatx()システムコールがあります。ただし、対応するラッパー関数はまだGNU libcに追加されておらず(2018-06-26 現在、2.28で編集が追加されています)、GNUなどのツールstatlsfindそれを使用するように更新されていません(2019-08- 22編集 GNU statcoreutilsの8.31以降のglibc 2.28以上サポートそれでGNU / Linuxシステム上)

あなたはperl次のようなものでそれを行うこともできます:

perl -MPOSIX -e '
  require "syscall.ph";
  $buf = "\0" x 0x100; # enough space for a struct statx
  for (@ARGV) {
    # hardcode: AT_FDCWD == -100
    #           AT_SYMLINK_NOFOLLOW = 0x100 (lstat()-like)
    #           STATX_BTIME = 0x800 for the mask
    #           80: offset of the btime in the struct
    syscall(&SYS_statx, -100, $_, 0x100, 0x800, $buf) == 0
      or die "$_: $!\n";
    ($t, $n) = unpack("x80QQ", $buf);
    $n = sprintf("%09d", $n);
    print strftime("%F %T.$n %z\n", localtime $t)
  }' -- "$file"

あなたsyscall.phが持っていない場合はSYS_statx、同様にハードコードすることができます。amd64アーキテクチャでは332です。または試してください:

printf '#include <syscall.h>\n__NR_statx\n' | gcc -E -xc - | tail -n 1

現在、その出生時間はめったに役に立ちません。ファイル内のデータの年齢ではありません(データはファイルが作成されたにファイル書き込まれます)、または必ずしもファイルがディレクトリ内でその名前で現れた時間ではありません(別の名前として作成され、名前が変更またはリンクされた可能性があります)その間、コンテンツまたは属性が数回変更されます)。


Linuxが完全にサポートしNFSv4ていた場合、拡張属性をサポートする必要がありcrtime、拡張属性に可能なエントリがあります。たとえば、ls.cファイル作成時間を出力するSolaris ソースをで確認しls -l -% crtimeます。
気味悪い

@ schily、Linuxには拡張属性があり、LinuxなどのオープンソースOSで一般的に使用されるntfs-3gは、NTFS作成時間を拡張属性として実際に公開しますが、4.11以降はからも利用できると期待していますstatx()statx()まだLinuxに接続する標準ユーティリティはありませんが、拡張属性の取得は何十年もサポートされています。NTFS論理ボリューム上のファイルの作成日を取得する方法を
ステファンシャゼラス

Linux拡張属性は、1997年に撤回されたPOSIXドラフトをモデルにしています。NFSv4は、NTFSファイルストリームをサブセットとしてサポートできる最新の拡張属性システムを定義しますopenat(fd, ".", O_RDONLY|O_XATTR)
気味悪い

@schily、ここでACLと混同しています。実際、Linuxは非公式のパッチを除いてNFSv4 ACLをまだサポートしていませんが、それは拡張属性とはほとんど関係がありません(通常、ACLは拡張属性として保存されることを除いて)。Linuxは拡張属性をサポートしており、POSIXドラフトタイプのACLやその他の多くの用途に実際に使用しています。また、これらの属性を取得するためのAPIは、ntfs-3gによってcrtimeを公開するために使用されます。これは、Solarisと同様の方法で行われます。
ステファンシャゼラス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.