bcache — модуль ядра Linux, который ставит быстрый SSD перед медленным жёстким диском и кэширует горячие блоки. Файловая система остаётся обычной ext4 или XFS, а доступ идёт через /dev/bcache0. Технология появилась в ядре 3.10. Главное правило: перед первым make-bcache сделайте полную резервную копию, а режим writeback включайте только с пониманием риска.
Как это работает
Медленное устройство называется backing device, быстрое — caching device. На SSD создаётся cache set с набором бакетов фиксированного размера; bcache хранит там копии блоков и служебные метаданные. При чтении система проверяет кэш, при промахе читает с диска и кладёт горячий блок на SSD. Запись в режиме writethrough уходит на оба устройства, в режиме writeback сначала попадает в кэш и сбрасывается на диск позже.
Кэш не резервная копия и не добавляет избыточности: он становится ещё одной точкой отказа. Если SSD выйдет из строя в режиме writeback, часть данных останется только на нём, и файловая система может стать несмонтируемой. Поэтому bcache уместен там, где есть бэкап, ИБП и контроль SMART, а не на единственном диске с семейным архивом.
Подготовка и резервная копия
Сначала убедитесь, что оба устройства не смонтированы и не используются. make-bcache записывает суперблок в начало устройства: существующие данные на диске обычно сохраняются, но при ошибке в имени устройства можно потерять не тот диск. Проверьте модель, серийный номер и разделы, данные скопируйте на внешний носитель.
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,MODEL
sudo smartctl -a /dev/sdb | head -20
sudo smartctl -a /dev/nvme0n1 | grep -E 'Percentage|Media'
rsync -aHAX --info=progress2 /mnt/data/ /mnt/backup/data/
Перед изменениями убедитесь:
- копия лежит на другом физическом носителе;
- восстановление хотя бы одного файла проверено;
- вывод lsblk и blkid сохранён.
Вывод lsblk и blkid сохраните: после создания bcache идентификаторы изменятся.
sudo blkid /dev/sdb /dev/nvme0n1p3
sudo umount /mnt/data
sudo modprobe bcache
lsmod | grep bcache
Создание кэша и подключение
Сначала создаётся cache set на SSD, затем backing device на HDD. Размер бакета задаётся при создании кэша: мелкий даёт много служебных записей, крупный хуже использует SSD под случайные операции. Начните с 512 КиБ или 1 МиБ и смотрите на статистику.
sudo apt install bcache-tools
sudo make-bcache -C /dev/nvme0n1p3 --bucket 1M
sudo make-bcache -B /dev/sdb
sudo bcache-super-show /dev/nvme0n1p3 | grep -E 'cset.uuid|bucket'
Регистрация обычно происходит автоматически через udev. Если устройство не появилось, зарегистрируйте его вручную: сначала кэш, потом backing. После регистрации в /sys/fs/bcache появится каталог с UUID набора, а в /dev — bcache0.
echo /dev/nvme0n1p3 | sudo tee /sys/fs/bcache/register
echo /dev/sdb | sudo tee /sys/fs/bcache/register
ls /sys/fs/bcache/
lsblk /dev/bcache0
Привязка выполняется записью UUID в файл attach. Без неё bcache0 работает без кэша, это видно по состоянию no cache.
cat /sys/block/bcache0/bcache/state
echo $(sudo bcache-super-show /dev/nvme0n1p3 | awk '/cset.uuid/ {print $2}') | sudo tee /sys/block/bcache0/bcache/attach
cat /sys/block/bcache0/bcache/state
sudo bcache-super-show /dev/sdb | head
Режимы кэширования
Режим задаётся файлом cache_mode и меняется на лету. writethrough безопаснее: данные всегда есть на диске, SSD ускоряет только чтение. writeback быстрее на записи, но оставляет «грязные» блоки в кэше. writearound пропускает запись мимо кэша, а none полностью отключает кэширование, не разрывая привязку.
cat /sys/block/bcache0/bcache/cache_mode
echo writethrough | sudo tee /sys/block/bcache0/bcache/cache_mode
echo writeback | sudo tee /sys/block/bcache0/bcache/cache_mode
cat /sys/block/bcache0/bcache/dirty_data
Перед включением writeback оцените характер нагрузки. Базы данных и виртуальные машины выигрывают заметно, но требуют UPS и быстрого сброса грязных данных. Для домашнего файлового сервера часто достаточно writethrough.
cat /sys/block/bcache0/bcache/writeback_percent
echo 20 | sudo tee /sys/block/bcache0/bcache/writeback_percent
cat /sys/block/bcache0/bcache/sequential_cutoff
cat /sys/block/bcache0/bcache/writeback_delay
writeback_percent задаёт долю грязных данных, которую контроллер держит в кэше. Большее значение сглаживает всплески записи, но увеличивает объём данных под риском. sequential_cutoff задаёт порог, после которого поток считается последовательным и не занимает кэш; нулевое значение отключает это поведение и может забить SSD бесполезными блоками.
Файловая система и монтирование
Если на диске была ФС, она останется доступной через bcache0, но проверьте целостность. Для нового диска создайте ФС; mkfs.ext4 стирает разметку, поэтому для старого диска её пропускают. В fstab указывайте UUID из blkid: имя bcache0 может измениться при добавлении второго кэша.
sudo mkfs.ext4 -L data /dev/bcache0
sudo mkdir -p /mnt/data
sudo mount /dev/bcache0 /mnt/data
sudo blkid /dev/bcache0
Строка в fstab может выглядеть так: UUID=xxxx /mnt/data ext4 defaults,noatime 0 2. Опцию discard включайте осторожно: еженедельный fstrim обычно дешевле. Для XFS подход тот же, но помните: дефрагментация и рост ФС идут через bcache0.
sudo fstrim -v /mnt/data
systemctl status fstrim.timer --no-pager
findmnt /mnt/data
df -h /mnt/data
Мониторинг
Статистика лежит в /sys/block/bcache0/bcache/stats_total. Доля cache_hits показывает реальную пользу кэша. Если доля попаданий стабильно ниже 20–30 процентов, SSD скорее тратит ресурс, чем помогает. Смотрите dirty_data: рост в writeback означает, что диск не успевает сбрасывать данные.
cat /sys/block/bcache0/bcache/stats_total/cache_hits
cat /sys/block/bcache0/bcache/stats_total/cache_misses
cat /sys/block/bcache0/bcache/dirty_data
cat /sys/fs/bcache/*/cache_available_percent
SMART SSD проверяйте регулярно: износ и переназначенные сектора — ранние признаки отказа. Для NVMe смотрите Percentage Used и Media and Data Integrity Errors.
sudo smartctl -a /dev/nvme0n1 | grep -E 'Percentage|Integrity|Unsafe'
sudo dmesg | grep -i bcache | tail -20
sudo journalctl -k --since '1 day ago' | grep -i bcache
Безопасное отключение
Сначала переключите режим на writethrough и дождитесь, пока dirty_data станет нулём. Только потом отсоединяйте кэш и останавливайте устройство. Если выдернуть SSD сразу, грязные блоки пропадут, и ФС может не смонтироваться.
echo writethrough | sudo tee /sys/block/bcache0/bcache/cache_mode
cat /sys/block/bcache0/bcache/dirty_data
echo 1 | sudo tee /sys/block/bcache0/bcache/detach
echo 1 | sudo tee /sys/block/bcache0/bcache/stop
После остановки отключите cache set: запишите 1 в файл unregister внутри его каталога. Перед переносом размонтируйте ФС и остановите bcache0. Суперблок на SSD сохраняет привязку, поэтому старый кэш не используйте без очистки.
sudo umount /mnt/data
CSET=$(ls /sys/fs/bcache/ | grep -E '^[0-9a-f-]{36}$')
echo 1 | sudo tee /sys/fs/bcache/$CSET/unregister
ls /sys/fs/bcache/
sudo wipefs -n /dev/nvme0n1p3
Итог
bcache — зрелый способ ускорить HDD без замены файловой системы. Начните с writethrough, проверьте статистику попаданий и только потом рассматривайте writeback. Обязательные условия: свежая резервная копия, проверенное восстановление, UPS и мониторинг SMART. Помните, что кэш не является бэкапом: отказ SSD в режиме writeback может унести последние записанные данные, а иногда и всю файловую систему.