Lân Asked: 2023-11-20 16:36:45 +0800 CST2023-11-20 16:36:45 +0800 CST 2023-11-20 16:36:45 +0800 CST LUKS 分区上的 write() 系统调用 772 据我了解,当write()调用系统调用时,它将数据写入操作系统缓冲区然后返回。在 LUKS 分区上下文中,我的问题是: write()加密数据然后写入操作系统缓冲区然后返回吗?或者,它只是写入原始数据然后返回,并且只有当操作系统将其缓冲区刷新到磁盘时数据才会被加密? 如果调用后write(),fsync()还被调用怎么办? 我如何验证确切的行为? 在谷歌上搜索了一段时间,但到目前为止还没有结果。 operating-systems 1 个回答 Voted Best Answer u1686_grawity 2023-11-20T16:51:14+08:002023-11-20T16:51:14+08:00 这主要可以通过查看 LUKS 在整个堆栈中插入的位置来回答。它构建在 Linux 设备映射器子系统之上(通过 dm-crypt),该子系统在文件系统下的“块设备”级别工作;解锁 LUKS 卷会创建一个虚拟/dev/dm*设备,然后从中挂载文件系统。 块设备(在本例中为虚拟 DM 设备,无论是 dm-crypt 设备、dm-raid 设备还是其他设备)的内部操作对于文件系统或 VFS 层完全不可见。因此,文件系统(或 VFS)管理的所有缓冲区仅包含原始数据;它在 write() 时未加密,因为子系统不知道正在使用任何加密。 当您执行 操作时sync,包含原始数据的文件系统缓冲区将写入底层块设备,该块设备(如果是 dm-crypt 设备)将加密每个块并将现在加密的写入转发到底层物理分区。 与物理磁盘设备对应的缓冲区包含加密数据,因为它只接收来自其上方 dm-crypt 层的加密写入。 (将此与内置于文件系统中的“fscrypt”进行对比。)
这主要可以通过查看 LUKS 在整个堆栈中插入的位置来回答。它构建在 Linux 设备映射器子系统之上(通过 dm-crypt),该子系统在文件系统下的“块设备”级别工作;解锁 LUKS 卷会创建一个虚拟
/dev/dm*
设备,然后从中挂载文件系统。块设备(在本例中为虚拟 DM 设备,无论是 dm-crypt 设备、dm-raid 设备还是其他设备)的内部操作对于文件系统或 VFS 层完全不可见。因此,文件系统(或 VFS)管理的所有缓冲区仅包含原始数据;它在 write() 时未加密,因为子系统不知道正在使用任何加密。
当您执行 操作时
sync
,包含原始数据的文件系统缓冲区将写入底层块设备,该块设备(如果是 dm-crypt 设备)将加密每个块并将现在加密的写入转发到底层物理分区。与物理磁盘设备对应的缓冲区包含加密数据,因为它只接收来自其上方 dm-crypt 层的加密写入。
(将此与内置于文件系统中的“fscrypt”进行对比。)