| COMPARE AND WRITE(8) | SG3_UTILS | COMPARE AND WRITE(8) |
نام (NAME)
sg_compare_and_write - ارسال دستور SCSI COMPARE AND WRITE
خلاصه دستور (SYNOPSIS)
sg_compare_and_write [--dpo] [--fua] [--fua_nv] [--grpnum=GN] [--help] --in=IF [--inw=WF] --lba=LBA [--num=NUM] [--quiet] [--timeout=TO] [--verbose] [--version] [--wrprotect=WP] [--xferlen=LEN] DEVICE
توضیحات (DESCRIPTION)
دستور SCSI COMPARE AND WRITE را به DEVICE ارسال میکند. این ابزار بافر مقایسه و بافر نوشتن را از یک یا دو پرونده واکشی میکند. اگر گزینه --inw=WF داده شود، بافر مقایسه از پرونده مشخصشده با --in=IF واکشی شده در حالی که بافر نوشتن از پرونده مشخصشده با --inw=WF واکشی میشود. اگر گزینه --inw=WF داده نشود، بافرهای الحاقشده مقایسه و نوشتن از پرونده مشخصشده با گزینه --in=IF واکشی میشوند.
انتظار میرود این بافرها هرکدام حاوی NUM بلوک داده باشند. مقایسه در آدرس بلوک منطقی LBA روی DEVICE آغاز میشود و اگر مقایسه شکست بخورد (یعنی بافر مقایسه ارائهشده با دادههای موجود در LBA روی DEVICE برابر نباشد)، دستور COMPARE AND WRITE با کلید سنس MISCOMPARE به پایان میرسد. در این حالت این ابزار کار خود را پایان داده و وضعیت خروج 14 (که مقدار کلید سنس MISCOMPARE است) را تنظیم میکند.
اگر مقایسه موفقیتآمیز باشد، بافر نوشتن ارائهشده از آدرس LBA به مدت NUM بلوک روی DEVICE ذخیره میشود.
تعداد بایتهای واقعی انتقالیافته در بافر خروجی داده (data-out) در دستور COMPARE AND WRITE ممکن است لازم باشد توسط کاربر با گزینه --xferlen=LEN مشخص شود. مقدار پیشفرض LEN برابر (2 * NUM * 512) است که برای مقدار پیشفرض NUM برابر ۱، معادل 1024 میباشد. اگر اندازه بلوک غیر از 512 باشد، کاربر باید از گزینه --xferlen=LEN استفاده کند. اگر اطلاعات حفاظتی ارائه شده باشد (با مقداری از WP غیر از 0 که مقدار پیشفرض است)، آنگاه برای NUM برابر ۱، مقدار LEN باید 1040 باشد. توجه داشته باشید که دستور SCSI READ CAPACITY توسط این ابزار اجرا نمیشود (مثلاً برای یافتن اندازه بلوک).
تعریف T10 از دستور SCSI COMPARE AND WRITE ایجاب میکند که DEVICE مقایسه و نوشتن اختیاری را بهصورت یک سلسله اقدامات بدون وقفه پیادهسازی کند. بسته به برخی تنظیمات دیگر DEVICE، ممکن است یک عملیات اعتبارسنجی (verify) پیش از مقایسه رخ دهد.
هنگامی که عدم تطابق میان بافر مقایسه و بلوکهای خواندهشده از آدرس LBA روی DEVICE رخ دهد، بافر سنس حاوی کلید سنس MISCOMPARE باعث ارسال چندین پیام به stderr میشود (از جمله آفست نخستین بایت ناسازگار). برای جلوگیری از نمایش این پیامها از گزینه --quiet استفاده کنید. با یا بدون گزینه --quiet، وضعیت خروج روی 14 تنظیم خواهد شد.
این دستور در SBC-3 تعریف شده که جدیدترین ویرایش آن 36 است. SBC-3 و سایر اسناد SCSI را میتوان در https://www.t10.org یافت.
گزینهها (OPTIONS)
آرگومانهای گزینههای بلند برای گزینههای کوتاه نیز الزامی هستند. گزینهها بر اساس نام گزینه بلند به ترتیب الفبایی مرتب شدهاند.
- -d, --dpo
- تنظیم بیت DPO در CDB دستور COMPARE AND WRITE.
- -f, --fua
- تنظیم بیت FUA در CDB دستور COMPARE AND WRITE.
- -F, --fua_nv
- تنظیم بیت FUA_NV در CDB دستور COMPARE AND WRITE. این بیت در SBC-3 ویرایش 35d حذف شد و موقعیت آن با عنوان «رزرو شده» علامتگذاری گردید.
- -g, --grpnum=GN
- که در آن GN مقداری است که در فیلد شماره گروه در CDB دستور COMPARE AND WRITE قرار میگیرد. مقدار GN باید بین 0 تا 63 باشد که 0 پیشفرض است.
- -h, --help
- نمایش پیام راهنما و سپس خروج.
- -i, --in=IF
- خواندن داده (باینری) از پروندهای به نام IF. این پرونده یا شامل بافرهای ترکیبی مقایسه و نوشتن است (در صورتی که گزینه --inw=WF داده نشده باشد) یا صرفاً بافر مقایسه (هنگامی که گزینه --inw=WF داده شده باشد). اگر IF برابر '-' باشد، از ورودی استاندارد stdin (مانند یک لوله) خوانده میشود.
- -C, --inc=IF
- مشابه گزینه --in.
- -D, --inw=WF
- خواندن داده (باینری) از پروندهای به نام WF. این بافر نوشتن خواهد بود که نیمه دوم بافر خروجی داده ارسالی به DEVICE در دستور COMPARE AND WRITE را تشکیل میدهد. توجه داشته باشید که در صورت ارائه این گزینه، انتظار میرود --in=IF شامل بافر مقایسه مربوطه باشد.
- -l, --lba=LBA
- که در آن LBA آدرس بلوک منطقی برای شروع دستور COMPARE AND WRITE است. فرض بر مبنای دهدهی است مگر اینکه پیشوند '0x' یا پسوند 'h' داشته باشد.
- -n, --num=NUM
- که در آن NUM تعداد بلوکهایی است که باید از آدرس LBA خوانده شده و با بافر مقایسه شوند؛ و در صورت تطابق، تعداد NUM بلوک است که از آدرس LBA نوشته میشوند. مقدار پیشفرض برای NUM برابر 1 است.
- -q, --quiet
- عدم نمایش پیامهای بافر سنس مربوط به کلید سنس MISCOMPARE که در غیر این صورت به stderr ارسال میشدند. وضعیت خروج همچنان روی 14 که مقدار کلید سنس نشاندهنده MISCOMPARE است تنظیم خواهد شد.
- -t, --timeout=TO
- که در آن TO مقدار مهلت زمانی دستور برحسب ثانیه است. مقدار پیشفرض 60 ثانیه است. اگر NUM بزرگ (یا صفر) باشد، ممکن است دستور به زمان بسیار بیشتری از 60 ثانیه برای تکمیل نیاز داشته باشد.
- -v, --verbose
- افزایش درجه پرگویی (پیامهای اشکالزدایی).
- -V, --version
- خروجی دادن رشته نگارش و سپس خروج.
- -w, --wrprotect=WP
- تنظیم فیلد WRPROTECT در cdb به WP. مقدار پیشفرض 0 است که نشان میدهد هیچ اطلاعات حفاظتی (همراه با دادههای کاربر) توسط این ابزار ارسال نمیشود.
- -x, --xferlen=LEN
- که در آن LEN طول بافر خروجی داده برحسب بایت است. مقدار پیشفرض آن (2 * NUM * 512) بایت است. اگر اندازه بلوک DEVICE غیر از 512 بایت باشد یا WP غیرصفر باشد (به معنی اطلاعات حفاظتی اضافی)، این مقدار پیشفرض نادرست خواهد بود و کاربر باید مقدار صحیح LEN را مشخص کند.
نکات (NOTES)
آرگومانهای عددی گوناگون (مانند LBA) ممکن است شامل پسوندهای ضریبدار باشند یا در مبنای شانزده ارائه شوند. بخش «NUMERIC ARGUMENTS» در صفحه راهنمای sg3_utils(8) را ببینید.
مثالها (EXAMPLES)
پیش از بازنویسی دو بلوک اول هر دستگاه ذخیرهسازی (SCSI) که انتخاب شده است، یک نسخه پشتیبان تهیه کنید. فرض میشود اندازه بلوک منطقی 512 بایت است. از دو بلوک اول یک نسخه (در backup01.bin) بگیرید:
# sg_dd if=/dev/sg1 bs=512 of=backup01.bin count=2
2+0 records in
2+0 records out
هشدار: اگر /dev/sg1 مربوط به دیسکی در سیستم شما است که در حال حاضر حاوی سیستمهای پرونده سوارشده (mounted) است، ادامه _ندهید_. در صورت امکان، تمام سیستمهای پرونده را از روی آن دیسک پیاده (unmount) کنید. اگر این کار امکانپذیر نیست، از دیسک دیگری که هیچ سیستم پرونده سوارشدهای روی آن نیست استفاده نمایید. در لینوکس راهانداز scsi_debug گزینه خوبی برای آزمایش است.
اکنون بلوک اول را با بایتهای 0xff پر کنید:
# sg_dd iflag=ff bs=512 of=/dev/sg1 count=1
1+0 records in
1+0 records out
و بلوک دوم را با بایتهای 0x0:
# sg_dd iflag=00 bs=512 seek=1 of=/dev/sg1 count=1
1+0 records in
1+0 records out
اکنون این دو بلوک را در یک پرونده کپی کنید:
# sg_dd if=/dev/sg1 bs=512 of=ff00.bin count=2
2+0 records in
2+0 records out
اکنون میتوانیم یک دستور compare and write انجام دهیم. به آن گفته شده است بلوک اول (یعنی LBA 0) را با بلوک اول پرونده دادهشده (یعنی ff00.bin) مقایسه کند. اگر برابر باشند (هر دو باید پر از بایتهای 0xff باشند)، از آنجا که مقایسه موفقیتآمیز است، بلوک دوم در ff00.bin را روی LBA 0 خواهد نوشت:
# sg_compare_and_write --in=ff00.bin --lba=0 --num=1 /dev/sg1
بیخبری خوشخبری است (عدم نمایش خطا نشان از موفقیت دارد). اکنون اگر دوباره آن دستور را اجرا کنیم:
# sg_compare_and_write --in=ff00.bin --lba=0 --num=1 /dev/sg1
Miscompare at byte offset: 0 [0x0]
sg_compare_and_write failed: Miscompare
این نتیجه مورد انتظار است. اولین دستور sg_compare_and_write در نهایت بایتهای 0x0 را روی LBA 0x0 نوشت. دستور دوم sg_compare_and_write آدرس LBA 0x0 را با بایتهای 0xff مقایسه میکند و بلافاصله (یعنی در آفست بایت: 0) شکست میخورد. اکنون 3 بایت اول ff00.bin را با 0x0 بازنویسی میکنیم:
# sg_dd bs=1 iflag=00 of=ff00.bin count=3
3+0 records in
3+0 records out
به عملوند 'bs=1' توجه کنید. ابزار dd (و در نتیجه sg_dd) برای انجام ویرایشهای باینری کوچک روی یک پرونده بسیار مفید است. اکنون اگر دوباره آن دستور sg_compare_and_write را اجرا کنیم، همچنان با شکست مواجه میشود اما با یک تفاوت کوچک:
# sg_compare_and_write --in=ff00.bin --lba=0 --num=1 /dev/sg1
Miscompare at byte offset: 3 [0x3]
sg_compare_and_write failed: Miscompare
بنابراین بایتهای آفست 0، 1 و 2 برابر ارزیابی شدند اما بایت آفست 3 برابر نبود. دستور SCSI COMPARE AND WRITE در نخستین بایت ناسازگار متوقف خواهد شد.
وضعیت خروج (EXIT STATUS)
وضعیت خروج sg_compare_and_write در صورت موفقیت 0 است. اگر مرحله مقایسه شکست بخورد، وضعیت خروج 14 است. برای سایر مقادیر وضعیت خروج، بخش EXIT STATUS را در صفحه راهنمای sg3_utils(8) ببینید.
نسخههای پیشین این ابزار هنگام بروز MISCOMPARE وضعیت خروج 98 را تنظیم میکردند.
نویسندگان (AUTHORS)
نوشته شده توسط Shahar Salzman. نگهداری توسط Douglas Gilbert. افزونهها توسط Eric Seppanen.
گزارش باگها (REPORTING BUGS)
گزارش باگها به shahar.salzman@kaminario.com یا dgilbert@interlog.com
حق نشر (COPYRIGHT)
Copyright © 2012-2020 Kaminario Technologies LTD
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the <organization> nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Kaminario Technologies LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
همچنین ببینید (SEE ALSO)
sg_xcopy, sg_receive_copy_results(sg3_utils)
| April 2021 | sg3_utils-1.47 |