Bcache

提供: ArchWiki
2021年12月6日 (月) 02:36時点におけるK9i (トーク | 投稿記録)による版 (→‎序文: 訳の言い回し変更、リンクを英語版に同期)
ナビゲーションに移動 検索に移動

Bcache (block cache) を使うことで SSD を他のブロックデバイス (通常は回転するHDD やアレイ) の読み書きキャッシュ (writeback モード) あるいは読み取りキャッシュ (writethrough または writearound) として活用できます。この記事ではルートパーティションとして Bcache を使って arch をインストールする方法を説明します。bcache 自体の説明は bcache のホームページ を読んでください。必ずbcacheのマニュアルを読んで参照してください。Bcache は 3.10 以降のメインラインカーネルに含まれています。archインストールディスクのカーネルには 2013.08.01 以降のbcacheモジュールが含まれています。

ヒント: Bcache の代わりになるものは LVM cacheです。

Bcache を使うにはバッキングデバイスを bcache ブロックデバイスとしてフォーマットする必要があります。大抵の場合、blocks to-bcache でインプレース変換を実行できます。

警告:
  • 最初に重要なデータをバックアップしてください。
  • bcache-dev ブランチは活発に開発されています。ディスク上のフォーマットは3.18で変更されており、以前のフォーマットとの後方互換性はありません [1]。注: これはbcache-devをコンパイルするユーザにのみ該当します。上流の Linux カーネルに組み込まれているバージョンには影響はありません [2]
  • Bcache と btrfs を組み合わせるとファイルシステムが壊れてしまう可能性があります。詳しくは こちらの記事 を参照してください。Btrfs wiki によればカーネル 3.19 以上では修正されているとのことです [3]
  • カーネルバージョン5.12.0-5.12.10には重大なバグがあります。ここを参照してください。もし該当する場合、ログに"kernel BUG at block/bio.c:52" または "kernel BUG at block/bio.c:53" と表示され、数時間使用するとシステムがフリーズします。
  • カーネルバージョン5.15.2には重大なバグがあります。ここを参照してください。このバージョンでbcacheを使用すると、数回の起動後にbcacheが破損する可能性があります。また、システムクラッシュの有無にかかわらず、カーネルパニックが発生する可能性があります。

既存のシステムに bcached btrfs ファイルシステムをセットアップ

警告: make-bcache は既存のドライブやパーティションをインポートしません - 再フォーマットします。

準備

bcache-toolsAURインストールします。

キャッシュとバッキングデータを保持するためにfdiskを使用してSSDとハードドライブに適切なパーティションを作成します。

ヒント: 1台のドライブに多数のパーティションを作成することが可能です。これにより、コミットする前に複雑なセットアップをテストできます。ドライブに障害が発生すると全てのデータが失われることに注意してください。好ましくないアクセスパターンためドライブのパフォーマンスも低下します。

状況: 1台のハードドライブと1台の読み取りキャッシュSSD

警告:
  • 1台のドライブが故障すると、すべてのデータが失われます。
  • 書き込みキャッシュを有効にしないでください。SSDが故障するとデータが失われる可能性があります。
+--------------+
| btrfs /mnt   |
+--------------+
| /dev/Bcache0 |
+--------------+
| Cache        |
| /dev/sdk1    |
+--------------+
| Data         |
| /dev/sdv1    |
+--------------+

1. バッキングデバイスをフォーマットします (通常はメカニカルなドライブになります)。バッキングデバイスはデバイス全体でもパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。以下は /dev/bcache0 を作成します

# make-bcache -B /dev/sdv1

2. キャッシュデバイスをフォーマットします (通常は SSD になります)。キャッシュデバイスはデバイス全体でもパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。

# make-bcache -C /dev/sdk1

この例ではデフォルトのブロックサイズとバケットサイズである 512B と 128kB が使われています。ブロックサイズはバッキングデバイスのセクタサイズに一致すべきで、通常は 512 あるいは 4k です。バケットサイズはライトアンプリフィケーションを避けるためにキャッシュデバイスの消去ブロックサイズに一致すべきです。例えば、4k セクタの HDD と 2MB の消去ブロックサイズの SSD を使用する場合、コマンドは以下になります

# make-bcache --block 4k --bucket 2M -C /dev/sdk1
ノート: --block 4k オプションを省略する必要があるかもしれません。 キャッシュデバイスをバッキングデバイスにアタッチできないを参照してください。

3. キャッシュデバイスのuuidを取得します

# bcache-super-show /dev/sdk1 | grep cset
cset.uuid		f0e01318-f4fd-4fab-abbb-d76d870503ec

4. バッキングデバイスにキャッシュデバイスを登録します。例示のuuidをあなたのキャッシュのuuidに置き換えてください。Udevルールが再起動時にこの処理を行うため一回だけ実行する必要があります。

# echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache0/bcache/attach

5. btrfs ファイルシステムを作成します。

# mkfs.btrfs /dev/bcache0

6. ファイルシステムをマウントします

# mount /dev/bcache0 /mnt

7. initcpio 中にこのパーティションを使用可能にしたい場合(つまり、ブートプロセスのある時点で必要とする場合)、'bcache' フックをリスト内のblockとfilesystemsの間に追加するのと同様に /etc/mkinitcpio.conf のモジュール配列に 'bcache' を追加する必要があります。それからinitramfs を再生成する必要があります。

状況: 4台のハードドライブと1台の読み取りキャッシュSSD

警告:
  • 書き込みキャッシュを有効にしないでください。SSDが故障するとデータが失われる可能性があります。
+-----------------------------------------------------------+
|                         btrfs /mnt                        |
+--------------+--------------+--------------+--------------+
| /dev/Bcache0 | /dev/Bcache1 | /dev/Bcache2 | /dev/Bcache3 |
+--------------+--------------+--------------+--------------+
|                           Cache                           |  
|                         /dev/sdk1                         |
+--------------+--------------+--------------+--------------+
| Data         | Data         | Data         | Data         |
| /dev/sdv1    | /dev/sdw1    | /dev/sdx1    | /dev/sdy1    |
+--------------+--------------+--------------+--------------+

1. バッキングデバイスをフォーマットします (通常はメカニカルなドライブになります)。バッキングデバイスはデバイス全体でもパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。以下は /dev/bcache0、 /dev/bcache1、 /dev/bcache2 と /dev/bcache3 を作成します

# make-bcache -B /dev/sdv1
# make-bcache -B /dev/sdw1
# make-bcache -B /dev/sdx1
# make-bcache -B /dev/sdy1

2. キャッシュデバイスをフォーマットします (通常は SSD になります)。キャッシュデバイスはデバイス全体でもパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。バッキングデバイスのグループに追加できるのは一つのキャッシュデバイスだけです。

# make-bcache -C /dev/sdk1

3. キャッシュデバイスのuuidを取得します

# bcache-super-show /dev/sdk1 | grep cset
cset.uuid		f0e01318-f4fd-4fab-abbb-d76d870503ec

4. バッキングデバイスにキャッシュデバイスを登録します。例示のuuidをあなたのキャッシュのuuidと置き換えてください。

# echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache0/bcache/attach
# echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache1/bcache/attach
# echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache2/bcache/attach
# echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache3/bcache/attach

5. btrfs ファイルシステムを作成します。データとメタデータの両方がアレイに2回保存されるため、1台のハードドライブに障害が発生してもデータが失われることはありません。-L 引数はファイルシステムのラベルを定義します。

# mkfs.btrfs -L STORAGE -f -d raid1 -m raid1 /dev/bcache0 /dev/bcache1 /dev/bcache2 /dev/bcache3 

6. ファイルシステムをマウントします

# mount /dev/bcache0 /mnt

状況: 3台のハードドライブと3台の読み書きキャッシュSSD

警告:
  • ライトバックモードのSSDに障害が発生した場合のデータ損失を回避するために、各HDDにはそれぞれのSSDが必要です。
+--------------------------------------------+
|                  btrfs /mnt                |
+--------------+--------------+--------------+
| /dev/Bcache0 | /dev/Bcache1 | /dev/Bcache2 |
+--------------+--------------+--------------+
| Cache        | Cache        | Cache        |  
| /dev/sdk1    | /dev/sdl1    | /dev/sdm1    |
+--------------+--------------+--------------+
| Data         | Data         | Data         |
| /dev/sdv1    | /dev/sdw1    | /dev/sdx1    |
+--------------+--------------+--------------+

1. バッキングデバイスをフォーマットします (通常はメカニカルなドライブになります)。バッキングデバイスはデバイス全体でもパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。以下は /dev/bcache0、/dev/bcache1 と /dev/bcache2 を作成します

# make-bcache -B /dev/sdv1
# make-bcache -B /dev/sdw1
# make-bcache -B /dev/sdx1

2. キャッシュデバイスをフォーマットします (通常は SSD になります)。キャッシュデバイスはデバイス全体でもパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。SSDに障害が発生した場合のデータ損失を回避するために、ライトバックモードの場合、各バッキングデバイスにはそれぞれのSSDが必要です。ライトスルーとライトアラウンドモードのキャッシュSSDは、障害が発生してもデータが失われないため、複数のバッキングデバイスで共有できます。

# make-bcache -C /dev/sdk1
# make-bcache -C /dev/sdl1
# make-bcache -C /dev/sdm1

3. キャッシュデバイスのuuidを取得します

# bcache-super-show /dev/sdk1 | grep cset
cset.uuid		f0e01318-f4fd-4fab-abbb-d76d870503ec
# bcache-super-show /dev/sdl1 | grep cset
cset.uuid		4b05ce02-19f4-4cc6-8ca0-1f765671ceda
# bcache-super-show /dev/sdm1 | grep cset
cset.uuid		75ff0598-7624-46f6-bcac-c27a3cf1a09f

4. バッキングデバイスに対してキャッシュデバイスを登録します。例示のuuidはあなたのキャッシュのuuidに置き換えてください。

# echo cset.uuid > /sys/block/bcache0/bcache/attach
# echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache0/bcache/attach
# echo 4b05ce02-19f4-4cc6-8ca0-1f765671ceda > /sys/block/bcache1/bcache/attach
# echo 75ff0598-7624-46f6-bcac-c27a3cf1a09f > /sys/block/bcache2/bcache/attach

5. ライトバックモードを有効にします

# echo writeback > /sys/block/bcache0/bcache/cache_mode
# echo writeback > /sys/block/bcache0/bcache/cache_mode
# echo writeback > /sys/block/bcache1/bcache/cache_mode
# echo writeback > /sys/block/bcache2/bcache/cache_mode

6. btrfs ファイルシステムを作成します。データとメタデータの両方がアレイに2回保存されるため、1台のハードドライブに障害が発生してもデータが失われることはありません。-L 引数はファイルシステムのラベルを定義します。

# mkfs.btrfs -L STORAGE -f -d raid1 -m raid1 /dev/bcache0 /dev/bcache1 /dev/bcache2

7. ファイルシステムをマウントします

# mount /dev/bcache0 /mnt

状況: 5台のハードドライブと3台のキャッシュSSD

警告:
  • ライトバックモードの各キャッシュデバイスは、SSDに障害が発生した場合のデータ損失を回避するために、単一のバッキングドライブをキャッシュするためにのみ使用する必要があります。ライトスルーとライトアラウンドのSSDは共有できます。
+--------------------------------------------------------------------------+
|                                btrfs /mnt                                |
+--------------+--------------+--------------+--------------+--------------+
| /dev/Bcache0 | /dev/Bcache1 | /dev/Bcache2 | /dev/Bcache3 | /dev/Bcache4 |
+--------------+--------------+--------------+--------------+--------------+
| WriteB Cache |     Writethrough or writearound Cache      | WriteB Cache |  
| /dev/sdk1    |                 /dev/sdl1                  | /dev/sdm1    |
+--------------+--------------+--------------+--------------+--------------+
| Data         | Data         | Data         | Data         | Data         |
| /dev/sdv1    | /dev/sdw1    | /dev/sdx1    | /dev/sdy1    | /dev/sdz1    |
+--------------+--------------+--------------+--------------+--------------+

1. バッキングデバイスをフォーマットします (通常はメカニカルなドライブになります)。バッキングデバイスはデバイス全体でもパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。以下は /dev/bcache0、/dev/bcache1、/dev/bcache2、/dev/bcache3 と /dev/bcache4 を作成します。

# make-bcache -B /dev/sdv1
# make-bcache -B /dev/sdw1
# make-bcache -B /dev/sdx1
# make-bcache -B /dev/sdy1
# make-bcache -B /dev/sdz1

2. キャッシュデバイスをフォーマットします (通常は SSD になります)。キャッシュデバイスはデバイス全体でもパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。SSDに障害が発生した場合のデータ損失を回避するために、ライトバックモードの場合、各バッキングデバイスにはそれぞれのSSDが必要です。ライトスルーとライトアラウンドモードのキャッシュSSDは、障害が発生してもデータが失われないため、複数のバッキングデバイスで共有できます。

# make-bcache -C /dev/sdk1
# make-bcache -C /dev/sdl1
# make-bcache -C /dev/sdm1

3. キャッシュデバイスのuuidを取得します

# bcache-super-show /dev/sdk1 | grep cset
cset.uuid		f0e01318-f4fd-4fab-abbb-d76d870503ec
# bcache-super-show /dev/sdl1 | grep cset
cset.uuid		4b05ce02-19f4-4cc6-8ca0-1f765671ceda
# bcache-super-show /dev/sdm1 | grep cset
cset.uuid		75ff0598-7624-46f6-bcac-c27a3cf1a09f

4. バッキングデバイスに対してキャッシュデバイスを登録します。例示のuuidはあなたのキャッシュのuuidに置き換えてください。

# echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache0/bcache/attach
# echo 4b05ce02-19f4-4cc6-8ca0-1f765671ceda > /sys/block/bcache1/bcache/attach
# echo 4b05ce02-19f4-4cc6-8ca0-1f765671ceda > /sys/block/bcache2/bcache/attach
# echo 4b05ce02-19f4-4cc6-8ca0-1f765671ceda > /sys/block/bcache3/bcache/attach
# echo 75ff0598-7624-46f6-bcac-c27a3cf1a09f > /sys/block/bcache4/bcache/attach

5. 非共有キャッシュでライトバックモードを有効にします

# echo writeback > /sys/block/bcache0/bcache/cache_mode
# echo writeback > /sys/block/bcache4/bcache/cache_mode

6. btrfs ファイルシステムを作成します。データとメタデータの両方がアレイに2回保存されるため、1台のハードドライブに障害が発生してもデータが失われることはありません。-L 引数はファイルシステムのラベルを定義します。

# mkfs.btrfs -L STORAGE -f -d raid1 -m raid1 /dev/bcache0 /dev/bcache1 /dev/bcache2 /dev/bcache3 /dev/bcache4

7. ファイルシステムをマウントします

# mount /dev/bcache0 /mnt

Bcache の管理

1. 正しくセットアップされていることを確認する

# cat /sys/block/bcache0/bcache/state

出力は以下のどれかになります:

  • no cache: bcache のバッキングデバイスにキャッシュデバイスが登録されていないことを意味します。
  • clean: 全て問題ないことを意味します。キャッシュはクリーンです。
  • dirty: 全て正しくセットアップされており writeback が有効になっていてキャッシュがダーティであることを意味します。
  • inconsistent: バッキングデバイスがキャッシュデバイスと同期されていないため問題が発生しています。

/dev/bcache0 デバイスをキャッシュデバイスがアタッチされていないバッキングデバイスに関連付けることもできます。全ての I/O (読み書き) が直接バッキングデバイスに直接渡されることを意味します (パススルーモード)。

2. 使用しているキャッシュモードを確認する

# cat /sys/block/bcache0/bcache/cache_mode
[writethrough] writeback writearound none

上記の例では writethrough モードが有効になっています。

3. bcached デバイスについての情報を表示する:

# bcache-super-show /dev/sdXY

4. バッキングデバイスを停止する:

# echo 1 > /sys/block/sdX/sdX[Y]/bcache/stop

5. キャッシュデバイスを登録解除する:

# echo 1 > /sys/block/sdX/sdX[Y]/bcache/detach

6. キャッシュデバイスを安全に除去する

# echo cache-set-uuid > /sys/block/bcache0/bcache/detach

7. アタッチされたデバイスを開放する

# echo 1 > /sys/fs/bcache/cache-set-uuid/stop

bcache デバイスへのインストール

1. インストールディスク (2013.08.01 以上) を起動。

2. AUR から bcache-toolsAUR パッケージをインストール。

3. HDD をパーティション分割します

ノート: 下記のようにGrub2がbcacheのサポートを提供していないことは事実かもしれませんが、UEFIは完全にサポートしています。したがって、Linuxカーネルがブートデバイスを適切に処理するために必要なモジュールがカーネルにコンパイルされるかinitramfsに含まれ、これらのファイルを含めることができる限り、FAT EFIシステムパーティションで下記記述の個別のブートパーティションを省略できます。詳細は GRUB および/または UEFI を参照してください。

grub がキャッシュを処理することができないため、最低でも2つのパーティションが必要です (起動用のパーティションと bcache のバッキングデバイス用のパーティション)。UEFI を使っている場合、EFI System Partition (ESP) も必要です。例:

     1            2048           22527   10.0 MiB    EF00  EFI System
     2           22528          432127   200.0 MiB   8300  arch_boot
     3          432128       625142414   297.9 GiB   8300  bcache_backing
ノート: この例には、swapfile/partition はありません。キャッシュ上のスワップパーティションには、手順7のLVMを使用してください。キャッシュ外のスワップパーティションには、ここでスワップパーティションを作成してください。

4. HDD を bcache のバッキングデバイスとして設定します。

# make-bcache -B /dev/sda3
ノート:
  • ブートディスクの準備では、決定した結果の影響を知ることが重要です。選択したブートローダー/マネージャーのドキュメントを確認し、再び確認して、bcacheとの関連を真剣に検討してください。
  • 以下のように、関連付けられているすべてのディスクが一度にパーティション化されていれば、bcacheは自動的に "-B バッキングストア" を "-C ssdキャッシュ" にアタッチし、手順5は不要となります。
# make-bcache -B /dev/sd? /dev/sd? -C /dev/sd?

これで /dev/bcache0 デバイスができました。

5. SSD を設定します

SSH をキャッシュデバイスとしてフォーマットしてバッキングデバイスにリンクします

# make-bcache -C /dev/sdb
# echo /dev/sdb > /sys/fs/bcache/register 
# echo UUID__from_previous_command > /sys/block/bcache0/bcache/attach
ノート: UUIDを忘れた場合、キャッシュデバイスの登録後に ls /sys/fs/bcache/ で見つけることができます。

6. bcache デバイスをフォーマットします。/dev/bcache0 デバイスを自由に分割したい場合は LVM あるいは btrfs のサブボリュームを使ってください (/, /home, /var などを分けたい場合など):

# mkfs.btrfs /dev/bcache0
# mount /dev/bcache0 /mnt/
# btrfs subvolume create /mnt/root
# btrfs subvolume create /mnt/home
# umount /mnt

cryptsetupなどを使用したい場合は、LUKSをセットアップすることもできます。例えば、'cryptdevice' カーネルオプション内のbcacheデバイスの参照は正常に機能します。

7. インストール用のマウントポイントを準備します:

# mkfs.ext4 /dev/sda2
# mkfs.msdos /dev/sda1 (ESPが500MB以上の場合、代わりにmkfs.vfatを使ってFAT32パーティションを作成してください)

ここで arch-install-scripts パッケージをインストールします。そうしたら:

# mount /dev/bcache0 -o subvol=root,compress=lzo /mnt/
# mkdir /mnt/boot /mnt/home
# mount /dev/bcache0 -o subvol=home,compress=lzo /mnt/home
# mount /dev/sda2 /mnt/boot
# mkdir /boot/efi
# mount /dev/sda1 /mnt/boot/efi/

8. 下記以外は通常通りインストールガイドに従ってシステムをインストールします:

/etc/mkinitcpio.conf を編集して mkinitcpio -p linux を実行する前に:

  • bcache-toolsAUR パッケージをインストールする。
  • /etc/mkinitcpio.conf を編集し:
    • "bcache" モジュールを追加する
    • "bcache" フックをblockとfilesystem フックの間に追加する
ノート: リブート後に何らかの理由でインストールメディアからバッキングデバイスを開きたい場合、手動で登録する必要があります。bcacheモジュールがロードされていることを確認してから、関連するデバイスを /sys/bcache/register に echo します。dmesgを使って機能したかどうか確認すべきです。

インストールディスクからのアクセス

ここではインストールディスクが起動する前に存在していたbcacheパーティションにインストールディスクからアクセスする方法を示します。前のセクションと同様に、インストールディスクを起動し、AURから bcache-toolsAUR をインストールします。そして、モジュールをカーネルに追加します:

# modprobe bcache

デバイスは/dev/bcache*にすぐには表示されません。カーネルに強制的に見つけさせるために、パーティションテーブルの再読み込みを指示します:

# partprobe

/dev/bcache* が存在するはずなので、マウント、再フォーマットなどを続けることができるようになります。

インターネットを設定しbcache-toolsAURをインストールすることなくキャッシュを開始するには、メインラインカーネルに含まれているカーネルモジュールを前述の様にロードします。それから全てのスレーブデバイスを登録することでキャッシュを開始します:

# echo /dev/sdX > /sys/fs/bcache/register
# echo /dev/sdY > /sys/fs/bcache/register
# ...

最後に必要なスレーブデバイスが登録された直後にbcacheデバイスが現れます。

writethrough バッキングデバイスは、キャッシュを登録しなくても開始することができます。これは、デバイスが多数ありあなたが急いでいる場合、または一部のキャッシュに何らかの理由でアクセスできない場合に実行できます。上述のように、デバイスを登録し、それから開始します:

# echo 1 > /sys/block/sdX/bcache/running

Bcacheは実際にはキャッシュを切り離しておらず、登録されている場合は引き続きキャッシュデバイスを追加します。このコマンドはライトバックバッキングデバイスで"機能"しますが、データが大幅に破損します。見つからないキャッシュが完全に回復不能な場合にのみ実行してください。

設定

警告: discard オプションを有効にしないでください! 回復不能な破損を引き起こす可能性があります。 [4][5]

設定できるオプションは多数存在します (キャッシュモードやキャッシュの消去間隔、シーケンシャル書き込みのヒューリスティックなど)。/sys のファイルに書き込むことで設定します。詳しくは bcache ユーザードキュメント を参照してください。

キャッシュモードを切り替えるには /sys/block/bcache[0-9]/bcache/cache_modewritethrough, writeback, writearound または none のどれかを書き込みます。

/sys の変更は一時的なものであり、再起動すると元に戻ってしまうので注意してください(少なくとも cache_mode にはこの回避策は必要ないようです)。起動時にカスタム設定を行うには /etc/tmpfile.d に .conf ファイルを作成してください。永続的な方法で、bcache0 のシーケンシャルカットオフを 1 MBにしてキャッシュモードを writeback に設定するには、/etc/tmpfiles.d/my-bcache.conf ファイルを以下の内容で作成します:

w /sys/block/bcache0/bcache/sequential_cutoff - - - - 1M
w /sys/block/bcache0/bcache/cache_mode        - - - - writeback

高度な操作

バッキングデバイスのリサイズ

パーティションの開始位置を移動しない限り、バッキングデバイスのサイズを変更することができます。このプロセスは メーリングリスト で説明されています。以下の例では bcache0 上で直接 btrfs ボリュームを使用しています。LVM コンテナや他のファイルシステムの場合、手順は異なります。

拡大例

以下の例では、ファイルシステムを 4GB 拡大します。

1.ライブCD/USBドライブ(bcacheを有効にする必要はありません)で再起動し、fdisk、gdisk、parted、またはその他のお気に入りのツールを使用してバッキングパーティションを削除し、同じ開始位置で合計サイズが4G大きい状態で再作成します。

警告: ファイルシステム操作を実行する可能性のあるGPartedのようなツールは使用しないでください! bcacheパーティションを認識せず、その一部を上書きする可能性があります!!

2. 通常のインストールで再起動します。あなたのファイルシステムは現在マウントされているでしょう。それで大丈夫です。パーティションを最大にリサイズするコマンドを発行します。btrfsの場合、こうします

# btrfs filesystem resize max /

ext3/4の場合はこうです:

# resize2fs /dev/bcache0

縮小例

この例では、ファイルシステムを 4GB 縮小します。

1. writeback キャッシュを無効化 (writethrough キャッシュに切り替え) してディスクが消去されるまで待機してください。

# echo writethrough > /sys/block/bcache0/bcache/cache_mode
$ watch cat /sys/block/bcache0/bcache/state

状態が "clean" になるまで待ってください。しばらく時間がかかります。

キャッシュをバッキングデバイスに強制的にフラッシュする

こうすることを推奨します

 # echo 0 > /sys/block/bcache0/bcache/writeback_percent

これにより、キャッシュのダーティデータが1分以内にフラッシュされます。

その後値を元に戻します

# echo 10 > /sys/block/bcache0/bcache/writeback_percent

2. マウントされたファイルシステムを希望する容量よりいくらか縮小し、後で誤ってクリップしないようにします。btrfsの場合、こうします:

# btrfs filesystem resize -5G /

ext3/4 の場合は resize2fs を使用しますが、パーティションがアンマウントされている場合に限ります

$ df -h /home
/dev/bcache0    290G   20G   270G   1% /home
# umount /home
# resize2fs /dev/bcache0 283G

3. LiveCD/USBドライブ(bcacheをサポートする必要はありません)を再起動し、fdisk、gdisk、parted、またはその他のお気に入りのツールを使用してバッキングパーティションを削除し、同じ開始位置で合計サイズを4G小さくして再作成します。

警告: ファイルシステム操作を実行する可能性のあるGPartedのようなツールは使用しないでください! bcacheパーティションを認識せず、その一部を上書きする可能性があります!!

4. 通常のインストールで再起動します。あなたファイルシステムは現在マウントされているでしょう。それで大丈夫です。パーティションを最大にリサイズするコマンドを発行します(つまり、手順3で実際のパーティションを縮小したサイズ)。btrfsの場合、こうします:

# btrfs filesystem resize max /

ext3/4の場合はこうです:

# resize2fs /dev/bcache0

5. 有効にしたい場合、ライトバックキャッシュを再度有効にします:

# echo writeback > /sys/block/bcache0/bcache/cache_mode
ノート: 非常に注意深くすれば、手順2でファイルシステムを正確なサイズまで縮小することで手順4を回避できます。ただし、多くのパーティションツールは希望どおりに動作せず、代わりにセクター境界の終端まで要求されたパーティションの開始点/終了点を調整します。これを事前に計算するのは難しいかもしれません

トラブルシューティング

起動時に /dev/bcache デバイスが存在しない

以下のようなエラーが busy box シェルに表示される場合:

ERROR: Unable to find root device 'UUID=b6b2d82b-f87e-44d5-bbc5-c51dd7aace15'.
You are being dropped to a recovery shell
    Type 'exit' to try and continue booting

バッキングデバイスが "writeback" モードに設定されていると上記のエラーが発生することがあります (デフォルトは writearound です)。"writeback" モードでは、キャッシュデバイスが登録・アタッチされるまで /dev/bcache0 デバイスは開始しません。登録は起動するたびに行う必要がありますが、アタッチは一度だけ行う必要があります。

ブートを続行するには、次のいずれかを試してください:

  • バッキングデバイスとキャッシュデバイスの両方を登録する
# echo /dev/sda3 > /sys/fs/bcache/register
# echo /dev/sdb > /sys/fs/bcache/register

/dev/bcache0 デバイスが存在する場合、exit と入力して起動を続行してください。ルートデバイスをマウントする前にデバイスが登録されるように initcpio を修正する必要があります。

ノート:
  • "sh: echo: write error: Invalid argument" というエラーは、デバイスが既に登録されているか bcache のバッキングデバイスあるいはキャッシュデバイスとして認識されていないことを意味します。起動時に udev ルールを使っているのであれば、bcache のスーパーブロックが見つかった場合にのみデバイスの登録を試行すべきです。
  • これはインストールのステップ7でudevの69-bcache.rulesを使用し、不正なスーパーブロックが原因でblkidとbcache-probeが"一致しない"場合にも発生する可能性があります。考えられる説明/解決策については、bcacheのwikiを参照してください。
  • キャッシュデバイスをバッキングデバイスに再アタッチする:

キャッシュデバイスが登録されている場合、キャッシュのUUIDを含むフォルダが/sys/fs/bcacheに存在する必要があります。以下の例ではそのUUIDを使ってください:

# ls /sys/fs/bcache/
b6b2d82b-f87e-44d5-bbc5-c51dd7aace15     register     register_quiet
# echo b6b2d82b-f87e-44d5-bbc5-c51dd7aace15 > /sys/block/sda/sda3/bcache/attach

/dev/bcache0 デバイスが現れたら、exitと入力して起動を続行します。再度行う必要はありません。これが続く場合、bcacheメーリングリストで質問してください。

ノート: sh: echo: write error: Invalid argument というエラーは、デバイスが既に登録されていることを意味します。sh: echo: write error: No such file or directory というエラーはUUIDが有効なキャッシュではないことを意味します(正しく入力したことを確認してください)。
  • キャッシュを無効にし、バッキングデバイスをキャッシュなしで強制的に実行します。"dirty_data"などの統計情報を確認して、失われるデータの量を把握することをお勧めします。
# cat /sys/block/sda/sda3/bcache/dirty_data
-3.9M

ダーティデータは、バッキングデバイスに書き込まれていないキャッシュ内のデータです。バッキングデバイスを強制的に実行すると、後でキャッシュを再接続しても、このデータは失われます。

# cat /sys/block/sda/sda3/bcache/running
0
# echo 1 > /sys/block/sda/sda3/bcache/running

これで /dev/bcache0 デバイスが現れます。exitと入力して、起動を続行します。キャッシュデバイスの登録を解除して、make-bcacheを再度実行することをお勧めします。/dev/bcache0へのfsckも賢明でしょう。bcache ドキュメントを参照してください。

警告: 上記の2つのオプションのいずれかが機能しなかった場合にのみ、キャッシュを無効にしてください。

/sys/fs/bcache/ が存在しない

起動したカーネルで bcache が有効になっていないか、bcache モジュールがロードされていません

書き込みエラー: ブロックパラメータが一致しないため、デバイスをアタッチしようとしたときに引数が無効です

デバイスをアタッチしようとしたときに bash: echo: write error: Invalid argument となり、実際のエラーはdmesgで表示されます:

bcache: bch_cached_dev_attach() Couldn't attach sdc: block size less than set's block size

これは、--block 4kパラメータがどちらのデバイスにも設定されておらず、デフォルトが一致しない可能性があるために発生します。

1つのコマンドでバッキングデバイスとキャッシングデバイスの両方を作成すると、問題は自動的に解決されますが、別々のコマンドを使用する場合は、両方のデバイスでブロックサイズパラメータを手動で設定する必要がある場合があります。

参照