Mac OS X Bash получить размер / dev / diskNsM - PullRequest
4 голосов
/ 28 марта 2011

Как я могу получить размер устройства в байтах ?

В Mac OS X 10.6 я использую это:

$ diskutil information /dev/disk0s2
   Device Identifier:        disk0s2
   Device Node:              /dev/disk0s2
   Part Of Whole:            disk0
   Device / Media Name:      macOSX106

   Volume Name:              macOSX106
   Escaped with Unicode:     macOSX106

   Mounted:                  Yes
   Mount Point:              /
   Escaped with Unicode:     /

   File System:              Journaled HFS+
   Type:                     hfs
   Name:                     Mac OS Extended (Journaled)
   Journal:                  Journal size 8192 KB at offset 0x12d000
   Owners:                   Enabled

   Partition Type:           Apple_HFS
   Bootable:                 Is bootable
   Media Type:               Generic
   Protocol:                 SATA
   SMART Status:             Verified
   Volume UUID:              E2D5E93F-2CCC-3506-8075-79FD232DC63C

   Total Size:               40.0 GB (40013180928 Bytes) (exactly 78150744 512-Byte-Blocks)
   Volume Free Space:        4.4 GB (4424929280 Bytes) (exactly 8642440 512-Byte-Blocks)

   Read-Only Media:          No
   Read-Only Volume:         No
   Ejectable:                No

   Whole:                    No
   Internal:                 Yes

и все работает нормально. Но в Mac OS X 10.4 вывод будет

$ diskutil info disk0s2
   Device Node:        /dev/disk1s2
   Device Identifier:  disk1s2
   Mount Point:        
   Volume Name:        

   Partition Type:     Apple_HFS
   Bootable:           Not bootable
   Media Type:         Generic
   Protocol:           SATA
   SMART Status:       Not Supported

   Total Size:         500.0 MB
   Free Space:         0.0 B

   Read Only:          No
   Ejectable:          Yes

и что-то вроде этого (40013180928 байт) (ровно 78150744 512-байтовых блоков)

Мой bash-скрипт анализирует вывод diskutil, извлекает общий размер в байтах и ​​захватывает последние 10 Мбайт диска с помощью команды dd, поэтому в 10.4 он не работает ...

Как я могу получить размер в байтах другим способом?

Ответы [ 4 ]

1 голос
/ 06 октября 2015

следующая команда diskutil info disk0s2 | grep -Ei 'Total.+([0-9]){10,}' | grep -Eio '[0-9]{10,}' (при условии, что у вас есть disk0s2) возвращает размер диска / раздела в байтах.

Предполагая, что ваш диск имеет размер не менее 127.2 GigbaGytes или ~ 127.000.000.000 bytes, вы получите один размер раздела s2 из этой команды, который будет работать точно так же для всего диска.

diskutil info disk0 | grep -Ei 'Total.+([0-9]){10,}' | grep -Eio '[0-9]{10,}'

мои 128ГБ SSD-диски exectly 128035676160 байт для диска и 127175917568 и один раздел минус 200 МБ для EFI

Измените Total в регулярном выражении на Free , и вы получите доступное свободное место для выбранного раздела. Используйте размер в некоторых модных сценариях резервного копирования pv + dd + pigz ;-)

например:

DISK0S2_SIZE=`diskutil info disk0s2 | \ grep -Ei 'Total.+([0-9]){10,}' | \ grep -Eio '[0-9]{10,}'` | \ sudo dd if=/dev/rdisk0s2 bs=1m | \ pv -s $DISK0S2_SIZE | \ pigz -9z > /path/to/backup.zz

Здесь мы предполагаем, что я хочу disk0s2 z-ziped со сжатием 9 (11 - max или flag --best), Скажи привет изящному индикатору прогресса dd, так как это одна из тех операций, которые никогда не умели делать; -)

1 голос
/ 28 марта 2011

Не могли бы вы использовать это так:

df | grep /dev/disk0s2
1 голос
/ 12 ноября 2013

Вы можете создать что-то, основываясь на следующем ... У меня установлен диск 32 ГБ в / dev / rdisk0s4 на моем Mac.Следующая команда показывает, что я могу прочитать 1 МБ из нее со смещением 30 ГБ:

dd if=rdisk0s4 bs=1m count=1 skip=30000 2> /dev/null | wc -c
1048576

Следующая команда показывает, что я получаю, когда пытаюсь прочитать 1 МБ из нее со смещением 40 ГБ:

dd if=rdisk0s4 bs=1m count=1 skip=40000 2> /dev/null | wc -c
0

Таким образом, вы можете начать с больших кусков, чтобы быстро найти приблизительный конец диска, а затем вернуться к последовательным меньшим кускам, пока у вас не будет необходимой точности.Вот немного Perl, который работает для меня очень хорошо:

#!/usr/bin/perl
################################################################################
# disksize.pl
# Author: Mark Setchell
# Perl script to determine size of a disk by trying to read from it at various
# offsets using "dd" until failure.
################################################################################
use warnings;
use strict;

my $device="/dev/rdisk0s4";
my $Debug=1;    # Set to 0 to turn off debug messages

my $blocksize=1024*1024;
my $offsetinc=1024;
my $offset=0;
my $size=0;

while(1){
    print "Testing byte offset:",$offset*$blocksize,"\n" if $Debug;
    my $result=`sudo dd if=$device bs=$blocksize iseek=$offset count=1 2>/dev/null | wc -c`;
    if($result!=$blocksize){
       # If unable to read, step back to previous good position and move on half as many bytes
       $offset -= $offsetinc;
       $offsetinc /= 2;
       print "Read too far - stepping back\n" if $Debug;
       last if $offsetinc < 2;
       $offset += $offsetinc;
    } else {
       # If we were able to read successfully, move on another $offsetinc bytes
       $offset += $offsetinc;   
       $size = ($offset+1)*$blocksize;
       print "Minimum size so far: $size\n" if $Debug;
    }
}
print "Size: $size\n"
0 голосов
/ 28 марта 2011

Возможно, df придерживается какого-то стандарта в разных версиях Mac OS.

...