跳至主要內容

Linux中磁盘管理

知识库编程技巧CentOSCentOS大约 10 分钟

一、磁盘分区

在Linux下,磁盘格式化、分区和挂载的详细步骤如下所示:

1.确定磁盘设备

使用以下命令来查看可用磁盘设备:

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)。

2.使用fdisk命令对磁盘进行分区

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: 编辑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创建一个新的分区:

  • 选择主分区(primary partition)类型,输入p
  • 输入分区号,这里选择1
  • 输入起始扇区,默认为16,可以直接按回车键使用默认值。
  • 输入结束扇区或者分区大小,这里输入+32M表示分区大小为32MB。
# 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

使用命令n再次创建一个新的分区:

  • 选择主分区(primary partition)类型,输入p
  • 输入分区号,这里选择2
  • 输入起始扇区,默认为65552,可以直接按回车键使用默认值。
  • 输入结束扇区或者分区大小,这里使用默认值15269887。
# 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

使用命令t设置分区类型:

  • 输入要设置类型的分区号,这里选择1
  • 输入十六进制代码(Hex code),这里输入c表示将分区1的系统类型设置为Win95 FAT32(LBA)。
# 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))

使用命令a设置引导标志:

  • 输入要设置引导标志的分区号,这里选择1
# Command (m for help): a
# Partition number (1-4): 1

使用命令w保存更改并退出:

  • 确认分区表已经被修改,并且调用ioctl()重新读取分区表。
  • 提示分区表已经被修改,并成功保存更改。
# Command (m for help): w
# The partition table has been altered.
# Calling ioctl() to re-read partition table
# [ 1334.059435]  mmcblk1: p1 p2

最后,磁盘分区表将被修改,分区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

三、磁盘挂载

1.创建挂载点

首先,您需要选择一个目录作为挂载点。可以使用mkdir命令创建一个空目录作为挂载点,例如:

mkdir /mnt/boot

2.执行挂载命令

使用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目录下。

3.访问文件系统

现在,可以通过挂载点来访问和操作文件系统中的文件和目录。

例如,您可以使用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

四、开机自动挂载

1.设备路径挂载

如果希望在系统启动时自动挂载分区,可以编辑/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

2.UUID挂载

另一种挂载方法,这里在教大家使用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则更为可靠和推荐。