Linux: 주어진 블록 장치의 세 번째 파티션의 장치 이름을 얻는 방법

Linux: 주어진 블록 장치의 세 번째 파티션의 장치 이름을 얻는 방법

블록 장치와 파티션 번호를 알고 파티션 장치 이름을 (안정적으로) 얻는 방법은 무엇입니까?

예를 들어:

_get_part_dev_from_disk_dev /dev/ccis0 3 => /dev/ccis0p3. # 참고 p

_get_part_dev_from_disk_dev /dev/sde 2 => /dev/sde2

현재 제가 사용하는 방법은 다음과 같습니다만, 첫 번째 디스크를 제외하면 마이너 번호를 파티션 번호로 가정하기 때문에 버그가 있습니다. 이는 완전히 잘못된 것입니다. 마이너 계산은 가능하지만, 한계가 많습니다. 먼저 최대값에 도달한 후 dev를 동적으로 할당합니다.

_get_part_dev_from_disk_dev() {
        if test -b "$1"
        then
                DEV_MAJOR=$(printf "%d" "0x$(stat -c '%t' $1)")
        else
                shellout "[$1] is no a block device"
        fi

        test -n "${2//[0-9]/}" && shellout "[$2] is not a partition number"

        if test ! -r /sys/dev/block/$DEV_MAJOR:$2/uevent
        then
                logerror "Can't read /sys/dev/block/$DEV_MAJOR:$2/uevent"
                shellout "Can't gather $1 partition $2 informations"
        fi

        . /sys/dev/block/$DEV_MAJOR:$2/uevent
        test "$DEVTYPE" != "partition" && shellout "/sys/dev/block/$DEV_MAJOR:$2 TYPE=$DEVTYPE is not a partition."

        # echo $(udevadm info --query=name --path=/sys/dev/block/$DEV_MAJOR:$2)
        echo "/dev/$DEVNAME"
}

이는 블록 장치 이름과 파티션 번호를 알고 있는 파티션을 생성하는 스크립트의 일부입니다. 나중에 파일 시스템도 만들어야 하는데 파티션 이름이 블록 장치 이름 뒤에 파티션 번호가 따른다고 가정할 수는 없습니다. 때로는 문자 p가 있습니다(드라이버에 따라 다름).

어쩌면 udev가 이것을 알고 있을까요?

답변1

때로는 문자 p가 있습니다(드라이버에 따라 다름).

p디스크가 숫자로 끝나면 항상 문자가 추가됩니다. 따라서 디스크 이름과 파티션 번호가 있는 경우 항상 파티션 이름이 다음과 같을 것이라고 가정할 수 있습니다.디스크 이름+숫자또는디스크 이름+ p+숫자. 이를 위해 전공/부전공을 확인할 필요가 없습니다.

어려운 부분은 "세 번째 파티션이 무엇인지"에 대답하는 것입니다. 디스크의 세 번째 또는 세 번째 파티션입니까? sda1위치에 따라 디스크의 세 번째 파티션일 수 있습니다.

디스크에서 파티션이 어디에 있는지 알고 싶다면 파티션 테이블을 이해하는 도구를 사용해야 parted합니다 fdisk. sfdisk스크립트에서 더 쉽게 구문 분석할 수 있도록 JSON 출력 옵션이 있습니다.

세 번째 파티션만 필요한 경우 디스크 이름/경로에 간단히 추가 3(또는 위 참조)하면 파티션 이름/경로를 얻을 수 있습니다.p3

답변2

해결책을 찾은 것 같지만 신뢰할 수 있는지 확실하지 않습니다. 누구든지 확인할 수 있습니까? 개발 심볼릭 링크를 쿼리하고 첫 번째 심볼릭 링크를 선택합니다. 그것들은 모두 동등합니까? 첫 번째는 믿을만한가? 그렇다면 다음 줄이 작업을 올바르게 수행할 것이라고 생각합니다(디스크 /dev/sda의 두 번째 파티션의 장치 이름을 가져옵니다).

readlink -f /dev/$(udevadm info -q symlink /dev/sda|cut -d' ' -f1)-part2

=> /dev/sda2

관련 정보