fstab是否会格式化磁盘?因为系统每次启动都会通过Mount命令执行fstab中脚本,所以不可能每次都会格式化磁盘。
对新的分区进行格式化,格式化也是创建文件系统的过程,就是将磁盘格式化为指定的文件系统。
mount命令一般都是util-linux中提供的功能,busybox中提供的此命令一般也是通过集成util-linux来实现的。下载util-linux源码查看Mount命令的实现:
mount命令不会格式化磁盘,只能挂载,磁盘必须格式化后才能挂载。既然设备节点本身就是一个目录,为什么还要挂载呢?
挂载点是文件系统和操作系统之间的点。在Linux中,所有文件系统都必须挂载到某个地方才能访问。挂载点的位置可以是任何目录,通常是/var、/mnt或/home等目录。
fstab目录只做了挂载,没有对磁盘格式化。
lsblk
是一个用于列出块设备信息的 Linux 命令。块设备通常是硬盘、U盘等,而不是字符设备例如键盘或者鼠标。lsblk
主要用于检查和管理磁盘空间。
我们分析一下sinlinx-v3s的处理。该系统的分区文件为:tools\pack\chips\sun8iw8p1\configs\tiger-spinand-standard\sys_partition_nor_camdroid.fex
该文件的调用过程如下:
打包的时候被重命名为sys_partition.fex
固件配置文件中包含了sys_partition.fex文件,然后再调用固件生成工具dragon根据固件配置文件和分区文件生成固件:
由于dragon工具我们没有源码,所以不清楚里面的打包逻辑。
磁盘分区表应该是在bootloader以前加载的,因为bootloader也在某一个分区中,但是也可能是在uboot中直接指定bootloader的地址和大小。
系统在启动初期就会将分区表读到共享内存中,后续的所有访问都是从共享内存中读取分区信息。系统启动过程:根据分区表创建设备节点,即/dev下面的存储设备节点。
然后根据分区表中信息读取kernel和文件系统。理论上来说,只要不修改系统盘和根文件系统的参数,系统都是可以起来的,只是被修改分区的数据会有丢失。
如果想修改boot和kernel分区的参数,能不能不通过烧录的方式,而是通过页面升级的方式实现呢?
首先系统起来后kernel都已经被加载到内存了,文件系统,例如shell命令不确定是否已经加载到内存了。
假如我们先擦除老的系统分区表,写入新的分区表,然后再根据新的分区表写入kernel和文件系统,写入完成后再重启系统,那么就需要确认一下系统运行中是否允许擦除或重写分区表。如果可以的话,且能正常写入,则是可行的。
还有一种情况是将数据盘(非kernel和rootfs)分区重新划分,理论上是没有问题的,也可以不划分新的分区,而是在该分区上创建两个卷来实现物理隔离。这种就不需要重新烧录。
重新烧录的时候是先将磁盘全部擦除后,再重新写入数据,跟flash烧录器的流程是一样的。