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
2
3
4
5
NAME
lsblk - list block devices

SYNOPSIS
lsblk [options] [device...]

可以看到这个命令主要是列出快设备信息,后面有一些参数,具体可以看man手册,后面只学习一些常用的选项。

3. 常用选项

3.1 查看命令版本

1
lsblk -V
image-20240404092433146

3.2 列表所有块设备

1
lsblk -a
image-20240404092555682

可以看到列出了当前系统的所有块设备,包括分区信息,由于我之前SD卡烧写过正点原子出厂的系统,所以带有两个分区。

3.3 查看指定块设备信息

1
lsblk /dev/sdc
image-20240404092805220

3.4 查看scsi信息

1
lsblk -S
image-20240404092909356

3.5 查看块设备的文件系统类型及UUID

1
lsblk -f
image-20240404093018327

二、mount/umount

我们要是想查看SD卡分区里面的内容怎么办?这时候我们需要用到mount和umount命令。

需要知道的是Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”。注意:“挂载点”的目录需要以下几个要求:

(1)目录事先存在,可以用mkdir命令新建目录;

(2)挂载点目录不可被其他进程使用到;

(3)挂载点下原有文件将被隐藏。

1. mount

1.1 命令说明

Linux的mount命令用于挂载Linux系统外的文件。这个命令允许用户将额外的子文件系统挂载到当前可访问文件系统的特定挂载点。命令将挂载指令传递给内核,由内核完成操作。这个命令允许我们访问和管理各种不同的文件系统和设备,包括硬盘驱动器、USB设备、网络文件系统(NFS)等。

1.2 使用格式

我们可以使用man命令来查看一下帮助手册:

1
2
3
4
5
6
7
8
9
10
11
12
NAME
mount - mount a filesystem

SYNOPSIS
mount [-l|-h|-V]

mount -a [-fFnrsvw] [-t fstype] [-O optlist]

mount [-fnrsvw] [-o options] device|dir

mount [-fnrsvw] [-t fstype] [-o options] device dir

可以看到还是有挺多格式和选项的,接下来通过实例来学习一些常用的选项。

1.3 常用选项

这里其实使用的选项不多,我们一般使用最基础的就可以了,我们可以使用如下的命令进行挂载

1
2
mkdir -p ~/temp/sd # 创建挂载点
sudo mount /dev/sdc1 ~/temp/sd

需要注意的是,这里我们需要加上sudo,另外由于SD卡被分分区了,所以我们直接挂载/dev/sdc的时候会提示设备繁忙:

image-20240404100834826

这样的话,我们直接挂载分区好了:

image-20240404100938591

可以看到挂载成功后,我们可以通过~/temp/sd目录来查看/dev/sdc1分区中的所有文件

2. unmount

2.1 命令说明

Linux umount(英文全拼:unmount)命令用于卸除文件系统。它可卸除目前挂在Linux目录中的文件系统。

2.2 使用格式

还是man手册:

1
2
3
4
5
6
7
8
9
NAME
umount - unmount file systems

SYNOPSIS
umount -a [-dflnrv] [-t fstype] [-O option...]

umount [-dflnrv] {directory|device}...

umount -h|-V

详细的选项及含义可以查看手册。

2.3 常用选项

这里其实我们也只是常用最基本的命令,上面我们已经把/dev/sdc1挂载到~/temp/sd目录了,我们先可以通过下面的命令来卸载:

1
2
sudo umount -v /dev/sdc1        # 通过设备名卸载
sudo umount -v ~/temp/sdc1 # 通过挂载点卸载
image-20240404101533576

需要注意的是这个命令需要加上sudo。

三、df/du命令

这里需要再了解两个命令,就是df 和 du 命令,它俩是Linux 查看磁盘空间使用的。

1. df

1.1 命令说明

df,disk free。该 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。也就是以磁盘分区为单位查看文件系统,可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息。需要注意的是,它只能看已经挂载的磁盘的信息,没挂载的要先挂载。

1.2 使用格式

我们还是来看man手册:

1
2
3
4
5
NAME
df - report file system disk space usage

SYNOPSIS
df [OPTION]... [FILE]...

它也有很多选项,但是一般都用不到,后面通过实例来学习一些常用选项。

点击查看选项说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-a或--all:包含全部的文件系统;
--block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable:以可读性较高的方式来显示信息;
-H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
-i或--inodes:显示inode的信息;
-k或--kilobytes:指定区块大小为1024字节;
-l或--local:仅显示本地端的文件系统;
-m或--megabytes:指定区块大小为1048576字节;
--no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
-P或--portability:使用POSIX的输出格式;
--sync:在取得磁盘使用信息前,先执行sync指令;
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type:显示文件系统的类型;
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help:显示帮助;
--version:显示版本信息。

1.3 常用选项

1.3.1 查看磁盘信息

一般我们使用-h选项来查看磁盘信息就够了:

1
df -h
image-20240405092811212
内容参数 含义
Filesystem 文件系统
Size 分区大小
1k-blocks 单位是1KB(使用df查看,不加选项)
Used 已用容量
Avail 还可用的容量
Use% 已用百分比
Mounted on 挂载点

1.3.2 查看文件系统

我们有时候想看一下磁盘文件系统是什么怎么办?就比如有时候想要看一下SD卡的文件系统,我们可以使用-T选项:

1
df -T
image-20240405093057666

这样就可以看到我们之前的SD卡上两个分区的文件系统格式分别为vfat和ext3.

2. du

2.1 命令说明

du命令用来查看目录或文件所占用磁盘空间的大小。

2.2 使用格式

看一下man手册吧:

1
2
3
4
5
6
7
8
9
NAME
du - estimate file space usage

SYNOPSIS
du [OPTION]... [FILE]...
du [OPTION]... --files0-from=F

DESCRIPTION
Summarize disk usage of the set of FILEs, recursively for directories.

看这个可能更清晰一点吧:

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
image-20240405093946640
  • 查看当前目录下一级子文件和子目录占用的磁盘容量。
1
du -lh --max-depth=1
image-20240405094039709

四、mkfs

前面我们已经学习了如何查看SD卡、如何挂载和卸载SD卡。在windows下,我们识别到sd卡后,直接右键然后格式化就可以,那么linux下怎么办?这个时候就要用到mkfs命令啦。

1. 命令说明

mkfs,英文全称是 “make file system”,该命令主要用于在特定的分区上创建Linux文件系统。此命令初始化卷标签、文件系统标签和启动块。 简单来说,mkfs 是用来格式化分区,创建文件系统的。

2. 使用格式

我们可以使用man命令来查看一下帮助手册:

1
2
3
4
5
6
7
8
9
NAME
mkfs - build a Linux filesystem

SYNOPSIS
mkfs [options] [-t type] [fs-options] device [size]

DESCRIPTION
This mkfs frontend is deprecated in favour of filesystem specific
mkfs.<type> utils.

具体的选项含义还是可以看man手册,说的都比较详细。这里有一个参数 -t ,这个参数man手册是这样说的:

1
2
3
-t, --type type
Specify the type of filesystem to be built. If not specified,
the default filesystem type (currently ext2) is used.

翻译一下就是指定要构建的文件系统类型。如果未指定,则使用默认的文件系统类型(目前为ext2)。我们在平时使用的时候会遇到这样的命令:

1
2
3
mkfs.vfat # 创建FAT32文件系统
mkfs.ntfs # 创建NTFS文件系统
mkfs.ext4

这些其实与下面这样写是一样的:

1
2
3
mkfs -t vfat # 创建FAT32文件系统
mkfs -t ntfs
mkfs -t ext4

【注意】这个命令使用的时候需要root权限。

2. 使用实例

我们前面使用的SD卡有两个分区,一个是sdc1一个是sdc2,它们的文件格式分别为:

image-20240405094307185

接下来我们将sdc1分区格式化为ext4:

1
sudo mkfs -t ext4 /dev/sdc1

需要注意的是,如果该设备已经有一个文件系统了,mkfs 命令会给出错误消息(我看实际操作是给出了询问)。在此种情况下,如果确定要在设备上创建新的文件系统,可以添加 -F 选项来强制执行操作,或者是在交互界面选择y。但是可能还会有一个问题,就是如果这个分区被挂载到系统中,就会格式化失败:

image-20240405094718523

所以我们要先卸载挂载点,然后再执行对应的命令:

1
sudo umount /dev/sdc1
image-20240405094817541

然后我们先挂载,再使用df命令来看一下现在的文件系统情况:

1
2
3
mkdir -p ~/temp/sd_temp
sudo mount /dev/sdc1 ~/temp/sd_temp
df -T
image-20240405095140806

可以看到已经被格式化为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
2
3
4
5
6
7
NAME
fdisk - manipulate disk partition table

SYNOPSIS
fdisk [options] device

fdisk -l [device...]

它有很多选项,我们后边通过实例来学习。

点击查看选项说明
参数/选项(缩写)参数/选项(完整意思)使用说明/解释
-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:

image-20240405120929894
点击查看命令说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
a   toggle a bootable flag                                   # 切换可启动标志
b edit bsd disklabel                   # 编辑磁盘标记
c toggle the dos compatibility flag               # 切换dos兼容标志

d delete a partition                        # 删除一个分区
F list free unpartitioned space
l list known partition types                   # 列出已知的分区类型                  
n add a new partition # 添加一个分区
p print the partition table # 打印分区表
t change a partition's system id # 改变一个分区的类型
v verify the partition table # 验证分区表
i print information about a partition

m print this menu                          # 打印菜单
u change display/entry units # 改变显示的单位
x extra functionality (experts only) # 高级功能

w write table to disk and exit # 写分区表并退出
q quit without saving changes # 退出不保存

g create a new empty GPT partition table    # 创建一个空的GPT分区表
G create an IRIX (SGI) partition table    # 创建一个IRIX分区表
o create a new empty DOS partition table # 创建一个空的DOS分区表
s create a new empty Sun disklabel # 创建一个空的sun磁盘标签

5. 使用实例

说明:这一部分的终端标号说明如下:

hk@vm:~$ 表示在shell终端敲的命令

fdisk>表示在fdisk命令窗口里面敲的命令,实际是没有这个的吗,这里只是为了便于区分。

5.1 查看分区情况

1
hk@vm:~$ sudo fdisk -l

然后会看到以下打印信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
hk@vm:~$ sudo fdisk -l
Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 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
Disklabel type: dos
Disk identifier: 0x04609dd1

设备 启动 Start 末尾 扇区 Size Id 类型
/dev/sda1 * 2048 60913663 60911616 29G 83 Linux
/dev/sda2 60915710 62912511 1996802 975M 5 扩展
/dev/sda5 60915712 62912511 1996800 975M 82 Linux 交换 / Solaris




Disk /dev/sdc: 3.7 GiB, 3965190144 bytes, 7744512 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
Disklabel type: dos
Disk identifier: 0x66527a5d

设备 启动 Start 末尾 扇区 Size Id 类型
/dev/sdc1 * 2048 133119 131072 64M c W95 FAT32 (LBA)
/dev/sdc2 133120 7744511 7611392 3.6G 83 Linux

想要单独看某一个磁盘呢?我们可直接用下面的命令:

1
hk@vm:~$ sudo fdisk -l /dev/sdc
image-20240405121943455

Disk label type: dos 这行信息说明该分区是MBR分区,如果显示Disk label type: gpt则说明该分区是GPT分区。

5.2 进入分区管理命令窗口

1
hk@vm:~$ sudo fdisk /dev/sdc
image-20240405122257021
  • 查看当前分区表
1
fdisk> p
image-20240405122355648

5.3 删除分区

我们之前测试的时候SD卡有两个分区,我们将这两个分区删除,方便后面学习对应命令:

1
fdisk> d # 如果有多个就多次输入d

由于之前有两个分区,所以操作是这样的:

image-20240405205414484

这样就删除了两个分区了。但是这个时候我们再开一个终端,会发现sdc1和sdc2都还在,也就是说我们虽然删除了分区,但是实际是没有生效的,如何生效?我们需要再使用w命令:

1
fdisk> w
image-20240405210138125

这就是由于我们之前挂载了sd卡两个分区的原因,所以我们要先试用umount来卸载这两个分区。然后再使用w命令即可。

5.4 创建分区

接下来我们来重建两个分区。

  • 我们用命令 fdisk /dev/sda 进入分区操作,输入 p ,查看当前分区表,此时没有分区
1
2
hk@vm:~$ sudo fdisk /dev/sdc
fdisk> p
image-20240405211035347
  • 创建分区
1
2
3
fdisk> n # 新建一个分区
fdisk> p # 选择分区类型为主分区(如果想添加扩展分区,就按e)
fdisk> 1 # 然后输入 1 ,选择分区号(这里注意一下,加上扩展分区,主分区只能有四个,所以只能选择1-4,一般按顺序输入分区号)
image-20240405211224551
  • 确定分区信息
1
2
3
(1)然后会提示输入第一个扇区,这里直接回车默认2048就好
(2)接着会让输入第一个分区的大小,这里是加了200M,输入+200M(不要忘记+号);
(3)网上的教程说分区大小选择好后,会包含一个签名,询问是否要移除该签名,如果不移除的话,此时的分区格式就是ntfs,这里我们需要ntfs格式的分区,所以不移除,输入 N。(但是我用的似乎没有这个,直接就分好了)
image-20240405212156931
  • 查看分区
1
fdisk> p
image-20240405212331815

可以看到一个sdc1已经生成啦,而且是200MB的。

  • 保存退出
1
2
fdisk> w
fdisk> q
image-20240405213053593

好像也不用输入q,然后我们看一下是不是有sdc1分区啦:

1
hk@vm:~$ sudo fdisk -l /dev/sdc
image-20240405213246965
  • 格式化分区

我们已经创建好了分区,接下来就可以使用上面的mkfs命令来对分区进行格式化:

1
2
3
4
hk@vm:~$ sudo mkfs.ext4 /dev/sdc1
hk@vm:~$ sudo mkdir -p ~/temp/sd_temp
hk@vm:~$ sudo mount /dev/sdc1 ~/temp/sd_temp
hk@vm:~$ sudo df -hT
image-20240405213743850

六、自动挂载分区

前面我们已经知道了如何查看分区,删除分区、新建分区,那么分区重建后可能是不会自动挂载的,我们可以使用以下命令来实现自动挂载:

1
echo "/dev/sdb1  /sdc1 ext4 defaults 0 0 " >> /etc/fstab

/etc/fstab文件详解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#注释,/etc/fstab文件详解
#示例为: /dev/sda3 /home ext4 defaults,noatime 0 2

/etc/fstab文件主要包括6段,依次是:
<file system>  <dir>  <type>  <options>  <dump>  <pass>
<file system> 要挂载的分区或存储设备
<dir> 挂载的目录位置
<type> 挂载分区的文件系统类型,比如:ext3、ext4、xfs、swap
<options> 挂载使用的参数有哪些。举例如下:
auto - 在启动时或键入了 mount -a 命令时自动挂载。
noauto - 只在你的命令下被挂载。
exec - 允许执行此分区的二进制文件。
noexec - 不允许执行此文件系统上的二进制文件。
ro - 以只读模式挂载文件系统。
rw - 以读写模式挂载文件系统。
user - 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexec, nosuid, nodev 参数。
users - 允许所有 users 组中的用户挂载文件系统.
nouser - 只能被 root 挂载。
owner - 允许设备所有者挂载.
sync - I/O 同步进行。
async - I/O 异步进行。
dev - 解析文件系统上的块特殊设备。
nodev - 不解析文件系统上的块特殊设备。
suid - 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。
nosuid - 禁止 suid 操作和设定 sgid 位。
noatime - 不更新文件系统上 inode 访问记录,可以提升性能。
nodiratime - 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。
relatime - 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能。
flush - vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。
defaults - 使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rw, suid, dev, exec, auto, nouser, async.

<dump> dump 工具通过它决定何时作备份. dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份。 允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份。大部分的用户是没有安装 dump 的 ,对他们而言 <dump> 应设为 0。

<pass> fsck 读取 <pass> 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。

七、写一个脚本实现分区?

前面我们已经知道怎么使用fdisk对sd卡进行分区了,那些命令和操作步骤属实繁琐了些,那是不是可以通过shell脚本来实现sd卡分区?

1. | 运算符

首先我们回顾一下管道运算符——|,它的作用是将前面命令的输出作为后面命令的输入,例如:

1
ls -s|sort -nr
image-20240406080752832

-s 是file size,-n是numeric-sort,-r是reverse,反转。该命令列出当前目录中的文档(含size),并把输出送给sort命令作为输入,sort命令按数字递减的顺序把ls的输出排序。

2. dd命令

这里还是回顾一下吧,感觉知道之前sd卡分区情况和大小的时候使用dd命令来清空sd卡还是很快的。

1
2
dd if=/dev/zero of=/dev/sdc                 # 完全清除SD卡,使SD卡上所有数据都是0
dd if=/dev/zero of=/dev/sdc bs=256k count=1 # 使SD卡前256k数据都被清除为数据0

3. shell标签

前面我们学习重定向的时候有了解过shell的标签功能:

1
2
3
4
5
cat << tag
"1"
"2"
"3"
tag

上面的脚本就是将开始标记 tag 和结束标记 tag 之间的内容作为输入,执行结果如下:

image-20240406085255966

4. 脚本实现分区

点击自动分区脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/bin/sh
# * =====================================================
# * Copyright © hk. 2022-2025. All rights reserved.
# * File name : sd_fdisk.sh
# * Author : 苏木
# * Date : 2024-04-06
# * ======================================================
##

device=/dev/sdd

#execute执行语句成功与否打印
execute ()
{
$* >/dev/null
if [ $? -ne 0 ]; then
echo
echo "错误: 执行 $*"
echo
exit 1
fi
}

#判断选择的块设备是否存在及是否是一个块设备
if [ ! -b ${device} ]; then
echo "错误: ${device} 不是一个块设备文件"
exit 1
fi
#这里防止选错设备,否则会影响Ubuntu系统的启动
if [ ${device} = '/dev/sda' ];then
echo "请不要选择sda设备,/dev/sda通常是您的Ubuntu硬盘!继续操作你的系统将会受到影响!脚本已自动退出"
exit 1
fi

echo "即将进行对SD卡进行格式化和分区相关操作!"
echo "************************************************************"
echo "* 注意:这将会清除${device}所有的数据 *"
echo "* 在脚本执行时请不要将${device}拔出 *"
echo "* 请按<Enter>确认继续 *"
echo "************************************************************"
read enter

#格式化前要卸载,需要注意的是如果之前没有分区,这里可能会报个错,说找不到文件之类的,就不用管
for i in `ls -1 ${device}?`; do
echo "卸载 device '$i'"
umount ${i} 2>/dev/null
done

#执行格式化
execute "dd if=/dev/zero of=${device} bs=1024 count=1024"

#第一个分区为64M用来存放设备树与内核镜像文件,因为设备树与内核都比较小,不需要太大的空间
#第二个分区为SD卡的总大小-64M,用来存放文件系统
#通过shell的标签传递参数,注意这里的空行都是enter按键,不可删除
cat << END | fdisk -H 255 -S 63 $device
n
p
1

+64M
n
p
2


t
1
c
a
1
w
END
#通过echo命令完成fdisk的命令窗口分区操作
#echo "n
#p
#1
#
#+64M
#n
#p
#2
#
#
#t
#1
#c
#a
#1
#w
#" | fdisk -H 255 -S 63 ${device}

#两个分区处理
PARTITION1=${device}1
if [ ! -b ${PARTITION1} ]; then
PARTITION1=${device}1
fi

PARTITION2=${device}2
if [ ! -b ${PARTITION2} ]; then
PARTITION2=${device}2
fi

#第一个分区创建为Fat32格式
echo "格式化 ${device}1 ..."
if [ -b ${PARTITION1} ]; then
mkfs.vfat -F 32 -n "boot" ${PARTITION1}
else
echo "错误: /dev下找不到 SD卡 boot分区"
fi
#第二个分区创建为ext3格式
echo "格式化${device}2 ..."
if [ -b ${PARITION2} ]; then
mkfs.ext3 -F -L "rootfs" ${PARTITION2}
else
echo "错误: /dev下找不到 SD卡 rootfs分区"
fi