Partition

在現有驅動器上創建 ZFS 分區

  • October 7, 2021

我聽說 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 -sis used] links) 來訪問或複制參考數據,即使只是為了方便在不同目錄和不同名稱下使用相同的文件。仍然是同一個文件,只是指向它的硬連結或軟連結不同。

在手動級別,在非常簡單的視圖中,重複數據刪除ln,同時cp 重複。

添加 ZFS 提供了直接的好處,ln當您想使用cp. 有很多案例,例如當媒體被有意分割、修改、編輯、排序等時,儲存單獨的媒體“剪輯”可以從 ZFS 重複數據刪除中受益。

ZFS 的成本是重複數​​據刪除相當佔用 RAM。核心必須將每個塊的校驗和或散列儲存在磁碟上,並在塊被寫回池時實時訪問該數組。所以當你的磁碟被填滿(更多的 ZFS 塊被寫入)時,更多的 RAM 被填滿,因為核心記憶體了每個塊數據的雜湊值。取決於您的筆記型電腦有多少 RAM 和多少磁碟,這可能是也可能不是問題,但請注意,重複數據刪除的主要成本是有足夠的 RAM 來儲存整個磁碟的雜湊數組。它可以用更少的 RAM 來完成,但是當核心嘗試在沒有足夠 RAM 一次保存整個雜湊數組的系統上嘗試將雜湊數組換入和換出 RAM 時,寫入訪問尤其會受到影響。

但話雖如此,試驗小型 ZFS 池的一種方法可能是:

創建虛擬塊設備

我在這裡使用 FreeBSD 命令,但在 Ubuntu 上的步驟類似。我的範例塊設備大小為 10G,但如果您有可用空間,您可以使用更大的大小。

  • 創建一個ztest.dat10G 大小的文件:

# 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  -

Adedupratio為 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操作將能夠檢測數據損壞,但無法糾正發現的任何錯誤。

享受!

引用自:https://unix.stackexchange.com/questions/672151