.TH SG_WRITE_SAME "8" "June 2020" "sg3_utils\-1.45" SG3_UTILS .SH "نام (NAME)" sg_write_same \- ارسال دستور SCSI WRITE SAME .SH "خلاصه دستور (SYNOPSIS)" .B sg_write_same [\fI\-\-10\fR] [\fI\-\-16\fR] [\fI\-\-32\fR] [\fI\-\-anchor\fR] [\fI\-\-ff\fR] [\fI\-\-grpnum=GN\fR] [\fI\-\-help\fR] [\fI\-\-in=IF\fR] [\fI\-\-lba=LBA\fR] [\fI\-\-lbdata\fR] [\fI\-\-num=NUM\fR] [\fI\-\-ndob\fR] [\fI\-\-pbdata\fR] [\fI\-\-timeout=TO\fR] [\fI\-\-unmap\fR] [\fI\-\-verbose\fR] [\fI\-\-version\fR] [\fI\-\-wrprotect=WPR\fR] [\fI\-\-xferlen=LEN\fR] \fIDEVICE\fR .SH "توضیحات (DESCRIPTION)" دستور SCSI WRITE SAME (۱۰، ۱۶ یا ۳۲ بایتی) را به \fIDEVICE\fR ارسال می‌کند. این دستور بلوک داده مشخص‌شده را به تعداد \fINUM\fR بار در بلوک‌های متوالی روی \fIDEVICE\fR با شروع از آدرس بلوک منطقی \fILBA\fR می‌نویسد. .PP طول بلوکی که قرار است چندین بار نوشته شود از آرگومان \fILEN\fR، یا طول فایل ورودی داده‌شده \fIIF\fR، یا با فراخوانی دستور READ CAPACITY(16) روی \fIDEVICE\fR به دست می‌آید. محتویات بلوکی که باید نوشته شود از فایل ورودی \fIIF\fR گرفته می‌شود یا از صفرها استفاده می‌شود. اگر READ CAPACITY(16) فراخوانی شود (که به معنی عدم ارائه \fIIF\fR است) و بیت PROT_EN تنظیم شده باشد، ۸ بایت اضافه (یعنی بیشتر از اندازه بلوک منطقی) از مقدار 0xff ارسال می‌شود. اگر READ CAPACITY(16) با شکست مواجه شود، از READ CAPACITY(10) برای تعیین اندازه بلوک استفاده خواهد شد. .PP اگر هیچ‌یک از گزینه‌های \fI\-\-10\fR، \fI\-\-16\fR یا \fI\-\-32\fR داده نشود، دستور WRITE SAME(10) ارسال می‌شود مگر اینکه یکی از شرایط زیر برقرار باشد: اگر \fILBA\fR (به اضافه \fINUM\fR) از ۳۲ بیت فراتر رود، \fINUM\fR از ۶۵۵۳۵ بیشتر باشد، یا گزینه \fI\-\-unmap\fR مشخص شده باشد، در این صورت WRITE SAME(16) ارسال می‌شود. گزینه‌های \fI\-\-10\fR، \fI\-\-16\fR و \fI\-\-32\fR مانعة‌الجمع هستند. .PP در بازنگری 35d از استاندارد SBC\-3، بیت «بدون بافر داده خروجی» (No Data\-Out Buffer یا NDOB) معرفی شد که در صورت تنظیم، نیاز به ارسال یک بلوک داده تک به \fIDEVICE\fR همراه با دستور را برطرف می‌کند. تنها دستورات WRITE SAME (۱۶ و ۳۲ بایتی) از بیت NDOB پشتیبانی می‌کنند. در صورت تعیین این گزینه، یک بلوک کاربری پر از صفر فرض می‌شود؛ و در صورت نیاز، اطلاعات حفاظتی پر از 0xff فرض می‌گردد. .PP در بازنگری ۲۶ از SBC\-3، بیت‌های UNMAP و ANCHOR به دستور WRITE SAME (10) اضافه شدند. از آنجا که بیت UNMAP از زمان بازنگری ۱۸ از SBC\-3 در دستورات WRITE SAME (16) و WRITE SAME (32) وجود داشته است، هنگام ارائه گزینه \fI\-\-unmap\fR، نسخه کمتر از این دو (یعنی WRITE SAME (16)) به عنوان پیش‌فرض ارسال می‌شود. برای ارسال WRITE SAME (10) از گزینه \fI\-\-10\fR استفاده کنید. .PP .B دقت فرمایید: دستورات WRITE SAME(10, 16 and 32) ممکن است مقدار \fINUM\fR برابر صفر را به عنوان نوشتن تا پایان \fIDEVICE\fR تفسیر کنند. این ابزار مقدار پیش‌فرض \fINUM\fR را 1 قرار می‌دهد. دستورات WRITE SAME بیت IMMED ندارند، بنابراین اگر \fINUM\fR بزرگ (یا صفر) باشد، اجرای این ابزار ممکن است زمان بسیار زیادی طول بکشد، احتمالاً به اندازه یک دستور FORMAT UNIT. در چنین شرایطی ممکن است لازم باشد مقدار زمان‌بندی دستور \fITO\fR از مقدار پیش‌فرض ۶۰ ثانیه افزایش یابد. در بازنگری ۲۶ استاندارد SBC\-3 بیت WSNZ (بیت write same no zero) به صفحه VPD حدود بلوک [0xB0] اضافه شد. در صورت تنظیم بودن این بیت، دستورات WRITE SAME مقدار \fINUM\fR برابر صفر را نخواهند پذیرفت. همین بازنگری SBC\-3 فیلد "Maximum Write Same Length" را نیز به صفحه VPD حدود بلوک اضافه کرد. .PP صفحه VPD تامین بلوک منطقی (Logical Block Provisioning با کد 0xB2) شامل بیت‌های LBPWS و LBPWS10 است. اگر LBPWS تنظیم شده باشد، دستور WRITE SAME (16) از بیت UNMAP پشتیبانی می‌کند. اگر LBPWS10 تنظیم شده باشد، دستور WRITE SAME (10) از بیت UNMAP پشتیبانی می‌کند. اگر هر یک از LBPWS یا LBPWS10 تنظیم شده باشند و از WRITE SAME (32) پشتیبانی شود، آنگاه WRITE SAME (32) از بیت UNMAP پشتیبانی می‌کند. .PP به عنوان یک اقدام احتیاطی در برابر اجرای تصادفی مانند 'sg_write_same /dev/sda' که LBA 0 را روی /dev/sda با صفر بازنویسی می‌کند، دست‌کم یکی از گزینه‌های \fI\-\-in=IF\fR، \fI\-\-lba=LBA\fR یا \fI\-\-num=NUM\fR باید مشخص شود. بدیهی است که این ابزار می‌تواند حجم زیادی از داده‌های کاربر را نابود کند، بنابراین گزینه‌ها را با دقت بررسی کنید. .SH "گزینه‌ها (OPTIONS)" آرگومان‌های گزینه‌های طولانی برای گزینه‌های کوتاه نیز اجباری هستند. گزینه‌ها بر اساس حروف الفبای نام گزینه طولانی مرتب شده‌اند. .TP \fB\-R\fR, \fB\-\-10\fR ارسال دستور SCSI WRITE SAME (10) به \fIDEVICE\fR. امکان تنظیم گزینه‌های \fI\-\-unmap\fR (و \fI\-\-anchor\fR) برای این دستور در بازنگری ۲۶ استاندارد SBC\-3 افزوده شد. .TP \fB\-S\fR, \fB\-\-16\fR ارسال دستور SCSI WRITE SAME (16) به \fIDEVICE\fR. .TP \fB\-T\fR, \fB\-\-32\fR ارسال دستور SCSI WRITE SAME (32) به \fIDEVICE\fR. .TP \fB\-a\fR, \fB\-\-anchor\fR تنظیم بیت ANCHOR در cdb. این قابلیت در بازنگری ۲۲ از SBC\-3 معرفی شد. آن پیش‌نویس الزامی می‌کند که گزینه \fI\-\-unmap\fR نیز مشخص شود. .TP \fB\-f\fR, \fB\-\-ff\fR هنگام مشخص شدن این گزینه، بافر داده خروجی (data\-out) ارسالی با این دستور با بایت‌های 0xff مقداردهی اولیه می‌شود. .TP \fB\-g\fR, \fB\-\-grpnum\fR=\fIGN\fR فیلد 'Group number' را روی \fIGN\fR تنظیم می‌کند. مقدار پیش‌فرض صفر است. \fIGN\fR باید مقداری بین 0 تا 63 باشد. .TP \fB\-h\fR, \fB\-\-help\fR نمایش پیام راهنمای نحوه استفاده و سپس خروج. .TP \fB\-i\fR, \fB\-\-in\fR=\fIIF\fR خواندن داده‌ها (باینری) از فایلی به نام \fIIF\fR و استفاده از آن به عنوان بافر data\-out برای دستور SCSI WRITE SAME. طول بافر داده خروجی برابر با \fI\-\-xferlen=LEN\fR است یا اگر آن گزینه داده نشده باشد، برابر با طول فایل \fIIF\fR خواهد بود. اگر \fIIF\fR برابر "\-" باشد، داده‌ها از ورودی استاندارد (stdin) خوانده می‌شوند. اگر این گزینه و گزینه \fI\-\-ff\fR داده نشده باشند، از بایت‌های 0x00 به عنوان پرکننده استفاده می‌شود و طول بافر data\-out از \fI\-\-xferlen=LEN\fR یا با فراخوانی READ CAPACITY(16 or 10) به دست می‌آید. اگر پاسخ به READ CAPACITY(16) دارای بیت تنظیم‌شده PROT_EN باشد، اندازه بافر data\-out متناسب با آن تغییر یافته و ۸ بایت آخر با 0xff تنظیم می‌شود. .TP \fB\-l\fR, \fB\-\-lba\fR=\fILBA\fR که در آن \fILBA\fR آدرس بلوک منطقی برای شروع دستور WRITE SAME است. مقدار پیش‌فرض lba 0 است که بازنویسی آن روی دیسکی که در حال استفاده است بلوک خطرناکی محسوب می‌شود. فرض می‌شود مقدار در مبنای ده است مگر اینکه با '0x' شروع شود یا پسوند 'h' داشته باشد. .TP \fB\-L\fR, \fB\-\-lbdata\fR بیت LBDATA را در cdb دستور WRITE SAME تنظیم می‌کند. این بیت در sbc3r32 در سپتامبر ۲۰۱۲ منسوخ شد. .TP \fB\-N\fR, \fB\-\-ndob\fR بیت NDOB را در دستورات WRITE SAME (۱۶ و ۳۲ بایتی) تنظیم می‌کند. NDOB مخفف No Data\-Out Buffer است. مقدار پیش‌فرض پاک بودن این بیت است. هنگامی که این گزینه مشخص شود، استفاده از \fI\-\-in=IF\fR مجاز نیست و \fI\-\-xferlen=LEN\fR تنها در صورتی مجاز است که \fILEN\fR برابر 0 باشد. .br به‌طور پیش‌فرض در هر بلوک صفر نوشته می‌شود، اما بسته به سایر تنظیمات این احتمال وجود دارد که «الگوی مقداردهی اولیه تدارک» (provisioning initialization pattern) نوشته شود. .TP \fB\-n\fR, \fB\-\-num\fR=\fINUM\fR که در آن \fINUM\fR تعداد بلوک‌هایی است که از \fILBA\fR شروع شده و بافر data\-out روی آن‌ها نوشته می‌شود. مقدار پیش‌فرض برای \fINUM\fR برابر 1 است. این مقدار متناظر با فیلد 'Number of logical blocks' در cdb دستور WRITE SAME است. .br توجه داشته باشید که مقدار 0 در \fINUM\fR ممکن است به صورت نوشتن بافر data\-out روی تمام بلوک‌ها از \fILBA\fR تا انتهای \fIDEVICE\fR تفسیر شود. اگر بیت WSNZ (معرفی‌شده در sbc3r26، ژانویه ۲۰۱۱) در صفحه VPD حدود بلوک تنظیم شده باشد، مقدار 0 مجاز نبوده و کلید حسگر Invalid request برگردانده می‌شود. .TP \fB\-P\fR, \fB\-\-pbdata\fR بیت PBDATA را در cdb دستور WRITE SAME تنظیم می‌کند. این بیت در sbc3r32 در سپتامبر ۲۰۱۲ منسوخ شد. .TP \fB\-t\fR, \fB\-\-timeout\fR=\fITO\fR که در آن \fITO\fR مقدار زمان انتظار (مهلت زمانی) دستور بر حسب ثانیه است. مقدار پیش‌فرض ۶۰ ثانیه است. اگر \fINUM\fR بزرگ (یا صفر) باشد، تکمیل یک دستور WRITE SAME ممکن است به زمانی به مراتب بیشتر از ۶۰ ثانیه نیاز داشته باشد. .TP \fB\-U\fR, \fB\-\-unmap\fR بیت UNMAP را در cdb دستورات WRITE SAME(10, 16 and 32) تنظیم می‌کند. بخش UNMAP را در ادامه ببینید. .TP \fB\-v\fR, \fB\-\-verbose\fR افزایش سطح پرگویی (پیام‌های اشکال‌زدایی). .TP \fB\-V\fR, \fB\-\-version\fR نمایش رشته نسخه برنامه و سپس خروج. .TP \fB\-w\fR, \fB\-\-wrprotect\fR=\fIWPR\fR فیلد "Write protect" را در cdb دستور WRITE SAME روی \fIWPR\fR تنظیم می‌کند. مقدار پیش‌فرض صفر است. \fIWPR\fR باید مقداری بین 0 تا 7 باشد. هنگامی که \fIWPR\fR برابر با 1 یا بیشتر باشد و نوع حفاظت دیسک 1 یا بیشتر باشد، ۸ بایت اضافه برای اطلاعات حفاظتی مورد انتظار است یا تولید می‌شود (تا در بافر data\-out دستور قرار گیرد). .TP \fB\-x\fR, \fB\-\-xferlen\fR=\fILEN\fR که در آن \fILEN\fR طول بافر data\-out است. مقدار پیش‌فرض برابر با طول فایل \fIIF\fR است یا اگر آن گزینه داده نشده باشد، از دستور READ CAPACITY(16 or 10) برای یافتن 'طول بلوک منطقی بر حسب بایت' استفاده می‌شود. اگر نوع حفاظت \fIDEVICE\fR برابر 1 یا بیشتر باشد و فیلد WRPROTECT (به \fI\-\-wrprotect=WPR\fR مراجعه کنید) برابر با 1 یا بیشتر باشد، این رقم ممکن است ۸ بایت افزایش یابد. اگر هم این گزینه و هم گزینه \fIIF\fR داده شوند و \fILEN\fR از طول فایل \fIIF\fR بیشتر باشد، در این صورت \fILEN\fR طول بافر data\-out خواهد بود و از صفرها به عنوان بایت‌های پرکننده (pad) استفاده می‌شود. .SH "حذف نگاشت (UNMAP)" تدارک بلوک منطقی (Logical block provisioning) یک اصطلاح جدید است که در بازنگری ۲۵ استاندارد SBC\-3 برای قابلیت نشانه‌گذاری بلوک‌ها به عنوان استفاده‌نشده معرفی شده است. برای آرایه‌های ذخیره‌سازی بزرگ، این روشی برای تدارک ذخیره‌سازی فیزیکی کمتر از مقداری است که دستور READ CAPACITY گزارش می‌دهد در دسترس است، به طوری که هنگام نیاز دستورات WRITE، ذخیره‌سازی فیزیکی بیشتری تخصیص داده شود. برای حافظه‌های فلش (مانند درایوهای SSD) این روشی برای صرفه‌جویی احتمالی در مصرف انرژی (و شاید زمان دسترسی) است، زمانی که مشخص شود بخش‌های بزرگی (یا تقریباً تمام) از حافظه فلش استفاده نمی‌شوند. درایوهای SSD برای برخورداری از طول عمر قابل قبول به الگوریتم‌های تراز ساییدگی (wear levelling) نیاز دارند و معمولاً برای ساده‌سازی این الگوریتم‌ها بیش‌ازحد ظرفیت تدارک می‌شوند (over provision)؛ بنابراین معمولاً حافظه فلش فیزیکی بیشتری نسبت به اندازه منطقی خود دارند. .PP پشتیبانی از تدارک بلوک منطقی با تنظیم بودن بیت LBPME در پاسخ دستور READ CAPACITY(16) مشخص می‌شود (به ابزار sg_readcap مراجعه کنید). این امر نشان می‌دهد که حداقل یکی از دستورات UNMAP یا WRITE SAME(16) پیاده‌سازی شده است. اگر دستور UNMAP پیاده‌سازی شده باشد، فیلدهای "Maximum unmap LBA count" و "Maximum unmap block descriptor count" در صفحه VPD حدود بلوک باید هر دو بزرگتر از صفر باشند. پاسخ دستور READ CAPACITY(16) همچنین شامل یک بیت LBPRZ است که در صورت تنظیم بودن بدین معناست که اگر بلوک‌های لغونگاشت‌شده خوانده شوند، برای داده‌ها مقادیر صفر بازگردانده می‌شود (و اگر اطلاعات حفاظتی فعال باشد، بایت‌های 0xff برای آن بازگردانده می‌شود). در بازنگری ۲۷ استاندارد SBC\-3 همین بیت LBPRZ به صفحه VPD تامین بلوک منطقی نیز اضافه شد. .PP در بازنگری ۲۵ از SBC\-3 بیت‌های LBPU و ANC_SUP به صفحه VPD تامین بلوک منطقی اضافه شدند. هنگامی که LBPU تنظیم باشد نشان می‌دهد که دستگاه از دستور UNMAP پشتیبانی می‌کند (ابزار sg_unmap را ببینید). هنگامی که بیت ANC_SUP تنظیم باشد نشان می‌دهد دستگاه از LBAهای لنگرانداخته‌شده (anchored) پشتیبانی می‌کند. .PP هنگامی که بیت UNMAP در cdb تنظیم شود، بافر data\-out نیز ارسال می‌شود. علاوه بر این، بخش داده‌های آن بافر data\-out باید پر از بایت‌های 0x0 باشد در حالی که بلوک حفاظت داده (۸ بایت در انتها در صورت وجود) باید روی بایت‌های 0xff تنظیم شود. اگر این شرایط برآورده نشوند و بیت LBPRZ تنظیم باشد، بیت UNMAP نادیده گرفته شده و بافر data\-out روی \fIDEVICE\fR نوشته می‌شود همان‌گونه که گویی بیت UNMAP صفر بوده است. در صورت نبود گزینه \fI\-\-in=IF\fR، این ابزار تلاش می‌کند یک بافر data\-out ایجاد کند که الزامات مربوط به اثرگذاری بیت UNMAP در cdb توسط \fIDEVICE\fR را برآورده سازد. .PP بلوک‌های منطقی همچنین ممکن است توسط دستورات SCSI UNMAP و FORMAT UNIT لغو نگاشت شوند (به ابزارهای sg_unmap و sg_format مراجعه کنید). .PP قابلیت unmap در SCSI ارتباط نزدیکی با دستور ATA DATA SET MANAGEMENT با بیت تنظیم‌شده "Trim" دارد. این قابلیت تریم ATA تعامل خوبی با صف‌بندی دستورات SATA موسوم به NCQ ندارد. کمیته T13 دستور جدیدی به نام SFQ DATA SET MANAGEMENT را همراه با یک بیت "Trim" برای حل این مشکل معرفی کرد. دستورات SCSI WRITE SAME با بیت تنظیم‌شده UNMAP و همچنین دستورات UNMAP هیچ مشکلی با صف‌بندی SCSI ندارند. .SH "نکات (NOTES)" آرگومان‌های عددی گوناگون (مانند \fILBA\fR) ممکن است شامل پسوندهای ضریب باشند یا به صورت هگزادسیمال داده شوند. بخش "NUMERIC ARGUMENTS" را در صفحه راهنمای sg3_utils(8) ببینید. .PP در لینوکس، پیش از نسخه هسته 3.17، درایور sg از اندازه‌های cdb بزرگتر از ۱۶ بایت پشتیبانی نمی‌کرد. از این رو یک گره دستگاه مانند /dev/sg1 که با درایور sg مرتبط است، در صورت مشخص شدن گزینه \fI\-\-32\fR (یا استنباط آن از سایر گزینه‌ها) با این ابزار با خطا مواجه می‌شد. درایور bsg با گره‌های دستگاهی مانند /dev/bsg/6:0:0:1 از زمان معرفی‌اش در نسخه 2.6.28 هسته از اندازه‌های cdb بزرگتر از ۱۶ بایت پشتیبانی می‌کند. .SH "وضعیت خروج (EXIT STATUS)" وضعیت خروج sg_write_same در صورت موفقیت 0 است. در غیر این صورت به صفحه راهنمای sg3_utils(8) مراجعه کنید. .SH "مثال‌ها (EXAMPLES)" هشدار: تمام این مثال‌ها داده‌های موجود در یک یا چند بلوک را بازنویسی می‌کنند و ممکن است تمام دیسک را پاک کنند! .PP یک کاربرد ساده، نوشتن بلوک‌های صفر از یک LBA مشخص (شامل خود آن) به تعداد ۶۳ بلوک است: .PP sg_write_same \-\-lba=0x1234 \-\-num=63 /dev/sdc .PP از آنجا که \fI\-\-xferlen=LEN\fR داده نشده است، این ابزار دستور READ CAPACITY را روی /dev/sdc فراخوانی می‌کند تا تعداد بایت‌های موجود در یک بلوک منطقی را تعیین کند. فرض کنیم این مقدار ۵۱۲ بایت باشد. از آنجا که \fI\-\-in=IF\fR داده نشده است، یک بلوک پر از صفر فرض می‌شود. بنابراین ۶۳ بلوک از صفرها (هر بلوک حاوی ۵۱۲ بایت) از LBA با مقدار 0x1234 (شامل خود آن) نوشته خواهد شد. توجه داشته باشید که تنها یک بلوک از صفرها در بافر data\-out به دستور SCSI WRITE SAME ارسال می‌شود (همان‌گونه که توسط SBC\-3 الزامی شده است). استفاده از دستور SCSI WRITE SAME برای نوشتن یک یا چند بلوک از صفرها معادل دستور NVMe با نام Write Zeroes است. .br اکنون بلوک‌های صفر را در کل دیسک می‌نویسیم. [توجه داشته باشید که دستورات نوع پاک‌سازی (sanitize) بلوک‌ها و متاداده‌هایی را نیز که مستقیماً قابل مشاهده نیستند پاک می‌کنند]: .PP sg_write_same \-\-lba=0x0 \-\-num=0 /dev/sdc .PP بله، در این زمینه \-\-num=0 به معنای باقیمانده دیسک است. اجرای فوق ممکن است به دلیل تنظیم بودن بیت WSNZ در صفحه VPD حدود بلوک با خطا مواجه شود. برای دور زدن این مشکل، دستور زیر را امتحان کنید: .PP sg_write_same \-\-lba=0x0 \-\-ndob /dev/sdc .PP این اجرا در صورت پشتیبانی شدن، این مزیت افزوده را دارد که بافر data\-out پر از صفر را ارسال نمی‌کند. توجه داشته باشید که این احتمال وجود دارد که به جای صفر، «الگوی مقداردهی اولیه تدارک» در هر بلوک نوشته شود. .PP مثال مشابهی در ادامه آمده است اما در این حالت بلوک‌ها به جای صفر شدن، «لغو نگاشت» می‌شوند (در ادبیات ATA اصطلاحاً «تریم» می‌شوند): .PP sg_write_same \-\-unmap \-L 0x1234 \-n 63 /dev/sdc .PP توجه داشته باشید که اگر بیت LBPRZ در پاسخ READ CAPACITY(16) تنظیم شده باشد (یعنی مخفف logical block provisioning read zeros)، آنگاه این دو مثال دست‌کم از دیدگاه خواندن‌های بعدی عملکرد یکسانی دارند. .PP این ابزار همچنین می‌تواند برای نوشتن اطلاعات حفاظتی (PI) روی دیسک‌هایی که با نوع حفاظتی بزرگتر از صفر فرمت شده‌اند استفاده شود. PI مقدار ۸ بایت داده اضافی است که به داده‌های کاربر در یک بلوک منطقی پیوست می‌شود: دو بایت اول یک CRC (موسوم به "guard")، دو بایت بعدی "application tag" و چهار بایت آخر "reference tag" است. در انواع حفاظتی ۱ و ۲ اگر application tag برابر 0xffff باشد، بررسی guard نباید (در برابر داده‌های کاربر) انجام شود. .PP در این مثال فرض می‌کنیم اندازه بلوک منطقی (داده‌های کاربر) ۵۱۲ بایت است و دیسک با نوع حفاظتی ۱ فرمت شده است. از آنجا که قصد داریم LBA 2468 را تغییر دهیم، ابتدا یک کپی از آن تهیه می‌کنیم: .PP dd if=/dev/sdb skip=2468 bs=512 of=2468.bin count=1 .PP خط دستور زیر داده‌های کاربر را روی صفر و PI را روی ۸ بایت 0xFF در LBA 2468 تنظیم می‌کند: .PP sg_write_same \-\-lba=2468 /dev/sdb .PP خواندن مجدد آن بلوک باید موفقیت‌آمیز باشد زیرا application tag برابر 0xffff است که بررسی محافظ (CRC) را متوقف می‌کند (که در غیر این صورت نادرست می‌بود): .PP dd if=/dev/sdb skip=2468 bs=512 of=/dev/null count=1 .PP اکنون تلاشی برای ایجاد یک فایل باینری با مقادیر صفر در داده‌های کاربر، 0x0000 در application tag و بایت‌های 0xff در دو فیلد دیگر PI انجام می‌شود. ایجاد بایت‌های 0xff در یک فایل (در یونیکس) همان‌طور که دستور "tr" در زیر نشان می‌دهد کمی قلق دارد: .PP dd if=/dev/zero bs=1 count=512 of=ud.bin tr "\\000" "\\377" < /dev/zero | dd bs=1 of=ff_s.bin count=8 cat ud.bin ff_s.bin > lb.bin dd if=/dev/zero bs=1 count=2 seek=514 conv=notrunc of=lb.bin .PP فایل حاصل را می‌توان با 'hexdump \-C lb.bin' مشاهده کرد و باید حاوی ۵۲۰ بایت باشد. اکنون می‌توان آن فایل را به صورت زیر روی LBA 2468 نوشت: .PP sg_write_same \-\-lba=2468 wrprotect=3 \-\-in=lb.bin /dev/sdb .PP توجه داشته باشید که \fI\-\-wrprotect=3\fR به جای تنظیم روی 1 استفاده شده است، زیرا می‌خواهیم دستور WRITE SAME با موفقیت انجام شود حتی با اینکه داده‌های PI اکنون نشان می‌دهند که داده‌های کاربر خراب است. هنگامی که تلاشی برای خواندن LBA صورت گیرد، باید خطایی رخ دهد: .PP dd if=/dev/sdb skip=2468 bs=512 of=/dev/null count=1 .PP خطاهای dd چندان رسا نیستند، اگر dmesg بررسی شود باید خطی شبیه به این وجود داشته باشد: "[sdb] Add. Sense: Logical block guard check failed". این بلوک را می‌توان با اجرای دوباره دستور "sg_write_same \-\-lba=1234 /dev/sdb" یا بازگرداندن محتویات اصلی آن LBA اصلاح کرد: .PP dd if=2468.bin bs=512 seek=2468 of=/dev/sdb conv=notrunc count=1 .PP امید می‌رود که دستور dd هرگز سعی نکند فایل خروجی را در زمانی که یک دستگاه بلوکی است کوتاه (truncate) کند. .SH "نویسندگان (AUTHORS)" نوشته شده توسط Douglas Gilbert. .SH "گزارش باگ‌ها (REPORTING BUGS)" گزارش باگ‌ها به . .SH "حق نشر (COPYRIGHT)" حق نشر \(co 2009\-2020 Douglas Gilbert .br این نرم‌افزار تحت مجوز BSD\-2\-Clause توزیع می‌شود. هیچ ضمانتی وجود ندارد؛ حتی برای قابلیت فروش یا تناسب با یک هدف خاص. .SH "همچنین ببینید (SEE ALSO)" .B sg_format,sg_get_lba_status,sg_readcap,sg_vpd,sg_unmap, .B sg_write_x(sg3_utils)