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

前端之家收集整理的这篇文章主要介绍了linux – 如何在docker中成功启用udev同步?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经从这个 site下载并安装了静态链接的docker 1.6.1,并在RHEL 7.1上运行它:
  1. [root@localhost bin]# ./docker -d
  2. WARN[0000] Udev sync is not supported. This will lead to unexpected behavior,data loss and errors
  3. INFO[0000] +job init_networkdriver()
  4. INFO[0000] +job serveapi(unix:///var/run/docker.sock)
  5. INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
  6. INFO[0000] -job init_networkdriver() = OK (0)
  7. INFO[0000] Loading containers: start.
  8.  
  9. INFO[0000] Loading containers: done.
  10. INFO[0000] docker daemon: 1.6.1 97cd073; execdriver: native-0.2; graphdriver: devicemapper
  11. INFO[0000] +job acceptconnections()
  12. INFO[0000] -job acceptconnections() = OK (0)
  13. INFO[0000] Daemon has completed initialization

我可以看到有一个警告:“不支持Udev同步.这将导致意外行为,数据丢失和错误”,并且在检查docker源代码后,我发现警告日志来自deviceset.go

  1. func (devices *DeviceSet) initDevmapper(doInit bool) error {
  2. ......
  3.  
  4. // https://github.com/docker/docker/issues/4036
  5. if supported := devicemapper.UdevSetSyncSupport(true); !supported {
  6. log.Warnf("Udev sync is not supported. This will lead to unexpected behavior,data loss and errors")
  7. }
  8. log.Debugf("devicemapper: udev sync support: %v",devicemapper.UdevSyncSupported())
  9.  
  10. ......
  11. }

devicemapper.UdevSetSyncSupport是这样的:

  1. // UdevSyncSupported returns whether device-mapper is able to sync with udev
  2. //
  3. // This is essential otherwise race conditions can arise where both udev and
  4. // device-mapper attempt to create and destroy devices.
  5. func UdevSyncSupported() bool {
  6. return DmUdevGetSyncSupport() != 0
  7. }
  8.  
  9. // UdevSetSyncSupport allows setting whether the udev sync should be enabled.
  10. // The return bool indicates the state of whether the sync is enabled.
  11. func UdevSetSyncSupport(enable bool) bool {
  12. if enable {
  13. DmUdevSetSyncSupport(1)
  14. } else {
  15. DmUdevSetSyncSupport(0)
  16. }
  17. return UdevSyncSupported()
  18. }

我可以看到原因是启用udev同步失败.如何成功启用udev同步?

更新:
检查dm_udev_set_sync_support的反汇编代码后:

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

它是一个空函数,什么都不做,没有提到set sync支持.这是否意味着这个静态构建的docker二进制文件是不可用的?

解决方法

我不能重现你的问题;我得到以下内容
  1. (gdb) disassemble dm_udev_set_sync_support
  2. Dump of assembler code for function dm_udev_set_sync_support@plt:
  3. 0x0000000000403420 <+0>: jmpq *0xda8c92(%rip) # 0x11ac0b8 <dm_udev_set_sync_support@got.plt>
  4. 0x0000000000403426 <+6>: pushq $0x14
  5. 0x000000000040342b <+11>: jmpq 0x4032d0

帮自己一个忙:忽略docker.io所做的构建,直接从RHEL获取Docker.它可以在Extras频道中找到.虽然它通常比上游版本落后几周(例如1.6而不是1.7),但它也经过了充分测试并保证实际工作.

猜你在找的Linux相关文章