Как можно успешно включить синхронизацию 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.
Это пустая функция и ничего не делает, не говоря уже о поддержке установки синхронизации. Означает ли это, что статический двоичный файл Docker бесполезен?
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 <dm_udev_set_sync_support@got.plt>
0x0000000000403426 <+6>: pushq $0x14
0x000000000040342b <+11>: jmpq 0x4032d0
Сделайте себе одолжение: игнорируйте сборки, которые делает docker.io, и получайте Docker напрямую от RHEL. Это доступно на канале Extras. Несмотря на то, что за старыми выпусками обычно будет несколько недель (например, 1.6 вместо 1.7), он также хорошо протестирован и гарантированно будет работать.
Пересмотр моего оригинального ответа после некоторых полезных отзывов:
Вы должны использовать динамический двоичный файл: "Конечно, проблема заключается в том, что со статически связанным двоичным файлом синхронизация udev невозможна, и, как таковая, может вызвать проблемы с коррупцией. RedHat (который поддерживает драйвер devicemapper) было трудно определить, потому что они использовать динамически связанный бинарный файл (который они предоставляют в своих репозиториях).
Сразу после выпуска 1.7.0 докер начал предоставлять rpms и debs с динамически связанными двоичными файлами из основного установочного скрипта @ get.docker.com (и подходящих репозиториев для соответствия). С этими двоичными файлами поддерживается синхронизация udev, и устройство должно работать нормально."
К счастью, Docker изменил свои репозитории для предоставления динамических двоичных файлов с момента создания OP.