Я ищу любой механизм уровня ядра, который является сквозным и будет изменять хэши файлов, либо шифруя содержимое файла, либо добавляя данные. Наиболее очевидным решением является шифрование, но я не могу найти никаких подходящих (например, полностью только на уровне ядра, без 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