Compression
在 lzo 壓縮的 BtrFS 之間複製:de/re-compressing?
我在安裝在同一台機器上的不同驅動器上的兩個 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
新文件。您可以在上面的跟踪中看到它。
- 打開源文件,生成文件描述符編號 3。
- 打開目標文件,生成文件描述符編號 4。
- 從源文件描述符 3 中讀取。
- 將從 3 讀入的數據寫入目標文件描述符 4。
- 關閉一切。
系統
read
呼叫請求文件供程序使用,這會觸發 BTRFS 解壓縮。然後將檢索到的數據饋送到write
呼叫中,這將觸發目標上的 BTRFS 壓縮。這種行為是 Linux 文件系統層如何工作的基礎。要繞過這個,不要使用
cp
. 您必須使用 btrfs 特定的工具來處理完全在 btrfs 卷內移動的資料結構。問題是,我不知道這樣的工具是否存在。