# EnhanceIO

EnhanceIO makes it possible to use an SSD as a caching device for any other type of block device storage (HDD, Network, you name it) with almost zero configuration. Based on Flashcache it is much simpler to set up. Unlike Bcache there is no need to convert file systems.

Warning:

- As always be careful and read the documentation carefully before attempting to use EnhanceIO, do not confuse your HDD and SDD and make sure the SSD does not have any important data on it.
- There is a known issue with EnhanceIO causing filesystem corruption if fsck is run on file system before cache is brought up.
- As of October 2015 EnhanceIO is completely broken on newer kernels.

## Installation

Install enhanceio-dkms-gitAUR from the AUR.

Note: Throughout the page, `/dev/sda` will be used to indicate the slow drive and `/dev/sdb` will be used to indicate the fast drive. Be sure to change these examples to match your setup.

### Setting up the module and drives

The EnhanceIO command line interface (eio_cli) is used to manage your setup. Set up caching on your fast ssd for your slow hdd like so:

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

This will use the default options which are safe, if you want to enhance speed even further you might want to add `-m wb` to enable WriteBack mode instead of WriteThrough. This might put data itegrity at risk though.

The cache drive is persistent now, which means even after a reboot it will still be used. If you want to deactive it first set the cache into read-only mode to not lose any yet unwritten blocks

    # eio_cli edit -c my_first_enhanceio -m ro

Then wait until

    $ grep nr_dirty /proc/enhanceio/enchanceio_test/stats

returns 0. Now all the blocks have been written to your slow hdd and it's safe to delete the caching device:

    # eio_cli delete -c my_first_enhanceio

### Getting information on caches

To get basic information on caches in use try

    # eio_cli info

To get detailed information use

    $ cat /proc/enhanceio/my_first_enhanceio/stats

Tip: After initiating EnhanceIO I felt that my system had become more sluggish, this seems to be due to building up the cache first. Use your system like you normally would and open up those applications you would want to start quickly, maybe give it another reboot and observe how things fly.

### Enable EnhanceIO on initcpio

After you verify that EnhanceIO works with your system, you might want to accelerate the boot process of your system. In order to do this, EnhanceIO should start as early as possible and before the rootfs gets mounted. This can be achieved by enabling EnhanceIO in initcpio.

Warning: EnhanceIO does not support the WriteBack `-m wb` strategy when accelerating rootfs, only ReadOnly `-m ro` or WriteThrough (the default). If you enable WriteBack on the root volume bad things WILL happen.

First, install the pyinstallerAUR package from the AUR; we need it to compile EnhanceIO's Python `eio_cli` script into an executable for inclusion in the initcpio image.

Create the file `/etc/initcpio/hooks/enhanceio`. This is the EnhanceIO hook that performs cache initialization on boot:

    #!/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
    }

Create the file `/etc/initcpio/install/enhanceio`. This file compiles `eio_cli` as an executable and includes everything needed to load EnhanceIO from initcpio:

    #!/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."
    }

Edit `/etc/mkinitcpio.conf` and add the `enhanceio` hook inside the HOOKS variable after udev, block and modconf entries:

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

Fix permissions on eio_cli:

    chmod uga+xr /usr/bin/eio_cli

Finally, re-create the initcpio:

    mkinitcpio -p linux

Reboot and watch your system fly.

Category:

- File systems