LV02-02-shell-09-存储介质管理命令
本文主要是shell——对SD卡等存储介质进行格式化、分区、挂载等相关命令学习的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
参考方向 | 参考原文 |
--- | --- |
本文主要以SD为存储介质来学习这些命令。格式化SD卡是一种重要的维护操作,它可以清除存储介质上的所有数据,并为其创建一个新的文件系统。Linux提供了多种命令来格式化SD卡linux格式化sd卡命令,下面将详细学习这些命令及其用法。
一、lsblk
1. 命令说明
lsblk命令的英文是“list block”,即用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,CD-ROM等等。lsblk命令包含util-linux中。通过yum provides lsblk命令查看命令对应的软件包。
2. 使用格式
我们使用man命令看一下使用格式:
1 | NAME |
可以看到这个命令主要是列出快设备信息,后面有一些参数,具体可以看man手册,后面只学习一些常用的选项。
3. 常用选项
3.1 查看命令版本
1 | lsblk -V |
3.2 列表所有块设备
1 | lsblk -a |
可以看到列出了当前系统的所有块设备,包括分区信息,由于我之前SD卡烧写过正点原子出厂的系统,所以带有两个分区。
3.3 查看指定块设备信息
1 | lsblk /dev/sdc |
3.4 查看scsi信息
1 | lsblk -S |
3.5 查看块设备的文件系统类型及UUID
1 | lsblk -f |
二、mount/umount
我们要是想查看SD卡分区里面的内容怎么办?这时候我们需要用到mount和umount命令。
需要知道的是Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”。注意:“挂载点”的目录需要以下几个要求:
(1)目录事先存在,可以用mkdir命令新建目录;
(2)挂载点目录不可被其他进程使用到;
(3)挂载点下原有文件将被隐藏。
1. mount
1.1 命令说明
Linux的mount命令用于挂载Linux系统外的文件。这个命令允许用户将额外的子文件系统挂载到当前可访问文件系统的特定挂载点。命令将挂载指令传递给内核,由内核完成操作。这个命令允许我们访问和管理各种不同的文件系统和设备,包括硬盘驱动器、USB设备、网络文件系统(NFS)等。
1.2 使用格式
我们可以使用man命令来查看一下帮助手册:
1 | NAME |
可以看到还是有挺多格式和选项的,接下来通过实例来学习一些常用的选项。
1.3 常用选项
这里其实使用的选项不多,我们一般使用最基础的就可以了,我们可以使用如下的命令进行挂载
1 | mkdir -p ~/temp/sd # 创建挂载点 |
需要注意的是,这里我们需要加上sudo,另外由于SD卡被分分区了,所以我们直接挂载/dev/sdc的时候会提示设备繁忙:
这样的话,我们直接挂载分区好了:
可以看到挂载成功后,我们可以通过~/temp/sd目录来查看/dev/sdc1分区中的所有文件
2. unmount
2.1 命令说明
Linux umount(英文全拼:unmount)命令用于卸除文件系统。它可卸除目前挂在Linux目录中的文件系统。
2.2 使用格式
还是man手册:
1 | NAME |
详细的选项及含义可以查看手册。
2.3 常用选项
这里其实我们也只是常用最基本的命令,上面我们已经把/dev/sdc1挂载到~/temp/sd目录了,我们先可以通过下面的命令来卸载:
1 | sudo umount -v /dev/sdc1 # 通过设备名卸载 |
需要注意的是这个命令需要加上sudo。
三、df/du命令
这里需要再了解两个命令,就是df 和 du 命令,它俩是Linux 查看磁盘空间使用的。
1. df
1.1 命令说明
df
,disk free。该 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。也就是以磁盘分区为单位查看文件系统,可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息。需要注意的是,它只能看已经挂载的磁盘的信息,没挂载的要先挂载。
1.2 使用格式
我们还是来看man手册:
1 | NAME |
它也有很多选项,但是一般都用不到,后面通过实例来学习一些常用选项。
点击查看选项说明
1 | -a或--all:包含全部的文件系统; |
1.3 常用选项
1.3.1 查看磁盘信息
一般我们使用-h选项来查看磁盘信息就够了:
1 | df -h |
内容参数 | 含义 |
---|---|
Filesystem |
文件系统 |
Size |
分区大小 |
1k-blocks |
单位是1KB(使用df 查看,不加选项) |
Used |
已用容量 |
Avail |
还可用的容量 |
Use% |
已用百分比 |
Mounted on |
挂载点 |
1.3.2 查看文件系统
我们有时候想看一下磁盘文件系统是什么怎么办?就比如有时候想要看一下SD卡的文件系统,我们可以使用-T选项:
1 | df -T |
这样就可以看到我们之前的SD卡上两个分区的文件系统格式分别为vfat和ext3.
2. du
2.1 命令说明
du命令用来查看目录或文件所占用磁盘空间的大小。
2.2 使用格式
看一下man手册吧:
1 | NAME |
看这个可能更清晰一点吧:
1 | du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>][--max-depth=<目录层数>][--help][--version][目录或文件] |
点击查看参数说明
参数说明:
- -a或-all 显示目录中个别文件的大小。
- -b或-bytes 显示目录或文件大小时,以byte为单位。
- -c或–total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
- -D或–dereference-args 显示指定符号连接的源文件大小。
- -h或–human-readable 以K,M,G为单位,提高信息的可读性。
- -H或–si 与-h参数相同,但是K,M,G是以1000为换算单位。
- -k或–kilobytes 以1024 bytes为单位。
- -l或–count-links 重复计算硬件连接的文件。
- -L<符号连接>或–dereference<符号连接> 显示选项中所指定符号连接的源文件大小。
- -m或–megabytes 以1MB为单位。
- -s或–summarize 仅显示指定目录或文件的总大小,而不显示其子目录的大小。
- -S或–separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
- -x或–one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
- -X<文件>或–exclude-from=<文件> 在<文件>指定目录或文件。
- –exclude=<目录或文件> 略过指定的目录或文件。
- –max-depth=<目录层数> 超过指定层数的目录后,予以忽略。
- –help 显示帮助。
- –version 显示版本信息。
2.3 常用选项
- 查看当前目录总共占的容量。而不单独列出各子项占用的容量
1 | du -sh |
- 查看当前目录下一级子文件和子目录占用的磁盘容量。
1 | du -lh --max-depth=1 |
四、mkfs
前面我们已经学习了如何查看SD卡、如何挂载和卸载SD卡。在windows下,我们识别到sd卡后,直接右键然后格式化就可以,那么linux下怎么办?这个时候就要用到mkfs命令啦。
1. 命令说明
mkfs,英文全称是 “make file system”,该命令主要用于在特定的分区上创建Linux文件系统。此命令初始化卷标签、文件系统标签和启动块。 简单来说,mkfs
是用来格式化分区,创建文件系统的。
2. 使用格式
我们可以使用man命令来查看一下帮助手册:
1 | NAME |
具体的选项含义还是可以看man手册,说的都比较详细。这里有一个参数 -t ,这个参数man手册是这样说的:
1 | -t, --type type |
翻译一下就是指定要构建的文件系统类型。如果未指定,则使用默认的文件系统类型(目前为ext2)。我们在平时使用的时候会遇到这样的命令:
1 | mkfs.vfat # 创建FAT32文件系统 |
这些其实与下面这样写是一样的:
1 | mkfs -t vfat # 创建FAT32文件系统 |
【注意】这个命令使用的时候需要root权限。
2. 使用实例
我们前面使用的SD卡有两个分区,一个是sdc1一个是sdc2,它们的文件格式分别为:
接下来我们将sdc1分区格式化为ext4:
1 | sudo mkfs -t ext4 /dev/sdc1 |
需要注意的是,如果该设备已经有一个文件系统了,mkfs
命令会给出错误消息(我看实际操作是给出了询问)。在此种情况下,如果确定要在设备上创建新的文件系统,可以添加 -F
选项来强制执行操作,或者是在交互界面选择y。但是可能还会有一个问题,就是如果这个分区被挂载到系统中,就会格式化失败:
所以我们要先卸载挂载点,然后再执行对应的命令:
1 | sudo umount /dev/sdc1 |
然后我们先挂载,再使用df命令来看一下现在的文件系统情况:
1 | mkdir -p ~/temp/sd_temp |
可以看到已经被格式化为ext4格式了,这个时候这个分区的文件已经被全部清空,所以格式化前一定要注意备份重要文件。
五、fdisk
我们再来学习一个命令,就是fdisk命令,这个命令很强大,上面我们知道了如何挂载、卸载、查看、格式化SD卡,但是如何对sd卡进行分区?这个时候就要用到它啦。
1. 命令说明
Linux fdisk 是一个创建和维护分区表的程序,它兼容 DOS 类型的分区表、BSD 或者 SUN 类型的磁盘列表。
2. 磁盘分区结构
先来了解点命令之外的东西——磁盘分区结构。磁盘的分区结构有两种,一种是MBR分区,一种是GPT分区。
- MBR(Master Boot Record)
是传统的分区机制,应用于绝大多数使用BIOS引导的PC设备(苹果使用EFI的方式),很多Server服务器即支持BIOS也支持EFI的引导方式;MBR支持32bit和64bit系统;MBR分区分为主分区(一块硬盘最多只能创建4个主分区)、扩展分区(一个扩展分区会占用一个主分区的位置)、逻辑分区(逻辑分区是基于扩展分区创建出来的,先有扩展分区,然后在扩展分区的基础上再创建逻辑分区;也就是说我们要使用逻辑分区,必须先要创建扩展分区,扩展分区的空间是不能被直接使用的,我们必须在扩展分区的基础上去建立逻辑分区,才能够被使用)。在Linux上使用扩展分区和逻辑分区最多可以创建15个分区;MBR只支持不超过2TB的硬盘。
- GPT(GUID Partition Table)
是一个较新的分区机制,解决了MBR的很多缺点;持超过2TB的磁盘;向后兼容MBR;使用GPT分区的前提是底层硬件必须支持UEFI(Intel提出的取代BIOS的新一代的引导系统)才能使用,也就是底层硬件必须使用UEFI;GPT分区只支持64位操作系统;GPT分区列表支持最大128PB (1PB = 1024TB),可以定义128个分区,没有主分区,扩展分区和逻辑分区的概念,所有分区都能格式化。
3. 使用格式
对于fdisk命令,功能还是很强大的,有很多的参数选项,我们看一下man手册,了解下它的使用格式:
1 | NAME |
它有很多选项,我们后边通过实例来学习。
点击查看选项说明
参数/选项(缩写) | 参数/选项(完整意思) | 使用说明/解释 |
-b | --扇区大小扇区大小 | 指定磁盘的扇区大小。有效值为512、1024、2048和4096。(最近的内核知道扇区大小。只在旧内核上使用此选项,或者覆盖内核的想法。)由于util-linux-2.17,fdisk区分逻辑和物理扇区大小。此选项将两个扇区大小都更改为扇区大小。 |
-B | --保护启动 | 创建新磁盘标签时,不要擦除第一个磁盘扇区的开头。GPT和MBR支持此功能。 |
-c | --兼容性[=模式] | 指定兼容模式“dos”或“nondos”。默认为非DOS模式。为了向后兼容,可以使用不带模式参数的选项,然后使用默认值。请注意,可选模式参数不能与-c选项用空格分隔,正确的形式是例如“-c=dos”。 |
-h | --帮助 | 显示帮助文本并退出。 |
-L | --color[=何时] | 将输出着色。可选参数when可以是auto、never或always。如果省略了when参数,则默认为auto。可以禁用颜色;有关当前内置默认值,请参阅--help输出。另请参见颜色部分。 |
-l | --列表 | 列出指定设备的分区表,然后退出。如果没有给出任何设备,则使用/proc/partitions中提到的设备(如果该文件存在)。 |
-o | --输出列表 | 指定要打印的输出列。使用--help获取所有支持列的列表。如果列表的格式为+列表(例如-o+UUID),则可以扩展默认列列表。 |
-s | --获取 | 打印每个给定块设备的512字节扇区的大小。此选项已弃用,以支持blockdev(1)。 |
-t | --类型类型 | 仅对指定类型的磁盘标签启用支持,并禁用对所有其他类型的支持。 |
-u | --单位[=单位] | 列出分区表时,以“扇区”或“柱面”显示大小。默认情况是以扇区显示大小。为了向后兼容,可以使用不带单位参数的选项,然后使用默认值。请注意,可选的单位参数不能与-u选项用空格分隔,正确的形式是例如“-u=cylinders”。 |
-C | --气缸数量 | 指定磁盘的气缸数。我不知道为什么会有人想这么做。 |
-H | --头数 | 指定磁盘的磁头数。(当然不是物理数字,而是用于分区表的数字。)合理的值是255和16。 |
-S | --扇区编号 | 指定磁盘每个磁道的扇区数。(当然不是物理数字,而是用于分区表的数字。)合理的值是63 |
-w | --擦拭时 | 从设备中擦除文件系统、RAID和分区表签名,以避免可能的冲突。参数when可以是auto、never或always。如果未给定此选项,则默认为“自动”,在这种情况下,只有在交互模式下才会擦除签名。在所有情况下,在创建新分区表之前,检测到的签名都会通过警告消息进行报告。另请参见wipefs(8)命令。 |
-W | --擦除分区时 | 从新创建的分区中擦除文件系统、RAID和分区表签名,以避免可能的冲突。参数when可以是auto、never或always。如果未给定此选项,则默认为“自动”,在这种情况下,只有在交互模式下以及用户确认后,才会擦除签名。在所有情况下,在创建新分区之前,检测到的签名都会通过警告消息进行报告。另请参见wipefs(8)命令。 |
-V | --版本 | 显示版本信息并退出。 |
4. fdisk命令窗口
这个命令是有自己的命令窗口的,我们使用fdisk命令进入命令窗口:
1 | sudo fdisk /dev/sdx |
其中sdx表示磁盘节点,我这里是SD卡,插上后节点为sdc:
点击查看命令说明
1 | a toggle a bootable flag # 切换可启动标志 |
5. 使用实例
说明:这一部分的终端标号说明如下:
hk@vm:~$
表示在shell终端敲的命令
fdisk>
表示在fdisk命令窗口里面敲的命令,实际是没有这个的吗,这里只是为了便于区分。
5.1 查看分区情况
1 | hk@vm:~$ sudo fdisk -l |
然后会看到以下打印信息:
1 | hk@vm:~$ sudo fdisk -l |
想要单独看某一个磁盘呢?我们可直接用下面的命令:
1 | hk@vm:~$ sudo fdisk -l /dev/sdc |
Disk label type: dos 这行信息说明该分区是MBR分区,如果显示Disk label type: gpt则说明该分区是GPT分区。
5.2 进入分区管理命令窗口
1 | hk@vm:~$ sudo fdisk /dev/sdc |
- 查看当前分区表
1 | p |
5.3 删除分区
我们之前测试的时候SD卡有两个分区,我们将这两个分区删除,方便后面学习对应命令:
1 | d # 如果有多个就多次输入d |
由于之前有两个分区,所以操作是这样的:
这样就删除了两个分区了。但是这个时候我们再开一个终端,会发现sdc1和sdc2都还在,也就是说我们虽然删除了分区,但是实际是没有生效的,如何生效?我们需要再使用w命令:
1 | w |
这就是由于我们之前挂载了sd卡两个分区的原因,所以我们要先试用umount来卸载这两个分区。然后再使用w命令即可。
5.4 创建分区
接下来我们来重建两个分区。
- 我们用命令 fdisk /dev/sda 进入分区操作,输入 p ,查看当前分区表,此时没有分区
1 | hk@vm:~$ sudo fdisk /dev/sdc |
- 创建分区
1 | n # 新建一个分区 |
- 确定分区信息
1 | (1)然后会提示输入第一个扇区,这里直接回车默认2048就好 |
- 查看分区
1 | p |
可以看到一个sdc1已经生成啦,而且是200MB的。
- 保存退出
1 | w |
好像也不用输入q,然后我们看一下是不是有sdc1分区啦:
1 | hk@vm:~$ sudo fdisk -l /dev/sdc |
- 格式化分区
我们已经创建好了分区,接下来就可以使用上面的mkfs命令来对分区进行格式化:
1 | hk@vm:~$ sudo mkfs.ext4 /dev/sdc1 |
六、自动挂载分区
前面我们已经知道了如何查看分区,删除分区、新建分区,那么分区重建后可能是不会自动挂载的,我们可以使用以下命令来实现自动挂载:
1 | echo "/dev/sdb1 /sdc1 ext4 defaults 0 0 " >> /etc/fstab |
/etc/fstab文件详解:
1 | 注释,/etc/fstab文件详解 |
七、写一个脚本实现分区?
前面我们已经知道怎么使用fdisk对sd卡进行分区了,那些命令和操作步骤属实繁琐了些,那是不是可以通过shell脚本来实现sd卡分区?
1. | 运算符
首先我们回顾一下管道运算符——|
,它的作用是将前面命令的输出作为后面命令的输入,例如:
1 | ls -s|sort -nr |
-s 是file size,-n是numeric-sort,-r是reverse,反转。该命令列出当前目录中的文档(含size),并把输出送给sort命令作为输入,sort命令按数字递减的顺序把ls的输出排序。
2. dd命令
这里还是回顾一下吧,感觉知道之前sd卡分区情况和大小的时候使用dd命令来清空sd卡还是很快的。
1 | dd if=/dev/zero of=/dev/sdc # 完全清除SD卡,使SD卡上所有数据都是0 |
3. shell标签
前面我们学习重定向的时候有了解过shell的标签功能:
1 | cat << tag |
上面的脚本就是将开始标记 tag 和结束标记 tag 之间的内容作为输入,执行结果如下:
4. 脚本实现分区
点击自动分区脚本
1 | !/bin/sh |