i3 -статус зависает

Я исхожу из того, что вам строго не требуются монтирования, видимые для процесса инициализации (pid 1 )и что монтирования, видимые для демона docker, достаточно. Обычно они оба должны иметь одно и то же пространство имен монтирования.

Ответ для док-пакета CentOS

(Использование докера 1.13.1 из репозитория CentOS)

Я могу воспроизвести вашу проблему с /proc/1/mounts. Однако использование файла монтирования демона docker работает :

.

$ docker run -it -v /proc/$(pidof dockerd-current)/mounts:/tmp/mounts ubuntu:16.04

В док-контейнере /tmp/mountsзатем перечисляются подключения хоста.

Ответ для Docker Community Edition

(Использование внешнего докера -пакета ce 18.09.5 , как описано здесь)

В дополнение к проблеме, описанной выше, у пакета docker-ceесть проблема с контекстом SE Linux службы containerd:

.

# ps xZ | grep containerd
system_u:system_r:unconfined_service_t:s0 5695 ? Ssl   0:00 /usr/bin/containerd
...

Мы хотим, чтобы containerdбыл помечен типом container_runtime_tвместо unconfined_service_t. С этой целью маркировка /usr/bin/containerdдолжна быть обновлена ​​( общая ссылка):

# ls -Z /usr/bin/dockerd-ce 
-rwxr-xr-x. root root system_u:object_r:container_runtime_exec_t:s0 /usr/bin/dockerd-ce
# ls -Z /usr/bin/containerd
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/bin/containerd
# semanage fcontext -a -t container_runtime_exec_t /usr/bin/containerd
# restorecon /usr/bin/containerd
# ls -Z /usr/bin/containerd
-rwxr-xr-x. root root system_u:object_r:container_runtime_exec_t:s0 /usr/bin/containerd

Затем перезапустите демон containerd:

# systemctl daemon-reload
# systemctl restart containerd
# ps xZ | grep containerd
system_u:system_r:container_runtime_t:s0 6557 ? Ssl   0:00 /usr/bin/containerd

Теперь Docker-контейнер можно запустить, используя ту же технику, что и выше (с помощью dockerdвместоdockerd-current):

$ docker run -it -v /proc/$(pidof dockerd)/mounts:/tmp/mounts ubuntu:16.04

Справочная информация

Я проверил это на CentOS Linux версии 7.6.1810.

Вы можете убедиться, что init и демон docker имеют одинаковое пространство имен монтирования (, т. е. их /proc/[pid]/mounts будут показывать одни и те же монтирования):

# readlink /proc/1/ns/mnt /proc/$(pidof dockerd-current)/ns/mnt
mnt:[4026531840]
mnt:[4026531840]

Я также проверил, что SE Linux включен:

# getenforce
Enforcing

При выполнении вашей команды с пакетом CentOS dockerя получаю это сообщение об ошибке:

$ docker run -it -v /proc/1/mounts:/tmp/mounts ubuntu:16.04
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "container init exited prematurely".

Кроме того, в /var/log/audit/audit.log,Я вижу следующее нарушение AVC:

type=AVC msg=audit(1555530383.707:214): avc:  denied  { mounton } for  pid=5691 comm="runc:[2:INIT]" path="/var/lib/docker/overlay2/8944062749f8ad19c3ff600e1d5286315227378174b95a952e7b0530927f4dcd/merged/tmp/mounts" dev="proc" ino=45422 scontext=system_u:system_r:container_runtime_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=file permissive=0

Это говорит нам о том, что правила SE Linux не позволяют исходному контексту типа container _runtime _t выполнять действие «mounton» для целевого контекста типа «init _t». Вы можете убедиться, что это контекст /proc/1/mounts, тогда как контекст /proc/$(pidof dockerd-current)/mountsсоответствует :

.

# ls -Z /proc/1/mounts /proc/$(pidof dockerd-current)/mounts
-r--r--r--. root root system_u:system_r:init_t:s0      /proc/1/mounts
-r--r--r--. root root system_u:system_r:container_runtime_t:s0 /proc/5476/mounts

2
06.10.2020, 03:03
1 ответ

Если строка состояния зависает, скорее всего, процесс завершился с ошибкой. Вы должны проверить, работает ли i3status, когда проблема повторится.

Вы также можете обернуть i3statusсобственным скриптом для устранения проблемы.

В вашем файле i3 configзамените status_commandвашим собственным скриптом:

# status_command i3status -c ~/.config/i3/i3status
status_command /home/YOURUSER/.config/i3/i3status.sh

Создать~/.config/i3/i3status.sh(и chmod +x):

#!/bin/bash
echo $(date) started >> /tmp/i3status.log
while :
do
    i3status 2> /tmp/i3status-err.log | while :
    do
        read line
        echo "$line"
        touch /tmp/i3status-last-seen.log
    done
    echo $(date) restarted >> /tmp/i3status.log
done

Или, если это ошибка i3status, попробуйте этот вариант:

https://github.com/altdesktop/i3-dstatus

0
18.03.2021, 23:02

Теги

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