LUKS 分区上的 write() 系统调用

LUKS 分区上的 write() 系统调用

据我了解,当write()调用 syscall 时,它会将数据写入 OS 缓冲区,然后返回。在 LUKS 分区上下文中,我的问题是:

  1. write()加密数据然后写入操作系统缓冲区然后返回?或者,它只写入原始数据然后返回,并且只有当操作系统将其缓冲区刷新到磁盘时数据才会加密?
  2. 如果调用之后write()fsync()也叫?
  3. 我如何验证确切的行为?

在 Google 上搜索了一段时间,但至今尚无结果。

答案1

这个问题的答案主要在于查看 LUKS 在整个堆栈中的插入位置。它建立在 Linux 设备映射器子系统之上(通过 dm-crypt),该子系统在文件系统下方的“块设备”级别上工作;解锁 LUKS 卷会创建一个虚拟/dev/dm*设备,然后从该虚拟设备挂载文件系统。

块设备(在本例中为虚拟 DM 设备,无论是 dm-crypt 设备、dm-raid 设备还是其他设备)的内部操作对于文件系统或 VFS 层而言是完全不可见的。因此,文件系统(或 VFS)管理的所有缓冲区仅包含原始数据;它在 write() 时未加密,因为子系统不知道正在使用任何加密。

当您时sync,包含原始数据的文件系统缓冲区将被写入底层块设备,该设备(如果它是 dm-crypt 设备)将加密每个块并将现在加密的写入转发到底层物理分区。

与物理磁盘设备相对应的缓冲区包含加密数据,因为它只接收来自其上方的 dm-crypt 层的加密写入。

(与 'fscrypt' 相比,它内置于文件系统中。)

相关内容