如何在ARM Embedded Linux實作automount功能
一般來說,目前我們桌上電腦當插入USB DISK,系統是使用udev來達成automount
在Embedded Linux中,我們並沒有跑udev這麼大的service,而是使用busybox的mdev
原理大概如下
Linux Kernel的hotplug -> 收到USB DISK insert/delete event -> 根據/proc/sys/kernel/hotplug指名的程式
-> 呼叫mdev -> mdev在根據/etc/mdev.conf設定檔指定batch file -> 執行相對應的/sbin/automount.sh
實作部份
Linux Kernel部份
================
在.config
將hotplug function打開
如果proc file system和sysfs file system沒打開的話也要記得打開(應該很少人會這個不開吧)
重新編譯kernel
Busybox部份
===========
很遺憾的Busybox 1.2版的mdev有bug,我是在Busybox 1.9版mdev source code發現已經fix這個bug了
Busybox的make menuconfig
請把mdev打開
P.S.
因為等下還有batch 需要grep 如果busybox沒開的話也要打開
target board file system部份
============================
vi /etc/inittab
掛載sysfs, 執行mdev, 並將mdev設為當系統收到hotplug event會去呼叫的程式
當然file system裡面要有/sys
vi /etc/mdev.conf
vi /sbin/automount.sh
在Embedded Linux中,我們並沒有跑udev這麼大的service,而是使用busybox的mdev
原理大概如下
Linux Kernel的hotplug -> 收到USB DISK insert/delete event -> 根據/proc/sys/kernel/hotplug指名的程式
-> 呼叫mdev -> mdev在根據/etc/mdev.conf設定檔指定batch file -> 執行相對應的/sbin/automount.sh
實作部份
Linux Kernel部份
================
在.config
將hotplug function打開
代碼: |
CONFIG_HOTPLUG=y |
如果proc file system和sysfs file system沒打開的話也要記得打開(應該很少人會這個不開吧)
代碼: |
CONFIG_PROC_FS=y CONFIG_SYSFS=y |
重新編譯kernel
Busybox部份
===========
很遺憾的Busybox 1.2版的mdev有bug,我是在Busybox 1.9版mdev source code發現已經fix這個bug了
Busybox的make menuconfig
請把mdev打開
P.S.
因為等下還有batch 需要grep 如果busybox沒開的話也要打開
target board file system部份
============================
vi /etc/inittab
代碼: |
ttyRI0::sysinit:/bin/mount -t sysfs sysfs /sys ttyRI0::sysinit:/sbin/mdev -s ttyRI0::sysinit:/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug |
掛載sysfs, 執行mdev, 並將mdev設為當系統收到hotplug event會去呼叫的程式
當然file system裡面要有/sys
代碼: |
mkdir /sys |
vi /etc/mdev.conf
代碼: |
sda1 0:0 0660 @mount /dev/sda1 /mnt sd.* 0:0 0660 @/sbin/automount.sh $MDEV |
vi /sbin/automount.sh
代碼: |
#! /bin/sh if [ "$1" == "" ]; then echo "parameter is none" > /tmp/error.txt exit 1 fi mounted=`mount | grep $1 | wc -l` # mounted, assume we umount if [ $mounted -ge 1 ]; then echo "R/media/$1" >> /tmp/usbmnt.log echo "R/media/$1" > /tmp/fifo.1 if ! umount "/media/$1"; then exit 1 fi if ! rmdir "/media/$1"; then exit 1 fi # not mounted, lets mount under /media else if ! mkdir -p "/media/$1"; then exit 1 fi if ! mount "/dev/$1" "/media/$1"; then # failed to mount, clean up mountpoint if ! rmdir "/media/$1"; then exit 1 fi exit 1 fi echo "A/media/$1" >> /tmp/usbmnt.log echo "A/media/$1" > /tmp/fifo.1 fi exit 0 |
沒有留言:
張貼留言