Linuxでディスク上の任意のディレクトリをRAMDISKに移し、システム終了時に変更をディスクへ反映させる

folder2ram を使うと、ディスク上の任意のディレクトリの内容を RAMDISK にできます。
また、システム起動時・停止時に、自動的に RAMDISK の内容をディスクと同期してくれます。

https://github.com/bobafetthotmail/folder2ram

指定したディレクトリの内容は、folder2ram起動時(システム起動時)に RAMDISK にコピーされます。
folder2ram終了時(システム終了時)に、RAMDISK の内容はディスク上へ反映されます。
この動作により、RAMDISKの内容を永続化することができます。
(当然ですが、いきなり電源を落とした場合は、RAMDISKの内容はディスクに反映されません)


folder2ram のインストール


folder2ram をダウンロードし、/sbin/folder2ram として保存します。



実行権をつけます。


chmod +x /sbin/folder2ram


システム起動・終了時に動作するように設定をします。

・systemdサービスとして設定する場合

folder2ram -enablesystemd

・initスクリプトとして設定する場合

folder2ram -enableinit



再起動してインストール完了です。


RAMDISK にするディレクトリの設定


/etc/folder2ram/folder2ram.conf の編集


重要な注意!!:
folder2ram.conf を編集する前に、次のコマンドを実行して、RAMDISK としてのマウントを解除しておきます。


folder2ram -umountall


/etc/folder2ram/folder2ram.conf を編集します。
ファイルが無い場合は、作成してください。

次の書式で、tmpfs の後にタブコード2つ以上入れて、<mount point> の箇所でRAMDISK 上にしたいディレクトリを指定します。
注意:区切りは、タブコード2つ以上にしてください。スペースだけでは認識しません。


tmpfs <mount point>


例えば、次のようにします。


tmpfs /var/log
tmpfs /var/spool


下記書式のように、ディレクトリ名の後に、タブコード2つ以上で区切って、オプションも指定できます。


tmpfs <mount point> <options>


指定できるオプションは、mountコマンドの -o オプションで指定できるものです。
folder2ram では、folder2ram.conf で指定された内容は、次のようにして mountコマンドを実行しています。


mount -t tmpfs -o <options> folder2ram <mount point>


例えば、次のようにすると、/var/log の最大サイズを 256M にして、RAMDISK上に作成されます。


tmpfs /var/log size=256m



/var/cache の指定の注意点


こちらで試したところ、Ubuntu上では、folder2ram.conf で /var/cache を記述していたら、Ubuntu起動時にマウントされませんでした。

syslog では、次のようなログが出力されていました。
どうも folder2ram の起動時の処理と、AppArmor の処理がバッティングして、folder2ram のRAMDISK へのコピー処理が失敗したため、マウントをやめているようです。
(cannot create regular file の後のファイル名は、別のファイル名が表示されることもあります)


folder2ram[1646]: cp: cannot create regular file '/var/cache/apparmor/26b63962.0/lsb_release': File exists
folder2ram[1646]: cp: cannot create regular file '/var/cache/apparmor/26b63962.0/nvidia_modprobe': File exists
folder2ram[1593]: copy files to /var/cache failure, rolling back the mount


対処ですが、Ubuntu起動時の処理で、AppArmor より先に folder2ram が起動するようにします。

/usr/lib/systemd/system/folder2ram_startup.service の [Unit]セクションに、次の行を追加してください。


Before=apparmor.service


これで、/var/cache も問題なくマウントできるようになります。


設定の反映


folder2ram.conf を編集したら、次のコマンドを実行してマウントします。


folder2ram -mountall



RAMDISKとディスクの同期


指定したディレクトリの内容は、folder2ram起動時(システム起動時)に RAMDISK にコピーされます。
folder2ram終了時(システム終了時)に、RAMDISK での変更内容は、rsync によってディスク上へ反映されます。

また、次のコマンドによるマウント・マウント解除時も、RAMDISK へのコピーや、ディスク上への反映が行われます。


folder2ram -mountall
folder2ram -umountall


手動でディスク上へ反映させる場合は、次のコマンドを実行します。
folder2ram.conf で指定のものがすべて同期されます。


/sbin/folder2ram -syncall


個別に指定する場合は、folder2ram.conf の何番目のディレクトリかを <number> で指定します。


/sbin/folder2ram -sync <number>


例えば、folder2ram.conf が次の場合、 /sbin/folder2ram -sync 2 とすると、/var/spool がディスクへ反映されます。


tmpfs /var/log
tmpfs /var/spool



アンインストール


次のコマンドを実行すると、アンインストールされます。
なお、このコマンド実行時に、RAMDISK上の内容はディスクに反映されます。

・systemdサービスとして設定していた場合

folder2ram -enablesystemd

・initスクリプトとして設定していた場合

folder2ram -disableinit



ただし、アンインストール時に RAMDISK上の内容がディスクに反映された後、folder2ram が停止するまでのわずかな間に RAMDISK に変更があっても、その内容は反映されません。

次のようにすると、システムシャットダウン時にアンインストールされますので、RAMDISK への反映が漏れることはありません。
より安全にアンインストールしたい場合は、こちらの方法でアンインストールしてください。

・systemdサービスとして設定していた場合

folder2ram -safe-disablesystemd

・initスクリプトとして設定していた場合

folder2ram -safe-disableinit



うまくいかない場合


次のことを確認してください。

/etc/folder2ram/folder2ram.conf で次の書式で書く内容は、タブコード2つ以上で区切ります。
スペースだけでは認識しません。


tmpfs <mount point>

重要な注意!!:
folder2ram.conf を編集する前に、次のコマンドを実行して、RAMDISK としてのマウントを解除しておきます。


folder2ram -umountall


/var/cach が RAMDISK としてマウントされない場合は、「/var/cache の指定の注意点」の箇所の内容を確認してください。

"Linuxでディスク上の任意のディレクトリをRAMDISKに移し、システム終了時に変更をディスクへ反映させる" へのコメントを書く

お名前
メールアドレス
ホームページアドレス
コメント