Mengetahui bahwa saya terlambat 9 tahun untuk menjawab, saya kira Anda akan menemukan jawabannya dengan perintah lsblk .
Adit Ya
Jawaban:
73
fdisktidak mengerti tata letak partisi yang digunakan oleh Mac saya yang menjalankan Linux, atau format partisi non-PC lainnya. (Ya, ada mac-fdiskuntuk tabel partisi Mac lama, dan gdiskuntuk 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?
Ini tidak berfungsi untuk hal-hal seperti drive CD
Ganesh Sittampalam
2
Dan juga hanya melaporkan nama "asli". Pada server dengan iSCSI dan / atau multipath dan / atau LVM Anda mendapatkan banyak dan banyak perangkat sd * dan dm- * tetapi biasanya Anda perlu mencari symlink dari yang Anda benar-benar tertarik (mis. A / dev / mapper / * one)
Luke404
2
Nilai yang dilaporkan di sini adalah kelipatan dari 1KiB yang mungkin satu sektor (512 byte) terlalu kecil.
Lekensteyn
1
Ini berguna bagi saya. Saya akhirnya melakukanawk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
suprjami
173
blockdev --getsize64 /dev/sda mengembalikan ukuran dalam byte.
blockdev --getsz /dev/sda mengembalikan ukuran dalam sektor 512-byte.
Usang: blockdev --getsize /dev/sdamengembalikan ukuran di sektor.
@ heinrich5991 Anda tidak punya pilihan. Seorang pengguna normal tidak dapat mengakses perangkat blok secara langsung ("pembacaan mentah" itu), yang baik untuk keamanan.
Totor
@ Motor Tentu, tetapi belum ada jawaban untuk pertanyaan khusus ini yang tidak memerlukan hak pengguna super.
heinrich5991
2
@ heinrich5991 ketika bekerja dengan sistem file, Anda harus bertanya statfs () dan teman-teman. Lebih penting lagi, Anda tidak boleh mengasumsikan hubungan langsung antara ukuran perangkat blok dan ruang total / dapat digunakan / efektif / gratis / apa pun pada sistem file.
Luke404
2
Halaman manual di linux.die.net/man/8/blockdev mengatakan --getsizesudah usang, dan menyarankan --getszuntuk sektor 512-byte yang konsisten. Jika --getsizeharus digunakan, saya kira --getssjuga harus digunakan untuk memastikan ukuran sektor adalah apa yang Anda harapkan.
Terima kasih telah menjelaskannya. Saya perhatikan bahwa ada juga / sys / class / block / sda / queue / logical_block_size. Saya tidak yakin apakah saya harus menggunakannya, atau konstanta 512.
Edward Falk
33
Kode sederhana ini. Tidak dapat menemukan dokumentasi apa pun , tetapi lakukan trik dengan baik:
Koreksi: itu benar-benar membuat Anda ukuran di SEKTOR. Edit dan saya akan angkat suara.
JCCyC
8
@ JCCyC: BLKGETSIZE64mengembalikan ukuran dalam byte. Lihat linux/fs.h, yang mencatat "mengembalikan ukuran perangkat dalam byte". Perhatikan bahwa BLKGETSIZE(no "64") mengembalikannya "/ 512".
Thanatos
Saya mengerjakan sampel yang lebih lengkap sebagian berdasarkan ini di stackoverflow.com/a/48490543/446106 . Untuk menggunakan cuplikan di atas di sini, fileharus berupa deskriptor file (mis. Dari open()), dan file_size_in_bytesharus a size_t.
mwfearnley
(Sebenarnya, file_size_in_bytesharus tipe 64-bit, jadi seharusnya unsigned long long.)
mwfearnley
16
Bagaimana tentang:
fdisk -l
Ini akan memberi Anda daftar semua disk Anda dengan kapasitas masing-masing, penggunaan, dan banyak lagi.
Gunakan dengan sudo, jika tidak Anda dapatkan Permission denied.
Wimateeka
9
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:
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 catdan garpu (kecuali untuk bash) dapat dioptimalkan dengan bash, ksh93dan zshdengan:
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.
Sebenarnya, saya pikir Anda punya yang terbalik. (Kecuali jika sistem saya memiliki blok fisik 512-byte dan blok logis 4096-byte.)
Edward Falk
2
Yah, saya menyadari bahwa block/ioctl.cdi 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 )
Palec
@Palec Komentar paling berpengetahuan di antara semua jawaban dan komentar untuk pertanyaan ini.
Irfan Latif
5
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/cdromakan 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.
Ini berfungsi untuk drive DVD, di sini disebut sr0, karena perangkat untuk itu sebenarnya /dev/sr0, /dev/cdrommenjadi 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/sizetidak 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:
ukuran keseluruhan perangkat, termasuk apa yang digunakan untuk organisasi internal. Biasanya itu adalah ukuran file yang diperoleh jika disalin secara keseluruhan dengan perintah dd;
ukuran ruang yang tersedia (mungkin hanya dalam mode baca-saja) kepada pengguna saat dipasang, yang selalu kurang. Itu adalah ukuran yang ditunjukkan oleh perintah df.
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/sizedalam 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 */
}
Ini bukan tentang memblokir ruang perangkat, ini akan memberi Anda ruang yang digunakan dan dapat digunakan untuk filesystem yang terpasang di / dev / sda. Bagaimana dengan ruang tanpa partisi? Bagaimana jika Anda memiliki banyak partisi?
Jawaban:
fdisk
tidak mengerti tata letak partisi yang digunakan oleh Mac saya yang menjalankan Linux, atau format partisi non-PC lainnya. (Ya, adamac-fdisk
untuk tabel partisi Mac lama, dangdisk
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?
sumber
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 .
sumber
--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.Ini memberi Anda ukurannya dalam blok 512-byte.
sumber
Kode sederhana ini. Tidak dapat menemukan dokumentasi apa pun , tetapi lakukan trik dengan baik:
sumber
BLKGETSIZE64
mengembalikan ukuran dalam byte. Lihatlinux/fs.h
, yang mencatat "mengembalikan ukuran perangkat dalam byte". Perhatikan bahwaBLKGETSIZE
(no "64") mengembalikannya "/ 512".file
harus berupa deskriptor file (mis. Dariopen()
), danfile_size_in_bytes
harus asize_t
.file_size_in_bytes
harus tipe 64-bit, jadi seharusnyaunsigned long long
.)Bagaimana tentang:
Ini akan memberi Anda daftar semua disk Anda dengan kapasitas masing-masing, penggunaan, dan banyak lagi.
sumber
blockdev --getsize /dev/sda
sumber
sudo
, jika tidak Anda dapatkanPermission denied
.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:
sumber
atau jika Anda menggunakan bash atau shell seperti POSIX lainnya yang operator aritmatiknya bekerja dengan bilangan bulat 64bit, Anda bahkan tidak perlu menelepon
bc
memberikan ukuran dalam byte.
Panggilan ke
cat
dan garpu (kecuali untukbash
) dapat dioptimalkan denganbash
,ksh93
danzsh
dengan:sumber
Tidak perlu untuk ioctl di C. Hanya mencari ke akhir file dan mendapatkan ukuran (dalam byte) seperti itu:
sumber
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.sumber
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 inblock/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)
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
akan memberikan ukuran DVD pada perangkat
/dev/sr0
, dalam potongan 512 byte (serta ukuran disk lain, bahkan tidak dipasang). Namuncat /sys/class/block/cdrom/size
tidak akan berfungsi karena / dev / cdrom hanya berupa tautan simbolikPerintah
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
.sumber
Blok adalah urutan bit atau Bytes dengan panjang tetap yaitu 512 byte, 4kB, 8kB, 16kB, 32kB dll.
Contoh
Jadi ukuran blok sistem file ini adalah 4kB.
Analogi: jumlah botol dalam peti.
sumber
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:
https://github.com/ronomon/direct-io
sumber
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 .
Lihat http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
sumber
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/
sumber
akan menampilkan output dalam KB
sumber
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
sumber
Saya merasa sangat berguna daripada semua alat standar atau entri proc
sumber
akan memberi Anda ukuran dalam KB (angka pertama) serta ruang yang digunakan (angka kedua) dan ruang yang tersedia (angka ketiga)
sumber