Yanıtlar:
fdisk
Mac ç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-fdisk
eski Mac bölüm tabloları ve gdisk
daha 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
awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
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/sda
sektörlerde boyut döndürür.
--getsize
kullanımdan kaldırıldığını söylüyor ve --getsz
tutarlı 512 bayt sektörler için öneride bulunuyor . Kullanılması --getsize
gerekiyorsa --getss
, sektör boyutunun beklediğiniz gibi olduğundan emin olmak için de kullanılması gerektiğini düşünüyorum.
cat /sys/class/block/sda/size
Bu size 512 baytlık bloklar halinde boyutunu verir.
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);
BLKGETSIZE64
boyutu 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".
file
bir dosya tanımlayıcısı (örn. Den open()
) file_size_in_bytes
olması ve a olması gerekir size_t
.
file_size_in_bytes
64 bit tür olmalı, öyleyse öyle olmalıdır unsigned long long
.)
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
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ı cat
ve çatal (hariç bash
) ile uzak optimize edilebilir bash
, ksh93
ve zsh
şununla:
echo "$((512*$(</sys/class/block/sda2/size)))"
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.
Blockdev'in (8) farklı bir cevabı var mı? Seçenekler --getsz
ve kullanımdan kaldırılmış --getsize
olanlar aynı değildir.
blockdev --getss
) fiziksel sektör boyutu içindir veblockdev --getbsz
), mantıksal kesim büyüklüğü içindir.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
Linux'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 )
İ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/cdrom
yalnı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 sr0
bunun için cihaz aslında olduğundan, /dev/sr0
, /dev/cdrom
kendisine 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/sr0
512 bayt boyutunda (ayrıca takılmamış olsa bile diğer diskin boyutunda) verir. Ancak cat /sys/class/block/cdrom/size
işe yaramayacak neden / dev / cdrom sadece sembolik bir bağdır
df
Bazı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:
dd
;df
.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.
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:
Mı /sys/block/sda/size
blok 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
inq
Yerel takılı, SAN tabanlı vb. Tüm blok aygıt türleri hakkında bilgi veren bir EMC yardımcı programı vardır .
Denemek.
ftp://ftp.emc.com/pub/symm3000/inquiry/
İşte ne yaptığı hakkında kısa bir açıklama: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
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]#
echo $(( $(blockdev ...)/1024 ))
. Ayrıca --getbsz
, cihazın boyutunu değil bloğun boyutunu verir.
Daha basit:
sudo parted -l /dev/sda
Benim için hatırlaması ve yazması en kolay olanı mı?
df -k | grep /dev/sda
Size KB (ilk sayı) ve kullanılan alan (ikinci sayı) ve kullanılabilir alan (üçüncü sayı) ile boyutu verir