На какие файлы указывают «файлы пространства имен»?

Рабочий каталог останется измененным, если вы запустите сценарий с точкой (и пробелом )перед именем сценария.

Например, я использую один с именем pj, который перемещает меня в мой каталог python для проектов. Он содержит эти две строки:

#!/bin/bash
cd /home/pi/python

Я сделал его исполняемым, а затем скопировал в /usr/sbin, где он находится в моем $PATH.

Чтобы запустить его, я набираю:

. pj         (note the dot and the space)

И вуаля, он переходит в этот каталог и оставляет меня там.
Не может быть проще.

2
29.06.2019, 00:14
2 ответа

Это ядро, использующее существующую абстракцию для представления нового типа вещей. Файлы на самом деле ни на что не «указывают» в традиционном смысле символической ссылки. Значения эффективно обрабатывают пространства имен. Ядро использует эту информацию для поиска подходящего пространства имен в своих внутренних структурах данных.

Вы увидите нечто похожее в /proc/<pid>/fd, когда у процесса есть, например, сокет:

lrwx------ 1 user group 64 Jun 28 14:35 3 -> 'socket:[17257]'

Ядро будет отклонять попытки записи в них. Например:

# echo hi > /proc/self/ns/ipc
bash: /proc/self/ns/ipc: Operation not permitted

Кроме того, вы не можете создать файл с именем, например ipc:[4026531839], в этом каталоге --он находится в файловой системе proc, поэтому файлы/каталоги там просто абстракция над состоянием ядра, а ядро не позволит вам создавать новые файлы в этом каталоге.

2
27.01.2020, 21:58

Эти файлы представлены в виде символических ссылок. Они указывают на псевдофайл -, принадлежащий файловой системе псевдо-nsfs. Не включая специализированные операции с пространством имен (, выполняемые с clone (2 ), setns (2 ), unshare (2 ), ioctl _ns (2)и т. д. ), единственные известные мне разрешенные операции с этими файлами — это открывать (и закрывать )их, иметь ссылку при манипулировании страницами имен или смонтируйте их, чтобы сохранить ссылку на пространство имен, даже если процесс, использующий его, больше не существует, как это делается, например, ip netns add mynetnamespace.

Единственной доступной полезной частью информации является его индексный дескриптор, который отображается с помощью псевдосимволической ссылки -(и может быть получен в сценарии с помощьюstat -L -c %i). Это глобально уникальное (в том числе среди всех различных типов пространств имен ), поэтому без специального инструмента его можно сравнить с другим подобным значением :equals означает, что это тот же псевдо -файл, таким образом, одно и то же пространство имен.

$ ls -l /proc/$$/ns/net
lrwxrwxrwx. 1 user user 0 Jun 29 17:37 /proc/23615/ns/net -> net:[4026531992]
$ stat -c %F /proc/$$/ns/net
symbolic link
$ stat --file-system -L -c %T /proc/$$/ns/net
nsfs
$ stat -L -c %i /proc/$$/ns/net
4026531992

Также:

$ ip netns show
test
$ grep test /proc/mounts
nsfs /run/netns/test nsfs rw 0 0

Пример использования сценария оболочки для случая сетевого пространства имен в моем ответе:Как мне найти все интерфейсы, которые были настроены в Linux, включая интерфейсы контейнеров?

2
27.01.2020, 21:58

Теги

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