Fontconfig (2日目) - キャッシュファイル

ファイル配置について説明しきっておきたいので今日はキャッシュファイルです。 なかなか肝心の設定に入れません。

今回から実験環境としてVirtualBox上のKDE neon(Ubuntu 22.04がベースの版)を使用します。 素のUbuntuは何故かVirtualBox上ですごく重いのと、私が実際にKDE neonを使っていた時期がありましたのである程度勝手がわかっていますので。

あと、間違い等がありましたら https://twitter.com/ytomino 等で指摘いただければ幸いです。

キャッシュファイルの場所

Fontconfigのキャッシュファイルは2箇所に別れていて、root権限で更新されるグローバルなものと、ユーザー個別のものがあります。

  • /var/cache/fontconfig/ (rootのキャッシュ)

  • ~/.cache/fontconfig/ (ユーザーのキャッシュ)

キャッシュは fc-cache コマンドでも更新することができ、rootで実行した場合は /var/cache/fontconfig/ が、一般ユーザーで実行した場合は ~/.cache/fontconfig/ が更新されます。

rootのキャッシュにはグローバルな、主に /usr/share/fonts/ 以下のフォントファイルが記録されます。 ユーザーのキャッシュには ~/.fonts/ 以下のフォントファイルに加えて、rootのキャッシュが古かったり無かったりした場合にはグローバル分も記録されます。

~/.cache/ の部分は環境変数 XDG_CACHE_HOME で置き換えられます。 また fonts.conf でもパスは変更できますので、ここで固定っぽく書いてあるパスはあくまで参考ぐらいに思っていただいて実際のパスはお使いのディストリビューションを確認してください。

キャッシュの中身はインストール直後のKDE neonですとこんな感じです。

$ ls /var/cache/fontconfig/
0028aeae-a00d-4b03-a7d5-bceb4553016b-le64.cache-7
21ccec9d-21bd-4815-9cc9-abab0dc63b27-le64.cache-7
2d91722f-8991-449a-ab60-f668e7d5aace-le64.cache-7
2f0eb681-1613-4dc6-b059-fa226ec4fa22-le64.cache-7
32f764ae-e6ac-4a89-8d49-5fbf317508ce-le64.cache-7
475e99ab-0986-4231-b71d-882f448e03ad-le64.cache-7
479b0291-1286-447b-af63-67cde7dfab61-le64.cache-7
48b676e1-5d7b-4899-bd19-5af22082feb0-le64.cache-7
5d54daff-3a3c-45e4-a14b-611d71c223d7-le64.cache-7
6661c8d9-7058-464d-acaf-fe70902826d7-le64.cache-7
6f8793f3-b85c-41e4-b75c-a7d45bf9267f-le64.cache-7
7209acac-a725-4965-b556-008db5c2de5f-le64.cache-7
78803ee2-029c-4317-9ae6-c70718ad2138-le64.cache-7
80a2ff7d-197d-4c73-93e9-5188c1889a5a-le64.cache-7
8d138ab4-bc27-4310-a45b-105b4e354457-le64.cache-7
917ba490-6c0b-456a-9651-ab0acd65ae77-le64.cache-7
9de5e150-5eb0-4250-8b11-09e2d33016fc-le64.cache-7
9f3e776b-41fe-4abc-a1da-50cf2d0333c0-le64.cache-7
CACHEDIR.TAG
a19dd4d3-f2ff-46ef-8e88-ac68893002d1-le64.cache-7
a7772e0b-3901-4201-b4f4-03867ad5fb04-le64.cache-7
bf1db335-5052-4669-bb1e-04780de73f0b-le64.cache-7
bffdaa74-3b3b-40a8-8340-8ec0e455b277-le64.cache-7
c4ad738d-2433-4cf2-8bc6-0485f60519a4-le64.cache-7
c7145c77-cc73-48b2-a528-6ece294b1373-le64.cache-7
cf4974fb-ee2f-4d01-baec-eeb2b9548db5-le64.cache-7
d136a131-8d69-4b6e-9755-da9566587d36-le64.cache-7
d4912b0d-0924-4ce0-932f-b070654e36b1-le64.cache-7
f8bf1a86-794f-4a25-bb06-c12657afd8fd-le64.cache-7
$ ls ~/.cache/fontconfig
0028aeae-a00d-4b03-a7d5-bceb4553016b-le64.cache-7
48b676e1-5d7b-4899-bd19-5af22082feb0-le64.cache-7
CACHEDIR.TAG

CACHEDIR.TAG 以外のキャッシュファイルはディレクトリと一対一対応しています。 ひとつのディレクトリに複数のフォントファイルがあっても、サブディレクトリがあるだけのディレクトリであっても、空のディレクトリであっても、キャッシュファイルはひとつ作られます。

Flatpak

Flatpak等ではコンテナ内の /usr/share/fonts/ は外のものとは別物ですのでキャッシュは別に必要です。 コンテナの中から外のフォントファイルやキャッシュも参照できますが、異なるパスにマウントされています。

  • /usr/share/fonts/ (コンテナ内のフォント)

  • /usr/cache/fontconfig/ (コンテナ内のグローバルなキャッシュ)

  • /run/host/fonts/ (コンテナ外の /usr/share/fonts/)

  • /run/host/fonts-cache/ (コンテナ外の /var/cache/fontconfig/)

  • /run/host/user-fonts/ (コンテナ外の ~/.fonts/)

  • /run/host/user-fonts-cache/ (コンテナ外の ~/.cache/fontconfig/)

  • ~/.var/app/*/cache/fontconfig/ (XDG_CACHE_HOME が指しているユーザーのキャッシュ)

キャッシュファイルにはフォントファイルのフルパスが含まれるため、コンテナ外のフォントファイルのためのキャッシュも基本 ~/.var/app/*/cache/fontconfig/ に作り直されます。

/run/host/fonts-cache//run/host/user-fonts-cache/ はマウントされてる意味があるのでしょうか。 ……と思いきや、中にはキャッシュが作り直しにならないアプリケーションもあります。 恐らくコンテナの持つアクセス権やアプリケーションがそもそもFontconfigを使用していない等ではないかと? 詳しく調べられていませんごめんなさい。

キャッシュの掃除

先に述べましたようにユーザーのキャッシュにもグローバルなフォントファイルが記録されてしまうことがあります。 例えば /usr/share/fonts/ 以下のサブディレクトリに変更を加えた後rootでキャッシュの更新が行われるよりも前に何れかのアプリケーションがFontconfigを使用した場合等です。 このようなキャッシュファイルはグローバルなキャッシュが更新された後は不要になります。

またキャッシュファイルはディレクトリ毎に作られますので、フォントをアンインストールする等してディレクトリがなくなった場合もそのディレクトリに対応するキャッシュファイルは不要になります。

フォントを頻繁に追加削除する方はキャッシュもたまに掃除しましょう。

$ sudo fc-cache -r -s
$ rm ~/.cache/fontconfig/*.cache-7
$ fc-cache

fc-cache-r オプションはキャッシュファイルを消してスキャンを全てやり直します。 -s オプションはグローバルなディレクトリ以下のみを対象にします。 グローバルなキャッシュはこれで綺麗になります。

ただしユーザーのキャッシュの掃除に -r オプションは使用できません。 -r オプションを付けてしまいますとユーザーのキャッシュであってもグローバルなフォントファイルを含めてスキャンされ /var/cache/fontconfig/ と重複してしまいます。

他に適当なオプションもありませんので、キャッシュファイルを消してからオプション無しで fc-cache を実行します。 それで綺麗になります。

.uuidファイル

Fontconfigはスキャンしたディレクトリ全てに .uuid というファイルを作成します。 中身は文字通りUUIDで内部的に各ディレクトリのIDとして使われているっぽいです。

インストール直後のKDE neonですとこんな感じです。

$ find /usr/share/fonts -name .uuid
/usr/share/fonts/.uuid
/usr/share/fonts/cMap/.uuid
/usr/share/fonts/cmap/.uuid
/usr/share/fonts/X11/util/.uuid
/usr/share/fonts/X11/.uuid
/usr/share/fonts/X11/misc/.uuid
/usr/share/fonts/X11/Type1/.uuid
/usr/share/fonts/X11/encodings/.uuid
/usr/share/fonts/X11/encodings/large/.uuid
/usr/share/fonts/truetype/dejavu/.uuid
/usr/share/fonts/truetype/.uuid
/usr/share/fonts/truetype/droid/.uuid
/usr/share/fonts/truetype/noto/.uuid
/usr/share/fonts/truetype/lato/.uuid
/usr/share/fonts/truetype/hack/.uuid
/usr/share/fonts/truetype/freefont/.uuid
/usr/share/fonts/truetype/ubuntu/.uuid
/usr/share/fonts/opentype/.uuid
/usr/share/fonts/opentype/noto/.uuid
/usr/share/fonts/opentype/urw-base35/.uuid
/usr/share/fonts/type1/.uuid
/usr/share/fonts/type1/urw-base35/.uuid

この .uuid ファイルは後から作られるシステムのパッケージマネージャで管理されていないファイルです。 そのためフォントのパッケージをアンインストールしても親ディレクトリと共に残り続けます。

気になる方は .uuid ファイルだけのディレクトリがありましたら手動で消しましょう……。