Tentukan ukuran perangkat blok


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?

$ 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

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.

blockdev adalah bagian dari util-linux .


4
sayangnya membutuhkan kekuatan superuser
heinrich5991

6
@ 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.
mwfearnley

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

Ini memberi Anda ukurannya dalam blok 512-byte.


9
@ heinrich5991 Bagaimana Anda bisa memastikan ukuran blok perangkat selalu 512 byte?
Totor

5
Ukuran sektor selalu 512 byte menurut sumbernya . Untuk masa depan, saya mencoba mendokumentasikan antarmuka ini .
Lekensteyn

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:

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

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.


3
Cobalah dengan sudo, jika tidak mencetak apa-apa.
Alfe

10

blockdev --getsize /dev/sda


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:

lsblk -rbno SIZE /dev/block-device

7
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 catdan garpu (kecuali untuk bash) dapat dioptimalkan dengan bash, ksh93dan zshdengan:

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

5

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.

Jika Anda mencari ukuran drive disk mentah, Anda akan memerlukan root root untuk membuka file hingga akhir.
Edward Falk

5

Blockdev (8) memiliki jawaban yang berbeda? Opsi --getszdan usang --getsizetidak sama.

  • BLKSSZGET ( blockdev --getss) adalah untuk ukuran sektor fisik dan
  • BLKBSZGET ( blockdev --getbsz) adalah untuk ukuran sektor logis.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

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.

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

uptick untuk $ / sbin / blockdev - widget / dev / cdrom # Ukuran sektor DVD
peterretief

Anda mengatakan 512k tetapi yang Anda maksud hanya sektor 512 byte.
Tom Hale

3

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.

Analogi: jumlah botol dalam peti.
masukkan deskripsi gambar di sini


Ini jawaban yang benar.
Karl Morrison

1

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


0

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

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


1
Penyalahgunaan pernyataan: Jika Anda menonaktifkan pernyataan, efek samping yang diperlukan tidak akan terjadi lagi.
Alfe


0
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]#

pesta dapat melakukan perhitungan inline: echo $(( $(blockdev ...)/1024 )). Perhatikan juga, --getbszberikan ukuran blok, bukan ukuran perangkat.
mwfearnley


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

Saya merasa sangat berguna daripada semua alat standar atau entri proc


-3
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)


5
Itu hanya jika sistem file di-mount.
lfaraone

2
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?
kbyrd
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.