本文详细介绍 Linux 系统下与磁盘分区相关的有 fdiskfsckmkfsmount 等其他常用命令~

Linux 系统下与磁盘分区相关的有 fdiskfsckmkfsmount 等这些命令:

  • fdisk 是用来操作磁盘分区表相关的更改,比如更改分区表格式,创建分区表,新建/删除分区等
  • mkfs 则是在创建分区之后负责将分区格式化的工具
  • mount 则是将分区挂载到 Linux 的文件树中(与之对应的卸载是 umount

我以向 Linux 系统添加了一块全新的磁盘以拓展存储空间为例。各种命令的详细使用方法使用 man 查看,此处不再翻译。

fdisk

使用 fdisk 命令对硬盘进行分区,创建分区表和分区。可以创建主分区、扩展分区和逻辑分区等。

分区完成后,每个分区都会被赋予一个设备节点(例如:/dev/sda1/dev/sdb2 等)。

接下来,需要使用 mkfs 命令对每个分区进行格式化,例如 mkfs.ext4mkfs.xfs 等。

最后,将格式化后的分区挂载到指定的挂载点(目录)上,使其可以被访问和使用。


在添加磁盘之前,先执行 fdisk -l 列出系统中的物理磁盘,记录下来,方便与添加磁盘之后做对比,找到新添加的磁盘设备号。

1
2
3
4
5
6
7
8
9
10
11
root@linux:~$ fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 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: 0x25241c74
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 25165823 25163776 12G 83 Linux
/dev/sda2 25167870 41940991 16773122 8G 5 Extended
/dev/sda5 25167872 41940991 16773120 8G 82 Linux swap / Solaris

可以看到,目前系统只安装了一块硬盘 sda,有三个分区,现在可以关机加硬盘了。加完硬盘后开机再执行 fdisk -l

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@linux:~$ fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 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: 0x25241c74
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 25165823 25163776 12G 83 Linux
/dev/sda2 25167870 41940991 16773122 8G 5 Extended
/dev/sda5 25167872 41940991 16773120 8G 82 Linux swap / Solaris

Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 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

可以看到,新添加的硬盘的设备号为 sdb没有分区表,没有分区。接下来就用 fdisk /dev/sdb 来创建分区表和分区。

1
2
3
4
5
6
7
root@linux:~$ fdisk /dev/sdb
Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x95942ae2.
Command (m for help):

不知道怎么操作的此时可以按 m 调出帮助界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
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 type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table

先创建一个 GPT 分区表,按 g

1
2
Command (m for help): g
Created a new GPT disklabel (GUID: F4A12897-62F7-4ABA-9BC3-88BF53550DE3).

分区表创建后创建分区,按 n 回车,Partition number、First sector、Last sector 参数不清楚的可以直接回车使用默认参数。

  • 指定起始扇区:按回车使用默认值,通常是第一个可用扇区。

  • 指定结束扇区或分区大小,你可以手动指定结束扇区,也可以通过输入大小来自动计算结束扇区。例如:

    • 输入 +50G 创建一个 50 GiB 的分区。

    • 输入 +200G 创建一个 200 GiB 的分区。

1
2
3
4
5
Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-20971486, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-20971486, default 20971486):
Created a new partition 1 of type 'Linux filesystem' and of size 10 GiB.

此时已经在这块新加的 10GB 的硬盘中创建了一个 10GB 的分区。

最后按 w 将更改信息写入硬盘。

1
2
3
4
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

mkfs

常见的 File System

  • ext2
  • ext3
  • ext4
  • btrfs
  • xfs

虽然说文件系统的种类很多,但大部分 linux 下文件系统都有着类似的结构,包括超级块、inode、数据块、目录块等。

  • 超级块包括了文件系统的总体信息,是文件系统的核心,所以磁盘中会有多个超级块,即使某一些超级块坏了,文件系统依然可用。
  • inode 存储着所有与文件有关的数据,比如文件的权限等,并不包括文件内容和文件名。
  • 数据块是真实存储数据的,**一个数据块默认的大小为 4KB**。
  • 目录块包括文件内容和文件名,以及 inode 的信息。

注意:如果设备上没有分区,或者设备分区上没有文件系统,也会导致挂载失败。你可以检查设备是否已经被格式化或有文件系统。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ sudo blkid /dev/nvme0n1
# 为空表示没有文件系统/还没被格式化过

$ sudo mkfs.ext4 /dev/nvme0n1
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 122096646 4k blocks and 30531584 inodes
Filesystem UUID: 36df5186-24a0-4dad-9b4e-664a4230b7f1
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

$ sudo blkid /dev/nvme0n1
/dev/nvme0n1: UUID="36df5186-24a0-4dad-9b4e-664a4230b7f1" TYPE="ext4"

$ sudo mount <设备> <挂载点>

# 已经被格式化过
$ sudo blkid /dev/nvme1n1
/dev/nvme1n1: PTUUID="8e912df5-211c-45ea-a422-6a0f83c045c3" PTTYPE="gpt"

接下来 mkfs.ext4 /dev/sdb1 格式化该分区(mkfs 后面跟着 . 与文件系统的格式表明要将目标分区格式化成什么文件系统)

1
2
3
4
5
6
7
8
9
10
root@linux:~$ mkfs.ext4 /dev/sdb1
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 2621179 4k blocks and 655360 inodes
Filesystem UUID: 886f1d1a-a3ad-4bdf-89b3-54ee0c9238f2
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

mount

在文件系统中创建一个空目录作为挂载点,并将分区挂载到挂载点

1
2
root@linux:~$ mkdir /mnt/new_mountpoint
root@linux:~$ mount -t ext4 /dev/sdb1 /mnt/new_mountpoint/

此时 /mnt/new_mountpoint/ 下面的存储空间就是此次新添加的10GB磁盘的存储空间,可以用 df -h 查看

1
2
3
4
5
6
7
8
9
10
11
root@linux:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 799M 9.1M 790M 2% /run
/dev/sda1 12G 4.5G 6.7G 40% /
tmpfs 3.9G 188K 3.9G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
tmpfs 799M 24K 799M 1% /run/user/108
tmpfs 799M 0 799M 0% /run/user/1000
/dev/sdb1 9.8G 23M 9.2G 1% /mnt/new_mountpoint

在使用 mount 命令时,设备(source)和挂载点(target)的顺序很重要。设备应该在前面,挂载点在后面。具体的语法格式如下:

1
$ mount [选项] <设备> <挂载点>

具体说明

  • 设备:指的是你要挂载的块设备或文件系统的路径,比如 /dev/sda1/dev/nvme0n1p1
  • 挂载点:指的是挂载该设备的目录路径,比如 /mnt/nvme0n1

示例

  1. 挂载设备: 假设你有一个设备 /dev/sda1,你想挂载到 /mnt/data 目录下,使用如下命令:

    1
    sudo mount /dev/sda1 /mnt/data
  2. 挂载文件系统类型: 如果你想指定文件系统类型(例如 ext4),可以使用 -t 选项:

    1
    sudo mount -t ext4 /dev/sda1 /mnt/data
  3. 卸载设备: 卸载挂载的设备使用 umount 命令:

    1
    sudo umount /mnt/data

常用选项

  • -t <type>:指定文件系统类型,如 ext4xfs 等。
  • -o <options>:指定挂载选项,如 ro(只读)、rw(读写)、noatime(不更新访问时间)等。

总结

fdisk 分区挂载更加灵活,可以将磁盘划分为多个分区,每个分区可以有不同的文件系统类型,分区完后仍然需要对每个分区 mkfs 格式化文件系统,或者也可以直接 mkfs 选择对整个磁盘格式化,但整个磁盘将只能使用一个文件系统类型,无法将磁盘分割为多个独立的区域。

常用命令 lsblk、df、du

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
wyk 09:20:49 ~
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 79.9M 1 loop /snap/lxd/22923
loop1 7:1 0 62M 1 loop /snap/core20/1587
loop3 7:3 0 38.8M 1 loop /snap/snapd/21759
loop4 7:4 0 63.9M 1 loop /snap/core20/2318
loop5 7:5 0 87M 1 loop /snap/lxd/28373
sda 8:0 0 447.1G 0 disk
├─sda1 8:1 0 1G 0 part
└─sda2 8:2 0 446.1G 0 part /old8003-2
sdb 8:16 0 1.8T 0 disk /home/cyf/hdd
nvme4n1 259:0 0 894.3G 0 disk /home/lzh/ssd
nvme3n1 259:1 0 894.3G 0 disk /home/wyk/ssd
nvme2n1 259:2 0 894.3G 0 disk
├─nvme2n1p1 259:3 0 1G 0 part /boot/efi
└─nvme2n1p2 259:4 0 893.2G 0 part /
nvme0n1 259:5 0 894.3G 0 disk /home/cyf/ssd0
nvme1n1 259:6 0 894.3G 0 disk /home/cyf/ssd1

wyk 09:21:02 ~
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 13G 3.3M 13G 1% /run
/dev/nvme2n1p2 879G 308G 527G 37% /
tmpfs 63G 0 63G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/nvme2n1p1 1.1G 6.1M 1.1G 1% /boot/efi
/dev/sda2 439G 336G 81G 81% /old8003-2
/dev/nvme3n1 880G 28K 835G 1% /home/wyk/ssd

wyk 09:17:50 ~
$ sudo du -h --max-depth=1 /old8003-2/home/
30G /old8003-2/home/ymx
6.4G /old8003-2/home/cjh
72G /old8003-2/home/cyf
15G /old8003-2/home/zzh
2.1G /old8003-2/home/jyc
525M /old8003-2/home/astl
2.7G /old8003-2/home/lcc
1.1G /old8003-2/home/whs
1.6G /old8003-2/home/olh
6.4G /old8003-2/home/wyk
95G /old8003-2/home/lzh
8.0G /old8003-2/home/zyu
239G /old8003-2/home

wyk 09:24:37 ~
$ lsblk -d -o name,rota
NAME ROTA
loop0 0
loop1 0
loop3 0
loop4 0
loop5 0
sda 0
sdb 1
nvme4n1 0
nvme3n1 0
nvme2n1 0
nvme0n1 0
nvme1n1 0
wyk 09:24:44 ~

lsblk -d -o name,rota 对于其返回值,看 ROTA 值来判断:

若 ROTA=1,则意味该硬盘旋转,则其为机械硬盘;

若 ROTA=0,则意味着该盘为固态硬盘;

对于上述打印结果,sdb 为固态硬盘,sda 为机械硬盘。

执行 sudo umount /old8003-1 不会擦除 SSD 上的数据

umount 命令只是卸载文件系统,意味着它将断开挂载点和设备的关联,让该挂载点不再可访问。数据仍然保留在 SSD 上的分区中,没有被删除

简单来说:

  • umount: 只断开文件系统,不会对数据产生任何影响。
  • 数据还在磁盘上,只是暂时不可通过该挂载点访问。

要删除数据,通常需要格式化磁盘或者手动删除文件。

某个 ssd/hdd 还挂载在某个目录下,如果要清除上面的数据并挂载到自己指定目录下要怎么做(全流程)

  • 这将显示所有在 /old8003-1 目录下活动的文件和进程。如果有进程正在使用该目录,可以终止它们或手动关闭它们:sudo lsof /old8003-1
  • 格式化前先取消磁盘的挂载 sudo umount /old8003-1
  • 可以选择 sudo fdisk /dev/nvme3n1 对磁盘进行分区,也可以不分区, 直接把整个磁盘格式化(就没有 nvme3n1p1、nvme3n1p2 这类分区了)
  • 指定分区的格式化文件系统类型 sudo mkfs.ext4 /dev/nvme3n1
  • 最后挂载上去即可 sudo mount ~/ssd /dev/nvme3n1

✍️ Yikun Wu 已发表了 69 篇文章 · 总计 293k 字,采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处

🌀 本站总访问量