- PVSM.RU - https://www.pvsm.ru -
Как известно, если неприятность может произойти, то она обязательно произойдёт. Наверное, у каждого были случаи, когда случайно был стёрт свежий важный файл, или случайно был выделен и уничтожен текст в текстовым редакторе.
Если вы —
Для решения подобных проблем прекрасно подойдёт файловая система NILFS2.
Она присутствует в ядре Linux, начиная с версии 2.6.30.
Особенностью данной файловой системы является то, что она подобна системе контроля версий: вы всегда можете откатить состояние системы назад и посмотреть на то, какой она была некоторое время назад.
Для обеспечения этого функционала вам не нужно настраивать Cron-скрипты, делать снепшоты и т.п. Файловая система NILFS2 делает это всё сама. Она никогда не переписывает старые данные и всегда пишет в новые области диска, если достаточно свободного дискового пространства. В полном соответствии с принципом Copy-on-Write.
Фактически, любое изменение файла влечёт за собой автоматическое создание нового снимка файловой системы, поэтому вы можете использовать эту ФС как машину времени и отматывать назад состояние файлов.
NILFS2 была разработана в недрах Nippon Telegraph and Telephone Corporation [2], фактически, государственной (оно имеет контрольный пакет) и крупнейшей телекоммуникационной компании Японии. А конкретнее в в лаборатории CyberSpace Laboratories под руководством Ryusuke Konishi [3].
Для чего конкрентно она разрабатывалась — неизвестно, однако, можно предположить, что подобная ФС, с её функционалом “машины времени” идеальна для хранения данных, в которых может возникнуть желание поковыряться спецслужбам, чтобы повторно проиграть всю картину СМС, емейлов и т.п…
NILFS2 также, потенциально, очень ценный инструмент для служб внутренней безопасности, так как позволяет восстановить все удалённые письма в почтовой базе данных, вскрыть косяки сотрудников, которые впоследствии могут попытаться их замаскировать, удалив или изменив свои файлы.
Однако что-то пошло не так. То ли правительство Японии передумало за всеми следить (а-ля принцип Яровой), то ли производительность NILFS2 на традиционных HDD оказалась ниже плинтуса, и NILFS2 была выпущена под GPL лицензией и очень быстро вошла в ядро Linux, так как особых претензий к коду, написанному высококвалифицированными японцами, у разработчиков ядра Linux не было.
С точки зрения использования: на систему контроля версий SVN [4]. Каждый чекпойнт ФС — это коммит, который делается автоматически без ведома пользователя при любом изменении: будь-то удаление, изменение содержимого файла или прав доступа. Каждый коммит имеет номер, который линейно увеличивается.
С точки зрения программиста: на циклический буфер. Файловая система копит изменения и записывает их в кусок равный примерно 8 МБ (2000 * 4096, где 2000 — число элементов в блоке, а 4096 — размер страницы памяти). Весь диск поделен на такие чанки. Запись идёт последовательно.
В Unix-подобных ОС, как правило, присутствует папка /home, в которой хранятся данные пользователей. Различные программы сохраняют в этой папке свои настройки относящиеся к конкретному пользователю.
А кто, как не пользователи, чаще всего косячит? Поэтому, как говорится, сам Бог велел использовать на /home NILFS2.
Тем более, что с повсеместным распостранением SSD мы теперь можем не волноваться насчёт сильной просадки при использовании CoW файловых систем.
Да, снимки ФС (снепшоты) мы можем сколько угодно часто создавать и в ZFS и BTRFS, но всегда есть риск, что потерянное изменение файла окажется между снимками. И снимки ещё нужно администрировать: удалять старые. В NILFS2 всё это происходит автоматически, буквально каждые несколько секунд.
Я создал логический том с помощью lvcreate (в группе томов nvme, тонкий пул thin). Я рекомендую создавать именно на томе lvm, так как в последствии он может быть легко расширен.
lvcreate -V10G -T nvme/thin -n home
и отформатировал его в NILFS2:
mkfs.nilfs2 -L nvme_home /dev/nvme/home
mkfs.nilfs2 (nilfs-utils 2.1.5)
Start writing file system initial data to the device
Blocksize:4096 Device:/dev/nvme/home1 Device Size:10737418240
File system initialization succeeded !!
После этого нужно скопировать все данные с текущего /home.
Я это сделал сразу после загрузки компьютера, до входа в свой аккаунт из под пользователя root. Если бы я зашёл под своим пользователем, то какие-нибудь программы открыли бы сокеты и файлы в папке моего пользователя /home/user, что сделало бы чистое копирование затруднительным. Как известно, домашняя папка для пользователя root обычно находится по пути /root, поэтому на разделе /home никакие файлы не откроются.
mkdir /mnt/newhome
mount -t nilfs2 /dev/nvme/home /mnt/newhome
cp -a /home/. /mnt/newhome
По поводу последней строки см. статью [5].
Далее правим /etc/fstab, в которой монтируется файловая система для /home на
/dev/disk/by-label/nvme_home /home nilfs2 noatime 0 0
Опция noatime
нужна для повышения производительности, чтобы при каждом обращении к файлам не менялось atime. Далее перезагружаемся.
Обычный снимок без иммунитета к удалению называется чекпойнт (checkpoint или точка восстановления).
Снимок с защитой от автоудаления называется снэпшот (snapshot), далее просто снимок.
Просмотр чекпойтов делается с помощью команды lscp
Просмотр снимков (снепшотов) lscp -s
Мы можем и сами создавать снимки и чекпойты в любой момент с помощью:
mkcp [-s] устройство
NILFS позволяем нам монтировать сколько угодно старых снимков параллельно с работой основной ветвью ФС. Но только в режиме для чтения.
Устроено всё так. Обычные чекпойнты, которые делает NILFS2 могут быть ей автоматически удалены в любой момент (когда кончится дисковое пространство или про правилам nilfs_cleanerd), поэтому перед монтажом мы должны перевести чекпойнт в снепшот или, по-русски говоря, зафиксировать снимок.
chcp ss номер_чекпойнта
После этого мы может примонтировать снимок, например, так:
mount -t nilfs2 -r -o cp=номер_чекпойнта /dev/nvme/home /mnt/nilfs/номер_чекпойнта
После чего мы копируем восстанавливаемые файлы из снимка в /home.
А впоследствии снимаем флаг неудалимости со снимка, чтобы в будущем автоматический сборщик мусора мог удалить устаревшие данные:
chcp cp номер_чекпойнта
А вот с этим беда. Да, конечно, мы можем создавать ФС, менять её размер он-лайн, просматривать список чейпойнтов, делать и удалять их. Пакет nilfs2-utils предоставляет минимальный джентельменский набор.
Поскольку NTT свернула финансирование, то нет быстрых низкоуровневых утилит, которые позволяют выводить историю изменений файлов, делать diff между снимками.
Чтобы заполнить этот вакуум я написал свою утилиту [6], которая умеет выводить историю изменений конкретного файла/директории:
n2u log filename
Вывод примерно такой:
CHECKPOINT DATE TIME TYPE SIZE MODE
1787552 2019-11-24 22:08:00 first 7079 cp
1792659 2019-11-25 23:09:05 changed 7081 cp
Она работает довольно быстро для избранного способа реализации: ищет различия между файлами методом бисекции, быстро монтируя и сравнивая файл/директорию в разных снимках.
В дальнейшем планирую также добавить команду diff
для утилиты, а также диапазоны чекпоинтов по номерам и датам.
На Хабре много спецов. Прошу, допилите NILFS2. Сделайте репликацию, низкоуровневый быстрый diff между ревизиями, reflink и другие плюшки!
Репозитории:
NILFS2 [8]
NILFS2 утилиты и модули [9]
Рассылки:
Е-мейл рассылка разработчиков NILFS2 [10]. Идентификатор для подписки linux-nilfs.
Архив рассылки [11]
P.S. Замеченные ошибки направляйте в личку. Повышаю за это карму.
Автор: Сергей Ю. Каменев
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/337859
Ссылки в тексте:
[1] хостер: https://www.reg.ru/?rlink=reflink-717
[2] Nippon Telegraph and Telephone Corporation: https://ru.wikipedia.org/wiki/Nippon_Telegraph_and_Telephone
[3] Ryusuke Konishi: https://github.com/konis
[4] SVN: https://ru.wikipedia.org/wiki/Subversion
[5] статью: https://habr.com/ru/company/ruvds/blog/471092/
[6] свою утилиту: https://github.com/sukamenev/nilfs2_tools
[7] Официальный сайт NILFS: https://nilfs.sourceforge.io/en/index.html
[8] NILFS2: https://github.com/konis/nilfs2
[9] NILFS2 утилиты и модули: http://github.com/nilfs-dev/
[10] Е-мейл рассылка разработчиков NILFS2: http://vger.kernel.org/
[11] Архив рассылки: https://marc.info/?l=linux-nilfs
[12] «Назад в будущее»: https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B7%D0%B0%D0%B4_%D0%B2_%D0%B1%D1%83%D0%B4%D1%83%D1%89%D0%B5%D0%B5_(%D1%81%D0%B5%D1%80%D0%B8%D1%8F_%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D0%BE%D0%B2)
[13] RUVDS: https://ruvds.com/
[14] Источник: https://habr.com/ru/post/477388/?utm_source=habrahabr&utm_medium=rss&utm_campaign=477388
Нажмите здесь для печати.