scp не копирует структуру папок, как ожидалось

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

Теперь, что на самом деле происходит, это общая последовательность действий в Linux с использованием стандартной комбинации udev и udisks для запуска автоматического монтирования:

  1. Устройство физически подключено и перечисляется ядром. Ядро распознает его как какое-то блочное устройство, устанавливает соответствующие драйверы для предоставления доступа к этому интерфейсу пользовательскому пространству, а затем запускает событие uevent, чтобы сообщить всем прослушивающим устройствам в пользовательском пространстве о подключении нового оборудования.
  2. Ядро сканирует устройство на наличие разделов.
  3. Udev видит это событие и устанавливает различные узлы устройства и ссылки в /devдля устройства. Затем он сканирует устройство и его разделы, чтобы увидеть, какие файловые системы присутствуют и где, и сохраняет эти данные там, где другие программы могут их запрашивать.
  4. Udisks видит uevent от ядра, проверяет, что udev завершил настройку, а затем проверяет, не обнаружил ли udev на шаге 3 какие-либо файловые системы. Если это так, и udisks настроен на автоматическое -монтирование вновь подключенных файловых систем, он отправляет запрос на монтирование ядру для каждой файловой системы.
  5. Ядро монтирует файловую систему, выполняя следующие внутренние действия (значительно упрощенные ):
    • Сначала он проверяет наличие соответствующего драйвера для данного типа файловой системы и, если нет, пытается его загрузить.
    • Драйвер файловой системы анализирует все необходимые метаданные из суперблока файловой системы (, где хранятся все метаданные о самой файловой системе ).
    • Копия суперблока в памяти -создается и заполняется данными, предоставленными драйвером файловой системы и командой mount. Эта структура данных используется ядром для внутренней ссылки на файловую систему. Любые другие внутренние ссылки на файловую систему внутри ядра в конечном итоге указывают на это.
    • Затем ядро ​​обновляет свою внутреннюю таблицу монтирования ссылкой на нее в -суперблоке памяти -.

Теперь, что касается того, как ядро ​​«отслеживает содержимое», это намного сложнее объяснить должным образом. Короче говоря, это не так. Всякий раз, когда вы пытаетесь получить доступ к файлу на устройстве, ядро ​​ищет его в корне файловой системы. Для ускорения этого используется кеш, но на самом деле это не критично ни для чего, кроме производительности.

1
02.06.2020, 09:54
2 ответа

Локальные операции типа mv four/five /zero/или cp -r four/five /zero/не создают /zero/four/и вряд ли кто-то этого ожидает. Поэтому то, что вы называете «неожиданным», для меня скорее ожидаемо.

tarхранит предоставленный путь (см. этот вопрос). Воспользуйтесь этим фактом.

cd /one/two/three \
&& tar -cf - four/five | ssh user@bla '
   cd /zero && tar -xf -
'
3
18.03.2021, 23:31

scpведет себя здесь так же, как mvи cp. Предполагая, что fourсодержит другие каталоги, кроме five, вы можете запустить

ssh user@bla 'mkdir -p /zero/four'
(cd four && scp -r five user@bla:/zero/four/)

, чтобы просто скопировать five.

  • mkdir -pпозволяет избежать сообщения об ошибке, если каталог уже существует
  • (cd... )запускает строку в подоболочке, поэтому вам не нужно cdиз fourвпоследствии
0
18.03.2021, 23:31

Теги

Похожие вопросы