shell脚本对硬盘进行分区——fdiskblkidmke2fsmountlsblk

Posted 代二毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本对硬盘进行分区——fdiskblkidmke2fsmountlsblk相关的知识,希望对你有一定的参考价值。

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


		#         Start          End    Size  Type            Name
		 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  #blocks  name

		   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文件里,实现开机自动挂载。

以上是关于shell脚本对硬盘进行分区——fdiskblkidmke2fsmountlsblk的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本对硬盘进行分区——fdiskblkidmke2fsmountlsblk

shell脚本 检测根分区硬盘空间使用率

shell编程:自动格式化硬盘并挂载

shell监控脚本----硬盘空间和内存

用DiskGenius怎么对硬盘分区

Shell脚本编程基础