Загрузка модуля ядра во время загрузки блокируется?

Два вопроса из первоначальной постановки вопроса:

  1. Команда, выполняемая с помощью -exec, должна быть завершена с помощью ;.
  2. Неверный формат команды rsync.

Это то, что я думаю, вы можете захотеть:

find components -iname "*.html" -exec rsync -R {}./build/ ';'

Чтобы скопировать файл с помощью rsync, вам нужно будет указать, куда он должен быть скопирован в . Здесь я предположил, что вы хотите скопировать все найденные файлы в ./build/.

После обновления вопроса:

Команда, которую выполняет find, должна заканчиваться символом ;-, защищенным от оболочки. Правильный способ защитить ;от командной оболочки — указать его в кавычках с помощью \;или ';'¹.

Поскольку вы используете \\;, вы «отменяете» цитирование ;и вместо этого процесс findпросто увидит завершение \. Поскольку он не видит ;, он будет жаловаться на отсутствие аргументов.

Вы где-то упомянули npm. Это менеджер пакетов для JavaScript. Поскольку вы упомянули об этом, это наводит меня на мысль, что вы запускаете findне из командной строки, а из какого-то сценария. Цитирование может (потенциально )работать по-разному внутри скрипта в зависимости от конкретных грамматических и синтаксических правил этого скриптового языка.

Чтобы правильно решить эту проблему, было бы очень полезно увидеть фактический вызов findв контексте скрипта, который его вызывает.

До тех пор, пока вопрос не будет дополнен этой информацией, ответ, который я здесь дал, будет настолько точным, насколько это возможно.


¹ (или ";"или более экзотические формы, такие как $';'или $'\u003b'в зависимости от корпуса, ';'является наиболее портативным)

1
20.11.2019, 13:00
1 ответ

Что делает ОС?

В моем Debian (, но я готов поспорить, что ваша CentOS делает то же самое ), часть инициализации загрузки модуля выполняется /etc/init.d/kmod.

Ниже приведен фрагмент этого скрипта:

files=$(modules_files)
if [ "$files" ] ; then
  grep -h '^[^#]' $files |
  while read module args; do
    [ "$module" ] || continue
    load_module "$module" "$args"
  done
fi

Где:

  • modules_files— это функция оболочки, которая анализирует различные файлы и каталоги (, включая /etc/modules-load.d), и создает список загружаемых модулей.

  • load_module— это функция оболочки, которая выполняет работу modprobe+ некоторое ведение журнала, если установлен подробный флаг.

Так что я бы сказал, что да, модули загружаются последовательно, и если один блокируется, то он блокирует и другие....

но...

 Что делает ядро?

При чтении исходного кода linux/modules.c мы видим, что:

  • Вероятно, системный вызов реализован функцией load_module(). Мы видим, что он выполняет множество действий (по инициализации, выделению памяти, проверке работоспособности, проверке подписи и т. д. )и возвращается сreturn do_init_module(mod);(строкой 3927

  • Функция do_init_module()выполняет в строке 3574 следующую операцию и, если все прошло нормально, возвращает 0.

    if (mod->init != NULL)
        ret = do_one_initcall(mod->init);
    if (ret < 0) {
        goto fail_free_freeinit;
    }

Я пришел к выводу, что системный вызов вернется только тогда, когда :1. Модуль загружен в память. 2. Его функция инициализации ()успешно выполнена.

Итак, если ваш вызов wait_for_random_bytes()является частью функции инициализации вашего модуля, то да, он может блокировать загрузку других модулей.

0
27.01.2020, 23:57

Теги

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