В среде 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.