Как можно успешно включить синхронизацию udev в докере?

Я скачал и установил docker 1.6.1 со статической ссылкой с этого сайта и запустил его на RHEL 7.1:

[root@localhost bin]# ./docker -d
WARN[0000] Udev sync is not supported. This will lead to unexpected behavior, data loss and errors
INFO[0000] +job init_networkdriver()
INFO[0000] +job serveapi(unix:///var/run/docker.sock)
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
INFO[0000] -job init_networkdriver() = OK (0)
INFO[0000] Loading containers: start.

INFO[0000] Loading containers: done.
INFO[0000] docker daemon: 1.6.1 97cd073; execdriver: native-0.2; graphdriver: devicemapper
INFO[0000] +job acceptconnections()
INFO[0000] -job acceptconnections() = OK (0)
INFO[0000] Daemon has completed initialization

Я вижу, что есть предупреждение: "Udev sync is not supported. This will lead to unexpected behavior, data loss and errors", и после проверки исходного кода docker я обнаружил, что журнал предупреждений взят из deviceset.go:

func (devices *DeviceSet) initDevmapper(doInit bool) error {
    ......

    // https://github.com/docker/docker/issues/4036
    if supported := devicemapper.UdevSetSyncSupport(true); !supported {
        log.Warnf("Udev sync is not supported. This will lead to unexpected behavior, data loss and errors")
    }
    log.Debugf("devicemapper: udev sync support: %v", devicemapper.UdevSyncSupported())

    ......
}

devicemapper.UdevSetSyncSupport выглядит так:

// UdevSyncSupported returns whether device-mapper is able to sync with udev
//
// This is essential otherwise race conditions can arise where both udev and
// device-mapper attempt to create and destroy devices.
func UdevSyncSupported() bool {
    return DmUdevGetSyncSupport() != 0
}

// UdevSetSyncSupport allows setting whether the udev sync should be enabled.
// The return bool indicates the state of whether the sync is enabled.
func UdevSetSyncSupport(enable bool) bool {
    if enable {
        DmUdevSetSyncSupport(1)
    } else {
        DmUdevSetSyncSupport(0)
    }
    return UdevSyncSupported()
}

Я вижу, что причина в том, что включение синхронизации udev не удалось. Как можно успешно включить udev синхронизацию?

Обновление: после проверки кода дизассемблирования dm_udev_set_sync_support:

(gdb) disassemble dm_udev_set_sync_support
Dump of assembler code for function dm_udev_set_sync_support:
=> 0x0000000000a3e4e0 <+0>:     repz retq
End of assembler dump.

Это пустая функция, которая ничего не делает, не говоря уже о поддержке синхронизации. Означает ли это, что этот статический двоичный файл докера бесполезен?


person Nan Xiao    schedule 13.05.2015    source источник


Ответы (2)


Я не могу воспроизвести вашу проблему; Я получаю следующее:

(gdb) disassemble dm_udev_set_sync_support
Dump of assembler code for function dm_udev_set_sync_support@plt:
   0x0000000000403420 <+0>:     jmpq   *0xda8c92(%rip)        # 0x11ac0b8 <[email protected]>
   0x0000000000403426 <+6>:     pushq  $0x14
   0x000000000040342b <+11>:    jmpq   0x4032d0

Сделайте себе одолжение: игнорируйте сборки, которые делает docker.io, и получите Docker напрямую из RHEL. Он доступен в канале Extras. Хотя обычно он на несколько недель отстает от исходных выпусков (например, 1.6 вместо 1.7), он также хорошо протестирован и гарантированно работает.

person Michael Hampton    schedule 09.07.2015

Пересмотр моего первоначального ответа после некоторых полезных отзывов:

Вы должны использовать динамический двоичный файл: «Конечно, проблема в том, что со статически связанным двоичным файлом синхронизация udev невозможна и, как таковая, может вызвать проблемы с повреждением. RedHat (который поддерживает драйвер устройства) было трудно точно определить, потому что они используйте динамически связанный двоичный файл (который они предоставляют в своих репозиториях).

Сразу после выпуска 1.7.0 Docker начал предоставлять rpm и deb с динамически связанными двоичными файлами из основного скрипта установки @ get.docker.com (и соответствующих репозиториев). С этими двоичными файлами поддерживается синхронизация udev, и devicemapper должен работать нормально».

Docker, к счастью, изменил свои репозитории, чтобы предоставлять динамические двоичные файлы с момента создания OP.

ссылка: https://github.com/docker/docker/issues/13179

person Christy    schedule 18.03.2016