コンテンツにスキップ

「Flashcache」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
序文の修正(英語版準拠)
AshMyzk (トーク | 投稿記録)
アーカイブ化。
タグ: 新規リダイレクト
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
#redirect [[ArchWiki:アーカイブ]]
[[Category:ファイルシステム]]
[[Category:アーカイブ]]
[[en:Flashcache]]
Flashcache は元々は Facebook (Mohan Srinivasan, Paul Saab, Vadim Tkachenko) によって開発され2010年4月にリリースされたモジュールです。ドライブのライトスルーキャッシュを他のドライブに保存することができるカーネルモジュールとなっています。性能を上げるために、回転ドライブをソリッドステートドライブにキャッシュするのによく使われています。ファイルをキャッシュすることで SSD 並みの速度と標準的な回転ドライブの容量の両方を教授できます。Facebook の開発目的はデータベースの I/O を高速化させることですが、どんな I/O でも簡単に対応可能です。

Flashcache の代替としては [[Bcache]] が存在します。

{{Warning|この時点でのflashcacheのインストールは簡単な作業ではなく、そのようなことに慣れている人だけが試みるべきです。このドライバをインストールする前に、説明をよくお読みください。注意しないと、マシンは簡単に起動不能になるでしょう。}}

このドライバーは遅いドライブを速いドライブで高速化することを意図しているのをよく覚えてください。速いドライブは別にソリッドステートドライブである必要はありません。高速だが小容量な SCSI ドライブと大容量の SATA ドライブがある場合や、とても低速な "green" ドライブと超高速な 10k rpm ドライブがある場合など、様々な速度のドライブが複数存在するような状況で広く使うことができます。

==インストール==

{{Tip|以下、遅いドライブは {{ic|/dev/sda}}、速いドライブは {{ic|/dev/sdb}} とし、2つのパーティション sda3 と sda4 を sdb1 と sdb2 にそれぞれキャッシュします。コマンドの例は適宜置き換えて下さい。}}

===カーネルモジュールの取得===

{{Warning|デバイスマッパーが有効になっている、またはモジュールとして構築されている完全なカーネルソースが必要です。}}

現段階で Arch パッケージや AUR にはカーネルモジュールが含まれていないので、GitHub の https://github.com/facebook/flashcache から直接ファイルをダウンロードしてください。ダウンロードしたらイメージを展開してモジュール/ユーティリティをコンパイルします:
$ tar -xzvf facebook-flashcache-1.0-64-g085b7ba.tar.gz
$ cd facebook-flashcache-085b7ba
$ make KERNEL_TREE=<root of kernel source tree> (most likely in /usr/src)

コンパイルが完了したらモジュールをインストールしてください (インストールには root 権限が必要です):
# make KERNEL_TREE=<root of kernel source tree> install

そしてユーティリティを使いやすいように {{ic|/usr/sbin}} にコピーします:
# cp src/utils/{flashcache_create,flashcache_load,flashcache_destroy} /usr/sbin

===速いドライブの準備===

必要なキャッシュを行うための高速なドライブの準備をします。キャッシュのサイズに合わせてパーティションを作成してください。

===flashcache の作成===
# flashcache_create cached_part1 /dev/sdb1 /dev/sda3
# flashcache_create cached_part2 /dev/sdb2 /dev/sda4

===ブート時にドライブを起動===

flashcache をどう使うかによって設定は変わります。root ファイルシステムをキャッシュする場合、ブートの初期段階でドライブを起動し、{{ic|/home}} ドライブパーティションなどをキャッシュする場合は、ブートの後期でドライブを起動するようにします。ブートの後期でドライブを起動するほうが簡単です。

====systemd を使ってブートの後期で起動====
{{Tip|このセクションでは、ルートファイルシステムのフラッシュキャッシュを無視します。これは、この方法がフラッシュキャッシュに適していないためです。}}

この方法では、systemd スクリプトを作成・有効化して flashcache モジュールをロードしてから flashcache ドライブをマウントします。

まず、{{ic|/etc/fstab}} を開いて {{ic|/home}} が UUID でマウントされるようになっていることを確認してください。そうなっていない場合は、{{ic|/dev/disk/by-uuid}} から UUID を取得して設定してください。Flashcache は flashcache ドライブにキャッシュ元と同一の UUID を設定するため、{{ic|/etc/fstab}} で UUID を使うことで flashcache ドライブがロードできなかった場合も起動することが可能になります。以下のようになっていれば問題ありません:

{{bc|1=
...
UUID=5ebee55d-8871-44ea-b159-58c103970f54 /home ext4 rw,relatime
...
}}

次に、実際に flashcache を利用する init スクリプトを作成します。

{{hc|/lib/initcpio/hooks/flashcache|<nowiki>
#!/bin/bash

# Check if /home is mounted
HOMEMOUNT=$(mount | grep home | sed 's/ .*//' | sed 's#.*/##' )

# Load module if not already loaded
if [[ ! "$(eval lsmod | grep "^flashcache")" ]]; then
modprobe flashcache
fi

# Mount flashcache /home if not already mounted
if [[ ! "$HOMEMOUNT" == "cached_part2" ]]; then
umount /home
if [ ! -e /dev/mapper/cached_part2 ]; then
flashcache_load /dev/sdb2
fi
mount /home
fi
</nowiki>}}

そして init スクリプトを使うための systemd スクリプトを作成してください。
{{hc|/lib/systemd/system/flashcache.service|2=
[Unit]
Description=FlashCache

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/local/bin/flashcache

[Install]
WantedBy=multi-user.target
}}

最後に、以下のコマンドでサービスを有効化してください:

# systemctl enable flashcache

これで設定は完了です。

====initcpio を使ってブートの初期に起動====

この方法ではカーネルの初期 RAM ディスクを編集して flashcache をブートの初期段階でロードする必要があります。

=====RAM ディスクの設定=====

root パーティションを使用するようにキャッシュを設定する場合や、実行時にパーティションをアンマウントしたくない場合、RAM ディスクを変更して flashcache に対応して busybox で作業を行うのが一番です。キャッシュするファイルシステムがアンマウントされている場合、[[#他のファイルの変更]]までスキップしてください。

ここでは RAM ディスクを変更するベースとして LVM を使っていますが、別の方法もあります。まず、以下のファイルを作成 (ファイルの中身は適宜置き換えて下さい):
{{hc|/lib/initcpio/hooks/flashcache|<nowiki>
# vim:set ft=sh:
run_hook ()
{
/sbin/modprobe -q dm-mod >/dev/null 2>&1
if [ -e "/sys/class/misc/device-mapper" ]; then
if [ ! -e "/dev/mapper/control" ]; then
/bin/mknod "/dev/mapper/control" c $(cat /sys/class/misc/device-mapper/dev | sed 's|:| |')
fi

[ "${quiet}" = "y" ] && LVMQUIET=">/dev/null"

msg "Activating cache volumes..."
eval /usr/sbin/flashcache_load cached_part1 /dev/sdb1 /dev/sda3 $LMQUIET
eval /usr/sbin/flashcache_load cached_part2 /dev/sdb2 /dev/sda4 $LMQUIET
fi
}
</nowiki>}}

{{hc|/lib/initcpio/install|2=
# vim: set ft=sh:

install ()
{
MODULES="dm-mod"
BINARIES=""
FILES=""
SCRIPT="flashcache"

add_dir "/dev/mapper"
add_binary "/sbin/dmsetup"
add_binary "/usr/sbin/flashcache_create"
add_binary "/usr/sbin/flashcache_load"
add_binary "/usr/sbin/flashcache_destroy"
add_file "/lib/udev/rules.d/10-dm.rules"
add_file "/lib/udev/rules.d/13-dm-disk.rules"
add_file "/lib/udev/rules.d/95-dm-notify.rules"
add_file "/lib/udev/rules.d/11-dm-lvm.rules"
}

help ()
{
cat<<HELPEOF
This hook loads the necessary modules for a flash drive as a cache device for your root device.
HELPEOF
}
}}

{{Note|{{ic|dm-disk.rules}}, {{ic|dm-notify.rules}}, および {{ic|dm-lvm.rules}}, というファイルを残しましたが、恐らくこれらは必要無いと思われます。}}

{{ic|/etc/mkinitcpio.conf}} を更新:

モジュールに flashcache を追加:
MODULES="flashcache"

フックに flashcache を追加 (ファイルシステムの前に追加するようにしてください):
HOOKS="... flashcache ..."

{{Tip|USBキーボードを使用している場合は、フックにUSB入力を追加する必要がある場合もあります。}}

そして ramdisk イメージを再生成:
# mkinitcpio -g /boot/<your ramdisk filename>.img

通常のイメージとは別の ramdisk イメージを作成して、grub の設定ファイルに新しいエントリを追加して作成した ramdisk を使うようにすることも可能です。

=====他のファイルの変更=====
新しいパーティションが {{ic|/dev/mapper}} に出現するので元の {{ic|/dev/sd*}} パーティションの代わりに新しいパーティションをマウントしてください。GRUB と fstab を編集して新しいパーティションをマウントする必要があります。以下の例では、root パーティションは {{ic|/dev/mapper/cached_part1}} でホームディレクトリは {{ic|/dev/mapper/cached_part2}} となっています。

{{ic|/boot/grub/menu.lst}}
{{bc|1=
# (0) Arch Linux
title Arch Linux(flashcache)
root (hd0,0)
kernel /vmlinuz26 root=/dev/mapper/cached_part1 ro 5
initrd /kernel-2.6.38.4.img
}}

{{ic|/etc/fstab}}
{{bc|
...
/dev/mapper/cached_part1 / ext3 defaults 0 1
/dev/mapper/cached_part2 /home ext3 defaults,user_xattr 0 1
...
}}

root パーティションをキャッシュする場合、再起動して grub で e を押してカーネルコマンドラインのオプションを編集してください。カーネルオプションの行を選択したら再度 e を押します。'break=y' をクォートで囲まずに末尾に追加してエンターを押してください。b を押すと起動します。これでモジュールがロードされた後に RAM ディスクが停止してシェルが起動するので作業をすることができます。

(flashcache ramdisk を使用していることを確認したら) 再起動してマウントされたパーティションが新しく作成したパーティションであることを確認してください。

==設定==
キャッシュを制御するための多くのオプションが存在します。flashcache のドキュメントにあるシステム管理者ガイドを確認してください。例えば {{ic|/etc/sysctl.d/90-flashcache.conf}} に以下の設定を追加します:

{{bc|1=
#####################
# flashcache settings
#####################

# disable writing dirty cache data at shutdown
dev.flashcache.fast_remove = 1

# change the reclaim policy to LRU from FIFO
dev.flashcache.reclaim_policy = 1

# do not write "stale" data to disk until evicted due to lack of space
dev.flashcache.fallow_delay = 0
}}

==トラブルシューティング==
* キャッシュを作成しようとすると {{ic|device-mapper: reload ioctl failed: Invalid argument}} というエラーが表示される場合、マウントしたファイルシステムのキャッシュを作成してみてください。
* 起動が失敗する場合、GRUB のカーネルコマンドラインに {{ic|1=break=y}} を追加して RAM ディスクのシェルを使うことで簡単にキャッシュの確認ができます。
* キャッシュが上手く使われないときは {{ic|/proc/flashcache_stats}} に役に立つ情報が含まれているはずです。

== 参照 ==

* オリジナルのアナウンス - http://www.facebook.com/note.php?note_id=388112370932
* Github ソース - https://github.com/facebook/flashcache

2023年12月12日 (火) 08:08時点における最新版