使い方Alexaにはまりました。近いうちに記事を書きますね。【概要】Linuxを用いたクローンディスクの作り方について説明します。ディスククローンには、dd、gdisk、gpartedの3つのコマンドを用います。それぞれの使い方や注意事項についてまとめます。はじめに容量拡大のためにディスクのクローンを作成したり、SSD換装のために容量が小さなクローンディスクを作成したい場合があります。本稿では、これらをLinuxを用いて実現する方法について説明します。クローンディスクの作成クローンディスクの作成には、主に次の3つのケースがあります。ミラーリング:ディスクパーティションの大きさを変更せずにコピーする。拡張:サイズが大きなディスクに移し替える。縮小:サイズが小さなディスクに移し替える。それぞれのケースのクローンの作成について説明します。記事では、次のデバイス名を使っています。/dev/sdS:オリジナルのディスク/dev/sdT:クローン化するターゲットディスク/dev/sdW:作業用のディスクマシン環境に合わせて、適宜、/dev/sdbや/dev/sdcと読み替えてください。作成されていることを前提としてます。系のOSであれば、ほとんど同じパッケージ名でインストールできると思います。インストール済のはずですので通常は指定不要です。gdisk、ntfs-3g、gpartedなども、他のパッケージと同時にインストールされる場合があります。情報などを見ることができて、ディスク管理に便利なコマンドです。partedpartedでもパーティションテーブルを編集できますが、基本的には用いません。方が分かりやすいです。parted例えば、次のオプションでパーティションの種類を確認できます。MBR(マスターブートレコード)です。ディスクのプロパティを開き、「ボリューム」タブの「パーティションのスタイル」が「GUIDパーティションテーブル(GPT)」であることを確認します。MBRの場合には「マスターブートレコード(MBR)」と表示されます。つけて実行するか、rootにログインして実行します。使うことが一般的です。WindowsのシャットダウンWindowsのディスクは、完全シャットダウンを行うこと*1。完全シャットダウンをしていないntfsパーティションをLinuxではリサイズを行うことはできません。マウントもリードオンリーです。Windowsシステムが入ったディスクでも、外付けディスクとして別のWindowsマシンに接続して、完全シャットダウンしても大丈夫です。今回の方法は、簡単な方法ですが、ある意味、乱暴な方法です。ディスクの末尾のパーティションテーブルを正しく取り扱っていません。ディスクに残った以前のGPTテーブルが悪さをするかもしれません。このため、ターゲットディスク・作業用ディスクを完全に初期化しておいた方が安心です(たぶん、不必要とは思いますが、ディスクを使いまわすときの習慣でいつもshredしているので、念のため書いておきます)。/dev/sdWこのコマンドで、ディスクの全セクタを0値に初期化します(非常に時間がかかります。2TBで丸一日ぐらい)。本稿で用いた方法は、loopデバイスを用いて検証しています。この検証のためのデータは、次のように作成しています。0値で埋まったファイルを作成し、loopデバイスと紐づけする。loopデバイスの使い方は、以前の記事。sdW:100MiBsdT1:80MiBsdT2:100MiBsdT3:120MiBsdSのファイルシステムとパーティションサイズ:part1:FAT16(30MiB)FAT16としたのは、容量が小さすぎて、FAT32では作成できなかったため。part2:NTFS(30MiB)part3:ext4(30MiB)未割り当て(10MiB)sdSに収めるデータ。ファイルがある領域とない領域が交互に現れるようにファイルを作成。未使用領域と同じサイズの乱数を書き込んだファイルを作成、直ぐに削除する。異なる乱数の1MiBのファイルで、ファイルシステムを満たす。10個のファイルの(10MiB)を残し、それ以外は削除する。ミラーリングする場合パーティションサイズを変更せず、そのままの構成を保つ場合です。同一サイズのディスクへコピーする場合オリジナルのディスクと全く同一のセクター数を持つディスクを使う場合です。ターゲットディスクへのコピーddコマンドを用いてディスクをコピーします。of=/dev/sdT但し、例えば、同じ1TBのディスクといっても、セクタ数が同じとは限りません(違うと思っていた方がよいです)。同じブランド、同じ型番の商品を同時期に購入すれば、一致する可能性は高いですが、それでも、異なることがあるかもしれません。丸ごとディスクコピーできます。大きなディスクへコピーする場合オリジナルのディスクよりも大きいセクター数を持つディスクへコピーする場合です。余分なセクタは使用せず、未割り当てのままとします。ターゲットディスクのGPTテーブルの修正GPTテーブルでは、第2GPTテーブル(バックアップGPTテーブルともいう。内容は第1GPTテーブルと同一)がディスク末尾のセクタに配置されなければなりません。GPTテーブルの仕様に準拠しません。この状態で、gnome-disksでディスクを見ると、余分なセクタ部分が見えない状態となっています。余分なセクタ部分を未割り当てのままとして使用しないのなら、修正する必要はないのかもしれません。gpartedでは、GPTテーブルの位置不正を自動的に検知します。修正することも可能です。この問題を修正するために、gdiskを用いて、次のように第2GPTテーブルをディスク末尾に移動させます。/dev/sdTgdsikでは、GPTテーブルを新規に作り直したり、パーティションを作成・削除できます。これらの操作を行ってはなりません。これらの操作は、ディスクやパーティションにつけられたGUID/UUIDを変更してしまうからです。GUID/UUIDを変更すると、ディスク内のシステムがGUID/UUIDを参照していれば、問題が発生する可能性があります。ディスクマウント定義でUUIDを用いることがあります。この場合、UUIDを変更すれば、対象のパーティションはマウントされなくなります。起動に関連するファイルシステムは、リサイズ・移動をしない方がよいでしょう。Linuxの場合、grubが起動イメージの配置をセクタで管理しています。パーティションをリサイズ・移動した場合には、起動イメージの配置されるセクタが変更される可能性があります。コンフィギュレーションを修正します。作業の最初に、必ず、GPTテーブルのバックアップを取ること。"p"(テーブルの表示)、"v"(検証)を行い、状況を把握すること。オリジナルディスクとターゲットディスクのパーティションの一致を確認すること。コマンドw(GPTテーブルをディスクへ書込んで終了)は、慎重に。パーティション変更後は、partprobeを実行すること。ディスクを拡張する場合サイズが大きなディスクに移し替える場合です。この場合、GPTテーブルの修正に加えて、パーティションの移動・拡大を行う必要があります。ターゲットディスクのGPTテーブルの修正ミラーリングの場合と同様に、gdiskで第2GPTテーブルをディスク末尾に配置します。ターゲットディスクのパーティションの拡大gpartedを用いて、パーティションの拡大を行います。今回は、それぞれ30MiBのfat16、ntfs、ext4のパーティションサイズを10MiB増加させて、40MiBにします。当初のパーティション構成。ターゲットのデバイス名は/dev/loop1。ディスクの末尾側のパーティション(/dev/loop1p3)をリサイズ・移動を指定する。「パーティション(P)」→「リサイズ/移動(R)」を選択し、前後の空き領域やサイズを指定し、「リサイズ/移動」をクリックする。前後の空き領域・サイズを指定する。ブートに失敗するかもね、と警告される。前方に19MB、後方に1MBの空き領域ができ、サイズも19MBとなる。リサイズパラメータの指定画面で「位置合わせ」を「なし」とすると、後方の空き領域をなくすことができる。同様に、ntfs、fat16の領域もリサイズ・移動の指定を行う。パーティション間に隙間ができてしまった。リサイズ・アライメントすれば、パーティション間には隙間はできないはずだが、なぜか今回は隙間ができた。アライメント調整をなしにして、隙間を埋めた。リサイズ・移動を実行する。「編集(E)」→「保留中の全ての操作を適用する(A)」をクリックして、リサイズ・縮小処理を実行します。今回の設定での検証実験では、ext4のパーティションの拡大に失敗し、エラーが発生しています。エラーを知らせるポップアップ。末尾のパーティションext4の拡大でエラーが発生。末尾のパーティション(ext4)の拡大に失敗していますが、それ以外は問題ありません。この失敗も、パーティションの拡大がディスク末尾の第2GPTテーブルを上書きする不正な要求だったためです。エラー判定されますが、チェック段階で不正と判定されているため、最後の処理は実行されていません。最初のパーティション(fat16)と最後のパーティション(ext4)が1MiB足りず、計2MiB足りませんが、それぞれ、第1GPTテーブル、第2GPTテーブルが配置されている領域にはパーティションが拡張できないためです。リサイズ・移動後の最終的なパーティション構成。拡大前後のパーティション構成の詳細パーティションの拡大前後におけるgdiskのパーティション情報は、以下の通りです。filesystemディスク内容の確認ディスクの内容を確認します。今回は、それぞれのパーティションに入れた10個のファイル(乱数を書き込んだ1MiBのファイル)について、cmpやdiffコマンドを用いてバイナリーレベルで一致を確認しました。ディスクを縮小する場合サイズが小さなディスクに移し替える場合です。オリジナルディスクの使用量は、ターゲットディスクよりも小さくなければならないことは言うまでもありませんが、ディスクパーティションも小さくしておく必要があります。このディスクパーティションの縮小には、初めにオリジナルディスクで行う場合と作業ディスクで行う場合とがあります。前者であれば、作業ディスクは不要です。作業の開始前に、必ずオリジナルディスクのバックアップを取っておきます。オリジナルディスクのパーティションの縮小・移動ディスク拡大の場合と同様に、gpartedを用いてパーティションを縮小します。ここでは、それぞれのパーティションを20MiBに縮小し計80MiBにしようと思いましたが、gpartedはfat16の縮小には対応してなかったので*3、ntfs、ext4のパーティションのみを20MBに縮小します。fat32であれば、縮小にも対応しています。/dev/sdS縮小後のオリジナルディスクのパーティション。第2GPTテーブルをディスク末尾に配置しますので、ターゲットディスクの末尾に少なくとも1MiBの未割り当ての領域を確保しておく必要があります。Windowsの場合Windowsの機能を用いて、パーティションのリサイズができます。具体的な操作方法は、例えば、次の記事に解説があります。Search|エプソンダイレクト実際には、「ディスクの管理」では、空きがあるにも関わらず、縮小できない場合があるようです*4。ターゲットディスクへのコピーオリジナルディスクをターゲットディスクへコピーします。MB/sターゲットディスクよりも大きい部分のデータはコピーされません。メッセージとともに、ddは終了します。ターゲットディスクのGPTテーブルの修正ミラーリングの場合と同様に、gdiskで第2GPTテーブルをディスク末尾に配置します。/dev/sdTこれは、前述したgdiskによるGPTテーブルの末尾への移動の場合と同じコマンドです。今回は、第2GPTテーブルが存在しないため、ディスク末尾に新たに第2GPTテーブルが作成されます。gdiskコマンド実行中に、ディスクサイズが小さい、第2GPTテーブルが破壊されている等の警告メッセージが現れます。クローンでの最終的なパーティション構成。この例では、80MiBのディスクへ縮小。ディスク内容の確認mountを行い、オリジナルディスクの内容とターゲットディスクの内容が一致するか、例えば、cmpコマンドやdiffコマンドを用いて確認します。作業ディスクでパーティションを縮小する場合オリジナルディスクを作業ディスクにコピー後、作業ディスクのパーティションを縮小、ターゲットディスクに書き込みます。作業ディスクへのコピーオリジナルディスクを作業ディスクにコピーします。作業ディスクのGPTテーブルの修正gdiskを用いて作業ディスクの第2GPTテーブルをディスク末尾に配置します。作業ディスクのパーティションの縮小・移動gpartedを用いて前述と同様に作業ディスクのパーティションを縮小・移動します。ターゲットディスクの末尾に少なくとも1MiBの未割り当ての領域できるように作業ディスクの末尾の未割り当て領域を調整します。作業ディスクの内容をターゲットディスクにコピーddによって作業ディスクの内容をターゲットディスクにコピーします。of=/dev/sdT作業ディスクよりもターゲットディスクの容量が小さいので、警告メッセージがでますが、意図通りの動作です。ターゲットディスクのGPTテーブルの修正gdiskでコマンドeを実行すると、ディスク末尾に第2GPTテーブルが新規に作成されます。ディスク内容の確認mountを行い、オリジナルディスクの内容とターゲットディスクの内容が一致するか、例えば、cmpコマンドやdiffコマンドを用いて確認します。まとめ今回は、Linuxにおけるクローンディスクの作り方について、リサイズする場合も含めて説明しました。今回説明した方法で、データが一致することは確認できました。この方法では、次のような点が原因となって不具合が発生するかもしれません。直接セクター配置によってアクセスするプログラムがある場合。ブートに関連するプログラムには、このようなプログラムがあります。このため、システムディスクの起動関連のパーティションについては、リサイズ・移動をしない方が安心です。ディスクのハードディスク情報を用いて動作している場合システムは、ハードディスクのシリンダー数やヘッド数、SSDなどの情報を用いています。これらの情報が誤っていれば、システムの動作に影響を与えるかもしれません。ハードディスクにセキュリティ対策が施されている場合ハードウェアレベルでディスクに暗号化がかかっているのであれば、ディスクの中身を知ることはできませんので、パーティション変更等はできません。ミラーリングなどもできないようにセキュリティ保護される場合もあると思います。クローンディスクができたとしても、セキュアブートの設定を変更する必要があるかもしれません。システムディスクの場合、様々なトラブルに見舞われる可能性がありますので、オリジナルのディスクはそのままの状態で一切変更を加えずに、丸ごとコピーしたディスクをオリジナルディスクと見立てて、作業するとよいと思います。(最新)|オンラインコード版イーフロンティアディスクのクローンにも対応。0"*2:gdiskでアライメント単位を変更することができるようなので、それを変更すれば、gpartedのアライメントの単位も変わるのかもしれません(未確認)。*3:gpartedがサポートしているファイルシステムは、「表示」→「サポートするファイルシステム(F)」から確認できます。これによれば、fat16の縮小にも対応しているはずですが、一定以上のファイルサイズであることなどの条件があるのかもしれません。楽天ROOMにガジェットをまとめてます。グレイテスト・ショーマン心温まるミュージカル。