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。

好吧, 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!

沒有留言:

張貼留言