如何使用 C++ 代码中的 BTRFS 写入时复制?

     2023-02-22     286

关键词:

【中文标题】如何使用 C++ 代码中的 BTRFS 写入时复制?【英文标题】:How can I use the Copy on Write of a BTRFS from C++ code? 【发布时间】:2018-10-11 18:03:10 【问题描述】:

如何使用 C++ 在 BTRFS 文件系统中的文件上从假定支持的 Linux 系统上的 C++ 代码复制文件?该解决方案是否适用于所有 Unix 系统?

文件系统的 C++ 标准的任何部分都没有包含 CoW。它也没有出现在 Linux 的文档中,也不是 POSIX 标准。

事实上,即使 GNU cp 实用程序可以处理写入时复制,它也可能并不总是执行,因为它需要一个参数,即--reflink=true 来强制使用它

因此,使用 CoW 很可能需要使用低级原语,显然没有为 Linux 或更广泛的 POSIX 准备文档。

【问题讨论】:

我对你想要做什么感到困惑。在 btrfs 文件系统上写入文件,您将自动获得写入时的副本。它是文件系统的一个功能。 您的 btrfs 文件系统是否使用 nodatacow 挂载并希望特定文件使用 COW? 这可能是相关的:unix.stackexchange.com/questions/394973/… @drescherjm 因为cp Unix 实用程序被记录为在某些属性参数下不使用写入时复制,我猜想可以进行一些系统调用微调,但我找不到任何文档。您可能还注意到我专门用 C++ 说话,因此您提出的内容与此相去甚远 我想解释一个非常具体的问题,其答案是(我找到了)一对系统调用,这几乎是人们在 *** 中可以找到的最狭窄的答案类型可以结束被标记为过于宽泛。 【参考方案1】:

你可以看到cp --reflink=always notes.txt notes.txt.backupstrace完成了哪些系统调用。

因此,如果您运行 strace cp --reflink=always notes.txt notes.txt.backup,您可以在输出中找到:

openat(AT_FDCWD, "notes.txt", O_RDONLY) = 3
fstat(3, st_mode=S_IFREG|0664, st_size=760, ...) = 0
openat(AT_FDCWD, "notes.txt.backup", O_WRONLY|O_TRUNC) = 4
fstat(4, st_mode=S_IFREG|0664, st_size=0, ...) = 0
ioctl(4, BTRFS_IOC_CLONE or FICLONE, 3) = 0

ioctl 调用是创建文件的显式 CoW 副本的 CoW 魔法。

您可以阅读man ioctl_ficlone

【讨论】:

如何使用 C++ 中的函数将向量写入文件?

】如何使用C++中的函数将向量写入文件?【英文标题】:HowtowriteavectortoafilewithafunctioninC++?【发布时间】:2015-12-0700:07:27【问题描述】:这是我的代码的一些sn-ps。首先是我编写的函数。给我一个错误的是fileout函数,它应该将向... 查看详情

如何在使用转义或引号在pyspark中的文件中写入数据帧时获得完全匹配? [复制]

】如何在使用转义或引号在pyspark中的文件中写入数据帧时获得完全匹配?[复制]【英文标题】:Howtogetexactmatchwhilewritingdataframeinfileinpysparkusingescapeorquote?[duplicate]【发布时间】:2020-07-1303:53:17【问题描述】:我正在尝试将数据框加... 查看详情

尝试写入文件时 C++ 中的循环错误

...比较复杂了。将单个单词写入.txt时不会遇到问题,但在使用一个或多个空格写入输入时会出现此问题。首先我的代码是这样的。#include< 查看详情

C++ YAML:如何编辑/写入 .yaml 文件中的节点

】C++YAML:如何编辑/写入.yaml文件中的节点【英文标题】:C++YAML:Howtoedit/writetoanodeina.yamlfile【发布时间】:2015-01-2713:20:29【问题描述】:我正在尝试编写一个函数,该函数将使用yaml-cpp在我的.yaml文件中写入/编辑一个节点。我有点... 查看详情

btrfs文件系统的简单使用方法

简单介绍btrfs文件系统的使用,包括创建、挂载、子卷的创建、挂载、快照、在线添加和移除物理设备、重新均衡数据btrfs的特性:    多块磁盘支持:btrfs可由多个底层磁盘组成,支持RAID,可以联机添加、移除、... 查看详情

如何在 C++ 中的大端和小端值之间进行转换? [复制]

】如何在C++中的大端和小端值之间进行转换?[复制]【英文标题】:HowdoIconvertbetweenbig-endianandlittle-endianvaluesinC++?[duplicate]【发布时间】:2009-03-1517:21:41【问题描述】:如何在C++中的大端和小端值之间进行转换?我正在使用VC++6.0。... 查看详情

如何正确删除 C++ 中的指针? [复制]

】如何正确删除C++中的指针?[复制]【英文标题】:HowtodeleteapointerinC++properly?[duplicate]【发布时间】:2020-06-1904:17:06【问题描述】:我是C++新手,我有一个问题。假设您使用以下代码声明了变量x:MyClass*x=newMyClass();使用这个变量... 查看详情

linuxbtrfs文件系统及管理

...容量16EB,等。  btrfs功能特性  1,COW:写时复制,每次写入数据时,先将数据写入到新的block,写入成功后,更改旧数据块指针到新数据块,而非更改本身。  2,多物理卷支持,btrfs内建raid,可在线增删磁盘设备,可在线扩展... 查看详情

如何使用 C++ 成功写入向量中的 .DAT 文件内容?

】如何使用C++成功写入向量中的.DAT文件内容?【英文标题】:Howtosuccessfullywritetoa.DATfilecontentsinavectorusingC++?【发布时间】:2017-11-0904:48:25【问题描述】:我正在尝试将我保存的患者列表写入.DAT文件,这些患者存储在名为PatientInSy... 查看详情

如何使用 OpenCV 将向量的结构复制到 C++ 中的另一个向量

】如何使用OpenCV将向量的结构复制到C++中的另一个向量【英文标题】:HowtocopythestructureofavectorofvectorstoanotheroneinC++usingOpenCV【发布时间】:2015-04-2315:46:48【问题描述】:我有一个包含图像轮廓的向量。代码如下所示:cv::Matimg=cv::im... 查看详情

什么时候使用结构比使用 C++ 中的类更合理? [复制]

】什么时候使用结构比使用C++中的类更合理?[复制]【英文标题】:WhenisusingastructmorereasonablethanusingaclassinC++?[duplicate]【发布时间】:2013-04-2108:25:06【问题描述】:我一直在阅读QtCreator的源代码。什么时候在C++中使用struct比使用cla... 查看详情

使用 C++ 包装器时如何访问 C# .dll 属性

】使用C++包装器时如何访问C#.dll属性【英文标题】:HowtoaccessC#.dllPropertieswhenusingaC++wrapper【发布时间】:2018-02-2618:58:24【问题描述】:我正在为C#.dll编写一个包装器,供c++程序使用。我有这些功能,但我不确定如何访问/设置包装... 查看详情

如何在运行时修改 Jar 文件中的文本文件? [复制]

】如何在运行时修改Jar文件中的文本文件?[复制]【英文标题】:HowcanImodifyatextfileinsideaJarfilewhileruntime?[duplicate]【发布时间】:2016-05-0611:14:00【问题描述】:正如问题所说,这怎么可能?这个文件是我的项目结构(我使用的是ecli... 查看详情

如何使用 C++ 复制目录 [重复]

】如何使用C++复制目录[重复]【英文标题】:HowtouseC++toCopyADirectory[duplicate]【发布时间】:2012-12-3122:33:07【问题描述】:我用c++做了一个备份程序,但是它使用System()命令批量复制文件。我正在寻找一种复制整个目录的方法(这不... 查看详情

为啥这是 C++ 中的有效函数声明? [复制]

...在另一个函数中写入并编译。为什么?还有一个函数声明如何在它的签名中获得一个临时对象?【问题讨论】:不是临时的。目的。它是什么都没有得到并返回Bar 查看详情

c++ 和 php 中的命名管道

...:17:01【问题描述】:我正在C++中创建一个管道,当我尝试使用php代码写入该管道时,当我尝试获取该管道的句柄时,它给了我访问被拒绝错误。基本上,php代码调用另一个写入管道的c++exe,但它失败了。我认为它死于用户没有的... 查看详情

如何使用嵌入在 C++ 中的单声道编译 C# 代码?

】如何使用嵌入在C++中的单声道编译C#代码?【英文标题】:HowdoyoucompileC#codeusingmonoembeddedinC++?【发布时间】:2020-08-2300:17:12【问题描述】:如何使用C++编译.cs文件我已经搜索了Mono的所有文档,但找不到仅从C++中的嵌入式Mono运行... 查看详情

btrfs

...:支持RAID,以联机“添加”,“删除”,“修改” 写时复制更新:复制,更新及替换指针,而非“就地”更新 数据及元数据校验码:checksum 子卷:sub_volume 快照:支持快照的快照: 透明压缩: 文件系统创建: mkfs.btrfs -L:lable -... 查看详情