导航

    <#CACHE_INCLUDE_NAVBAR#>
« Cisco Sales Expert 646-204考題分享Android系統核心模塊內容概述 »

在Linux上使用ZFS

2011年3月28日 Linux 0条评论 0个引用

Linux 與文件系統具有有趣的關系。因為 Linux 是開放式的,所以它往往是下壹代文件系統和創新文件系統理念的關鍵開發平臺。兩個有趣的最新示例包括可大規模擴展的 Ceph 和連續快照文件系統 nilfs2(當然,主力文件系統,比如第四個擴展文件系統 [ext4] 的演化)。它還是舊有文件系統的考古遺址 — DOS VFAT、Macintosh(HPFS)、VMS ODS-2 和 Plan-9 的遠程文件系統協議。但是對於您發現在 Linux 內受支持的所有文件系統,有壹個因其實現的功能會讓人產生相當大的興趣:Oracle 的 Zettabyte 文件系統(Zettabyte File System,ZFS)。
    ZFS 是由 Sun Microsystems(在 Jeff Bonwick 下)設計和開發的,在 2004 年首次公布,並在 2005 年融入 Sun Solaris)。雖然將最流行的開放式操作系統與談論最多的、功能最豐富的文件系統配對在壹起是最理想的匹配,但是許可問題制約了集成。Linux 通過 GNU 公共許可證(General Public License,GPL)獲得保護,而 ZFS 是由 Sun 的通用開發和發布許可(Common Development and Distribution License,CDDL)涵蓋的。這些許可協議具有不同的目標並引入了沖突的限制。所幸,這並不意味著您作為 Linux 用戶不能享受 ZFS 及其提供的功能。
    ZFS 簡介
    將 ZFS 稱為文件系統有點名不副實,因為它在傳統意義上不僅僅是個文件系統。ZFS 將邏輯卷管理器的概念與功能豐富的和可大規模擴展的文件系統結合起來。讓我們開始先探索壹些 ZFS 所基於的原則。首先,ZFS 使用池存儲模型,而不是傳統的基於卷的模型。這意味著 ZFS 視存儲為可根據需要動態分配(和縮減)的共享池。這優於傳統模型,在傳統模型中,文件系統位於卷上,使用獨立卷管理器來管理這些資產。ZFS 內嵌入的是重要功能集(如快照、即寫即拷克隆、連續完整性檢查和通過 RAID-Z 的數據保護)的實現。更進壹步,可以在 ZFS 卷的頂端使用您自己最喜愛的文件系統(如 ext4)。這意味著您可以獲得那些 ZFS 的功能,如獨立文件系統中的快照(該文件系統可能並不直接支持它們)。
    但是 ZFS 不只是組成有用文件系統的功能集合。相反,它是構建出色文件系統的集成和補充功能的集合。讓我們來看看其中的壹些功能,然後再看看它們的壹些實際應用。
    存儲池
    正如前面所討論的,ZFS 合並了卷管理功能來提取底層物理存儲設備到文件系統。ZFS 對存儲池(稱為 zpools)進行操作,而不是直接查看物理塊設備,存儲池構建自虛擬驅動器,可由驅動器或驅動器的壹部分物理地進行表示。此外,可以動態構造這些池,甚至這些池正在活躍地使用時也可以。
    即寫即拷
    ZFS 使用即寫即拷模型來管理存儲中的數據。雖然這意味著數據永遠不會寫入到位(從來沒有被覆蓋),而是寫入新塊並更新元數據來引用數據。即寫即拷有利的原因有多個(不僅僅是因為它可以啟用的快照和克隆等壹些功能)。由於從來不覆蓋數據,這可以更簡單地確保存儲永遠不會處於不壹致的狀態(因為在新的寫入操作完成以後較早的數據仍保留)。這允許 ZFS 基於事務,且更容易實現類似原子操作等的功能。
    即寫即拷設計的壹個有趣的副作用是文件系統的所有寫入都成為順序寫入(因為始終進行重新映射)。此行為避免存儲中的熱點並利用順序寫入的性能(比隨機寫入更快)。
    數據保護
    可以使用 ZFS 的眾多保護方案之壹來保護由虛擬設備組成的存儲池。您不但可以跨兩個或多個設備(RAID 1)來對池進行鏡像,通過奇偶校驗來保護該池(類似於 RAID 5),而且還可以跨動態帶區寬度(後面詳細介紹)來鏡像池。基於池中設備數量,ZFS 支持各種不同的的奇偶校驗方案。例如,您可以通過 RAID-Z (RAID-Z 1) 來保護三個設備;對於四個設備,您可以使用 RAID-Z 2(雙重奇偶校驗,類似於 RAID6)。對於更大的保護來說,您可以將 RAID-Z 3 用於更大數量的磁盤進行三重奇偶校驗。
    為提高速度(不存在錯誤檢測以外的數據保護),您可以跨設備進行條帶化(RAID 0)。您還可以創建條帶化鏡像(來鏡像條帶化設備),類似於 RAID 10。
    ZFS 的壹個有趣屬性隨 RAID-Z、即寫即拷事務和動態條帶寬度的組合而來。在傳統的 RAID 5 體系結構中,所有磁盤都必須在條帶內具有其自己的數據,或者條帶不壹致。因為沒有方法自動更新所有磁盤,所以這可能產生眾所周知的 RAID 5 寫入漏洞問題(其中在 RAID 集的驅動器中條帶是不壹致的)。假設 ZFS 處理事務且從不需要寫入到位,則寫入漏洞問題就消除了。此方法的另外壹個便捷性體現在磁盤出現故障且需要重建時。傳統的 RAID 5 系統使用來自該集中其他磁盤的數據來重建新驅動器的數據。RAID-Z 遍歷可用的元數據以便只讀取有關幾何學的數據並避免讀取磁盤上未使用的空間。隨著磁盤變得更大以及重建次數的增加,此行為變得更加重要。
    校驗和
    雖然數據保護提供了在故障時重新生成數據的能力,但是這並不涉及處於第壹位的數據的有效性。ZFS 通過為寫入的每個塊的元數據生成 32 位校驗和(或 256 位散列)解決了此問題。在讀取塊時,將驗證此校驗和以避免靜默數據損壞問題。在有數據保護(鏡像或 AID-Z)的卷中,可自動讀取或重新生成備用數據。
    在 ZFS 上校驗和與元數據存儲在壹起,所以可以檢測並更正錯位寫入 — 如果提供數據保護(RAID-Z)—。
    快照和克隆
    由於 ZFS 的即寫即拷性質,類似快照和克隆的功能變得易於提供。因為 ZFS 從不覆蓋數據而是寫入到新的位置,所以可以保護較早的數據(但是在不重要的情況下被標記為刪除以逆轉磁盤空間)。快照 就是舊塊的保存以便及時維護給定實例中的文件系統狀態。這種方法也是空間有效的,因為無需復制(除非重新寫入文件系統中的所有數據)。克隆是壹種快照形式,在其中獲取可寫入的快照。在這種情況下,由每壹個克隆共享初始的未寫入塊,且被寫入的塊僅可用於特定文件系統克隆。
    可變塊大小
    傳統的文件系統由匹配後端存儲(512 字節)的靜態大小的塊組成。ZFS 為各種不同的使用實現了可變塊大小(通常大小達到 128KB,但是您可以變更此值)。可變塊大小的壹個重要使用是壓縮(因為壓縮時的結果塊大小理想情況下將小於初始大小)。除了提供更好的存儲網絡利用外,此功能也使存儲系統中的浪費最小化(因為傳輸更好的數據到存儲需要更少的時間)。
    在壓縮以外,支持可變塊大小還意味著您可以針對所期望的特定工作量優化塊大小,以便改進性能。
    其他功能
    ZFS 並入了許多其他功能,如重復數據刪除(最小化數據重復)、可配置的復制、加密、緩存管理的自適應更換緩存以及在線磁盤清理(標識並修復在不使用保護時可以修復的潛在錯誤)。它通過巨大的可擴展性來實現該功能,支持 16 千兆兆個字節的可尋址存儲(264 字節)。
    在 Linux 上使用 ZFS
    現在您已經了解了 ZFS 背後的壹些抽象概念,讓我們在實踐中看看其中的壹些概念。本演示使用了 ZFS-FUSE。FUSE 是壹種機制,允許您在沒有內核代碼(除 FUSE 內核模塊和現有的文件系統代碼以外)情況下在用戶空間中實現文件系統。該模塊為用戶和文件系統實現提供從內核文件系統接口到用戶空間的橋梁。首先,安裝 ZFS-FUSE 包(下面的演示針對 Ubuntu)。
    安裝 ZFS-FUSE
    安裝 ZFS-FUSE 很簡單,尤其是在使用 apt 的 Ubuntu 上。下面的命令行安裝了您開始使用 ZFS-FUSE 所需的壹切:
    $ sudo apt-get install zfs-fuse此命令行安裝 ZFS-FUSE 和所有其他依賴包( 我的也需要 libaiol),為新的程序包執行必要的設置並啟動 zfs-fuse 守護進程。
    使用 ZFS-FUSE
    在此演示中,您使用環回設備以便在主機操作系統內將磁盤仿真為文件。要開始此操作,請通過 dd 實用程序(參見清單 1)創建這些文件(使用 /dev/zero 作為源)。在創建了四個磁盤映像之後,使用 losetup 將磁盤映像與環路設備關聯在壹起。
    清單 1. 使用 ZFS-FUSE 的設置
    $ mkdir zfstest
    $ cd zfstest
    $ dd if=/dev/zero of=disk1.img bs=64M count=1
    1+0 records in
    1+0 records out
    67108864 bytes (67 MB) copied, 1.235 s, 54.3 MB/s
    $ dd if=/dev/zero of=disk2.img bs=64M count=1
    1+0 records in
    1+0 records out
    67108864 bytes (67 MB) copied, 0.531909 s, 126 MB/s
    $ dd if=/dev/zero of=disk3.img bs=64M count=1
    1+0 records in
    1+0 records out
    67108864 bytes (67 MB) copied, 0.680588 s, 98.6 MB/s
    $ dd if=/dev/zero of=disk4.img bs=64M count=1
    1+0 records in
    1+0 records out
    67108864 bytes (67 MB) copied, 0.429055 s, 156 MB/s
    $ ls
    disk1.img disk2.img disk3.img disk4.img
    $ sudo losetup /dev/loop0 ./disk1.img
    $ sudo losetup /dev/loop1 ./disk2.img
    $ sudo losetup /dev/loop2 ./disk3.img
    $ sudo losetup /dev/loop3 ./disk4.img
    $有了四臺設備作為您的 ZFS 塊設備(總大小 256MB),使用 zpool 命令來創建您的池。您可以使用 zpool 命令來管理 ZFS 存儲池,不過您將看到,您可以將其用於各種其他目的。下面的命令要求通過四個設備創建 ZFS 存儲池並通過 RAID-Z 提供數據保護。在此命令後為壹個列表請求,以便提供您池中的數據(參見清單 2)。
    清單 2. 創建 ZFS 池
    $ sudo zpool create myzpool raidz /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3
    $ sudo zfs list
    NAME USED AVAIL REFER MOUNTPOINT
    myzpool 96.5K 146M 31.4K /myzpool
    $您還可以研究池的壹些屬性,如清單 3 所示,其代表默認值。對於其他事項,您可以查看可用容量和已使用的部分。(為了簡潔,此代碼已經被壓縮。)
    清單 3. 查看存儲池的屬性
    $ sudo zfs get all myzpool
    NAME PROPERTY VALUE SOURCE
    myzpool type filesystem -
    myzpool creation Sat Nov 13 22:43 2010 -
    myzpool used 96.5K -
    myzpool available 146M -
    myzpool referenced 31.4K -
    myzpool compressratio 1.00x -
    myzpool mounted yes -
    myzpool quota none default
    myzpool reservation none default
    myzpool recordsize 128K default
    myzpool mountpoint /myzpool default
    myzpool sharenfs off default
    myzpool checksum on default
    myzpool compression off default
    myzpool atime on default
    myzpool copies 1 default
    myzpool version 4 -
    …
    myzpool primarycache all default
    myzpool secondarycache all default
    myzpool usedbysnapshots 0 -
    myzpool usedbydataset 31.4K -
    myzpool usedbychildren 65.1K -
    myzpool usedbyrefreservation 0 -
    $現在,讓我們實際使用 ZFS 池。首先,在您的池中創建目錄,然後在該目錄中啟用壓縮(使用 zfs set 命令)。其次,將文件復制到其中。我已經選擇了大小 120KB 左右的文件來查看 ZFS 壓縮的效果。請註意您的池掛載在根目錄上,因此就像您的根文件系統內的目錄壹樣加以處理。壹旦復制該文件,您就可以列出它來表示文件已存在(但與原來同樣大小)。通過使用 dh 命令,您可以看到文件大小為原來的壹半,這說明 ZFS 已經將其壓縮。您還可以查看 compressratio 屬性,了解您的池有多少已經被壓縮(使用默認壓縮程序,gzip)。清單 4 顯示了該壓縮。
    清單 4. 演示 ZFS 壓縮
    $ sudo zfs create myzpool/myzdev
    $ sudo zfs list
    NAME USED AVAIL REFER MOUNTPOINT
    myzpool 139K 146M 31.4K /myzpool
    myzpool/myzdev 31.4K 146M 31.4K /myzpool/myzdev
    $ sudo zfs set compression=on myzpool/myzdev
    $ ls /myzpool/myzdev/
    $ sudo cp /linux-2.6.34/Documentation/devices.txt /myzpool/myzdev/
    $ ls -la /linux-2.6.34/Documentation/devices.txt
    -rw-r--r-- 1 mtj mtj 118144 2010-05-16 14:17 /linux-2.6.34/Documentation/devices.txt
    $ ls -la /myzpool/myzdev/
    total 5
    drwxr-xr-x 2 root root 3 2010-11-20 22:59 .
    drwxr-xr-x 3 root root 3 2010-11-20 22:55
    -rw-r--r-- 1 root root 118144 2010-11-20 22:59 devices.txt
    $ du -ah /myzpool/myzdev/
    60K /myzpool/myzdev/devices.txt
    62K /myzpool/myzdev/
    $ sudo zfs get compressratio myzpool
    NAME PROPERTY VALUE SOURCE
    myzpool compressratio 1.55x -
    $最後,讓我們看看 ZFS 的自修復功能。請回想在您創建池時,您要求四個設備具有 RAID-Z。通過使用 zpool status 命令您可以檢查池的狀態, 如清單 5 所示。如清單所示,您可以看到池的元素(RAID-Z 1 以及四個設備)。
    清單 5. 檢查池狀態
    $ sudo zpool status myzpool
    pool: myzpool
    state: ONLINE
    scrub: none requested
    config:
    NAME STATE READ WRITE CKSUM
    myzpool ONLINE 0 0 0
    raidz1 ONLINE 0 0 0
    loop0 ONLINE 0 0 0
    loop1 ONLINE 0 0 0
    loop2 ONLINE 0 0 0
    loop3 ONLINE 0 0 0
    errors: No known data errors
 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最近发表

Powered By Z-Blog 1.8 Arwen Build 81206