Могу ли я переместить поток ядра из одного пространства имен в другое?

Наша ситуация такова:

  1. Сначала у нас есть поток ядра (скажем, KS), который начинает работать, когда ядро ​​начинает работать;
  2. Затем, когда система будет готова, мы создадим другое пространство имен (скажем, NS1), которое имеет другие значения с помощью LXC.

Наше требование состоит в том, что KS нужно написать что-то по пути, который может видеть только NS1. Вот я и думаю, могу ли я переместить KS в пространство имен NS1 (хотя бы изменить пространство имен монтирования)? Если да, то как? Я проверил setns() syscall и его исходный код ядра, но все еще не знают, как это сделать (либо в пользовательском пространстве, либо изменить исходный код KS), и даже не уверены, является ли это правильным способом решения проблемы.

Другой мой вопрос: я понимаю, что задача ядра (например, потоки ядра) распознает "пространство имен", если оно находится в контексте процесса, но мой друг считает, что "пространство имен" является концепцией пространства пользователя, весь персонал ядра знает только о корневом пространстве имен. Который правильный?

1 ответ

Нет, это не правильный способ решить вашу проблему. Сама идея записи в любое пространство имен из потока ядра плоха, как подробно объяснено здесь: http://www.linuxjournal.com/article/8110. Это следует делать из пользовательского пространства, после того как вы введете необходимое пространство имен монтирования с помощью системного вызова setns(2). Страница man setns(2) содержит пример кода для этого.

Ответ на другой ваш вопрос - ваш друг не прав; настройка пространства имен и соответствующая обработка выполняются ядром внутри ядра, поэтому ядро ​​должно знать все обо всех пространствах имен. Struct_task каждой задачи содержит член структуры nsproxy со всеми соответствующими указателями на соответствующие структуры данных пространства имен - это структуры данных только для ядра. Пространство пользователя фактически ничего об этом не знает (кроме того, что запросило его в clone()). В случае пространства имен монтирования пользовательскому процессу вручается таблица монтирования: либо та же, что и у родительского, либо личная копия, если клоном было запрошено новое пространство имен монтирования (flags=CLONE_NEWNS). В любом случае пользовательский процесс просто использует любую таблицу монтирования (структуры), которой он был передан, а ядро ​​управляет деталями пространства имен без уведомления пользователя об этом.

Другие вопросы по тегам