「Bcache」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(序文を英語版と同期)
(en:Special:PermanentLink/790715 をインポート)
 
(2人の利用者による、間の29版が非表示)
1行目: 1行目:
 
[[Category:ファイルシステム]]
 
[[Category:ファイルシステム]]
 
[[en:Bcache]]
 
[[en:Bcache]]
  +
[[zh-hans:Bcache]]
[https://bcache.evilpiepirate.org/ Bcache] (block cache) を使うことで SSD を他のブロックデバイス (通常は回転するHDD やアレイ) の読み書きキャッシュ (writeback モード) あるいは読み取りキャッシュ (writethrough または writearound) として活用できます。この記事ではルートパーティションとして Bcache を使って arch をインストールする方法を説明します。bcache 自体の説明は [https://bcache.evilpiepirate.org/ bcache のホームページ] を読んでください。必ず[https://www.kernel.org/doc/html/latest/admin-guide/bcache.html bcacheのマニュアル]を読んで参照してください。Bcache は 3.10 からメインラインカーネルの中にあります。archインストールディスクのカーネルには 2013.08.01 からbcacheモジュールが含まれています。
 
  +
<!-- 翻訳除外: {{Style|Some first-person comments, see [[Help:Style]].}} -->
  +
{{Related articles start}}
  +
{{Related|Bcachefs}}
  +
{{Related|LVM2}}
  +
{{Related articles end}}
  +
  +
[https://bcache.evilpiepirate.org/ Bcache] (block cache) を使うことで SSD を他のブロックデバイス (通常は回転する HDD やアレイ) の読み書きキャッシュ (writeback モード) あるいは読み取りキャッシュ (writethrough または writearound) として活用できます。この記事ではルートパーティションとして Bcache を使って Arch をインストールする方法を説明します。bcache 自体の説明は [https://bcache.evilpiepirate.org/ bcache のホームページ] を読んでください。必ず [https://docs.kernel.org/admin-guide/bcache.html bcache のマニュアル] を読んで参照してください。
   
 
{{Tip|Bcache の代わりになるものは [[LVM#Cache|LVM cache]]です。}}
 
{{Tip|Bcache の代わりになるものは [[LVM#Cache|LVM cache]]です。}}
7行目: 14行目:
 
Bcache を使うにはバッキングデバイスを bcache ブロックデバイスとしてフォーマットする必要があります。大抵の場合、[https://github.com/g2p/blocks blocks to-bcache] でインプレース変換を実行できます。
 
Bcache を使うにはバッキングデバイスを bcache ブロックデバイスとしてフォーマットする必要があります。大抵の場合、[https://github.com/g2p/blocks blocks to-bcache] でインプレース変換を実行できます。
   
  +
{{Out of date|Linux 3.18 の on-disk フォーマットの後方互換性のない変更は誤りであると報告されています。bcache on-disk フォーマットの変更は 3.19 の時点ではまだアップストリームに反映されていません. その後、Linux はバージョン 6.2 になっていますが、関連する文章はいつ壊れた変更がなされたか正確に反映していますか? その言及はまだ必要ですか?}}
{{Warning|
 
  +
* 重要なデータは最初にバックアップしてください。
 
  +
{{Warning|1=<nowiki/>
* bcache-dev ブランチは活発に開発されています。3.18 におけるオンディスクフォーマットの変更は前のフォーマットとの後方互換性がありません [https://www.spinics.net/lists/linux-bcache/msg02721.html]。注: これはbcache-devをコンパイルするユーザにのみ該当します。上流の Linux カーネルに組み込まれているバージョンには影響はありません [https://www.spinics.net/lists/linux-bcache/msg02724.html]。
 
  +
* 最初に重要なデータをバックアップしてください。
  +
* bcache-dev ブランチは活発に開発されています。on-disk フォーマットは 3.18 で変更されており、以前のフォーマットとの後方互換性はありません [https://lore.kernel.org/linux-bcache/20150104004621.GA4460@kmo-pixel/]。注: これは bcache-dev をコンパイルするユーザにのみ該当します。上流の Linux カーネルに組み込まれているバージョンには影響はありません [https://lore.kernel.org/linux-bcache/CACHGV4KV-y3JD=i6jy_0jaapZYBKxOYr1+PL=0dsAe+M83Y_Ew@mail.gmail.com/]。
 
* Bcache と [[btrfs]] を組み合わせるとファイルシステムが壊れてしまう可能性があります。詳しくは [https://www.hdevalence.ca/blog/2013-09-21-notes-on-my-archlinux-install こちらの記事] を参照してください。Btrfs wiki によればカーネル 3.19 以上では修正されているとのことです [https://btrfs.wiki.kernel.org/index.php/Gotchas#Historical_references]。
 
* Bcache と [[btrfs]] を組み合わせるとファイルシステムが壊れてしまう可能性があります。詳しくは [https://www.hdevalence.ca/blog/2013-09-21-notes-on-my-archlinux-install こちらの記事] を参照してください。Btrfs wiki によればカーネル 3.19 以上では修正されているとのことです [https://btrfs.wiki.kernel.org/index.php/Gotchas#Historical_references]。
* カーネルバージョン5.12.0-5.12.10には重大なバグがあります。[https://www.spinics.net/lists/linux-bcache/msg10077.html ここを参照してください]。もし該当する場合、ログに"kernel BUG at block/bio.c:52" または "kernel BUG at block/bio.c:53" と表示され、数時間使用するとシステムがフリーズします。
 
 
}}
 
}}
   
== 既存の環境bcache デバイスをセットアップ ==
+
== 既存のシステムbcached btrfs ファルシテムをセットアップ ==
   
  +
{{Warning|make-bcache は既存のドライブやパーティションをインポート '''しません''' - 再フォーマットします。}}
1. [[AUR]] から {{AUR|bcache-tools}} パッケージをインストールしてください。
 
   
  +
=== 準備 ===
2. バッキングデバイスを作成してください (通常はメカニカルなドライブになります)。バッキングデバイスはデバイス全体でもパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。以下のコマンドで {{ic|/dev/bcache0}} が作成されます:
 
  +
  +
{{AUR|bcache-tools}} を [[インストール]] します。
  +
  +
キャッシュとバッキングデータを保持するために fdisk を使用して SSD とハードドライブに適切なパーティションを作成します。
  +
{{Tip| 1台のドライブに多数のパーティションを作成することが可能です。これにより、コミットする前に複雑なセットアップをテストできます。ドライブに障害が発生すると全てのデータが失われることに注意してください。好ましくないアクセスパターンためドライブのパフォーマンスも低下します。}}
  +
  +
=== 状況: 1台のハードドライブと1台の読み取りキャッシュ SSD ===
  +
  +
{{Warning|
  +
* 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
  +
  +
{{Note|{{ic|--block 4k}} オプションを省略する必要があるかもしれません。 [https://unix.stackexchange.com/questions/359508/cannot-attach-cache-device-to-backing-device キャッシュデバイスをバッキングデバイスにアタッチできない]を参照してください。}}
  +
  +
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 ===
  +
  +
{{Warning|
  +
* 書き込みキャッシュを有効にしないでください。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/sdx1
  +
# make-bcache -B /dev/sdy1
   
3. キャッシュデバイスを作成てください (通常は SSD になります)。バッングデバイスもブロックデバイスなら何でもかまいません。
+
2. キャッシュデバイスをフォーマットます (通常は SSD になります)。キャッシュデバイスはデバイス全体でパーティションでも、あるいは他の標準ブロックデバイスでもかまいません。バッキングデバイスのグループに追加できるのは一つのキャッシュデバイスだけです
# make-bcache -C /dev/sdy2
 
上記の例ではデフォルトのブロックサイズ 512B とバケットサイズ 128kB を使います。ブロックサイズはバッキングデバイスのセクタサイズ (通常は 512 あるいは 4k となります) と一致させるべきです。バケットサイズはライトアンプリフィケーションを避けるためにキャッシュデバイスの消去ブロックサイズ (EBS) と合わせるべきです。例えば、4k セクタの HDD と消去ブロックサイズが 2MB の SSD を使用する場合、コマンドは以下のようになります:
 
# make-bcache --block 4k --bucket 2M -C /dev/sdy2
 
   
  +
# make-bcache -C /dev/sdk1
4. バッキングデバイスに対してキャッシュデバイスを登録してください。{{ic|# bcache-super-show /dev/sdy2 &#124; grep cset.uuid}} を実行して''キャッシュセット UUID'' を確認し、最初に bcache デバイスに追加してください。再起動後は Udev ルールによって実行されるため、一回だけ実行すれば十分です:
 
  +
  +
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 ===
  +
  +
{{Warning|
  +
* ライトバックモードの 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 '''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. ライトバックモードを有効にします
  +
  +
{{Warning|
  +
* Bcache 書き込みキャッシュは btrfs ファイルシステムに壊滅的な障害を引き起こす可能性があります。
  +
* Btrfs は配下のデバイスが順番に書き込みを実行すると想定していますが、bcache ライトバックはこの前提に違反する恐れがあり、これを使う btrfs ファイルシステムを崩壊させるかもしれません。
  +
* すべてのレイヤーまたはライト・キャッシュは停電時にデータを失うリスクを高めます。
  +
* 自己責任で btrfs とライトバックモードの bcache を使用してください。
  +
}}
   
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 引数はファイルシステムのラベルを定義します。
6. initcpio のときからパーティションを使えるようにする必要がある場合 (ブートプロセスの中で必要とする場合)、{{ic|/etc/mkinitcpio.conf}} の MODULES 行に 'bcache' を追加して {{ic|block}} と {{ic|filesystem}} の間に 'bcache' フックを追加してください。その後、initramfs イメージを再生成してください。
 
  +
  +
# mkfs.btrfs -L STORAGE -f -d raid1 -m raid1 /dev/bcache0 /dev/bcache1 /dev/bcache2
  +
  +
7. ファイルシステムをマウントします
  +
  +
# mount /dev/bcache0 /mnt
  +
  +
=== 状況: 5台のハードドライブと3台のキャッシュ SSD ===
  +
  +
{{Warning|
  +
* ライトバックモードの各キャッシュデバイスは、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 の管理 ===
 
=== Bcache の管理 ===
  +
1. 正しくセットアップされていることを確認:
 
  +
1. 正しくセットアップされていることを確認する
   
 
# cat /sys/block/bcache0/bcache/state
 
# cat /sys/block/bcache0/bcache/state
   
 
出力は以下のどれかになります:
 
出力は以下のどれかになります:
* '''no cache''': bcache のバッキングデバイスにキャッシュデバイスが登録されていません。
 
* '''clean''': 全て問題ありません。キャッシュはクリーンな状態です。
 
* '''dirty''': 正しくセットアップされており ''writeback'' が有効になっていてキャッシュが汚い状態です。
 
* '''inconsistent''': バッキングデバイスがキャッシュデバイスと同期されていない問題が発生しています。
 
   
{{ic|/dev/bcache0}} デバイスキャッシュデバイスがアタッチされていないバッキングデバイスに関連付けることもできます。全ての I/O (読み書き) が直接バッキングデバイスに渡されるようになります (パススルーモード)
+
* {{ic|no cache}}: bcache のバッキングデバイスキャッシュデバイスが登録されていないことを意味します。
  +
* '''clean''': 全て問題ないことを意味します。キャッシュはクリーンです。
  +
* '''dirty''': 全て正しくセットアップされており ''writeback'' が有効になっていてキャッシュがダーティであることを意味します。
  +
* '''inconsistent''': バッキングデバイスがキャッシュデバイスと同期されていないため問題が発生しています。
   
  +
{{ic|/dev/bcache0}} デバイスをキャッシュデバイスがアタッチされていないバッキングデバイスに関連付けることもできます。全ての I/O (読み書き) が直接バッキングデバイスに直接渡されることを意味します (パススルーモード)。
2. 使用しているキャッシュモードを確認するには:
 
  +
{{bc|# cat /sys/block/bcache0/bcache/cache_mode
 
  +
2. 使用しているキャッシュモードを確認する
  +
  +
{{hc|# cat /sys/block/bcache0/bcache/cache_mode|
 
[writethrough] writeback writearound none
 
[writethrough] writeback writearound none
 
}}
 
}}
  +
 
上記の例では ''writethrough'' モードが有効になっています。
 
上記の例では ''writethrough'' モードが有効になっています。
   
3. bcached デバイスについての情報を表示:
+
3. bcached デバイスについての情報を表示する:
   
 
# bcache-super-show /dev/sdXY
 
# bcache-super-show /dev/sdXY
   
4. バッキングデバイスを停止:
+
4. バッキングデバイスを停止する:
   
 
# echo 1 > /sys/block/sdX/sdX[Y]/bcache/stop
 
# echo 1 > /sys/block/sdX/sdX[Y]/bcache/stop
   
5. キャッシュデバイス登録解除:
+
5. キャッシュデバイス登録解除する:
   
 
# echo 1 > /sys/block/sdX/sdX[Y]/bcache/detach
 
# echo 1 > /sys/block/sdX/sdX[Y]/bcache/detach
   
6. キャッシュデバイスを安全に除去:
+
6. キャッシュデバイスを安全に除去する
  +
# echo <cache-set-uuid> > /sys/block/bcache0/bcache/detach
 
  +
# echo ''cache-set-uuid'' > /sys/block/bcache0/bcache/detach
  +
  +
7. アタッチされたデバイスを開放する
   
  +
# echo 1 > /sys/fs/bcache/''cache-set-uuid''/stop
7. 登録されたデバイスを開放:
 
# echo 1 > /sys/fs/bcache/<cache-set-uuid>/stop
 
   
== bcache デバイスインストール ==
+
== bcache デバイスへのインストール ==
   
 
1. インストールディスク (2013.08.01 以上) を起動。
 
1. インストールディスク (2013.08.01 以上) を起動。
77行目: 307行目:
 
2. [[AUR]] から {{AUR|bcache-tools}} パッケージをインストール。
 
2. [[AUR]] から {{AUR|bcache-tools}} パッケージをインストール。
   
3. HDD をパーティション:
+
3. HDD をパーティション分割します
   
  +
{{Note|Grub2 が以下に述べるように bcache をサポートしていないことは事実かもしれませんが、UEFI は完全にサポートしています。つまり、Linux カーネルがブートデバイスを適切に処理するために必要なモジュールがカーネルにコンパイルされているか initramfs に含まれており、これらのファイルを initramfs に含めることができれば、下記で説明する個別のブートパーティションを省略して FAT EFI システムパーティションを使えます。詳細は [[GRUB]] および/または [[UEFI]] を参照してください。}}
{{Note|While it may be true that Grub2 does not offer support for bcache as noted below, it does, however, fully support UEFI. It follows then, that so long as the necessary modules for the linux kernel to properly handle your boot device are either compiled into the kernel or are included in an initramfs, and you can include these files on it, the separate boot partition described below may be omitted in favor of the FAT EFI system partition. See [[GRUB]] and/or [[UEFI]] for more.}}
 
grub がキャッシュ処理することができないため、最低でも2つのパーティションが必要です (起動用のパーティションと bcache バッキングデバイス用のパーティション)。UEFI を使っている場合、[[EFI System Partition]] (ESP) も必要です。例:
+
grub は bcache 扱えないため、最低でも2つのパーティションが必要です (起動用と bcache バッキングデバイス用のパーティション)。UEFI を使っている場合、[[EFI System Partition]] (ESP) も必要です。例:
1 2048 22527 10.0 MiB EF00 EFI System
+
1 2048 22527 10.0 MiB EF00 EFI System
2 22528 432127 200.0 MiB 8300 arch_boot
+
2 22528 432127 200.0 MiB 8300 arch_boot
3 432128 625142414 297.9 GiB 8300 bcache_backing
+
3 432128 625142414 297.9 GiB 8300 bcache_backing
   
  +
{{Note|この例には、swapfile/partition はありません。キャッシュ上のスワップパーティションには、手順7の LVM を使用してください。キャッシュ外のスワップパーティションには、ここでスワップパーティションを作成してください。}}
{{Note|This example has no swapfile/partition. For a swap partition on the cache, use LVM in step 7. For a swap partition outside the cache, be sure to make a swap partition now.}}
 
   
4. HDD を bcache のバッキングデバイスとして設定:
+
4. HDD を bcache のバッキングデバイスとして設定します。
   
 
# make-bcache -B /dev/sda3
 
# make-bcache -B /dev/sda3
   
 
{{Note|
 
{{Note|
  +
* ブートディスクの準備では、決定した結果の影響を知ることが重要です。選択したブートローダー/マネージャーのドキュメントを何度も確認し、bcache との関連を真剣に検討してください。
* When preparing any boot disk it is important to know the ramifications of any decision you may make. Please review and review again the documentation for your chosen boot-loader/-manager and consider seriously how it might relate to bcache.
 
  +
* 以下のように、関連付けられているすべてのディスクが一度にパーティション化された場合、bcache は自動的に "-B バッキングストア" を "-C ssd キャッシュ" にアタッチし、手順5は不要となります。
* If all associated disks are partitioned at once as below bcache will automatically attach "-B backing stores" to the "-C ssd cache" and step 6 is unnecessary.
 
 
}}
 
}}
   
 
# make-bcache -B /dev/sd? /dev/sd? -C /dev/sd?
 
# make-bcache -B /dev/sd? /dev/sd? -C /dev/sd?
   
これで {{ic|/dev/bcache0}} デバイスが作成され
+
これで {{ic|/dev/bcache0}} デバイスができした
   
  +
5. SSD を設定します
5. SSD を設定。SSH をキャッシュデバイスとしてフォーマットしてバッキングデバイスにリンク:
 
  +
  +
SSD をキャッシュデバイスとしてフォーマットしてバッキングデバイスにリンクします
   
 
# make-bcache -C /dev/sdb
 
# make-bcache -C /dev/sdb
106行目: 338行目:
 
# echo ''UUID__from_previous_command'' > /sys/block/bcache0/bcache/attach
 
# echo ''UUID__from_previous_command'' > /sys/block/bcache0/bcache/attach
   
{{Note|If the UUID is forgotten, it can be found with {{ic|ls /sys/fs/bcache/}} after the cache device has been registered.}}
+
{{Note|UUID を忘れた場合、キャッシュデバイスの登録後に {{ic|ls /sys/fs/bcache/}} で見つけることができます。}}
   
6. bcache デバイスを作成。{{ic|/dev/bcache0}} デバイスを自由に分割したい場合は LVM あるいは btrfs のサブボリュームを使ってください ({{ic|/}}, {{ic|/home}}, {{ic|/var}} などを分けたい場合など):
+
6. bcache デバイスをフォーマットします。{{ic|/dev/bcache0}} デバイスを自由に分割したい場合は LVM あるいは btrfs のサブボリュームを使ってください ({{ic|/}}, {{ic|/home}}, {{ic|/var}} などを分けたい場合など):
   
 
# mkfs.btrfs /dev/bcache0
 
# mkfs.btrfs /dev/bcache0
116行目: 348行目:
 
# umount /mnt
 
# umount /mnt
   
  +
cryptsetupなどを使用したい場合は、LUKS をセットアップすることもできます。例えば、'cryptdevice' カーネルオプション内のbcacheデバイスの参照は正常に機能します。
7. インストール用のマウントポイントを作成:
 
  +
  +
7. インストール用のマウントポイントを準備します:
   
 
# mkfs.ext4 /dev/sda2
 
# mkfs.ext4 /dev/sda2
# mkfs.msdos /dev/sda1 (if your ESP is at least 500MB, use mkfs.vfat to make a FAT32 partition instead)
+
# mkfs.msdos /dev/sda1 (ESP 500MB 以上の場合、代わりに mkfs.vfat を使って FAT32 パーティションを作成してください)
  +
# pacman -S arch-install-scripts
 
  +
ここで {{Pkg|arch-install-scripts}} パッケージをインストールします。そうしたら:
  +
 
# mount /dev/bcache0 -o subvol=root,compress=lzo /mnt/
 
# mount /dev/bcache0 -o subvol=root,compress=lzo /mnt/
# mkdir /mnt/boot /mnt/home
+
# mount --mkdir /dev/bcache0 -o subvol=home,compress=lzo /mnt/home
# mount /dev/bcache0 -o subvol=home,compress=lzo /mnt/home
+
# mount --mkdir /dev/sda2 /mnt/boot
# mount /dev/sda2 /mnt/boot
+
# mount --mkdir /dev/sda1 /mnt/efi
# mkdir /boot/efi
 
# mount /dev/sda1 /mnt/boot/efi/
 
   
8. [[インストールガイド]]に従ってシステムをインストールしてください。ただし以下の設定を行って下さい:
+
8. 下記以外は通常通り [[インストールガイド]] に従ってシステムをインストールします:
   
以下行っから {{ic|mkinitcpio -p linux}} を実行してください:
+
{{ic|/etc/mkinitcpio.conf}} 編集して {{ic|mkinitcpio -p linux}} を実行する前に:
   
* [[AUR]] から {{AUR|bcache-tools}} パッケージをインストール。
+
* {{AUR|bcache-tools}} パッケージを[[インストール]]する
* {{ic|/etc/mkinitcpio.conf}} を編集:
+
* {{ic|/etc/mkinitcpio.conf}} を編集:
** "bcache" モジュールを追加
+
** "bcache" モジュールを追加する
** {{ic|block}}{{ic|filesystem}} フックの間に "bcache" フックを追加
+
** "bcache" フックを block と filesystem フックの間に追加する
  +
  +
{{Note| リブート後に何らかの理由でインストールメディアからバッキングデバイスを開きたい場合、手動で登録する必要があります。bcache モジュールがロードされていることを確認してから、関連するデバイスを /sys/bcache/register に echo します。[[dmesg]] を使って機能したかどうか確認すべきです。}}
  +
  +
== インストールディスクからのアクセス ==
  +
  +
ここではインストールディスクが起動する前に存在していた bcache パーティションにインストールディスクからアクセスする方法を示します。前のセクションと同様に、インストールディスクを起動し、AUR から {{AUR|bcache-tools}} をインストールします。そして、モジュールをカーネルに追加します:
  +
  +
# modprobe bcache
  +
  +
デバイスは {{ic|/dev/bcache*}} にすぐには表示されません。カーネルに強制的に見つけさせるために、パーティションテーブルの再読み込みを指示します:
  +
  +
# partprobe
  +
  +
{{ic|/dev/bcache*}} が存在するはずなので、マウント、再フォーマットなどを続けることができるようになります。
  +
  +
インターネットを設定し {{AUR|bcache-tools}} をインストールすることなくキャッシュを開始するには、メインラインカーネルに含まれているカーネルモジュールを前述の様にロードします。それから全てのスレーブデバイスを登録することでキャッシュを開始します:
  +
  +
# echo /dev/sdX > /sys/fs/bcache/register
  +
# echo /dev/sdY > /sys/fs/bcache/register
  +
# ...
  +
  +
最後に必要なスレーブデバイスが登録された直後に bcache デバイスが現れます。
  +
  +
''writethrough'' バッキングデバイスは、キャッシュを登録しなくても開始することができます。これは、デバイスが多数ありあなたが急いでいる場合、または一部のキャッシュに何らかの理由でアクセスできない場合に実行できます。上述のように、デバイスを登録し、それから開始します:
  +
  +
# echo 1 > /sys/block/sdX/bcache/running
  +
  +
Bcache は実際にはキャッシュを切り離しておらず、登録されている場合は引き続きキャッシュデバイスを追加します。このコマンドはライトバックバッキングデバイスで "機能" しますが、データが大幅に破損します。見つからないキャッシュが完全に回復不能な場合にのみ実行してください。
   
 
== 設定 ==
 
== 設定 ==
   
  +
{{Warning|1={{ic|discard}} オプションを有効にしないでください! 回復不能な破損を引き起こす可能性があります。 [https://bugzilla.kernel.org/show_bug.cgi?id=197377][https://lore.kernel.org/linux-bcache/CAJ+L6qeOVY_KofXsZKihHrbHaYzQTKYAh0Shm7Givj+f8=PiBg@mail.gmail.com/]}}
設定できるオプションは多数存在します (キャッシュモードやキャッシュの消去間隔、シーケンシャル書き込みのヒューリスティックなど)。{{ic|/sys}} のファイルに書き込むことで設定します。詳しくは [http://atlas.evilpiepirate.org/git/linux-bcache.git/tree/Documentation/bcache.txt bcache のユーザードキュメント] を見てください。
 
  +
  +
設定できるオプションは多数存在します (キャッシュモードやキャッシュのフラッシュ間隔、シーケンシャル書き込みのヒューリスティックなど)。{{ic|/sys}} のファイルに書き込むことで設定します。詳しくは [https://docs.kernel.org/admin-guide/bcache.html bcache ユーザードキュメント] を参照してください。
   
キャッシュモードを切り替えるには {{ic|/sys/block/bcache[0-9]/bcache/cache_mode}} に 'writethrough', 'writeback', 'writearound', 'none' のどれかを書き込みます。
+
キャッシュモードを切り替えるには {{ic|/sys/block/bcache[0-9]/bcache/cache_mode}} に {{ic|writethrough}}, {{ic|writeback}}, {{ic|writearound}} または {{ic|none}} のどれかを書き込みます。
   
{{ic|/sys}} の変更は一時的なものであり、再起動すると元に戻ってしまうので注意してください。起動時にカスタム設定を行うには {{ic|/etc/tmpfile.d}} に {{ic|.conf}} ファイルを作成してください。例えば bcache0 のシーケンシャルカットオフを 1 MB にしてキャッシュモードを writeback に永続的に設定するには、{{ic|/etc/tmpfile.d/my-bcache.conf}} ファイルを以下の内容で作成します:
+
{{ic|/sys}} の変更は一時的なものであり、再起動すると元に戻ってしまうので注意してください(少なくとも cache_mode にはこの回避策は必要ないようです)。起動時にカスタム設定を行うには {{ic|/etc/tmpfile.d}} に .conf ファイルを作成してください。永続的な方法で、{{ic|bcache0}} のシーケンシャルカットオフを 1 MB にしてキャッシュモードを writeback に設定するには、{{ic|/etc/tmpfiles.d/my-bcache.conf}} ファイルを以下の内容で作成します:
   
 
w /sys/block/bcache0/bcache/sequential_cutoff - - - - 1M
 
w /sys/block/bcache0/bcache/sequential_cutoff - - - - 1M
 
w /sys/block/bcache0/bcache/cache_mode - - - - writeback
 
w /sys/block/bcache0/bcache/cache_mode - - - - writeback
   
  +
=== Situation: Prevent all write access to a HDD ===
== ヒントとテクニック ==
 
  +
{{Warning|
  +
* When the hard drive or the SSD fails, all data is lost.
  +
* Consider using BTRFS RAID to prevent data loss when a SSD / HDD fails.
  +
}}
  +
In this situation the goal is to keep he HDD idle as long as possible. This is achieved by absorbing all writes with the SSD. The hard drive is only activated when the SSD is full, or when something is read that's not on the SSD.
  +
  +
Enable the writeback cache mode:
  +
  +
# echo writeback > /sys/block/bcache0/bcache/cache_mode
  +
  +
Let bcache completely sync with the hard drive.
  +
  +
# echo 0 > /sys/block/bcache0/bcache/writeback_percent
  +
  +
Don't let sequential IO bypass the cache:
  +
  +
# echo 0 > /sys/block/bcache0/bcache/sequential_cutoff
  +
  +
Let bcache wait a week after the previous sync is done:
  +
  +
# echo $((7*24*60*60)) > /sys/block/bcache0/bcache/writeback_delay
  +
  +
Don't let bcache go around the cache when there's read / write congestion
  +
  +
# echo 0 > /sys/fs/bcache/<cache set>/congested_read_threshold_us
  +
# echo 0 > /sys/fs/bcache/<cache set>/congested_write_threshold_us
  +
  +
Put the HDD to sleep after 20 minutes:
  +
# hdparm -S 240 /dev/$(cat /sys/block/bcache0/bcache/backing_dev_name)
  +
/dev/sdh1:
  +
setting standby to 240 (20 minutes)
  +
  +
  +
First use lsblk to get the device names of the HDD and SSD. In this example /dev/sdh1 is the HDD, /dev/sdc1 is the SSD:
  +
  +
# lsblk -M -s
  +
bcache0 254:0 0 931.5G 0 disk
  +
├─sdc1 8:33 0 111.8G 0 part
  +
│ └─sdc 8:32 0 111.8G 0 disk
  +
└─sdh1 8:113 0 931.5G 0 part
  +
└─sdh 8:112 0 931.5G 0 disk
  +
  +
Now Dstat can be used to monitor disk access to the members of the bcache set.
  +
  +
$ dstat -D sdc1,sdh1
  +
  +
== 高度な操作 ==
   
 
=== バッキングデバイスのリサイズ ===
 
=== バッキングデバイスのリサイズ ===
   
パーティションの開始位置を移動しない限り、バッキングデバイスのサイズを変更することができます。詳しくは [http://comments.gmane.org/gmane.linux.kernel.bcache.devel/249 メーリングリスト] で説明されています。以下の例では bcache0 上で直接 btrfs ボリュームを使用しています。LVM コンテナや他のファイルシステムの場合、手順は変わります。
+
パーティションの開始位置を移動しない限り、バッキングデバイスのサイズを変更することができます。このプロセスは [https://lore.kernel.org/linux-bcache/CAH+dOxJv-ajvLfbUSo8dqG0a8_grNBhfxJ1EbmSrYZz0YXJM2w@mail.gmail.com/T/ メーリングリスト] で説明されています。以下の例では bcache0 上で直接 btrfs ボリュームを使用しています。LVM コンテナや他のファイルシステムの場合、手順は異なります。
   
==== 拡大 ====
+
==== 拡大 ====
   
以下の例では、ファイルシステムを 4GB にまで拡大します。
+
以下の例では、ファイルシステムを 4GB 拡大します。
   
  +
1.ライブ CD/USB ドライブ(bcacheを有効にする必要はありません)で再起動し、fdisk、gdisk、parted、またはその他のお気に入りのツールを使用してバッキングパーティションを削除し、同じ開始位置で合計サイズが 4G 大きい状態で再作成します。
1. Reboot to a live CD/USB Drive (need not be bcache enabled) and use fdisk, gdisk, parted, or your other favorite tool to delete the backing partition and recreate it with the same start and a total size 4G larger.
 
   
  +
{{Warning|ファイルシステム操作を実行する可能性のある GParted のようなツールは使用しないでください! bcache パーティションを認識せず、その一部を上書きする可能性があります!!}}
{{Warning|Do not use a tool like GParted that might perform filesystem operations! It will not recognize the bcache partition and might overwrite part of it!!}}
 
   
  +
2. 通常のインストールで再起動します。あなたのファイルシステムは現在マウントされているでしょう。それで大丈夫です。パーティションを最大にリサイズするコマンドを発行します。btrfs の場合、こうします
2. Reboot to your normal install. Your filesystem will be currently mounted. That is fine. Issue the command to resize the partition to its maximum. For btrfs, that is
 
   
 
# btrfs filesystem resize max /
 
# btrfs filesystem resize max /
   
  +
ext3/4 の場合はこうです:
For ext3/4, that is:
 
   
 
# resize2fs /dev/bcache0
 
# resize2fs /dev/bcache0
   
==== 縮小 ====
+
==== 縮小 ====
   
以下の例ではファイルシステムを 4GB まで縮小します。
+
の例ではファイルシステムを 4GB 縮小します。
   
1. writeback キャッシュを無効化 (writethrough キャッシュに切り替え) してディスクが消去されるまで待機する:
+
1. writeback キャッシュを無効化 (writethrough キャッシュに切り替え) してディスクが消去されるまで待機してください。
   
 
# echo writethrough > /sys/block/bcache0/bcache/cache_mode
 
# echo writethrough > /sys/block/bcache0/bcache/cache_mode
181行目: 492行目:
 
状態が "clean" になるまで待ってください。しばらく時間がかかります。
 
状態が "clean" になるまで待ってください。しばらく時間がかかります。
   
{{Note|以下のコマンド使って強制的にキャッシュを消去することを推奨します:
+
===== キャッシュバッキングデバイスに強制的にフラッシュする =====
   
  +
こうすることを推奨します
# echo 0 > /sys/block/bcache0/bcache/writeback_percent
 
   
  +
# echo 0 > /sys/block/bcache0/bcache/writeback_percent
バッキングデバイスに存在するキャッシュデータが1分以内で消去されます。
 
   
  +
これにより、キャッシュのダーティデータが1分以内にフラッシュされます。
消去できたら以下のコマンドで値を元に戻してください:
 
  +
  +
その後値を元に戻します
   
 
# echo 10 > /sys/block/bcache0/bcache/writeback_percent
 
# echo 10 > /sys/block/bcache0/bcache/writeback_percent
}}
 
   
  +
2. マウントされたファイルシステムを希望する容量よりいくらか縮小し、後で誤ってクリップしないようにします。btrfs の場合、こうします:
2. Shrink the mounted filesystem by something more than the desired amount, to ensure we do not accidentally clip it later. For btrfs, that is:
 
   
# btrfs filesystem resize -5G /
+
# btrsfs filesystem resize -5G /
   
ext3/4 の場合は ''resize2fs'' を使用します (ただしパーティションがアンマウントされている必要があります):
+
ext3/4 の場合は ''resize2fs'' を使用しますが、パーティションがアンマウントされている場合に限ります
  +
  +
{{hc|$ df -h /home|
  +
/dev/bcache0 290G 20G 270G 1% /home
  +
}}
   
$ df -h /home
 
/dev/bcache0 290G 20G 270G 1% /home
 
 
# umount /home
 
# umount /home
 
# resize2fs /dev/bcache0 283G
 
# resize2fs /dev/bcache0 283G
   
  +
3. LiveCD/USB ドライブ(bcache をサポートする必要はありません)を再起動し、fdisk、gdisk、parted、またはその他のお気に入りのツールを使用してバッキングパーティションを削除し、同じ開始位置で合計サイズを 4G 小さくして再作成します。
3. Reboot to a LiveCD/USB drive (does not need to support bcache) and use fdisk, gdisk, parted, or your other favorite tool to delete the backing partition and recreate it with the same start and a total size 4G smaller.
 
   
  +
{{Warning|ファイルシステム操作を実行する可能性のある GParted のようなツールは使用しないでください! bcache パーティションを認識せず、その一部を上書きする可能性があります!!}}
{{Warning|Do not use a tool like GParted that might perform filesystem operations! It will not recognize the bcache partition and might overwrite part of it!!}}
 
   
  +
4. 通常のインストールで再起動します。あなたファイルシステムは現在マウントされているでしょう。それで大丈夫です。パーティションを最大にリサイズするコマンドを発行します(つまり、手順3で実際のパーティションを縮小したサイズ)。btrfs の場合、こうします:
4. Reboot to your normal install. Your filesystem will be currently mounted. That is fine. Issue the command to resize the partition to its maximum (that is, the size we shrunk the actual partition to in step 3). For btrfs, that is:
 
   
 
# btrfs filesystem resize max /
 
# btrfs filesystem resize max /
   
  +
ext3/4 の場合はこうです:
For ext3/4, that is:
 
   
 
# resize2fs /dev/bcache0
 
# resize2fs /dev/bcache0
   
  +
5. 有効にしたい場合、ライトバックキャッシュを再度有効にします:
5. Re-enable writeback cache if you want that enabled:
 
   
 
# echo writeback > /sys/block/bcache0/bcache/cache_mode
 
# echo writeback > /sys/block/bcache0/bcache/cache_mode
   
  +
{{Note|非常に注意深くすれば、手順2でファイルシステムを正確なサイズまで縮小することで手順4を回避できます。ただし、多くのパーティションツールは希望どおりに動作せず、代わりにセクター境界の終端まで要求されたパーティションの開始点/終了点を調整します。これを事前に計算するのは難しいかもしれません}}
{{Note|If you are very careful you can shrink the filesystem to the exact size in step 2 and avoid step 4. Be careful, though, many partition tools do not do exactly what you want, but instead adjust the requested partition start/end points to end on sector boundaries. This may be difficult to calculate ahead of time}}
 
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
225行目: 539行目:
 
=== 起動時に /dev/bcache デバイスが存在しない ===
 
=== 起動時に /dev/bcache デバイスが存在しない ===
   
以下のようなエラーが busybox シェルに表示される場合:
+
以下のようなエラーが busy box シェルに表示される場合:
   
 
{{bc|1=
 
{{bc|1=
233行目: 547行目:
 
}}
 
}}
   
バッキングデバイスが "writeback" モードに設定されていると上記のエラーが発生することがあります (デフォルトは writearound です)。"writeback" モードでは、キャッシュデバイスが登録・アタッチされるまで {{ic|/dev/bcache0}} デバイスが起動しません。登録は起動するたびに行う必要がありますが、アタッチは一度だけやれば十分です。
+
バッキングデバイスが "writeback" モードに設定されていると上記のエラーが発生することがあります (デフォルトは writearound です)。"writeback" モードでは、キャッシュデバイスが登録・アタッチされるまで /dev/bcache0 デバイスは開始しません。登録は起動するたびに行う必要がありますが、アタッチは一度だけ行う必要があります。
   
ブートを続行するには、以下方法を試してみてください:
+
ブートを続行するには、いずれかを試してください:
   
* バッキングデバイスとキャッシュデバイスの両方を登録する:
+
* バッキングデバイスとキャッシュデバイスの両方を登録する
   
 
# echo /dev/sda3 > /sys/fs/bcache/register
 
# echo /dev/sda3 > /sys/fs/bcache/register
 
# echo /dev/sdb > /sys/fs/bcache/register
 
# echo /dev/sdb > /sys/fs/bcache/register
   
{{ic|/dev/bcache0}} デバイスが現れたら、exit と入力して起動を続行してください。ルートデバイスをマウントする前にデバイスが登録されるように initcpio を修正する必要があります。
+
/dev/bcache0 デバイスが存在する場合、exit と入力して起動を続行してください。ルートデバイスをマウントする前にデバイスが登録されるように initcpio を修正する必要があります。
   
  +
{{Note|
{{Note|"sh: echo: write error: Invalid argument" というエラーが表示される場合、デバイスが既に登録されているか bcache のバッキングデバイスあるいはキャッシュデバイスとして認識されていません。起動時に udev ルールを使っているのであれば、bcache のスーパーブロックが見つけられないかデバイスの登録が試行されます。}}
 
  +
* "sh: echo: write error: Invalid argument" というエラーは、デバイスが既に登録されているか bcache のバッキングデバイスあるいはキャッシュデバイスとして認識されていないことを意味します。起動時に udev ルールを使っているのであれば、bcache のスーパーブロックが見つかった場合にのみデバイスの登録を試行すべきです。
  +
* これはインストールのステップ7で udev の 69-bcache.rules を使用し、不正なスーパーブロックが原因で blkid とbcache-probe が "一致しない" 場合にも発生する可能性があります。考えられる説明/解決策については、[https://bcache.evilpiepirate.org/#index6h1 bcache の wiki] を参照してください。
  +
}}
   
* キャッシュデバイスをバッキングデバイスに再アタッチ:
+
* キャッシュデバイスをバッキングデバイスに再アタッチする:
   
  +
キャッシュデバイスが登録されている場合、キャッシュの UUID を含むフォルダが {{ic|/sys/fs/bcache}} に存在する必要があります。以下の例ではその UUID を使ってください:
If the cache device was registered, a folder with the UUID of the cache should exist in {{ic|/sys/fs/bcache}}. Use that UUID when following the example below:
 
  +
  +
{{hc|# ls /sys/fs/bcache/|
  +
b6b2d82b-f87e-44d5-bbc5-c51dd7aace15 register register_quiet
  +
}}
   
# ls /sys/fs/bcache/
 
b6b2d82b-f87e-44d5-bbc5-c51dd7aace15 register register_quiet
 
 
# echo b6b2d82b-f87e-44d5-bbc5-c51dd7aace15 > /sys/block/sda/sda3/bcache/attach
 
# echo b6b2d82b-f87e-44d5-bbc5-c51dd7aace15 > /sys/block/sda/sda3/bcache/attach
   
  +
{{ic|/dev/bcache0}} デバイスが現れたら、exit と入力して起動を続行します。再度行う必要はありません。これが続く場合、bcache メーリングリストで質問してください。
If the {{ic|/dev/bcache0}} device now exists, type exit and continue booting. You should not have to do this again. If it persists, ask on the bcache mailing list.
 
   
{{Note|An error of {{ic|sh: echo: write error: Invalid argument}} means the device was already attached. An error of {{ic|sh: echo: write error: No such file or directory}} means the UUID is not a valid cache (make sure you typed it correctly).}}
+
{{Note|{{ic|sh: echo: write error: Invalid argument}} というエラーは、デバイスが既に登録されていることを意味します。{{ic|sh: echo: write error: No such file or directory}} というエラーは UUID が有効なキャッシュではないことを意味します(正しく入力したことを確認してください)}}
   
  +
* キャッシュを無効にし、バッキングデバイスをキャッシュなしで強制的に実行します。"dirty_data" などの統計情報を確認して、失われるデータの量を把握することをお勧めします。
* Invalidate the cache and force the backing device to run without it. You might want to check some stats, such as "dirty_data" so you have some idea of how much data will be lost.
 
   
# cat /sys/block/sda/sda3/bcache/dirty_data
+
{{hc|# cat /sys/block/sda/sda3/bcache/dirty_data|
-3.9M
+
-3.9M
  +
}}
   
  +
ダーティデータは、バッキングデバイスに書き込まれていないキャッシュ内のデータです。バッキングデバイスを強制的に実行すると、後でキャッシュを再接続しても、このデータは失われます。
dirty data is data in the cache that has not been written to the backing device. If you force the backing device to run, this data will be lost, even if you later re-attach the cache.
 
  +
  +
{{hc|# cat /sys/block/sda/sda3/bcache/running|
  +
0
  +
}}
   
# cat /sys/block/sda/sda3/bcache/running
 
0
 
 
# echo 1 > /sys/block/sda/sda3/bcache/running
 
# echo 1 > /sys/block/sda/sda3/bcache/running
   
  +
これで {{ic|/dev/bcache0}} デバイスが現れます。exit と入力して、起動を続行します。キャッシュデバイスの登録を解除して、make-bcache を再度実行することをお勧めします。{{ic|/dev/bcache0}} への fsck も賢明でしょう。[https://docs.kernel.org/admin-guide/bcache.html bcache ドキュメント] を参照してください。
The {{ic|/dev/bcache0}} device will now exist. Type exit and continue booting. You might want to unregister the cache device and run make-bcache again. An fsck on {{ic|/dev/bcache0}} would also be wise. See the [http://atlas.evilpiepirate.org/git/linux-bcache.git/tree/Documentation/bcache.txt?h=bcache bcache user documentation].
 
   
  +
{{Warning|上記の2つのオプションのいずれかが機能しなかった場合にのみ、キャッシュを無効にしてください。}}
{{Warning|Only invalidate the cache if one of the two options above did not work.}}
 
   
 
=== /sys/fs/bcache/ が存在しない ===
 
=== /sys/fs/bcache/ が存在しない ===
   
起動したカーネルで bcache が有効になっていません
+
起動したカーネルで bcache が有効になっていないか、bcache [[カーネルモジュール#手動でモジュールを扱う|モジュールがロードされていません]]
  +
  +
=== write error: Invalid argument when trying to attach a device due to mismatched block parameter ===
  +
  +
デバイスをアタッチしようとしたときに {{ic|bash: echo: write error: Invalid argument}} となり、実際のエラーは [[dmesg]] で表示されます:
  +
  +
bcache: bch_cached_dev_attach() Couldn't attach sdc: block size less than set's block size
  +
  +
これは、{{ic|--block 4k}} パラメータがどちらのデバイスにも設定されておらず、デフォルトと不一致になる場合があるために発生します。
  +
  +
バッキングデバイスとキャッシングデバイスの両方を1つのコマンドで作成すると問題は自動的に解決しますが、別々のコマンドを使用する場合はブロックサイズパラメータを両方のデバイスに手動で設定する必要がある場合があります。
  +
  +
=== Device or resource busy ===
  +
デバイスが bcache バッキングデバイスとして使用されている場合、フォーマットもパーティション化もできません:
  +
# make-bcache -C /dev/sdb1
  +
Can't open dev /dev/sdb1: Device or resource busy
  +
  +
# fdisk /dev/sdb
  +
  +
Welcome to fdisk (util-linux 2.37.2).
  +
Changes will remain in memory only, until you decide to write them.
  +
Be careful before using the write command.
  +
  +
This disk is currently in use - repartitioning is probably a bad idea.
  +
It's recommended to umount all file systems, and swapoff all swap
  +
partitions on this disk.
  +
  +
  +
Command (m for help): q
  +
  +
これを修正するには、まずこのコマンドを実行して、ディスクが実際に bcache バッキングデバイスとして使用されていることを確認します:
  +
# bcache-super-show /dev/sdb1
  +
sb.magic ok
  +
sb.first_sector 8 [match]
  +
sb.csum A3D2B8610F6C5E35 [match]
  +
sb.version 1 [backing device]
  +
  +
dev.label (empty)
  +
dev.uuid 5a868788-65a2-4564-b4b7-c1817d0b6080
  +
dev.sectors_per_block 1
  +
dev.sectors_per_bucket 1024
  +
dev.data.first_sector 16
  +
dev.data.cache_mode 1 [writeback]
  +
dev.data.cache_state 2 [dirty]
  +
  +
cset.uuid 42dcb651-6b53-4b65-bc49-9b1ca0acc5b1
  +
  +
次に、バッキングデバイスを停止します。これにより、対応する /dev/bcache デバイスも削除されます。
  +
# echo 1 > /sys/class/block/sdb1/bcache/stop
  +
  +
# dmesg
  +
[ 3171.263577] bcache: bcache_device_free() bcache0 stopped
  +
これで、デバイスをパーティション化できるようになりました:
  +
# fdisk /dev/sdb
  +
  +
Welcome to fdisk (util-linux 2.37.2).
  +
Changes will remain in memory only, until you decide to write them.
  +
Be careful before using the write command.
  +
  +
  +
Command (m for help): q
  +
fdisk が終了すると、カーネルはドライブを再度スキャンし、それが bcache バッキングデバイスであることを認識し、そのドライブをバッキングデバイスとして使用します。
  +
# dmesg
  +
[ 3190.643270] sdb: sdb1
  +
[ 3190.833029] bcache: register_bdev() registered backing device sdb1
  +
これにより、/sys/class/block/sdb1/ の下にディレクトリ bcache が作成されます
  +
# ls /sys/class/block/sdb1/
  +
alignment_offset bcache dev discard_alignment holders inflight partition power ro size start stat subsystem uevent
   
 
== 参照 ==
 
== 参照 ==
   
* [http://bcache.evilpiepirate.org Bcache ホームページ]
+
* [https://bcache.evilpiepirate.org Bcache ホームページ]
* [https://www.kernel.org/doc/Documentation/bcache.txt Bcache マニュアル]
+
* [https://docs.kernel.org/admin-guide/bcache.html Bcache マニュアル]
  +
  +
{{TranslationStatus|Bcache|2024-02-19|790715}}

2024年2月19日 (月) 00:49時点における最新版

関連記事

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

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

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

この記事またはセクションは情報が古くなっています。
理由: Linux 3.18 の on-disk フォーマットの後方互換性のない変更は誤りであると報告されています。bcache on-disk フォーマットの変更は 3.19 の時点ではまだアップストリームに反映されていません. その後、Linux はバージョン 6.2 になっていますが、関連する文章はいつ壊れた変更がなされたか正確に反映していますか? その言及はまだ必要ですか? (Discuss)
警告:
  • 最初に重要なデータをバックアップしてください。
  • bcache-dev ブランチは活発に開発されています。on-disk フォーマットは 3.18 で変更されており、以前のフォーマットとの後方互換性はありません [1]。注: これは bcache-dev をコンパイルするユーザにのみ該当します。上流の Linux カーネルに組み込まれているバージョンには影響はありません [2]
  • Bcache と btrfs を組み合わせるとファイルシステムが壊れてしまう可能性があります。詳しくは こちらの記事 を参照してください。Btrfs wiki によればカーネル 3.19 以上では修正されているとのことです [3]

既存のシステムに 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. ライトバックモードを有効にします

警告:
  • Bcache 書き込みキャッシュは btrfs ファイルシステムに壊滅的な障害を引き起こす可能性があります。
  • Btrfs は配下のデバイスが順番に書き込みを実行すると想定していますが、bcache ライトバックはこの前提に違反する恐れがあり、これを使う btrfs ファイルシステムを崩壊させるかもしれません。
  • すべてのレイヤーまたはライト・キャッシュは停電時にデータを失うリスクを高めます。
  • 自己責任で btrfs とライトバックモードの bcache を使用してください。
# 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 に含まれており、これらのファイルを initramfs に含めることができれば、下記で説明する個別のブートパーティションを省略して FAT EFI システムパーティションを使えます。詳細は GRUB および/または UEFI を参照してください。

grub は bcache を扱えないため、最低でも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 を設定します

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

# 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/
# mount --mkdir /dev/bcache0 -o subvol=home,compress=lzo /mnt/home
# mount --mkdir /dev/sda2 /mnt/boot
# mount --mkdir /dev/sda1 /mnt/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

Situation: Prevent all write access to a HDD

警告:
  • When the hard drive or the SSD fails, all data is lost.
  • Consider using BTRFS RAID to prevent data loss when a SSD / HDD fails.

In this situation the goal is to keep he HDD idle as long as possible. This is achieved by absorbing all writes with the SSD. The hard drive is only activated when the SSD is full, or when something is read that's not on the SSD.

Enable the writeback cache mode:

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

Let bcache completely sync with the hard drive.

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

Don't let sequential IO bypass the cache:

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

Let bcache wait a week after the previous sync is done:

# echo $((7*24*60*60)) > /sys/block/bcache0/bcache/writeback_delay

Don't let bcache go around the cache when there's read / write congestion

# echo 0 > /sys/fs/bcache/<cache set>/congested_read_threshold_us
# echo 0 > /sys/fs/bcache/<cache set>/congested_write_threshold_us

Put the HDD to sleep after 20 minutes:

# hdparm -S 240  /dev/$(cat /sys/block/bcache0/bcache/backing_dev_name)
/dev/sdh1:
setting standby to 240 (20 minutes)


First use lsblk to get the device names of the HDD and SSD. In this example /dev/sdh1 is the HDD, /dev/sdc1 is the SSD:
# lsblk -M -s
bcache0   254:0    0 931.5G  0 disk 
   ├─sdc1      8:33   0 111.8G  0 part 
   │ └─sdc     8:32   0 111.8G  0 disk 
   └─sdh1      8:113  0 931.5G  0 part 
     └─sdh     8:112  0 931.5G  0 disk

Now Dstat can be used to monitor disk access to the members of the bcache set.

$ dstat -D sdc1,sdh1

高度な操作

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

パーティションの開始位置を移動しない限り、バッキングデバイスのサイズを変更することができます。このプロセスは メーリングリスト で説明されています。以下の例では 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 の場合、こうします:

# btrsfs 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 モジュールがロードされていません

write error: Invalid argument when trying to attach a device due to mismatched block parameter

デバイスをアタッチしようとしたときに 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つのコマンドで作成すると問題は自動的に解決しますが、別々のコマンドを使用する場合はブロックサイズパラメータを両方のデバイスに手動で設定する必要がある場合があります。

Device or resource busy

デバイスが bcache バッキングデバイスとして使用されている場合、フォーマットもパーティション化もできません:

# make-bcache -C /dev/sdb1
Can't open dev /dev/sdb1: Device or resource busy
# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.


Command (m for help): q

これを修正するには、まずこのコマンドを実行して、ディスクが実際に bcache バッキングデバイスとして使用されていることを確認します:

# bcache-super-show /dev/sdb1
sb.magic		ok
sb.first_sector		8 [match]
sb.csum			A3D2B8610F6C5E35 [match]
sb.version		1 [backing device]

dev.label		(empty)
dev.uuid		5a868788-65a2-4564-b4b7-c1817d0b6080
dev.sectors_per_block	1
dev.sectors_per_bucket	1024
dev.data.first_sector	16
dev.data.cache_mode	1 [writeback]
dev.data.cache_state	2 [dirty]

cset.uuid		42dcb651-6b53-4b65-bc49-9b1ca0acc5b1

次に、バッキングデバイスを停止します。これにより、対応する /dev/bcache デバイスも削除されます。

# echo 1 > /sys/class/block/sdb1/bcache/stop
# dmesg
[ 3171.263577] bcache: bcache_device_free() bcache0 stopped

これで、デバイスをパーティション化できるようになりました:

# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): q

fdisk が終了すると、カーネルはドライブを再度スキャンし、それが bcache バッキングデバイスであることを認識し、そのドライブをバッキングデバイスとして使用します。

# dmesg
[ 3190.643270]  sdb: sdb1
[ 3190.833029] bcache: register_bdev() registered backing device sdb1

これにより、/sys/class/block/sdb1/ の下にディレクトリ bcache が作成されます

# ls /sys/class/block/sdb1/
alignment_offset  bcache  dev  discard_alignment  holders  inflight  partition	power  ro  size  start	stat  subsystem  uevent

参照

翻訳ステータス: このページは en:Bcache の翻訳バージョンです。最後の翻訳日は 2024-02-19 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。