hrt10の日記

色々な設定のメモやら何やら

sparse image での storage 保存

実験環境とかのストレージをイメージごと保存しておくときの作業用メモ

  1. 元ストレージの partition 情報の確認
    • lsblk -S
      lsblk
    • parted <デバイスファイル名>
      parted> unit s
      parted> print
      • ex)  parted /dev/sdc  とか (コピー元が sdc の場合) 
      • セクタサイズ(普通は 512B) とストレージと各 partition の大きさを確認
  2. 保存先に sparse image のファイルを作成
    • dd if=/dev/zero of=イメージファイル名 bs=512 seek=セクタ数 count=0
      • bs=512 はセクタサイズ↑のセクタサイズ(まぁ、普通512)
      • セクタ数は容量的に足りれば良いけど、どーせ sparse image なので元のストレージの総セクタ数かそれより大きくしときゃ良い
      • dd if=/dev/zeor of=node00.img bs=512 seek=536871000 count=0 で256GB くらいの node00.img というイメージファイルができる
      • ls -l node00.img と du -sh node00.img を見比べるとちゃんと spase になっているかどうか確認できる
  3. sparse image file を loopback device に紐付け
    • losetup -l
      • 使っていない loopback device を確認(次で -f で探させるなら跳ばしても良い)
    • losetup /dev/loopXX イメージファイル名
        または
      losetup -f イメージファイル名
      • losetup -l でデバイスとsparse image ファイルの対応を確認
      • これで /dev/loopXX がストレージの block device に見える
  4. ストレージの中身を全てコピー(使って無い…過去に一回使った…blockもコピー)
    • dd if=元のデバイス of=/dev/looopXX bs=512 conv=sparse  とか
      dd if=元のデバイス bs=512 | ssh コピー先ホスト 'dd of=/dev/loopXX bs=512 conv=sparse  とか
      ssh コピー元ホスト 'dd if=元のデバイス bs=512' | dd of='/dev/loopXX bs=512 conv=sparse'
      • ex) dd if=/dev/sdc of=/dev/loop10 bs=512 conv=sparse
      • ストレージ引っこ抜ければローカルコピーできるし、ダメなら ssh 越しとかですな
      • block レベルでまるごとコピーするので、基本的には partition table とかも移るはず。逆にコピー先の大きさは元ストレージと同じか大きく
      • この場合、dirty block が全て sparse image 中に block として復元されるので、df とかで見たファイルシステムの使用量より保存イメージの実際の大きさはかなり大きくなる(ので、5 の方法の方が普通は良い)
  5. ストレージの使っている部分をコピー(普通はこっち)
    • dd if=元のデバイス of=/dev/loopXX bs=512 count=パーティション1の開始オフセット
      • 一応、冒頭の(boot loader とか入っている?ところ)をコピー
      • 別に要らないなら(後から必要なら入れるなら)これは跳ばして良い
    • parted /dev/loopXX
      parted> unit s
      parted> mklabel gpt
      parted> mkpart  ... 
    • ls /dev/loopXX*   とかして、パーティションのデバイスができているか確認する。できてなければ losetup -d /dev/loopXX; losetup -P /dev/loopXX イメージファイル名 で再紐付け
    • block レベルで移して良いパーティションは 4 の手順で dd でコピーする。但し、デバイス名をパーティション番号付きのにすること。データだけ移したいパーティションは次の dump/restore で複製
      • ex) dd if=/dev/sdc1 of=/dev/loop10p1 bs=512
      • sparse mode にするかどうかは、パーティションの使用率とかみて好みで
    • mkfs.ext4 /dev/loopXpY  でファイルシステム作成
      • ex) mkfs.ext4 /dev/loop10p2
    • mount /dev/loopXpY 適当なディレクト
    • dump -0 -f - 元のパーティションのデバイス | (cd マウント先; restore -r -f -)
      • 必要に応じて ssh とかで転送してもよし(4 参照)