volsize を変えたらディスクが読めなくなった件

ただのメモ。

自宅の Solaris 11 (snv_151a) の zvol を target として iMac の globalSAN の iSCSI initiator から使っていたディスクが、volsize を変えたら「パーティションが壊れている」と言われる用になってしまった件が解決した。

zpool の構成を変えてテストしようと思い、zvol を zfs send でいったん別のディスクに退避させたい。実際に書き込んだデータのサイズに対して zvol 自体がすごい容量になっていたので、 volsize いじって小さくしようとしました。ところが、 initiator 側ではこの LU に HFS+ を書いていたので、 zfs と違って容量の変化なんて理解できないのでした。

状況

  • さいしょ
% sudo zfs create -V 1T tank/test
% sudo stmfadm create-lu /dev/zvol/rdsk/tank/test
  • volsize いじって退避 (書き込んだデータは 100G もない)
% sudo zfs set volsize=100G tank/test
% sudo zfs set refreservations=100G tank/test
% sudo zfs snapshot tank/test@aho
% sudo zfs send tank/test@aho > どっか
  • tank を作りなおして書き戻す
% sudo zfs receive -v -d tank < どっか
% sudo stmfadm create-lu /dev/zvol/rdsk/tank/test

ところが mac が認識できないよ、消すか eject するかどうする? みたく聞いてくるんですね。

対処法

で、どうすればいいのかというと、単に volsize を戻すだけです。

% sudo zfs set volsize=1T tank/test

メモとしては以下。

  • 違いよくわかってないけど、lu を戻すときは stmfadm create-lu で新規作成っぽいのじゃなくて import-lu しておくと気持ち安心かも
  • そもそもろくに考えずに大きな zvol つくるんなら zfs create -s -V 1T しておけ
  • ちなみに Mac からフォーマットすると GPT になってるように見えるが、 GNU Parted 2.3 で適当に print したらこけました。
    • parted が悪いのかどうかは調べてないです。
ichii386@elmo-debian% sudo parted /dev/sdb
GNU Parted 2.3
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Error: The backup GPT table is corrupt, but the primary appears OK, so that will be used.
OK/Cancel? o
Warning: Not all of the space available to /dev/sdb appears to be used, you can fix the GPT to
use all of the space (an extra 1098907648 blocks) or continue with the current setting?
Fix/Ignore? i
Backtrace has 12 calls on stack:
  12: /lib/libparted.so.0(ped_assert+0x31) [0x7f92e3e50351]
  11: /lib/libparted.so.0(ped_geometry_read+0x80) [0x7f92e3e57d70]
  10: /lib/libparted.so.0(hfsplus_probe+0x247) [0x7f92e3e6eb47]
  9: /lib/libparted.so.0(ped_file_system_probe_specific+0x5c) [0x7f92e3e5192c]
  8: /lib/libparted.so.0(ped_file_system_probe+0xab) [0x7f92e3e51edb]
  7: /lib/libparted.so.0(+0x442cf) [0x7f92e3e812cf]
  6: /lib/libparted.so.0(ped_disk_new+0x75) [0x7f92e3e57505]
  5: parted() [0x4070de]
  4: parted(interactive_mode+0xf3) [0x40e183]
  3: parted(main+0x8f) [0x40b1df]
  2: /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xfd) [0x7f92e364bead]
  1: parted() [0x405709]