1.前言
本文介绍的是嵌入式设备烧录系统时,如何用shell脚本对硬盘进行分区。文章主要介绍的是制作烧录U盘的分区思路和关键的shell脚本语句,代码并不能直接拷贝使用。
2.总体思路
1.用U盘进行系统的烧录,就是在U盘上制作一个可以运行的系统,并且把要升级的文件也放在U盘里。 2.将U盘插入设备,然后选择从U盘上启动,U盘上的内核检测到设备里连接的存储介质,然后按照分区脚本和分区表进行分区; 3.分区完成后,挂载分区,然后把uboot(Bios)、kennel、文件系统、应用程序等烧录到指定的分区;
3.分区思路
1.首先内核要能检测到设备上的存储介质,然后shell的分区脚本要能查找并区分出各块硬盘; 2.按照自己预期的分区策略,对每个硬盘进行分区,分区的多少和大小都可以在分区表里指定; 3.分区结束后对分区进行格式化,创建文件系统; 4.将分区挂载到对应的目录;
4.按接口类型查找硬盘
4.1 命令:list_disk=fdisk -l | grep -E "Disk /dev/sd*|Disk /dev/mmcblk*|Disk /dev/nvme*" | awk '{print $2}' | awk -F / '{print $3}' | awk -F : '{print $1}'
这条命令作用就是找出系统检测到存储设备名称并存放到list_disk变量里,sd是查找SATA接口的,mmcblk是查找eMMC芯片的,nvme是查找nvme接口的。上面这条指令其实是多条指令合在一起的,接下来逐步解析这条命令,将每一本指定的效果都打印出来。为了简化,假设设备里只有一块8G的eMMC芯片。
(1)fdisk -l:列出系统检测到的存储设备
Disk /dev/mmcblk0: 7818 MB, 7818182656 bytes, 15269888 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
1 2048 124927 60M EFI System primary
2 124928 4812799 2.2G Microsoft basic primary
3 4812800 5312511 244M Microsoft basic primary
4 5312512 15267839 4.8G Microsoft basic primary
(2)fdisk -l | grep -E "Disk /dev/sd*|Disk /dev/mmcblk*|Disk /dev/nvme*":查找SATA接口、eMMC、nvme接口的存储介质
Disk /dev/mmcblk0: 7818 MB, 7818182656 bytes, 15269888 sectors
(3)fdisk -l | grep -E "Disk /dev/sd*|Disk /dev/mmcblk*|Disk /dev/nvme*" | awk '{print $2}':解析设备
/dev/mmcblk0:
(4)fdisk -l | grep -E "Disk /dev/sd*|Disk /dev/mmcblk*|Disk /dev/nvme*" | awk '{print $2}' | awk -F / '{print $3}':
mmcblk0:
(5)fdisk -l | grep -E "Disk /dev/sd*|Disk /dev/mmcblk*|Disk /dev/nvme*" | awk '{print $2}' | awk -F / '{print $3}' | awk -F : '{print $1}'
mmcblk0
4.2 查找SATA、usb接口的硬盘:list_disk=$(cat /proc/partitions | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}?' | grep -E "(^…|[ ])")
SATA接口和usb接口的硬盘设备名都是sd开头,这条命令是专门查找SATA接口和usb接口的硬盘。
(1)cat /proc/partitions
major minor
1 0 1048576 ram0
7 0 744996 loop0
7 1 9784 loop1
7 2 48 loop2
7 3 160 loop3
7 4 4 loop4
8 0 62522712 sda
179 0 7634944 mmcblk0
179 1 61440 mmcblk0p1
179 2 2343936 mmcblk0p2
179 3 249856 mmcblk0p3
179 4 4977664 mmcblk0p4
179 24 512 mmcblk0rpmb
179 16 4096 mmcblk0boot1
179 8 4096 mmcblk0boot0
(2)cat /proc/partitions | awk '{print $4}'
name
ram0
loop0
loop1
loop2
loop3
loop4
sda
mmcblk0
mmcblk0p1
mmcblk0p2
mmcblk0p3
mmcblk0p4
mmcblk0rpmb
mmcblk0boot1
mmcblk0boot0
(3)cat /proc/partitions | awk '{print $4}' | grep -E "(^|[ ])sd[a-z]+($|[ ])"
sda
5.区分各块硬盘
上一步只是查找出硬盘,但是同一接口类型可以在设备里存在多块硬盘,比如SATA接口就可能是HDD也可能是SSD,我们必须区分出各块硬盘,然后再对各块硬盘分区。具体如何区分可以参考博客《Linux中怎么区分机械硬盘(HDD)、固态硬盘(SSD)、U盘》。下面对查找处U盘进行举例,因为我们是用U盘进行烧录,所以不能也不应该对U盘进行分区操作,不然烧录U盘就被毁掉了。
5.1示例代码
list_disks=$(cat /proc/partitions | awk '{print $4}' | grep -E "(^|[ ])sd[a-z]+($|[ ])")
for i in $list_disks
do
readlink /sys/block/$i |grep -q "usb"
if [ "$?" == "0" ]; then
continue
fi
xxxx
done
解析:for循环里就是先判断是否是U盘,因为U盘是用的usb接口,如果是U盘就跳过分区操作。
6.对硬盘进行分区
分区命令可以用parted、fdisk,我这里使用的是parted。fdisk和parted的区别主要是fdisk只支持小于2T的硬盘并且不支持GPT格式。
6.1示例代码
(1)parted /dev/sda --script mklabel gpt
解析:设置分区类型为gpt,这里注意gpt和MBR分区格式的区别
(2)parted /dev/sda --script mkpart primary ${partion_start} ${partion_end}
解析:parted是分区命令。
/dev/sda:是要被分区的设备;
--script mkpart primary ${partion_start} ${partion_end}:primary指定分区是主
分区,partion_start是分区开始的位置,partion_end是分区结束的位置,分区的
起始、结束位置在分区表里指明;
补充:如果分区的起始地址是设备的开头地址可以写成0%,如果分区的结束地址是设备的最后的
地址可以写成100%。
(3)parted /dev/sda --script print
打印当前分区
6.2 gpt和MBR分区的主要差别:
(1)MBR最大支持卷2T,最多4个主分区或者3个主分区加一个扩展分区; (2)gpt最大支持18EB(1EB=1024T),最多128个分区; (3)如果存储设备超过2T则必须用gpt格式分区;
7.格式化分区
格式化分区就是在分区上创建文件系统,每种文件系统对硬盘的管理策略都不同,用mke2fs命令格式化分区,具体格式化成哪种文件系统根据具体需求。
7.1示例代码
(1)mke2fs -t ext4 -F -b 4096 -L "boot" /dev/${disk_name}
解析:
-t ext4:指定文件系统;
-F:强制mke2fs创建文件系统,即使指定的设备不是块特殊设备上的分区;
-b 4096:指定文件系统上块的大小,有效值1024、2048、4096;
-L "boot":给文件系统设置卷标名
/dev/${disk_name}:分区名
8.挂载分区:
第一步:partitionName=$(blkid -o device -t LABEL="boot")
blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等
信息进行查询。
blkid -o device:查看设备的信息
-t LABEL="dom_bin":只看LABEL为"dom_bin"的设备
第二步:mount -t ext4 -o discard $partitionName /mnt/database
解析: 第一步就是查找出对应的分区,这里可以根据LABEL进行查找,LABEL在格式化分区的时候指定的。 第二步就是挂载分区,"-t ext4"指定文件系统是ext4格式,"$partitionName "是分区,/mnt/database是挂载点。 补充:挂载这部分代码可以写在rcS文件里,实现开机自动挂载。
|