2012年2月6日 星期一

[轉載]如何在ARM Embedded Linux實作automount功能

來自http://clc168.blogspot.com/2008/04/arm-embedded-linuxautomount.html

如何在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打開

代碼:
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

沒有留言:

張貼留言