sync(1)を使用して、埋め込みファイルシステムの前にネストされたファイルシステムが同期されることを保証できますか?

sync(1)を使用して、埋め込みファイルシステムの前にネストされたファイルシステムが同期されることを保証できますか?

機密データを保存するために使用するファイルに、Luksで暗号化されたext4があります(これをFS「内部」と呼びます)。ファイル自体は物理SSD上の他のext4にあります。これを「外部」FSと呼びます。内部FSは、外部FSのファイルを指すループバックデバイスを使用してマウントされます。

sync(1)を呼び出すと、内部FSに対して保留中のすべての書き込みが持続することが保証されますか?

不幸な順序で同期が発生した場合(私が理解したように)、次のことが起こる可能性があります。

  1. データは内部FSに書き込まれます。
  2. sync移動する。
  3. 外部FSキャッシュへの書き込みはディスクに書き込まれます。
  4. 内部 FS キャッシュへの書き込みは外部 FS のファイルに書き込まれます。
  5. 内部FSから外部FSへの書き込みはキャッシュに保持されます。
  6. 競合が発生しました。
  7. それにもかかわらず、内部FSへの書き込みは依然として失われます。前に起こったsyncA.

同期はこれが起こらないことを保証しますか、それとも確実に知るために入れ子になったファイルシステム層と同じ同期を呼び出す必要がありますか?

Linuxをリクエストしていますが、POSIXに関するニュースがある場合は、それにも興味があります。

sync(1)残念ながら、sync(2)Debianのマニュアルページにはこのケースに関する情報はありません。

ベストアンサー1

はい、保証されます。
ネストされたファイルシステムの実行方法について明示的に言及していませんが、ブロックループバックデバイスを使用しているとします。

この場合、コアビットはここで見ることができます。カーネルソースコード:

static int lo_req_flush(struct loop_device *lo, struct request *rq)
{
    struct file *file = lo->lo_backing_file;
    int ret = vfs_fsync(file, 0);
    if (unlikely(ret && ret != -EINVAL))
        ret = -EIO;

    return ret;
}

の電話を記録してくださいvfs_fsync(file, 0)。これは、ループバックドライバがループバックブロックデバイスをサポートするファイルに対して明示的に同期を呼び出すことを意味します。

おすすめ記事