在Linux系统中,内核读取分区实际上是指内核的块设备子系统识别磁盘上的分区表(如MBR或GPT),并为每个分区创建对应的块设备节点(如/dev/sda1)。默认情况下,内核在启动时或检测到新磁盘接入时会自动扫描分区,但当磁盘分区表在系统运行期间被修改(如使用fdisk、gdisk或parted)后,内核不会主动重新读取,需要手动触发内核重新扫描分区。

要让内核重新读取分区,最常用的方法是使用partprobe命令。该命令来自parted工具包,执行`partprobe /dev/sda`会向内核发送重新读取分区表的请求,内核立即更新分区信息。如果目标磁盘正在使用(如挂载了文件系统),partprobe可能不会生效,此时需要先卸载分区或使用强制选项。例如:`partprobe -s /dev/sda`可以显示扫描结果。
另一个常用工具是partx,它直接调用内核的BLKPG接口来添加或删除分区。执行`partx -u /dev/sda`会基于当前分区表同步内核中的分区信息,而`partx -a /dev/sda`则会强制重新添加所有分区。如果只需要通知内核而不改变现有分区,`partx -u`更为精准。
对于使用device mapper的虚拟磁盘或LVM卷组,可以使用kpartx工具。例如:`kpartx -a /dev/sdb`会读取分区并为分区创建映射设备(如/dev/mapper/xxx1)。这在管理多路径存储或映射整个磁盘映像时特别有用。
此外,还有blockdev命令也可实现类似功能:`blockdev --rereadpt /dev/sda`。该命令直接要求内核重新读取分区表,效果与partprobe相似。但某些内核版本或驱动下可能需要配合`hdparm -z /dev/sda`来强制刷新分区信息。
对于SCSI/SAS/USB设备,如果更改了磁盘容量或分区结构,还可以通过sysfs接口触发重新扫描。向对应的SCSI主机设备写入扫描命令,例如:`echo 1 > /sys/block/sda/device/rescan`。这会重新扫描设备并更新内核所知道的磁盘大小,但通常不会重新解析分区表,需要结合partprobe使用。
如果以上命令都无效,最彻底的方法是重启系统或执行reboot,让内核在启动过程中从零开始读取分区。在生产环境中,强烈建议在修改分区表之前备份重要数据,并在操作后使用lsblk或fdisk -l验证分区是否已被内核正确识别。
需要特别注意的是,内核读取分区与挂载文件系统是两个不同步骤。分区被内核识别后,还需要通过mount命令将分区上的文件系统挂载到目录才能访问。如果内核未正确读取新分区,mount会失败并提示“没有那样的设备”,因此先确保分区出现在/dev中(或使用lsblk可见)再挂载。
总之,Linux内核通过ioctl系统调用与块设备驱动交互,管理员可以通过partprobe、partx、blockdev等工具主动触发分区表重读。选择具体方法时,应依据设备类型、分区状态以及内核版本,优先使用官方推荐且风险较低的partprobe。

查看详情

查看详情