shell脚本对硬盘进行分区——fdisk、blkid、mke2fs、mount、lsblk

2023-11-10

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本对硬盘进行分区——fdisk、blkid、mke2fs、mount、lsblk 的相关文章

  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • 使用 gcc 理解共享库

    我试图理解 C 中共享库的以下行为 机器一 cat one c include
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 使用 ProcessBuilder 运行 shell 脚本

    我正在尝试使用 Java 和 ProcessBuilder 运行脚本 当我尝试运行时 我收到以下消息 error 2 没有这样的文件或目录 我不知道我做错了什么 但这是我的代码 ps 我尝试只执行不带参数的脚本 错误是相同的 String
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 如何将 elf 解释器(ld-linux.so.2/ld-2.17.so)构建为静态库?

    如果我的问题不准确 我深表歉意 因为我没有太多 Linux 相关经验 我目前正在构建一个 Linux 从头开始 主要遵循 linuxfromscratch org 版本的指南 7 3 我遇到了以下问题 当我构建可执行文件时 获取一个称为 E
  • Visual Studio - X11:缺少 DISPLAY 环境变量

    我正在使用 Visual Studio 2019 Enterprise 开发跨平台 Windows Linux x64 GUI 应用程序 在这个 2019 版本中 我们可以使用 Visual Studio调试平台 Windows 本机 和
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 由于 abi::cxx11 符号导致的链接问题?

    我们最近收到一份报告 因为GCC 5 1 libstdc 和双 ABI http gcc gnu org onlinedocs libstdc manual using dual abi html 它似乎Clang 不知道 GCC 内联名称
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 如何在 Linux 中向热敏打印机发送 ESC/POS 命令

    我正在尝试在热敏打印机上发送 ESC POS 命令 但每当我发送它们时 热敏打印机都会将它们打印为文本 而不是作为命令执行它们 我在 prn 文件中编写这些命令 每当我执行 lp 命令来打印文件时 这些 prn 文件也会被打印 但作为文本
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到

随机推荐

  • vue中用Element-ui封装表单(form)和表格(table)组件动态渲染数据展示

    老样子 先来个效果图 查询表单数据和表格的列信息以及表格数据都是从后端拿到后自动渲染成下面的格式 一 先创建表格和表单组件 下面的form和table组件 可以直接复制使用的 如果你需要 form vue
  • python 类装饰器的好处_python 装饰器重要在哪

    1 什么是装饰器 要理解什么是装饰器 您首先需要熟悉Python处理函数的方式 从它的观点来看 函数和对象没有什么不同 它们有属性 可以重新分配 def func print hello from func func gt hello fr
  • 在QT的信号槽中使用自定义数据类型

    qt中使用信号槽来处理GUI与后台数据同步是不错的 耗时的任务可以在处理完数据后使用信号通知UI更新 对于qt中的已有类型 可以直接使用 但 多数时候都需要用到自定义类型 如果像内建类型那样使用 编译时正常 但运行时会报错 QObject
  • javax.xml.parsers.FactoryConfigurationError: Provider for javax.xml.parsers.

  • linux 打开.v文件,构建riscv上运行的linux系统

    在qemu上启动linux kernel 总述 最终目标还是要在RTL上跑linux系统 但做这个之前第一步先把系统工具链整清楚很重要 所以先在qemu上把相关的工具链 镜像搞定 为了完全这项任务 我们需要安装几个工具 qemu for r
  • VIM编辑命令

    转载 进入编辑模式 vim命令模式 vim实践 吉米乐享驿站 博客园 cnblogs com 5 5 进入编辑模式 所谓编辑模式就是进入到一个可以编辑文本文档的模式 常规的方式就是按小i进入编辑模式 左下角显示 insert插入 状态 此时
  • Java基础篇——入门

    转眼间这已经是自己工作的第五个年头了 期间做过安卓 做过web 现在又加入了小程序的阵营 可谓是历尽各种坎坷啊 让我不由得想起了 红楼梦 的开篇之句 满纸荒唐言 一把辛酸泪 期间的艰难困苦 实属夸张之感慨 无病呻吟 哈哈 只有自己能够体味啊
  • 语义分割制作自己的数据集——训练集、验证集、测试集

    用于语义分割的VOC数据集格式 语义分割任务voc数据集主要包括JPEGImages 存放原始图像 SegmentationClass 存放label ImageSets Segmentation 存放划分的数据集 包括train txt
  • VS2008, MFC 文件的操作3 - Win32 API 方式 文本方式打开

    接上一节笔记 VS2008 MFC 文件的操作2 C 语言方式 文本方式打开 1 代码 void Cvs2008 SX jiaocheng12View OnFileWritefile TODO 在此添加命令处理程序代码 Win32 API
  • cuda编程学习笔记 第二章 cuda memory management

    应用的性能可能有 75 都花费在内存相关问题上 NVPROF and NVVP 这俩是调试工具 不知道是不是基于CUPTI CUDA Profiler Tools Interface NVPROF是命令行工具 nvvp是可视化工具 nvvp
  • 12、适配器

    文章目录 package com example demo designpattern 又叫包装模式 Wrapper 各种 wrapper bridge 就是适配器模式 jbdc odbc bridge io 字节流字符流转换 角色 tar
  • STM32-ESP8266-12F与PC通信

    1 默认ESP8266的波特率是115200 2 指令及其返回值 3 使用PC的网络调试助手 协议类型选择TCP Server 端口号以80开头 表示TCP协议 如8080 8040等等 IP地址填PC的WI F网口的IP地址 配置完成后点
  • 解决浏览器设置代理IP无法上网的问题

    大家都知道 在当今信息时代 互联网已经成为了我们生活必不可少的一部分 而浏览器作为我们上网的窗口 更是被广泛使用 有时候 我们会遇到一些问题 例如设置了代理IP后无法正常上网 那么该如何解决这个问题呢 别担心 本文将为您一一解答 首先 让我
  • 易优cms:guestbookform 留言表单标签

    guestbookform 留言表单标签 基础用法 名称 guestbookform 功能 留言表单提交 语法 eyou guestbookform type default
  • 计算机组成中的阶符是什么意思,计算机中阶符,阶码,数符,尾数是什么?

    一般地 任一个二进制N 可表示为N 2j S 其中J为二进制数 叫阶码 J如果有正负号的话 正负号就叫阶符 S为纯小数 叫做尾数 数符 指的是N整个数的符号 二进制的 00101000 直接可以转换成16进制的 28 字节是电脑中的基本存储
  • 详解 Android 是如何启动的

    详解 Android 是如何启动的 2016 08 12 唐琪森 安卓开发 javascript void 0 来自 石头铺 微信号 Android Programmer 网站 www woaitqs cc 本文是 Android 系统学习
  • xilinx平台下DDR3映射为VFIFO

    FPGA开发中 数据采集 数据分析场景下需要用对高速ADC数据缓存 FPGA片内RAM无法做到大的容量 基于MIG IP做了个DDR3映射成FIFO的模块 以完成高速 量大的数据缓存应用 背景和选择 part1 官方也提供了类似功能的IP
  • makefile学习

    基本介绍 makefile编写的关键在于解决源文件的 文件依赖性 编译链接过程 源文件首先会生成中间目标文件 再由中间目标文件生成执行文件 在编译时 编译器只检测程序语法 和函数 变量是否被声明 如果函数未声明 编译器会给出一个警告 但可以
  • VS Code 打开时黑屏的恢复处理

    VS Code安装后一直黑屏的情况 一 兼容模式 Win10版本以下系统 右击VS Code打开属性窗口并在兼容性标签页内勾上以兼容模式运行这个程序 二 自动选择显卡 VS Code的渲染跟显卡设定有一定关系 打开NVIDIA控制面板 调整
  • shell脚本对硬盘进行分区——fdisk、blkid、mke2fs、mount、lsblk

    1 前言 本文介绍的是嵌入式设备烧录系统时 如何用shell脚本对硬盘进行分区 文章主要介绍的是制作烧录U盘的分区思路和关键的shell脚本语句 代码并不能直接拷贝使用 2 总体思路 1 用U盘进行系统的烧录 就是在U盘上制作一个可以运行的