Як я можу дізнатися розмір блокового пристрою, наприклад /dev/sda
? Біг ls -l
не дає корисної інформації.
Як я можу дізнатися розмір блокового пристрою, наприклад /dev/sda
? Біг ls -l
не дає корисної інформації.
Відповіді:
fdisk
не розуміє макет розділів, використовуваний моїм Mac під управлінням Linux, а також будь-який інший формат розділів, не входять у ПК. (Так, mac-fdisk
для старих таблиць розділів Mac і gdisk
для нових таблиць розділів GPT є, але це не єдині інші макети розділів.)
Оскільки ядро вже сканувало макети розділів, коли блок-пристрій прийшов у роботу, чому б не запитати його безпосередньо?
$ cat / proc / розділи найголовніша назва #blocks 8 16 390711384 сдб 8 17 514079 sdb1 8 18 390194752 sdb2 8 32 976762584 зд 8 33 514079 sdc1 8 34 976245952 sdc2 8 0 156290904 сда 8 1 514079 сда1 8 2 155774272 sda2 8 48 1465138584 сдд 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
повинен бути дескриптор файлу (наприклад, з open()
), і file_size_in_bytes
повинен бути a size_t
.
file_size_in_bytes
має бути 64-бітний тип, так і має бути unsigned long long
.)
lsblk
надає інформацію, яку ви шукаєте, включаючи типи пристроїв та точки монтажу (якщо такі є), з видом на дерево та у читаному для людини форматі.
Тип пристрою означає, що він працює для компакт-дисків, на запитання Ганеша Ситтампалама.
Щоб отримати лише розмір конкретного пристрою в байтах:
lsblk -rbno SIZE /dev/block-device
echo "`cat /sys/class/block/sda2/size`*512" | bc
або якщо ви використовуєте bash або будь-яку іншу оболонку, схожу на POSIX, арифметичні оператори якої працюють з 64-бітовими цілими числами, вам навіть не потрібно дзвонити bc
echo "$((512*$(cat /sys/class/block/sda2/size)))"
дає розмір у байтах.
Виклик cat
і вилка (за винятком bash
) можуть бути оптимізовані геть з bash
, ksh93
і zsh
з:
echo "$((512*$(</sys/class/block/sda2/size)))"
Немає необхідності в ioctl в C. Просто прагніть до кінця файлу і отримайте розмір (у байтах) таким чином:
/* 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
в джерелі ядра Linux містяться оманливі коментарі. BLKPBSZGET (зверніть увагу на P) набуває розмір фізичного сектора, BLKSSZGET отримує розмір логічного сектора, а BLKBSZGET (або BLKBSZGET_32 в block/compat_ioctl.c
) отримує розмір одиниці розподілу файлової системи (кластера). Логічний та фізичний розміри сектору відрізняються, коли використовується Розширений формат 512e. ( 512e @ WP )
По-перше, дякую всім, хто зробив свій внесок. Я дізнався кілька корисних речей.
І все-таки мій досвід полягає в тому, що більшість цих відповідей є дещо неповними, принаймні, що стосується компакт-дисків та DVD-дисків, зокрема щодо того, чи вони доступні звичайним користувачам, а не обмежуються суперусером.
Це засновано на тестах мого Linux Mageia 2.
Команди, призначені для суперпользователя, завжди можуть отримати доступ до звичайного користувача, префіксуючи їх за допомогою /sbin/
, а іноді і з / usr / sbin /. Тепер вони можуть працювати або не працювати для звичайного користувача.
Багато хто може працювати для звичайного користувача для DVD на DVD-накопичувачі, навіть якщо він не встановлений, тоді як вони не працюватимуть на жорсткому диску (знову ж таки, коли викликаються як звичайний користувач).
Наприклад /sbin/fdisk -l /dev/cdrom
, я працюю над моєю системою і надаю "геометрію" DVD-диска в накопичувачі ... що, мабуть, переважно нонсенс. Але це дає розмір DVD у байтах та секторах та правильний розмір сектору (2048 байт, як це зазвичай для DVD).
Те саме стосується і тих /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
будучи лише символічним посиланням на нього. Розмір наводиться шматками по 1 к.
Аналогічно, як звичайний користувач, команда
$ cat /sys/class/block/sr0/size
10651008
надасть розмір DVD на пристрої /dev/sr0
, в куски 512 байт (як і розмір іншого диска, навіть не встановленого). Однак cat /sys/class/block/cdrom/size
не вийде, тому що причиною / dev / cdrom є лише символічне посилання
Команда df
, запропонована деякими, дає розмір змонтованих розділів, а не цілих дисків. Крім того, для встановленого компакт-диска чи DVD він дає менший, ніж фактичний розмір CD / DVD. Точніше, два різних розміри можуть зацікавити:
dd
;df
.Блок - це послідовність бітів або байтів із фіксованою довжиною, тобто 512 байт, 4 кБ, 8 кБ, 16 кБ, 32 кБ тощо.
blockdev --getbsz partition
Приклад
# blockdev --getbsz /dev/sda1
4096
Отже розмір блоку цієї файлової системи становить 4 кБ.
Якщо ви використовуєте Node.js, ви можете використовувати цей нативний додаток, щоб отримати розмір блокового пристрою, розмір фізичного сектору та розмір логічного сектора (з підтримкою FreeBSD, Linux, macOS та Windows). У нього також є кілька інших помічників для прямого вводу-виводу:
Є /sys/block/sda/size
в розмірі блоку? Якщо так, то який?
У ioctl BLKGETSIZE є та сама проблема, що і в одиницях 512, а не BLKSSZGET . 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
Є утиліта EMC, яка називається, inq
яка дає інформацію про всі типи блокових пристроїв, такі як місцеві приєднані, на базі SAN тощо.
Спробуй.
ftp://ftp.emc.com/pub/symm3000/inquiry/
Ось короткий опис того, що він робить: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
echo "`blockdev --getbsz /dev/sdc`/1024"|bc
покаже вихід у КБ
[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
дасть вам розмір у КБ (перший номер), а також використаний простір (друге число) та доступний простір (третє число)