You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提前获取Linux块设备分区分隔符?能否从/sys/block查询?

如何从/sys/block可靠获取Linux设备分区分隔符

/sys/block目录下没有直接存储设备与分区号之间分隔符的文件,但可以通过以下几种可靠的方式从sysfs或相关系统信息中推导:

方法1:从现有分区的sysfs路径提取(最准确)

如果目标设备已经存在至少一个分区,直接通过分区的sysfs目录名称结构提取分隔符:

# 假设目标设备路径为$DEV(例如/dev/nvme0n1或/dev/sda)
DEV_NAME=${DEV#/dev/}
# 找到设备下第一个分区的sysfs目录
PART_DIR=$(find /sys/block/$DEV_NAME -maxdepth 1 -type d | grep -v "^/sys/block/$DEV_NAME$" | head -n1)

if [ -n "$PART_DIR" ]; then
    PART_NAME=$(basename "$PART_DIR")
    # 截取分区名中设备名之后的部分
    SUFFIX=${PART_NAME#$DEV_NAME}
    # 判断分隔符:如果后缀以数字开头,分隔符为空;否则取后缀第一个字符
    if [[ $SUFFIX =~ ^[0-9] ]]; then
        SEP=""
    else
        SEP=${SUFFIX:0:1}
    fi
    echo "分区分隔符为: $SEP"
fi

方法2:通过sysfs设备子系统判断(适用于无分区的新设备)

针对还未创建分区的设备,通过检查sysfs中设备的硬件子系统关联来判断类型,从而确定分隔符:

DEV_NAME=${DEV#/dev/}
SEP=""

# 检查是否为NVME设备
if [ -d "/sys/block/$DEV_NAME/device/nvme" ]; then
    SEP="p"
# 检查是否为MMC/SD设备
elif [ -d "/sys/block/$DEV_NAME/device/mmc_host" ]; then
    SEP="p"
fi

echo "分区分隔符为: $SEP"

这种方式比硬编码匹配设备名(如nvme、mmcblk)更健壮,直接关联硬件子系统,避免设备命名变种带来的判断错误。

方法3:借助udev属性验证

通过udev查询设备属性,根据总线类型确定分隔符:

DEV_NAME=${DEV#/dev/}
SEP=""

# 获取设备总线类型
ID_BUS=$(udevadm info --query=property --name="$DEV" | grep -E "^ID_BUS=" | cut -d= -f2)

case "$ID_BUS" in
    nvme|mmc)
        SEP="p"
        ;;
esac

echo "分区分隔符为: $SEP"

以上方法可以组合使用,优先用方法1(如果有分区),否则用方法2或3,确保分隔符判断的可靠性。

内容的提问来源于stack exchange,提问作者Seb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:43:18