Infra Engineer

入力から出力へのコピー~ddコマンド~
2022.10.31
Lv1

入力から出力へのコピー~ddコマンド~

本記事の対象者

LPIC level1習得を目指す初学者の方
コマンドの基本的な用途について、要点を絞って解説します。


今回の内容

今回は、ddコマンドについて解説します。
標準入力から標準出力へコピーするコマンドです。

・ddコマンド
・まとめ
・確認問題

ddコマンド

ddコマンドは、標準入力から標準出力へコピーするコマンドです。
入力や出力を指定することができ、ファイルからファイル、デバイスからファイル、デバイスからデバイスにコピーするなどの操作が可能です。
同様にコピーに関するコマンドとしてcpコマンドがありますが、こちらはファイルをコピーするコマンドです。
一方でddコマンドはブロックデバイスをコピーするコマンドです。ファイルシステムに関わりなく、デバイスファイル全体をコピーするなどの操作が可能です。

主な用途としては以下が挙げられます。

・デバイスのバックアップをする(デバイスからデバイスにコピーする)
・ディスクのイメージファイルを作成する
・指定したサイズのダミーファイルを作成する
・ディスクデータを消去する

dd
意味 標準入力から標準出力へコピーする。
書式 dd [オプション] …

ddコマンドの主なオプションは以下です。

オプション 説明
if=入力ファイル 入力ファイルを指定する。
of=出力ファイル 出力ファイルを指定する。
bs=バイト数 入出力のブロックサイズを指定する。
count=回数 指定した回数分入力ブロックをコピーする。

上記以外にも様々なオプションがありますが、LPIC-1でオプションが詳細に問われることはありませんので割愛します。

 

例①)
sample.txtをコピーする。(if、of)
[root@localhost sample]# ls
sample.txt
[root@localhost sample]# cat sample.txt
This is a sample.
[root@localhost sample]# dd if=sample.txt of=sample2.txt
0+1 レコード入力
0+1 レコード出力
18 バイト (18 B) コピーされました、 0.000131128 秒、 137 kB/秒
[root@localhost sample]# ls
sample.txt  sample2.txt

「if=」で入力ファイルを指定し、「of=」で出力ファイルを指定します。
コピー先のファイルが存在しない場合、新規にファイルが作成されます。
画面に実行記録が出力されています。
ddコマンドは標準入力から標準出力へコピーするコマンドであると最初に説明しました。
こちらでは出力先をsample2.txtに変更していますので、画面には標準出力は出ないはずです。
実はこの実行記録の部分はddコマンドの標準出力ではなく、「標準エラー出力」です。

 

例②)
/dev/sdaを/dev/sdbにコピーする。
[root@localhost ~]# dd if=/dev/sda of=/dev/sdb
41943040+0 レコード入力
41943040+0 レコード出力
21474836480 バイト (21 GB) コピーされました、 430.499 秒、 49.9 MB/秒

例①はddコマンドの主要な使用法ではありません。
単にファイルをコピーするならcpコマンドの方が使いやすいでしょう。
例②では、/dev/sdaに接続されたデバイスの内容をそのまま/dev/sdbに出力しています。
パーティションテーブル、ブートローダー、UUID、データなどデバイス全体をそのままコピーすることができます。
これはcpコマンドにはできないことです。

 

例③)
/dev/sda1のイメージファイルを作成する。
[root@localhost ~]# dd if=/dev/sda1 of=/root/sda1_image.img
2097152+0 レコード入力
2097152+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 6.08429 秒、 176 MB/秒

/dev/sda1 パーティションのイメージファイルを作成しています。

 

例④)
指定したサイズのダミーファイルを作成する。
[root@localhost ~]# dd if=/dev/zero of=/root/ddsample bs=1024 count=3
3+0 レコード入力
3+0 レコード出力
3072 バイト (3.1 kB) コピーされました、 0.00015491 秒、 19.8 MB/秒
[root@localhost ~]# od /root/ddsample
0000000 000000 000000 000000 000000 000000 000000 000000 000000

指定したサイズのダミーファイルを作成しています。
「bs=」で一度に読み書きするバイト数を指定し、「count=」で何回書き込むかを指定します。
よって「1024 × 3 = 3072バイト」コピーされているのが分かるかと思います。
入力で指定している「/dev/zero」についてですが、linuxにおける特殊なデバイスのひとつで、null文字(0x00)を出力し続けます。
できあがったファイルを見てみると、0で埋め尽くされているのが分かります。
ダミーファイルの作成はテストの際に重宝します。
例えば、ディスク容量が一定の閾値を超えた際にアラートが発生するような設定を作った際、それが正常に動作するか確かめたければ、これを用いて閾値を超えるファイルを作成すればよいというわけです。
注意としては、bsとcountを指定しないと、ファイルシステムいっぱいのサイズのファイルができあがるまで0で埋め尽くされてしまいます。

 

例⑤)
/dev/sdbのデータを完全に消去する。
[root@localhost ~]# dd if=/dev/zero of=/dev/sdb
dd: `/dev/sdb' に書き込み中です: デバイスに空き領域がありません
41943041+0 レコード入力
41943040+0 レコード出力
21474836480 バイト (21 GB) コピーされました、 563.94 秒、 38.1 MB/秒

/dev/zero を利用してデバイスファイルに書き込みを行うと、デバイスファイルがすべて0埋めされ、データが完全に消去されます。


まとめ

今回は、ddコマンドについて解説しました。
cpコマンドと同じこともできますが、基本的には上記であげたような用途で使用します。

他にも様々なオプションがありますし、bsとcountをどう調整したら実行が速くなるかなどの話もありますので、気になる方は調べてみてください。

最後に確認問題で今回の記事の知識を是非復習していってください。


確認問題

問題

「/dev/sda」の内容をパーティション情報等含めて「/dev/sdc」にコピーしたい。適切なコマンドはどれか。

A) dd in=/dev/sda out=/dev/sdc
B) dd of=/dev/sda if=/dev/sdc
C) dd /dev/sda /dev/sdc
D) dd if=/dev/sda of=/dev/sdc

解答
答え:D

ddコマンドは「if=」で入力ファイルを指定し、「of=」で出力ファイルを指定します。
デバイスファイルの内容をそのまま複製することができます。

Linux資格 「LPIC Lv1」徹底解説 連載目次リンク

Linux資格 「LPIC Lv1」徹底解説 連載目次

連載執筆講師が講座開講中!ITスクール SAK

ITスクールSAK | LPIC Lv1合格保証コース 講座紹介ページ