| SG_WRITE_LONG(8) | SG3_UTILS | SG_WRITE_LONG(8) |
نام (NAME)
sg_write_long - ارسال دستور SCSI WRITE LONG
خلاصه دستور (SYNOPSIS)
sg_write_long [--16] [--cor_dis] [--help] [--in=IF] [--lba=LBA] [--pblock] [--verbose] [--version] [--wr_uncor] [--xfer_len=BTL] DEVICE
توضیحات (DESCRIPTION)
دستور SCSI WRITE LONG (۱۰ یا ۱۶ بایتی) را به DEVICE ارسال میکند. بافری که قرار است روی DEVICE نوشته شود، با بایتهای 0xff پر میشود یا از پروندهی IF خوانده میشود. این بافر شامل دادههای منطقی (مانند ۵۱۲ بایت) و بایتهای ECC است.
از این ابزار میتوان برای ایجاد خطای رسانه (MEDIUM ERROR) در یک آدرس بلوک منطقی مشخص استفاده کرد. این کار برای آزمایش نحوهی مدیریت خطا مفید است. پیش از انجام چنین آزمایشی، میتوان از ابزار sg_dd برای کپی کردن محتوای اصلی آن آدرس بلوک منطقی در مکانی امن استفاده کرد. پس از پایان آزمایش، میتوان از ابزار sg_dd برای بازنویسی محتوای اصلی در آدرس بلوک منطقی استفاده کرد. راهبرد جایگزین دیگر این است که پیش از آزمایش، محتوای «طولانی» (long) آدرس بلوک منطقی را با ابزار sg_read_long بخوانید و پس از آزمایش با همین ابزار آن را بازیابی کنید.
دقت کنید: اگر خطاهای قابل بازیابی تزریق میشوند (برای نمونه تنها یک یا چند بیت تغییر کنند به گونهای که ECC بتواند دادهها را تصحیح کند)، باید مراقب تنظیمات موجود در صفحهی وضعیت «بازیابی خطای خواندن و نوشتن» (read write error recovery) باشید. بهویژه اگر بیتهای ARRE (برای خواندن) یا AWRE (برای نوشتن) فعال باشند، خطاهای بازیابیشده باعث تخصیص مجدد LBA خواهند شد (و مکان قبلی به فهرست نقصهای افزوده یا PLIST اضافه میشود). بازگرداندن این وضعیت آسان نیست و یکی از قطاعهای رزرو (که تعداد محدودی از آنها برای این منظور کنار گذاشته شده است) مصرف میشود. در صورت تردید، امنترین کار پاک کردن بیتهای ARRE و AWRE است. این بیتها را میتوان با ابزار sdparm بررسی کرد و تغییر داد. برای نمونه، دستور «sdparm -c AWRE,ARRE /dev/sda» این بیتها را تا زمان راهاندازی مجدد برق دیسک (power cycle) پاک میکند.
در بازنگری ۷ استاندارد SBC-4 تمام کاربردهای دستورات SCSI WRITE LONG (۱۰ و ۱۶ بایتی) منسوخ شدهاند، بهجز حالتی که بیت WR_UNCOR فعال باشد. دستورات SCSI READ LONG (۱۰ و ۱۶ بایتی) نیز در همان بازنگری منسوخ شدند.
گزینهها (OPTIONS)
آرگومانهای گزینههای طولانی برای گزینههای کوتاه نیز اجباری هستند.
- -S, --16
- ارسال یک دستور SCSI WRITE LONG (16) به DEVICE. رفتار پیشفرض (در صورت نبود این گزینه) ارسال دستور SCSI WRITE LONG (10) است.
- -c, --cor_dis
- بیت غیرفعالسازی تصحیح (یعنی «COR_DIS») را تنظیم میکند. این کار مانع از فعال شدن سازوکارهای گوناگون دیگر مانند تخصیص مجدد خودکار بلوک، بازیابی خطا و ایجاد شرایط مختلف استثنای اطلاعاتی میشود. این بیت در استاندارد SBC-3 نسبتاً جدید است.
- -h, --help
- نمایش پیام راهنمای استفاده و سپس خروج.
- -i, --in=IF
- دادهها (باینری) را از پروندهای به نام IF میخواند و از آن برای دستور SCSI WRITE LONG استفاده میکند. اگر IF برابر «-» باشد، ورودی استاندارد (stdin) خوانده میشود. در صورت مشخص نشدن این گزینه، از بایتهای 0xff به عنوان پرکننده استفاده میشود.
- -l, --lba=LBA
- که در آن LBA آدرس بلوک منطقیِ قطاعی است که باید رونویسی شود. پیشفرض برابر با lba 0 است که بازنویسی آن روی دیسکی که در حال استفاده است، بلوکی خطرناک به شمار میرود. مقدار دهدهی فرض میشود مگر اینکه پیشوند «0x» داشته باشد یا به پسوند «h» ختم شود. اگر LBA بزرگتر از گنجایش ۳۲ بیت باشد، باید از گزینهی --16 استفاده شود.
- -p, --pblock
- بیت بلوک فیزیکی (یعنی «PBLOCK») را تنظیم میکند. این کار به DEVICE دستور میدهد تا از دادههای ارائهشده (مگر اینکه --wr_uncor نیز داده شده باشد) برای نوشتن در بلوک فیزیکی مشخصشده توسط LBA استفاده کند. رفتار پیشفرض، نوشتن در بلوک منطقی متناظر با lba دادهشده است. این بیت در استاندارد SBC-3 نسبتاً جدید است.
- -v, --verbose
- افزایش سطح جزئیات خروجی (پیامهای اشکالزدایی).
- -V, --version
- نمایش رشتهی نگارش برنامه و سپس خروج.
- -w, --wr_uncor
- بیت «نوشتن تصحیحنشده» (یعنی «WR_UNCOR») را تنظیم میکند. این گزینه به DEVICE دستور میدهد تا lba دادهشده (یا بلوک فیزیکی شامل آن را اگر --pblock نیز داده شده باشد) به عنوان دارای یک خطای غیرقابلبازیابی علامتگذاری کند. توجه: به جز خود دستور (یعنی cdb)، هیچ دادهای به DEVICE منتقل نمیشود. در نبود این گزینه، اقدام پیشفرض استفاده از دادههای ارائهشده یا بایتهای 0xff (به طول --xfer_len=BTL) و نوشتن آن روی DEVICE است. این بیت در استاندارد SBC-3 نسبتاً جدید است.
- -x, --xfer_len=BTL
- که در آن BTL طول انتقال بایت است (بهطور پیشفرض ۵۲۰). اگر مقدار دادهشده (یا مقدار پیشفرض) با اندازهی بلوک «طولانی» (long) دستگاه همخوانی نداشته باشد، چیزی روی DEVICE نوشته نمیشود و ممکن است مقدار مناسب xfer_len از پاسخ خطای چاپشده (در stderr) استنباط شود.
نکات (NOTES)
آرگومانهای عددی مختلف (مانند LBA) میتوانند شامل پسوندهای ضریبی باشند یا در قالب هگزادسیمال ارائه شوند. بخش «NUMERIC ARGUMENTS» را در صفحهی راهنمای sg3_utils(8) ببینید.
دستور ۱۰ بایتی SCSI WRITE LONG آدرس بلوک منطقی را به یک مقدار ۳۲ بیتی محدود میکند. برای LBAهای بزرگتر، از گزینهی --16 برای ارسال دستور SCSI WRITE LONG (16) استفاده کنید.
مثالها (EXAMPLES)
این بخش مراحل ایجاد یک بلوک با دادههای خراب، بررسی وضعیت خطا و سپس بازیابی محتوای سالم در آن قطاع را شرح میدهد.
ابتدا اگر دادههای موجود در قطاع اهمیت دارند، آنها را با ابزار sg_read_long ذخیره کنید:
sg_read_long --lba=0x1234 --out=0x1234_1.img -x BTL /dev/sda
ممکن است لازم باشد این ابزار چندین بار اجرا شود تا مقدار درست BTL تعیین گردد. سپس از این ابزار برای «خراب کردن» آن قطاع استفاده کنید. این کار میتواند با دستور زیر انجام شود:
sg_write_long --lba=0x1234 -x BTL /dev/sda
این دستور یک قطاع (و دادههای ECC) از بایتهای 0xff مینویسد. برخی دیسکها ممکن است این کار را رد کنند (حداقل یکی از دیسکهای نویسنده رد کرده است). رویکرد دیگر این است که پروندهی 0x1234_1.img را (در این مثال به 0x1234_2.img) کپی کرده و برخی مقادیر را با ویرایشگر هگز تغییر دهید. سپس تصویر تغییریافته را با دستور زیر بنویسید:
sg_write_long --lba=0x1234 --in=0x1234_2.img -x BTL /dev/sda
رویکرد دیگر در صورت پشتیبانی، استفاده از گزینهی --wr_uncor است:
sg_write_long --lba=0x1234 --wr_uncor /dev/sda
سپس از ابزار sg_dd برای بررسی خراب شدن قطاع استفاده میکنیم. در اینجا یک نمونه آورده شده است:
sg_dd if=/dev/sda blk_sgio=1 skip=0x1234 of=. bs=512 count=1 verbose=4
توجه داشته باشید که گزینهی «blk_sgio=1» داده شده است. این کار برای اطمینان از خوانده شدن همان قطاع (و نه قطاع دیگری) و گزارش کامل خطا است. گزینهی «blk_sgio=1» باعث میشود sg_dd به جای زیرسیستم بلوکی از ioctl مربوط به SG_IO استفاده کند.
در پایان باید قطاع 0x1234 را به وضعیتی بدون خرابی بازگردانیم. یک قطاع پر از صفر میتواند با دستور زیر نوشته شود:
sg_dd if=/dev/zero of=/dev/sda blk_sgio=1 seek=0x1234 bs=512 count=1
این کار منجر به ایجاد قطاعی (بلوکی) با ۵۱۲ بایت 0x0 بدون خطای MEDIUM ERROR میشود، زیرا ECC و دادههای وابسته از نو ایجاد شده و ساختار صحیحی خواهند داشت. گزینهی «blk_sgio=1» در این مورد حتی اهمیت بیشتری دارد زیرا ممکن است مانع از این شود که زیرسیستم بلوکی قبل از نوشتن، عملیات خواندن انجام دهد (چرا که خواندن به احتمال زیاد ناموفق خواهد بود).
رویکرد دیگر، بازنویسی محتوای اصلی است:
sg_write_long --lba=0x1234 --in=0x1234_1.img -x BTL /dev/sda
وضعیت خروج (EXIT STATUS)
وضعیت خروج sg_write_long در صورت موفقیت 0 است. در غیر این صورت به صفحهی راهنمای sg3_utils(8) مراجعه کنید.
نویسندگان (AUTHORS)
نوشتهشده توسط Saeed Bishara. کارهای تکمیلی توسط Douglas Gilbert.
گزارش باگها (REPORTING BUGS)
گزارش باگها را به <dgilbert at interlog dot com> بفرستید.
حق نشر (COPYRIGHT)
حق نشر © 2004-2016
Douglas Gilbert
این
نرمافزار
تحت مجوز GPL
نسخه ۲
توزیع شده
است.
هیچگونه
ضمانتی
وجود
ندارد؛ حتی
برای
قابلیت
فروش یا
تناسب با یک
هدف خاص.
همچنین ببینید (SEE ALSO)
sg_read_long, sg_dd (هر دو در sg3_utils)، sdparm(sdparm)
| January 2016 | sg3_utils-1.42 |