2008年4月3日 星期四

如何在ARM Embedded Linux實作automount功能

目的:支援automount function
關鍵字:hotplug, mdev, automount, Embedded Linux, busybox, ARM

一般來說,目前我們桌上電腦當插入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


6 則留言:

justin 提到...

請問您~
我在busybox/doc/mdev.txt 看到
@ create 之前
$ remove
* 兩者

我是在@ mount usb
我想在拔出時umount
所以在 $ umount
不過卻沒動作
不知道您是否也有遇到這個問題?
麻煩指教 謝謝~

fc.liu 提到...

你的寫法可能是這樣
sda1 0:0 660 @mount sda1 /media
sda1 0:0 660 $umount sda1 /media

mdev只會跑match到的第一個device
也就是說永遠不會去跑$的那行
你可能要用* 加上shell script去處理create 跟remove

匿名 提到...

您好,能详细告诉一下,自动挂载和自动卸载的操作吗?使用您提供的脚步可以实现挂载,不过不能卸载,希望您能给帮忙。

易春木 提到...

請問 代碼:
sda1 0:0 0660 @mount /dev/sda1 /mnt

請問是設定 sda1 權限為 660 , 那麼 0:0 是什麼意思呀?

易春木 提到...

是不是user id 與 group id ..

Unknown 提到...

請問一下
我在mount 的時候會碰到mount fail的狀況
如果是device只有sda 那always會成功
如果device有sdaXX 那就有機會會mount失敗
請問你有遇過這種問題嗎?