血的教训,系统变砖了,linux下U盘自动挂载的那些事

系统环境:nuc972 arm linux

之前产品只支持fat32格式的U盘,现在很多U盘都已经用上大容量了,需要支持ntfs和exfat格式的

在内核里面添加了配置后,可以正确地识别到它们

自动挂载,我们是用/etc/mdev.conf配置的,当系统检查到U盘插入后,会调用一个叫 automount.sh的脚本,由此脚本完成mount的操作

问题就在这mount上

之前只支持fat32,所以命令就是

if mount -t vfat -o noatime,shortname=mixed,utf8 "/dev/$1" "/mnt/$1"; then
              ln -s /mnt/$1 /mnt/$MNT
              echo "[Mount VFAT]: /dev/$1 --> /mnt/$MNT" > /dev/console
              echo "$ACT /mnt/$1" >> /tmp/mdev.log
else
              # failed to mount, clean up mountpoint
              if ! rmdir "/mnt/$1"; then
                  exit 1
              fi
              exit 1
fi

加上ntfs和exfat之后就变成了

if mount -t vfat -o noatime,shortname=mixed,utf8 "/dev/$1" "/mnt/$1"; then
              ln -s /mnt/$1 /mnt/$MNT
              echo "[Mount VFAT]: /dev/$1 --> /mnt/$MNT" > /dev/console
              echo "$ACT /mnt/$1" >> /tmp/mdev.log
elif  mount "/dev/$1" "/mnt/$1"; then
              ln -s /mnt/$1 /mnt/$MNT
              echo "[Mount]: /dev/$1 --> /mnt/$MNT" > /dev/console
              echo "$ACT /mnt/$1" >> /tmp/mdev.log
else
              # failed to mount, clean up mountpoint
              if ! rmdir "/mnt/$1"; then
                  exit 1
              fi
              exit 1
fi

改完之后,测试没问题

测试了好几个U盘后,发现系统起不来了,检查到是uboot没了,哦日,这是什么毛病啊

之后重新烧录一次,重启个几次又没了

最后查看dmesg时发现了问题,如果是mount /dev/sda1 /mnt/sda1的时候,是正常的

如果是mount /dev/sda /mnt/sda的,系统的uboot就会丢失

由于插入U盘会调用两次automount.sh,一次是sda,一次是sda1,且调用顺序随机,有时是先调用sda,有时是先调sda1,所以这个里面要做一个过滤,添加了以下代码后,顺利解决了这个坑爹的问题

devCount=`ls /dev | grep $1 | wc -l`
if [ $devCount -ge 2 ]; then
    exit 1
fi

脚本的意思是,如果$1=sda时,ls /dev的结果会找到2行有sda,这个时候就不挂载,只有参数为sda1时,ls /dev里面只能找到一行sda1时,才去挂载


 

猜你喜欢

转载自blog.csdn.net/kof98765/article/details/121975612