Arch Linux на Btrfs

Руководства, инструкции, советы и хитрости
Аватара пользователя
A.T.W.A.
Сообщения: 214
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Откуда: Ленинград
Статус: Не в сети

Arch Linux на Btrfs

Сообщение A.T.W.A. » 17 сен 2013, 09:49

Никаких конкретных целей я не преследовал, переводя жёсткий диск своего ноутбука на эту файловую систему. Так что на главный вопрос "Зачем?" ответа у меня не найдётся. Мне просто захотелось чего-то нового.. О преимуществах (а они есть) данной ФС можно почитать где угодно (Википедия).
Статья может содержать мои ошибки (заблуждения), поэтому свято верить в магические команды консоли не стоит.



УСТАНОВКА.
Практически стандартна, изобретать велосипед я не буду, поэтому пошлю вас в вики. Или ссылка для более опытных.

Пару слов о разбивке диска. Так как Btrfs не может содержать swap-файл, необходимо заранее позаботиться о разделе с подкачкой, если он вам нужен, в противном случае манипуляций с таблицей разделов не требуется.

Создаём файловую систему на разделе (для разделов от 1ГБ и меньше, чтобы более эффективно использовать пространство, рекомендуется передать ключ -M к параметрам mkfs.btrfs; из man-страницы) (при желании можно задать лэйбл ключом -L):

Код: Выделить всё

# mkfs.btrfs /dev/sda<цифра>
Либо (внимание) на самом устройстве:

Код: Выделить всё

# mkfs.btrfs /dev/sda
Теперь монтируем (здесь и далее по тексту заменить sda на sda<цифра>, если форматировали раздел):

Код: Выделить всё

# mount /dev/sda /mnt
Затем создадим два подтома под корень и домашние каталоги пользователей:

Код: Выделить всё

# btrfs subvolume create /mnt/root
# btrfs subvolume create /mnt/home
И отмонтируем корень ФС:

Код: Выделить всё

# umount /mnt

Далее, для того, чтобы монтировать подтом подобно обычному разделу диска, команде mount нужно указывать опцию subvol=PATH, где PATH - путь относительно корня ФС. Монтируем корень:

Код: Выделить всё

# mount -o subvol=root,compress=lzo,autodefrag /dev/sda /mnt
Так же в параметрах мы указали использовать сжатие (lzo), что даёт прирост экономии места плюс повышает производительность, и дефрагметацию в фоне. Подробнее обо всех параметрах монтирования здесь.
Создаём папку и монтируем в неё наш будущий каталог пользователей:

Код: Выделить всё

# mkdir /mnt/home
# mount -o subvol=home,compress=lzo,autodefrag /dev/sda /mnt/home


Дальше действуем по вики, т.е. выбираем зеркала и ставим базовую систему. При генерации initramfs mkinitcpio будет ругаться на отсутствие fsck.btrfs - это нормальное явление. Позже мы уберём этот хук из конфига, т.к. для Btrfs он не требуется.
После создания fstab отредактируем его, убрав из опций монтирования файловых систем rw,relatime,space_cache - они идут по умолчанию и в конфиге дублировать их незачем. Пример fstab:

Код: Выделить всё

# /dev/sda
UUID=56edc366-a153-4eee-b2a6-471b7066b93d /     btrfs compress=lzo,autodefrag             0 0
# Как оказалось, параметр subvol=root можно не указывать, здесь он всё равно игнорируется, передаётся опцией rootflags=subvol=root к ядру.

# /dev/sda
UUID=56edc366-a153-4eee-b2a6-471b7066b93d /home btrfs compress=lzo,autodefrag,subvol=home 0 0
Последний столбец в значении 0 - не проводить проверку ФС.

Снова идём по вики, т.е. chroot и правка системных конфигов. Одним из них будет /etc/mkinitcpio.conf, убираем хук fsck, должно получиться что-то типа этого:

Код: Выделить всё

...
HOOKS="base udev autodetect modconf block filesystems keyboard"
...
И пересоздадим initramfs командой:

Код: Выделить всё

# mkinitcpio -p linux


И ещё момент по поводу загрузчика, не знаю как другие, а grub точно умеет грузиться с Btrfs, так что выбрать лучше именно его. Так же не забудьте установить пакет btrfs-progs и позаботиться о бэкапах.



ИСПОЛЬЗОВАНИЕ.

Снимки. Монтируем корень ФС:

Код: Выделить всё

# mount /dev/sda /mnt
Создаём снимок корня системы:

Код: Выделить всё

# btrfs subvolume snapshot /mnt/root /mnt/backup
Каталоги абсолютно идентичны, и пока мы не начнём изменять файлы, снимки места не занимают (или почти не занимают):
Изображение
Как видно на скриншоте, я удалил /etc, совершенно случайно.

Пробуем перезагрузиться:
Изображение
Упс!

Откат: грузимся с live CD, монтируем корень ФС и переименовываем подтома (так же подтома можно переименовать прямо в рабочей системе, если загрузка удачна, но не в данном случае, конечно):

Код: Выделить всё

# mount /dev/sda /mnt
# mv /mnt/root /mnt/root_bad
# mv /mnt/backup /mnt/root
Либо грузимся как обычно, а в меню grub'а указываем подтом с бэкапом (rootflags=subvol=backup). То есть было так:
Изображение

Сделали так:
Изображение

Загрузка успешна и каталог, естественно, на месте:
Изображение

В общем, практическое применение снимкам можно найти, будь то бэкап перед обновлением, восстановление удалённых файлов и т.п..


Копирование при записи (CoW). Если использовать команду cp с ключом --reflink=auto, то копия файла не будет занимать место на диске. И впоследствии, допустим, при изменении скопированного файла, записываться на диск будут только изменённые блоки.


Автоматическое создание снимков перед обновлением и/или по крону (тут).


"Онлайн"-проверка ФС. При которой осуществляется чтение всех данных/метаданных с перепроверкой контрольных сумм, при наличии ошибок обнаружение их и исправление по возможности.
Выполняется командой:

Код: Выделить всё

# btrfs scrub start -B /
Если опустить ключ -B, процесс уйдёт в фон, и о ходе выполнения можно будет узнать командой:

Код: Выделить всё

# btrfs scrub status /
Пример вывода:

Код: Выделить всё

~> sudo btrfs scrub status /
scrub status for 56edc366-a153-4eee-b2a6-471b7066b93d
   scrub started at Sat Dec 14 06:37:19 2013 and finished after 3242 seconds
   total bytes scrubbed: 222.45GB with 0 errors
Рекомендуется проводить проверку регулярно (~еженедельно).

UPD Автоматизировал это дело, задействовав малююсенький скрипт в cron.weekly:
#!/usr/bin/env bash

LOG="/var/log/scrub.log";

btrfs scrub start -B / &>> $LOG;
echo "" >> $LOG;

exit 0;



"Оффлайн"-проверка ФС (на отмонтированном разделе).

Код: Выделить всё

# btrfs check /dev/sda
При отсутствии ошибок утилита возвратит 0:

Код: Выделить всё

...
found 88435663767 bytes used err is 0
...




Продолжение следует..
Последний раз редактировалось A.T.W.A. 12 июн 2014, 04:55, всего редактировалось 25 раз.
Изображение

Аватара пользователя
lumberjack
Модератор
Сообщения: 1003
Зарегистрирован: 30 сен 2012, 04:04
Темы: 145
Откуда: Сургут
Статус: Не в сети

Re: Arch Linux на Btrfs

Сообщение lumberjack » 17 сен 2013, 10:53

интересная темка))
в ауре увидел такую плюшку для initramfs. не оно?

Аватара пользователя
A.T.W.A.
Сообщения: 214
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Откуда: Ленинград
Статус: Не в сети

Re: Arch Linux на Btrfs

Сообщение A.T.W.A. » 17 сен 2013, 12:22

Нет, не оно ) Если верить этой статье (которая по ходу устарела), "mkinitcpio-btrfs предоставляет возможности отката". Откат работает из коробки, в чём я лично убедился )
Изображение

Аватара пользователя
A.T.W.A.
Сообщения: 214
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Откуда: Ленинград
Статус: Не в сети

Re: Arch Linux на Btrfs

Сообщение A.T.W.A. » 18 сен 2013, 15:57

Какие-то странности с монтированием подтомов. Делаю так: создаю подтом, монтирую его без параметров.

Код: Выделить всё

[~] ~> btrfs subvolume create test
Create subvolume './test'
[~] ~> sudo btrfs subvolume list /
[sudo] password for alex:
ID 256 gen 4663 top level 5 path root
ID 258 gen 4664 top level 5 path home
ID 483 gen 4664 top level 5 path home/alex/test
[~] ~> sudo mount -o subvol=home/alex/test /dev/sda /mnt/temp
При этом mount показывает неверную информацию об опциях монтирования:

Код: Выделить всё

[~] ~> mount
...
/dev/sda on / type btrfs (rw,relatime,compress=lzo,space_cache,autodefrag)
...
/dev/sda on /home type btrfs (rw,relatime,compress=lzo,space_cache,autodefrag)
/dev/sda on /mnt/temp type btrfs (rw,relatime,compress=lzo,space_cache,autodefrag)
on / и on /home - тут всё верно, согласно fstab, а мой тестовый подтом по идее должен иметь параметры только (rw,relatime,space_cache) - то есть дефолтные. Тут либо mount врёт, либо я чего-то не понимаю.


Вопрос к знатокам: как узнать параметры монтирования раздела? Помимо команды mount.


UPD Отбой тревога.
FAQ Btrfs писал(а): Can I mount subvolumes with different mount options?

Yes:

nodev, nosuid and probably all the generic ones
subvol=

Maybe:

compress/compress-force — possible, but not implemented
ro — via bind mount

No:

the rest like space_cache, inode_cache, discard, autodefrag, ssd, ...
Изображение

Аватара пользователя
ZEN
Администратор
Сообщения: 1279
Зарегистрирован: 27 сен 2012, 18:23
Темы: 270
Статус: Не в сети

Re: Arch Linux на Btrfs

Сообщение ZEN » 18 сен 2013, 21:59

A.T.W.A. писал(а):Вопрос к знатокам: как узнать параметры монтирования раздела? Помимо команды mount.

Можно попробовать посмотреть cat /proc/mounts
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
A.T.W.A.
Сообщения: 214
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Откуда: Ленинград
Статус: Не в сети

Re: Arch Linux на Btrfs

Сообщение A.T.W.A. » 19 сен 2013, 00:14

ZEN, да, спасибо. Вывод идентичен /etc/mtab - его lumberjack подсказал глянуть.

Код: Выделить всё

[~] ~> ll /proc/mounts
lrwxrwxrwx 1 root root 11 сен 19 01:05 /proc/mounts -> self/mounts
[~] ~> ll /etc/mtab
lrwxrwxrwx 1 root root 17 май 31 22:40 /etc/mtab -> /proc/self/mounts
Наверное, поэтому )
Изображение

Аватара пользователя
A.T.W.A.
Сообщения: 214
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Откуда: Ленинград
Статус: Не в сети

Re: Arch Linux на Btrfs

Сообщение A.T.W.A. » 18 дек 2013, 10:32

Вынес в отдельный подтом каталог с кешем пакмана. Строка в fstab:

Код: Выделить всё

UUID=56edc366-a153-4eee-b2a6-471b7066b93d /var/cache/pacman/pkg btrfs noauto,x-systemd.automount,noatime,compress=lzo,autodefrag,subvol=pkg 0 0
Хитрые опции noauto,x-systemd.automount позволяют смонтировать каталог в тот момент, как только он потребуется, то есть не при загрузке, т.к. при старте системы он не особо нужен (а выигрыш в целых 0.15 секунды!).

В целом мой текущий fstab выглядит так:

Код: Выделить всё

#
# /etc/fstab: static file system information
#
# <file system> <dir> <type> <options> <dump> <pass>

UUID=56edc366-a153-4eee-b2a6-471b7066b93d /                     btrfs noatime,compress=lzo,autodefrag                                       0 0

UUID=56edc366-a153-4eee-b2a6-471b7066b93d /home                 btrfs noatime,compress=lzo,autodefrag,subvol=home                           0 0

UUID=56edc366-a153-4eee-b2a6-471b7066b93d /var/cache/pacman/pkg btrfs noauto,x-systemd.automount,noatime,compress=lzo,autodefrag,subvol=pkg 0 0
Добавил ещё опцию noatime (якобы быстрее).
Изображение

Аватара пользователя
lumberjack
Модератор
Сообщения: 1003
Зарегистрирован: 30 сен 2012, 04:04
Темы: 145
Откуда: Сургут
Статус: Не в сети

Re: Arch Linux на Btrfs

Сообщение lumberjack » 18 дек 2013, 10:57

A.T.W.A. писал(а):... выигрыш в целых 0.15 секунды!

Йес!
это вам ни это! )))
ps
тоже попробовать, чтоли )))

Аватара пользователя
A.T.W.A.
Сообщения: 214
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Откуда: Ленинград
Статус: Не в сети

Re: Arch Linux на Btrfs

Сообщение A.T.W.A. » 18 дек 2013, 11:13

lumberjack, :) В принципе, некритичные каталоги можно таким способ монтировать ) Тут подробности.
Изображение

Аватара пользователя
A.T.W.A.
Сообщения: 214
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Откуда: Ленинград
Статус: Не в сети

Re: Arch Linux на Btrfs

Сообщение A.T.W.A. » 03 фев 2014, 01:59

В последнее время генератор конфигурационного файла загрузчика (grub-mkconfig который) немножко лихорадит, поэтому я отказался от него в пользу ручного написания конфига. При этом надо учесть такой момент, что пути к ядру и initramfs нужно указывать относительно самого верхнего уровня ФС, пример:

Код: Выделить всё

...
linux /root/boot/vmlinuz-linux ...
initrd /root/boot/initramfs-linux.img ...
...
Ну и про опцию к ядру rootflags=subvol=root не нужно забывать.
Изображение


Вернуться в «Статьи»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей