내 디스크는 sda이고 다음 크기의 파일이 있습니다.
/sys/dev/block/8:0/size
/sys/class/block/sda/size
/sys/block/sda/size
어느 것을 사용해야 합니까? 첫 번째는 에서 사용됩니다 lsblk
. 차이점이 있나요?
답변1
확인하다
ls -l /sys/dev/block/8:0 /sys/class/block/sda /sys/block/sda
세 개가 모두 동일한 디렉터리를 가리키는 것을 볼 수 있습니다.
경로를 제외하고는 파일 간에 차이가 없습니다.
답변2
/dev/sda
, /dev/disk/by-id/whatever
, 와 같은 블록 장치 파일에 대한 경로가 있는 경우 some/path/to/my/loop/device
Linux에서 해당 크기를 가져오는 다음과 같은 여러 옵션이 있습니다.
open() 장치를 실행하고
BLKGETSIZE64
ioctl()
그게 다입니다blockdev --getsize64 path/to/block/device
.open() 장치를 실행하고
BLKGETSIZE
ioctl()
비슷한blockdev --getsz path/to/block/device
작업을 실행하여 512(BLKSSZGET
ioctl()blocksize --getss path/to/block/device
에서 반환된 값이 아님( ))를 곱합니다.open() 장치, lseek() 끝까지 실행하면 현재 커서 위치가 반환됩니다. 예를 들면 다음과 같습니다
zsh
.zmodload zsh/system { sysseek -w end 0 && print $(( systell(0) )); } < path/to/block/device
sysfs가 에 마운트되어 있다고 가정하고
/sys
장치 파일에 해당하는 경로를 찾은 다음size
파일을 읽고 512를 곱합니다(어느 파일의 값도 아님queue/*size
).
위 1~3의 경우 블록 장치에 대해 최소한 읽기 또는 쓰기 권한이 필요합니다.
4의 경우 블록 장치 파일의 이름은 무엇이든 될 수 있으므로 /sys 경로를 식별하는 신뢰할 수 있는 방법과 lsblk
찾은 방법은 stat()
블록 장치 경로를 호출하여 얻은 메이저 및 마이너 번호에 의존합니다(해당 경로에 대해 필요한 것은 상위 디렉토리에 대한 액세스 검색) 그런 다음 /sys/dev/block/<major>:<minor>
메이저/마이너 장치 번호와 함께 블록 장치 트리의 디렉토리인 심볼릭 링크를 사용합니다./sys/devices
<major>
<minor>
예를 들어 다음과 같습니다 zsh
.
zmodload zsh/stat
stat -sH s path/to/block/device &&
[[ $s[mode] = b* ]] &&
print $(( $(</sys/dev/block/$(( s[rdev] >> 8 )):$(( s[rdev] & 0xff ))/size) * 512 ))
아니면 lsblk
다음과 같이 할 수도 있습니다.
lsblk -nbdo size path/to/block/device
답변3
/sys/dev/block/8:0
, /sys/class/block/sda
및 /sys/block/sda
둘 다 동일한 위치를 가리키는 심볼릭 링크이므로 어느 것을 사용하는지는 중요하지 않습니다.
$ realpath /sys/dev/block/8:0
/sys/devices/pci0000:00/0000:00:01.2/0000:02:00.1/ata4/host3/target3:0:0/3:0:0:0/block/sda
$ realpath /sys/class/block/sda
/sys/devices/pci0000:00/0000:00:01.2/0000:02:00.1/ata4/host3/target3:0:0/3:0:0:0/block/sda
$ realpath /sys/block/sda
/sys/devices/pci0000:00/0000:00:01.2/0000:02:00.1/ata4/host3/target3:0:0/3:0:0:0/block/sda