試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

一般ユーザのfreedesktop.org準拠アプリケーション向けキャッシュディレクトリをメモリ上に配置する

GNU/Linuxのデスクトップ環境ではホームディレクトリの下に.cacheというディレクトリが作られ、各種freedesktop.org準拠アプリケーション*1のキャッシュディレクトリとして用いられる。この場所(${HOME}/.cache/)はfreedesktop.orgが定める環境変数XDG_CACHE_HOMEの既定値で、この値をログイン時に別の場所に指定することにより、freedesktop.org準拠アプリケーションのキャッシュディレクトリを別のディレクトリに変更することができる。ただし、一般ユーザごとに自分向けにデータを作成するという性質上、この環境変数は一般ユーザのセッション内で値を設定する必要があり、かつ対象ディレクトリの属性(パーミッション)については他のユーザから書き込めないように設定されていることが必要。
キャッシュファイルは、そのファイルが繰り返し用いられるときには処理時間の短縮効果があるものとして役に立つのだが、場合によってはずっと消えないで残ってしまうファイルがあったり、量がどんどん増えていってディスク領域を圧迫したりする。また、ディスクへのアクセスを増やす原因にもなる。
そこで、これらのデメリットに対する対策として、メモリ上の空き領域をファイルシステムとして使用できるtmpfsとしてマウントされているディレクトリをここに割り当てることにする。ただし、物理メモリが十分に搭載されていないハードウェア環境での設定は推奨しない。

/dev/shmを利用

標準でtmpfsとしてマウントされているディレクト/dev/shm/(スティッキービット付きの)属性1777となっていて、誰でもこのディレクトリ以下に書き込みが可能で、かつ自分がこの中に作成したものは管理者以外には消されないようになっている。

$ stat -c "mode:%a (%A) owner:%U group:%G" /dev/shm
mode:1777 (drwxrwxrwt) owner:root group:root

そこで、環境変数XDG_CACHE_HOMEを「/dev/shm/.cache-[ユーザ名]」となるようにすることで、このディレクトリ以下に自分のユーザ用のキャッシュデータが配置されるようにする。

[/]-+-[dev]-+-[shm]-+-[.cache-user1]-+-[app1]- ...
    |       |       |   user1専用    +-[app2]- ...
    |       |       |                +-[app3]- ...
    |       |       |
    |       |       +-[.cache-user2]-+-[app4]- ...
    |       |       |   user2専用    +-[app5]- ...

/dev/shm/を用いない場合、/etc/fstabにマウント情報を記述することになる。
ファイル名: /etc/fstab

[任意の名前] [マウントポイント] tmpfs mode=1777,size=[最大サイズ(MiB数)]M 0 0

設定例

ファイル名: ~/.xprofileなど

# キャッシュディレクトリの指定
export XDG_CACHE_HOME=/dev/shm/.cache-$(whoami)
# 他のユーザは読み書きできないようにする
mkdir -p ${XDG_CACHE_HOME}
chmod 700 ${XDG_CACHE_HOME}

ログイン画面にGDMを用いている場合は${HOME}/.xprofile、他の場合はデスクトップ環境ごとの初期化ファイル(下の関連記事を参照)に記述する。
これでfreedesktop.org準拠アプリケーションのキャッシュデータの書き込みはディレクト/dev/shm/.cache-[ユーザ名]/以下に行われるようになり、再起動かシャットダウンを行うまでの間保持される。
/dev/shm/以外を用いる場合、この部分をそのディレクトリに置き換える。
隠しディレクトリにしたくない場合は先頭の「.」を書かないようにする。
mkdirchmodは書かなくても動作はするが、他のユーザから中身が見えてしまう場合があるので書いている。「mkdir -m 700」でなく上のように分けることで、既にディレクトリが存在する場合でも確実に属性を700にするようにしている。

関連記事:

関連URL:

*1:デスクトップ環境が提供するアプリケーションは基本的に準拠する