如何在Docker中成功启用udev同步?

问题描述:

我已经下载并安装静态链接从这个sitedocker 1.6.1,并在RHEL 7.1运行:如何在Docker中成功启用udev同步?

[[email protected] 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二进制文件是没有用的?

我无法重现您的问题;我收到以下内容:

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

请帮忙:忽略docker.io的构建,并直接从RHEL获取Docker。它在“额外”频道中可用。虽然它通常会比上游版本落后几周(例如1.6而不是1.7),但它也经过充分测试并保证实际工作。

修订我原来的答复了一些有用的反馈后:

你必须使用一个动态二进制: “当然是与一个静态链接二进制,udev的同步是不可能的,因为这样可能会导致腐败问题问题 对于RedHat(维护devicemapper驱动程序)来说,这很困难,因为它们使用动态链接二进制文件(它们在其回收站中提供)。

刚刚1.7.0发行版时,docker开始提供rpms和debs与来自主要安装脚本@ get.docker.com的动态链接二进制文件(和易于回收以匹配)。 这些二进制文件支持udev sync,并且devicemapper应该可以正常工作。“

幸运的是,自创建OP以来,Docker已经更改了其存储库以提供动态二进制文件。参考:https://github.com/docker/docker/issues/13179