Сквозной метод на уровне ядра для изменения хэшей файлов

Сквозной метод на уровне ядра для изменения хэшей файлов

Я ищу любой механизм уровня ядра, который является сквозным и будет изменять хэши файлов, либо шифруя содержимое файла, либо добавляя данные. Наиболее очевидным решением является шифрование, но я не могу найти никаких подходящих (например, полностью только на уровне ядра, без ecryptfs, без поддержки FUSE и т. д.) методов шифрования.

В частности, у меня есть большое количество файлов, /fooкоторые я хотел бы также отобразить /foobarлюбым способом, который скроет исходный MD5 файлов,бездублирование необработанных данных. Меня не волнует, что файлы /foobarстанут бесполезными из-за дополнений — я с удовольствием добавлю несколько случайных байтов к каждому файлу и позволю этому сломать множество форматов файлов, но я не знаю, как это сделать с помощью какого-то монтирования bind

решение1

Если вы ищете настраиваемый файловый оверлей, FUSE — это правильное направление. Существуют различные настраиваемые файловые системы, написанные с использованием FUSE (sshfs, ntfs-3g, wikipediafs...), включая простые наложения, такие какbindfs.

Можно взять исходный код bindfs и изменить его, скажем, так, чтобы он выполнял операцию XOR первого байта с некоторыми случайными данными всякий раз, когда он обрабатывает операцию чтения.

Для варианта с чистым ядром вы можете модифицировать overlayfsдрайверы unionfsаналогичным образом.

Другой вариант — взять Samba, написать модуль Samba vfs для повреждения файлов, предоставить общий доступ к исходному каталогу и смонтировать его на той же машине с помощью cifsдрайвера Linux. (То же самое возможно и с помощью 9pдрайвера и u9fsдемона, или с помощью nfsдрайвера и какого-либо демона сервера NFS.)


Если вас не волнует содержимое, создавайте разреженные файлы нужного размера; они вообще не будут занимать места:

$ truncate -s 1G largefile
$ du -h --apparent largefile
1G  largefile
$ du -h largefile
0   largefile

Пройдитесь по дереву следующим образом:

cd /foo
find -type d | while read -r file; do
    mkdir -p "/foobar/$file"
done
find -type f | while read -r file; do
    truncate -r "$file" "/foobar/$file"
done

Связанный контент