Найти тему
Linux&Python

Linux: ускоряем систему 3

В предыдущих статьях я рассказал о том, как можно улучшить/ускорить/оптимизировать работу системы используя несколько простых команд (ссылки в конце этой статьи). И как-то так случилось, что обе технологии использовали возможности сжатия данных. В этой статье я продолжу сложившуюся традицию и расскажу как можно ускорить дисковые операции. Речь пойдёт о файловой системе BTRFS.

Я не буду долго рассказывать о том, какая эта ФС (Файловая Система) замечательная и могучая, моего читателя мало интересуют глубокие подробности. Я всего лишь кратко и простыми словами поясню какие бонусы получит простой пользователь, установивший эту ФС на обычном домашнем компьютере. Ну что же, приступим.

Пожалуй, самой важной для рядового пользователя особенностью BTRFS является её умение сжимать и распаковывать данные на лету. Делает она это прозрачно и очень даже эффективно. Что же это даёт по факту? Всё очень просто. Данные на физическом диске хранятся в сжатом виде, а значит занимают значительно меньше места. Экономится дисковое пространство. Когда происходит чтение с носителя, данные передаются тоже в сжатом виде через канал передачи данных и распаковываются уже в оперативной памяти. Таким образом, если сравнивать с обычным режимом, через один и тот же канал удаётся пропихнуть больше данных за равное время. То же самое происходит и при записи, только данные сжимаются в памяти и передаются на носитель уже запакованные.

Вы можете возразить, мол, при такой работе повышается нагрузка на процессор, но я сразу отвечу, что эта нагрузка ничтожна по сравнению с полученным эффектом. Давайте вспомним предыдущие статьи. В ZRAM и ZSWAP страницы памяти тоже сжимаются, но процессор при этом практически не напрягается.
>>> Небольшая поправка: BTRFS при включенной компрессии подходит к процессу сжатия каждого файла сугубо индивидуально. В случае, если файл невозможно эффективно сжать, например это видео или архив, ФС запишет такой файл как есть и никакого выигрыша не будет.

Теперь рассмотрю несколько примеров, когда применение BTRFS даст весьма ощутимый прирост в скорости.

Первый случай - Вы установили ОС Linux на USB-носитель, внешний жесткий диск или флэшку. К стати, очень даже удобно иметь всегда при себе своё настроенное рабочее окружение. В случае флэшки прирост скорости будет особенно ощутимый из-за не особо высокой скорости работы самой флэшки. Эффект на столько велик, что Вы вообще не заметите никаких подтормаживаний системы. Всё будет работать также, как если бы система была установлена на нормальном SATA HDD (привет Windows! Кто-нибудь видел полноценную Win на флешке, которую можно вставлять в любые компы и нормально работать? :-).

Следующий вариант - установка системы на какой-нибудь планшет/ноутбук с SSD или MMC диском. Тут безусловно эффект будет больше выражаться в экономии места на носителе, нежели в приросте скорости. Просто по тому, что SSD сами по себе очень быстрые и "на глазок" Вы прирост скорости не заметите, хотя она по факту значительно возрастёт.

Ну всё, хватит болтать, переходим к практике. Для желающих более подробно ознакомиться с возможностями BTRFS я приведу несколько ссылок в конце статьи.

Скорее всего мой читатель уже установил систему на свой компьютер, подключил ZSWAP или ZRAM, накачал кучу приложений и делать переустановку системы совершенно не горит желанием. И правильно, не нужно. Мы выполним конвертацию файловой системы EXT4 в BTRFS, а потом настроим её под несколько конкретных вариантов использования. Ну а тем, кто выполнит новую установку сразу на BTRFS можно переходить к следующей части с настройками.

Итак, если Вы в процессе установки Ubuntu выбрали вариант "Стереть диск и установить Ubuntu" (см. скриншот ниже)

-2

то ваша таблица раздела должна выглядеть вот так:

-3

Как вариант может ещё присутствовать раздел подкачки. Что мы видим? FAT32 на устройстве /dev/sda1 - это системный раздел EFI BIOS и мы его трогать не будем. Нас интересует файловая система EXT4 на разделе /dev/sda2, имеющая точку монтирования "/". Именно её мы будем конвертировать. Для начала нужно установить набор утилит для работы с BTRFS. Выполним команду:
sudo apt update
sudo apt install btrfs-tools

Теперь нам понадобится наша LiveUSB - загрузочная флешка, с которой мы устанавливали систему. Ну или сделайте новую загрузочную флешку. Грузимся с неё, выбрав пункт "Try Ubuntu without install", запускаем приложение "Software & Updates". Вот такая иконка:

-4

Устанавливаем галки как на скриншоте:

-5

Нажимаем "Close" и затем кнопку "Reload" в открывшемся окне. Далее запускаем терминал и снова устанавливаем утилиты btrfs командой:
sudo apt install btrfs-tools btrfs-progs fstransform

>>>К слову, чтоб постоянно не писать перед каждой командой SUDO рекомендую "стать админом" выполнив команду: sudo su -

Дальше буду писать команды без sudo. Перед конвертацией нужно выполнить проверку Вашей файловой системы. Это можно сделать командой:
fsck -f /dev/sda2

Теперь очень важный момент. Во всех мануалах в интернете вы найдёте только метод конвертации с помощью утилиты btrfs-convert, НО В ДАННЫЙ МОМЕНТ ОНА НЕ ДОСТУПНА!!! В этой утилите был найден серьёзный баг и она временно исключена из состава пакета btrfs-tools. Но, к счастью, существуют и другие возможности выполнить конвертацию файловой системы. Мы будем использовать для этого скрипт fstransform, который установили ранее. Он применяет отличный от btrfs-convert механизм преобразования, а потому есть одно очень важное требование:

ВАШ РАЗДЕЛ ДИСКА, ПОДЛЕЖАЩИЙ КОНВЕРТАЦИИ, ДОЛЖЕН БЫТЬ ЗАПОЛНЕН МЕНЕЕ ЧЕМ НА 50% !!!

В противном случае потребуется много дополнительных операций, но они выходят за рамки этой статьи. И ещё, на всякий случай лучше сделать резервную копию ваших данных. Вдруг что-то пойдёт не так :)

Итак, для выполнения конвертации вводим в терминале команду:
fstransform /dev/sda2 btrfs --force-untested-file-systems

Скрипт напишет предупреждение о том, что устройства не должны быть полными:

-6

Жмём клавишу "ENTER" и дожидаемся завершения процедуры конвертации. Можно также открыть второй терминал и выполнить в нём рекомендуемую скриптом команду:
watch df /dev/sda2 /dev/loop9
Это позволит Вам наблюдать за состоянием устройств в процессе работы скрипта. Выглядит так:

-7

Через какое-то время скрипт fstransform снова остановится и спросит Вас, хотите ли Вы продолжить на свой страх и риск, мол это Ваш последний шанс отказаться... Вот так это выглядит:

-8

В общем жмём "ENTER" и ждём завершения. Если всё прошло нормально, увидите вот такое:

Успешное завершение процедуры конвертации ФС
Успешное завершение процедуры конвертации ФС

Теперь нам нужно сделать некоторые манипуляции с различными конфигами для включения поддержки новой файловой системы. Выполним следующие команды:
mount /dev/sda2 /mnt
for fs in proc sys dev dev/pts; do mount --bind /$fs /mnt/$fs; done
chroot /mnt

Глянем наш корневой каталог:
ls -l

если видим в выводе команды ls файл подкачки с именем swapfile - удаляем его, он нам не нужен. В принципе его не должно быть.
rm swapfile

Теперь нужно получить новый UUID для нашей ФС. Делаем это командой: blkid /dev/sda2

-10

Поправим файл /etc/fstab:
mcedit /etc/fstab

Комментируем старую строку с подключением ФС EXT4 и вставляем новые строки для BTRFS с полученным предыдущей командой UUID (разумеется Вы вставляете свой UUID, а не из моих скриншотов):

-11

Сохраняем и отредактируем следующий файл:
mcedit /etc/grub.d/10_linux

Комментируем две строки и добавляем rootsubvol="@" под ними как на скриншоте (выделено зелёным):

-12

Далее обновляем загрузчик. Если Вы не знаете, поддерживает ли Ваш BIOS загрузку EFI, выполните команду:
[ -d /sys/firmware/efi ] && echo "EFI boot" || echo "Legacy boot"

Если вывод будет "EFI boot", значит делаем установку EFI версии загрузчика, иначе - Legacy вариант.

Для EFI:
mount /dev/sda1 /boot/efi
grub-install /dev/sda
update-grub

Для Legacy:
grub-install /dev/sda
update-grub

Теперь приведём в порядок нашу новоиспеченную ФС. Выполним последовательность команд:
btrfs subvolume snapshot / /@
btrfs subvolume create /@home
rsync --progress -aHAX /home/* /@home

rm -fr /home/*
rm -fr /@/home/*
cp /etc/fstab /@/etc/fstab

Дальше выходим из CHROOT:
exit

Отмонтируем ненужное:
for fs in proc sys dev/pts dev; do umount /mnt/$fs; done
umount /dev/sda1
(опционально, делаем если у вас EFI)
umount /mnt

Теперь монтируем наш новый subvolume:
mount -o subvol=@ /dev/sda2 /mnt
for fs in proc sys dev dev/pts; do mount --bind /$fs /mnt/$fs; done

Если у вас EFI, подмонтируем EFI раздел:
mount /dev/sda1 /mnt/boot/efi

И выполняем CHROOT:
chroot /mnt

Выполняем команду:
grub-mkconfig | grep " ro "
и проверяем, в конце строк с подсвеченной красным "ro" должно быть так: "rootflags=subvol=@". Если нет, снова отредактируйте файл /etc/grub.d/10_linux как было написано выше. После этого обновляем загрузчик:
update-grub
grub-install /dev/sda

Выходим из CHROOT и снова отмонтируем все устройства:
exit
for fs in proc sys dev/pts dev; do umount /mnt/$fs; done

umount /dev/sda1 (опционально, делаем если у вас EFI)
umount /mnt

Теперь монтируем корень нашего BTRFS-раздела и удаляем всё из корня, оставляя только созданные нами subvolumes:
mount /dev/sda2 /mnt
find /mnt -xdev -delete

Ну что, почистили нашу ФС, привели всё в порядок. Проверим subvolumes:
btrfs subvolume list /mnt
Увидеть должны примерно такой вывод:

-13

Если это так, то могу Вас поздравить, Вы справились с задачей. Пришло время перезагрузить систему.

В следующей статье рассмотрим варианты опций монтирования файловой системы BTRFS для различных типов носителей, а также применим сжатие.

Предыдущие статьи:
ZSWAP
ZRAM

Следующая статья с описанием настроек BTRFS

Если у Вас есть вопросы или пожелания - пишите комментарии. Надеюсь, статья получилась полезной.