问题:
1、How can enable udev sync successfully in docker? #13179
2、Dynamically linked docker binary reports devicemapper and Udev not supported #12925
3、devicemapper: set flags based on udev sync support #10203
4、Docker APT repository binary has devicemapper "Udev Sync Supported: false" #10705
5、docker不支持在使用devicemapper存储类型下打开Udev Sync功能?
解决方案:
对docker1.7.1版本的解决方法:
1、先检查是否为devicemapper没有支持udev_sync功能:dmsetup udevcookies。如果没有支持会提示要求以--enable-udev_sync方式重新编译devicemapper,可按2,3步骤重新编译devicemapper。
2、安装最新版本的libudev: apt-get install libudev-dev
3、下载lvm2源码:git clone -b v2_02_103 https://git.fedorahosted.org/git/lvm2.git /usr/local/lvm2
指定--enable-udev_sync参数,重新编译安装devicemapper:./configure --enable-udev_sync & make device-mapper & make install_device-mapper
3、编译动态链接的docker程序:AUTO_GOPATH=1 ./hack/make.sh dynbinary
4、启动docker daemon时指定存储驱动器类型为devicemapper:./docker -d -D --storage-driver=devicemapper -b=my_br -H tcp://0.0.0.0:1234 -H unix:///var/run/docker.sock &
(-s 选项(storage-driver)是关键,其他按自己的情况来)
5、docker info查看结果中的Udev Sync Supported。
对最新版本的docker1.11:
编译出来后检查:
root@dev:/home/code/docker/docker/bundles/1.11.0-dev/dynbinary# ldd docker
linux-vdso.so.1 => (0x00007ffe3997c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8dbc497000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8dbc293000)
libdevmapper.so.1.02 => /lib/libdevmapper.so.1.02 (0x00007f8dbc057000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8dbbcca000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8dbc6b3000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f8dbbaaa000)
libsepol.so.1 => /lib/x86_64-linux-gnu/libsepol.so.1 (0x00007f8dbb86a000)
libudev.so.0 => /lib/x86_64-linux-gnu/libudev.so.0 (0x00007f8dbb65b000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8dbb453000)
已经依赖libudev.so。
root@dev:/home/code/docker/docker/bundles/1.11.0-dev/dynbinary# dmsetup udevcookies
Cookie Semid Value Last semop time Last change time
0xd4dbe47 0 1 Fri Mar 25 21:09:29 2016 Fri Mar 25 21:09:29 2016
0xd4d1f0e 32769 1 Fri Mar 25 21:14:00 2016 Fri Mar 25 21:14:00 2016
已经有支持udev_sync的device-mapper。
root@dev:/home/code/docker/docker/bundles/1.11.0-dev/dynbinary# ./docker -d -D --storage-driver=devicemapper -b=my_br -H tcp://0.0.0.0:1234 -H unix:///var/run/docker.sock
root@dev:/home/code/docker/docker/bundles/1.11.0-dev/dynbinary# docker info
DEBU[0005] Calling GET /v1.19/info
DEBU[0005] Client and server don't have the same version (client: 1.7.1, server: 1.11.0-dev)
Containers: 0
Images: 0
Storage Driver: devicemapper
Udev Sync Supported: true
(其他信息省略)
已经支持udev_sync了。(也可能和我之前重编译了device-mapper有关了)。
总结下来就一句话:只要device-mapper支持udev_sync,docker为动态链接依赖库即可。
Reference:
http://icarobichir.com.br/posts/building-a-dynamically-linked-docker-v-1-6-2/