inicializa o serviço systemd dentro do contêiner OCI (runc)

0

Atualmente, estou tentando iniciar o serviço systemd (avahi-daemon) dentro do contêiner RUNC e todas as minhas tentativas falharam. Eu enfrentei vários artigos para a mesma tarefa, mas para a solução docker e mais um . Alguém tem uma experiência bem sucedida com a mesma tarefa?

Esta é minha config.json:

{
"ociVersion": "1.0.0-rc1",
"platform": {
    "os": "linux",
    "arch": "arm"
},
"process": {
    "terminal": false,
    "user": {
        "uid": 0,
        "gid": 0
    },
    "args": [
           "/bin/systemctl", "start", "avahi-daemon"
    ],
    "env": [
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "TERM=xterm"
    ],
    "cwd": "/",
    "capabilities": {
            "bounding": [
                    "CAP_AUDIT_WRITE",
                    "CAP_KILL",
                    "CAP_NET_RAW",
                    "CAP_SYS_ADMIN",
                    "CAP_NET_BIND_SERVICE"
            ],
            "effective": [
                    "CAP_AUDIT_WRITE",
                    "CAP_KILL",
                    "CAP_NET_RAW",
                    "CAP_SYS_ADMIN",
                    "CAP_NET_BIND_SERVICE"
            ],
            "inheritable": [
                    "CAP_AUDIT_WRITE",
                    "CAP_KILL",
                    "CAP_NET_RAW",
                    "CAP_SYS_ADMIN",
                    "CAP_NET_BIND_SERVICE"
            ],
            "permitted": [
                    "CAP_AUDIT_WRITE",
                    "CAP_KILL",
                    "CAP_NET_RAW",
                    "CAP_SYS_ADMIN",
                    "CAP_NET_BIND_SERVICE"
            ],
            "ambient": [
                    "CAP_AUDIT_WRITE",
                    "CAP_KILL",
                    "CAP_NET_RAW",
                    "CAP_SYS_ADMIN",
                    "CAP_NET_BIND_SERVICE"
            ]
    },
    "rlimits": [
        {
            "type": "RLIMIT_NOFILE",
            "hard": 1024,
            "soft": 1024
        }
    ],
    "noNewPrivileges": true
},
"root": {
    "path": "rootfs",
    "readonly": false
    },
"hostname": "runc",
"mounts": [
    {
        "destination": "/proc",
        "type": "proc",
        "source": "proc"
    },
    {
        "destination": "/dev",
        "type": "tmpfs",
        "source": "tmpfs",
        "options": [
            "nosuid",
            "strictatime",
            "mode=755",
            "size=65536k"
        ]
    },
    {
        "destination": "/dev/pts",
        "type": "devpts",
        "source": "devpts",
        "options": [
            "nosuid",
            "noexec",
            "newinstance",
            "ptmxmode=0666",
            "mode=0620",
            "gid=5"
        ]
    },
    {
        "destination": "/dev/shm",
        "type": "tmpfs",
        "source": "shm",
        "options": [
            "nosuid",
            "noexec",
            "nodev",
            "mode=1777",
            "size=65536k"
        ]
    },
    {
        "destination": "/dev/mqueue",
        "type": "mqueue",
        "source": "mqueue",
        "options": [
            "nosuid",
            "noexec",
            "nodev"
        ]
    },
    {
        "destination": "/sys",
        "type": "sysfs",
        "source": "sysfs",
        "options": [
            "nosuid",
            "noexec",
            "nodev",
            "ro"
        ]
    },
    {
        "destination": "/sys/fs/cgroup",
        "type": "cgroup",
        "source": "cgroup",
        "options": [
            "ro"
        ]
    }
],
"linux": {
    "resources": {
        "devices": [
            {
                "allow": false,
                "access": "rwm"
            }
        ]
    },
    "namespaces": [
        {
            "type": "network"
        },
        {
            "type": "ipc"
        },
        {
            "type": "uts"
        },
        {
            "type": "mount"
        }
    ],
    "maskedPaths": [
        "/proc/kcore",
        "/proc/latency_stats",
        "/proc/timer_stats",
        "/proc/sched_debug"
    ],
    "readonlyPaths": [
        "/proc/asound",
        "/proc/bus",
        "/proc/fs",
        "/proc/irq",
        "/proc/sys",
        "/proc/sysrq-trigger"
    ]
}

Este arquivo de configuração libera um erro: "Falha ao conectar ao barramento: Nenhum arquivo ou diretório" .

Durante minhas tentativas, tentei:

  1. Atribuir recursos CAP_SYS_ADMIN ao contêiner;
  2. Execute o binário "/ sbin / init" na inicialização do contêiner e receba um erro: "Não foi possível encontrar uma implementação de telinit alternativa para gerar." ;
  3. O arquivo init é um link simbólico para "/ lib / systemd / systemd", portanto, também tentei usar esse script diretamente e também recebi um erro: "Tentando executar como instância do usuário, mas o sistema não foi inicializado com o systemd. ".
por Alex Bidnichenko 22.01.2018 / 17:54

2 respostas

0

Minha versão do arquivo config.json para o systemd dentro do runc:

{
"ociVersion": "1.0.0-rc1",
"platform": {
    "os": "linux",
    "arch": "arm"
},
"process": {
    "terminal": false,
    "user": {
        "uid": 0,
        "gid": 0
    },
    "args": [
        "/sbin/init"
    ],
    "env": [
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "TERM=xterm"
    ],
    "cwd": "/",
    "capabilities": {
            "bounding": [
                    "CAP_KILL",
                    "CAP_CHOWN",
                    "CAP_SETGID",
                    "CAP_SETUID",
                    "CAP_NET_RAW",
                    "CAP_MAC_ADMIN",
                    "CAP_SYS_ADMIN",
                    "CAP_SYS_CHROOT",
                    "CAP_AUDIT_WRITE",
                    "CAP_NET_BIND_SERVICE"
            ],
            "effective": [
                    "CAP_KILL",
                    "CAP_CHOWN",
                    "CAP_SETGID",
                    "CAP_SETUID",
                    "CAP_NET_RAW",
                    "CAP_MAC_ADMIN",
                    "CAP_SYS_ADMIN",
                    "CAP_SYS_CHROOT",
                    "CAP_AUDIT_WRITE",
                    "CAP_NET_BIND_SERVICE"
            ],
            "inheritable": [
                    "CAP_KILL",
                    "CAP_CHOWN",
                    "CAP_SETGID",
                    "CAP_SETUID",
                    "CAP_NET_RAW",
                    "CAP_MAC_ADMIN",
                    "CAP_SYS_ADMIN",
                    "CAP_SYS_CHROOT",
                    "CAP_AUDIT_WRITE",
                    "CAP_NET_BIND_SERVICE"
            ],
            "permitted": [
                    "CAP_KILL",
                    "CAP_CHOWN",
                    "CAP_SETGID",
                    "CAP_SETUID",
                    "CAP_NET_RAW",
                    "CAP_MAC_ADMIN",
                    "CAP_SYS_ADMIN",
                    "CAP_SYS_CHROOT",
                    "CAP_AUDIT_WRITE",
                    "CAP_NET_BIND_SERVICE"
            ],
            "ambient": [
                    "CAP_KILL",
                    "CAP_CHOWN",
                    "CAP_SETGID",
                    "CAP_SETUID",
                    "CAP_NET_RAW",
                    "CAP_MAC_ADMIN",
                    "CAP_SYS_ADMIN",
                    "CAP_SYS_CHROOT",
                    "CAP_AUDIT_WRITE",
                    "CAP_NET_BIND_SERVICE"
            ]
    },
    "rlimits": [
        {
            "type": "RLIMIT_NOFILE",
            "hard": 1024,
            "soft": 1024
        }
    ],
    "noNewPrivileges": true
},
"root": {
    "path": "rootfs",
    "readonly": false
    },
"hostname": "runc",
"mounts": [
    {
        "destination": "/proc",
        "type": "proc",
        "source": "proc",
        "options": [
                "nosuid",
                "noexec",
                "nodev"
        ]
    },
    {
        "destination": "/dev",
        "type": "tmpfs",
        "source": "tmpfs",
        "options": [
            "nosuid",
            "strictatime",
            "mode=755"
        ]
    },
    {
        "destination": "/dev/pts",
        "type": "devpts",
        "source": "devpts",
        "options": [
            "nosuid",
            "noexec",
            "newinstance",
            "ptmxmode=0666",
            "mode=0620",
            "gid=5"
        ]
    },
    {
        "destination": "/dev/shm",
        "type": "tmpfs",
        "source": "shm",
        "options": [
            "nosuid",
            "noexec",
            "nodev",
            "mode=1777",
            "size=65536k"
        ]
    },
    {
        "destination": "/dev/mqueue",
        "type": "mqueue",
        "source": "mqueue",
        "options": [
            "nosuid",
            "noexec",
            "nodev"
        ]
    },
    {
        "destination": "/sys",
        "type": "sysfs",
        "source": "sysfs",
        "options": [
            "nosuid",
            "noexec",
            "nodev"
        ]
    },
    {
        "destination": "/sys/fs/cgroup",
        "type": "bind",
        "source": "/sys/fs/cgroup",
        "options": [
            "rbind",
            "ro"
        ]
    }
],
"linux": {
    "resources": {
        "devices": [
            {
                "allow": false,
                "access": "rwm"
            }
        ]
    },
    "namespaces": [
        {
            "type": "pid"
        },
        {
            "type": "network"
        },
        {
            "type": "ipc"
        },
        {
            "type": "uts"
        },
        {
            "type": "mount"
        }
    ],
    "maskedPaths": [
        "/proc/kcore",
        "/proc/latency_stats",
        "/proc/timer_stats",
        "/proc/sched_debug"
    ],
    "readonlyPaths": [
        "/proc/asound",
        "/proc/bus",
        "/proc/fs",
        "/proc/irq",
        "/proc/sys",
        "/proc/sysrq-trigger"
    ]
}
    
por 07.02.2018 / 12:53
0

Os serviços systemd não são executados de modo autônomo - você só pode iniciá-los se o seu pid 1 (init) for systemd. Em contêineres, isso requer o uso de um namespace pid além do que você já tem.

(Em outras palavras, o systemctl na verdade não lê e executa todos os arquivos .service - ele só pede ao pid 1 para iniciar o daemon correspondente.)

Em geral, eu diria que sua configuração runC já duplica os recursos internos do systemd (ProtectHome =, CapabilityBoundingSet =, etc.) Mas se você fizer deseja executar o daemon em um contêiner dedicado , você só tem duas opções:

  1. Execute o container com um novo namespace PID, com o systemd como seu processo principal, e tenha que a instância do systemd inicie o avahi-daemon. (O systemd-nspawn pode funcionar melhor que o runC.)

  2. Configure o contêiner para iniciar / usr / bin / avahi-daemon diretamente, sem envolver os arquivos systemctl ou avahi-daemon.service.

por 22.01.2018 / 19:21