I.MX6 Linux udev porting
/*********************************************************************** * I.MX6 Linux udev porting * 声明: * 在嵌入式产品上,我们可以使用mdev来解决热插拔的问题,同时也经常看到 * udev,所以尝试来移植一下,但是最终发现她会丢失内核阶段产生的uevent, * 这导致无法生成内核阶段产生的设备节点,目前采用了mdev来做完成内核阶段的 * 设备节点生成,之后使用udev完成热插拔,这个问题后续有空再解决。 * * 2016-1-17 深圳 南山平山村 曾剑锋 **********************************************************************/ 一、参考文档: 1.“configure: error: Package requirements (blkid) were not met” http://unix.stackexchange.com/questions/215406/configure-error-package-requirements-blkid-were-not-met 2. 建立ARM交叉编译环境arm-none-linux-gnueabi-gcc http://blog.sina.com.cn/s/blog_a000da9d0101436p.html 3. [原创]嵌入式系统UDEV的移植 http://blog.chinaaet.com/snifer/p/38942 4. 用Busybox制作嵌入式Linux的文件系统 http://www.jiancool.com/article/6782467490/ 5. 编译busybox,动态链接与静态链接的选择 http://blog.csdn.net/newnewman80/article/details/7971317 6. busybox 制作动态库文件系统 http://www.xuebuyuan.com/913205.html 7. 第 12 章使用 udev 进行动态内核设备管理 https://www.suse.com/zh-cn/documentation/sles11/singlehtml/book_sle_admin/cha.udev.html 二、Download: 1. 网址:http://pkgs.fedoraproject.org/repo/pkgs/udev/ 2. 目标:udev-070.tar.gz 或者 udev-126.tar.gz 三、udev-070.tar.gz 编译: 1. Makefile 修改: 将142行: CROSS = #/usr/i386-linux-uclibc/usr/bin/i386-uclibc- 修改为: CROSS = arm-linux-gnueabihf- 2. make 四、udev-126.tar.gz编译: 1. ./configure --prefix=<your install path> --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf 2. 上面的<your install path>会保存在udevd程序中; 3. 可以考虑先找个地方编译安装一次,得到一些配置文件,再编译一次不指定位置的,替换udev等可执行文件。 4. ./configure --prefix= --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf 5. cp udev/test-udev udev/udevd udev/udevadm <filesystem root path>/sbin 五、Error: 1. 编译udev-182.tar.bz2不通过: 1. 错误如下: checking for xsltproc... /usr/bin/xsltproc checking for library containing clock_gettime... -lrt checking for BLKID... no configure: error: Package requirements (blkid >= 2.20) were not met: No package 'blkid' found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables BLKID_CFLAGS and BLKID_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. 2. 未能解决,换低版本。 2. 编译udev-070.tar.gz错误: 1. 现象: Running arm-linux-gnueabihf-ar: [OK] Running arm-linux-gnueabihf-ranlib: [OK] Compiling udev.c: [OK] Linking udev: [ERROR] arm-linux-gnueabihf-gcc -s -Wl -Wl,-warn-common udev.o -o udev libudev.a libs ysfs/libsysfs.a arm-linux-gnueabihf-gcc: error: unrecognized command line option ‘-Wl’ make: *** [udev] Error 1 2. 解决办法: 1. 注释187行:LDFLAGS += -s -Wl 2. 注释204行:LDFLAGS += -Wl,-warn-common 3. 运行依赖动态库程序错误: 1. 现象: [^_^ bin]# ls udev main mainso -al -rwxrwxr-x 1 1001 1001 463813 Jan 16 2016 main -rwxrwxr-x 1 1001 1001 5970 Jan 16 2016 mainso -rwxrwxr-x 1 1001 1001 35268 Jan 16 2016 udev [^_^ bin]# ./udev -/bin/sh: ./udev: not found [^_^ bin]# ./main hello world. [^_^ bin]# ./mainso -/bin/sh: ./mainso: not found [^_^ bin]# 2. 采用的编译方式: 1. udev、mainso采用的共享库的方式编译的; 2. main采用的静态编译的。 3. 解决方法: 由于busybox采用了静态编译的方式进行编译,这样可以在不依赖库的情况下运行, 所以自己对busybox进行重现编译,采用动态库共享库的方式进行编译,程序运行正常。 4. 使用udev-070.tar.gz热插拔无效果: 1. 配置没写好,本例以miniSD卡为例; 2. cat /etc/udev/udev.conf # Where in the filesystem to place the device nodes udev_root="/dev" # The name and location of the udev database. udev_db="/dev/.udevdb" # The name and location of the udev rules file(s). udev_rules="/etc/udev/rules.d" # The syslog(3) priority: "err", "info", or the numerical value. udev_log="err" 3. cat /etc/udev/rules.d/udev-devfs.rules ...... ACTION=="add", KERNEL=="mmcblk[0-9][b-z][0-9]", RUN+="/bin/mkdir -p /mnt/mmc%n" ACTION=="remove", KERNEL=="mmcblk[0-9][b-z][0-9]", RUN+="/bin/rm -rf /mnt/mmc%n" ...... 4. cat /etc/init.d/rcS ...... # 这个用于找回内核启动阶段的设备节点,要不然连ttymxc0(debug口)节点都没有。 /sbin/mdev -s ...... udevd --daemon & udevstart ...... 5. 效果如下: [zengjf@root ]# ls /mnt [zengjf@root ]# mmc1: host does not support reading read-only switch. assuming write-enable. mmc1: new high speed SDHC card at address aaaa UEVENT[946688081] add@/devices/plmmcblk1: mmc1:aaaa SS08G 7.40 GiB atform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa UEVENT[946688081] add@/devices/virtual/bdi/179:24 mmcblk1: p1 p2 p3 UEVENT[946688081] add@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1 UEVENT[946688081] add@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p1 UEVENT[946688081] add@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p2 UEVENT[946688081] add@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p3 [zengjf@root ]# ps | grep udev 1417 root 0:00 udevd --daemon 1509 root 0:00 udevmonitor 1743 root 0:00 udev mmc 1746 root 0:00 udev bdi 1753 root 0:00 grep udev [zengjf@root ]# ls /mnt mmc1 mmc2 mmc3 [zengjf@root ]# mmc1: card aaaa removed UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p3 UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p2 UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p1 UEVENT[946688175] remove@/devices/virtual/bdi/179:24 UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1 UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa [zengjf@root ]# ls /mnt [zengjf@root ]# 6. udev丢失kernel阶段设备事件: 如上,如果不使用 /sbin/mdev -s 获取内核阶段的的设备节点,udev无法获取到内核阶段的。 目前还没找到什么更好的办法来解决,也许以后不小心就解决了。 5. udev-126.tar.gz udevd运行错误: 1. 错误现象: ...... udevd[1468]: lookup_group: specified group 'tty' unknown ...... udevd[1468]: lookup_group: specified group 'uucp' unknown udevd[1468]: lookup_group: specified group 'kmem' unknown udevd[1468]: lookup_group: specified group 'lp' unknown ...... udevd[1468]: lookup_group: specified group 'disk' unknown udevd[1468]: lookup_group: specified group 'floppy' unknown ...... udevd[1468]: lookup_group: specified group 'disk' unknown ...... 2. 解决办法: cat /etc/group ...... tty:x:1:tty uucp:x:2:uucp kmem:x:3:kmem lp:x:4:lp disk:x:5:disk floppy:x:6:floppy disk:x:7:disk ...... 3. cat /etc/udev/rules.d/udev-devfs.rules ...... ACTION=="add", KERNEL=="mmcblk[0-9][b-z][0-9]", RUN+="/bin/mkdir -p /mnt/mmc%n" ACTION=="remove", KERNEL=="mmcblk[0-9][b-z][0-9]", RUN+="/bin/rm -rf /mnt/mmc%n" ...... 4. 运行正常效果: input: USB OPTICAL MOUSE as /devices/platform/fsl-ehci.1/usb2/2-1/2-1.2/2-1.2:1.0/input/input4 generic-usb 0003:0000:0538.0001: input,hidraw0: USB HID v1.11 Mouse [ USB OPTICAL MOUSE] on usb-fsl-ehci.1-1.2/input0 udevd (1426): /proc/1426/oom_adj is deprecated, please use /proc/1426/oom_score_adj instead. udevd version 126 started zengjf login: root login[1429]: root login on 'ttymxc0' [zengjf@root ~]# ls /mnt [zengjf@root ~]# mmc1: host does not support reading read-only switch. assuming write-enable. mmc1: new high speed SDHC card at address aaaa mmcblk1: mmc1:aaaa SS08G 7.40 GiB mmcblk1: p1 p2 p3 [zengjf@root ~]# ps ...... 1408 root 0:00 [kjournald] 1426 root 0:00 udevd --daemon 1427 root 0:00 [flush-179:0] 1429 root 0:00 -sh 1433 root 0:00 [mmcqd/1] 1461 root 0:00 ps [zengjf@root ~]# ls /mnt mmc1 mmc2 mmc3 [zengjf@root ~]# mmc1: card aaaa removed [zengjf@root ~]# ls /mnt [zengjf@root ~]#