Linux 系统下与磁盘分区相关的有 fdisk、fsck、mkfs、mount 等这些命令:
fdisk 是用来操作磁盘分区表相关的更改,比如更改分区表格式,创建分区表,新建/删除分区等 
mkfs 则是在创建分区之后负责将分区格式化的工具 
mount 则是将分区挂载到 Linux 的文件树中(与之对应的卸载是 umount) 
 
我以向 Linux 系统添加了一块全新的磁盘以拓展存储空间为例。各种命令的详细使用方法使用 man 查看,此处不再翻译。
fdisk 使用 fdisk 命令对硬盘进行分区,创建分区表和分区。可以创建主分区、扩展分区和逻辑分区等。
分区完成后,每个分区都会被赋予一个设备节点(例如:/dev/sda1,/dev/sdb2 等)。
接下来,需要使用 mkfs 命令对每个分区进行格式化,例如 mkfs.ext4、mkfs.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 参数不清楚的可以直接回车使用默认参数。
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
虽然说文件系统的种类很多,但大部分 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/nvme0n1mke2fs 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)的顺序很重要。设备 应该在前面,挂载点 在后面。具体的语法格式如下:
 
具体说明 
设备 :指的是你要挂载的块设备或文件系统的路径,比如 /dev/sda1 或 /dev/nvme0n1p1。 
挂载点 :指的是挂载该设备的目录路径,比如 /mnt/nvme0n1。 
 
示例 
挂载设备 : 假设你有一个设备 /dev/sda1,你想挂载到 /mnt/data 目录下,使用如下命令:
1 sudo mount /dev/sda1 /mnt/data 
 
 
挂载文件系统类型 : 如果你想指定文件系统类型(例如 ext4),可以使用 -t 选项:
1 sudo mount -t ext4 /dev/sda1 /mnt/data 
 
 
卸载设备 : 卸载挂载的设备使用 umount 命令:
 
 
常用选项 
-t <type>:指定文件系统类型,如 ext4、xfs 等。 
-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  -hFilesystem      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