블록 장치의 크기 결정


답변:


72

fdiskLinux를 실행하는 Mac에서 사용되는 파티션 레이아웃이나 PC 이외의 파티션 형식을 이해하지 못합니다. (예, mac-fdisk오래된 Mac 파티션 테이블과 gdisk최신 GPT 파티션 테이블이 있지만 다른 파티션 레이아웃은 아닙니다.)

커널은 블록 장치가 작동 할 때 이미 파티션 레이아웃을 스캔 했으므로 직접 물어 보지 않겠습니까?

$ cat / proc / partitions
주요 부 # 블록 이름

   8 16 390711384 sdb
   8 17 514079 sdb1
   8 18 390194752 sdb2
   8 32 976762584 sdc
   8 33 514079 sdc1
   8 34 976245952 sdc2
   800156290904 sda
   8 1 514079 sda1
   8 2 155774272 sda2
   8 48 1465138584 sdd
   8 49 514079 sdd1
   8 50 1464621952 sdd2

CD 드라이브와 같은 경우에는 작동하지 않습니다
Ganesh Sittampalam

2
또한 "네이티브"이름 만보고합니다. iSCSI 및 / 또는 다중 경로 및 / 또는 LVM이있는 서버에서는 많은 sd * 및 dm- * 장치가 있지만 일반적으로 실제로 관심있는 장치의 심볼릭 링크를 찾아야합니다 (예 : / dev / mapper / * one)
Luke404

2
여기에보고 된 값은 1KiB의 배수이며 하나의 섹터 (512 바이트)가 너무 작을 수 있습니다.
Lekensteyn

1
이것은 나에게 유용했다. 나는 일을 끝내었다awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
suprjami

173

blockdev --getsize64 /dev/sda 바이트 단위의 크기를 반환합니다.

blockdev --getsz /dev/sda 512 바이트 섹터의 크기를 반환합니다.

더 이상 사용되지 않음 : blockdev --getsize /dev/sda섹터 크기를 반환합니다.

blockdev util-linux의 일부입니다.


4
불행히도 슈퍼 유저 권한이 필요합니다
heinrich5991

6
@ heinrich5991 선택의 여지가 없습니다. 일반 사용자는 블록 장치에 직접 액세스 할 수 없으며 ( "원시 읽기") 보안에 좋습니다.
Totor

@Totor 물론이지만,이 특정 질문에 대한 답변은 수퍼 유저 권한이 필요하지 않습니다.
heinrich5991

2
@ heinrich5991 파일 시스템 작업시 statfs () 및 친구들에게 문의하십시오. 더 중요한 것은 블록 장치 크기와 파일 시스템의 전체 공간 / 사용 가능 / 유효 / 자유 공간 / 간격간에 직접적인 관계를 가정 해서는 안됩니다 .
Luke404

2
에서 맨 페이지 linux.die.net/man/8/blockdev는 말한다 --getsize되지 및 제안되고 --getsz일관성있는 512 바이트 섹터. --getsize사용해야하는 경우 --getss섹터 크기가 예상 한 것인지 확인하는데도 사용해야합니다.
mwfearnley

35
cat /sys/class/block/sda/size

크기는 512 바이트 블록으로 표시됩니다.


9
@ heinrich5991 장치 블록 크기가 항상 512 바이트 인지 어떻게 확인할 수 있습니까?
Totor

5
섹터 크기는 소스 에 따라 항상 512 바이트 입니다. 앞으로이 인터페이스를 문서화 하려고합니다 .
Lekensteyn

명확하게 해주셔서 감사합니다. / sys / class / block / sda / queue / logical_block_size도 있음을 알았습니다. 내가 그것을 사용해야하는지, 아니면 상수 512를 사용해야하는지 확실하지 않았습니다.
Edward Falk

33

이 간단한 코드입니다. 찾을 수 없습니다 어떤 문서를하지만, 잘 트릭을 수행합니다

#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);

수정 : 실제로 SECTORS의 크기를 얻습니다. 그것을 편집하면 공감할 것입니다.
JCCyC 2016 년

8
@JCCyC : BLKGETSIZE64크기를 바이트 단위로 반환합니다. linux/fs.h"반환 장치 크기 (바이트)"에 대한 정보를 참조하십시오 . 유의하십시오 BLKGETSIZE(더 "64")을 반환합니다 "/ 512".
Thanatos

stackoverflow.com/a/48490543/446106 에서이를 기반으로 전체 샘플을 부분적으로 해결했습니다 . 위의 스 니펫을 사용하려면 file파일 설명자 (예 : from open()) file_size_in_bytes여야하며이어야합니다 size_t.
mwfearnley

(실제로 file_size_in_bytes64 비트 형식이어야하므로 형식이어야합니다 unsigned long long.)
mwfearnley

16

어때요 :

fdisk -l

그러면 용량, 사용량 등이 담긴 모든 디스크 목록이 표시됩니다.


3
sudo로 시도하십시오. 그렇지 않으면 아무것도 인쇄하지 않습니다.
Alfe

10

blockdev --getsize /dev/sda


와 함께 사용 sudo하면 그렇지 않으면 얻을 수 Permission denied있습니다.
Wimateeka

9

lsblk 장치 유형 및 마운트 포인트 (있는 경우)를 포함하여 트리보기 및 사람이 읽을 수있는 형식으로 찾고있는 정보를 제공합니다.

장치 유형은 Ganesh Sittampalam의 요청에 따라 CD 드라이브에서 작동 함을 의미합니다.

바이트 단위로 특정 장치의 크기 만 가져 오려면 :

lsblk -rbno SIZE /dev/block-device

7
echo "`cat /sys/class/block/sda2/size`*512" | bc

또는 bash 또는 산술 연산자가 64 비트 정수로 작동하는 다른 POSIX와 같은 셸을 사용하는 경우에도 호출 할 필요가 없습니다 bc

echo "$((512*$(cat /sys/class/block/sda2/size)))"

바이트 단위의 크기를 제공합니다.

호출 cat및 포크 (제외 bash) 멀리 최적화 될 수있다 bash, ksh93zsh함께 :

echo "$((512*$(</sys/class/block/sda2/size)))"

5

C에서 ioctl이 필요하지 않습니다. 파일의 끝을 찾아서 다음과 같이 크기 (바이트)를 얻으십시오.

/* define this before any #includes when dealing with large files: */
#define _FILE_OFFSET_BITS 64
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// ...
int fd = open("/dev/sda", O_RDONLY);
off_t size = lseek(fd, 0, SEEK_END);
// Now size is the size of the file, in bytes, or -1 on error.
// lseek(fd, 0, SEEK_SET) to get back to the start of the file.

원시 디스크 드라이브의 크기를 찾으려면 파일을 열려면 루트 권한이 필요합니다.
Edward Falk

5

blockdev (8) 다른 답변이 있습니까? 옵션 --getsz과 더 이상 사용되지 않습니다 --getsize.

  • BLKSSZGET ( blockdev --getss)는 물리 섹터 크기를위한 것이며
  • BLKBSZGET ( blockdev --getbsz)는 논리 섹터 크기입니다.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

사실, 나는 당신이 그것들을 뒤집어 놓았다고 생각합니다. (시스템에 512 바이트 물리 블록과 4096 바이트 논리 블록이없는 한)
Edward Falk

2
글쎄, block/ioctl.c리눅스 커널 소스에는 오해의 소지가있는 주석이 포함되어 있다는 것을 깨달았다 . BLKPBSZGET (P 통지)은 물리 섹터 크기를 가져오고 BLKSSZGET은 논리 섹터 크기를 가져오고 BLKBSZGET (또는 BLKBSZGET_32 in block/compat_ioctl.c)은 파일 시스템 할당 단위 (클러스터) 크기를 가져 옵니다 . Advanced Format 512e를 사용하는 경우 논리 및 물리 섹터 크기가 다릅니다. ( 512e @ WP )
Palec

@Palec이 질문에 대한 모든 답변과 의견 중에서 가장 지식이 풍부한 의견입니다.
Irfan Latif

5

먼저 기여한 모든 분들께 감사드립니다. 몇 가지 유용한 것들을 배웠습니다.

아직도, 내 경험에 의하면, 이러한 답변의 대부분은 적어도 CD와 DVD에 관한 부분에서 다소 불완전합니다.
이것은 내 Linux Mageia 2의 테스트를 기반으로합니다.

수퍼 유저를위한 명령은 항상 일반 사용자가 접두어를 사용하여 접두어로 사용 /sbin/하거나 때로는 / usr / sbin /을 사용하여 액세스 할 수 있습니다 . 이제 일반 사용자에게는 작동하거나 작동하지 않을 수 있습니다.

많은 경우, 일반 사용자의 경우 DVD 드라이브의 DVD가 마운트되지 않은 경우에도 작동 할 수 있지만 하드 디스크 (일반 사용자로 호출 될 때)에서는 작동하지 않습니다.

예를 들어 /sbin/fdisk -l /dev/cdrom내 시스템에서 작동하고 드라이브에서 DVD의 "지오메트리"를 제공합니다. 그러나 DVD의 크기 (바이트 및 섹터)와 올바른 섹터 크기 (DVD의 일반적인 2048 바이트)를 제공합니다.

/usr/sbin/gdisk -l /dev/cdrom2048 바이트의 섹터 크기 만 제공하는 의 경우도 마찬가지입니다 .

다른 예 (루트가 아닌 일반 사용자)

$ /sbin/blockdev --getss /dev/cdrom   # DVD sector size
2048
$ /sbin/blockdev --getsize64 /dev/cdrom  # DVD byte size
5453316096

$ cat /proc/partitions  # see below
...
   8        8  416027241 sda8
  11        0    5325504 sr0
   8       16 1465138584 sdb
...

이 여기라는 DVD 드라이브 작동 sr0그것을위한 장치가 실제로 때문에 /dev/sr0, /dev/cdrom그것에 만 심볼릭 링크 인. 크기는 1k 단위로 제공됩니다.

마찬가지로 일반 사용자와 마찬가지로

$ cat /sys/class/block/sr0/size
10651008

장치의 DVD 크기를 /dev/sr0512 바이트 단위로 표시합니다 (마운트되지 않은 다른 디스크의 크기도 포함). 그러나 cat /sys/class/block/cdrom/size/ dev / cdrom은 단지 심볼릭 링크이기 때문에 작동하지 않습니다.

df일부에서 제안한 명령 은 전체 디스크가 아닌 마운트 된 파티션의 크기를 제공합니다. 또한 마운트 된 CD 또는 DVD의 경우 CD / DVD의 실제 크기보다 작습니다. 보다 정확하게는 다음과 같은 두 가지 크기가 있습니다.

  • 내부 조직에 사용되는 것을 포함하여 장치의 전체 크기 일반적으로이 파일은 명령을 사용하여 전체를 복사하면 획득 한 파일의 크기입니다 dd.
  • 사용자가 마운트 할 때 사용 가능한 공간 크기 (읽기 전용 모드 일 수 있음). 항상 적습니다. 이것은 명령으로 표시되는 크기입니다 df.

$ / sbin에 / blockdev --getss는 / dev / cdrom이 번호의 DVD 섹터 크기에 대한 업틱
peterretief

512k라고 말하지만 512 바이트 섹터 만 의미합니다.
Tom Hale

3

블록은 고정 길이, 즉 512 바이트, 4kB, 8kB, 16kB, 32kB 등을 가진 일련의 비트 또는 바이트입니다.

blockdev --getbsz partition

# blockdev --getbsz /dev/sda1 
4096

따라서이 파일 시스템의 블록 크기는 4kB입니다.

유추 : 상자에 들어있는 병의 수.
여기에 이미지 설명을 입력하십시오


이것이 정답입니다.
Karl Morrison

1

Node.js를 사용하는 경우이 기본 애드온을 사용하여 블록 장치 크기, 물리 섹터 크기 및 논리 섹터 크기 (FreeBSD, Linux, macOS 및 Windows 지원)를 얻을 수 있습니다. 또한 직접 IO를 수행하는 데 도움이되는 몇 가지 도우미가 있습니다.

https://github.com/ronomon/direct-io


0

/sys/block/sda/size블록 크기? 그렇다면 어느 것입니까?

ioctl BLKGETSIZEBLKSSZGET 보다는 512 단위와 동일한 문제점이 있습니다 . BLKGETSIZE64 는이 모호성을 해결합니다. 실제 블록 수 BLKGETSIZE64 / BLKSSZGET 입니다.

/*BINFMTC:
http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <assert.h>

int main(int argc, char **argv)
{
        int fd;
        long blk=0L;
        long ssz=0L;
        long long oct=0LL;

        if((fd=open(argv[1],O_RDONLY))<0) { perror(argv[1]); exit(1); }
        if(ioctl(fd,BLKGETSIZE,&blk)<0) { perror("BLKGETSIZE"); exit(1); }
        if(ioctl(fd,BLKSSZGET,&ssz)<0) { perror("BLKSSZGET"); exit(1); }
        if(ioctl(fd,BLKGETSIZE64,&oct)<0) { perror("BLKGETSIZE64"); exit(1); }
        if(close(fd)<0) { perror("close"); exit(1); }
        printf("BLKGETSIZE=%ld BLKSSZGET=%ld BLKGETSIZE64=%lld BLKGETSIZE64/BLKSSZGET=%ld SIZEGB=%f #%f\240GiB\n\n",\
blk,ssz,oct,(long)(oct/(long long)ssz),(double)oct/1000000000.0,(double)oct/1073741824.0);

        fflush(stdout); /* before exec */

        execl("/bin/bash","bash","-c",\
"for i in \
/sys/block/?d?/{size,alignment_offset,?d??/size,?d??/alignment_offset,queue/*block*,queue/*sector*}; \
do test -f \"$i\" && echo \"$i: $(<$i)\"; done"\
,NULL);

        exit(127);
        return 127; /* not reached */
}

http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html을 참조 하십시오


1
어설 션 남용 : 어설 션을 사용하지 않으면 필요한 부작용이 더 이상 발생하지 않습니다.
Alfe


0
echo "`blockdev --getbsz /dev/sdc`/1024"|bc

출력을 KB 단위로 표시합니다

[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#

bash는 인라인으로 계산을 수행 할 수 있습니다 echo $(( $(blockdev ...)/1024 )). 또한 --getbsz장치의 크기가 아니라 블록의 크기를 나타냅니다.
mwfearnley


-1
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'

모든 표준 도구 또는 proc 항목보다 매우 유용합니다.


-3
df -k | grep /dev/sda

크기 (KB) (첫 번째 숫자)와 사용 된 공간 (두 번째 숫자) 및 사용 가능한 공간 (세 번째 숫자)을 제공합니다.


5
파일 시스템이 마운트 된 경우에만 해당됩니다.
lfaraone 2016 년

2
이것은 블록 장치 공간에 관한 것이 아니라 / dev / sda에있는 파일 시스템의 사용 가능한 공간을 제공합니다. 분할되지 않은 공간은 어떻습니까? 파티션이 여러 개인 경우 어떻게합니까?
kbyrd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.