imx6ul_Linux移植ifplugd
·
imx6ul_Linux移植ifplugd
一、ifplugd简介
ifplugd(Interface Plug Daemon)是一个轻量级的 网络接口状态监控守护进程,主要用于检测以太网(Ethernet)接口的物理连接状态(如网线插拔事件),并自动触发相应的网络配置操作(如启动/关闭接口、重新获取IP等)。
二、源码下载
https://0pointer.de/lennart/projects/libdaemon/libdaemon-0.14.tar.gz
GitHub - thingnario/ifplugd-0.28: ifplugd for network hot plug detect
三、交叉移植
root@ubuntu:~/ifplug# tar -xvf libdaemon-0.14.tar.gz
root@ubuntu:~/ifplug# unzip ifplugd-0.28-master.zip
root@ubuntu:~/ifplug# cd libdaemon-0.14/
root@ubuntu:~/ifplug/libdaemon-0.14# ./configure --host=arm-fsl-linux-gnueabi --prefix=$(pwd)/__install ac_cv_func_setpgrp_void=yes
root@ubuntu:~/ifplug/libdaemon-0.14# make
root@ubuntu:~/ifplug/libdaemon-0.14# make install
root@ubuntu:~/ifplug/libdaemon-0.14# cd __install/
root@ubuntu:~/ifplug/libdaemon-0.14/__install# tar -cjvf libdaemon.tar.bz2 *
root@ubuntu:~/ifplug/libdaemon-0.14# cd ../
root@ubuntu:~/ifplug# cd ifplugd-0.28-master/
root@ubuntu:~/ifplug/ifplugd-0.28-master#cp ../libdaemon-0.14/pkgconfig/ //opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/lib -r
root@ubuntu:~/ifplug#export PKG_CONFIG_PATH=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/lib/pkgconfig/
root@ubuntu:~/ifplug/ifplugd-0.28-master# sed -i 's/-R/-Wl,-rpath=/g' src/Makefile
root@ubuntu:~/ifplug/ifplugd-0.28-master# ./configure --host=arm-fsl-linux-gnueabi CC=arm-fsl-linux-gnueabi-gcc --prefix=$(pwd)/__install LDFLAGS="-L/root/ifplug/libdaemon-0.14/__install/lib/" CPPFLAGS="-I/root/ifplug/libdaemon-0.14/__install/include"
root@ubuntu:~/ifplug/ifplugd-0.28-master# vi config.h
将#define malloc rpl_malloc修改为#define malloc malloc
root@ubuntu:~/ifplug/ifplugd-0.28-master# make
root@ubuntu:~/ifplug/ifplugd-0.28-master# make install
root@ubuntu:~/ifplug/ifplugd-0.28-master# cd __install/
root@ubuntu:~/ifplug/ifplugd-0.28-master/__install# tar -cjvf libifplug.tar.bz2 *
将libifplug.tar.bz2和libdaemon.tar.bz2拷贝至文件系统解压
root@freescale ~$ tar -xvf /media/sda1/sdrun/libifplug.tar.bz2 -C /
root@freescale ~$ tar -xvf /media/sda1/sdrun/libdaemon.tar.bz2 -C /
root@freescale /media/sda1$ rm /usr/bin/ifplugd
四、测试
编译执行脚本(下面脚本执行时要等完全执行完之后再进行插拔,具体是哪一句有阻塞)
root@freescale ~$ vi /etc/network/if.sh
#!/bin/sh
echo "if1.sh"
echo $#
echo $0
echo $1
echo $2
if [ $# -eq 2 ]; then
if [ "$1" = "eth0" ]; then
echo -n "eth0 "
fi
if [ "$2" = "up" ]; then
echo "up"
# ..........................................
/sbin/ifconfig "$1" up
# [ -x /sbin/dhclient ] && /sbin/dhclient "$1"
[ -x /sbin/udhcpc ] && /sbin/udhcpc -r "$1"
elif [ "$2" = "down" ]; then
echo "down"
# ..........................................
[ -x /sbin/udhcpc ] && /sbin/udhcpc -r "$1"
/sbin/ifconfig "$1" down
fi
fi
# ........................
exit 0
root@freescale ~$ vi /etc/network/interfaces
(只测试eth0,其他的参考修改即可)
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
# The loopback interface
auto lo
iface lo inet loopback
# Wired or wireless interfaces
#auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
#address 192.168.0.232
#netmask 255.255.255.0
#gateway 192.168.0.1
#broadcast 192.168.0.255
auto eth1
iface eth1 inet static
address 192.168.1.232
netmask 255.255.255.0
gateway 192.168.1.1
broadcast 192.168.1.255
给脚本权限并测试
root@freescale ~$ chmod 777 /etc/network/if.sh
root@freescale ~$ ifplugd -i eth0 -r /etc/network/if.sh
此时插拔eth0会自动分配ip
注:经测试usb转以太网模块如果拔掉usb的话ifplugd进程会掉,再重新插上也不能实现上述功能
为实现上述功能,我们可以添加udev规则,检测usb和网络节点去实现该功能,实现原理就是检测到usb和网络节点之后去执行ifplugd守护进程。(此处我将原生网口在设备树关闭掉,所以eth0是usb转以太网的节点,udev规则也是去检测的eth0网络节点)
udev规则如下
root@freescale ~$ cat /etc/udev/rules.d/99-usb-net.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth0", \
SUBSYSTEMS=="usb", \
RUN+="/bin/sh -c '/root/a.sh &'"
udev规则执行的脚本a.sh如下
root@freescale ~$ cat a.sh
#/bin/bash
#!/bin/bash
sleep 1
echo "55555555555555555555" > /dev/ttymxc0
#echo "启动 ifplugd 监控 eth0..." >> /var/log/ifplugd.log
#exec /sbin/ifplugd -i eth0 -f -u0 -d10 -I -q -m auto -r /etc/network/if.sh &
ifplugd -i eth0 -r /etc/network/if.sh &
echo "66666666666" > /dev/ttymxc0
exit 0
ifplugd执行的脚本/etc/network/if.sh如下
root@freescale ~$ cat /etc/network/if.sh
#!/bin/sh
echo "if1.sh"
echo $#
echo $0
echo $1
echo $2
if [ $# -eq 2 ]; then
if [ "$1" = "eth0" ]; then
echo -n "eth0 "
fi
if [ "$2" = "up" ]; then
echo "up"
# 添加实际网络启动命令(示例)
/sbin/ifconfig "$1" up
# [ -x /sbin/dhclient ] && /sbin/dhclient "$1"
[ -x /sbin/udhcpc ] && /sbin/udhcpc -r "$1"
elif [ "$2" = "down" ]; then
echo "down"
# 添加实际网络关闭命令(示例)
[ -x /sbin/udhcpc ] && /sbin/udhcpc -r "$1"
/sbin/ifconfig "$1" down
fi
fi
# 明确返回成功状态
exit 0
此时发现无论是插拔网线还是usb口都可以实现网络节点eth0能够重新自动分配ip
更多推荐

所有评论(0)