වැනි බ්ලොක් උපාංගයක ප්රමාණය සොයා ගන්නේ කෙසේද /dev/sda
? ධාවනය ls -l
කිසිදු ප්රයෝජනවත් තොරතුරක් ලබා නොදේ.
වැනි බ්ලොක් උපාංගයක ප්රමාණය සොයා ගන්නේ කෙසේද /dev/sda
? ධාවනය ls -l
කිසිදු ප්රයෝජනවත් තොරතුරක් ලබා නොදේ.
Answers:
fdisk
මගේ මැක් ධාවනය වන ලිනක්ස් භාවිතා කරන කොටස් සැකැස්ම හෝ වෙනත් PC නොවන කොටස් ආකෘතියක් තේරෙන්නේ නැත. (ඔව්, mac-fdisk
පැරණි මැක් කොටස් වගු gdisk
සඳහා සහ නව ජීපීටී කොටස් වගුව සඳහා ඇත, නමුත් ඒවා එහි ඇති අනෙක් කොටස් පිරිසැලසුම් පමණක් නොවේ.)
බ්ලොක් උපාංගය සේවයට පැමිණි විට කර්නලය දැනටමත් කොටස් පිරිසැලසුම් පරිලෝකනය කර ඇති බැවින් එය කෙලින්ම විමසන්න.
$ cat / proc / කොටස් ප්රධාන සුළු # වාරණ නම 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
ප්රමාණය බයිට් වලින් ලබා දෙයි.
blockdev --getsz /dev/sda
ප්රතිලාභ ප්රමාණය බයිට් 512 කින්.
අවලංගු කරන ලදි: blockdev --getsize /dev/sda
අංශවල ප්රතිලාභ ප්රමාණය.
blockdev යනු util-linux හි කොටසකි.
--getsize
නොසලකා හරිනු, සහ යෝජනා කරයි --getsz
ස්ථාවර 512-බයිට අංශ සඳහා. --getsize
භාවිතා කළ යුතු නම් , --getss
ඔබ අපේක්ෂා කරන්නේ අංශයේ ප්රමාණය බව තහවුරු කර ගැනීම සඳහා ද භාවිතා කළ යුතු යැයි මම සිතමි .
blockdev --getsize*
පරිශීලකයා තැටි උපාංග නෝඩය සඳහා අවසර කියවා ඇත්නම් (සහ, බොහෝ විට යටින් ඇති BLKGETSIZE64 ioctl) සුපර් යූසර් බලයන් අවශ්ය බව නොපෙනේ : `` `# sudo -u පරිශීලක හැඳුනුම්පත uid = 314 (පරිශීලක) gid = 4000 (eng ) groups = 4000 (eng) # ls -l hdw1 brw-rw ---- 1 පරිශීලක තැටිය 8, 177 අප්රේල් 10 17:17 hdw1 # sudo -u user blockdev --getsize64 hdw1 983040 # ls -l $ (which blockdev ) # no setuid bit -rwxr-xr-x 2 root root 26752 දෙසැම්බර් 31 1999 / sbin / blockdev `` `
cat /sys/class/block/sda/size
මෙය ඔබට එහි ප්රමාණය බයිට් 512 කින් ලබා දෙයි.
මෙම සරල කේතය. කිසිදු ලේඛනයක් සොයාගත නොහැකි විය , නමුත් උපක්රමය මනාව කරයි:
#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
BLKGETSIZE64
ප්රමාණය බයිට් වලින් ලබා දෙයි. බලන්න linux/fs.h
, "උපාංගයේ ප්රමාණය බයිට් වලින් ආපසු එවන්න". BLKGETSIZE
("64" නැත) එය "/ 512" ආපසු ලබා දෙන බව සලකන්න .
file
ගොනු විස්තර කරන්නෙකු විය යුතුය (උදා: සිට open()
), සහ file_size_in_bytes
විය යුතුය size_t
.
file_size_in_bytes
බිට් 64 වර්ගයක් විය යුතුය, එබැවින් එය එසේ විය යුතුය unsigned long long
.)
lsblk
උපාංග වර්ග සහ සවිකිරීමේ ස්ථාන (ඇත්නම්) ඇතුළුව ඔබ සොයන තොරතුරු ගස් දර්ශනයක් සහ මිනිස් කියවිය හැකි ආකෘතියකින් ලබා දෙයි.
උපාංග වර්ගය යනු ගනේෂ් සිතම්පලම් ඉල්ලූ පරිදි එය සීඩී ඩ්රයිව් සඳහා ක්රියා කරන බවයි.
විශේෂිත උපාංගයක ප්රමාණය බයිට් වලින් පමණක් ලබා ගැනීමට:
lsblk -rbno SIZE /dev/block-device
echo "`cat /sys/class/block/sda2/size`*512" | bc
හෝ ඔබ සංඛ්යාංක ක්රියාකරුවන් 64bit පූර්ණ සංඛ්යා සමඟ වැඩ කරන bash හෝ වෙනත් POSIX වැනි කවචයක් භාවිතා කරන්නේ නම්, ඔබට ඇමතීමට පවා අවශ්ය නොවේ bc
echo "$((512*$(cat /sys/class/block/sda2/size)))"
ප්රමාණය බයිට් වලින් ලබා දෙයි.
ඇමතුම cat
සහ දෙබලක (හැර bash
) සමඟ ප්රශස්තිකරණය කළ හැකිය bash
, ksh93
සහ zsh
සමඟ:
echo "$((512*$(</sys/class/block/sda2/size)))"
සී හි ioctl අවශ්ය නොවේ. ගොනුවේ අවසානය දක්වා ගොස් ප්රමාණය (බයිට් වලින්) ලබා ගන්න:
/* 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.
බ්ලොක්දේව් (8) ට වෙනස් පිළිතුරක් තිබේද? විකල්ප --getsz
සහ අතහැර --getsize
දැමූ ඒවා සමාන නොවේ.
blockdev --getss
) භෞතික අංශයේ ප්රමාණය සඳහා සහblockdev --getbsz
) තාර්කික අංශයේ ප්රමාණය සඳහා වේ.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
ලිනක්ස් කර්නල් ප්රභවයේ නොමඟ යවන අදහස් අඩංගු බව මම තේරුම් ගතිමි . BLKPBSZGET (P සැලකිල්ලට ගන්න) භෞතික අංශයේ විශාලත්වය, BLKSSZGET තාර්කික අංශ ප්රමාණය ලබා ගන්නා අතර BLKBSZGET (හෝ BLKBSZGET_32 in block/compat_ioctl.c
) ගොනු පද්ධති වෙන් කිරීමේ ඒකකය (පොකුරු) ප්රමාණය ලබා ගනී. උසස් ආකෘතිය 512e භාවිතා කරන විට තාර්කික හා භෞතික අංශ ප්රමාණය වෙනස් වේ. ( 512e @ WP )
පළමුව, දායක වූ සැමට මගේ ස්තූතිය. මම ප්රයෝජනවත් දේවල් කිහිපයක් ඉගෙන ගත්තා.
තවමත් මගේ අත්දැකීම නම්, මෙම පිළිතුරු බොහොමයක් තරමක් අසම්පූර්ණයි, අවම වශයෙන් සීඩී සහ ඩීවීඩී ගැන සැලකිලිමත් වන තැනක, විශේෂයෙන් ඒවා සුපිරි පරිශීලකයාට පමණක් සීමා නොවී සාමාන්ය පරිශීලකයින්ට ලබා ගත හැකිද යන්න පිළිබඳව ය.
මෙය පදනම් වී ඇත්තේ මගේ ලිනක්ස් මැජියා 2 හි පරීක්ෂණ මත ය.
සුපර් යූසර් සඳහා අදහස් කරන විධාන සෑම විටම සාමාන්ය පරිශීලකයෙකුට ඒවා උපසර්ග කිරීමෙන් /sbin/
හෝ සමහර විට / usr / sbin / සමඟ ප්රවේශ කළ හැකිය . දැන් ඔවුන් සාමාන්ය පරිශීලකයෙකු සඳහා වැඩ කිරීමට හෝ නොවීමට ඉඩ ඇත.
බොහෝ අය වැඩ කළ හැකිය, සාමාන්ය පරිශීලකයෙකු සඳහා, ඩීවීඩී තැටියක් සවි කර නොමැති විටදී පවා, එය දෘ disk තැටියක් සඳහා ක්රියා නොකරනු ඇත (නැවත සාමාන්ය පරිශීලකයෙකු ලෙස ඉල්ලූ විට).
උදාහරණයක් ලෙස /sbin/fdisk -l /dev/cdrom
මගේ පද්ධතියේ වැඩ කර ඩ්රයිව් එකේ ඩීවීඩී වල “ජ්යාමිතිය” ලබා දෙනු ඇත ... පෙනෙන හැටියට බොහෝ දුරට විකාරයකි. නමුත් එය ඩීවීඩී වල ප්රමාණය බයිට් සහ අංශ වලින් ලබා දෙයි, සහ නිවැරදි අංශ ප්රමාණය (ඩීවීඩී සඳහා සුපුරුදු පරිදි බයිට් 2048).
/usr/sbin/gdisk -l /dev/cdrom
බයිට් 2048 ක අංශවල ප්රමාණය පමණක් ලබා දෙන සත්යය මෙයයි .
වෙනත් උදාහරණ (මූල නොවන, සාමාන්ය පරිශීලකයා ලෙස)
$ /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
...
සජීවි තැටිය සඳහා මෙම ක්රියා, මෙහි කැඳවා sr0
, ඒ සඳහා උපාංගය ඇත්තටම නිසා /dev/sr0
, /dev/cdrom
එය පමණක් සංකේතාත්මක පුරුකක් වීම. ප්රමාණය 1k කුට්ටි වලින් දක්වා ඇත.
ඒ හා සමානව, සාමාන්ය පරිශීලකයා ලෙස, විධානය
$ cat /sys/class/block/sr0/size
10651008
උපාංගයේ ඩීවීඩී ප්රමාණය, /dev/sr0
බයිට් 512 ක කැබලි වලින් ලබා දෙනු ඇත (මෙන්ම වෙනත් තැටියේ ප්රමාණය, සවි කර නොමැති වුවද). කෙසේ වෙතත් cat /sys/class/block/cdrom/size
එය ක්රියා නොකරනු ඇත / dev / cdrom යනු සංකේතාත්මක සබැඳියක් පමණි
df
සමහරුන් විසින් යෝජනා කරන ලද විධානය මඟින් සම්පූර්ණ තැටිවල නොව සවිකර ඇති කොටස්වල ප්රමාණය ලබා දෙයි. තවද, සවිකරන ලද සීඩී හෝ ඩීවීඩී සඳහා එය සීඩී / ඩීවීඩී වල සත්ය ප්රමාණයට වඩා අඩු අගයක් ලබා දෙයි. වඩාත් නිවැරදිව, යමෙකු උනන්දු විය හැකි වෙනස් ප්රමාණ දෙකක් තිබේ:
dd
;df
.බ්ලොක් එකක් යනු ස්ථාවර දිගක් සහිත බිට් හෝ බයිට් අනුක්රමයකි, එනම් බයිට් 512, 4kB, 8kB, 16kB, 32kB යනාදිය.
blockdev --getbsz partition
උදාහරණයක්
# blockdev --getbsz /dev/sda1
4096
එබැවින් මෙම ගොනු පද්ධතියේ වාරණ ප්රමාණය 4kB වේ.
ඔබ Node.js භාවිතා කරන්නේ නම්, ඔබට බ්ලොක් උපාංග ප්රමාණය, භෞතික අංශයේ ප්රමාණය සහ තාර්කික අංශ ප්රමාණය (FreeBSD, Linux, macOS සහ Windows සඳහා සහය ඇතිව) ලබා ගැනීමට මෙම ස්වදේශීය ඇඩෝනය භාවිතා කළ හැකිය. සෘජු IO කිරීම සඳහා එයට තවත් සහායකයන් කිහිප දෙනෙකු සිටී:
වන /sys/block/sda/size
වාරණ ප්රමාණයෙන්? එසේ නම් කුමන එකද?
මෙම ioctl BLKGETSIZE එය 512 වඩා ඒකක මෙන් ම ගැටළුවක් BLKSSZGET . BLKGETSIZE64 මෙම අවිනිශ්චිතතාව විසඳයි. සැබෑ වාරණ ගණන් වේ 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 */
}
Http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html බලන්න
inq
දේශීය අමුණා ඇති, SAN පදනම් කරගත්, ආදී සියලු වර්ගවල බ්ලොක් උපාංග පිළිබඳ තොරතුරු සපයන EMC උපයෝගීතාවයක් ඇත .
එය අත්හදා බලන්න.
ftp://ftp.emc.com/pub/symm3000/inquiry/
එය කරන්නේ කුමක්ද යන්න පිළිබඳ කෙටි විස්තරයක් මෙන්න: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
echo "`blockdev --getbsz /dev/sdc`/1024"|bc
KB හි ප්රතිදානය පෙන්වයි
[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
echo $(( $(blockdev ...)/1024 ))
. තවද, --getbsz
උපාංගයේ ප්රමාණය නොව බ්ලොක් එකේ ප්රමාණය ලබා දෙයි.
වඩාත් සරලව:
sudo parted -l /dev/sda
මතක තබා ගැනීමට සහ ටයිප් කිරීමට මට පහසුම වේ
ඔබට එය C හි ක්රමලේඛයෙන් සොයා ගැනීමට අවශ්ය නම්, util-linux පැකේජයේ පිටවීමේ කේතය - https://github.com/karelzak/util-linux/blob/master/lib/blkdev.c#L81
නැතහොත් මෙයද ප්රයෝජනවත් වේ - http://www.linuxproblem.org/art_20.html
(කේතය ලිනක්ස් කර්නල් අනුවාදය මත ක්රියා කරයි 5.0.0-32-generic
.)
මෙම කේත දෙකම ioctl පද්ධති ඇමතුම භාවිතා කරයි.
df -k | grep /dev/sda
ඔබට KB (පළමු අංකය) මෙන්ම භාවිතා කළ ඉඩ (දෙවන අංකය) සහ ඇති ඉඩ ප්රමාණය (තෙවන අංකය) ලබා දෙනු ඇත.