
機密データを保存するために使用するファイルに、Luksで暗号化されたext4があります(これをFS「内部」と呼びます)。ファイル自体は物理SSD上の他のext4にあります。これを「外部」FSと呼びます。内部FSは、外部FSのファイルを指すループバックデバイスを使用してマウントされます。
sync(1)を呼び出すと、内部FSに対して保留中のすべての書き込みが持続することが保証されますか?
不幸な順序で同期が発生した場合(私が理解したように)、次のことが起こる可能性があります。
- データは内部FSに書き込まれます。
sync
移動する。- 外部FSキャッシュへの書き込みはディスクに書き込まれます。
- 内部 FS キャッシュへの書き込みは外部 FS のファイルに書き込まれます。
- 内部FSから外部FSへの書き込みはキャッシュに保持されます。
- 競合が発生しました。
- それにもかかわらず、内部FSへの書き込みは依然として失われます。前に起こった
sync
A.
同期はこれが起こらないことを保証しますか、それとも確実に知るために入れ子になったファイルシステム層と同じ同期を呼び出す必要がありますか?
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)
。これは、ループバックドライバがループバックブロックデバイスをサポートするファイルに対して明示的に同期を呼び出すことを意味します。
答え2
このコマンドは承認されていませんが、最も可能性の高い方法は、sync(2)
呼び出し時にカーネルがマウントテーブルを参照することです。 Solarisではこの方法を使用し、Linuxでもこの方法を使用する可能性が高いです。
これは気に入らないようですので、あなたの場合は同期呼び出し以上を実行する必要があります。