Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在docker中成功启用udev同步?_Linux_Go_Docker_Rhel_Rhel7 - Fatal编程技术网

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

Linux 如何在docker中成功启用udev同步?,linux,go,docker,rhel,rhel7,Linux,Go,Docker,Rhel,Rhel7,我已经从这里下载并安装了静态链接的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:///v

我已经从这里下载并安装了静态链接的
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
(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.
我可以看到有一个警告:“
Udev-sync不受支持。这将导致意外行为、数据丢失和错误
”,在检查
docker
源代码后,我发现警告日志来自:

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
sync失败。如何成功启用
udev
同步

更新: 检查
dm\u udev\u set\u sync\u支持的反汇编代码后

[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
(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.
(gdb)反汇编dm_udev_set_sync_支持
函数dm_udev_set_sync_支持的汇编程序代码转储:
=>0x0000000000a3e4e0:repz-retq
汇编程序转储结束。

它是一个空函数,什么也不做,更不用说设置同步支持了。这是否意味着这个静态构建的docker二进制文件没有用?

我无法重现您的问题;我得到以下信息:

(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
(gdb)反汇编dm_udev_set_sync_支持
函数dm_udev_set_sync的汇编程序代码转储_support@plt:
0x000000000040420:jmpq*0xda8c92(%rip)#0x11ac0b8
0x0000000000403426:pushq$0x14
0x00000000004342B:jmpq 0x4032d0

帮自己一个忙:忽略docker.io所做的构建,直接从RHEL获得docker。可以在附加频道上看到。虽然它通常比上游版本(例如1.6而不是1.7)晚几周,但它也经过了良好的测试,并保证实际工作。

在一些有用的反馈后修改我的原始答案:

您必须使用动态二进制文件: “问题当然是,对于静态链接的二进制文件,udev同步是不可能的,因此可能会导致损坏问题。 这对于RedHat(维护devicemapper驱动程序)来说是很难确定的,因为他们使用动态链接的二进制文件(他们在repo中提供)

就在1.7.0版本发布之后,docker开始从主安装脚本@get.docker.com(以及apt repos to match)向RPM和DEB提供动态链接的二进制文件。 这些二进制文件支持udev同步,devicemapper应该可以正常工作。”

幸运的是,自从OP创建以来,Docker已经改变了其存储库以提供动态二进制文件

参考: