Почему изоляция пространства имен UTS не работает?

В моем случае Caribou была моя проблема с перегревом :Запуск Linux Mint Cinnamon 19 на Asus i7 (Intel© Core™ i7 -ЦП 2670QM @ 2,20 ГГц × 4 ). Сильно перегревается, до 97С и вызывает сбои и замедления. В терминале я набрал команду top и обнаружил, что две программы используют ~100% или более процессорного времени :Thunderbird 52.9.1 и CARIBOU (программу виртуальной клавиатуры, которую я включил несколько недель назад. но не использовал ). T -bird сделал это после того, как я щелкнул, скажем, по электронной почте. Поэтому я пошел в МЕНЕДЖЕР ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, набрал CARIBOU в поле поиска и УДАЛИЛ его. Затем перезагрузился. Удивительно! Проблема решена :ЦП остыл, и T -птица вернулась к минимальной загрузке ЦП. Все, что я могу предположить, это то, что Карибу и Т -птица «сражались» друг с другом. (Кстати, одна подсказка заключалась в том, что в Win7 тот же ноутбук работал нормально, даже когда я нагрузил его одновременно видео и шахматами.)

Примечания :Впервые я узнал о проблеме перегрева, проверив файл var/log/syslog и из-за этого установил апплет Индикатор температуры ЦП , игнорируя предупреждение о вызове функции (пока проблем нет ). Использование системного монитора помогло мне проверить верхний процесс терминала, чтобы идентифицировать больших пользователей ЦП.

1
14.03.2021, 08:47
1 ответ

hostnamectl входит в среду systemd и не выполняет системный вызов sethostname(2). Он просит systemd сделать это через сокет /run/dbus/system_bus_socket. Поскольку systemd не изменил пространство имен, он выполняет это в исходном пространстве имен, изменяя имя старого пространства имен UTS (начального места, где он работает ), на новое предоставленное имя и оставляя новое Пространство имен UTS с неизменным именем (вопреки утверждению OP ):старое имя хоста. Будут и другие побочные эффекты, такие как изменение файла /etc/hostname.

Это можно проверить с помощью strace. Внутри нет sethostname(2), но видны связанные с systemd -элементы:

newfstatat(AT_FDCWD, "/run/systemd/system/", {st_mode=S_IFDIR|0755, st_size=40,...}, AT_SYMLINK_NOFOLLOW) = 0

Если предотвратить успешное выполнение вышеприведенного вызова (, используя unshare -f -u -m /bin/bash, а затем покрыв внутри него все /runс помощью mount -t tmpfs tmpfs /run), получим:

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

Диалог позже осуществляется через сокет, открытый вот так:

connect(3, {sa_family=AF_UNIX, sun_path="/run/dbus/system_bus_socket"}, 30) = 0

В такой среде следует использовать низкоуровневую «устаревшую» команду hostname, которая используется для чтения или изменения имени хоста. Он вызывает непосредственно системный вызов sethostname(2):, он изменит имя нового пространства имен UTS и оставит старое (начальное )пространство имен UTS без изменений:

hostname newhostname

Чтобы hostnamectlповлиять на новое пространство имен UTS (, как и в случае с полным контейнером, запущенным с помощью LXC ), требуется нечто большее, чем unshareкоманда :совершенно новый экземпляр systemd Система eco -должна присутствовать в новой среде, что, вероятно, потребует ввода/отмены нескольких других пространств имен и большого количества дополнительных шаблонов.

2
19.04.2021, 14:58

Теги

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