Как заменить файл на необработанном устройстве, сохранив целостность файловой системы?

Скажем, у меня есть система Linux и я хочу записать на необработанное устройство. Но я хочу заменить определенный файл на этом устройстве новой версией. Можно ли это сделать? Я думаю, что с помощью dd вы могли бы написать новый файл, начиная со смещения старой версии. Я думаю, если новый файл имеет такой же или меньший размер, чем старый, все должно быть в порядке. Но что произойдет, если новый файл больше, но сам диск не заполнен? Будет ли он перезаписывать другие файлы и повреждать файловую систему? Если так, можете ли вы предотвратить это? Можете ли вы заменить файлы в сжатых файловых системах, таких как btrfs?

Вам необходимо смонтировать файловую систему. Не существует такого понятия, как «смещение старой версии»: файлы могут быть fragmentированы . Чтобы изменить данные, вам необходимо найти смещения и размеры всех fragmentов. Было бы еще хуже, если бы новая версия имела другой размер: вам нужно было бы выяснить, где есть свободное место для дополнительных данных, и вам нужно было бы обновить структуры данных каталога, чтобы указать, где находятся новые блоки. ,

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

Некоторые файловые системы (например, дополнительная функция zfs и btrfs) даже имеют данные о целостности файлов – они хранят контрольные суммы файлов или блоков для обнаружения повреждения данных. В таких файловых системах, если вы измените содержимое блока данных в файле без изменения соответствующих данных целостности, вы не сможете их прочитать, так как файл будет поврежден.

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