2016-10-05 7 views
0

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

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

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

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

ответ

-1

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

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

+0

спасибо! –