Bagaimana saya bisa mengetahui ukuran perangkat blok, seperti /dev/sda
? Berjalan ls -l
tidak memberikan informasi yang berguna.
Bagaimana saya bisa mengetahui ukuran perangkat blok, seperti /dev/sda
? Berjalan ls -l
tidak memberikan informasi yang berguna.
Jawaban:
fdisk
tidak mengerti tata letak partisi yang digunakan oleh Mac saya yang menjalankan Linux, atau format partisi non-PC lainnya. (Ya, ada mac-fdisk
untuk tabel partisi Mac lama, dan gdisk
untuk tabel partisi GPT yang lebih baru, tetapi itu bukan satu-satunya tata letak partisi lain di luar sana.)
Karena kernel sudah memindai tata letak partisi ketika perangkat blok mulai beroperasi, mengapa tidak menanyakannya langsung?
$ cat / proc / partisi nama minor #block utama 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
mengembalikan ukuran dalam byte.
blockdev --getsz /dev/sda
mengembalikan ukuran dalam sektor 512-byte.
Usang: blockdev --getsize /dev/sda
mengembalikan ukuran di sektor.
blockdev adalah bagian dari util-linux .
--getsize
sudah usang, dan menyarankan --getsz
untuk sektor 512-byte yang konsisten. Jika --getsize
harus digunakan, saya kira --getss
juga harus digunakan untuk memastikan ukuran sektor adalah apa yang Anda harapkan.
cat /sys/class/block/sda/size
Ini memberi Anda ukurannya dalam blok 512-byte.
Kode sederhana ini. Tidak dapat menemukan dokumentasi apa pun , tetapi lakukan trik dengan baik:
#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
BLKGETSIZE64
mengembalikan ukuran dalam byte. Lihat linux/fs.h
, yang mencatat "mengembalikan ukuran perangkat dalam byte". Perhatikan bahwa BLKGETSIZE
(no "64") mengembalikannya "/ 512".
file
harus berupa deskriptor file (mis. Dari open()
), dan file_size_in_bytes
harus a size_t
.
file_size_in_bytes
harus tipe 64-bit, jadi seharusnya unsigned long long
.)
lsblk
memberikan informasi yang Anda cari, termasuk jenis perangkat dan titik mount (jika ada), dengan tampilan hierarki dan dalam format yang dapat dibaca manusia.
Jenis perangkat berarti itu berfungsi untuk drive CD, seperti yang diminta oleh Ganesh Sittampalam.
Untuk hanya mendapatkan ukuran perangkat tertentu dalam byte:
lsblk -rbno SIZE /dev/block-device
echo "`cat /sys/class/block/sda2/size`*512" | bc
atau jika Anda menggunakan bash atau shell seperti POSIX lainnya yang operator aritmatiknya bekerja dengan bilangan bulat 64bit, Anda bahkan tidak perlu menelepon bc
echo "$((512*$(cat /sys/class/block/sda2/size)))"
memberikan ukuran dalam byte.
Panggilan ke cat
dan garpu (kecuali untuk bash
) dapat dioptimalkan dengan bash
, ksh93
dan zsh
dengan:
echo "$((512*$(</sys/class/block/sda2/size)))"
Tidak perlu untuk ioctl di C. Hanya mencari ke akhir file dan mendapatkan ukuran (dalam byte) seperti itu:
/* 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) memiliki jawaban yang berbeda? Opsi --getsz
dan usang --getsize
tidak sama.
blockdev --getss
) adalah untuk ukuran sektor fisik danblockdev --getbsz
) adalah untuk ukuran sektor logis.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
di Linux kernel source berisi komentar yang menyesatkan. BLKPBSZGET (perhatikan P) mendapatkan ukuran sektor fisik, BLKSSZGET mendapatkan ukuran sektor logis dan BLKBSZGET (atau BLKBSZGET_32 in block/compat_ioctl.c
) mendapatkan ukuran unit alokasi sistem file (cluster) file. Ukuran sektor logis dan fisik berbeda ketika Format Lanjutan 512e digunakan. ( 512e @ WP )
Pertama, terima kasih kepada semua yang berkontribusi. Saya belajar beberapa hal yang bermanfaat.
Namun, pengalaman saya adalah bahwa sebagian besar jawaban ini agak tidak lengkap, paling tidak dalam hal CD dan DVD, terutama mengenai apakah mereka tersedia untuk pengguna normal daripada terbatas pada pengguna super.
Ini berdasarkan tes di Linux Mageia 2 saya.
Perintah yang dimaksudkan untuk superuser selalu dapat diakses oleh pengguna normal dengan awalan /sbin/
, atau terkadang dengan / usr / sbin /. Sekarang mereka mungkin atau mungkin tidak berfungsi untuk pengguna normal.
Banyak yang dapat bekerja, untuk pengguna normal, untuk DVD pada drive DVD, bahkan ketika tidak dipasang, sementara mereka tidak akan bekerja untuk hard disk (sekali lagi ketika dipanggil sebagai pengguna normal).
Sebagai contoh /sbin/fdisk -l /dev/cdrom
akan bekerja pada sistem saya dan memberikan "geometri" DVD di drive ... yang tampaknya kebanyakan omong kosong. Tapi itu memberikan ukuran DVD dalam byte dan sektor, dan ukuran sektor yang benar (2048 byte seperti biasa untuk DVD).
Hal yang sama berlaku /usr/sbin/gdisk -l /dev/cdrom
, yang hanya memberikan ukuran di sektor 2.048 byte.
contoh lain (sebagai non-root, pengguna normal)
$ /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
...
Ini berfungsi untuk drive DVD, di sini disebut sr0
, karena perangkat untuk itu sebenarnya /dev/sr0
, /dev/cdrom
menjadi hanya tautan simbolis untuk itu. Ukurannya diberikan dalam potongan 1k.
Begitu pula dengan pengguna biasa, perintahnya
$ cat /sys/class/block/sr0/size
10651008
akan memberikan ukuran DVD pada perangkat /dev/sr0
, dalam potongan 512 byte (serta ukuran disk lain, bahkan tidak dipasang). Namun cat /sys/class/block/cdrom/size
tidak akan berfungsi karena / dev / cdrom hanya berupa tautan simbolik
Perintah df
, disarankan oleh beberapa orang, memberikan ukuran partisi yang dipasang, bukan seluruh disk. Lebih jauh lagi, untuk CD atau DVD yang dipasang itu kurang dari ukuran sebenarnya dari CD / DVD. Lebih tepatnya, ada dua ukuran berbeda yang mungkin menarik:
dd
;df
.Blok adalah urutan bit atau Bytes dengan panjang tetap yaitu 512 byte, 4kB, 8kB, 16kB, 32kB dll.
blockdev --getbsz partition
Contoh
# blockdev --getbsz /dev/sda1
4096
Jadi ukuran blok sistem file ini adalah 4kB.
Jika Anda menggunakan Node.js, Anda dapat menggunakan pengaya asli ini untuk mendapatkan ukuran perangkat blok, ukuran sektor fisik dan ukuran sektor logis (dengan dukungan untuk FreeBSD, Linux, macOS dan Windows). Ia juga memiliki beberapa pembantu lain untuk melakukan IO langsung:
Apakah /sys/block/sda/size
dalam ukuran blok? Kalau begitu yang mana?
Ioctl BLKGETSIZE memiliki masalah yang sama seperti di unit 512 daripada BLKSSZGET . BLKGETSIZE64 memecahkan ambiguitas ini. Jumlah blok sebenarnya adalah 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 */
}
Lihat http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
Ada utilitas EMC yang disebut inq
yang memberikan informasi tentang semua jenis perangkat blok seperti terpasang lokal, berbasis SAN, dll.
Cobalah.
ftp://ftp.emc.com/pub/symm3000/inquiry/
Berikut ini adalah deskripsi singkat tentang apa yang dilakukannya: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
echo "`blockdev --getbsz /dev/sdc`/1024"|bc
akan menampilkan output dalam KB
[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
echo $(( $(blockdev ...)/1024 ))
. Perhatikan juga, --getbsz
berikan ukuran blok, bukan ukuran perangkat.
Lebih sederhana:
sudo parted -l /dev/sda
Buat saya yang paling mudah diingat dan diketik
df -k | grep /dev/sda
akan memberi Anda ukuran dalam KB (angka pertama) serta ruang yang digunakan (angka kedua) dan ruang yang tersedia (angka ketiga)