在現有驅動器上創建 ZFS 分區
我聽說 ZFS 具有重複數據刪除功能,因此您可以將同一個文件保存在多個位置,但只使用 ~1 個副本的空間。我注意到我傾向於以音樂/圖像/等結尾。隨著時間的推移,在我的硬碟驅動器的多個地方,並認為創建一個 ZFS 分區並將我的媒體移動到該分區會很好。我很難找到如何做到這一點,或者如果可能的話。大多數教程都說“使用 3 個磁碟並將它們與 ZFS 一起 RAID”,但我在一台只有一個磁碟的筆記型電腦上,以及一個我不打算刪除的預先存在的作業系統。我看到有關 ZFS 分區的評論(https://serverfault.com/questions/628632/should-i-create-zfs-zpools-with-whole-disks-or-partitions),但我還沒有找到任何解釋如何將單個 ZFS 分區添加到現有磁碟的內容。這樣的事情能做到嗎?(我的磁碟分區表類型是 msdos,順便說一句,我執行的是 Ubuntu。)
如果您的目標是在保持節省空間的同時最大化您的媒體組織,則可以通過為您的媒體庫佈置一個目錄樹,然後明智地使用
cp
命令(複製數據)和ln
命令(創建硬或soft [if-s
is used] links) 來訪問或複制參考數據,即使只是為了方便在不同目錄和不同名稱下使用相同的文件。仍然是同一個文件,只是指向它的硬連結或軟連結不同。在手動級別,在非常簡單的視圖中,重複數據刪除
ln
,同時cp
重複。添加 ZFS 提供了直接的好處,
ln
當您想使用cp
. 有很多案例,例如當媒體被有意分割、修改、編輯、排序等時,儲存單獨的媒體“剪輯”可以從 ZFS 重複數據刪除中受益。ZFS 的成本是重複數據刪除相當佔用 RAM。核心必須將每個塊的校驗和或散列儲存在磁碟上,並在塊被寫回池時實時訪問該數組。所以當你的磁碟被填滿(更多的 ZFS 塊被寫入)時,更多的 RAM 被填滿,因為核心記憶體了每個塊數據的雜湊值。取決於您的筆記型電腦有多少 RAM 和多少磁碟,這可能是也可能不是問題,但請注意,重複數據刪除的主要成本是有足夠的 RAM 來儲存整個磁碟的雜湊數組。它可以用更少的 RAM 來完成,但是當核心嘗試在沒有足夠 RAM 一次保存整個雜湊數組的系統上嘗試將雜湊數組換入和換出 RAM 時,寫入訪問尤其會受到影響。
但話雖如此,試驗小型 ZFS 池的一種方法可能是:
創建虛擬塊設備
我在這裡使用 FreeBSD 命令,但在 Ubuntu 上的步驟類似。我的範例塊設備大小為 10G,但如果您有可用空間,您可以使用更大的大小。
- 創建一個
ztest.dat
10G 大小的文件:
# truncate -s 10G ztest.dat
- 並創建一個由該文件支持的虛擬塊設備:
# mdconfig -f ztest.dat
md0
那麼我們的虛擬設備就是
/dev/md0
.創建一個簡單的 ZPOOL 並啟用重複數據刪除
# zpool create ztest md0 # zfs set dedup=on ztest # zpool status ztest pool: ztest state: ONLINE config: NAME STATE READ WRITE CKSUM ztest ONLINE 0 0 0 md0 ONLINE 0 0 0 errors: No known data errors
這會將
ztest
文件系統安裝在/ztest
. 讓我們也製作一個簡單的 shell 函式,它可以快速顯示/ztest
目錄、文件系統和 ZFS 池的一些基本統計資訊:zlist() { zfs list ztest echo zfs get all ztest | egrep 'used|refer' echo zpool get dedupratio ztest }
然後使用這些工具,您可以在下面創建所需的媒體層次結構
/ztest
並開始將一些範例媒體文件複製到/ztest
文件系統中:# ls -l /ztest; echo; zlist total 0 NAME USED AVAIL REFER MOUNTPOINT ztest 114K 9.20G 24K /ztest ztest used 114K - ztest referenced 24K - ztest usedbysnapshots 0B - ztest usedbydataset 24K - ztest usedbychildren 90K - ztest usedbyrefreservation 0B - ztest logicalused 42K - ztest logicalreferenced 12K - NAME PROPERTY VALUE SOURCE ztest dedupratio 1.00x -
A
dedupratio
為 1.00 表示未進行重複數據刪除;文件系統中數據的邏輯大小是儲存在池中的物理數據大小的 1.00 倍。但我們甚至還沒有複製任何東西!現在讓我們這樣做:
# cp -vp ~jim/my-fave-dvd.iso /ztest/copy1.iso /home/jim/my-fave-dvd.iso -> /ztest/copy1.iso
並檢查結果:
# ls -l /ztest; echo; zlist total 3271173 -rw-r--r-- 1 jim jim 3347775488 Jul 1 2014 copy1.iso NAME USED AVAIL REFER MOUNTPOINT ztest 3.13G 6.08G 3.12G /ztest ztest used 3.13G - ztest referenced 3.12G - ztest usedbysnapshots 0B - ztest usedbydataset 3.12G - ztest usedbychildren 7.18M - ztest usedbyrefreservation 0B - ztest logicalused 3.12G - ztest logicalreferenced 3.12G - NAME PROPERTY VALUE SOURCE ztest dedupratio 1.00x -
重複數據刪除率仍然是 1.00,因為我們只儲存了第一個媒體文件的一個副本。讓我們創建一個副本:
# cp -vp /ztest/copy1.iso /ztest/copy2.iso /ztest/copy1.iso -> /ztest/copy2.iso # ls -l /ztest; echo; zlist total 6542345 -rw-r--r-- 1 jim jim 3347775488 Jul 1 2014 copy1.iso -rw-r--r-- 1 jim jim 3347775488 Jul 1 2014 copy2.iso NAME USED AVAIL REFER MOUNTPOINT ztest 6.25G 6.07G 6.24G /ztest ztest used 6.25G - ztest referenced 6.24G - ztest usedbysnapshots 0B - ztest usedbydataset 6.24G - ztest usedbychildren 10.6M - ztest usedbyrefreservation 0B - ztest logicalused 6.24G - ztest logicalreferenced 6.24G - NAME PROPERTY VALUE SOURCE ztest dedupratio 2.00x -
現在重複數據刪除率為 2.00,因為文件系統引用的邏輯數據比池中實際儲存的數據大 2.00 倍。但請注意,來自的輸出
zfs list
表明,儘管USED
值上升到6.25G
,但AVAIL
值幾乎沒有變化,在6.07G
。讓我們創建更多的副本:# cp -vp /ztest/copy1.iso /ztest/copy3.iso /ztest/copy1.iso -> /ztest/copy3.iso # cp -vp /ztest/copy1.iso /ztest/copy4.iso /ztest/copy1.iso -> /ztest/copy4.iso # ls -lh /ztest; echo; zlist total 13084690 -rw-r--r-- 1 jim jim 3.1G Jul 1 2014 copy1.iso -rw-r--r-- 1 jim jim 3.1G Jul 1 2014 copy2.iso -rw-r--r-- 1 jim jim 3.1G Jul 1 2014 copy3.iso -rw-r--r-- 1 jim jim 3.1G Jul 1 2014 copy4.iso NAME USED AVAIL REFER MOUNTPOINT ztest 12.5G 6.07G 12.5G /ztest ztest used 12.5G - ztest referenced 12.5G - ztest usedbysnapshots 0B - ztest usedbydataset 12.5G - ztest usedbychildren 10.6M - ztest usedbyrefreservation 0B - ztest logicalused 12.5G - ztest logicalreferenced 12.5G - NAME PROPERTY VALUE SOURCE ztest dedupratio 4.00x -
所以現在,
du
認為我們儲存了 12G 的文件:# du -h /ztest 12G /ztest
然而
zpool
顯示我們在池中只分配了 3.14G 的數據,並且池中還有 6.36G 的未分配空間。# zpool list ztest NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT ztest 9.50G 3.14G 6.36G - - 0% 33% 4.00x ONLINE -
等效使用
ln
無重複數據刪除另一方面,仍然可以明智地使用缺少重複數據刪除的文件系統來實現相同的目的,並且在復雜性、RAM 要求和速度方面的成本可能更低。
# zpool destroy ztest # zpool create ztest md0 # cp -vp ~jim/my-fave-dvd.iso /ztest/copy1.iso /home/jim/my-fave-dvd.iso -> /ztest/copy1.iso # ln /ztest/copy1.iso /ztest/copy2.iso # ln /ztest/copy1.iso /ztest/copy3.iso # ln -s /ztest/copy1.iso /ztest/copy4.iso
所以現在我們仍然有一個文件,可以從四個不同的位置(主副本
copy1.iso
和副本copy2
-copy4.iso
)訪問。
du
顯示我們儲存了 3.1G 的文件:# du -h /ztest 3.1G /ztest
ls
向我們展示了許多 inode 編號是相同的(硬連結),並且一個文件是符號連結。使用ln
允許我們將同一個文件放置在多個位置,而不會產生任何額外的儲存成本。# ls -lih /ztest total 9813518 2 -rw-r--r-- 3 jim jim 3.1G Jul 1 2014 copy1.iso 2 -rw-r--r-- 3 jim jim 3.1G Jul 1 2014 copy2.iso 2 -rw-r--r-- 3 jim jim 3.1G Jul 1 2014 copy3.iso 128 lrwxr-xr-x 1 root wheel 16B Oct 7 13:25 copy4.iso -> /ztest/copy1.iso
zfs 文件系統顯示 3.1G 已使用,6.1G 可用:
# zlist NAME USED AVAIL REFER MOUNTPOINT ztest 3.12G 6.08G 3.12G /ztest ztest used 3.12G - ztest referenced 3.12G - ztest usedbysnapshots 0B - ztest usedbydataset 3.12G - ztest usedbychildren 189K - ztest usedbyrefreservation 0B - ztest logicalused 3.12G - ztest logicalreferenced 3.12G - NAME PROPERTY VALUE SOURCE ztest dedupratio 1.00x -
zpool
同樣顯示我們已經分配了 3.12G 並且有 6.38G 可用。# zpool list ztest NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT ztest 9.50G 3.12G 6.38G - - 0% 32% 1.00x ONLINE -
我希望這個範例將鼓勵您開發自己的測試框架來試驗 ZFS 重複數據刪除,看看成本/收益比是否適合您。
迴避問題
這種在文件支持的虛擬設備上建立 ZFS 池的實驗性框架並不是將 ZFS 池添加到現有系統的長期解決方案。但它可以幫助您確定您目前的硬體是否可以提供必要的資源,以及您的特定案例中的數據和數據處理實踐是否可以利用 ZFS 提供的優勢。
如果您發現添加 ZFS 池是一個可取的目標,那麼您在處理新磁碟分區和文件系統時需要考慮通常的先決條件:
- 你最近有備份嗎?現在就這樣做!
- 您的磁碟上是否已經有一個空分區?非常便利。
- 沒有可用的空分區?那麼,您目前的文件系統中是否有足夠的未使用空間來備份它、重新調整到較小的分區並恢復數據,從而將新騰出的空間留給專用於 ZFS 的新分區?
- 您能否購買一個新的、更大的驅動器並在那裡創建大小合適的分區來保存您目前的文件系統以及新的 ZFS 分區?
一旦你有:
- 備份您現有的文件系統
- 用於 ZFS 的專用分區(我們稱之為
/dev/sda3
)- 決定您希望將 ZFS 池安裝在
/tank
您可以通過以下方式將 ZFS 池添加到現有系統:
# zpool create tank /dev/sda3
如果需要,您可以使用以下方法啟用重複數據刪除:
# zfs set dedup=on tank
請記住,這將是一個非冗餘池:如果您的驅動器出現故障,您的數據就會消失。
zpool scrub
操作將能夠檢測數據損壞,但無法糾正發現的任何錯誤。享受!