2017年7月23日 星期日

32 bit linux 不支援 zfs 但還是可以享用 snapshot 快照

這幾天鐵齒之後學到的慘痛經驗, 很快筆記分享一下。 我試著要裝 32 bit (lubuntu-*-i386.iso), 並加裝 zfs 驅動程式。 官網 跟安裝畫面就已經警告說 zfs 大量使用 virtual memory, 所以在 32 bit 環境上會很不穩, 可是我就是鐵齒又有 OS 蒐集癖、 就是想要 把它的根目錄放進 zfs 裡面去。 裝完之後, 用 kvm 開機測試, 通過 initramfs, 甚至已經掛載位於 zfs 的根目錄, 所有服務也都一一漂亮地 [ok] 啟動, 然後就卡在進不了圖形介面, 甚至連 ctrl-alt-f2 等等終端機也叫不出來了。 就死當, 很徹底。 隔沒多久, host 的 root 帳號就收到 mail, 說 zfs 的 checksum error -- 我猜那一個 zpool 應該整個毀了。 還好當時有刻意先開一個新的 zpool 來測試, 沒牽連到原先已裝好的其他 64 bit 版 lubuntu。

[2020/01/11 Linus Torvalds建議不要使用ZFS (考量法律與 Oracle 興訟的習性)]

好吧, 32 bit 的 linux 不能安裝 zfs 驅動程式; 但是它還是可以享用 zfs 的快照功能 -- 用 qemu-kvm。 在 64 bit、 支援 zfs 的 host 上面, 假設已有一個名為 tank 的 zpool。

  1. 建立一個 12G 的 zvol: zfs create -V 12G tank/ROOT/xenial32
  2. 用 qemu-kvm 把 32 bit 的 lubuntu 16.04 裝到第二顆硬碟或隨身碟或一個 lvm volume 去。
  3. 參考 隨遇而安四海為家的 linux, 用 fsarchiver 把剛裝好的 32 bit 備份起來, 再把它還原到 /dev/zvol/tank/ROOT/xenial32 去。
  4. 馬上建立一個快照: zfs snapshot tank/ROOT/xenial32@0-pristine
  5. 從這個 32 bit 版的 lubuntu 的 /boot 底下, 把 vmlinuz* 跟 initrd.img* 複製出來。
  6. 這個裝在 zfs 裡面的 32 bit linux 無法真的自己從硬體開機; 不過 qemu-kvm 可以啟動單一分割mykvm -kernel vmlinuz* -initrd initrd.img* -append 'root=/dev/sda' /dev/zvol/tank/ROOT/xenial32 或是在那個 zvol 裡面安裝某個開機管理員, 那麼命令列上的三個選項就可以直接省略。 至少還可以在 qemu-kvm 虛擬機裡面、 在 zfs 上面玩 32 bit 的 linux, 然後不時從 host 用 zfs snapshot 指令建快照。 Yeah!

[8/2 補充] 幫一個 zvol 建立 snapshot 之後, 該如何查看它的內容呢? 要先設定: zfs set snapdev=visible tank/ROOT/xenial32 然後在 /dev/zvol/tank/ROOT/ 底下, 原先的 xenial32 旁邊, 會出現每個 snapshot 的名字。 於是就可以用 read-only 的方式掛載這些裝置, 例如: mount -o ro /dev/zvol/tank/ROOT/xenial32@0-pristine /mnt/t2

[11/21 補充] 有了 snapshots 之後, 可以這樣備份: zfs send -R tank/ROOT/xenial32@0-pristine | gzip > xenial32@0-pristine.zsnap.gz 然後拿到另一個 zpool (叫做 reservoir 好了) 這樣還原: zcat xenial32@0-pristine.zsnap.gz | zfs receive -d -Fu reservoir。 重要! 不可以用 zfs receive -e ...! 用 -e 的話, 會看不見 snapshots, 而且更可怕的是會讓整個 zpool 變得怪怪的, 好像跟 這個 bug 有關。 用 zfs receive 還原 zvol 時, 不可以用 -e, 一定要用 -d!

[2018/1/20 補充] 最近發現 zfs 的 snapshot 好浪費空間, 讀了 zfs 進階用戶的文章 之後, 才突然領悟 zvol 的空間計算方式。 配置空間時, 不要考慮 snapshot; 單純從上層使用者的需求來看就好。 例如 zfs create -V 12G ... 之後, 上層就可以安心地拿它去建立一個 12G 的 ext4 檔案系統。 之後在做 zfs send 時, 原始配置的空間 (12G) 即使有一大部分都是沒有意義的亂碼, 也還是一定會全額被當成是資料備好備滿。 建了 snapshot 之後, 使用的空間會疊加上去, 例如 snapshot 佔掉了 3G 的空間, 那麼整個 zvol 總共會佔用 15G 的空間。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。