AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 492078
Accepted
Daniel Böhmer
Daniel Böhmer
Asked: 2019-01-03 11:52:24 +0800 CST2019-01-03 11:52:24 +0800 CST 2019-01-03 11:52:24 +0800 CST

如何一次复制多个快照而不复制数据?

  • 772

我有一个 3.7TiB 的实时 btrfs 文件系统,已满 90%,包括旧快照和新的 4TB 备份硬盘。如何将所有现有快照复制到备份硬盘?

我试过了

# btrfs send home_1 home_2 home_3 share_1 share_2 share_3 ...

但在传输 2/3 的快照之前备份硬盘已满。所以我做了一些研究:

# ### create test image
# dd bs=1M count=1000 > btrfs_test.dd
# mkfs.btrfs btrfs_test.dd

# ### create snapshots
# btrfs subvol create testvol/
# btrfs subvol snapshot -r testvol/ testvol_0/
# ### (copy some ISO image)
# btrfs subvol snapshot -r testvol/ testvol_1/
# ### (proceed until testvol_3)

然后我的测试文件系统已满 91%,使用了 818MiB。

# btrfs send testvol_* | wc -c 
At subvol testvol_0
At subvol testvol_1
At subvol testvol_2
At subvol testvol_3
1466441978     # 1398MiB >> 1000MiB

当简单地用 1 个命令发送所有快照时,数据被复制,并且流的大小以及接收端的快照大小超过了原始使用的空间和硬盘的容量。

所以实际的问题变成了:如何复制多个快照而不复制其中两个或多个快照中包含的数据?

对于这个简单的测试用例,我成功地尝试了增量方法:

# ( btrfs send testvol_0; btrfs send -p testvol_0 testvol_1; btrfs send -p testvol_1 testvol_2; btrfs send -p testvol_2 testvol_3 ) | wc -c 
At subvol testvol_0
At subvol testvol_1
At subvol testvol_2
At subvol testvol_3
838778546    # 800 MiB < 1000MiB

但是在真实的文件系统上有多个子卷,每个子卷都有多个快照。我无法定义任何与 一起使用的顺序-p。如果一个数据块在子卷之间共享home_1,当然我只想传输和存储一次home_2。share_3任何想法如何做到这一点?

btrfs snapshot
  • 1 1 个回答
  • 969 Views

1 个回答

  • Voted
  1. Best Answer
    Daniel Böhmer
    2019-01-03T12:08:04+08:002019-01-03T12:08:04+08:00

    TL;DR:使用-c顶部描述的参数通常有效。当快照包含硬链接时,Linux 内核中有一个错误会在发送快照时触发错误——有关详细信息,请参阅答案末尾的结论。


    我正在试验这个-c参数,它看起来很有希望:

    # for i in {0..3}; do btrfs send testvol_$i $(ls -d testvol_* | head -n$i | sed 's/^/-c /'); done | wc -c
    ### btrfs send testvol_0
    ### btrfs send testvol_1 -c testvol_0
    ### btrfs send testvol_2 -c testvol_0 -c testvol_1
    ### btrfs send testvol_3 -c testvol_0 -c testvol_1 -c testvol_2
    At subvol testvol_0
    At subvol testvol_1
    At subvol testvol_2
    At subvol testvol_3
    838778546    # also 800MiB
    

    我仍然不确定这是否是我需要的。对此解决方案有何评论?

    更新:为了使用我的真实文件系统进行测试,我编写了一个 Perl 脚本来轻松发送一组子卷(创建列表-c很快变得乏味)并将一些数据发送到/dev/null:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    my @subvols = @ARGV
      or die "Usage: $0 SUBVOLUME ...\n";
    
    for(@subvols) {
        -d $_
          or die "Not a directory: $_\n";
    }
    
    for my $i (0 .. $#subvols) {
        my $subvol = $subvols[$i];
        my @clones = map { ('-c', $_) } @subvols[ 0 .. $i-1 ];
        print "btrfs send $subvol @clones\n";
    }
    

    结果:

    • btrfs send some-subvolme_* | pv > /dev/null:24GiB 0:04:17 [95.2MiB/s]
    • perl btrfs-send-all.pl some-subvolume_* | bash | pv > /dev/null:12.7GiB 0:03:58 [54.7MiB/s]

    这并没有带来多大的性能提升,但存储空间减少了近 50%!我现在正试图真正运行它……

    更新:我成功传输了 2 个快照,但第三个btrfs receive失败并显示以下错误消息:

    ERROR: unlink path/to/some/file/in/the/snapshot failed. No such file or directory
    

    命名文件存在于subvol_2但尚未subvol_3存在于.subvol_1

    我试图比较发送和接收的快照:

    # ### sender
    # du -s subvol_{1,2,3}
    132472304       subvol_1
    117069504       subvol_2
    126015636       subvol_3
    
    # ### receiver
    # du -s subvol_*
    132472304       subvol_1
    117069504       subvol_2
    132472304       subvol_3
    

    前两个快照似乎被正确传输,但是subvol_3是subvol_1. 这绝对是一个克隆,因为备份磁盘上的已用空间仅为快照总大小的 39% — 由于它们共享大多数文件,因此几乎超过 1/3。

    为什么btrfs send subvol_3 -c subvol_1 -c subvol_2 | btrfs receive没有正确传输快照但克隆subvol_1然后无法删除应该保留subvol_3且仅存在于中的文件subvol_2?

    更新:会不会是这个错误?https://patchwork.kernel.org/patch/10073969/

    我正在使用内核 4.9 运行 Debian 9 Stretch,它似乎比补丁更旧。

    更新:因为找不到任何解决方案,我只是复制了每个子卷的最新快照。然后我有大约 500GiB 的可用空间并尝试使用已复制的快照作为-p参数添加上一个快照。然后我收到了与上面相同的快照相同的错误消息。

    结论:我得出结论,我遇到了上面链接的错误。我不得不使用更新的 Linux 内核重新启动这台机器,或者从另一台计算机访问文件系统,但这不可行,因为这是一个生产系统。

    到目前为止,我对 btrfs 没有任何问题,但是运行 rsnapshot(它会创建很多硬链接)并发送 btrfs 快照仍然可能在当前的 Debian 稳定版上出现问题。

    • 2

相关问题

  • 如何启用 btrfs zstd 压缩

  • btrfs 增量快照:在发送的数据中查找 UUID

  • btrfs 增量快照同步:使用 rsync 引导

  • 如何通过文件系统级 RAID 仅对数据进行一次 dm-crypt 加密?

  • 如何在 btrfs 文件系统碎片整理中设置非默认 zstd 压缩级别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve