我已经从这个
site下载并安装了静态链接的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.