Linux中磁盘管理
一、磁盘分区
在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则更为可靠和推荐。