Bir blok cihazının boyutunu belirleme


Yanıtlar:


72

fdiskMac çalışanımın Linux kullandığı bölüm düzenini ve diğer PC olmayan bölüm biçimlerini anlamıyor. (Evet, mac-fdiskeski Mac bölüm tabloları ve gdiskdaha yeni GPT bölüm tabloları için var, ancak bunlar yalnızca oradaki diğer bölüm düzenleri değil.)

Çekirdek, blok aygıtı hizmete girdiğinde bölüm düzenlerini zaten taradığından, neden doğrudan sormuyorsunuz?

$ cat / proc / bölümler
büyük küçük #blocks name

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

Bu CD sürücüleri gibi şeyler için işe yaramaz
Ganesh Sittampalam

2
Ve ayrıca yalnızca "yerel" adları bildirir. İSCSI ve / veya çok yollu ve / veya LVM bulunan bir sunucuda çok sayıda ve çok sayıda sd * ve dm- * aygıtı elde edersiniz, ancak genellikle gerçekten ilgilendiğiniz aygıtın linkini aramanız gerekir (örn. A / dev / mapper / * one)
Luke404

2
Burada bildirilen değerler, bir sektör (512 bayt) çok küçük olabilen 1KiB katlarıdır.
Lekensteyn

1
Bu benim için faydalı oldu. Yaptığım sona erdiawk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
suprjami

173

blockdev --getsize64 /dev/sda bayt cinsinden boyutu döndürür.

blockdev --getsz /dev/sda 512 bayt sektörlerde boyutu döndürür.

Kullanımdan kaldırıldı: blockdev --getsize /dev/sdasektörlerde boyut döndürür.

blockdev util- linux'un bir parçasıdır.


4
ne yazık ki süper kullanıcı gücüne ihtiyaç duyuyor
heinrich5991

6
@ heinrich5991 seçeneğim yok. Normal bir kullanıcı doğrudan bir blok cihaza erişemez ("ham okuma"), bu güvenlik için iyidir.
Totor

@Totor Elbette, ancak henüz bu özel soru için herhangi bir süper kullanıcı hakkı gerektirmeyen cevaplar var.
heinrich5991

2
@ heinrich5991 Dosya sistemleriyle çalışırken, statfs () ve arkadaşlarına sormalısınız. Daha da önemlisi, gerektiği değil blok cihaz boyutuna ve dosya sistemi üzerinde serbest / / kullanışlı / toplam efektif / ne olursa olsun uzay arasında doğrudan bir ilişki varsayalım.
Luke404

2
Linux.die.net/man/8/blockdev adresindeki manpage --getsizekullanımdan kaldırıldığını söylüyor ve --getsztutarlı 512 bayt sektörler için öneride bulunuyor . Kullanılması --getsizegerekiyorsa --getss, sektör boyutunun beklediğiniz gibi olduğundan emin olmak için de kullanılması gerektiğini düşünüyorum.
mwfearnley,

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

Bu size 512 baytlık bloklar halinde boyutunu verir.


9
@ heinrich5991 Cihaz blok boyutunun her zaman 512 bayt olduğundan nasıl emin olabilirsiniz ?
Totor

5
Kaynağa göre sektör büyüklüğü her zaman 512 bayttır . Gelecek için bu arayüzü belgelemeye çalışıyorum .
Lekensteyn

Bunu netleştirdiğin için teşekkürler. Ayrıca / sys / class / block / sda / queue / logical_block_size olduğunu da fark ettim. Bunu mu kullanmalıyım yoksa 512 sabitini mi kullanmam gerektiğinden emin değildim.
Edward Falk

33

Bu basit kod. Herhangi bir dokümantasyon bulunamadı , ancak püf noktası güzel:

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

Düzeltme: SEKTÖRLER'de size bedeninizi alır. Düzenleyin ve ben oyla.
JCCyC

8
@JCCyC: BLKGETSIZE64boyutu bayt olarak döndürür. Bkz linux/fs.h"bayt dönüş cihazı boyutu" notları, hangi. Not BLKGETSIZE(hayır "64") döndürür "/ 512".
Thanatos

Kısmen buna dayanarak daha dolu bir örnek üzerinde stackoverflow.com/a/48490543/446106 . Yukarıdaki pasajı burada kullanmak için, filebir dosya tanımlayıcısı (örn. Den open()) file_size_in_bytesolması ve a olması gerekir size_t.
mwfearnley

(Aslında, file_size_in_bytes64 bit tür olmalı, öyleyse öyle olmalıdır unsigned long long.)
mwfearnley

16

Peki ya:

fdisk -l

Bu size, kapasiteleri, kullanım alanları ve daha fazlasıyla birlikte tüm disklerinizin bir listesini verecektir.


3
Sudo ile deneyin, yoksa sadece hiçbir şey yazdırmaz.
Alfe

10

blockdev --getsize /dev/sda


İle kullanın sudo, aksi takdirde olsun Permission denied.
Wimateeka

9

lsblk Ağaç türleri ve insan tarafından okunabilir bir biçimde, cihaz türleri ve montaj noktaları (varsa) dahil olmak üzere aradığınız bilgileri verir.

Aygıt türü, Ganesh Sittampalam tarafından istendiği gibi CD sürücüleri için çalıştığı anlamına gelir.

Belirli bir cihazın boyutunu yalnızca bayt olarak almak için:

lsblk -rbno SIZE /dev/block-device

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

veya aritmetik operatörleri 64bit tamsayılarla çalışan bash veya başka bir POSIX benzeri kabuk kullanıyorsanız, aramanıza gerek yok bc

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

bayt cinsinden boyutunu verir.

Çağrısı catve çatal (hariç bash) ile uzak optimize edilebilir bash, ksh93ve zshşununla:

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

5

C. ioctl gerek yok Sadece dosyanın sonuna kadar aramak ve boyutunu (bayt cinsinden) almak:

/* 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.

Ham disk sürücüsünün boyutunu arıyorsanız, dosyayı açmak için dosyayı açmak için kök ayrıcalıklarına ihtiyacınız olacaktır.
Edward Falk

5

Blockdev'in (8) farklı bir cevabı var mı? Seçenekler --getszve kullanımdan kaldırılmış --getsizeolanlar aynı değildir.

  • BLKSSZGET ( blockdev --getss) fiziksel sektör boyutu içindir ve
  • BLKBSZGET ( blockdev --getbsz), mantıksal kesim büyüklüğü içindir.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

Aslında, bunların tersine sahip olduğunu düşünüyorum. (Sistemimde 512 bayt fiziksel blok ve 4096 bayt mantıksal blok bulunmuyorsa.)
Edward Falk

2
Pekala, block/ioctl.cLinux'ta çekirdek kaynağının yanıltıcı yorumlar içerdiğini fark ettim . BLKPBSZGET (P'nin dikkatini çeker) fiziksel kesim boyutunu alır, BLKSSZGET mantıksal kesim boyutunu alır ve BLKBSZGET (veya BLKBSZGET_32 inç block/compat_ioctl.c) dosya sistemi ayırma birimi (küme) boyutunu alır. Advanced Format 512e kullanıldığında mantıksal ve fiziksel sektör büyüklüğü değişir. ( 512e @ WP )
Palec

@Palec Bu soruya verilen tüm cevaplar ve yorumlar arasında en bilgili yorum.
Irfan Latif

5

İlk olarak, emeği geçen herkese teşekkür ediyorum. Birkaç faydalı şey öğrendim.

Yine de, benim deneyimim, bu cevapların çoğunun, en azından CD ve DVD'lerin söz konusu olduğu yerlerde, özellikle süper kullanıcı ile sınırlı olmaktan ziyade normal kullanıcılar tarafından kullanılıp kullanılamayacağı konusunda biraz eksik olduğu yönünde.
Bu benim Linux Mageia 2'deki testlerime dayanıyor.

Süper kullanıcı için tasarlanan komutlara normal bir kullanıcı tarafından her zaman /sbin// usr / sbin / ile veya bazen / usfix ile öneklendirilerek erişilebilir . Şimdi normal bir kullanıcı için çalışabilir veya çalışmayabilir.

Birçoğu, normal bir kullanıcı için, DVD sürücüsü üzerindeki bir DVD için, takılı olmasa bile, bir sabit disk için çalışmazken (yine normal kullanıcı olarak kullanıldığında) çalışabilir.

Örneğin /sbin/fdisk -l /dev/cdrom, sistemim üzerinde çalışacak ve görünüşte çoğunlukla saçma olan DVD'deki "geometrisini" verecek. Ancak, DVD'nin bayt ve sektörlerdeki boyutunu ve doğru bir sektör boyutunu (DVD'de olduğu gibi 2048 bayt) verir.

Aynısı, /usr/sbin/gdisk -l /dev/cdromyalnızca 2048 baytlık sektörlerde boyut veren de geçerlidir.

diğer örnekler (root olmayan, normal kullanıcı)

$ /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
...

Bu burada adlandırılan DVD sürücü için çalışıyor sr0bunun için cihaz aslında olduğundan, /dev/sr0, /dev/cdromkendisine sadece sembolik bir bağlantı olduğu. Boyut 1k'lık parçalar halinde verilmiştir.

Benzer şekilde, normal kullanıcı olarak, komut

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

Cihazda bir DVD boyutunu, /dev/sr0512 bayt boyutunda (ayrıca takılmamış olsa bile diğer diskin boyutunda) verir. Ancak cat /sys/class/block/cdrom/sizeişe yaramayacak neden / dev / cdrom sadece sembolik bir bağdır

dfBazıları tarafından önerilen komut , tüm disklerin değil, monte bölümlerin boyutunu verir. Ayrıca, monte edilmiş bir CD veya DVD için CD / DVD'nin gerçek boyutundan daha azını verir. Daha doğrusu, birinin ilgisini çekebilecek iki farklı boyutu vardır:

  • iç organizasyonu için kullanılanlar da dahil olmak üzere cihazın genel boyutu. Tipik olarak, komutla bütünüyle kopyalanırsa, elde edilen dosyanın büyüklüğüdür dd;
  • takılı iken kullanıcıya her zaman daha az olan kullanılabilir alanın boyutu (yalnızca salt okunur modda). Bu, komut tarafından belirtilen boyuttur df.

$ / sbin / blockdev --getss / dev / cdrom # DVD sektör boyutu için Uptick
peterretief

512k diyorsun ama sadece 512 bayt sektör demek istiyorsun.
Tom Hale,

3

Bir blok, sabit uzunlukta bir bit dizisidir, yani 512 bayt, 4kB, 8kB, 16kB, 32kB, vs.

blockdev --getbsz partition

Örnek

# blockdev --getbsz /dev/sda1 
4096

Yani bu dosya sisteminin blok büyüklüğü 4kB'dir.

Analoji: kasalardaki şişe sayısı.
görüntü tanımını buraya girin


Bu doğru cevap.
Karl Morrison

1

Node.js kullanıyorsanız, bu yerel eklentiyi, blok boyutu, fiziksel kesim boyutu ve mantıksal kesim boyutu (FreeBSD, Linux, macOS ve Windows desteği ile) almak için kullanabilirsiniz. Ayrıca doğrudan IO yapmak için birkaç yardımcı daha var:

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


0

/sys/block/sda/sizeblok boyutunda? Eğer öyleyse hangisi?

İoctl BLKGETSIZE bu 512 ziyade birimlerinde olduğu gibi, aynı sorun vardır BLKSSZGET . BLKGETSIZE64 bu belirsizliği çözer. Gerçek blok sayısı ise 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 */
}

Bkz http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html


1
İddianın kötüye kullanılması: İddiaları devre dışı bırakırsanız, gerekli yan etkiler artık gerçekleşmeyecektir.
Alfe


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

KB çıktısını gösterecek

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

bash hesaplamaları satır içi yapabilirsiniz: echo $(( $(blockdev ...)/1024 )). Ayrıca --getbsz, cihazın boyutunu değil bloğun boyutunu verir.
mwfearnley


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

Tüm bu standart araçlardan veya proc girişlerinden çok faydalı buluyorum


-3
df -k | grep /dev/sda

Size KB (ilk sayı) ve kullanılan alan (ikinci sayı) ve kullanılabilir alan (üçüncü sayı) ile boyutu verir


5
Bu sadece dosya sistemi monte edilmişse olur.
lfaraone

2
Bu, blok aygıt alanıyla ilgili değil, size / dev / sda'da olan dosya sistemlerinde kullanılmış ve kullanılabilir bir alan sağlayacaktır. Bölümlenmemiş alandan ne haber? Birden fazla bölümünüz varsa?
kbyrd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.