Почему файловая система, использующая FUSE (Filesystem in Userspace), не регистрирует в журнале системные вызовы?

Я создал собственную файловую систему с использованием FUSE на Python и у меня возникла проблема с логированием операций чтения и записи. Я установил PostgreSQL в базовую директорию (basedir) и смонтировал файловую систему в директорию для монтирования (mntdir). При запуске PostgreSQL и выполнении операций в базе данных я ожидал увидеть логи операций в своей файловой системе, но логов нет. Пример работы с базой данных приведён ниже:

```sql
-- Выполнение команды в PostgreSQL
SELECT COUNT(*) FROM random_names;
-- Результат
2100000 
-- Вставка данных в таблицу
INSERT INTO random_names (name) SELECT chr((random() * 26)::integer + 65)::character varying FROM generate_series(1, 1000000);
-- Подсчет после вставки
SELECT COUNT(*) FROM random_names;
-- Результат
3100000
```

После этих операций в моей файловой системе не появляется записей логов, что предполагает, что PostgreSQL может обращаться напрямую к оригинальной файловой системе, а не к моей смонтированной. Как мне решить эту проблему и обеспечить логирование операций чтения и записи в моей пользовательской файловой системе FUSE?
  • 4 декабря 2023 г. 7:20
Ответы на вопрос 1
Для того чтобы убедиться, что операции чтения и записи логируются в вашей файловой системе на базе FUSE, вам нужно убедиться, что PostgreSQL действительно пишет данные в смонтированную вами файловую систему, а не в исходную директорию типа ext4, XFS и т.д.

Вот несколько шагов, которые вы можете предпринять:

1. **Проверьте монтирование**: Убедитесь, что ваша файловая система FUSE корректно смонтирована в нужное место. Используйте команду `mount` или `df -h` для проверки.

2. **Конфигурация PostgreSQL**: Проверьте, что PostgreSQL настроен на работу с данными в директории, где смонтирована ваша файловая система FUSE. Конфигурационный файл PostgreSQL (обычно `postgresql.conf`) должен содержать путь к каталогу данных (`data_directory`), указывающий на место монтирования вашей FUSE файловой системы.

3. **Логика логирования в FUSE**: Убедитесь, что в реализации вашей файловой системы на FUSE присутствуют хуки (обработчики), которые должны логировать операции чтения и записи. Эти хуки должны быть вызваны каждый раз, когда соответствующие системные вызовы выполняются через интерфейс FUSE.

4. **Уровень логирования PostgreSQL**: PostgreSQL имеет настраиваемый уровень логирования. Вам может потребоваться настроить PostgreSQL на более подробное логирование для отслеживания операций чтения и записи файлов. Это делается через настройку параметров в `postgresql.conf`, таких как `log_statement`, `log_duration`, и других.

5. **Проксирующая FUSE Файловая Система**: Если вы разрабатываете проксирующую файловую систему, которая передаёт операции в нижележащую файловую систему, убедитесь, что вы переопределили нужные методы и что они действительно вызываются PostgreSQL. Существует вероятность, что PostgreSQL использует другие системные вызовы, которые вы не логируете.

После проведения этих шагов, если PostgreSQL использована корректно и настроена на работу с вашей файловой системой на FUSE, все операции чтения и записи, выполняемые PostgreSQL, должны быть зафиксированы вашим логированием FUSE. Если журналы все еще отсутствуют, вам потребуется отладить код вашей FUSE файловой системы, чтобы убедиться, что хуки срабатывают как ожидается и корректно обрабатывают все необходимые системные вызовы.
Похожие вопросы