「Bcache」の版間の差分
(→高度な操作: 英語版に同期) |
(→トラブルシューティング: 英語版に同期) |
||
482行目: | 482行目: | ||
=== 起動時に /dev/bcache デバイスが存在しない === |
=== 起動時に /dev/bcache デバイスが存在しない === |
||
− | 以下のようなエラーが |
+ | 以下のようなエラーが busy box シェルに表示される場合: |
{{bc|1= |
{{bc|1= |
||
490行目: | 490行目: | ||
}} |
}} |
||
− | バッキングデバイスが "writeback" モードに設定されていると上記のエラーが発生することがあります (デフォルトは writearound です)。"writeback" モードでは、キャッシュデバイスが登録・アタッチされるまで |
+ | バッキングデバイスが "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 |
||
− | + | /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| |
+ | {{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. |
||
− | + | {{hc|# cat /sys/block/sda/sda3/bcache/dirty_data| |
|
− | + | -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://www.kernel.org/doc/html/latest/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 [[カーネルモジュール#手動でモジュールを扱う|モジュールがロードされていません]] |
+ | |||
+ | === 書き込みエラー: ブロックパラメータが一致しないため、デバイスをアタッチしようとしたときに引数が無効です === |
||
+ | |||
+ | デバイスをアタッチしようとしたときに {{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つのコマンドでバッキングデバイスとキャッシングデバイスの両方を作成すると、問題は自動的に解決されますが、別々のコマンドを使用する場合は、両方のデバイスでブロックサイズパラメータを手動で設定する必要がある場合があります。 |
||
== 参照 == |
== 参照 == |
2021年10月18日 (月) 23:10時点における版
Bcache (block cache) を使うことで SSD を他のブロックデバイス (通常は回転するHDD やアレイ) の読み書きキャッシュ (writeback モード) あるいは読み取りキャッシュ (writethrough または writearound) として活用できます。この記事ではルートパーティションとして Bcache を使って arch をインストールする方法を説明します。bcache 自体の説明は bcache のホームページ を読んでください。必ずbcacheのマニュアルを読んで参照してください。Bcache は 3.10 からメインラインカーネルの中にあります。archインストールディスクのカーネルには 2013.08.01 からbcacheモジュールが含まれています。
Bcache を使うにはバッキングデバイスを bcache ブロックデバイスとしてフォーマットする必要があります。大抵の場合、blocks to-bcache でインプレース変換を実行できます。
目次
既存のシステムに bcached btrfs ファイルシステムをセットアップ
準備
bcache-toolsAUR をインストールします。
キャッシュとバッキングデータを保持するためにfdiskを使用してSSDとハードドライブに適切なパーティションを作成します。
状況: 1台のハードドライブと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
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
+-----------------------------------------------------------+ | 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
+--------------------------------------------+ | 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
+--------------------------------------------------------------------------+ | 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 をパーティション分割します
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
4. HDD を bcache のバッキングデバイスとして設定します。
# make-bcache -B /dev/sda3
# 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
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パーティションにインストールディスクからアクセスする方法を示します。前のセクションと同様に、インストールディスクを起動し、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は実際にはキャッシュを切り離しておらず、登録されている場合は引き続きキャッシュデバイスを追加します。このコマンドはライトバックバッキングデバイスで"機能"しますが、データが大幅に破損します。見つからないキャッシュが完全に回復不能な場合にのみ実行してください。
設定
設定できるオプションは多数存在します (キャッシュモードやキャッシュの消去間隔、シーケンシャル書き込みのヒューリスティックなど)。/sys
のファイルに書き込むことで設定します。詳しくは bcache ユーザードキュメント を参照してください。
キャッシュモードを切り替えるには /sys/block/bcache[0-9]/bcache/cache_mode
に writethrough
, 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大きい状態で再作成します。
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小さくして再作成します。
4. 通常のインストールで再起動します。あなたファイルシステムは現在マウントされているでしょう。それで大丈夫です。パーティションを最大にリサイズするコマンドを発行します(つまり、手順3で実際のパーティションを縮小したサイズ)。btrfsの場合、こうします:
# btrfs filesystem resize max /
ext3/4の場合はこうです:
# resize2fs /dev/bcache0
5. 有効にしたい場合、ライトバックキャッシュを再度有効にします:
# echo writeback > /sys/block/bcache0/bcache/cache_mode
トラブルシューティング
起動時に /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 を修正する必要があります。
- キャッシュデバイスをバッキングデバイスに再アタッチする:
キャッシュデバイスが登録されている場合、キャッシュの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メーリングリストで質問してください。
- キャッシュを無効にし、バッキングデバイスをキャッシュなしで強制的に実行します。"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 ドキュメントを参照してください。
/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つのコマンドでバッキングデバイスとキャッシングデバイスの両方を作成すると、問題は自動的に解決されますが、別々のコマンドを使用する場合は、両方のデバイスでブロックサイズパラメータを手動で設定する必要がある場合があります。