SG_DECODE_SENSE(8) SG3_UTILS SG_DECODE_SENSE(8)

sg_decode_sense - رمزگشایی داده‌های حسگر SCSI و داده‌های مرتبط

sg_decode_sense [--binary=BFN] [--cdb] [--err=ES] [--file=HFN] [--help] [--hex] [--inhex=HFN] [--ignore-first] [--json[=JO]] [--js-file=JFN] [--nodecode] [--nospace] [--status=SS] [--verbose] [--version] [--write=WFN] [H1 H2 H3 ...]

این ابزار، داده‌های حسگر (sense data) در SCSI را به صورت باینری یا به عنوان دنباله‌ای از بایت‌های هگزادسیمال اسکی (ASCII hexadecimal) دریافت کرده و آن‌ها را رمزگشایی می‌کند. مرجع اصلی این رمزگشایی استانداردهای SPC-5 ANSI INCITS 502-2020 و جدیدترین پیش‌نویس SPC-6 ویرایش ۶ است که می‌تواند در نشانی https://www.t10.org و دیگر بخش‌های اینترنت یافت شود.

داده‌های حسگر SCSI اغلب در فایل‌های لاگ هسته (kernel log) در نتیجه بروز خطا یا به عنوان یک هشدار اطلاعاتی یافت می‌شوند. این داده‌ها معمولاً به صورت دنباله‌ای از بایت‌های هگزادسیمال نمایش داده می‌شوند که با 70، 71، 72، 73، f0 یا f1 آغاز می‌شوند. داده‌های حسگر می‌توانند تا ۲۵۲ بایت طول داشته باشند اما به طور معمول بسیار کوتاه‌تر از آن هستند؛ طول ۱۸ بایت معمولاً مشاهده می‌شود و غالباً با قالب قدیمی‌تر داده‌های حسگر «ثابت» (fixed) مرتبط است.

داده‌های حسگر را می‌توان در خط فرمان یا درون یک فایل مشخص کرد. اگر در خط فرمان ارائه شوند، داده‌های حسگر باید دنباله‌ای از بایت‌های هگزادسیمال باشند که با فاصله (space) از هم جدا شده‌اند. همچنین می‌توان فایلی را مشخص کرد که محتوای آن بایت‌های باینری یا هگزادسیمال اسکی باشد. در حالت دوم، فایل می‌تواند شامل چندین خط باشد که هر خط شامل هیچ، یک یا چند بایت هگزادسیمال اسکی است که با فاصله (کاما یا تب) جدا شده‌اند. نماد هشتگ (#) نیز ممکن است در خط وجود داشته باشد که در این صورت، خود نماد و ادامه آن خط نادیده گرفته می‌شوند؛ این ویژگی برای درج توضیحات (کامنت) مفید است.

اگر گزینه --cdb داده شود، به‌جای در نظر گرفتن آرگومان‌های هگز به عنوان داده‌های حسگر، به عنوان یک بلوک توصیف‌گر دستور SCSI (یا همان CDB) در نظر گرفته می‌شوند. در این حالت، نام دستور در خروجی چاپ می‌شود. این نام بر پایه نخستین بایت هگز داده‌شده (معروف به opcode یا کد عملیات) و به صورت اختیاری بر اساس فیلد دیگری به نام «service action» (اقدام سرویس) تعیین می‌شود.

عملکرد جایگزین دیگر زمانی است که گزینه --err=ES داده شود. در این حالت، فرض می‌شود ES مقدار «وضعیت خروج» بین ۰ و ۲۵۵ از یکی از ابزارهای موجود در این بسته است. سپس یک رشته توصیفی چاپ می‌شود. سایر گزینه‌ها، به جز --verbose، نادیده گرفته می‌شوند.

هنگامی که گزینه --nodecode داده شود، می‌توان از این ابزار برای تبدیل یک فایل باینری به هگزادسیمال یا برعکس استفاده کرد. داده‌های تبدیل‌شده نیازی ندارند به داده‌های حسگر SCSI یا CDBها مربوط باشند.

آرگومان‌های گزینه‌های طولانی برای گزینه‌های کوتاه نیز الزامی هستند.

داده‌ها به صورت باینری از فایلی به نام BFN خوانده می‌شوند. این گزینه را نمی‌توان همراه با --file=HFN یا --inhex=HFN استفاده کرد چرا که با یکدیگر در تضاد هستند. فرض می‌شود که داده‌ها از نوع داده‌های حسگر هستند، مگر اینکه گزینه --nodecode مشخص شده باشد.
رشته آرگومان‌های هگز ارائه‌شده را به عنوان بایت‌های یک CDB در SCSI در نظر می‌گیرد و نام دستور را رمزگشایی می‌کند.
مقدار ES باید یک مقدار «وضعیت خروج» بین ۰ و ۲۵۵ باشد که پس از پایان کار ابزار از طریق پوسته (یعنی محیط اجرای ابزار) در دسترس است. به صورت پیش‌فرض، یک پیام خطای توصیفی در خروجی استاندارد (stdout) چاپ می‌شود؛ و اگر گزینه --verbose یک بار (یا تعداد فردی از دفعات) داده شود، پیام به جای آن در خطای استاندارد (stderr) چاپ می‌گردد. اگر --verbose دو بار یا بیشتر داده شود، قالب طولانی‌تری از پیام در خروجی نمایش داده می‌شود. در تمام موارد، طول پیام کمتر از ۱۲۸ کاراکتر است و یک نویسه سرخط (line feed) در انتهای آن قرار دارد. تمام گزینه‌ها و آرگومان‌های دیگر خط فرمان نادیده گرفته می‌شوند.
داده‌های حسگر به صورت هگزادسیمال اسکی از فایلی به نام HFN خوانده می‌شوند. داده‌های حسگر باید به صورت دنباله‌ای از بایت‌ها باشند که با فاصله، کاما، تب، خط تیره یا خط جدید از هم جدا شده‌اند. هر چیزی از نماد هشتگ (#) تا انتهای آن خط نادیده گرفته می‌شود. اگر گزینه --nospace تنظیم شده باشد، نیازی به جداکننده میان ارقام هگزادسیمال اسکی در HFN نیست و بایت‌ها از جفت‌رقم‌های هگزادسیمال اسکی رمزگشایی می‌شوند.
پیام راهنمای استفاده را نمایش داده و خارج می‌شود.
این گزینه یک بار در ترکیب با --write=WFN استفاده می‌شود تا خروجی نوشته‌شده در WFN را به خطوطی از بایت‌های هگز اسکی مناسب برای کامپایلر زبان C تغییر دهد. هر خط شامل حداکثر ۱۶ بایت است (برای نمونه خطی که با "0x3b,0x07,0x00,0xff" شروع می‌شود).
در سایر موارد (یعنی هنگامی که --write=WFN داده نشده باشد، یا این گزینه بیش از یک بار داده شود) خروجی مطابق توضیحات صفحه راهنمای sg3_utils(8) خواهد بود.
ترکیب --inhex=HFN و سه بار استفاده از این گزینه می‌تواند برای تبدیل بایت‌های هگزادسیمال (مثلاً جداشده با خط تیره) به قالبی منظم‌تر مفید باشد. شکل کوتاه این گزینه برای سه بار فراخوانی آن مناسب‌تر است (مانند '-HHH').
عملکردی مشابه با --file=HFN دارد. این گزینه برای سازگاری با سایر ابزارهای این بسته که دارای گزینه --inhex= هستند اضافه شده است.
بسیاری از برنامه‌هایی که بایت‌های هگز را در خروجی نمایش می‌دهند (مانند 'hexdump -C')، یک شمارنده پیوسته (یا نمایه/شاخص) در ستون نخست هر خط دارند. این گزینه نخستین مقدار هگزادسیمال در هر خط را نادیده می‌گیرد. این گزینه در صورتی که گزینه‌های --binary=BFN یا --nospace داده شده باشند هیچ تاثیری ندارد. خطوط خالی و هر کاراکتری از نویسه "#" به بعد در یک خط نادیده گرفته می‌شوند. استفاده از این گزینه همراه با گزینه‌های --file=HFN و --nodecode کاربردی است.
خروجی به جای قالب متن ساده، در قالب JSON خواهد بود. توجه داشته باشید که آرگومان‌های هر دو شکل کوتاه و بلند اختیاری هستند و در صورت وجود با "=" آغاز می‌شوند و هیچ فاصله خالی در اطراف این "=" مجاز نیست.
برای دریافت خلاصه به صفحه راهنمای sg3_utils_json مراجعه کنید یا از '?' برای JO استفاده نمایید.
خروجی در قالب JSON خواهد بود و به فایلی به نام JFN فرستاده می‌شود. اگر آن فایل از قبل وجود داشته باشد، محتوای آن پاک (کوتاه/truncate) می‌شود. به صورت پیش‌فرض، خروجی JSON به stdout فرستاده می‌شود.
هنگامی که این گزینه داده شود، گزینه --json[=JO] به صورت ضمنی فعال تلقی شده و نیازی به ذکر آن نیست. ممکن است همچنان به گزینه --json[=JO] برای تنظیم پارامتر JO روی مقادیری غیر از پیش‌فرض نیاز باشد.
داده‌های داده‌شده را به عنوان داده‌های حسگر یا cdb رمزگشایی نمی‌کند. زمانی که داده‌های دلخواه ارائه شده باشند (مانند هنگام تبدیل هگز به باینری یا برعکس) کاربردی است.
انتظار دارد هگزادسیمال اسکی، رشته‌ای از ارقام هگزادسیمال بدون هیچ فاصله‌ای میان آن‌ها باشد. بایت‌ها با در نظر گرفتن هم‌زمان دو رقم هگزادسیمال رمزگشایی می‌شوند، بنابراین تعداد زوجی از ارقام مورد انتظار است. رشته ارقام هگزادسیمال می‌تواند در خط فرمان باشد (به جای "H1 H2 H3") یا در چندین خط در فایل HFN ارائه‌شده به --file= پخش شده باشد. در خط فرمان، فاصله‌ها (یا سایر نویسه‌های فاصله خالی) میان دنباله‌های ارقام هگزادسیمال نادیده گرفته می‌شوند؛ حداکثر طول رشته هگز خط فرمان ۱۰۲۳ کاراکتر است.
که در آن SS مقدار بایت وضعیت SCSI است که به صورت هگزادسیمال داده می‌شود. بایت وضعیت SCSI با داده‌های حسگر مرتبط است، اما از آن متمایز می‌باشد.
افزایش سطح پرگویی (پیام‌های اشکال‌زدایی).
نمایش رشته نگارش و خروج.
داده‌های حسگر را در فایلی به نام WFN می‌نویسد. در صورت لزوم، WFN ایجاد می‌شود. اگر WFN از قبل وجود داشته باشد، پیش از نوشتن داده‌های حسگر، محتوای آن پاک (کوتاه/truncate) می‌شود. اگر گزینه --hex نیز داده شده باشد، هگز اسکی در WFN نوشته می‌شود (توضیحات گزینه --hex را ببینید)؛ در غیر این صورت داده‌های باینری در WFN نوشته می‌شوند. این گزینه تسهیل‌کننده است و می‌تواند در تبدیل نمایش هگزادسیمال اسکیِ داده‌های حسگر (یا هر چیز دیگر) به داده‌های باینری معادل یا قالبی از هگز اسکی قابل‌کامپایل مفید باشد.

برخلاف بیشتر ابزارهای موجود در این بسته، این ابزار به دستگاه SCSI (واحد منطقی یا LUN) دسترسی پیدا نمی‌کند. این ابزار به کتابخانه‌ای مرتبط با این بسته دسترسی دارد. در میان وظایف دیگر، این کتابخانه داده‌های حسگر SCSI را رمزگشایی می‌کند.

ابزار sg_raw دنباله‌ای از هگزادسیمال اسکی را دریافت می‌کند که نشان‌دهنده یک CDB در SCSI است. هنگامی که گزینه '-vvv' به sg_raw داده شود، تلاش خواهد کرد نام CDB را رمزگشایی کند.

استفاده از ترکیب گزینه‌های "--inhex=HFN --nodecode --write=WFN" می‌تواند برای تبدیل هگزادسیمال (تولیدشده توسط این ابزار و سایر ابزارهای این بسته) به باینری به کار رود، به گونه‌ای که فایل خروجی WFN خواهد بود.

برخلاف بسیاری از ابزارهای دیگر، هیچ گزینه --raw وجود ندارد. با این حال داده‌های باینری را می‌توان با استفاده از گزینه --binary=BFN وارد کرد، و داده‌های باینری را می‌توان با گزینه --write=WFN (در نبود گزینه --hex) در خروجی نوشت.

داده‌های حسگر اغلب در لاگ‌های هسته و گاهی در صورت استفاده از فلگ‌های پرگویی (verbose) یا اشکال‌زدایی در خط فرمان چاپ می‌شوند. طول آن‌ها دست‌کم ۸ بایت و غالباً ۱۸ بایت خواهد بود، اما ممکن است بیشتر باشد. یک رشته داده‌های حسگر ممکن است شبیه این باشد:

f0 00 03 00 00 12 34 0a  00 00 00 00 11 00 00 00
00 00

آن را پس از دستور sg_decode_sense جای‌گذاری (paste) کنید:

sg_decode_sense f0 00 03 00 00 12 34 0a 00 00 00 00 11 00 00 00 00 00

و برای این داده‌های حسگر، خروجی باید به این شکل باشد:

Fixed format, current;  Sense key: Medium Error
Additional sense: Unrecovered read error
 Info fld=0x1234 [4660]

برای خطای Medium Error، فیلد Info همان نشانی بلوک منطقی (LBA) از کم‌شماره‌ترین بلوکی است که دستور SCSI مربوطه قادر به خواندن (بررسی یا نوشتن) آن نبوده است.

برای تبدیل داده‌های باینری دلخواه به هگز، به طوری که برای تجزیه توسط سایر ابزارهای sg3_utils مناسب باشد. در این حالت از گزینه --nodecode استفاده می‌شود:

sg_decode_sense -N -i vpd_zbdc.hex -w vpd_zbdc.bin

گزینه '-HHH' داده‌های هگز را به شکلی مناسب برای سایر ابزارهای این بسته در کنسول (stdout) چاپ می‌کند تا به عنوان ورودی تجزیه شوند. همچنین از sg_decode_sense می‌توان برای تبدیل هگز دلخواه به باینری با این دستور استفاده کرد:

sg_decode_sense -N -b vpd_zbdc.raw -HHH

توجه داشته باشید که ابزارهایی مانند hexdump و od یک شمارنده (یعنی نمایه‌ای که از 0 آغاز می‌شود) در ابتدای هر خط قرار می‌دهند که هنگام تجزیه هگز دردسرساز است. گزینه(های) '-HHH' این شمارنده آغازین را در هر خط نمایش نمی‌دهد.

وضعیت خروج sg_decode_sense در صورت موفقیت‌آمیز بودن برابر 0 است. در غیر این صورت به صفحه راهنمای sg3_utils(8) مراجعه کنید.

نوشته‌شده توسط Douglas Gilbert.

گزارش باگ‌ها به <dgilbert at interlog dot com>.

حق نشر © 2010-2022 Douglas Gilbert
این نرم‌افزار تحت مجوز BSD-2-Clause توزیع شده است. هیچ ضمانتی وجود ندارد؛ حتی برای قابلیت تجاری یا مناسب بودن برای یک هدف خاص.

sg_requests,sg_raw(sg3_utils)

مه 2023 sg3_utils-1.48