디스크 크기를 얻으려면 어떤 "크기" 파일을 사용해야 합니까?

디스크 크기를 얻으려면 어떤 "크기" 파일을 사용해야 합니까?

내 디스크는 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/deviceLinux에서 해당 크기를 가져오는 다음과 같은 여러 옵션이 있습니다.

  1. open() 장치를 실행하고 BLKGETSIZE64 ioctl()그게 다입니다 blockdev --getsize64 path/to/block/device.

  2. open() 장치를 실행하고 BLKGETSIZE ioctl()비슷한 blockdev --getsz path/to/block/device작업을 실행하여 512( BLKSSZGETioctl() blocksize --getss path/to/block/device에서 반환된 값이 아님( ))를 곱합니다.

  3. open() 장치, lseek() 끝까지 실행하면 현재 커서 위치가 반환됩니다. 예를 들면 다음과 같습니다 zsh.

    zmodload zsh/system
    { sysseek -w end 0 && print $(( systell(0) )); } < path/to/block/device
    
  4. 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

관련 정보