關鍵字: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 則留言:
請問您~
我在busybox/doc/mdev.txt 看到
@ create 之前
$ remove
* 兩者
我是在@ mount usb
我想在拔出時umount
所以在 $ umount
不過卻沒動作
不知道您是否也有遇到這個問題?
麻煩指教 謝謝~
你的寫法可能是這樣
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 ..
請問一下
我在mount 的時候會碰到mount fail的狀況
如果是device只有sda 那always會成功
如果device有sdaXX 那就有機會會mount失敗
請問你有遇過這種問題嗎?
張貼留言