【Linux】任意のサイズのダミーファイル作成方法|ddコマンド

Linux

とあるシステム開発の結合試験でディスクフル時の挙動確認を行うため、
ディスク使用率が90%以上」の環境を用意する必要がありました。

ディスク使用量がすでに逼迫している環境であれば、比較的容易に条件をクリアできます。
それはそれで、どうなんだという感じも否めないですが……。

しかし、ディスクに十分な空き容量がある環境では、
効率的な増やし方を知らないと、相当な手間と時間がかかります。

実際、筆者は最初、大きめなサイズの不要ファイルを手作業で複製していましたが、
目標のディスク使用率に到達するまで複製と確認を何度も繰り返す必要があり、
ディスク使用率の調整に時間がかかる上、試験後の増やしたファイルの後片付けも面倒でした。

このように、試験効率の低下は明白であり、サクッとできるならそれに越したことはありません。

かけりゅー
かけりゅー

そこで本記事では、ddコマンドを使って任意サイズのダミーファイルを作成し、
短時間でディスク使用率を調整する方法について紹介します。

ddコマンドとは

ddコマンドは、ファイルやデバイスをブロック単位で読み書きするコマンドで、
主にディスク操作やバックアップを作成するときなどに使用します。

指定したブロックサイズとブロック数の分だけデータを書き込めるという特性があり、
本記事ではこれを応用して、ディスク使用率を調整するためのダミーファイル作成に利用します。

dd if=入力ファイル of=出力ファイル bs=ブロックサイズ count=コピーするブロック数
  • if:コピー元のデータ
  • of:ddコマンド実行後に作成される出力ファイル名
  • bs:1回あたりの読み書きサイズ(ブロックサイズ)
  • countbsを何回繰り返すか

bs × count が、作成するファイルの合計サイズになります。

ddコマンドでダミーファイルを作成する

ダミーファイルの作成手順

実際の試験を想定して、ディスク使用率が90%以上となるようダミーファイルを作成します。

はじめに、ディスク使用率を増やしたい環境で、現在のディスク使用率を確認します。

$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   33G   17G   66% /

上記の場合、全体50GBのうち33GB(ディスク使用率66%)が使用中とわかります。

このディスク使用率を90%以上にするため、12GBのダミーファイルを作成します。
ダミーファイルを配置したいディレクトリに移動し、次のようにコマンドを実行します。

$ dd if=/dev/zero of=dummy_01 bs=1M count=12000
12000+0 records in
12000+0 records out
12582912000 bytes (13 GB, 12 GiB) copied, 98.7 s, 127 MB/s

if=/dev/zero は、常にNull文字(\0)を返す特殊なファイルで、
of=dummy_01 は、ddコマンド実行後に作成されるファイル名です。

ダミーファイルのファイル名には、
“dummy_”のように専用の接頭辞をつけると管理がしやすくなります。

実行結果には 13 GB, 12 GiB と表示されますが、
これは単位の換算方法(10進数か2進数か)による表記の違いです。

上記のコマンドを実行した場合、
bs=1M(1ブロックあたり1MB)× count=12000(12000ブロック分)= 12000MB(12GB)
のダミーファイルが作成されます。

ダミーファイルの作成後、再度 df -h でディスク使用率を確認します。

$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   45G    5G   90% /

目標の使用率に届いていない場合は、countの値を調整して再度ダミーファイルを作成します。
(例:dummy_02 として2つ目のファイルを追加作成)

ダミーファイル作成におけるbsの値の決め方

bsに指定する値を大きくすると、1回あたりの処理データ量が増えるため、
書き込みが高速になりますが、その分メモリ使用量も増加します。

数百MB~数GB程度のダミーファイルであれば、bs=1M(1MBずつ)で十分ですが、
数十GB単位の大きなファイルを作る場合は bs=64Mbs=1G のように、
大きめの値を設定することで処理時間を短縮できます。

逆に、書き込み速度をあえて抑えて他プロセスへの影響を減らしたい場合は、
bs を小さくして調整します。

試験後の後片付け(ダミーファイルの削除)

作成したダミーファイルは、試験終了後に確実に削除します。

$ rm -f dummy_*

ダミーファイルのファイル名を接頭辞と連番で管理しておけば、
複数回に分けて作成した場合も rm 一発で削除漏れなく片付けることができます。

ただし、接頭辞(dummy_)が他の既存ファイルと重複しないよう、命名には注意してください。

ダミーファイルの削除後、使用率が元に戻ったことを確認します。

$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   33G   17G   66% /

実行時の注意点(重要)

  • 事前に空きディスク容量と、指定するブロックサイズ・ブロック数を必ず確認してください。
    目標より大きいcountを指定すると、想定以上にディスクを圧迫します。
  • 誤って重要なディレクトリやファイルを指定しないよう注意してください。
    特に of= の指定ミスは既存ファイルの上書きに直結します。
  • 大容量のファイルを作成する場合、ディスクI/Oに負荷がかかります。
    本番環境や他プロセスが稼働中の環境で実行する際は、負荷の少ない時間帯を選んでください。
  • 出力先にディレクトリを指定した場合はエラーになります。
  • 圧縮機能を持つファイルシステム(Btrfs のzstd圧縮マウント、ZFSの圧縮設定など)では、
    /dev/zero から作成したゼロ埋めファイルが圧縮され、
    実ディスク使用量がほとんど増えない場合があります。

    この場合、Null文字(\0)ではなくランダムなデータを返すif=/dev/urandom を使うことで、
    より確実に使用率を上げられます(ただし、生成速度は/dev/zeroより遅くなります)。

他の方法との比較

ダミーファイルを作成する方法としては、以下も候補になります。

  • fallocateコマンドを使う
  • 実際のファイルをコピーする

fallocateコマンドは、ddコマンドよりも高速にファイルサイズを確保できます。
しかし、実際にはディスク領域を確保するだけでデータの書き込みを行わないため、
環境によっては実際のディスク使用量がほとんど増えない場合があります。

また、既存のファイルをコピーする方法は、事前にデータを準備する必要があるだけでなく、
コピーにも時間がかかるため効率的とはいえません。

そのため、fallocateコマンドと比べると時間はかかりますが、
ddコマンドは実際にデータを書き込むため、より確実に使用量を増やせます。

まとめ

この記事では、ddコマンドを使った任意のサイズのダミーファイルを作成し、
ディスク使用率を調整する方法についてまとめました。

ddコマンドを利用することで、
bscountに指定した値に沿ったサイズのダミーファイルを作成できます。

これにより、試験環境のディスク使用率を短時間で調整できます。

また、ダミーファイルはあくまで試験用の一時的なものなので、
試験後は忘れずに削除しておきましょう。

fallocateコマンドのように高速な方法もありますが、
確実にディスク使用量を増やしたい場合は、実際にデータを書き込むddコマンドの方が適しています。

なお、ddコマンドは指定した内容をそのままコピーするコマンドであるため、
実行する環境や指定するパスには十分注意した上で利用してください。

参考リンク

GNU Coreutils公式マニュアル:ddコマンド

コメント