助け合いフォーラム

LPIC

LPIC Lv1-101(Ver5.0)
問題ID : 3657
問題を開く
10Kバイトのサイズを指定してファイルを作成したい。適切なコマンドは次のうちどれか。

正解

dd

解説

ddコマンドは、入力元から決まった大きさのデータ(ブロック)を読み込み、出力先に書き込むコマンドです。主に次の指定を使います。
・if:入力元のファイル
・of:出力先のファイル
・bs:1回に読み書きするブロックの大きさ(ブロックサイズ)
・count:ブロックを読み書きする回数
作成されるファイルの大きさは、ブロックサイズ×回数になります。
入力元(if)に「/dev/zero」を指定すると、全データが0のファイルを作成できます。「/dev/zero」は、読み出すと値が0のデータを返し続ける特殊なファイルです。
cpコマンドは既存のファイルを複製するコマンドなので、ddコマンドのように大きさを指定してファイルを作成することはできません。

したがって正解は
・dd
です。

以下は実行例です。

実行例では、出力先(of)に「file1」を指定し、10Kバイトのブロックを1回(bs=10K count=1)書き込んでいます。1Kバイトは1024バイトなので、10Kバイトは10240バイトです。「1+0 レコード入力」「1+0 レコード出力」は、ブロック1個分を読み込み、書き込んだことを表しています。「ls -l」で確かめると、「file1」の大きさは10240バイトになっています。

ddコマンドはファイルシステムやディスク単位でのバックアップ時にも利用します。
例えば、「/dev/sda」から「/dev/sdb」へデータを丸ごとコピーする場合は以下のようにします。
例) dd if=/dev/sda of=/dev/sdb
「/dev/sda」「/dev/sdb」は、ディスクを表すデバイスファイルです。出力先のデータは上書きされて失われるので、指定を間違えないように注意してください。

その他の選択肢については以下のとおりです。
・cp
cpは既存のファイルを複製するコマンドで、作成するファイルの大きさを指定できません。

・file
ファイルの種類を特定するための情報を参照してファイルの種別を表示するコマンドです。

・vi
viはLinuxで標準的に使用されているテキストエディタを起動するコマンドで、サイズを指定できません。

・mkfile
存在しないコマンドです。
上に戻る

コピーなのに作成というのがよく分かりません

投稿日 2025/10/18

ddコマンドはコピーするコマンドということですが、それで何故作成する、という説明になるのかよく分かりません。コピーされたものが「作成された」ということになりますか?

2025/10/19 20:45

作成するのはサイズを指定したファイルであって、コピーすることが本質ではないですね。
そして、「存在しないファイルを、元となるものをコピーすることで作成する」ことで設問の要件を満たしているので、特に不自然な説明をしているわけではないかと思います。

ただ、この設問で重要なのは

10Kバイトのサイズを指定してファイルを作成

なんですよね。ただ単にコピーするだけだったらサイズ指定はできないので、dd を使うことが求められているって話ですね。
例えば、 /etc/passwd を dd でコピーするとちゃんと同じものができることがわかります。(sha1sum の出力は環境によって変わりますが、コピー元とコピー先が一致するという点は変わりません)

$ ls -l /etc/passwd
-rw-r--r-- 1 root root 1882 Jun 27 12:01 /etc/passwd
$ dd if=/etc/passwd of=testfile
3+1 records in
3+1 records out
1882 bytes (1.9 kB, 1.8 KiB) copied, 8.0042e-05 s, 23.5 MB/s
$ sha1sum /etc/passwd
7e88355028ec7d47982697a727bedb8f2fbe473a  /etc/passwd
$ sha1sum testfile
7e88355028ec7d47982697a727bedb8f2fbe473a  testfile

でも、これだとファイルをコピーした(testfile というファイルを作成した)だけであって、指定されたサイズにはなってないんですよね。なので、dd によって、元データから指定したサイズを指定した回数分読み込んでファイルとして出力(作成)する、といった作業が求められているんですね。

$ dd if=/dev/zero of=10kfile bs=1k count=10
10+0 records in
10+0 records out
10240 bytes (10 kB, 10 KiB) copied, 0.000217064 s, 47.2 MB/s
$ ls -l 10kfile
-rw-rw-r-- 1 user user 10240 Oct 19 20:39 10kfile


コメント

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?