在无partprobe的极简系统中,可通过BLKRRPART ioctl强制内核重读分区表,推荐使用blockdev --rereadpt /dev/sda;若无blockdev,可用C程序调用ioctl实现,操作前须确保设备未挂载且有root权限。
在没有 partprobe 的极简系统(如嵌入式 BusyBox 环境、initramfs 或定制精简内核)中,可通过直接调用 BLKRRPART ioctl 强制内核重新读取分区表。这本质上是 partprobe 的底层机制,无需额外工具,仅依赖 ioctl 系统调用能力。
确保目标块设备(如 /dev/sda)存在且可被 root 用户访问。注意:不能对已挂载或正被使用的设备执行此操作,否则会返回 EBUSY(设备忙)。
ls -l /dev/sd*
lsof /dev/sda 或 cat /proc/mounts | grep sda
多数极简系统仍包含 blockdev(比 partprobe 更轻量),它封装了 BLKRRPART ioctl:
blockdev --rereadpt /dev/sda
for d in /dev/sd[a-z]; do blockdev --rereadpt "$d" 2>/dev/null; done
Operation not permitted(权限不足)或 Device or resource busy
若连 blockdev 都不可用,可用 C 小程序或 Python(若有解释器)调用 ioctl。以下为最小可行 C 实现:
#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <sys/ioctl.h>#include <linux/fs.h>int main(int argc, char *argv[]) {if (argc != 2) {fprintf(stderr, "Usage: %s /dev/sdXn", argv[0]);return 1;}int fd = open(argv[1], O_RDONLY);if (fd == -1) {perror("open");return 1;}if (ioctl(fd, BLKRRPART, 0) == -1) {perror("ioctl BLKRRPART");close(fd);return 1;}printf("Partition table re-read OK for %sn", argv[1]);close(fd);return 0;}
编译运行:gcc -o reread reread.c && ./reread /dev/sda。静态链接可避免依赖 libc 动态库。
执行后立即检查内核是否识别新分区:
ls /dev/sda*(应出现 /dev/sda1、/dev/sda2 等)dmesg | tail -10,正常会有类似 sda: sda1 sda2 的识别记录ls /sys/block/sda/sda*/start,有输出即表示分区已注册