如何提前获取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
相关产品推荐
相关产品推荐

