5

Из того, что я понимаю, подобъемы btrfs совместно используют одно и то же "хранилище" файловой системы, поэтому я был удивлен, узнав, что перемещение файлов между различными подобъемами - это дорогостоящая операция, например перемещение между различными файловыми системами (копирование + удаление).

Я был особенно удивлен, когда кто-то предложил этот обходной путь: перефокусируйте-скопируйте файлы между подобъемами, а затем удалите оригинальные. Говорят, что это дешевая операция (перемещение только по метаданным). Как это разные подобъемы могут совместно использовать блоки данных при использовании COW, но не в более легкой операции перемещения данных?

1 ответ1

2

Как это разные подобъемы могут совместно использовать блоки данных при использовании COW, но не в более легкой операции перемещения данных?

mv использует переименование системного вызова, чтобы попытаться переместить. Переименование ядра btrfs impl обнаруживает перекрестное перемещение подобъемов и явно запрещает это (даже если находится в той же точке монтирования):

/* we only allow rename subvolume link between subvolumes */
if (old_ino != BTRFS_FIRST_FREE_OBJECTID && root != dest)
    return -EXDEV;

Это, вероятно, связано с подсчетом Invo в томах и путями кода, которые используют эти операции. Reflink-copy фактически создает новые метаданные (но сами данные - CoW), учитываемые в новом подобъеме. Теоретически они, вероятно, могли бы сделать переименование, чтобы "переместить" метаданные, выполнив что-то похожее на то, что делает copy --reflink, за которым следует rm source ... просто никто не предпринял усилий, чтобы сделать это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .