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
- RM の値が 1 のものが取り外し可能デバイスである。SIZE(容量)と合わせて,対象のデバイス名(例: sdb, sdc)を特定する。
- 指定するのはパーティション名(sdb1 など)ではなく,デバイス名(sdb など)である。パーティション名を指定すると,パーティションテーブルを含む全体のコピーにはならない。
- デバイス名の特定方法として,USB メモリの抜き差しの前後で lsblk を実行し,増減した行を確認する方法がある。
2. アンマウント
コピー中にファイルシステムが書き換えられることを防ぐため,コピー元とコピー先の USB メモリがマウントされている場合はアンマウントする。lsblk の MOUNTPOINTS 欄に表示があるパーティションがマウントされているパーティションである。(sdX1 は確認した実際のパーティション名に置き換える。)
sudo umount /dev/sdX1
アンマウント後に lsblk を実行し,MOUNTPOINTS 欄が空になっていることを確認する。
3. ddコマンドによるコピー実行
次のコマンドでコピーする。if=(コピー元)と of=(コピー先)のデバイス名を確認してから実行する。(sdX と sdY は確認した実際のデバイス名に置き換える。)
sudo dd if=/dev/sdX of=/dev/sdY bs=4M status=progress conv=fsync
- sudo: 管理者権限で実行する。デバイスファイルへの直接アクセスには管理者権限が必要である。
- dd: 指定したブロックサイズ単位でデータをコピーする。
- if=/dev/sdX: 入力元(コピー元)デバイス。
- of=/dev/sdY: 出力先(コピー先)デバイス。
- bs=4M: ブロックサイズを 4M バイトに設定する。既定値の 512 バイトに比べ,読み書きの回数が減る。
- status=progress: コピーの進行状況を表示する。
- conv=fsync: コピー終了時にデータをデバイスへ書き出し,その完了を待ってから dd を終了する。この指定がない場合,dd の終了時点ではデータがカーネルのキャッシュ上に残っていることがある。
コピーはコピー元デバイスの全セクタを対象とするため,データが記録されていない領域も含めて処理される。所要時間はコピー元の容量と転送速度で決まる。
4. コピー結果の確認
コピー元の容量分のデータが一致しているかを cmp コマンドで確認する。(sdX と sdY は確認した実際のデバイス名に置き換える。)
sudo cmp -n $(sudo blockdev --getsize64 /dev/sdX) /dev/sdX /dev/sdY
何も表示されずに終了した場合,コピー元の容量分のデータは一致している。差分がある場合は,最初に異なるバイトの位置が表示される。
5. 取り外し
書き込みが残っていないことを確認するため,sync コマンドを実行する。
sync
このコマンドは,カーネルのキャッシュ上にあるデータをデバイスへ書き出す処理の完了を待って終了する。実行後に USB メモリを取り外す。