2018年1月4日木曜日

ディスクサイズの大きい HDD 等からディスクサイズの小さい SSD 等への Linux クローン

どうしてもうまく行かない理由が分からないので検証内容のメモ。
500GB 程度の HDD に Linux システムがインストールされている状況で、
256GB 程度の SSD に換装してディスク I/O 性能を上げたい場合の話。
HDD の内容を SSD へクローンして SSD 側からシステムを立ち上げて
元々の HDD はフォーマットしてデータ領域にでもしようとしてなかなかうまく行かない。

前提条件

  • クローン元は /dev/sda1, /dev/sda2, /dev/sda3
    • /dev/sda1 に /, /dev/sda2 に /home, /dev/sda3 は Swap
    • パーティションサイズは大きいが、実際に使用している容量はごくわずかだと仮定
  • クローン先は特にパーティションは存在しない状態
    • /dev/sdb として認識していると仮定
手順

  • クローン元、クローン先をそれぞれパソコンへ接続した状態にする
  • 適当な Linux Live USB とかを起動する(一時作業用 Linux 環境)
  • クローン先の /dev/sdb へ好みのサイズでパーティションを3つ切る
    • /dev/sdb1(/), /dev/sdb2(/home),/dev/sdb3(Swap)
    • /dev/sdb1 は Boot Partition なので、boot flag をセットする(fdisk の a コマンド)
  • partclone でそれぞれのパーティションをクローンする
    • クローン元のパーティションサイズがクローン先より大きいとエラーになる
    • partclone -C オプションでサイズチェックを無視してもエラーで死ぬ
      • そのため、resize2fs でクローン元のファイルシステムをクローン先パーティションより予め小さくしておく
        • # resize2fs -p /dev/sda1 20G
        • # resize2fs -p /dev/sda2 90G
    • # partclone -b -s /dev/sda1 -o /dev/sdb1
    • # partclone -b -s /dev/sda2 -o /dev/sdb2
  • パーティションテーブルを除くブートローダをクローンする
    • # dd if=/dev/sda of=/dev/sdb bs=446 count=1
上記で、/dev/sda の内容が /dev/sdb へ完全にクローンされたはず。
実際にクローン先ディスクのパーティション /dev/sdb1, /dev/sdb2 をそれぞれマウント
して確認してみると、正しくマウントできて中身が見える。
元のシステムでは /etc/fstab のマウントの指定は、すべて UUID ベースでしており
partclone でクローンしたパーティションは例えサイズが異なっていても UUID は同じ値を
保持している為、このまま起動するとどちらのデバイスから上がるか予測できないので
クローン元ディスクを一旦取り外す。
その後、クローン先ディスクのみの状態にしてから起動してみるのだが、
  • Verifying DMI Pool Data ...
と表示され、全く起動してくれない。
なぜうまく行かないのかさっぱりわからない。
どなたかもし上記の検証内容を見て問題点に心当たりがある方はコメント頂ければ幸いです。

英語キーワード検索用: Clone Larger Disk to Smaller