WRITE AND VERIFY(8) SG3_UTILS WRITE AND VERIFY(8)

sg_write_verify - ارسال دستور WRITE AND VERIFY در پروتکل SCSI به دستگاه

sg_write_verify [--16] [--bytchk=BC] [--dpo] [--group=GN] [--help] [--ilen=ILEN] [--in=IF] --lba=LBA [--num=NUM] [--repeat] [--timeout=TO] [--verbose] [--version] [--wrprotect=WP] DEVICE

ارسال یک دستور SCSI WRITE AND VERIFY (۱۰ بایتی یا ۱۶ بایتی) به دستگاه DEVICE. داده‌ای که باید نوشته شود از فایل IF خوانده می‌شود یا در صورت نبود آن، از یک بافر پر از بایت‌های 0xff استفاده خواهد شد. طول بافر خروجی داده ارسالی با دستور به میزان ILEN بایت است، یا در صورتی که این گزینه داده نشود، برابر با طول فایل IF در نظر گرفته می‌شود.

عملیات نوشتن روی رسانه فیزیکی DEVICE (و در صورت تمایل روی حافظه نهان آن) با شروع از آدرس بلوک منطقی LBA به تعداد NUM بلوک منطقی انجام می‌شود. پس از انجام نوشتن روی رسانه، یک عملیات اعتبارسنجی (verify) رخ می‌دهد که می‌توان آن را به عنوان یک خواندن از رسانه (همراه با بررسی‌های لازم) در نظر گرفت بدون آن‌که داده‌ها به برنامه بازگردانده شوند. علاوه بر این، اگر BC روی یک تنظیم شده باشد، داده‌های بازخوانی‌شده از رسانه در عملیات بررسی، با بافر خروجی داده اولیه مقایسه می‌شوند.

رابطه بین تعداد بلوک‌های منطقی مورد نظر برای نوشتن (یعنی NUM) و طول (به بایت) بافر خروجی داده (یعنی ILEN) را می‌توان به سادگی با ضرب کردن مورد اول در اندازه بلوک منطقی به دست آورد. با این حال، اگر DEVICE دارای اطلاعات محافظتی (PI) باشد، این موضوع کمی پیچیده‌تر می‌شود. بنابراین محاسبه آن بر عهده کاربر گذاشته شده و در صورت نبود فایل IF، مقدار پیش‌فرض ILEN برابر با NUM * 512 تنظیم می‌شود.

برای ارسال مقادیر زیادی از داده به بلوک‌های منطقی پیوسته، ارسال یک دستور واحد WRITE AND VERIFY ممکن است به دلیل محدودیت‌های سیستم‌عامل مناسب نباشد. در چنین مواردی به بخش تکرار در زیر مراجعه کنید.

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

ارسال یک دستور WRITE AND VERIFY(16). پیش‌فرض ارسال دستور WRITE AND VERIFY(10) است، مگر اینکه LBA یا NUM برای نسخه ۱۰ بایتی بسیار بزرگ باشند.
که در آن BC مقداری است که در فیلد BYTCHK دستور قرار می‌گیرد. مقادیر بین 0 تا 3 (شامل هر دو) پذیرفته می‌شوند. مقدار پیش‌فرض 0 است که به معنای انجام صرفاً یک نوشتن روی رسانه و سپس عملیات اعتبارسنجی است. تنها مقدار دیگری که در حال حاضر توسط T10 تعریف شده 1 است که یک مقایسه اضافی بین بافر خروجی داده مورد استفاده در نوشتن و محتویات بلوک‌های منطقی بازخوانی‌شده از رسانه انجام می‌دهد.
تنظیم بیت DPO (غیرفعال‌سازی واکشی صفحه) در دستور. پیش‌فرض این است که این بیت پاک باشد.
که در آن GN مقداری است که در فیلد GROUP NUMBER دستور قرار می‌گیرد. مقادیر بین 0 تا 63 (شامل هر دو) پذیرفته می‌شوند. مقدار پیش‌فرض 0 است.
چاپ راهنمای نحوه استفاده و سپس خروج.
که در آن ILEN تعداد بایت‌هایی است که در بافر داده خروجی قرار می‌گیرد. اگر فایل IF داده شود، حداکثر تا ILEN بایت از آن فایل خوانده می‌شود. اگر فایل IF شامل ILEN بایت نباشد، یک خطا گزارش می‌شود. اگر فایل IF مشخص نشده باشد، یک بافر خروجی با ILEN بایت از مقدار 0xff ارسال خواهد شد.
خواندن داده‌ها (باینری) از فایلی به نام IF. اگر IF برابر با "-" باشد، ورودی استاندارد (stdin) استفاده می‌شود. این داده‌ها به بافر خروجی داده تبدیل شده و روی رسانه DEVICE نوشته خواهند شد. اگر BC برابر 1 باشد، این بافر داده خروجی تا پس از عملیات اعتبارسنجی نگه‌داشته شده و با داده بازخوانی‌شده از رسانه مقایسه می‌شود.
که در آن LBA آدرس بلوک منطقی برای شروع نوشتن روی رسانه است. پیش‌فرض در مبنای ۱۰ فرض می‌شود مگر اینکه با '0x' شروع شده یا به 'h' ختم شود. وارد کردن این گزینه الزامی است.
که در آن NUM تعداد بلوک‌هایی است که از LBA آغاز شده و روی رسانه نوشته می‌شوند. مقدار پیش‌فرض برای NUM برابر 1 است.
این گزینه اجرای دستورات WRITE AND VERIFY را تا زمان اتمام داده‌های فایل IF ادامه می‌دهد. این گزینه نیازمند مشخص بودن هر دو گزینه --ilen=ILEN و --in=IF است. هر دستور از آدرس بلوک منطقی بعدی آغاز شده و حداکثر برای NUM بلوک اجرا می‌شود. آخرین دستور ممکن است با تنظیم مناسب تعداد بلوک‌ها کوتاه‌تر باشد. اگر بایت‌های باقی‌مانده‌ای وجود داشته باشد، یک هشدار به stderr ارسال می‌شود. به بخش تکرار مراجعه کنید.
که در آن TO مقدار مهلت زمانی دستور برحسب ثانیه است. مقدار پیش‌فرض ۶۰ ثانیه است. اگر مقدار NUM بزرگ باشد، تکمیل دستور ممکن است به زمان بسیار بیشتری از ۶۰ ثانیه نیاز داشته باشد.
افزایش درجه جزئیات (پیام‌های اشکال‌زدایی).
چاپ رشته نسخه برنامه و سپس خروج.
تنظیم فیلد WRPROTECT در cdb به مقدار WP. مقدار پیش‌فرض 0 است که به معنای عدم ارسال اطلاعات محافظتی (همراه با داده کاربر) در بافر خروجی داده است.

برای حجم داده‌های در حدود یک مگابایت و بیشتر، به دلیل محدودیت‌های سیستم‌عامل (برای نمونه، رابط‌های عبور مستقیم یا pass-through در SCSI اغلب میزان داده‌ای را که می‌توان با یک دستور SCSI انتقال داد محدود می‌کنند) ممکن است ارسال چندین دستور SCSI WRITE AND VERIFY مناسب باشد. در این ابزار، سازوکار انجام این کار گزینه --repeat است.

در این حالت گزینه‌های --ilen=ILEN و --in=IF باید مشخص شوند. مقادیر ILEN و NUM به عنوان پارامترهای اختصاصی هر دستور SCSI در نظر گرفته می‌شوند. حداکثر تا ILEN بایت به طور مداوم از فایل IF خوانده می‌شود تا زمانی که فایل تمام شود. اگر فایل IF ورودی استاندارد (stdin) باشد، خواندن تا زمان شناسایی انتهای فایل (EOF) ادامه می‌یابد. داده‌های خوانده‌شده از هر تکرار، تبدیل به بافر خروجی داده برای یک دستور جدید WRITE AND VERIFY می‌شوند.

آخرین خواندن از فایل (یا ورودی استاندارد) ممکن است کمتر از ILEN بایت بخواند که در این حالت تعداد بلوک‌های منطقی ارسالی به آخرین دستور WRITE AND VERIFY متناسب با آن کاهش می‌یابد. در صورتی که پس از این تنظیم، بایت‌های مازادی باقی بماند، به stderr گزارش می‌شود.

در صورت بروز خطا، مراتب به stderr و از طریق کد وضعیت خروج گزارش شده و ابزار در همان نقطه متوقف می‌شود.

سایر دستورات SCSI WRITE دارای بیت Force Unit Access (FUA) هستند اما این بیت به طور ضمنی توسط دستورات WRITE AND VERIFY تنظیم می‌شود، از این رو گزینه‌ای برای تنظیم دستی آن وجود ندارد. بافر خروجی داده ممکن است همچنان در حافظه نهان DEVICE قرار گیرد و تنظیم بیت DPO پیشنهادی به دستگاه برای عدم انجام این کار است.

دستورات عادی SCSI WRITE را می‌توان با ابزارهای ddpt و sg_dd انجام داد. دستور SCSI WRITE SAME می‌تواند توسط ابزار sg_write_same انجام شود در حالی که دستور SCSI COMPARE AND WRITE (ابزار sg_compare_and_write) قابلیت "آزمایش و تنظیم" (test and set) را فراهم می‌آورد.

آرگومان‌های عددی گوناگون (مانند LBA) ممکن است شامل پسوندهای ضریب باشند یا در قالب هگزادسیمال داده شوند. بخش "NUMERIC ARGUMENTS" در صفحه راهنمای sg3_utils(8) را مشاهده کنید.

وضعیت خروج sg_write_verify در صورت موفقیت 0 است. اگر عملیات اعتبارسنجی با شکست مواجه شود، معمولاً با خطای رسانه نشان داده شده و منجر به کد وضعیت خروج 3 می‌شود.

اگر BC روی 1 تنظیم شده باشد و مقایسه ناشی از آن ناموفق باشد، این ابزار عدم تطابق را با کد وضعیت خروج 14 نشان می‌دهد. برای سایر مقادیر وضعیت خروج به بخش وضعیت خروج در صفحه راهنمای sg3_utils(8) مراجعه کنید.

برای شروع، یک مثال ساده: نوشتن ۱ بلوک داده با طول ۵۱۲ بایت موجود در فایل t.bin و سپس نوشتن آن بلوک در LBA 0x1234 روی /dev/sg4 .

# sg_write_verify --lba=0x1234 --in=t.bin /dev/sg4

از آنجا که '--num=' داده نشده است، مقدار پیش‌فرض آن 1 خواهد بود. علاوه بر این، مقدار ILEN از اندازه فایل t.bin به دست می‌آید. برای انجام یک مقایسه اضافی میان داده خروجی و داده بازخوانی‌شده:

# sg_write_verify -l 0x1234 -i t.bin --bytchk=1 /dev/sg4

دستور ddpt می‌تواند کپی بین دستگاه‌های SCSI را با استفاده از دستورات READ و WRITE انجام دهد. با این حال، در حال حاضر قابلیتی برای ارتقای آن دستورات WRITE به دستورات WRITE AND VERIFY ندارد. با استفاده از پایپ، این کار می‌تواند به این شکل انجام شود:

  # ddpt if=/dev/sg2 bs=512 bpt=8 count=11 of=- |
sg_write_verify --in=- -l 0x567 -n 8 --ilen=4096 --repeat /dev/sg4

هر دو دستور ddpt و sg_write_verify برای بخش‌هایی شامل ۸ بلوک منطقی ۵۱۲ بایتی پیکربندی شده‌اند. از آنجا که ۱۱ بلوک منطقی خوانده می‌شود، ابتدا ۸ بلوک منطقی کپی شده و سپس ۳ بلوک باقی‌مانده کپی می‌شوند. با فرض اینکه اطلاعات محافظتی وجود ندارد، بافرهای ورودی و خروجی هر کدام ۴۰۹۶ بایت خواهند بود. برای sg_write_verify این مورد باید صریحاً با گزینه ilen=4096-- قید شود.

Bruno Goncalves و Douglas Gilbert.

گزارش اشکالات به <dgilbert at interlog dot com>.

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

ddpt(در بسته‌ای به همین نام), sg_compare_and_write(8), sg_dd(8), sg_write_same(8)

January 2022 sg3_utils-1.48