Linux中的存储命名

最近在做使用U盘和SD卡对设备进行系统升级时遇到了一些问题。不同的SD卡插入设备后挂载的目录名称不一致,并且在SD卡拔出后还存在挂载的目录。以及U盘插入后有时在/dev/目录下生成的是sda、有时还存在sda1,有时便为sdb等之类的。这里记录下来以便后续开发少经历些坑。在Linux系统中,平时插入U盘有时在/dev/目录中会显示sda、sda1、 sda2、 sdb、 sdc等之类的设备文件,那么这些文件有什么差别呢?要是系统使用了udev或者是mdev动态设备文件管理,那么在系统上电、设备热插拔、安装驱动的时候,内核会把相应的事件发送给用户空间的udev或者是mdev。udev会查找/sys目录中相关的文件,用来生成/dev/目录下的设备文件,最后还会根据用户指定的rules进行相关的操作(如自动挂载、建立连接、对设备文件重命名等)。这里为了方便讲解,以U盘为例。
首先需要弄清楚一些相关的概念,如sda、sda1。在Linux中有如下命名规则:
Linux中的存储命名
上图来源于Linux中设备命名一文。
在Linux中U盘也属于硬盘的,所以sda表示第一个硬盘、sdb表示第二个硬盘、sdn表示第n个硬盘。而每个硬盘都可以分区,所以sda1表示的是第一个硬盘的第一个分区,同样sda2表示的是第一个硬盘的第二个分区
/sys/为虚拟文件系统,里面存放着系统运行时产生的一些信息。在设备插入的时候(U盘),会在/sys/block/中创建和U盘相关的目录,比如sda。进入sda后有时会发现里面还存在sda1目录。每个目录中的dev文件是用来指定生成/dev目录中设备文件的主次设备号,而uevent则是记录一些相关属性。
Linux中的存储命名
Linux中的存储命名
查看dev文件会发现里面记录的东西很简单,只有主次设备号,使用:分隔开。发现sda的设备号为8:0,而sda1的设备号为8:1
Linux中的存储命名Linux中的存储命名
而在uevent文件中则记录了更为详细的信息,除了有主次设备号,还有设备文件的名字以及类型。在sda中name为sda,类型为disk,即为磁盘。而在sda1目录中的uevent文件中,name为sda1,type却为partition。从这里可以看出,sda1为sda的分区。如果U盘没有分区,则sda目录下面不会存在sda1,要是U盘有多个分区,则在sda目录中会存在相应的sda1、sda2…等目录
Linux中的存储命名
Linux中的存储命名
从上面也可以看到udev或mdev的工作部分流程,==在热插拔或者是驱动安装时,内核探测到某些设备后,会在/sys/目录中记录下来,block子目录记录与块设备相关的一些信息。在这里有dev文件描述设备文件的主次设备号、uevent则是更为详细的描述。==应用空间的udev便是从这里获取信息来动态生成设备文件。而执行的rules会在相关的文章的描述,不属于这部分。