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

10

我从 这个网站 下载并安装了静态链接的 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同步不被支持。这将导致意外行为、数据丢失和错误",在检查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个回答

0

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

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

在1.7.0版本发布后不久,Docker开始提供带有动态链接二进制文件的rpm和deb,这些二进制文件来自get.docker.com的主要安装脚本(以及相应的apt存储库)。使用这些二进制文件,支持udev同步,devicemapper应该可以正常工作。”

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

参考:https://github.com/docker/docker/issues/13179


0

我无法重现您的问题,我得到了以下结果:

(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进行的构建,并直接从RHEL获取Docker。它可以在Extras频道中获得。虽然它通常会落后于上游发布(例如1.6而不是1.7),但经过充分测试,保证能够正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接