今の時代、外部記憶装置(ハードディスク、SSD)が大容量化し読み書きの速度も格段に向上しました。昔はフロッピーディスクなど非常に低速だったため、とある技術(?)がありました。それが今回扱うRAMディスクです。RAMはコンピューターがランダムに読み書きできるメモリのことです。(Random access memory)

このメモリの一部を使ってディスクとして使おうというのがRAMディスクです。RAMディスクは1ビットあたりの単価は他のデバイスと比べて高価ですが、処理速度の速さという点で圧倒的に有利です。処理速度が求められる場合には有用な技術です。とは言え最近のマシンはSSDが当然のように装備されているので、パソコンでのRAMディスクの出番はなくなってしまいました。

が、パソコンでの出番はありませんが、Raspberry PIでは出番がありそうです。というのもRaspberry PIではSDカードが使われており、このSDカードは破損しやすいメディアです。つまりSDカードに読み書きするのではなくRAMディスクを作って、そこで読み書きすればSDカードの寿命も延ばすことができます。(Raspberry PI 5などではSSD使えますが、それでもメリットはあるでしょう)

ということで今回はRaspberry PIをベースにしてRAMディスクを作成します。もちろん他のUNIXベースの環境であれば同様にRAMディスクを作成することができます。

RAMディスクの作成

 まず、RAMディスクのマウントポイントを作成します。以下のようにコマンドを入力します。/mntは一般的にメディアをマウントするディレクトリです。もちろん、権限がある他のパスでも構いません。

sudo mkdir /mnt/ramdisk

 次にRAMディスクをマウントしますが、ここで使用するRAMディスクのサイズ(メモリ容量)を指定します。本体に搭載されているメモリより多く使用することはできません。ここではRaspberry PI 5の8GBモデルなので、1GBだけ拝借してRAMディスクを作成します。size=1Gの1Gの部分を変更すれば任意のサイズのRAMディスクを作成できます。

sudo mount -t tmpfs -o size=1G tmpfs /mnt/ramdisk

これでRAMディスクの作成は完了です。

ディスク容量の確認

 それでは作成したRAMディスクの容量を確認してみましょう。コマンドでdfと入力するとマウントされたディスクに関する情報が表示されます。

df

df -hとするとわかりやすい容量表示になります。

df -h

以下のようにするとRAMディスクのみ情報を表示することができます。1GBのRAMディスクを作成したのでサイズは1.0Gとなっています。

df -h /mnt/ramdisk

ディスクのアンマウント

 次にマウントしたRAMディスクをアンマウントしてみましょう。使わなくなったRAMディスクを削除する場合には以下のコマンドを入力します。なお、アンマウントするとRAMディスクの内容は消えてしまうので注意してください。

sudo umount /mnt/ramdisk

アンマウントしたRAMディスクはmountコマンドを使えば再度マウントすることができます。

sudo mount -t tmpfs -o size=1G tmpfs /mnt/ramdisk

ディスクの読み書きの速度計測

 せっかくのRAMディスクなので速度を計測してみましょう。SDカードは使用している種類によって速度が異なります。いずれにせよSDカードよりもRAMディスクの方が格段に高速です。
 ツールなしで計測する場合はddコマンドを使います。書き込み速度計測は以下のようになります。

sudo dd if=/dev/zero of=/mnt/ramdisk/testfile bs=1M count=1024 oflag=dsync

読み出し速度の計測は以下のようになります。

sudo dd if=/mnt/ramdisk/testfile of=/dev/null bs=1M count=1024

起動時に自動的にRAMディスクを作成する

 RAMディスクはRaspberry PIを再起動すると消えてしまいます。電源を落としても同様です。そうなると、RAMディスクを常に使用したい場合、また最初からRAMディスク作成のためのコマンドを入力しなければなりません。さすがに、これは面倒なので起動したら自動的にRAMディスクを作成するようにしてみます。
 RAMディスクを作成するコマンドは以下の2行です。どのシェルでも動作するので1行目にある定番の#!は書かなくても問題ありません。
この内容をramdisk.shという名前でホームディレクトリ(/home/pi/ramdisk.sh)に保存しておきます。保存したらchmod 755 ramdisk.shとして実行権限を付与しておきます。

sudo mkdir /mnt/ramdisk
sudo mount -t tmpfs -o size=1G tmpfs /mnt/ramdisk

 次に起動したら、このramdisk.shを実行させます。が、OSのバージョン等によって方法が異なります。そこで、1990年代以降であれば動くcronに@rebootを記述する方法を使うことにします。これはcronの設定ファイルの中に@rebootを指定すると起動時に後にかかれた処理が実行されるというものです。@で始まるものは他にも以下のような記述パターンがあります。

@reboot: システム起動時に1回だけ実行。
@yearly または @annually: 年に1回、1月1日の午前0時に実行。(0 0 1 1 * と同義)
@monthly: 月に1回、1日の午前0時に実行。(0 0 1 * * と同義)
@weekly: 週に1回、日曜日の午前0時に実行。(0 0 * * 0 と同義)
@daily または @midnight: 毎日午前0時に実行。(0 0 * * * と同義)
@hourly: 毎時0分に実行。(0 * * * * と同義)

crontab -eとして編集し保存します。

 設定したら再起動します。GUIから操作せずコマンドラインから再起動する場合はsudo rebootと入力します。

 起動したらdfコマンドでRAMディスクがマウントされているか確認します。

df -h

 起動後にマウントされていない場合は、./ramdisk.shとしてシェルスクリプトを実行しRAMディスクがマウントされるか確認してください。マウントされればcronの設定か実行権限を確認してください。

 では、また次回。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。