| SG3_UTILS(8) | SG3_UTILS | SG3_UTILS(8) |
نام (NAME)
sg3_utils - مجموعهای از ابزارهای کمکی برای ارسال دستورات SCSI
خلاصه دستور (SYNOPSIS)
sg_* [--dry-run] [--enumerate] [--help] [--hex] [--in=FN] [--inhex=FN] [--json[=JO]] [--js-file=JFN] [--maxlen=LEN] [--raw] [--timeout=SECS] [--verbose] [--version] [--] [OTHER_OPTIONS] [DEVICE]
توضیحات (DESCRIPTION)
بسته sg3_utils مجموعهای از ابزارهای کمکی است که دستورات SCSI را از طریق یک رابط عبوردهی مستقیم (pass through) ارائهشده توسط سیستمعامل میزبان به DEVICE مشخصشده ارسال میکند.
نام تمام ابزارها با «sg» و بیشتر آنها با «sg_» آغاز میشود که اغلب پس از آن، نام یا کوتهنوشتی از نام دستور SCSI ارسالی آنها میآید. به عنوان مثال، ابزار «sg_verify» دستور SCSI VERIFY را ارسال میکند. نگاشت بین دستورات SCSI و ابزارهای sg3_utils که آنها را صادر میکنند، در فایل COVERAGE نشان داده شده است. از ابزار sg_raw میتوان برای ارسال یک دستور دلخواه SCSI (ارائهشده در خط فرمان) به DEVICE مشخصشده استفاده کرد.
از sg_decode_sense میتوان برای رمزگشایی دادههای سنس (sense data) ارائهشده در خط فرمان یا درون یک فایل استفاده کرد. اجرای دستور sg_raw -vvv نام T10 یک CDB مشخص SCSI را که طول آن اغلب ۱۶ بایت یا کمتر است، در خروجی نمایش میدهد.
پیشنویس استانداردهای SCSI در آدرس https://www.t10.org در دسترس است. خود استانداردها را میتوان از ANSI و سایر سازمانهای استاندارد خریداری کرد. نمای کلی خوبی از استانداردهای مختلف SCSI را میتوان در https://www.t10.org/scsi-3.htm مشاهده کرد که مجموعههای دستورات SCSI در بخش بالایی نمودار قرار دارند. بالاترین سطح (یعنی انتزاعیترین) سند، مدل معماری SCSI موسوم به (SAM) است که SAM-5 جدیدترین استاندارد آن (ANSI INCITS 515-2016) و SAM-6 ویرایش ۴ جدیدترین پیشنویس آن است. دستورات مشترک SCSI بین انواع دستگاهها را میتوان در دستورات اولیه SCSI موسوم به (SPC) یافت که SPC-5 جدیدترین استاندارد آن (ANSI INCITS 502-2020) و جدیدترین پیشنویس آن SPC-6 ویرایش ۶ است. دستورات ویژه دستگاههای بلوکی (مانند دیسکها) در SBC، دستورات درایوهای نوار مغناطیسی در SSC، دستورات محفظههای SCSI در SES و دستورات درایوهای CD/DVD/BD در MMC قرار دارند.
کنترل دیسکهای ATA با مجموعه دستورات SCSI در حال رایجتر شدن است. این کار مستلزم ترجمه دستورات SCSI به معادلهای متناظر ATA آنها است (که در برخی موارد یک نگاشت ناقص محسوب میشود). استاندارد مرتبط، ترجمه SCSI به ATA نامیده میشود؛ استانداردهای (SAT، SAT-2 و SAT-3) اکنون در INCITS(ANSI) و ISO به عنوان استاندارد ثبت شدهاند، در حالی که SAT-4 در مرحله پیشنویس قرار دارد. به منطق انجام ترجمه دستورات معمولاً لایه SAT یا SATL گفته میشود و ممکن است درون سیستمعامل، در میانافزار آداپتور گذرگاه میزبان (HBA) یا در یک دستگاه خارجی (به عنوان مثال متصل به یک بسطدهنده SAS) قرار داشته باشد. برای اطلاعات بیشتر به https://www.t10.org مراجعه کنید.
پشتیبانی اندکی از دستگاههای نوار مغناطیسی تحت SCSI وجود دارد، اما این پشتیبانی شامل عملیات پایهای آنها نمیشود. خواننده به ابزار «mt» ارجاع داده میشود.
استفاده از گزینههای خط فرمان دو نسل متفاوت دارد. ابزارهای جدیدتر (نوشتهشده پس از ژوئیه ۲۰۰۴) از تابع ()getopt_long برای تجزیه گزینههای خط فرمان استفاده میکنند. در این تابع، هر گزینه دو نمایش دارد: یک فرم کوتاه (مانند '-v') و یک فرم طولانیتر (مانند '--verbose'). اگر آرگومانی الزامی باشد، در فرم کوتاه پس از یک فاصله (اختیاری) و در فرم طولانیتر پس از یک «=» قرار میگیرد (مثلاً در ابزار sg_verify دو عبارت '-l 2a6h' و '--lba=2a6h' معادل یکدیگر هستند). توجه داشته باشید که در ()getopt_long، گزینههای فرم کوتاه را میتوان با هم ادغام کرد؛ به عنوان مثال '-all' معادل '-a -l -l' است. آرگومان DEVICE میتواند بعد از، در بین یا پیش از هر گزینهای قرار گیرد.
ابزارهای قدیمیتر، از جمله sg_inq، sg_logs، sg_modes، sg_opcode، sg_rbuff، sg_readcap، sg_senddiag، sg_start و sg_turs دارای کدهای اختصاصی برای پردازش خط فرمان بودند که معمولاً بر پایه یک «-» منفرد به همراه یک یا چند نویسه عمل میکردند. در صورتی که آرگومانی مورد نیاز بود، پس از یک «=» قرار میگرفت (به عنوان مثال '-p=1f' در رابط قدیمی sg_modes). گزینههای مختلف تا زمانی که ابهامی ایجاد نکنند، میتوانستند ادغام شوند (مانند '-vv' برای افزایش سطح جزئیات).
با گذشت زمان، رابط خط فرمان این ابزارهای قدیمی نامنظم و بیش از حد شلوغ شد. بنابراین در نسخه ۱.۲۳ بسته sg3_utils، رابط خط فرمان این ابزارهای قدیمی تغییر یافت تا هم رابط تمیزتر مبتنی بر ()getopt_long و هم رابط قدیمیتر آنها برای سازگاری عقبرو فراهم باشد. بهطور پیشفرض این ابزارهای قدیمیتر از رابط مبتنی بر ()getopt_long استفاده میکنند. تابع ()getopt_long یک افزونه گنو است (یعنی هنوز تأییدیه POSIX ندارد) اما ابزارهای خط فرمان جدیدتر تمایل به استفاده از آن دارند. این رفتار را میتوان با تعریف متغیر محیطی SG3_UTILS_OLD_OPTS یا با استفاده از '-O' یا '--old' به عنوان اولین گزینه خط فرمان لغو کرد. صفحات راهنمای ابزارهای قدیمیتر جزئیات مربوطه را مستند کردهاند.
چندین ابزار در sg3_utils بر پایه دستور dd در یونیکس هستند (مانند sg_dd) و امکان کپی دادهها را در سطح دستورات READ و WRITE در SCSI فراهم میکنند. ابزار sg_dd بهشدت به لینوکس وابسته است و به همین دلیل به سایر سیستمعاملها پورت نشده است. ابزاری عمومیتر (نسبت به sg_dd) به نام ddpt در بستهای با همین نام به سایر سیستمعاملها پورت شده است.
بلوک توصیفگر دستور (COMMAND DESCRIPTOR BLOCK)
این اصطلاح اغلب در توصیف دستورات SCSI به کار میرود و معمولاً به صورت CDB مخفف میشود. دستورات SCSI مانند READ(16) به CDB با اندازه ۱۶ بایت اشاره دارند که برای واکشی دادهها از یک دستگاه ذخیرهسازی استفاده میشود. طولهای متداول CDB برابر با ۶، ۱۰، ۱۲، ۱۶ و ۳۲ بایت است. هر عدد صحیحی در یک CDB که طولانیتر از ۸ بیت (یعنی ۱ بایت) باشد، از نمایش بزرگاندیان (big endian) استفاده میکند.
متغیرهای محیطی (ENVIRONMENT VARIABLES)
متغیر محیطی SG3_UTILS_OLD_OPTS در بخش قبلی توضیح داده شد. این متغیر صرفاً جهت سازگاری عقبرو گزینههای خط فرمان برای ابزارهای قدیمیتر کاربرد دارد.
متغیر محیطی SG3_UTILS_INVOCATION در برخی از ابزارهایی که دادههای زیادی را رمزگشایی میکنند پیادهسازی شده است. هنگامی که SG3_UTILS_INVOCATION تنظیم شده باشد، این ابزارها خطی شامل ۶۰ نویسه "v" را چاپ میکنند. پس از آن نام و نسخه ابزار (که شامل تاریخ نیز هست) و به دنبال آن تفکیک سطر به سطر آرگومانهای خط فرمان که ابزار با آنها فراخوانی شده است نمایش داده میشود. آرگومانهای خط فرمان شامل نام ابزار و گزینهها به همان ترتیبی است که وارد شدهاند. این خروجی به stdout ارسال میشود. این گزینه برای کمک به آزمونهای خودکار ابزارهای این بسته طراحی شده است.
متغیر محیطی SG3_UTILS_DSENSE میتواند روی یک مقدار عددی تنظیم شود. این متغیر تنها توسط SNTL تعبیهشده در کتابخانهای که ابزارهای این بسته از آن استفاده میکنند به کار میرود. SNTL لایه ترجمه SCSI به NVMe است. مقدار پیشفرض این متغیر محیطی 0 است که باعث میشود هر ابزاری که دستور SCSI ارسال کند و آن دستور (توسط SNTL تعبیهشده) به یک دستور NVMe ترجمه شود و در دستگاه NVMe با شکست مواجه گردد، دادههای سنس SCSI را در قالب «fixed» (ثابت) برگرداند. اگر این متغیر مقداری غیر از صفر داشته باشد، سنس SCSI برگرداندهشده در قالب «descriptor» (توصیفگر) خواهد بود.
چندین ابزار تنظیمات متغیر محیطی اختصاصی خود را دارند (مثلاً sg_persist دارای SG_PERSIST_IN_RDONLY است). برای اطلاعات بیشتر به صفحات راهنمای اختصاصی هر ابزار مراجعه کنید.
یک متغیر محیطی ویژه لینوکس به نام SG3_UTILS_LINUX_NANO وجود دارد که در صورت تعریف و در حالتی که درایور sg در سیستم نسخه 4.0.30 یا جدیدتر باشد، مدتزمان اجرای دستورات را به جای میلیثانیه پیشفرض بر حسب نانوثانیه نمایش میدهد. مدتزمان دستورات معمولاً تنها در صورتی نمایش داده میشود که از --verbose به تعداد ۳ بار یا بیشتر استفاده شده باشد. به دلیل یک مشکل رابط (یک عدد صحیح ۳۲ بیتی که با تجربیات بعدی مشخص شد باید ۶۴ بیتی میبود)، حداکثر مدتزمانی که میتوان بر حسب نانوثانیه نمایش داد حدود ۴.۲ ثانیه است. اگر ممکن است مدتزمانهای طولانیتری رخ دهد، این متغیر محیطی را تعریف نکنید (یا تعریف آن را لغو کنید).
نامگذاری دستگاهها در لینوکس (LINUX DEVICE NAMING)
بیشتر دستگاههای بلوکی دیسک نامهایی مانند /dev/sda، /dev/sdb، /dev/sdc و غیره دارند. دیسکهای SCSI در لینوکس همواره چنین نامهایی داشتهاند، اما در هستههای اخیر لینوکس نامگذاری بسیاری از دیسکهای دیگر (از جمله دیسکهای SATA و دستگاههای ذخیرهسازی USB) به این شکل بسیار رایجتر شده است. پارتیشنهای درون یک دیسک با افزودن یک عدد به انتهای نام دستگاه، با شروع از ۱ مشخص میشوند (مانند /dev/sda1).
درایوهای نوار مغناطیسی با /dev/st<num> یا /dev/nst<num> نامگذاری میشوند که در آن <num> از صفر شروع میشود. علاوه بر این، ممکن است یک حرف از این فهرست: "lma" به انتهای نام اضافه شود. درایوهای خواننده (و نویسنده) CD، DVD و BD با /dev/sr<num> نامگذاری میشوند که در آن <num> از صفر شروع میشود. نامهای کمکاربردتری نیز برای انواع دستگاههای SCSI وجود دارند که دستورات dmesg و lsscsi میتوانند برای بررسی اتصال آنها به یک سیستم در حال اجرا کمک کنند.
همچنین یک درایور دستگاه SCSI وجود دارد که دسترسی عمومی جایگزین به دستگاههای SCSI را ارائه میدهد. این درایور از نامهایی به فرم /dev/sg<num> استفاده میکند که در آن <num> از صفر آغاز میشود. دستور «lsscsi -g» میتواند در یافتن این نامها و این که کدام نام عمومی با کدام نام نوع دستگاه متناظر است (مثلاً /dev/sg2 ممکن است متناظر با /dev/sda باشد) مفید واقع شود. در سری هسته لینوکس ۲.۶ یک درایور عمومی SCSI بلوکی معرفی شد و نامهای آن به فرم /dev/bsg/<h:c:t:l> است که در آن h، c، t و l عدد هستند. مجدداً برای یافتن تناظر میان آن تاپل SCSI (یعنی <h:c:t:l>) و نامهای جایگزین دستگاه، به دستور lsscsi مراجعه کنید.
پیش از سری هسته ۲.۶ لینوکس، این ابزارها تنها قادر به استفاده از نامهای عمومی دستگاهها بودند (مانند /dev/sg1). در سری هسته ۲.۶ لینوکس تقریباً در تمامی موارد، هر نام دستگاهی میتواند توسط این ابزارها استفاده شود.
در سری هستههای ۳ و ۴ لینوکس، تغییرات بسیار ناچیزی در نامگذاری دستگاههای لینوکس رخ داده است.
نامگذاری دستگاهها در ویندوز (WINDOWS DEVICE NAMING)
دستگاههای ذخیرهسازی و موارد مرتبط میتوانند در ویندوز چندین نام مختلف داشته باشند. احتمالاً رایجترین آنها نام حجم (volume) است (مانند "D:"). همچنین نامهای دستگاه «کلاس» (class) مانند "PhysicalDrive<n>"، "CDROM<n>" و "TAPE<n>" وجود دارند. در اینجا <n> یک عدد صحیح است که از ۰ شروع شده و با شناسایی (و گاهی شناسایی مجدد) دستگاهها، به ترتیب صعودی تخصیص مییابد.
برخی از دستگاههای ذخیرهسازی دارای یک نام دستگاه سطح پایینتر SCSI هستند که با نام یک آداپتور (شبه) SCSI به فرم "SCSI<n>:" آغاز میشود. به این نام، زیرآدرسدهی به صورت یک شماره «گذرگاه» (bus)، یک شناسه «هدف» (target) و یک LUN (شماره واحد منطقی) افزوده میشود. شماره «گذرگاه» به عنوان «PathId» نیز شناخته میشود. این اجزا در کنار هم نام دستگاهی به فرم: "SCSI<n>:<bus>,<target>,<lun>" را تشکیل میدهند. بخش انتهایی ",<lun>" ممکن است حذف شود که در این صورت مقدار LUN برابر صفر فرض میشود. این نام دستگاه سطح پایینتر اغلب نمیتواند مستقیماً استفاده شود؛ زیرا اگر یک درایور کلاس ادعای مالکیت دستگاه را کرده باشد، ویندوز تلاشها برای استفاده از آن را مسدود میکند. با این حال انواع دستگاههای SCSI وجود دارند (مانند نوع رابط خودکارسازی/درایو) که درایور کلاسی برای آنها وجود ندارد. دستکم دو بستر انتقال (در اصطلاح ویندوز «انواع گذرگاه»): USB و IEEE 1394 فاقد نامهای دستگاه "scsi" به این فرم هستند.
مطابق با قراردادهای سیستمفایل DOS، نامهای مختلف دستگاهها را میتوان با حروف بزرگ، کوچک یا ترکیبی وارد کرد. از آنجا که نوشتن "PhysicalDrive<n>" خستهکننده است، فرم کوتاهشده "PD<n>" توسط تمام ابزارهای این بسته مجاز شناخته شده است.
یک دستگاه منفرد (مانند یک دیسک) میتواند چندین نام داشته باشد. به عنوان مثال: "PD0" میتواند "C:"، "D:" و "SCSI0:0,1,0" نیز باشد. این دو نام حجم نشان میدهند که دو پارتیشن روی دیسک وجود دارد. پارتیشنهای دیسکی که توسط ویندوز شناسایی نمیشوند معمولاً نام حجمی دریافت نمیکنند. با این حال ویندوز ویستا برای دیسکی که هیچ پارتیشن شناختهشدهای روی آن ندارد یک نام حجم نشان میدهد و هنگام انتخاب، از کاربر میخواهد آن را قالببندی (format) کند (که ممکن است برای سایر سیستمعاملها چندان خوشایند نباشد).
این ابزارها فرض میکنند که نام دستگاه مشخصشده در فضای نام دستگاه Win32 قرار دارد. برای صریح ساختن این موضوع، میتوان "\\.\" را به ابتدای نامهای دستگاه ذکرشده در این بخش اضافه کرد. توجه داشته باشید که نویسه بکاسلش در پوستههای شبیه یونیکس و زبان برنامهنویسی C یک نویسه گریز (escape) است. در پوستهای مانند Msys (از MinGW) ممکن است لازم باشد هر بکاسلش دو بار تایپ شود.
ابزار sg_scan موجود در این بسته، نامهای دستگاههای ویندوز را به قالبی فهرست میکند که برای استفاده توسط سایر ابزارهای این بسته مناسب است.
نامگذاری دستگاهها در فریبیاسدی (FREEBSD DEVICE NAMING)
دیسکهای SCSI نامهای بلوکی به فرم /dev/da<num> دارند که در آن <num> یک عدد صحیح با شروع از صفر است. عبارت "da" برای درایوهای نوار مغناطیسی SCSI با "sa" و برای درایوهای CD/DVD/BD تحت SCSI با "cd" جایگزین میشود. هر دستگاه SCSI یک نام دستگاه عبوردهی مستقیم (pass-through) متناظر به فرم /dev/pass<num> دارد که در آن <num> یک عدد صحیح با شروع از صفر است. دستور «camcontrol devlist» ممکن است برای یافتن این که چه نامهای دستگاه SCSI در دسترس هستند و تناظر بین نامهای کلاس و عبوردهی مستقیم مفید باشد.
فریبیاسدی اجازه میدهد نام دستگاهها بدون بخش ابتدایی "/dev/" داده شوند (مانند da0 به جای /dev/da0). این قابلیت در این بسته تا نسخه ۱.۴۳ کار میکرد، اما در آن نسخه نام دستگاه بدون پیشوند (مانند "da0") منجر به خطا میشد. رفتار اولیه (یعنی مجاز بودن نامهای بدون پیشوند) در نسخه ۱.۴۶ بازگردانده شد. همچنین توجه داشته باشید که در صورتی که نام حاصل با "/" شروع نشود، پیوندهای نمادین (به نامهای دستگاه) قبل از اضافه شدن پیشوند "/dev/" دنبال میشوند.
نامگذاری NVMe در فریبیاسدی در حال تحول بوده است. نامگذاری کنترلر همانند لینوکس است: "/dev/nvme<n>" اما فضاهای نام (namespaces) یک "s" اضافی دارند (مانند "/dev/nvme0ns1"). مورد اخیر یک دستگاه بلوکی (GEOM) نیست (به بیان دقیق، فریبیاسدی دستگاه بلوکی ندارد). در ابتدا فریبیاسدی دستگاههای GEOM با نام "/dev/nvd<m>" داشت که مبتنی بر زیرسیستم CAM نبودند. سپس در انتشار ۱۲ فریبیاسدی، یک درایور جدید nda اضافه شد که برای فضاهای نام NVMe مبتنی بر CAM (و GEOM) است و نامهایی مانند "/dev/nda0" دارد. گرههای دستگاه ترجیحی برای این بسته شامل "/dev/nvme0" برای کنترلرهای NVMe و "/dev/nda0" برای فضاهای نام NVMe هستند.
نامگذاری دستگاهها در سولاریس (SOLARIS DEVICE NAMING)
نامهای دستگاههای SCSI در زیر شاخه /dev فرمی شبیه به: c5t4d3s2 دارند که در آن عدد پس از "c" شماره کنترلر (HBA)، عدد پس از "t" شماره هدف (از دوران رابط موازی SCSI) و عدد پس از "d" مقدار LUN است. پس از "s" شماره قطعه (slice) قرار دارد که به یک پارتیشن مربوط میشود و طبق قرارداد، "s2" نمایانگر کل دیسک است.
همچنین OpenSolaris از فرم c5t4d3p2 استفاده میکند که در آن عدد پس از "p" شماره پارتیشن است، به جز "p0" که نشاندهنده کل دیسک میباشد. بنابراین به یک دیسک کامل میتوان به صورت c5t4d3، c5t4d3s2 یا c5t4d3p0 ارجاع داد.
و این نامهای دستگاه در دایرکتوریهای /dev/dsk و /dev/rdsk تکرار شدهاند. مورد اول نام دستگاه بلوکی است و مورد دوم برای دسترسی «خام» (یا دستگاه کاراکتری) به کار میرود که همان چیزی است که sg3_utils به آن نیاز دارد. بنابراین در OpenSolaris دستوری مانند 'sg_inq /dev/rdsk/c5t4d3p0' باید به درستی کار کند. اگر کار نکرد، گزینه '-vvv' را برای اطلاعات اشکالزدایی بیشتر اضافه کنید. امتحان کردن این فرم 'sg_inq /dev/dsk/c5t4d3p0' (توجه کنید "rdsk" به "dsk" تغییر یافته) به خطای "inappropriate ioctl for device" منجر خواهد شد.
نامهای دستگاهها در دایرکتوری /dev معمولاً پیوندهای نمادین به نامهای مکانشناختی (topological) بسیار طولانیتری در دایرکتوری /device هستند. به نظر میرسد در سولاریس با درایوهای cd/dvd/bd مانند دیسک رفتار میشود و بنابراین در دایرکتوری /dev/rdsk یافت میشوند. درایوهای نوار مغناطیسی در دایرکتوری /dev/rmt ظاهر میشوند.
همچنین یک درایور sgen (درایور عمومی SCSI) وجود دارد که بهطور پیشفرض به هیچ دستگاهی متصل نمیشود. برای کنترل دستگاههای متصلشده، فایل /kernel/drv/sgen.conf را ببینید. هر دستگاه متصلشده، نام دستگاهی به فرم /dev/scsi/c5t4d3 خواهد داشت.
فهرست کردن دستگاههای SCSI موجود در سولاریس چالشبرانگیز به نظر میرسد. توصیه «از دستور 'format' استفاده کنید» کار میکند اما روشی بسیار خطرناک برای فهرست کردن دستگاهها به شمار میرود. [هرچند قبل از وارد کردن هرگونه آسیب، مجدداً از کاربر تأیید میگیرد.] دستور 'devfsadm -Cv' موارد نامرتب را در دایرکتوری /dev/rdsk پاکسازی کرده و تنها آنچه فعال و «زنده» است را باقی میگذارد. دستور "cfgadm -v" نیز نویدبخش به نظر میرسد.
پشتیبانی از NVME (NVME SUPPORT)
فناوری NVMe (یا NVM Express) یک بستر انتقال و مجموعه دستور ذخیرهسازی نسبتاً جدید است. سطح انتزاع مجموعه دستورات NVMe تا حدی پایینتر از مجموعههای دستورات SCSI و نزدیکتر به سطح انتزاع مجموعههای دستورات ATA (و SATA) است. NVMe مدعی است که با در نظر گرفتن حافظههای فلش و ذخیرهسازیهای مدرن «حالت جامد» (solid state) طراحی شده است؛ چیزی که در زمان توسعه اولیه SCSI در دهه ۱۹۸۰ ناشناخته بود.
مزیت مجموعههای دستورات SCSI، مدت زمانی طولانی است که مستقر بودهاند و ابزارهای موجود (مانند همین ابزارها) که از آن پشتیبانی میکنند. به علاوه، سطح انتزاع مجموعههای دستورات SCSI هم یک مزیت و هم یک عیب است. اخیراً طراحان رابط مدیریتی NVME-MI تصمیم گرفتند استاندارد خدمات محفظه SCSI موسوم به (SES-3) را «همانطور که هست» به همراه افزودن دو دستور تونلزنی NVME-MI یعنی SES Send و SES Receive به کار بگیرند. این بدان معناست که پس از در نظر گرفتن تفاوتهای رابط سیستمعامل، ابزارهای sg_ses، sg_ses_microcode و sg_senddiag را میتوان روی دستگاه NVMe که از نسخه جدیدتر NVME-MI پشتیبانی میکند استفاده کرد.
دستورات SES Send و SES Receive در NVME-MI به ترتیب با دستورات SEND DIAGNOSTIC و RECEIVE DIAGNOSTIC RESULTS در SCSI مطابقت دارند. با این حال، چند دستور دیگر نیز وجود دارند که باید ترجمه شوند که مهمترین آنها دستور SCSI INQUIRY به دستور Identify controller/namespace در NVMe است. از نسخه ۱.۴۳، این ابزارها حاوی یک SNTL (لایه ترجمه SCSI به NVMe) کوچک هستند تا به این جزئیات رسیدگی کند.
به عنوان یکی از پیامدهای این «دستکاری»، اگر از ابزار sg_inq (بدون گزینه --page=) روی یک DEVICE مبتنی بر NVMe استفاده شود، پاسخهای واقعی شناسهگذار NVMe (کنترلر و احتمالاً فضای نام) رمزگشایی و چاپ میشوند. اما اگر برای همان DEVICE دستور 'sg_inq --page=sinq <device>' اجرا شود، بخشهایی از پاسخ Identify کنترلر و فضای نام NVMe به یک پاسخ استاندارد SCSI INQUIRY ترجمه شده که سپس رمزگشایی و چاپ میشود.
به جز حالت خاص ابزار sg_inq، تمامی ابزارهای دیگر این بسته فرض میکنند که در حال تعامل با یک دستگاه SCSI هستند و هر پاسخی را بر همان اساس رمزگشایی میکنند. یک راه آسان برای کاربران جهت تشخیص این که دستگاه زیرین یک دستگاه NVMe است، فیلد Vendor Identification در پاسخ استاندارد INQUIRY با مقدار "NVMe " (یک رشته به طول ۸ نویسه با ۴ فاصله در سمت راست) است.
دستورات SCSI زیر در حال حاضر توسط کتابخانه SNTL پشتیبانی میشوند: INQUIRY، MODE SELECT(10)، MODE SENSE(10)، READ(10,16)، READ CAPACITY(10,16)، RECEIVE DIAGNOSTIC RESULTS، REQUEST SENSE، REPORT LUNS، REPORT SUPPORTED OPERATION CODES، REPORT SUPPORTED TASK MANAGEMENT FUNCTIONS، SEND DIAGNOSTICS، START STOP UNIT، SYNCHRONIZE CACHE(10,16)، TEST UNIT READY، VERIFY(10,16)، WRITE(10,16) و WRITE SAME(10,16).
وضعیت خروج (EXIT STATUS)
به منظور کمک به اسکریپتهایی که این ابزارها را فراخوانی میکنند، وضعیت خروج برای نشان دادن موفقیت (۰) یا شکست (۱ یا بیشتر) تنظیم شده است. توجه داشته باشید که برخی از مقادیر پایینتر با مقادیر کلید سنس (sense key) در SCSI مطابقت دارند.
مقادیر وضعیت خروج فهرستشده در زیر را میتوان به صورت زیر به ابزار sg_decode_sense (که در این بسته موجود است) داد:
sg_decode_sense --err=<exit_status>
و یک رشته توضیحی کوتاه در stdout چاپ خواهد شد.
مقادیر وضعیت خروج عبارتند از:
- 0
- موفقیت. همچنین برای برخی از ابزارهایی استفاده میشود که مایلند یک مقدار بولی برای حالت «درست» (true) برگردانند (و اینکه خطایی رخ نداده است). حالت «نادرست» (false) با وضعیت خروج ۳۶ منتقل میشود.
- 1
- خطای نحوی (syntax error). گزینههای غیرمجاز در خط فرمان، گزینههایی با آرگومانهای نامعتبر یا ترکیبی از گزینهها که مجاز نیست.
- 2
- دستگاه (DEVICE)
گزارش
میدهد که
برای
عملیات
درخواستی
آماده نیست.
ممکن است DEVICE
در حال
آماده شدن
باشد (مثلاً
در حال دور
گرفتن
موتور اما
نه در
حداکثر
سرعت)،
بنابراین
ابزار ممکن
است پس از
کمی انتظار
کار کند. در
لینوکس
ممکن است DEVICE
در حین
انجام
بازیابی از
خطا موقتاً
مسدود شده
باشد.
مقادیر وضعیت خروج ۱۲، ۱۳ و ۱۶ را در زیر ببینید که این مقدار خروج را دقیقتر تفکیک میکنند. - 3
- دستگاه (DEVICE) یک خطای رسانه یا سختافزار (یا blank check) را گزارش میدهد. برای مثال، تلاش برای خواندن یک بلوک آسیبدیده روی یک دیسک این مقدار را ایجاد خواهد کرد.
- 5
- دستگاه (DEVICE) یک «درخواست غیرمجاز» (illegal request) با کد سنس اضافی به جز «کد عملیات دستور نامعتبر» گزارش میدهد. این حالت اغلب مربوط به یک دستور پشتیبانیشده است که فیلدی از آن برای درخواستی پشتیبانینشده تنظیم شده باشد. برای دستوراتی که نیازمند فیلد «اقدام سرویس» (service action) هستند، این مقدار میتواند نشان دهد که دستور با آن مقدار اقدام سرویس پشتیبانی نمیشود.
- 6
- دستگاه (DEVICE) وضعیت «توجه واحد» (unit attention) را گزارش میدهد. این معمولاً نشان میدهد رخدادی نامرتبط با دستور درخواستی اتفاق افتاده است (مثلاً بازنشانی دستگاه)، که احتمالاً پیش از ارسال دستور فعلی SCSI رخ داده است. دستور درخواستی توسط دستگاه اجرا نشده است. توجه داشته باشید که شرایط unit attention معمولاً تنها یک بار توسط دستگاه گزارش میشوند.
- 7
- دستگاه (DEVICE) کلید سنس «حفاظت از داده» (data protect) را گزارش میدهد. این بدان معناست که سازوکاری نوشتن (یا احتمالاً همه دسترسیها به رسانه) را مسدود کرده است.
- 9
- دستگاه (DEVICE) یک درخواست غیرمجاز با کد سنس اضافی «کد عملیات دستور نامعتبر» (invalid command operation code) گزارش میدهد که نشان میدهد از دستور درخواستی پشتیبانی نمیکند.
- 10
- دستگاه (DEVICE) وضعیت «کپی لغوشده» (copy aborted) را گزارش میدهد. این متضمن آن است که دستور دیگری یا مشکلی در دستگاه، یک عملیات کپی را متوقف کرده است. خانواده دستورات EXTENDED COPY (از جمله WRITE USING TOKEN) ممکن است این کلید سنس را برگردانند.
- 11
- دستگاه (DEVICE) یک دستور لغوشده (aborted command) را گزارش میدهد. در برخی موارد دستورات لغوشده را میتوان بلافاصله دوباره تلاش کرد (مثلاً اگر بستر انتقال دستور را به دلیل تراکم لغو کرده باشد).
- 12
- دستگاه (DEVICE) کلید سنس آماده نبودن (not ready) را همراه با یک کد سنس اضافی «درگاه هدف در حالت آمادهباش» (target port in standby state) گزارش میدهد.
- 13
- دستگاه (DEVICE) کلید سنس آماده نبودن را همراه با یک کد سنس اضافی «درگاه هدف در حالت غیرقابل دسترس» (target port in unavailable state) گزارش میدهد.
- 14
- دستگاه (DEVICE) کلید سنس عدم تطابق (miscompare) را گزارش میدهد. دستورات VERIFY و COMPARE AND WRITE ممکن است این مقدار را گزارش کنند.
- 15
- ابزار قادر به باز کردن، بستن یا استفاده از DEVICE دادهشده یا فایل دیگری نیست. نام فایل ارائهشده ممکن است نادرست باشد یا مشکلات مجوز و دسترسی وجود داشته باشد. افزودن گزینه '-v' ممکن است اطلاعات بیشتری ارائه دهد.
- 16
- دستگاه (DEVICE) یک کد سنس NOT READY را با یک کد سنس اضافی 0x4 و یک مقدار توصیفی که متن آن حاوی "in progress" (در حال انجام) است گزارش میدهد. این موارد شامل: Format in progress، Rebuild in progress، Sanitize in progress و Depopulation in progress هستند. یک استثنا [0x2, 0x4, 0x1a] است که عبارت است از: LU not ready, Start stop unit command in progress. این حالت بر اساس این فرض است که SSU باید در ۳۰ ثانیه یا کمتر تکمیل شود. بیشتر سایر پیامهای "in progress" ممکن است نشاندهنده انتظاری چند ده ساعته باشند. در بیشتر موارد دستور 'sg_requests --progress DEVICE' باید مشخص کند که این انتظار چقدر خواهد بود.
- 17
- یک کد سنس «درخواست غیرمجاز» (Illegal request) در SCSI همراه با پرچمی دریافت شده که نشان میدهد فیلد Info معتبر است. این فیلد اغلب یک LBA است اما معنای آن به نوع دستور بستگی دارد.
- 18
- دستگاه (DEVICE) یک خطای رسانه یا سختافزار (یا blank check) را همراه با پرچمی گزارش میدهد که نشان میدهد فیلد Info معتبر است. این فیلد اغلب LBA (اولین خطای رخداده) است اما معنای آن به نوع دستور بستگی دارد.
- 19
- دستگاه (DEVICE) یک درخواست غیرمجاز با کد سنس اضافی «فیلد نامعتبر در فهرست پارامترها» (invalid field in parameter list) گزارش میدهد. فهرست پارامترها دادههای اضافی هستند که برای برخی دستورات (مانند FORMAT UNIT) به DEVICE ارسال میشوند.
- 20
- دستگاه (DEVICE) گزارش میدهد که دارای وضعیت بررسی (check condition) اما «فاقد سنس» (no sense) و اطلاعات غیرصفر در کدهای سنس اضافی خود است. برخی از دستورات مبتنی بر سرکشی (مانند REQUEST SENSE) میتوانند این پاسخ را دریافت کنند. ممکن است اطلاعات مفیدی در دادههای سنس مانند نشانه پیشرفت وجود داشته باشد.
- 21
- دستگاه (DEVICE) یک «خطای بازیابیشده» (recovered error) را گزارش میدهد. دستور درخواستی موفقیتآمیز بوده است. به احتمال زیاد ابزار خطای بازیابیشده را به stderr گزارش میدهد و ادامه میدهد، و احتمالاً وضعیت خروج ابزار برابر با 0 خواهد بود.
- 22
- دستگاه (DEVICE) گزارش میدهد که دستور فعلی یا پارامترهای آن متضمن یک آدرس بلوک منطقی (LBA) خارج از محدوده است. این حالت بهطور شگفتآوری اغلب هنگام تلاش برای دسترسی به آخرین بلوک روی یک دستگاه ذخیرهسازی رخ میدهد؛ یا یک خطای منطقی کلاسیک «یکی پس و پیش» (off by one) یا خواندن نادرست پاسخ READ CAPACITY(10 or 16) که در آن آدرس آخرین بلوک به جای تعداد بلوکهای موجود روی DEVICE بازگردانده میشود. از آنجا که مبنای LBAها از صفر است، دامنه آنها از 0 تا n-1 است که n تعداد بلوکهای روی DEVICE است؛ بنابراین LBA آخرین بلوک یکی کمتر از کل تعداد بلوکها است.
- 24
- دستگاه (DEVICE) وضعیت SCSI «تداخل رزرو» (reservation conflict) را گزارش میدهد. این بدان معناست که دسترسی به DEVICE با دستور فعلی مسدود شده است زیرا ماشین دیگری (HBA یا «آغازگر» SCSI) روی این DEVICE رزرو دارد. در سیستمهای مدرن SCSI این امر مربوط به استفاده از خانواده دستورات PERSISTENT RESERVATION است.
- 25
- دستگاه (DEVICE) وضعیت SCSI «شرط برآورده شد» (condition met) را گزارش میدهد. در حال حاضر تنها دستور PRE-FETCH (به SBC-4 مراجعه کنید) این وضعیت را ایجاد میکند.
- 26
- دستگاه (DEVICE) وضعیت SCSI «مشغول» (busy) را گزارش میدهد. SAM-6 این وضعیت را به این صورت تعریف میکند که واحد منطقی موقتاً قادر به پردازش یک دستور نیست. توصیه میشود دستور مجدداً صادر شود.
- 27
- دستگاه (DEVICE) وضعیت SCSI «مجموعه وظایف پر است» (task set full) را گزارش میدهد.
- 28
- دستگاه (DEVICE) وضعیت SCSI «وفاداری مشروط خودکار فعال است» (ACA active) را گزارش میدهد. ACA مخفف "auto contingent allegiance" است و به ندرت استفاده میشود.
- 29
- دستگاه (DEVICE) وضعیت SCSI «وظیفه لغو شد» (task aborted) را گزارش میدهد. SAM-5 میگوید: «این وضعیت زمانی بازگردانده میشود که دستوری توسط یک دستور یا تابع مدیریت وظیفه در یک پیوند I_T دیگر لغو شود و بیت TAS در صفحه حالت Control روی یک تنظیم شده باشد».
- 31
- خطای مربوط به دو یا چند گزینه در خط فرمان. این گزینهها ممکن است متناقض باشند، حالتی پشتیبانینشده را انتخاب کنند، یا یک گزینه الزامی (با توجه به زمینه) وجود نداشته باشد.
- 32
- یک خطای منطقی در ابزار وجود دارد. این خطا با توضیحات درون کد مانند "shouldn't/can't get here" مطابقت دارد. شاید بهتر باشد نویسنده برنامه مطلع شود.
- 33
- مهلت زمانی دستور ارسالشده به DEVICE به پایان رسیده است (timed out).
- 34
- این وضعیت خروج مختص ویندوز است و نشان میدهد که شماره خطای ویندوز (۳۲ بیتی) را نمیتوان بهطور معنادار به یک شماره خطای معادل یونیکس که به عنوان وضعیت خروج (۷ بیتی) بازگردانده میشود، نگاشت کرد.
- 35
- یک خطای بستر انتقال (transport error) رخ داده است. این خطا یا در درایور (مثلاً درایور HBA) یا در اتصال داخلی میان میزبان (آغازگر) و دستگاه (هدف) است. برای مثال در SAS یک بسطدهنده ممکن است با کمبود مسیر مواجه شود و در نتیجه نتواند دادههای کاربر را از دستور READ بازگرداند.
- 36
- هیچ خطایی رخ نداده است و علاوه بر آن ابزار میخواهد مقدار بولی نادرست (false) را منتقل کند. مقدار درست متناظر با وضعیت خروج 0 منتقل میشود.
- 40
- دستور ارسالشده به DEVICE یک کلید سنس «دستور لغوشده» با کد سنس اضافی 0x10 دریافت کرده است. این مقدار مربوط به مشکلات مربوط به اطلاعات حفاظت (PI یا DIF) است. برای مثال، اگر درایوی با حفاظت نوع ۱، ۲ یا ۳ قالببندی شده باشد، این خطا ممکن است هنگام خواندن بلوکی رخ دهد که هرگز روی آن نوشته نشده است (یا نگاشت نشده است).
- 41
- دستور ارسالشده به DEVICE یک کلید سنس «دستور لغوشده» با کد سنس اضافی 0x10 (همانند کد خطا) به علاوه پرچمی دریافت کرده است که نشان میدهد فیلد Info معتبر است.
- 47
- خطای فراخوانی سیستمی flock (در یونیکس).
- 48
- این یک پیام داخلی است که نشان میدهد فیلد وضعیت (SF) در NVMe پس از اجرای یک دستور غیر از صفر است (یعنی مشکلی رخ داده است). کار در این زمینه در حال حاضر تجربی است.
- 49
- درایور سطح پایین مقدار غیرمعقولی را برای شمارش باقیمانده یک پاسخ (یعنی تعداد بایتهایی که در واقع توسط HBA دریافت شده برابر است با 'requested_bytes - residual_count') گزارش میدهد.
- 50
- فراخوانیهای
سیستمی
سیستمعامل
که با شکست
مواجه
میشوند
اغلب یک عدد
صحیح کوچک
را برای کمک
برمیگردانند.
در یونیکس
به اینها
مقادیر "errno"
گفته
میشود که
در آن 0
نشاندهنده
نبود خطا
است. این
کدهای خطا
بازه ۵۱ تا
۹۶ را برای
نگاشت این
مقادیر errno
اختصاص
دادهاند
اما این
ممکن است
کافی نباشد.
مقادیر
بالاتر errno که
قابل نگاشت
نیستند،
همگی به این
مقدار (یعنی
۵۰) نگاشت
میشوند.
توجه داشته باشید که مقدار errno برابر با 0 به کد خطای 0 نگاشت میشود. - 50 + <os_error_number>
- فراخوانیهای
سیستمی
سیستمعامل
که با شکست
مواجه
میشوند،
اغلب یک عدد
صحیح کوچک
را برای کمک
به مشخص شدن
نوع خطا
برمیگردانند.
برای مثال
در یونیکس،
ناتوانی یک
فراخوانی
سیستمی در
تخصیص
حافظه (در 'errno')
مقدار ENOMEM را
برمیگرداند
که اغلب با
عدد صحیح ۱۲
همراه است.
بنابراین
ممکن است در
این حالت
مقدار ۶۲
(یعنی '50 + 12')
توسط یک
ابزار
بازگردانده
شود. همچنین
ممکن است یک
ابزار در
این بسته
هنگامی که
نتواند
حافظه
تخصیص دهد،
مقدار 50+ENOMEM را
گزارش کند،
بدون اینکه
لزوماً
ناشی از
فراخوانی
سیستمی
سیستمعامل
باشد. در
نسخههای
اخیر
لینوکس،
فایلی که
نگاشت میان
ثوابت
نمادین
(مانند ENOMEM) و
عدد صحیح
متناظر را
نشان
میدهد در
فایل کد
منبع هسته
قرار دارد:
include/uapi/asm-generic/errno-base.h
توجه داشته باشید که مقادیر errno بزرگتر یا مساوی ۴۷ نمیتوانند در محدوده ارائهشده قرار گیرند. در عوض، همانطور که در مدخل قبلی بررسی شد، همگی به ۵۰ نگاشت میشوند. - 97
- پاسخ یک دستور SCSI در بررسیهای سلامت دادهها (sanity checks) ناموفق بود.
- 98
- دستگاه (DEVICE) گزارش میدهد که یک وضعیت بررسی (check condition) دارد اما خطا در هیچیک از دستهبندیهای بالا نمیگنجد.
- 99
- هر خطایی که نتوان آن را در مقادیر ۱ تا ۹۸ دستهبندی کرد ممکن است این مقدار را تولید کند. این شامل خطاهای بستر انتقال و سیستمعامل پس از ارسال دستور به دستگاه میشود.
- 100-125
- این کدهای خطا توسط ابزار ddpt استفاده میشوند که از کتابخانه sg3_utils استفاده میکند. اینها عمدتاً کدهای خطای تخصصی مرتبط با رونوشتهای برونسپاریشده (offloaded copies) هستند.
- 126
- ابزار پیدا شد اما قابل اجرا نبود. این حالت ممکن است زمانی رخ دهد که فایل اجرایی دسترسیهای اجرا را نداشته باشد.
- 127
- این وضعیت خروج برای حالتی است که ابزار پیدا نشده است. این حالت ممکن است زمانی رخ دهد که یک اسکریپت ابزاری در این بسته را فراخوانی میکند اما متغیر محیطی PATH بهدرستی تنظیم نشده است، بنابراین اسکریپت نمیتواند فایل اجرایی را پیدا کند.
- 128 + <signum>
- اگر سیگنالی ابزاری را متوقف کند، وضعیت خروج برابر با ۱۲۸ به علاوه شماره سیگنال خواهد بود. برای مثال اگر یک خطای نقض حافظه (segmentation fault) رخ دهد، ابزار معمولاً توسط SIGSEGV متوقف میشود که بر اساس 'man 7 signal' شماره سیگنال متناظر با آن ۱۱ است؛ بنابراین وضعیت خروج ۱۳۹ خواهد بود.
- 255
- ابزار تلاش کرده است وضعیت خروج ۲۵۵ یا بزرگتر را تولید کند. این اتفاق نباید رخ دهد؛ در اینجا صرفاً برای کامل بودن فهرست ذکر شده است.
بیشتر شرایط خطای گزارششده در بالا تکرارپذیر خواهند بود (نمونهای از موارد غیرقابل تکرار "unit attention" است)، بنابراین میتوان ابزار را مجدداً با گزینه '-v' (یا چند بار استفاده از آن) برای کسب اطلاعات بیشتر اجرا کرد.
گزینههای رایج (COMMON OPTIONS)
آرگومانهای گزینههای بلند برای گزینههای کوتاه نیز الزامی هستند. در فرم کوتاه، آرگومان یک گزینه از صفر یا چند فاصله به عنوان جداکننده استفاده میکند (یعنی در فرم کوتاه از «=» به عنوان جداکننده استفاده نمیشود).
اگر گزینهای یک آرگومان عددی بگیرد، آن آرگومان دهدهی فرض میشود مگر اینکه خلاف آن مشخص شده باشد (مثلاً با پیشوند "0x"، پسوند "h" یا همانطور که در پیام راهنمای دستور ذکر شده است).
برخی از گزینهها بهطور یکنواخت در بیشتر ابزارهای این بسته استفاده میشوند. این گزینهها در زیر فهرست شدهاند. توجه داشته باشید که برخی استثناها نیز وجود دارد.
- -d, --dry-run
- ابزارهایی
که
میتوانند
باعث از دست
رفتن یا
رونویسی
حجم زیادی
از
دادههای
کاربر
شوند، گاهی
دارای
گزینه --dry-run
هستند.
اقدامات
تغییردهنده
دستگاه
معمولاً
دور زده (یا
نادیده
گرفته)
میشوند تا
سیاست
«آسیب
نرساندن»
اعمال شود.
این امر
امکان
آزمایش
فراخوانیهای
پیچیده خط
فرمان را
پیش از
انجام عمل
درخواستی
(مانند
قالببندی
یک دیسک)
فراهم
میسازد.
گزینه --dry-run به
یک ویژگی
رایج در
بسیاری از
ابزارهای
خط فرمان
تبدیل شده
است (مانند
دستور 'patch' در
یونیکس)، نه
فقط
ابزارهای
این بسته.
توجه داشته باشید که بیشتر نامهای دارای خط تیره در این بسته میتوانند به جای خط تیره با زیرخط (underscore) نیز مشخص شوند (مانند --dry_run). - -e, --enumerate
- برخی از ابزارها (مانند sg_ses و sg_vpd) اطلاعات زیادی را در جدولهای داخلی ذخیره میکنند. این گزینه آن اطلاعات را در قالبی خوانا (مثلاً مرتبشده بر اساس یک کوتهنوشت یا شماره صفحه) چاپ کرده و سپس خارج میشود. توجه داشته باشید که با این گزینه، DEVICE نادیده گرفته میشود (مانند بیشتر گزینههای دیگر) و هیچ ورودی/خروجی SCSI انجام نمیگیرد، بنابراین فراخواننده نیازی به مجوزهای ارتقایافته ندارد.
- -h, -?, --help
- پیام راهنمای استفاده را چاپ کرده و سپس خارج میشود. در چند ابزار قدیمیتر، گزینه '-h' خروجی هگزادسیمال را درخواست میکند. در این موارد، گزینه '-?' پیام راهنما را چاپ کرده و خارج میشود.
- -H, --hex
- برای
دستورات SCSI
که پاسخی
غیرجزئی
دارند، آن
پاسخ را به
صورت
مجموعهای
از
بایتهای
هگزادسیمال
ASCII چاپ
میکند. در
صورت
استفاده
یکباره،
۱۶ بایت در
هر سطر چاپ
میشود که
با یک آدرس
نسبی با
شروع از 0
(هگز)
پیشوندگذاری
شده است. در
صورت دو بار
استفاده،
نمایش ASCII آن
۱۶ بایت به
انتهای هر
سطر الحاق
میشود و
نویسههای
غیرقابل
چاپ با یک
«.» جایگزین
میگردند.
در صورت سه
بار
استفاده،
تنها ۱۶
بایت هگز در
هر سطر چاپ
میشود
(بنابراین
نه پیشوند
آدرس و نه
بخش ASCII الحاق
نخواهد شد).
برای تولید
هگزادسیمالی
که بتواند
توسط سایر
ابزارها
تجزیه شود،
از این
گزینه سه،
چهار یا پنج
بار
استفاده
کنید.
استفاده از این گزینه، بهویژه در صورت تکرار، با گذشت زمان و با افزایش کاربرد آن (دستکم در آزمایش و رفع خطاها) تکامل یافته است. بنابراین توضیحات این گزینه را در صفحه راهنمای ابزار مورد استفاده بررسی کنید. نمونهای از یک حالت خاص با گزینه '-HHH' در ابزار sg_inq و صفحه ATA Information VPD است. ابزار sg_inq پاسخ دستور ATA IDENTIFY DEVICE را رمزگشایی نمیکند، بلکه کلمات ۱۶ بیتی هگزادسیمال (little endian) مناسب برای رمزگشایی توسط ابزار hdparm را در خروجی چاپ میکند. - -i, --in=FN
- بسیاری از
دستورات SCSI
حجم قابل
توجهی از
دادهها را
دریافت
میکنند (که
در بافر data-in
بازگردانده
میشود) و
چندین
ابزار از
این بسته
آنها را
رمزگشایی
میکنند
(مانند sg_vpd و sg_logs).
برای تفکیک
دو مرحله
دریافت
دادهها از
دستگاه SCSI و
سپس
رمزگشایی
آن، این
گزینه
اضافه شده
است. مرحله
اول (دریافت
دادهها) را
میتوان با
استفاده از
گزینه --hex یا
--raw و هدایت
خروجی خط
فرمان به یک
فایل انجام
داد (اغلب
با «<» در
سیستمعاملهای
مبتنی بر
یونیکس
انجام
میشود).
تفاوت میان
--hex و --raw در
این است که
گزینه اول
خروجی را در
قالب
هگزادسیمال
ASCII تولید
میکند در
حالی که --raw
خروجی خود
را به صورت
باینری
«خام»
تولید
مینماید.
مرحله دوم (یعنی رمزگشایی دادههای پاسخ SCSI که اکنون در یک فایل نگهداری میشوند) را میتوان با استفاده از این گزینه --in=FN انجام داد که در آن نام فایل FN است. اگر برای FN از «-» استفاده شود، ورودی استاندارد (stdin) فرض میشود که این نیز امکان تغییر مسیر یا لولهکشی (piping) در خط فرمان را فراهم میآورد. فرض میشود آن فایل (یا stdin) حاوی هگزادسیمال ASCII است مگر اینکه گزینه --raw نیز ارائه شده باشد که در این صورت باینری در نظر گرفته میشود. توجه داشته باشید که معنای گزینه --raw هنگام استفاده با --in=FN برای عمل روی ورودی تغییر میکند، در حالی که معمولاً روی دادههای خروجی عمل میکند.
از آنجا که ساختار دادههای بازگرداندهشده توسط دستورات SCSI بهطور قابل توجهی متفاوت است، اطلاعات کاربرد یا صفحه راهنمای ابزار مورد استفاده باید بررسی شود. در برخی موارد ممکن است لازم باشد از --hex چندین بار استفاده شود (و راحتتر است که به صورت '-HH' یا '-HHH' وارد شود). - -i, --inhex=FN
- این گزینه عملکرد یکسان یا مشابهای با --in=FN دارد. و شاید 'inhex' توصیفیتر باشد چرا که بهطور پیشفرض، هگزادسیمال ASCII در محتویات فایل FN انتظار میرود. به عنوان جایگزین، فرم کوتاه این گزینه ممکن است -I یا -X باشد. برای اطلاعات بیشتر بخش «قالبهای هگزادسیمال، باینری و JSON» را در زیر ببینید.
- --json[=JO]
- خروجی
پیشفرض
بیشتر
ابزارهایی
که اطلاعات
بازگرداندهشده
از
دستگاههای
SCSI را
رمزگشایی
میکنند
برای
خوانایی
انسان
طراحی شده
است. گاهی
اوقات
قالبی از
خروجی که
برای
رایانه
قابل
تجزیهتر
باشد مورد
نیاز است و JSON
روشی محبوب
برای این
کار محسوب
میشود.
تنها
ابزارهایی
که حجم قابل
توجهی از
دادههای SCSI
را
رمزگشایی
میکنند از
این گزینه
پشتیبانی
مینمایند.
گزینه کوتاه متناظر معمولاً -j[JO] است اما اگر -j قبلاً استفاده شده باشد ممکن است -J[JO] باشد. توجه داشته باشید که در همه حالات، آرگومان JO به خودی خود اختیاری است. برای اطلاعات بیشتر به صفحه راهنمای sg3_utils_json مراجعه کنید. - -J, --js-file=JFN
- خروجی در
قالب JSON است و
به فایلی با
نام JFN
ارسال
میشود. اگر
آن فایل
وجود داشته
باشد،
محتوای آن
کوتاه و
بازنویسی
(truncate) میشود.
بهطور
پیشفرض،
خروجی JSON به
خروجی
استاندارد
(stdout) ارسال
میشود.
هنگامی که این گزینه ارائه شود، گزینه --json[=JO] ضمنی است و نیازی به وارد کردن آن نیست. گزینه --json[=JO] همچنان ممکن است برای تنظیم پارامتر JO روی مقادیری غیر از پیشفرض مورد نیاز باشد. - -m, --maxlen=LEN
- چندین
دستور مهم SCSI
(مانند INQUIRY و MODE SENSE)
دارای طول
پاسخ
متغیری
هستند که به
عوامل
متعددی
بستگی دارد
و این
ابزارها
تنها برخی
از آنها را
در نظر
میگیرند.
حداکثر طول
پاسخ
معمولاً در
فیلد 'allocation length'
(طول تخصیص)
در cdb مشخص
میشود. در
صورت نبود
این گزینه،
چندین
ابزار از یک
طول تخصیص
پیشفرض (که
گاهی در
پیشنویس
استانداردهای
SCSI توصیه شده)
یا یک
راهبرد
«واکشی
دوگانه» (double fetch)
استفاده
میکنند.
برای شرح
راهبرد
واکشی
دوگانه به
sg_logs(8) مراجعه
کنید. این
روشها
بینقص
نیستند و در
مواجهه با
اهداف
معیوب SCSI
میتوانند
باعث ایجاد
مشکلاتی
شوند (به
عنوان مثال
برخی از
دستگاههای
ذخیرهسازی
حجیم USB در
صورت
دریافت طول
تخصیص INQUIRY غیر
از ۳۶ قفل
میکنند).
همچنین
استفاده از
این گزینه،
هرگونه
راهبرد
واکشی
دوگانه را
که در غیر
این صورت
استفاده
میشد،
غیرفعال
میکند.
برای جلوگیری از دستهای از خطاهای انحطاطی، اگر LEN کمتر از ۱۶ باشد نادیده گرفته میشود (معمولاً با یک پیام هشدار) و مقدار پیشفرض به جای آن استفاده میشود. برخی از ابزارها به جای ۱۶ از ۴ (بایت) به عنوان مقدار آستانه استفاده میکنند. - -r, --raw
- بسیاری از دستورات SCSI دادههای ورودی 'data-in' تولید میکنند (یعنی دادههایی که از واحد منطقی LU به سمت آغازگر مانند HBA حرکت میکنند). دستورات SCSI INQUIRY و READ نمونههایی از این موارد هستند. این گزینه باعث میشود هرگونه رمزگشایی دادههای دریافتی نادیده گرفته شود و در عوض دادهها به صورت باینری به stdout ارسال شوند. در صورت تولید هرگونه پیام خطا یا هشدار، معمولاً به stderr ارسال میشوند تا با خروجی این گزینه تداخلی ایجاد نکنند.
- به عنوان جایگزین، گزینه --in=FN باعث میشود DEVICE نادیده گرفته شود و دادههای پاسخ (جهت رمزگشایی) از فایلی با نام FN واکشی شوند. در این موارد این گزینه ممکن است نشان دهد که دادههای باینری میتوانند از stdin یا از یک فایل مشخصشده (مانند FN) خوانده شوند.
- -t, --timeout=SECS
- ابزارهایی
که دستورات
بالقوه
طولانیمدت
SCSI را صادر
میکنند
اغلب دارای
یک گزینه
--timeout=SECS هستند.
این گزینه
معمولاً به
سیستمعامل
دستور
میدهد که
در صورت
پایان مهلت
زمانی،
دستور SCSI
مورد نظر را
لغو کند.
لغو
دستورات SCSI
معمولاً
کاری دشوار
و دردسرساز
است و در
مورد
دستوراتی
مانند
قالببندی
ممکن است
دستگاه را
در وضعیت
«قالببندی
آسیبدیده»
(format corrupt) رها کند
که نیازمند
ارسال
دستور
طولانیمدت
دیگری جهت
راهاندازی
مجدد است.
آرگومان SECS
معمولاً بر
حسب ثانیه
است و فرم
کوتاه این
گزینه ممکن
است چیزی
غیر از -t
باشد، زیرا
گزینه مهلت
زمانی
معمولاً
بعداً و با
افزایش
ظرفیت
دستگاههای
ذخیرهسازی
و
طولانیتر
شدن
دستورات
راهاندازی
اضافه شد.
از آنجا که
بسیاری از
ابزارها
قبل از
معرفی این
گزینه
دارای
مهلتهای
زمانی
داخلی
نسبتاً
طولانی
بودند،
مهلت زمانی
واقعی
دستور که به
سیستمعاملها
داده
میشود،
مقدار
بزرگتر
بین مهلت
زمانی
داخلی و SECS
است.
بسیاری از دستورات طولانیمدت SCSI دارای یک بیت IMMED در CDB هستند که باعث میشود دستور نسبتاً سریع برگردد اما عملیات درخواستی فقط آغاز شده باشد و تکمیل نشده باشد. در چنین مواردی میتوان از دستور REQUEST SENSE برای نظارت بر پیشرفت از طریق فیلد نشانگر پیشرفت آن استفاده کرد (به ابزارهای sg_requests و sg_turs مراجعه کنید). ابزارهایی که چنین دستورات SCSI را ارسال میکنند دارای یک گزینه --immed یا یک گزینه --wait هستند که معکوس منطقی عمل «immediate» است. ارسال یک دستور دسترسی به داده SCSI به دستگاهی که مشغول انجام یک دستور طولانیمدت SCSI (در پسزمینه) است معمولاً یک کلید سنس NOT READY با کد سنس اضافی 0x04 و یک کد توصیفگر دریافت میکند که نشان میدهد دستگاه در حال انجام چه عملیات طولانیمدتی است.
یک فرم گزینه بلند جایگزین --tmo=SECS است. - -v, --verbose
- افزایش سطح جزئیات (یعنی خروجی اشکالزدایی). میتواند چندین بار برای افزایش بیشتر جزئیات استفاده شود. خروجی اضافی ایجادشده توسط این گزینه تقریباً همیشه به stderr ارسال میشود.
- -V, --version
- چاپ رشته نسخه و سپس خروج. هر ابزار شماره نسخه و تاریخ آخرین تغییر کد اختصاصی خود را دارد.
- --
- مشابه بسیاری از دستورات یونیکس، این ابزارها گزینه '--' را میپذیرند تا نشان دهند هر آنچه بعد از آن نقطه در خط فرمان میآید یک آرگومان است و یک گزینه نیست. این موضوع زمانی اهمیت پیدا میکند که نام فایلی با نویسه «-» شروع شود. انجام چنین کاری ایده خوبی نیست اما لغزش انگشتان رخ میدهد و اتفاقات ناخواسته میافتند.
آرگومانهای عددی (NUMERIC ARGUMENTS)
بسیاری از ابزارها دارای گزینههای خط فرمانی هستند که آرگومانهای عددی میپذیرند. این آرگومانهای عددی میتوانند مقادیر بزرگی باشند (مانند یک آدرس بلوک منطقی (LBA) روی یک دیسک) و وارد کردن آنها در قالب دهدهی پیشفرض ممکن است ناخوشایند باشد. بنابراین نمایشهای مختلف دیگری مجاز دانسته شدهاند.
پسوندهای ضربکننده پذیرفته میشوند. آنها رشتههای یک، دو یا سه حرفی هستند که مستقیماً به انتهای عددی که به آن اعمال میشوند اضافه میگردند:
c C *1 w W *2 b B *512 k K KiB *1024 KB kB *1000 m M MiB *1048576 MB mB *1000000 g G GiB *(2^30) GB gB *(10^9) t T TiB *(2^40) TB *(10^12) p P PiB *(2^50) PB *(10^15)
یک مثال، "2k" برای مقدار ۲۰۴۸ است. پسوندهای بزرگ ترا و پتا تنها برای آرگومانهای عددی در دسترس هستند که ممکن است در ساختار داخلی برای نمایش به ۶۴ بیت نیاز داشته باشند.
این پسوندهای ضربکننده با دستور dd در گنو (از سال ۲۰۰۲) سازگار هستند که مطابقت با SI و IEC 60027-2 را اعلام میکند.
یک پسوند به فرم "x<n>" عدد قبلی را در <n> ضرب میکند. یک مثال، "2x33" برای مقدار "66" است. آرگومان سمت چپ نمیتواند '0' باشد زیرا '0x' به عنوان پیشوند عدد هگزادسیمال تفسیر خواهد شد (زیر را ببینید). آرگومان سمت چپ ضرب باید به یک رقم هگزادسیمال (یعنی 0 تا f) ختم شود و کل عبارت نباید حاوی هیچگونه فاصله خالی باشد. یک مثال عجیب: "0xfx0x2" برای مقدار ۳۰.
یک پسوند به فرم "+<n>" عدد قبلی را با <n> جمع میکند. یک مثال، "3+1k" برای مقدار "1027" است. آرگومان سمت چپ جمع باید به یک رقم هگزادسیمال (یعنی 0 تا f) ختم شود و کل عبارت نباید حاوی هیچگونه فاصله خالی باشد. مثال دیگر: "0xf+0x2" برای مقدار ۱۷.
به عنوان جایگزین، آرگومانهای عددی میتوانند در قالب هگزادسیمال وارد شوند. دو ساختار نحوی وجود دارد: عدد میتواند با پیشوندهای "0x" یا "0X" همانند زبان برنامهنویسی C آغاز شود. دومین نمایش هگزادسیمال، یک پسوند "h" یا "H" در انتهای عدد است، همانطور که در استانداردهای ذخیرهسازی دیده میشود. هنگامی که اعداد به صورت هگزادسیمال وارد میشوند، نمیتوان از ضرایب استفاده کرد. به عنوان مثال مقدار دهدهی "256" میتواند به صورت "0x100" یا "100h" وارد شود.
قالبهای هگزادسیمال، باینری و JSON (HEX, BINARY AND JSON FORMATS)
هر دو قالب هگزادسیمال (ASCII) و باینری میتوانند به عنوان خروجی سطح پایین پاسخهای SCSI استفاده شوند که امکان هدایت آنها به یک فایل و رمزگشایی در فراخوانیهای بعدی وجود دارد. خروجی JSON معمولاً پس از رمزگشایی تولید میشود و یک خروجی سطح بالا در نظر گرفته میشود که ممکن است توسط ابزاری دیگر تجزیه شود. هیچ ابزاری در sg3_utils نمیتواند JSON را به عنوان ورودی تجزیه کند.
خروجی JSON در صفحه راهنمای اختصاصی آن شرح داده شده است، ببینید: sg3_utils_json(8).
خروجی باینری و بهویژه هگزادسیمال میتوانند دو نقش داشته باشند: برای مشاهده فوری (مثلاً هنگام اشکالزدایی) یا به عنوان خروجی قابل تجزیه که بعداً رمزگشایی شود. اقدام دوم از گزینه --inhex=FN استفاده میکند. برای مشاهده خروجی هگزادسیمال (مثلاً از یک پاسخ دستور SCSI) گزینه --hex میتواند یک یا دو بار استفاده شود. هر دو خروجی مشابهای با این دستور دارند:
$ hexdump --no-squeezing -C
هنگامی که
یک گزینه
منفرد --hex
استفاده
میشود،
نمایش ASCII در
سمت راست هر
سطر نشان
داده
نمیشود؛
هنگامی که
دو بار
استفاده
شود، نمایش
ASCII نشان داده
میشود.
هنگامی که
گزینه --hex سه
بار یا
بیشتر
استفاده
شود، فرض بر
این است که
بعداً
تجزیه
خواهد شد.
تنها
بایتهای
داده
هگزادسیمال،
حداکثر تا
۱۶ بایت در
هر سطر
خروجی داده
میشوند.
این شبیه به
این
فراخوانی hexdump
است:
$ hexdump --no-squeezing -C | cut -s -d ' ' -f 2-19
این دستور باید ستون اول (یعنی شمارش) و نمایش ASCII در سمت راست را حذف کند. این کار تجزیه هگزادسیمال را بسیار آسانتر میکند. هنگامی که ۴ بار یا بیشتر استفاده شود، گزینههای --hex توضیحاتی اضافه میکنند (یعنی خطوطی که با نماد هش '#' شروع میشوند):
$ sg_logs -HHHH -A /dev/sdc # Supported log pages log page [0x0]: 00 00 00 03 00 0d 2f # Supported log pages and subpages log page [0x0, 0xff]: 40 ff 00 0e 00 00 00 ff 0d 00 0d 01 0d ff 2f 00 2f ff ...
توضیحات همچنین میتوانند پس از مقادیر هگز در یک سطر قرار گیرند؛ هر چیزی از '#' تا پایان سطر نادیده گرفته میشود.
نمونههای زیادی از فایلهای هگز مناسب برای گزینه --inhex=FN در دایرکتوری 'inhex' وجود دارد. نامگذاری فایلها در آن دایرکتوری به این صورت است که پیشوند «sg_» از نام ابزاری که آن را رمزگشایی میکند حذف شده و پسوند «.hex» اضافه شده است. این فایلهای هگز را میتوان با یک ویرایشگر متن مشاهده کرد و بیشتر آنها در نظرات ابتدایی خود حاوی یک مثال از نحوه فراخوانی هستند.
قالب هگزادسیمال را میتوان با استفاده از ابزار sg_decode_sense با این گزینهها به باینری تبدیل کرد: «--inhex=HFN --nodecode --write=WFN». ورودی (به صورت هگز) در فایل HFN قرار دارد در حالی که خروجی در فایل WFN قرار میگیرد.
برای تبدیل یک فایل باینری به فرم هگزادسیمال که بتواند به عنوان ورودی به ابزارهای مختلف sg3_utils داده شود، میتوان از ابزار sg_decode_sense با این گزینهها نیز استفاده کرد: «--binary=BFN --nodecode -HHH» و خروجی هگز به کنسول (stdout) ارسال خواهد شد.
میکروکد و میانافزار (MICROCODE AND FIRMWARE)
دو روش استاندارد برای بارگیری میکروکد (یعنی میانافزار دستگاه) روی یک دستگاه SCSI وجود دارد. روش عمومیتر استفاده از دستور SCSI WRITE BUFFER است، به ابزار sg_write_buffer مراجعه کنید. محفظههای SCSI روش اختصاصی خود را بر پایه صفحه تشخیصی کنترل/وضعیت بارگیری میکروکد دارند، به ابزار sg_ses_microcode مراجعه کنید.
اسکریپتها، مثالها و ابزارها (SCRIPTS, EXAMPLES and UTILS)
چندین اسکریپت پوسته بش (bash) در زیرشاخه 'scripts' وجود دارند که ابزارهای کامپایلشده را فراخوانی میکنند (مانند sg_readcap). نام چندین مورد از این اسکریپتها به جای 'sg_' با 'scsi_' شروع میشود. یکی از اهداف این اسکریپتها فراخوانی یک ابزار یکسان (مانند sg_readcap) روی چندین دستگاه است. بیشتر ابزارهای کامپایلشده پایه، تنها یک دستگاه را به عنوان آرگومان میپذیرند. برخی از توزیعها این اسکریپتها را در دایرکتوریهای عمومیتری نصب میکنند (مانند /usr/bin). برخی از این اسکریپتها دارای مدخل صفحه راهنما (man) هستند. فایل README موجود در زیرشاخه 'scripts' را ببینید.
چندین نمونه کد زبان C به علاوه نمونههایی از فراخوانیهای پیچیده در زیرشاخه 'examples' وجود دارد. همچنین یک فایل README در آنجا قرار دارد. کد نمونه C ممکن است نمونه سادهتری از نحوه استفاده از عبوردهی مستقیم (pass-through) در SCSI در لینوکس نسبت به ابزارهای اصلی (موجود در زیرشاخه 'src') باشد. دلیل این امر لایههای انتزاعی کمتر است (به عنوان مثال نگران این نیستند که MinGW در ویندوز ممکن است فایلی را به جای حالت باینری در حالت متنی باز کند).
برخی از ابزارهایی که نویسنده آنها را مفید یافته است در زیرشاخه 'utils' قرار داده شدهاند.
اشکالزدایی (DEBUGGING)
هر ابزار و بیشتر اسکریپتها دارای یک گزینه --verbose (فرم کوتاه: -v) هستند که میتواند چندین بار برای افزایش میزان جزئیات خروجی جهت کمک به اشکالزدایی استفاده شود. خروجی عادی (در صورت وجود) به stdout ارسال میشود در حالی که خروجی پرجزئیات (و خروجی خطا) به stderr فرستاده میشود. این امر هنگامی که (خروجی عادی) یک ابزار به دستوری دیگر لولهکشی میشود (مثلاً دستور grep برای یافتن فیلدی خاص در خروجی) میتواند حائز اهمیت باشد.
زیرسیستم SCSI در لینوکس دارای یک شبهفایل برای دریافت و تغییر سطح ثبت لاگ SCSI است: /proc/sys/dev/scsi/logging_level . اسکریپت scsi_logging_level در این بسته میتواند برای دستکاری سطح ثبت لاگ به روشی آسان در خط فرمان استفاده شود. به صفحه راهنمای آن مراجعه کنید.
سطح ثبت لاگ از 0 (بدون ثبت لاگ و حالت پیشفرض) تا 7 (ثبت لاگ بسیار زیاد) متغیر است و به تمام دستگاههای ذخیرهسازی که از زیرسیستم SCSI استفاده میکنند اعمال میشود. خروجی لاگ به «لاگ سیستم» ارسال میشود که اغلب فایل /var/log/syslog است.
درایور عمومی SCSI در لینوکس (sg) اغلب در زیربنای ابزارهای این بسته استفاده میشود. این درایور از نوع ثبت لاگی موسوم به SCSI_LOG_TIMEOUT استفاده میکند که در غیر این صورت به ندرت به کار میرود. نمونهای از کاربرد آن برای فعالسازی کامل اشکالزدایی:
scsi_logging_level -s -T 7
برای کاهش حجم خروجی تنها به مسیرهای بروز خطا، دستور زیر پیشنهاد میشود:
scsi_logging_level -s -T 3
و برای خاموش کردن ثبت لاگ در درایور sg:
scsi_logging_level -s -T 0
برای تحلیل و بررسی فروپاشیهای سیستم مرتبط با یک دستور SCSI، هیچ چیز جایگزین یک درگاه سریال واقعی نمیشود. منظور از «واقعی» این است که یک درگاه سریال USB نیست. دلیل آن این است که پورت USB نیز مانند SCSI نیازمند یک پشته نرمافزاری فعال درون هسته سیستمعامل است؛ دقیقاً همان چیزی که در زمان فروپاشی سیستم ممکن است از کار بیفتد.
لپتاپهای مدرن فاقد درگاه سریال واقعی هستند و بسیاری از سرورها نیز آن را ندارند (یا به عنوان یک گزینه اضافی اختیاری است). در لینوکس، ماژول netconsole با ارسال ورودیهای لاگ به ماشینی دیگر (روی همان زیرشبکه) با استفاده از پروتکل شبکه UDP («ارسال و فراموشی») کارایی بسیار مناسبی ارائه میدهد.
وبسایت (WEB SITE)
یک صفحه وب برای بحث درباره این بسته در آدرس https://sg.danny.cz/sg/sg3_utils.html و همچنین در https://doug-gilbert.github.io/sg3_utils.html وجود دارد. نامگذاری دستگاههای مورداستفاده توسط این بسته در سیستمعاملهای مختلف در آدرس: https://sg.danny.cz/sg/device_name.html بررسی شده است. یک مخزن آینهای در گیت در آدرس https://github.com/hreinecke/sg3_utils قرار دارد. مخزن اصلی کد از subversion استفاده میکند و روی تجهیزات شخصی نویسنده قرار دارد. نویسنده این تغییرات را از طریق شماره بازنگری subversion که یک عدد صحیح افزایشی است دنبال میکند (که در حال حاضر برای این بسته روی ۹۲۲ است). مخزن آینهای گیتهاب بهطور دورهای از مخزن نویسنده بهروزرسانی میشود. بسته به زمان بهروزرسانی، بخش بارگیریها در sg.danny.cz ممکن است بهروزتر از آینه گیتهاب باشد.
نویسندگان (AUTHORS)
نوشتهشده توسط Douglas Gilbert. برخی از ابزارها توسط دیگران مشارکت شدهاند، فایل CREDITS و فایلهای منبع اختصاصی (در دایرکتوری 'src') را ببینید.
گزارش اشکالات (REPORTING BUGS)
گزارش اشکالات و خطاها را به <dgilbert at interlog dot com> ارسال کنید.
حق نشر (COPYRIGHT)
حق نشر ©
۱۹۹۹-۲۰۲۶ Douglas
Gilbert
برخی از
ابزارها
تحت مجوز GPL
نسخه ۲
توزیع
شدهاند،
در حالی که
برخی دیگر،
که معمولاً
جدیدتر
هستند، تحت
مجوز BSD-2-Clause
قرار دارند.
فایلهایی
که در
تقریباً
تمام
ابزارها
مشترک
هستند و
بنابراین
حاوی
بیشترین
کدهای قابل
استفاده
مجدد
میباشند،
یعنی sg_lib.[hc]،
sg_cmds_basic.[hc] و sg_cmds_extra.[hc] تحت
مجوز BSD-2-Clause
هستند.
هیچگونه
ضمانتی
وجود
ندارد؛ حتی
برای
قابلیت
فروش یا
تناسب با یک
هدف خاص.
همچنین ببینید (SEE ALSO)
sg3_utils_json, sg_decode_sense(sg3_utils), sdparm(sdparm),
ddpt(ddpt), lsscsi(lsscsi), dmesg(1), mt(1), hdparm(hdparm),
hexdump(util-linux)
قالب این
بخش به این
صورت است:
<utility_name>(<package_containing_utility>) یا
<utility_name>(<manpage_section_number_containing_utility>)
.
| 2026-07-18 | sg3_utils-1.49 |