磁盘(Disk)是一种用于存储和读取数据的物理设备,它由一个或多个旋转的磁性盘片组成。这些盘片通常由金属或玻璃制成,并涂有磁性材料。磁盘是计算机系统中主要的永久性存储介质之一。
磁盘的工作机制是基于磁性材料的磁化和磁场感应原理。下面是磁盘的工作机制的基本过程:
磁化:磁盘上的磁性材料可以被磁化,即通过施加磁场来使得材料的磁性定向发生变化。这种磁化可以通过电磁磁铁或磁头产生的磁场来实现。
磁场感应:磁头是磁盘上的感应器,它可以感受到磁场的变化并将其转换为电信号。当磁头靠近磁盘表面时,它可以检测到磁性材料的磁化状态。
数据读取:在读取数据时,磁头通过感应磁场的变化来检测磁盘上的数据。当磁头经过磁化的区域时,感应到的磁场变化会转换为电信号,并由磁盘控制器解读为相应的数据。
数据写入:在写入数据时,磁头会通过施加磁场来改变磁盘上的磁化状态。磁头会根据要写入的数据,在磁盘上相应的位置创建或改变磁化模式,从而将数据存储在磁性材料中。
寻道和旋转:为了访问特定的磁道和扇区,磁头需要在磁盘表面上移动到目标位置,这个过程称为寻道操作。磁头的移动由磁盘驱动器控制,它们可以在磁盘半径方向上移动。另外,磁盘通过旋转盘片来实现高速读写操作,旋转速度通常以每分钟转数(RPM)来表示。
通过控制磁场和磁头的移动,磁盘实现了数据的存储和检索。这种机制具有较大的存储容量、较低的成本以及相对较快的读写速度,使得磁盘成为计算机系统中主要的永久性存储介质之一。
3.1盘片 片面 和 磁头
盘片(Platter):盘片是硬盘驱动器内部的圆形磁性盘,通常由金属或玻璃材料制成。硬盘驱动器可以包含一个或多个盘片,它们堆叠在一起并通过中央轴固定。每个盘片都具有两个平整的表面,称为片面。
片面(Platter Surface):片面是盘片上的一个平整表面,用于存储数据。一个盘片通常具有两个片面,也就是两个可用于读写数据的表面。每个片面都被划分为一系列同心圆形的磁道,每个磁道又被划分为多个扇区。
磁头(Head):磁头是位于盘片上方的装置,用于读取和写入数据。在硬盘驱动器中,磁头位于移动的磁臂上,并可以沿着盘片的半径方向移动。每个片面上都有一个磁头与磁盘进行数据交互。因此,如果硬盘驱动器有多个盘片,每个片面上都会有一个磁头。
3.2扇区 和 磁道
扇区(Sector):扇区是磁盘上最小的存储单位。它是磁道上的一个小片段,通常的大小为512字节或4KB。每个磁盘扇区都有一个唯一的地址,通过这个地址可以定位和访问特定的数据。操作系统和文件系统将数据组织成扇区,然后使用扇区地址来读取或写入数据。
磁道(Track):磁道是磁盘表面上的一个圆环,沿着盘片的半径方向延伸。一个磁盘上通常有多个磁道,它们被编号以便标识和访问特定的磁道。每个磁道可以包含多个扇区,形成一个数据环。磁盘的磁头可以在磁盘表面上移动到指定的磁道上,然后读取或写入磁道上的扇区数据。
3.3磁头 和 柱面
磁头(Head):磁头是位于硬盘驱动器内部的装置,用于读取和写入数据。在硬盘驱动器中,磁头位于移动的磁臂上,并可以沿着盘片的半径方向移动。每个片面上都有一个磁头与磁盘进行数据交互。磁头负责在特定的磁道上读取或写入数据。通过控制磁头的移动和定位,可以将磁头定位到目标磁道上的特定位置,以进行数据的读写操作。
柱面(Cylinder):柱面是硬盘驱动器内部的一个概念,表示位于多个盘片上的相同半径位置的磁道的集合。换句话说,柱面由位于相同半径位置的多个盘片上的磁道垂直堆叠而成。柱面号用于表示磁盘上具有相同半径位置的磁道组合。通过将磁头移动到特定柱面,可以访问该柱面上的所有磁道。
根据接口类型,磁盘可以分为多种类型,以下是一些常见的磁盘接口分类:
SATA(Serial ATA)磁盘:SATA是目前最为常见的磁盘接口类型,广泛用于台式机和笔记本电脑。它提供了较高的数据传输速度和较低的成本,支持热插拔和热交换。
SAS(Serial Attached SCSI)磁盘:SAS是一种高性能磁盘接口,主要用于企业级服务器和存储系统。它提供了更高的数据传输速度和更可靠的连接,支持多路径冗余和热插拔功能。
SCSI(Small Computer System Interface)磁盘:SCSI是一种早期的磁盘接口,用于连接高性能计算机系统和外部存储设备。它提供了高速数据传输和灵活的设备连接选项,支持多设备链路和高级功能。
NVMe(Non-Volatile Memory Express)磁盘:NVMe是一种基于PCIe(Peripheral Component Interconnect Express)总线的高性能磁盘接口。它专为固态硬盘(SSD)设计,具有低延迟和高速数据传输能力,广泛用于高性能计算和数据中心环境。
这些磁盘接口类型在性能、可靠性、兼容性和成本等方面有所区别,适用于不同的应用场景和需求。选择合适的磁盘接口类型要考虑主机设备的接口支持、数据传输需求和预算限制。
管理和组织数据:分区可以帮助您更好地管理和组织磁盘上的数据。通过将磁盘分割为多个区域,您可以将不同类型的数据存储在不同的分区中,例如操作系统文件、应用程序、用户数据等。这样可以更好地组织文件,并使其更易于管理和维护。没有分区时,所有数据都存储在同一个磁盘上,可能会导致数据混乱和难以管理。
性能:分区可以对磁盘的性能产生影响。通过将数据分布在多个分区中,可以提高磁盘访问的效率。例如,将操作系统和程序文件分配到一个分区,将用户数据分配到另一个分区,这样可以减少磁头的移动距离,提高读写速度。没有分区时,所有数据都存储在同一个区域,可能会导致磁头频繁移动,降低访问效率。
安全性和稳定性:通过将系统和用户数据分开存储在不同的分区中,可以提高系统的安全性和稳定性。如果发生系统故障或数据损坏,可能只影响某个特定的分区,而不会影响整个磁盘上的数据。没有分区时,数据的安全性和稳定性可能会受到更大的威胁,因为整个磁盘上的数据都处于相同的风险之中。
多引导系统:分区使得在同一磁盘上安装多个操作系统变得可能。每个操作系统可以位于不同的分区中,这样可以实现多引导,使用户可以在启动时选择要运行的操作系统。如果不对磁盘进行分区,则无法轻松实现多引导系统。
兼容性:某些文件系统在使用时需要特定的分区类型。通过将磁盘进行分区,可以选择适当的分区类型以支持所需的文件系统。没有分区时,可能无法满足特定文件系统的要求。
总之,磁盘分区提供了更好的数据管理、性能、安全性和灵活性。它允许更好地组织和管理磁盘上的数据,提高性能,提供数据的安全性和稳定性,并允许实现多引导系统和不同文件系统的兼容性。没有分区时,这些优势和功能将无法实现。
在Linux下,磁盘格式化、分区和挂载的详细步骤如下所示:
使用以下命令来查看可用磁盘设备:
/ # fdisk -l
Disk /dev/mmcblk1: 7456 MB, 7818182656 bytes, 15269888 sectors
238592 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Disk /dev/mmcblk1 doesn't contain a valid partition table
Disk /dev/mmcblk1boot0: 4 MB, 4194304 bytes, 8192 sectors
128 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Disk /dev/mmcblk1boot0 doesn't contain a valid partition table
Disk /dev/mmcblk1boot1: 4 MB, 4194304 bytes, 8192 sectors
128 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Disk /dev/mmcblk1boot1 doesn't contain a valid partition table
Disk /dev/mmcblk0: 15 GB, 15931539456 bytes, 31116288 sectors
486192 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type
/dev/mmcblk0p1 * 0,32,33 8,73,1 2048 133119 131072 64.0M c Win95 FAT32 (LBA)
/dev/mmcblk0p2 8,73,2 912,229,21 133120 31116287 30983168 14.7G 83 Linux
从上面可以得出:
/dev/mmcblk1:容量为7456 MB的磁盘。238592柱面,4个磁头,每个磁道16个扇区。磁盘上没有有效的分区表。
/dev/mmcblk1boot0和/dev/mmcblk1boot1是磁盘的引导区,大小为4 MB,但它们没有有效的分区表。
/dev/mmcblk0:容量为15 GB的磁盘。486192柱面,4个磁头,每个磁道16个扇区。包含两个分区:
/dev/mmcblk0p1是引导分区,大小为64.0M,使用Win95 FAT32(LBA)文件系统。
/dev/mmcblk0p2是第二个分区,大小为14.7G,使用Linux文件系统(ID为83)。
/ # fdisk /dev/mmcblk1
The number of cylinders for this disk is set to 238592.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):
此时命令栏提示输入'm',可以看到有如下参数:
Command (m for help): m
Command Action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help):
各指令含义如下:
a: 切换引导标志(toggle a bootable flag)
b: 编辑BSD磁盘标签(edit bsd disklabel)
c: 切换DOS兼容性标志(toggle the dos compatibility flag)
d: 删除分区(delete a partition)
l: 列出已知的分区类型(list known partition types)
n: 添加新分区(add a new partition)
o: 创建一个新的空DOS分区表(create a new empty DOS partition table)
p: 打印分区表(print the partition table)
q: 退出而不保存更改(quit without saving changes)
s: 创建一个新的空Sun磁盘标签(create a new empty Sun disklabel)
t: 更改分区的系统ID(change a partition's system id)
u: 更改显示/输入单位(change display/entry units)
v: 验证分区表(verify the partition table)
w: 将表写入磁盘并退出(write table to disk and exit)
x: 额外功能(仅供专家使用)(extra functionality (experts only)) 继续往下,进行创建分区操作:
Command (m for help): n
Partition type
p primary partition (1-4)
e extended
p
Partition number (1-4): 1
First sector (16-15269887, default 16):
Using default value 16
Last sector or +size{,K,M,G,T} (16-15269887, default 15269887): +32M
Command (m for help): n
Partition type
p primary partition (1-4)
e extended
p
Partition number (1-4): 2
First sector (65552-15269887, default 65552):
Using default value 65552
Last sector or +size{,K,M,G,T} (65552-15269887, default 15269887):
Using default value 15269887
Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): c
Changed system type of partition 1 to c (Win95 FAT32 (LBA))
Command (m for help): a
Partition number (1-4): 1
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table
[ 1334.059435] mmcblk1: p1 p2
以下是对上面输入命令的详细解释:
使用命令'n'创建一个新的分区:
选择主分区(primary partition)类型,输入'p'。
输入分区号,这里选择1。
输入起始扇区,默认为16,可以直接按回车键使用默认值。
输入结束扇区或者分区大小,这里输入'+32M'表示分区大小为32MB。
使用命令'n'再次创建一个新的分区:
选择主分区(primary partition)类型,输入'p'。
输入分区号,这里选择2。
输入起始扇区,默认为65552,可以直接按回车键使用默认值。
输入结束扇区或者分区大小,这里使用默认值15269887。
使用命令't'设置分区类型:
输入要设置类型的分区号,这里选择1。
输入十六进制代码(Hex code),这里输入'c'表示将分区1的系统类型设置为Win95 FAT32(LBA)。
使用命令'a'设置引导标志:
输入要设置引导标志的分区号,这里选择1。
使用命令'w'保存更改并退出:
确认分区表已经被修改,并且调用ioctl()重新读取分区表。
提示分区表已经被修改,并成功保存更改。
最后,磁盘分区表将被修改,分区1被设置为Win95 FAT32(LBA)类型,并且设置为引导分区。
请注意,这些操作可能会对磁盘上的数据产生影响,请确保在进行此类操作之前备份重要数据。
磁盘格式化是指在磁盘上创建文件系统以准备存储数据的过程。通过格式化,磁盘将被分区划分为逻辑块,并创建用于存储和组织文件的文件系统结构。格式化磁盘将清除磁盘上的所有数据,并为其提供一个干净的文件系统环境,使其可以开始存储新的数据。
这里,我们将上面的两个分区分别格式化为Fat32格式的文件系统和ext4格式的文件系统
将'/dev/mmcblk1p1'格式化为Fat32格式的文件系统
将'/dev/mmcblk1p2'格式化为ext4格式的文件系统
Fat32格式,使用命令如下:
mkfs.vfat -F 32 -n "boot" /dev/mmcblk1p1
每个选项的含义解释如下:
-F 32:指定创建的文件系统类型为FAT32。
-n MyVolume:设置卷标为"MyVolume",该卷标将作为文件系统的名称显示。
/dev/mmcblk1p1:是要格式化的设备或分区
ext4格式,使用命令如下:
mkfs.ext4 -F -L "rootfs" /dev/mmcblk1p2
-/bin/sh: mkfs.ext4: not found
每个选项的含义解释如下:
-F:强制进行格式化,即使设备已经被挂载。
-L "rootfs":设置文件系统的标签为"rootfs",该标签将作为文件系统的名称显示。
/dev/mmcblk1p2:要格式化的设备或分区。
这里我们的文件系统不支持mkfs.ext4格式,但是可以使用它的孪生兄弟“mke2fs”,指令如下:
mke2fs -F -L "rootfs" /dev/mmcblk1p2
Filesystem label=rootfs
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
475136 inodes, 1900542 blocks
95027 blocks (5%) reserved for the super user
First data block=0
Maximum filesystem blocks=4194304
58 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
/ #
现在我们已经将上面的两个分区格式化完成了,下一步就是挂载分区。
首先,您需要选择一个目录作为挂载点。可以使用mkdir命令创建一个空目录作为挂载点,例如:
mkdir /mnt/boot
使用mount命令将文件系统挂载到指定的挂载点上,例如:
mount /dev/mmcblk1p1 /mnt/boot
使用“df”指令查看是否挂载成功,命令如下:
/ # df -a
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 15141732 161948 14188824 1% /
devtmpfs 216388 0 216388 0% /dev
proc 0 0 0 0% /proc
tmpfs 249668 0 249668 0% /tmp
sysfs 0 0 0 0% /sys
devpts 0 0 0 0% /dev/pts
/dev/mmcblk1p1 32260 1 32260 0% /mnt/boot
很明显已经’/dev/mmcblk1p1‘分区已经成功挂载到’/mnt/boot‘目录下。
现在,可以通过挂载点来访问和操作文件系统中的文件和目录。
例如,您可以使用cd命令进入挂载点,并使用其他文件操作命令进行文件的读取、写入等操作:
cd /mnt/boot
touch test.txt
然后掉电重启开发板,再次查看'/mnt/boot'下是否有test.txt文件:
/ # ls /mnt/boot/
/ #
很明显是没有test.txt文件,磁盘的'/dev/mmcblk1p1'分区未进行挂载到'/mnt/boot'目录下,因此在'/mnt/boot'下是看不到test.txt文件的。
/ # df -a
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 15141732 161948 14188824 1% /
devtmpfs 216388 0 216388 0% /dev
proc 0 0 0 0% /proc
tmpfs 249668 0 249668 0% /tmp
sysfs 0 0 0 0% /sys
devpts 0 0 0 0% /dev/pts
test.txt文件是保存在磁盘的'/dev/mmcblk1p1'分区,掉电后需要手动挂载到'/mnt/boot'该目录下,才能查看到test.txt文件,如下:
/ # mount /dev/mmcblk1p1 /mnt/boot
[ 179.885442] FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
/ # ls /mnt/boot/
test.txt
/ #
另一个分区挂载如下:
mkdir /mnt/rootfs
mount /dev/mmcblk1p2 /mnt/rootfs
/ # df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 14.4G 158.2M 13.5G 1% /
devtmpfs 211.3M 0 211.3M 0% /dev
tmpfs 243.8M 0 243.8M 0% /tmp
/dev/mmcblk1p1 31.5M 512 31.5M 0% /mnt/boot
/dev/mmcblk1p2 7.1G 20.0K 6.8G 0% /mnt/rootfs
如果希望在系统启动时自动挂载分区,可以编辑/etc/fstab文件并添加相应的条目。例如:
#
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/mmcblk1p1 /mnt/boot vfat defaults 0 0
/dev/mmcblk1p2 /mnt/rootfs ext4 defaults 0 0
重新启动开发板,使用'df'命令查看是否自动挂载
/ # df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 14.4G 158.2M 13.5G 1% /
devtmpfs 211.3M 0 211.3M 0% /dev
tmpfs 243.8M 0 243.8M 0% /tmp
/dev/mmcblk1p1 31.5M 512 31.5M 0% /mnt/boot
/dev/mmcblk1p2 7.1G 20.0K 6.8G 0% /mnt/rootfs
ok,自动挂载成功。
另一种挂载方法,这里在教大家使用UUID来进行自动挂载,如下:
获取分区的UUID:使用以下命令各分区的UUID:
/ # blkid
/dev/mmcblk0p2: LABEL="rootfs" UUID="4bdc82c7-5e83-4992-9966-cd99a2317944" TYPE="ext4"
/dev/mmcblk0p1: LABEL="boot" UUID="DF8D-2A71" TYPE="vfat"
/dev/mmcblk1p2: LABEL="rootfs" UUID="54b75bd6-7cdf-4e80-aa48-1af163bf61f3" TYPE="ext2"
/dev/mmcblk1p1: TYPE="vfat"
编辑/etc/fstab文件并添加相应的条目。例如:
#
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
UUID=54b75bd6-7cdf-4e80-aa48-1af163bf61f3 /mnt/rootfs ext4 defaults 0 0
保存后,重启开发板,成功自动挂载,如下:
/ # df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 14.4G 158.2M 13.5G 1% /
devtmpfs 211.3M 0 211.3M 0% /dev
tmpfs 243.8M 0 243.8M 0% /tmp
/dev/mmcblk1p2 7.1G 20.0K 6.8G 0% /mnt/rootfs
在挂载文件系统时,您可以使用设备路径(如 /dev/mmcblk1p1)或文件系统的UUID来标识要挂载的分区。这两种方法各有一些区别和好处:
1.设备路径 (/dev/mmcblk1p1):
标识分区的路径:使用设备路径是一种直接而简单的方法来标识要挂载的分区。它基于设备文件的物理路径,可以明确地指定要挂载的分区。例如,'/dev/mmcblk1p1' 表示第二个MMC类型的磁盘的第一个分区。
相对容易记忆:设备路径通常较短且易于记忆,因为它们直接与设备文件的名称相关。
但是,设备路径可能会受到设备插入和拔出的影响。如果您的系统中存在多个磁盘或设备连接状态发生变化,设备路径可能会改变。
2.文件系统UUID:
标识分区的唯一性:每个文件系统都有一个唯一的UUID(通用唯一标识符),用于识别分区。UUID是在创建文件系统时生成的,并且是全局唯一的。它不受设备连接状态的影响,因此即使设备路径发生变化,UUID仍将保持不变。
稳定性和持久性:使用UUID来挂载分区可以提供更稳定和持久的挂载方式,因为即使重新启动系统或更改设备连接状态,UUID标识的分区仍然可以准确地被找到。
更适合自动化和脚本:使用UUID可以更方便地进行自动化操作和脚本编写,因为UUID提供了一个固定的标识符来唯一标识特定的分区。
总的来说,使用设备路径或UUID进行挂载都是可行的方法,具体取决于您的需求和使用场景。如果您的系统中没有频繁插拔设备并且不涉及自动化操作,使用设备路径可能更加简单和直接。而如果您需要更稳定和持久的挂载方式,以及更适合自动化操作,使用UUID则更为可靠和推荐。
今天的内容到此就完了,感谢大家的收看,如有不正之处,欢迎批评指正,下期再见!
-END-