Compression

在 lzo 壓縮的 BtrFS 之間複製:de/re-compressing?

  • January 17, 2016

我在安裝在同一台機器上的不同驅動器上的兩個 lzo 壓縮 BtrFS 文件系統之間複製大量文件。似乎正在對文件進行解壓縮/重新壓縮。有沒有辦法避免這種情況?

正如@sysadmin1138 很好地說明的那樣,如果使用cp/ rsync/ send-receive跨文件系統,這個問題是不可避免的;但是在某些情況下有一種方法可以避免它。如果您使用種子設備,添加新設備(如 raid1),然後刪除種子,您將獲得與源基本相同的重複卷。(雖然 UUID 會改變。)

正如在開發列表中指出的那樣,“……複製卷本質上與源相同(程序複製塊),這意味著塊配置文件也被保留。”

作為關於我的特定案例的說明,我可以使用這種方法進行複制,將我的伺服器安裝到子卷中,然後mv將文件複製過來。這將節省大量工作。

不是真的,它歸結為系統呼叫。舉個例子:

open  ("tuppence", O_RDONLY)                           = 3
fstat (3, {st_mode=S_IFREG|0644, st_size=15, ...})     = 0
open  ("/tmp/tuppence", O_WRONLY|O_CREAT|O_EXCL, 0644) = 4
fstat (4, {st_mode=S_IFREG|0644, st_size=0, ...})      = 0
read  (3, "I have cheese.\n", 32768)                   = 15
write (4, "I have cheese.\n", 15)                      = 15

(這是 strace 數據,為清楚起見進行了一些清理,在復製文件時完成。)

要將文件從 A 點複製到 B 點,尤其是跨掛載點,Linux 將呼叫read要複製的文件,然後呼叫write新文件。您可以在上面的跟踪中看到它。

  1. 打開源文件,生成文件描述符編號 3。
  2. 打開目標文件,生成文件描述符編號 4。
  3. 從源文件描述符 3 中讀取。
  4. 將從 3 讀入的數據寫入目標文件描述符 4。
  5. 關閉一切。

系統read呼叫請求文件供程序使用,這會觸發 BTRFS 解壓縮。然後將檢索到的數據饋送到write呼叫中,這將觸發目標上的 BTRFS 壓縮。這種行為是 Linux 文件系統層如何工作的基礎。

要繞過這個,不要使用cp. 您必須使用 btrfs 特定的工具來處理完全在 btrfs 卷內移動的資料結構。問題是,我不知道這樣的工具是否存在。

引用自:https://serverfault.com/questions/747769