EnhanceIO

提供: ArchWiki
2020年7月23日 (木) 21:50時点におけるKgx (トーク | 投稿記録)による版 (→‎initcpio で EnhanceIO を有効化: 警告を翻訳)
ナビゲーションに移動 検索に移動

EnhanceIO は SSD を他のブロックデバイスストレージ (HDD, ネットワークストレージなど) のキャッシュデバイスとして使用することを可能にします。設定はほとんど必要ありません。Flashcache が元になっていますが、設定は簡単です。Bcache と違ってファイルシステムの変換は必要ありません。

警告:
  • EnhanceIO を使用する前にドキュメントを注意深く読むようにしてください。HDD と SSD を混同しないように注意し、また、SSD に消したら困るデータが存在しないことを確認してください。
  • キャッシュが立ち上がる前にファイルシステムで fsck が実行されると EnhanceIO によってファイルシステムが破壊されるという 既知の問題 が存在します。
  • 2015年10月現在、EnhanceIO は新しいカーネルでは動作しません

インストール

AUR から enhanceio-dkms-gitAUR をインストールしてください。

ノート: 以下、速度が遅いドライブを /dev/sda、高速なドライブを /dev/sdb とします。あなたの構成にあわせて適宜置き換えてください。

モジュールとドライブの設定

EnhanceIO コマンドラインインターフェース (eio_cli) を使用してセットアップを管理します。高速な SSD に低速な HDD のキャッシュを設定するには:

# eio_cli create -d /dev/sda -s /dev/sdb -c my_first_enhanceio

上記のコマンドは安全なデフォルトオプションを使用します。さらに速度を向上させたい場合、-m wb を追加することで WriteThrough モードのかわりに WriteBack モードが有効になります。データが破損する危険性があるので注意してください。

キャッシュドライブは再起動しても使用されます。無効化したい場合はまずキャッシュを読み取り専用モードに設定してください (まだ書き込まれていないブロックを消失させないため):

# eio_cli edit -c my_first_enhanceio -m ro

以下のコマンドで0が返ってくるようになるまで待機してください:

$ grep nr_dirty /proc/enhanceio/enchanceio_test/stats

HDD に全てのブロックが書き込まれたらキャッシュデバイスを削除しても安全です:

# eio_cli delete -c my_first_enhanceio

キャッシュの情報を取得

キャッシュの基本情報を取得するには:

# eio_cli info

詳細情報を取得するには:

$ cat /proc/enhanceio/my_first_enhanceio/stats
ヒント: EnhanceIOを開始した後、システムが遅くなっているように感じた場合。これは、最初にキャッシュを構築したことが原因であると思われます。通常どおりにシステムを使用し、すばやく起動したいアプリケーションを開いてみたり。もう一度再起動などして、動作を観察してみてください。

initcpio で EnhanceIO を有効化

EnhanceIO が動作するのを確認できたら、システムの起動時間を短縮させるのにも EnhanceIO を使うことができます。ルートファイルシステムがマウントされる前よりもできるだけ早く EnhanceIO を起動する必要があります。それには initcpio で EnhanceIO を有効にする必要があります。

警告: EnhanceIOは、rootfsを高速化する際のWriteBack方式 -m wb をサポートしておらず、 -m ro またはWriteThrough (デフォルト)のみサポートします。ルートボリュームでWriteBackを有効にすると、問題が発生します。

まず、AUR から pyinstallerAUR パッケージをインストールしてください。initcpio イメージに EnhanceIO を含めるために EnhanceIO の Python スクリプト eio_cli を実行可能ファイルにコンパイルします。

起動時にキャッシュの初期化を実行する EnhanceIO のフックとなる /etc/initcpio/hooks/enhanceio ファイルを作成してください:

#!/usr/bin/bash

run_hook ()
{
    local mod
    for mod in enhanceio enhanceio_lru enhanceio_fifo; do
        modprobe "$mod"
    done

    msg -n ":: Activating EnhanceIO..."
    udevadm trigger
}

eio_cli を実行可能ファイルとしてコンパイルして initcpio から EnhanceIO をロードするのに必要なモジュールが含まれた /etc/initcpio/install/enhanceio ファイルを作成してください:

#!/bin/bash

build ()
{
    local mod
    for mod in enhanceio enhanceio_lru enhanceio_rand enhanceio_fifo; do
        add_module "$mod"
    done

    add_binary "/usr/lib/libutil.so.1"
    add_file "/etc/udev/rules.d/94-enhanceio-my_first_enhanceio.rules"

    sudo -u ${SUDO_USER} pyinstaller --distpath=/tmp/eio_cli/dist --workpath=/tmp/eio_cli --specpath=/tmp/eio_cli --clean --onefile --noconfirm --strip --console /usr/bin/eio_cli
    add_binary "/tmp/eio_cli/dist/eio_cli" "/usr/bin/eio_cli"

    add_runscript
}
 
help ()
{
    echo "This hook loads the necessary modules for EnhanceIO when caching your root device."
}

/etc/mkinitcpio.conf を編集して HOOKS 変数の udev, block, modconf の後に enhanceio フックを追加してください:

HOOKS="base udev block modconf enhanceio ..."

eio_cli のパーミッションを変更:

# chmod uga+xr /usr/bin/eio_cli

最後に、initcpio を再生成:

# mkinitcpio -p linux

再起動するとシステムが飛ぶように速く起動します。