ddコマンドによるUSBメモリの完全コピー

Linux の dd コマンドで USB メモリ全体をコピー(クローン)する方法を説明する。パーティションテーブル,パーティション,ファイルシステムを含む全セクタがコピーされる。

dd コマンドは,指定したデバイスの内容を確認なしに上書きする。コピー先(of=)に指定したデバイスのデータは失われる。システムディスクを指定した場合はシステムが起動しなくなる。事故を避けるため,次の手順の「1. デバイス名の確認」を実行し,コピー元とコピー先のデバイス名を確認してからコマンドを実行する。

コピー先の USB メモリの容量は,コピー元と同じかそれ以上である必要がある。コピー先の容量が小さい場合,コピーは途中で失敗する。

1. デバイス名の確認

コピー元とコピー先の USB デバイス名を確認する。

USB メモリを接続し,ターミナルで次を実行する。

lsblk

出力例:

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   1.9T  0 disk
├─sda1
│             8:1    0   512M  0 part /boot/efi
└─sda2
              8:2    0   1.9T  0 part /var/ubuntu2204/tmp
                                /var/snap/firefox/common/host-hunspell
                                /
sdb           8:16   1  14.9G  0 disk  <-- 例: コピー元USB
└─sdb1        8:17   1  14.9G  0 part /media/user/USB_SOURCE
sdc           8:32   1  29.8G  0 disk  <-- 例: コピー先USB

2. アンマウント

コピー中にファイルシステムが書き換えられることを防ぐため,コピー元とコピー先の USB メモリがマウントされている場合はアンマウントする。lsblk の MOUNTPOINTS 欄に表示があるパーティションがマウントされているパーティションである。(sdX1 は確認した実際のパーティション名に置き換える。)

sudo umount /dev/sdX1

アンマウント後に lsblk を実行し,MOUNTPOINTS 欄が空になっていることを確認する。

3. ddコマンドによるコピー実行

次のコマンドでコピーする。if=(コピー元)と of=(コピー先)のデバイス名を確認してから実行する。(sdXsdY は確認した実際のデバイス名に置き換える。)

sudo dd if=/dev/sdX of=/dev/sdY bs=4M status=progress conv=fsync

コピーはコピー元デバイスの全セクタを対象とするため,データが記録されていない領域も含めて処理される。所要時間はコピー元の容量と転送速度で決まる。

4. コピー結果の確認

コピー元の容量分のデータが一致しているかを cmp コマンドで確認する。(sdXsdY は確認した実際のデバイス名に置き換える。)

sudo cmp -n $(sudo blockdev --getsize64 /dev/sdX) /dev/sdX /dev/sdY

何も表示されずに終了した場合,コピー元の容量分のデータは一致している。差分がある場合は,最初に異なるバイトの位置が表示される。

5. 取り外し

書き込みが残っていないことを確認するため,sync コマンドを実行する。

sync

このコマンドは,カーネルのキャッシュ上にあるデータをデバイスへ書き出す処理の完了を待って終了する。実行後に USB メモリを取り外す。