赞
踩
磁盘(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文件并添加相应的条目。例如:
- #<file system> <mount point> <type> <options> <dump> <pass>
- 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文件并添加相应的条目。例如:
- #<file system> <mount point> <type> <options> <dump> <pass>
- 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-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。