Skip to content

LV260-存储介质管理命令

本文主要以 SD 为存储介质来学习这些命令。格式化 SD 卡是一种重要的维护操作,它可以清除存储介质上的所有数据,并为其创建一个新的文件系统。Linux 提供了多种命令来格式化 SD 卡 linux 格式化 sd 卡命令,下面将详细学习这些命令及其用法。

一、lsblk

1. 命令说明

lsblk 命令的英文是“list block”,即用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出 RAM 盘的信息。块设备有硬盘,闪存盘,CD-ROM 等等。lsblk 命令包含 util-linux 中。通过 yum provides lsblk 命令查看命令对应的软件包。

2. 使用格式

我们使用 man 命令看一下使用格式:

shell
NAME
       lsblk - list block devices

SYNOPSIS
       lsblk [options] [device...]

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

3. 常用选项

3.1 查看命令版本

shell
lsblk -V

3.2 列表所有块设备

shell
lsblk -a
image-20240404092555682

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

3.3 查看指定块设备信息

shell
lsblk /dev/sdc
image-20240404092805220

3.4 查看 scsi 信息

shell
lsblk -S
image-20240404092909356

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

shell
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 命令来查看一下帮助手册:

shell
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 常用选项

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

shell
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 手册:

shell
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 目录了,我们先可以通过下面的命令来卸载:

shell
sudo umount -v /dev/sdc1        # 通过设备名卸载
sudo umount -v ~/temp/sdc1      # 通过挂载点卸载

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

三、df/du 命令

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

1. df

1.1 命令说明

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

1.2 使用格式

我们还是来看 man 手册:

shell
NAME
       df - report file system disk space usage

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

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

shell
-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 选项来查看磁盘信息就够了:

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

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

shell
df -T
image-20240405093057666

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

2. du

2.1 命令说明

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

2.2 使用格式

看一下 man 手册吧:

shell
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.

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

shell
du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>][--max-depth=<目录层数>][--help][--version][目录或文件]

2.3 常用选项

  • 查看当前目录总共占的容量。而不单独列出各子项占用的容量
shell
du -sh
image-20240405093946640
  • 查看当前目录下一级子文件和子目录占用的磁盘容量。
shell
du -lh --max-depth=1
image-20240405094039709

四、mkfs

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

1. 命令说明

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

2. 使用格式

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

shell
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 手册是这样说的:

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

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

shell
mkfs.vfat # 创建 FAT32 文件系统
mkfs.ntfs # 创建 NTFS 文件系统
mkfs.ext4

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

shell
mkfs -t vfat # 创建 FAT32 文件系统
mkfs -t ntfs
mkfs -t ext4

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

2. 使用实例

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

image-20240405094307185

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

shell
sudo mkfs -t ext4 /dev/sdc1

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

image-20240405094718523

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

shell
sudo umount /dev/sdc1
image-20240405094817541

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

shell
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 手册,了解下它的使用格式:

shell
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 命令进入命令窗口:

shell
sudo fdisk /dev/sdx

其中 sdx 表示磁盘节点,我这里是 SD 卡,插上后节点为 sdc:

image-20240405120929894
shell
   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 查看分区情况

shell
hk@vm:~$ sudo fdisk -l

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

shell
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

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

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

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

5.2 进入分区管理命令窗口

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

5.3 删除分区

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

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

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

image-20240405205414484

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

shell
fdisk> w
image-20240405210138125

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

5.4 创建分区

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

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

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

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

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

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

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

shell
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

六、自动挂载分区

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

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

/etc/fstab 文件详解:

shell
#注释,/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. | 运算符

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

shell
ls -s|sort -nr
image-20240406080752832

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

2. dd 命令

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

shell
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 的标签功能:

shell
cat << tag
"1"
"2"
"3"
tag

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

image-20240406085255966

4. 脚本实现分区

shell
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