답변:
fdisk
Linux를 실행하는 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
awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
blockdev --getsize64 /dev/sda
바이트 단위의 크기를 반환합니다.
blockdev --getsz /dev/sda
512 바이트 섹터의 크기를 반환합니다.
더 이상 사용되지 않음 : blockdev --getsize /dev/sda
섹터 크기를 반환합니다.
blockdev 는 util-linux의 일부입니다.
--getsize
되지 및 제안되고 --getsz
일관성있는 512 바이트 섹터. --getsize
사용해야하는 경우 --getss
섹터 크기가 예상 한 것인지 확인하는데도 사용해야합니다.
cat /sys/class/block/sda/size
크기는 512 바이트 블록으로 표시됩니다.
이 간단한 코드입니다. 찾을 수 없습니다 어떤 문서를하지만, 잘 트릭을 수행합니다
#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
BLKGETSIZE64
크기를 바이트 단위로 반환합니다. linux/fs.h
"반환 장치 크기 (바이트)"에 대한 정보를 참조하십시오 . 유의하십시오 BLKGETSIZE
(더 "64")을 반환합니다 "/ 512".
file
파일 설명자 (예 : from open()
) file_size_in_bytes
여야하며이어야합니다 size_t
.
file_size_in_bytes
64 비트 형식이어야하므로 형식이어야합니다 unsigned long long
.)
echo "`cat /sys/class/block/sda2/size`*512" | bc
또는 bash 또는 산술 연산자가 64 비트 정수로 작동하는 다른 POSIX와 같은 셸을 사용하는 경우에도 호출 할 필요가 없습니다 bc
echo "$((512*$(cat /sys/class/block/sda2/size)))"
바이트 단위의 크기를 제공합니다.
호출 cat
및 포크 (제외 bash
) 멀리 최적화 될 수있다 bash
, ksh93
및 zsh
함께 :
echo "$((512*$(</sys/class/block/sda2/size)))"
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.
blockdev (8) 다른 답변이 있습니까? 옵션 --getsz
과 더 이상 사용되지 않습니다 --getsize
.
blockdev --getss
)는 물리 섹터 크기를위한 것이며blockdev --getbsz
)는 논리 섹터 크기입니다.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
리눅스 커널 소스에는 오해의 소지가있는 주석이 포함되어 있다는 것을 깨달았다 . BLKPBSZGET (P 통지)은 물리 섹터 크기를 가져오고 BLKSSZGET은 논리 섹터 크기를 가져오고 BLKBSZGET (또는 BLKBSZGET_32 in block/compat_ioctl.c
)은 파일 시스템 할당 단위 (클러스터) 크기를 가져 옵니다 . Advanced Format 512e를 사용하는 경우 논리 및 물리 섹터 크기가 다릅니다. ( 512e @ WP )
먼저 기여한 모든 분들께 감사드립니다. 몇 가지 유용한 것들을 배웠습니다.
아직도, 내 경험에 의하면, 이러한 답변의 대부분은 적어도 CD와 DVD에 관한 부분에서 다소 불완전합니다.
이것은 내 Linux Mageia 2의 테스트를 기반으로합니다.
수퍼 유저를위한 명령은 항상 일반 사용자가 접두어를 사용하여 접두어로 사용 /sbin/
하거나 때로는 / usr / sbin /을 사용하여 액세스 할 수 있습니다 . 이제 일반 사용자에게는 작동하거나 작동하지 않을 수 있습니다.
많은 경우, 일반 사용자의 경우 DVD 드라이브의 DVD가 마운트되지 않은 경우에도 작동 할 수 있지만 하드 디스크 (일반 사용자로 호출 될 때)에서는 작동하지 않습니다.
예를 들어 /sbin/fdisk -l /dev/cdrom
내 시스템에서 작동하고 드라이브에서 DVD의 "지오메트리"를 제공합니다. 그러나 DVD의 크기 (바이트 및 섹터)와 올바른 섹터 크기 (DVD의 일반적인 2048 바이트)를 제공합니다.
/usr/sbin/gdisk -l /dev/cdrom
2048 바이트의 섹터 크기 만 제공하는 의 경우도 마찬가지입니다 .
다른 예 (루트가 아닌 일반 사용자)
$ /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/sr0
512 바이트 단위로 표시합니다 (마운트되지 않은 다른 디스크의 크기도 포함). 그러나 cat /sys/class/block/cdrom/size
/ dev / cdrom은 단지 심볼릭 링크이기 때문에 작동하지 않습니다.
df
일부에서 제안한 명령 은 전체 디스크가 아닌 마운트 된 파티션의 크기를 제공합니다. 또한 마운트 된 CD 또는 DVD의 경우 CD / DVD의 실제 크기보다 작습니다. 보다 정확하게는 다음과 같은 두 가지 크기가 있습니다.
dd
.df
.블록은 고정 길이, 즉 512 바이트, 4kB, 8kB, 16kB, 32kB 등을 가진 일련의 비트 또는 바이트입니다.
blockdev --getbsz partition
예
# blockdev --getbsz /dev/sda1
4096
따라서이 파일 시스템의 블록 크기는 4kB입니다.
Node.js를 사용하는 경우이 기본 애드온을 사용하여 블록 장치 크기, 물리 섹터 크기 및 논리 섹터 크기 (FreeBSD, Linux, macOS 및 Windows 지원)를 얻을 수 있습니다. 또한 직접 IO를 수행하는 데 도움이되는 몇 가지 도우미가 있습니다.
가 /sys/block/sda/size
블록 크기? 그렇다면 어느 것입니까?
ioctl BLKGETSIZE 는 BLKSSZGET 보다는 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을 참조 하십시오
inq
로컬 연결, SAN 기반 등과 같은 모든 유형의 블록 장치에 대한 정보를 제공 하는 EMC 유틸리티가 있습니다 .
사용해보십시오.
ftp://ftp.emc.com/pub/symm3000/inquiry/
다음은 그 기능에 대한 간략한 설명입니다. http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
echo "`blockdev --getbsz /dev/sdc`/1024"|bc
출력을 KB 단위로 표시합니다
[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
echo $(( $(blockdev ...)/1024 ))
. 또한 --getbsz
장치의 크기가 아니라 블록의 크기를 나타냅니다.
더 간단하게 :
sudo parted -l /dev/sda
내가 기억하고 타이핑하기 가장 쉬운가요?
df -k | grep /dev/sda
크기 (KB) (첫 번째 숫자)와 사용 된 공간 (두 번째 숫자) 및 사용 가능한 공간 (세 번째 숫자)을 제공합니다.