Назад | Перейти на главную страницу

Как я могу «затенять» файловую систему в Linux?

В среде Linux иногда мне нужно запустить сценарий от имени пользователя root, который будет добавлять / изменять несколько файлов на моем fs.

В принципе, я хотел бы точно знать, какие файлы изменяются и как БЕЗ открытия скрипта и попыток угадать код.

Я думал об использовании чего-то вроде unionfs: основная fs будет доступна в режиме только для чтения, и все изменения записываются в файл, используемый в качестве раздела, и «монтируются» в режиме записи.

Есть ли другие способы достижения той же цели (то есть кроме unionfs)?

Вы можете создать снимок LVM, затем смонтировать снимок, запустить сценарий, а затем провести различие между снимком и оригиналом.

До сегодняшних модных технологий создания снимков и отслеживания люди решали эту проблему с помощью умного использования LD_PRELOAD переменная среды, которая позволяет вам заменять функции библиотеки C своими собственными заменами (называемыми функциональное взаимодействие). В этой ситуации вы бы обернули open() системный вызов, и когда файлы открываются для записи, вы можете:

  • Сохраните оригинал (например, с .bak расширение или что-то в этом роде)
  • Разрешите установщику заменить его
  • Произведите сравнение оригинальной и измененной версии.

В installwatch программа является одним из примеров такого рода вещей. Есть много других примеров такого рода решений, а также множество других способов использования LD_PRELOAD для изменения поведения двоичных программ.

Пример решения LVM, упомянутого ранее.

Предупреждение: файловая система, которую вы хотите сравнить, должна находиться на логическом томе lvm! (И у вас должно быть немного свободного места на диске.)

# lvcreate --size 2G --name your-fs-snapshot --snapshot /dev/vg0/your-fs 
  Logical volume "your-fs-snapshot" created

Это делает снимок / dev / vg0 / your-fs в этот момент. Затем внесите изменения, которые хотите записать.

Вы можете смонтировать свой снимок как копию your-fs в исходном состоянии и сравнить с инструментом по вашему выбору, например разница

# mount /dev/vg0/your-fs-snapshot /mnt
# diff -q /original/volume/subdir /mnt/subdir

Не забудьте размонтировать и удалить свой снимок, так как при этом изменения исходного тома записываются как обратные изменения снимка - до тех пор, пока он не заполнится.

# umount /mnt
# lvremove /dev/vg0/your-fs-snapshot 
Do you really want to remove active logical volume your-fs-snapshot? [y/n]: y
  Logical volume "your-fs-snapshot" successfully removed

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

# kpartx -av /dev/vg0/your-disk-snapshot

Похоже, что systemtap хорош в этом. Вот Сообщение блога где кто-то написал сценарий systemtap, который распечатает каждый файл, который открывает пользователь. Следует иметь в виду, что это не относится к конкретному процессу, поэтому, если вы запускаете сценарий как пользователь, который выполняет множество других действий, это может быть довольно шумно; могут потребоваться некоторые модификации. Хотя это начало.

Вы также можете изучить inotify, который позволит вам отслеживать события файловой системы по мере их возникновения. Это похоже на фреймворк OS X fsevent. В большинстве дистрибутивов есть пакет inotify-tools.