Linux SD卡:如何强制内核在不移除SD卡的情况下再次读取WP pin
我有以下udev规则将sd卡的第一个分区装载到/mnt/sdcardLinux SD卡:如何强制内核在不移除SD卡的情况下再次读取WP pin,linux,embedded-linux,mount,udev,automount,Linux,Embedded Linux,Mount,Udev,Automount,我有以下udev规则将sd卡的第一个分区装载到/mnt/sdcard KERNEL=="mmcblk0p1", SUBSYSTEMS=="mmc", ATTRS{name}=="?*", ATTRS{serial}=="?*", ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="sdcard", RUN+="/usr/bin/mount_sdcard" KERNEL=="mmcblk0", ACTION=
KERNEL=="mmcblk0p1", SUBSYSTEMS=="mmc", ATTRS{name}=="?*", ATTRS{serial}=="?*", ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="sdcard", RUN+="/usr/bin/mount_sdcard"
KERNEL=="mmcblk0", ACTION=="remove", RUN+="/usr/bin/unmount_sdcard"
我的/usr/bin/mount_sdcard
可执行文件是:
#!/bin/sh
# log event
logger -t mount_sdcard -p user.warn "New SD Card detected"
# mount to /mnt/sdcard
mount_result=`mount $DEVNAME /mnt/sdcard 2>&1`
# On errors, send error to log
echo $mount_result | logger -t mount_sdcard -p user.error
if [ "x$mount_result" = "x" ]
then
# print filesystem type
stat -f /mnt/sdcard | grep Type | cut -d: -f4 | logger -t mount_sdcard -p user.warn
# print space left on device
df -h /dev/sdcard | logger -t mount_sdcard -p user.warn
fi
此代码工作正常,当插入sd卡时,分区已装入读写(rw)
但如果sd卡在引导时已经存在,则分区将以只读(ro)方式装入
在这种情况下,如果不手动卸下并重新插入sd卡,则无法装入分区读写
我试图卸载,然后再次装载。我尝试使用remount选项:mount-o remount,rw/dev/mmcblk0p1
,它似乎可以工作,但在运行mount
命令时分区仍然标记为ro:
/dev/mmcblk0p1 on /mnt/sdcard type ext4 (ro,relatime,data=ordered)
更新:
问题更为精确:
这是在定制硬件上,其中ARM处理器上的WP(写保护)引脚连接到处理器的输出
引导时,此输出将sd卡控制器设置为只读模式,初始化后,此输出反转以允许写入sd卡。
问题是,内核将仅在引导和插入卡时尝试读取此WP pin
==>引导时,内核sd卡控制器将卡设置为ro:
kernel: [ 1.723728] mmc0: new high speed SD card at address 59b4
kernel: [ 1.738262] mmcblk0: mmc0:59b4 USD 1.87 GiB (ro)
在WP pin发生变化并且卡被移除/重新填充后,内核sd卡控制器将该卡设置为rw:
kernel: [ 527.931457] mmc0: new high speed SD card at address 59b4
kernel: [ 527.943988] mmcblk0: mmc0:59b4 USD 1.87 GiB
我的问题变了:如何强制内核在不移除sd卡的情况下再次读取WP pin?我会尝试以下几件事:
- 运行
。在fsck/dev/mmcblk0p1
模式下装载分区失败通常是文件系统状态不干净的标志。这里的情况可能不是这样,因为你可以通过补发卡片正确地挂载它,但最好是安全的rw
- 试着通过
挂载/etc/fstab
,看看是否有效。我知道这不是一个确定的解决方案,但至少您可以将/dev/mmcblk0p1
的问题与mount
的问题隔离开来udev
- 将开机时SD卡的
输出与之后重新加载SD卡时的dmesg
输出进行比较。控制器似乎无法在启动时正确初始化,但问题稍后会消失。找出间歇性问题是什么可能会为您解决它dmesg
$ readlink /sys/block/mmcblk0
../devices/soc0/soc/2100000.aips-bus/2194000.usdhc/mmc_host/mmc0/mmc0:59b4/block
然后解开并绑定卡片:
$ echo 2194000.usdhc > /sys/bus/platform/drivers/sdhci-esdhc-imx/unbind
$ echo 2194000.usdhc > /sys/bus/platform/drivers/sdhci-esdhc-imx/bind
您是否尝试过,mount_result=
mount$DEVNAME/mnt/sdcard-o rw 2>&1
尝试卸载然后重新加载相关模块,您的控制器可能会被“重新检测”并重新初始化。不过,您似乎已经找到了解决方案。谢谢,fsck和fstab点不起作用。但问题是:WP引脚在引导后发生变化。现在我需要知道如何在不拔下sd卡的情况下通过内核强制重新加载sd卡。@leszek.hanusz嘿,很高兴你解决了这个问题。也感谢您分享您的解决方案。希望Upvots能尽快退还你的赏金!