| SG_DD(8) | SG3_UTILS | SG_DD(8) |
نام (NAME)
sg_dd - کپی کردن دادهها به و از فایلها و دستگاهها، بهویژه دستگاههای SCSI
خلاصه دستور (SYNOPSIS)
sg_dd [bs=BS] [conv=CONV] [count=COUNT] [ibs=BS] [if=IFILE] [iflag=FLAGS] [obs=BS] [of=OFILE] [oflag=FLAGS] [seek=SEEK] [skip=SKIP] [--help] [--verbose] [--version]
[blk_sgio={0|1}] [bpt=BPT] [cdbsz={6|10|12|16}] [cdl=CDL] [coe={0|1|2|3}] [coe_limit=CL] [dio={0|1}] [grpnum=GN] [odir={0|1}] [of2=OFILE2] [retries=RETR] [sync={0|1}] [time={0|1}[,TO]] [verbose=VERB] [--dry-run] [--nocopy] [--progress] [--verify]
توضیحات (DESCRIPTION)
کپی کردن دادهها به و از هر فایلی. این دستور برای «فایلهایی» تخصصی شده است که دستگاههای عمومی لینوکس SCSI (دستگاههای sg)، دستگاههای خام (raw) یا سایر دستگاههایی هستند که از ioctl با شناسه SG_IO پشتیبانی میکنند (که تنها در سری هسته 2.6 لینوکس و پس از آن یافت میشوند). ساختار دستوری و معنایی مشابه دستور dd(1) دارد.
گروه اول در خلاصه دستور فوق، عملوندهای «استاندارد» یونیکس dd(1) هستند. گروه دوم گزینههای اضافی هستند که توسط این ابزار افزوده شدهاند. هر دو گروه در ادامه تعریف شدهاند.
هنگامی که گزینه --verify داده میشود، بخش خواندن مشابه است اما در بخش نوشتن، دستور SCSI WRITE با دستور SCSI VERIFY جایگزین میشود. اگر هر یک از دستورات VERIFY منجر به تولید کلید حس MISCOMPARE شود، عملیات اعتبارسنجی متوقف خواهد شد. گزینه --verify فقط زمانی قابل استفاده است که OFILE یک دستگاه sg یا یک دستگاه بلوکی باشد که oflag=sgio نیز برای آن داده شده باشد. هنگامی که گزینه --verify استفاده میشود، این ابزار به روشی مشابه دستور cmp(1) یونیکس عمل میکند.
این ابزار تنها روی لینوکس پشتیبانی میشود در حالی که بیشتر ابزارهای دیگر در بسته sg3_utils به سایر سیستمعاملها پورت شدهاند. ابزاری به نام «ddpt» نحو و عملکردی مشابه sg_dd دارد. ابزار ddpt برخی ویژگیهای خاص لینوکس را حذف کرده و در عین حال برخی ویژگیهای عمومی دیگر را اضافه میکند. این امر اجازه میدهد ddpt به سایر سیستمعاملها پورت شود.
برای پشتیبانی از دستگاههای ذخیرهسازی NVMe بخش زیر با عنوان: «پشتیبانی از NVME» را ببینید.
گزینهها (OPTIONS)
- blk_sgio={0|1}
- هنگامی که روی 0 تنظیم شود، با دستگاههای بلوکی (مانند /dev/sda) همانند فایلهای معمولی رفتار میشود (یعنی از read(2) و write(2) برای ورودی/خروجی استفاده میشود). هنگامی که روی 1 تنظیم شود، فرض میشود دستگاههای بلوکی ioctl با شناسه SG_IO را میپذیرند و دستورات SCSI برای ورودی/خروجی صادر میشوند. این حالت فقط برای هستههای سری 2.6 پشتیبانی میشود. توجه داشته باشید که دستگاههای ATAPI (مانند پخشکنندههای cd/dvd) از مجموعه دستورات SCSI استفاده میکنند اما دیسکهای ATA اینگونه نیستند (مگر اینکه تبدیل پروتکل وجود داشته باشد، همانطور که اغلب در کلاس دستگاههای ذخیرهسازی حجیم USB رخ میدهد). اگر دستگاه ورودی یا خروجی یک پارتیشن دستگاه بلوکی باشد (مانند /dev/sda3)، تنظیم این گزینه باعث نادیده گرفته شدن اطلاعات پارتیشن میشود (زیرا دسترسی مستقیماً به دستگاه زیرین انجام میگیرد). مقدار پیشفرض 0 است. پرچم 'sgio' را ببینید.
- bpt=BPT
- هر تراکنش ورودی/خروجی با استفاده از BPT بلوک انجام خواهد شد (یا کمتر اگر نزدیک پایان کپی باشد). مقدار پیشفرض برای اندازههای بلوک منطقی کمتر از ۲۰۴۸ بایت برابر ۱۲۸ است، در غیر این صورت مقدار پیشفرض ۳۲ است. بنابراین برای bs=512 خواندنها و نوشتنها هر کدام به طور پیشفرض ۶۴ کیلوبایت (KiB) داده منتقل میکنند (کمتر اگر نزدیک پایان انتقال یا به دلیل محدودیتهای حافظه باشد). هنگامی که به درایوهای cd/dvd دسترسی پیدا میشود، اندازه بلوک منطقی معمولاً ۲۰۴۸ بایت است و پیشفرض bpt به ۳۲ میرسد که باز هم به معنای انتقالهای ۶۴ کیلوبایتی است. هنگامی که گزینه blk_sgio=1 استفاده میشود، لایه بلوکی محدودیتهای بالای نسبتاً پایینی برای اندازههای انتقال دارد (در مقایسه با گرههای دستگاه sg، مسیر /sys/block/<dev_name>/queue/max_sectors_kb را ببینید).
- bs=BS
- که در آن BS باید اندازه بلوک منطقی دستگاه فیزیکی باشد (اگر هر یک از فایلهای ورودی یا خروجی از طریق دستورات SCSI قابل دسترسی باشند). توجه داشته باشید که این با dd(1) که اجازه میدهد BS مضرب صحیحی باشد متفاوت است. مقدار پیشفرض ۵۱۲ است که معمولاً برای دیسکها درست است اما برای cdromها نادرست است (که معمولاً دارای بلوکهای ۲۰۴۸ بایتی هستند). برای این ابزار، حداکثر اندازه هر عملیات ورودی/خروجی منفرد برابر با BS * BPT بایت است.
- cdbsz={6|10|12|16}
- اندازه دستورات READ و/یا WRITE صادرشده SCSI بر روی نامهای دستگاه sg (یا دستگاههای بلوکی هنگامی که 'iflag=sgio' و/یا 'oflag=sgio' داده شده باشد). پیشفرض بلوکهای دستور SCSI به اندازه ۱۰ بایت است (مگر اینکه محاسبات نشان دهد ممکن است از شماره بلوک ۴ بایتی فراتر رود یا BPT بزرگتر از ۱۶ بیت (۶۵۵۳۵) باشد، که در این صورت پیشفرض دستورات SCSI به اندازه ۱۶ بایت خواهد بود).
- cdl=CDL
- امکان
تنظیم
محدودیتهای
مدتزمان
دستور را
فراهم
میکند. CDL
یا یک مقدار
تکی است یا
دو مقدار که
با ویرگول
از هم جدا
شدهاند.
اگر یک
مقدار داده
شود، برای
هر دو IFILE و OFILE
اعمال
میشود (در
صورتی که
دستگاههای
عبور
مستقیم یا
pass-through باشند).
اگر دو
مقدار داده
شود، مقدار
اول برای IFILE
اعمال
میشود در
حالی که
مقدار دوم
برای OFILE
اعمال
میگردد.
مقدار
میتواند
از 0 تا 7 باشد
که 0 مقدار
پیشفرض
بوده و به
معنای عدم
وجود
محدودیت
مدتزمان
دستور است.
محدودیتهای
مدتزمان
دستور فقط
توسط
دستورات ۱۶
بایتی READ و WRITE
پشتیبانی
میشوند (به
علاوه READ(32)، WRITE(32)
و دستور WRITE SCATTERED،
اما توسط
این ابزار
استفاده
میشوند).
اگر عملوند
cdbsz داده نشود
و مقداری
کمتر از ۱۶
داشته
باشد، در
صورتی که CDL
بزرگتر از
0 باشد،
مقدار cdbsz به
۱۶ افزایش
مییابد.
محدودیتهای مدتزمان دستور را میتوان در صفحات حالت Command duration limit A و B و همچنین صفحات حالت Command duration limit T2A و T2B مشاهده کرد و تغییر داد. از ابزار sdparm میتوان برای دسترسی و تغییر این صفحات حالت استفاده کرد. - coe={0|1|2|3}
- برای ادامه در صورت بروز خطا ('coe' یا continue on error) روی 1 یا بیشتر تنظیم میشود. فقط برای خطاهای مربوط به دستگاههای sg یا دستگاههای بلوکی با پرچم 'sgio' فعال اعمال میشود. بنابراین خطاها روی سایر فایلها اجرای sg_dd را متوقف خواهند کرد. مقدار پیشفرض 0 است که به معنای توقف با هر خطایی میباشد. برای اطلاعات بیشتر پرچم 'coe' را ببینید.
- coe_limit=CL
- که در آن CL حداکثر تعداد بلوکهای خراب متوالی است که در هنگام خواندن (به دلیل "coe>0") قبل از پایان یافتن کپی از آنها عبور میشود. این فقط زمانی اعمال میشود که دسترسی به IFILE از طریق ioctl با شناسه SG_IO انجام شود. پیشفرض 0 است که به عنوان نامحدود تفسیر میشود. هدف این گزینه این است که کپی را کمی پس از شناسایی رسانه ضبطنشده متوقف کند در حالی که همچنان قابلیت «ادامه در صورت بروز خطا» را ارائه میدهد.
- conv=sparse
- بخش «تبدیلها» را در ادامه ببینید.
- count=COUNT
- کپی کردن COUNT بلوک از IFILE به OFILE. مقدار پیشفرض حداقل تعداد بلوکها (بین IFILE و OFILE) است که دستگاههای sg از دستورات SCSI READ CAPACITY گزارش میدهند یا دستگاههای بلوکی (یا پارتیشنهای آنها) گزارش میکنند. فایلهای معمولی برای تعیین اندازهشان بررسی نمیشوند. اگر skip=SKIP یا seek=SEEK داده شده باشد و مقدار count به دست آمده باشد (یعنی به صراحت مشخص نشده باشد)، مقدار count به دست آمده کاهش مییابد تا کپی از محدوده دستگاه فراتر نرود. اگر نام فایل یک پارتیشن دستگاه بلوکی باشد و COUNT داده نشود، اندازه پارتیشن به جای اندازه کل دستگاه استفاده میشود. اگر COUNT داده نشود (یا count=-1 باشد) و نتوان آن را استخراج کرد، یک پیام خطا صادر شده و کپی انجام نمیشود.
- dio={0|1}
- مقدار پیشفرض 0 است که ورودی/خروجی غیرمستقیم (بافری) را در دستگاههای sg انتخاب میکند. مقدار 1 برای ورودی/خروجی مستقیم تلاش میکند که در صورت عدم دسترسی، به ورودی/خروجی غیرمستقیم برمیگردد و در پایان این موضوع را ثبت میکند. اگر ورودی/خروجی مستقیم انتخاب شود و /sys/module/sg/parameters/allow_dio دارای مقدار 0 باشد، یک هشدار صادر میشود (و ورودی/خروجی غیرمستقیم انجام میگیرد). برای کنترل دقیقتر از 'iflag=dio' یا 'oflag=dio' استفاده کنید.
- grpnum=GN
- فیلد «شماره گروه» یک فیلد ۶ بیتی (0 تا 0x3f) است که در تمام دستورات SCSI READ و WRITE (به جز دستورات منسوخشده READ(6) و WRITE(6)) یافت میشود. GN یا یک مقدار تکی است یا یک جفت مقدار که با ویرگول از هم جدا شدهاند. مقدار پیشفرض 0 است. اگر یک جفت مقدار داده شود، مقدار اول برای بخش IFILE (یعنی SCSI READ) و مقدار دوم برای بخش OFILE (یعنی SCSI WRITE) استفاده میشود.
- شماره گروه برای دستگاههای بدون عبور مستقیم با استفاده از fcntl(F_SET_FILE_RW_HINT) اعمال میشود. برای بخش OFILE، پرچم oflag=direct برای نادیده گرفتن کش نوشتن لازم است زیرا F_SET_FILE_RW_HINT نحوه مدیریت کش نوشتن را تغییر نمیدهد (اما fcntl(F_SET_RW_HINT) نحوه مدیریت کش نوشتن را تغییر میدهد).
- ibs=BS
- در صورت ارائه باید با BS دادهشده به گزینه 'bs=' یکسان باشد.
- if=IFILE
- خواندن از IFILE به جای ورودی استاندارد (stdin). اگر IFILE مقدار '-' باشد، از ورودی استاندارد خوانده میشود. خواندن از ابتدای IFILE آغاز میشود مگر اینکه SKIP مشخص شده باشد.
- iflag=FLAGS
- که در آن FLAGS فهرستی از یک یا چند پرچم جداشده با ویرگول است که در ادامه شرح داده شدهاند. این پرچمها به IFILE مرتبط هستند و هنگامی که IFILE ورودی استاندارد باشد نادیده گرفته میشوند.
- obs=BS
- در صورت ارائه باید با BS دادهشده به گزینه 'bs=' یکسان باشد.
- odir={0|1}
- هنگامی که روی یک تنظیم شود، دستگاههای بلوکی (مانند /dev/sda) را با پرچم O_DIRECT باز میکند. با تنظیم این گزینه، بافرهای حافظه کاربر با اندازه صفحه همتراز میشوند. مقدار پیشفرض 0 است (یعنی از پرچم O_DIRECT استفاده نمیشود). بر روی فایلهای sg، معمولی یا خام هیچ تأثیری ندارد. اگر blk_sgio نیز تنظیم شده باشد، هر دو رعایت میشوند: دستگاههای بلوکی با پرچم O_DIRECT باز میشوند و دستورات SCSI از طریق ioctl با شناسه SG_IO صادر میگردند.
- of=OFILE
- نوشتن در OFILE به جای خروجی استاندارد (stdout). اگر OFILE مقدار '-' باشد، در خروجی استاندارد نوشته میشود. اگر OFILE مقدار /dev/null باشد، هیچ نوشتن واقعی انجام نمیشود. اگر OFILE مقدار '.' (نقطه) باشد، به همان شیوه /dev/null با آن رفتار میشود (این یک نماد کوتاهنویسی است). اگر OFILE وجود داشته باشد، کوتاه (truncate) نمیشود؛ بلکه از ابتدای OFILE بازنویسی میشود مگر اینکه 'oflag=append' یا SEEK داده شده باشد.
- of2=OFILE2
- نوشتن خروجی در OFILE2. رفتار پیشفرض این است که این نوشتن اضافی انجام نشود (یعنی هنگامی که این گزینه داده نشده باشد). فرض میشود OFILE2 یک فایل معمولی یا یک fifo (یعنی لوله نامگذاریشده) باشد. OFILE2 برای نوشتن باز میشود، در صورت لزوم ایجاد میگردد و در پایان انتقال بسته میشود. اگر OFILE2 یک fifo (لوله نامگذاریشده) باشد، باید دستور دیگری آن دادهها را مصرف کند (مانند 'md5sum OFILE2')، در غیر این صورت این ابزار مسدود خواهد شد.
- oflag=FLAGS
- که در آن FLAGS فهرستی از یک یا چند پرچم جداشده با ویرگول است که در ادامه شرح داده شدهاند. این پرچمها به OFILE مرتبط هستند و هنگامی که OFILE مقدار /dev/null، '.' (نقطه) یا خروجی استاندارد باشد، نادیده گرفته میشوند.
- retries=RETR
- گاهی اوقات تلاش مجدد در سمت میزبان مفید است، به عنوان مثال زمانی که خطای انتقال وجود دارد. هنگامی که RETR بزرگتر از صفر باشد، دستورات READ و WRITE مربوط به SCSI در صورت بروز خطا، به تعداد RETR بار دوباره تلاش میشوند. مقدار پیشفرض صفر است.
- seek=SEEK
- شروع نوشتن به فاصله SEEK بلوک به اندازه bs از ابتدای OFILE. پیشفرض بلوک 0 است (یعنی ابتدای فایل).
- skip=SKIP
- شروع خواندن به فاصله SKIP بلوک به اندازه bs از ابتدای IFILE. پیشفرض بلوک 0 است (یعنی ابتدای فایل).
- sync={0|1}
- هنگامی که 1 باشد، دستور SYNCHRONIZE CACHE را روی OFILE در پایان انتقال انجام میدهد. فقط زمانی فعال است که OFILE نام فایل یک دستگاه sg یا یک دستگاه بلوکی باشد و 'blk_sgio=1' داده شده باشد.
- time={0|1}[,TO]
- هنگامی که 1
باشد، زمان
انتقال را
اندازه
گرفته و
محاسبه
توان
عملیاتی را
انجام
میدهد و
نتایج را در
هنگام
پایان (به stderr)
ارسال
میکند.
هنگامی که 0
باشد
(پیشفرض)
زمانسنجی
انجام
نمیدهد.
اگر بعد از آن مقدار یک ویرگول بیاید، آنگاه TO مهلت زمانی دستور بر حسب ثانیه برای دستورات SCSI READ، WRITE یا VERIFY صادرشده توسط این ابزار است. مقدار پیشفرض ۶۰ ثانیه است. - verbose=VERB
- با افزایش VERB، میزان خروجی اشکالزدایی ارسالی به stderr نیز افزایش مییابد. مقدار پیشفرض صفر است که حداقل میزان خروجی اشکالزدایی را به همراه دارد. مقدار 1 اطلاعات اضافی غیرتکراری را گزارش میدهد. مقدار 2 بلوکهای توصیفکننده دستور (cdb) و پاسخها را برای دستورات SCSI غیرتکراری (یعنی غیر از READ و WRITE) گزارش میکند. پردازش خطا تکراری محسوب نمیشود. مقادیر 3 و 4 برای تمام دستورات SCSI (و فراخوانیهای read() و write() یونیکس) خروجی تولید میکنند، بنابراین میتواند حجم خروجی بسیار زیادی ایجاد کند. این حالت فقط برای دستگاههای عمومی SCSI (یا sg) و دستگاههای بلوکی در صورت تنظیم گزینه 'blk_sgio=1' رخ میدهد.
- -d, --dry-run
- تمام تجزیه و آمادهسازی خط فرمان را انجام میدهد اما از کپی یا خواندن واقعی صرفنظر میکند. آن آمادهسازی ممکن است شامل باز کردن IFILE یا OFILE برای تعیین طول آنها باشد. این گزینه ممکن است برای آزمایش نحو فراخوانیهای پیچیده خط فرمان قبل از اجرای آنها مفید باشد.
- -h, --help
- پیام راهنمای استفاده را نمایش داده و خارج میشود.
- -n, --nocopy
- این گزینه باعث میشود که این ابزار در شرایطی که در غیر این صورت اقدام به نوشتن روی OFILE یا stdout میکرد، خارج شود. این گزینه مانع تلاش برای اعتبارسنجی (یعنی با استفاده از گزینه --verify) نخواهد شد زیرا در آن حالت OFILE نباید تغییر یابد. حالت گزینه طولانی میتواند به صورت --nc خلاصه شود. روش صریح برای دستور دادن به این ابزار جهت خواندن صرف از IFILE، استفاده از '--of=/dev/null' در فراخوانی است. این گزینه میتواند به عنوان ایمنی مضاعف در مواردی که '--of=/dev/null' داده نشده یا اشتباه تایپ شده باشد در نظر گرفته شود.
- -p, --progress
- این گزینه
باعث
میشود که
یک گزارش
پیشرفت هر
دو دقیقه
یکبار تا
زمان تکمیل
کپی نمایش
داده شود.
پس از اتمام
کپی، سطری
با عبارت
"completed" چاپ
میشود تا
گزارش
نهایی از
گزارشهای
پیشرفت
قبلی
متمایز
گردد.
هنگامی که
دوبار
استفاده
شود، گزارش
پیشرفت هر
یک دقیقه
یکبار و
هنگامی که
سه بار
استفاده
شود، گزارش
پیشرفت هر
۳۰ ثانیه
یکبار
نمایش
مییابد.
اگر این گزینه داده شود، گزینه 'time=1' به طور ضمنی تنظیم میشود. - -v, --verbose
- هنگامی که یک بار استفاده شود، معادل با verbose=1 است. هنگامی که دو بار استفاده شود (مانند "-vv") معادل با verbose=2 است و به همین ترتیب.
- -x, --verify
- انجام عملیات اعتبارسنجی (مانند دستور cmp(1) در یونیکس) به جای کپی. با "oflag=sparse" قابل استفاده نیست. of=OFILE باید داده شود و OFILE باید یک دستگاه sg یا یک دستگاه بلوکی باشد که "oflag=sgio" نیز برای آن داده شده باشد. از دستور SCSI VERIFY با فیلد BYTCHK تنظیمشده روی 1 استفاده میکند. هنگامی که این گزینه داده شود، دستور VERIFY به جای WRITE استفاده میشود. دستور VERIFY(6) وجود ندارد. در اولین عدم تطابق متوقف میشود مگر اینکه oflag=coe داده شده باشد.
- -V, --version
- اطلاعات شماره نسخه را نمایش داده و خارج میشود.
تبدیلها (CONVERSIONS)
یک یا چند تبدیل را میتوان به گزینه "conv=" داد. اگر بیش از یک مورد داده شود، باید با ویرگول از هم جدا شوند. ابزار sg_dd تبدیلهای سنتی dd (مانند تبدیل ASCII به EBCDIC) را انجام نمیدهد. تبدیلهایی که اخیراً اضافه شدهاند تا حدی با پرچمها همپوشانی دارند، بنابراین برخی تبدیلها اکنون توسط sg_dd پشتیبانی میشوند.
- nocreat
- این تبدیل تأثیری مشابه "oflag=nocreat" دارد، یعنی: OFILE باید وجود داشته باشد و ایجاد نخواهد شد.
- noerror
- این تبدیل بسیار نزدیک به "iflag=coe" است و به همان شیوه با آن رفتار میشود. پرچم "coe" را ببینید. توجه داشته باشید که بروز خطا در OFILE کپی را متوقف خواهد کرد.
- notrunc
- این تبدیل برای سازگاری با dd پذیرفته شده و نادیده گرفته میشود زیرا رفتار پیشفرض این ابزار، کوتاه نکردن OFILE است.
- null
- هیچ تأثیری ندارد و صرفاً یک جایگزین است.
- sparse
- سیستمعامل FreeBSD از "conv=sparse" پشتیبانی میکند، بنابراین همین نحو در sg_dd نیز پشتیبانی میشود. برای اطلاعات بیشتر "sparse" را در بخش «پرچمها» ببینید.
- sync
- توسط sg_dd نادیده گرفته میشود. در dd به معنای پر کردن با صفر (به جای پرش) است و معمولاً مانند "conv=noerror,sync" استفاده میشود تا همان عملکرد "iflag=coe" در sg_dd را داشته باشد.
پرچمها (FLAGS)
در اینجا فهرستی از پرچمها و معانی آنها آورده شده است:
- 00
- این پرچم
فقط با iflag=
فعال است و
هنگامی که
داده شود،
جایگزین if=IFILE
میگردد.
اگر هر دو
داده شوند،
یک خطا
ایجاد
میشود.
ورودی یک
جریان از
صفرها
خواهد بود،
مشابه
استفاده از
"if=/dev/zero" به
تنهایی (اما
کمی
سریعتر)،
به جز در
مورد زیر.
اگر 'iflag=00,ff' داده شود، آنگاه آدرس بلوک (۳۲ بیت پایینی، در قالب ۴ بایت، با ترتیب big endian) به دفعات متعدد در هر بلوک قرار میگیرد. آدرس بلوک تنظیم skip=SKIP را لحاظ میکند. ابزار sgp_dd گزینهای با نام --chkaddr دارد که مکمل این گزینه است. - append
- باعث میشود پرچم O_APPEND به باز کردن OFILE اضافه شود. برای فایلهای معمولی این امر منجر به افزودن دادهها به انتهای هر داده موجود میگردد. نمیتواند همراه با گزینه seek=SEEK استفاده شود زیرا با یکدیگر تداخل دارند. عملکرد پیشفرض این ابزار این است که دادههای موجود را از ابتدای فایل یا در صورت ارائه SEEK، از بلوک SEEK بازنویسی کند. توجه داشته باشید که تلاش برای افزودن به انتها ('append') در یک فایل دستگاه (مانند یک دیسک) معمولاً نادیده گرفته میشود یا ممکن است باعث گزارش خطا گردد.
- coe
- ادامه در صورت بروز خطا (continue on error). فقط برای دستگاههای sg و دستگاههای بلوکی که پرچم 'sgio' دارند فعال است. عبارات 'iflag=coe oflag=coe' و 'coe=1' معادل هستند. از این پرچم دوبار استفاده کنید (مانند 'iflag=coe,coe') تا همانند 'coe=2' عمل کند. خطای رسانه، سختافزار یا بررسی خالی بودن (blank check) در حین خواندن، بلوکهای قبل از بلوک خراب را مجدداً میخواند، سپس تلاش میکند تا بلوک خراب را بازیابی کند که در صورت شکست، صفرها را جایگزین مینماید، و در نهایت بلوکهای بعد از بلوک خراب را دوباره میخواند. خطای رسانه، سختافزار یا بررسی خالی بودن در حین نوشتن ثبت شده و نادیده گرفته میشود. کلید حس عدم تطابق (miscompare) در طول یک دستور VERIFY (یعنی زمانی که --verify داده شده باشد) ثبت شده و هنگام وجود 'oflag=coe' نادیده گرفته میشود. بازیابی بلوک خراب هنگام خواندن در صورتی که 'coe' دوبار یا بیشتر داده شده باشد (همچنین با گزینه خط فرمان 'coe=2') از دستور SCSI READ LONG استفاده میکند. علاوه بر این، READ LONG بیت CORRCT خود را در صورت ارائه سه بار 'coe' تنظیم خواهد کرد. دیسکهای SCSI ممکن است به طور خودکار سعی کنند بخشهای معیوب را مجدداً نگاشت کنند (صفات AWRE و ARRE را در صفحه حالت بازیابی خطای خواندن/نوشتن ببینید؛ ابزار sdparm میتواند به این صفات دسترسی داشته و احتمالاً آنها را تغییر دهد). خطاهایی که در سایر انواع فایل رخ میدهند، باعث توقف sg_dd خواهند شد. پیامهای خطا به stderr ارسال میشوند. این پرچم مشابه 'conv=noerror,sync' در ابزار dd(1) است. یادداشت مربوط به READ LONG را در ادامه ببینید.
- dio
- درخواست میکند که گره دستگاه sg مرتبط با این پرچم، ورودی/خروجی مستقیم انجام دهد. اگر ورودی/خروجی مستقیم در دسترس نباشد، به ورودی/خروجی غیرمستقیم برمیگردد و این موضوع را پس از پایان کار گزارش میکند. اگر ورودی/خروجی مستقیم انتخاب شود و /sys/module/sg/parameters/allow_dio دارای مقدار 0 باشد، یک هشدار صادر شده (و ورودی/خروجی غیرمستقیم انجام میشود).
- direct
- باعث اضافه شدن پرچم O_DIRECT به باز کردن IFILE و/یا OFILE میشود. این پرچم نیاز به مقداری همترازی حافظه در ورودی/خروجی دارد. از این رو بافرهای حافظه کاربر با اندازه صفحه همتراز میشوند. روی فایلهای sg، معمولی یا خام هیچ تأثیری ندارد. اگر 'iflag=sgio' و/یا 'oflag=sgio' نیز تنظیم شده باشد، هر دو رعایت میشوند: دستگاههای بلوکی با پرچم O_DIRECT باز میشوند و دستورات SCSI از طریق ioctl با شناسه SG_IO صادر میگردند.
- dpo
- بیت DPO (غیرفعال کردن خروج از صفحه یا disable page out) را در دستورات READ و WRITE مربوط به SCSI تنظیم میکند. برای انواع دستورات ۶ بایتی cdb مربوط به READ و WRITE پشتیبانی نمیشود. این بیت نشان میدهد که احتمالاً نیازی نیست دادهها در حافظه کش دستگاه (مانند دیسک) باقی بمانند. ممکن است کپی رسانه را تسریع کند و/یا باعث شود کپی رسانه تأثیر کمتری بر سایر کاربران دستگاه داشته باشد.
- dsync
- باعث اضافه شدن پرچم O_SYNC به باز کردن IFILE و/یا OFILE میشود. حرف 'd' برای کاهش ابهام با گزینه 'sync=0|1' که عمل دیگری دارد (یعنی همگامسازی با رسانه در پایان انتقال)، در ابتدا اضافه شده است.
- excl
- باعث اضافه شدن پرچم O_EXCL به باز کردن IFILE و/یا OFILE میشود.
- ff
- این پرچم
فقط با iflag=
فعال است و
هنگامی که
داده شود
جایگزین if=IFILE
میگردد.
اگر هر دو
داده شوند،
یک خطا
ایجاد
میشود.
ورودی یک
جریان از
بایتهای 0xff
(یا تمام
بیتها
تنظیمشده
روی ۱)
خواهد بود،
به جز در
مورد زیر.
اگر 'iflag=00,ff' داده شود، آنگاه آدرس بلوک (۳۲ بیت پایینی، در قالب ۴ بایت، با ترتیب big endian) به دفعات متعدد در هر بلوک قرار میگیرد. آدرس بلوک تنظیم skip=SKIP را لحاظ میکند. - flock
- پس از باز کردن فایل مربوطه (یعنی IFILE و/یا OFILE) تلاشی برای به دست آوردن یک قفل انحصاری مشورتی (advisory exclusive lock) با فراخوانی سیستمی flock() انجام میشود. آرگومانهای flock عبارتند از "FLOCK_EX | FLOCK_NB" که باعث میشود قفل در صورت در دسترس بودن گرفته شود و در غیر این صورت خطای «موقت در دسترس نیست» (temporarily unavailable) ایجاد گردد. در حالت دوم وضعیت خروج ۹۰ تولید شده و هیچ کپی انجام نمیشود.
- fua
- باعث تنظیم بیت FUA (اجبار به دسترسی واحد یا force unit access) در دستورات READ و/یا WRITE مربوط به SCSI میشود. این گزینه فقط روی دستگاههای sg یا دستگاههای بلوکی که پرچم 'sgio' دارند تأثیر دارد. انواع ۶ بایتی دستورات SCSI READ و WRITE از بیت FUA پشتیبانی نمیکنند.
- nocache
- از posix_fadvise() استفاده میکند تا به فایل مربوطه توصیه کند که نیازی به پر کردن بافر فایل با بلوکهایی که اخیراً خوانده شده یا نوشته شدهاند نیست.
- nocreat
- این پرچم فقط در oflag=FLAGS فعال است. در صورت وجود، OFILE در صورتی که وجود داشته باشد باز خواهد شد. اگر OFILE وجود نداشته باشد، یک خطا ایجاد میشود. بدون این پرچم، یک فایل معمولی (خالی) با نام OFILE ایجاد شده (و سپس پر میشود). برای اسکریپتهای سطح تولید که در آنها OFILE یک گره دستگاه است (مانند '/dev/sdc')، این پرچم توصیه میشود. این پرچم در برابر احتمال دور از ذهن ناپدید شدن موقت 'dev/sdc' (مانند جدا کردن حافظه فلش USB) که منجر به ایجاد یک فایل معمولی بزرگ به نام '/dev/sdc' میشود، محافظت میکند.
- null
- هیچ تأثیری ندارد و صرفاً یک جایگزین است.
- pt
- همان معنای پرچم sgio را دارد. برای سازگاری با ابزار ddpt اضافه شده است.
- random
- این پرچم فقط با iflag= فعال است و هنگامی که داده شود، جایگزین if=IFILE میگردد. اگر هر دو داده شوند، یک خطا ایجاد میشود. ورودی یک جریان از بایتهای شبهتصادفی خواهد بود. فراخوانی سیستمی getrandom(2) در لینوکس برای ایجاد یک مقدار اولیه (seed) استفاده میشود و پس از آن از mrand48(3) برای تولید یک دنباله شبهتصادفی، به میزان ۴ بایت در هر مرحله، استفاده میگردد. کیفیت تصادفی بودن را میتوان با ابزار ent(1) مشاهده کرد. این یک تولیدکننده اعداد تصادفی با کیفیت بالا نیست، بلکه برای سرعت ساخته شده است نه کیفیت. یکی از کاربردهای آن بررسی درستی عملیاتهای کپی و اعتبارسنجی این ابزار است.
- sgio
- باعث میشود که دسترسی به دستگاههای بلوکی به جای دستورات استاندارد read() و write() یونیکس، از طریق ioctl با شناسه SG_IO انجام شود. هنگامی که از ioctl با شناسه SG_IO استفاده میشود، دستورات SCSI READ و WRITE مستقیماً برای جابجایی دادهها به کار میروند. دستگاههای sg همیشه از ioctl با شناسه SG_IO استفاده میکنند. این پرچم در مقایسه با گزینه 'blk_sgio=1' که از جهات دیگر یکسان است، کنترل دقیقتری ارائه میدهد.
- sparse
- پس از خوانده شدن هر بخش به اندازه BS * BPT بایت از ورودی، بررسی میشود که آیا کاملاً از صفر تشکیل شده است یا خیر. اگر چنین باشد، هیچ چیزی در فایل خروجی نوشته نمیشود مگر اینکه این آخرین بخش انتقال باشد. این پرچم فقط با گزینه oflag فعال است. هنگامی که خروجی قابلیت پیمایش (seekable) نداشته باشد (مانند stdout) نمیتوان از آن استفاده کرد. اگر فایل خروجی /dev/null باشد نادیده گرفته میشود. توجه داشته باشید که این ابزار قبل از شروع به نوشتن روی OFILE، آن را حذف نمیکند. از این رو ممکن است مفید باشد که اگر OFILE بزرگ است، قبل از استفاده از oflag=sparse آن را به صورت دستی حذف کنید. آخرین بخش همیشه نوشته میشود تا فایلهای معمولی همان اندازه اصلی را نشان دهند و برنامههایی مانند md5sum و sha1sum صرفنظر از اینکه oflag=sparse داده شده باشد یا خیر، مقدار یکسانی تولید کنند. این گزینه ممکن است زمانی که OFILE یک دستگاه خام است استفاده شود، اما احتمالاً تنها زمانی مفید است که مشخص باشد دستگاه حاوی صفر است (مانند یک دیسک SCSI پس از دستور FORMAT).
گزینههای منسوخشده (RETIRED OPTIONS)
در اینجا برخی از گزینههای منسوخشده آورده شدهاند که همچنان وجود دارند:
- append=0 | 1
- هنگامی که تنظیم شود، معادل با 'oflag=append' است. هنگامی که پاک شود، رفتار ابزار بازنویسی روی فایل موجود (در صورت وجود) خواهد بود؛ این حالت پیشفرض است. پرچم 'append' را ببینید.
- fua=0 | 1 | 2 | 3
- بیت اجبار به دسترسی واحد (force unit access). هنگامی که 3 باشد، fua هم روی IFILE و هم روی OFILE تنظیم میشود؛ هنگامی که 2 باشد، fua روی IFILE تنظیم میشود؛ هنگامی که 1 باشد، fua روی OFILE تنظیم میشود؛ هنگامی که 0 باشد (پیشفرض)، fua روی هر دو پاک میشود. پرچم 'fua' را ببینید.
نکات (NOTES)
دستگاههای بلوکی (مانند /dev/sda و /dev/hda) میتوانند برای IFILE مشخص شوند. اگر هیچیک از گزینههای '-iflag=direct'، 'iflag=sgio' یا 'blk_sgio=1' داده نشود، ورودی/خروجی بلوکی عادی شامل بافرسازی و کش انجام میشود. اگر فقط '-iflag=direct' داده شود، از بافرسازی و کش صرفنظر میشود (این امر هم برای دستگاههای SCSI و هم برای دیسکهای ATA قابل اعمال است). اگر 'iflag=sgio' یا 'blk_sgio=1' داده شود، ioctl با شناسه SG_IO روی فایل مشخصشده استفاده میشود که باعث ارسال دستورات SCSI به دستگاه میگردد و همچنین بیشتر اقدامات انجامشده توسط لایه بلوکی را دور میزند (این فقط برای دستگاههای SCSI اعمال میشود، نه دیسکهای ATA). همین امر برای دستگاههای بلوکی مشخصشده برای OFILE نیز صادق است.
آرگومانهای عددی گوناگون (مانند SKIP) ممکن است شامل پسوندهای ضریبی باشند یا به صورت هگزادسیمال داده شوند. بخش "NUMERIC ARGUMENTS" را در صفحه راهنمای sg3_utils(8) ببینید.
آرگومانهای COUNT، SKIP و SEEK میتوانند مقادیر ۶۴ بیتی (یعنی اعداد بسیار بزرگ) دریافت کنند. مقادیر دیگر محدود به مقادیری هستند که در یک عدد ۳۲ بیتی علامتدار جای میگیرند.
دادهها معمولاً در یک فرآیند دو مرحلهای به فضای کاربری منتقل میشوند: ابتدا آداپتور SCSI از طریق DMA دادهها را به بافرهای هسته منتقل میکند و سپس درایور sg این دادهها را به حافظه کاربر کپی مینماید (عملیات نوشتن این ترتیب را برعکس میکند). این «ورودی/خروجی غیرمستقیم» نامیده میشود و یک گزینه 'dio' برای انتخاب «ورودی/خروجی مستقیم» وجود دارد که مستقیماً از طریق DMA به حافظه کاربر منتقل میشود. به دلیل برخی مسائل، «ورودی/خروجی مستقیم» در درایور sg غیرفعال است و برای فعال کردن آن نیاز به تغییر پیکربندی دارد. این کار معمولاً با دستور 'echo 1 > /sys/module/sg/parameters/allow_dio' انجام میشود.
تمام خروجیهای اطلاعاتی، هشدارها و خطاها به stderr فرستاده میشوند تا فایل خروجی dd بتواند stdout باشد و بدون آلودگی باقی بماند. اگر هیچ گزینهای داده نشود، پیام راهنمای استفاده نمایش داده شده و هیچ کار دیگری انجام نمیشود.
حتی اگر READ LONG روی یک بلوک «خراب» هنگامی که 'coe=2' (یا 'coe=3') داده شده است موفق شود، ممکن است دادههای بازیابیشده مفید نباشند. هیچ تضمینی وجود ندارد که دادههای کاربر در ۵۱۲ بایت اول به همان شکل ظاهر شوند.
یک دستگاه خام باید قبل از استفاده از sg_dd به یک دستگاه بلوکی متصل (bind) شود. برای اطلاعات بیشتر در مورد اتصال دستگاههای خام، raw(8) را ببینید. برای اطمینان و ایمنی، نگاشت دستگاه sg به دستگاههای بلوکی SCSI باید قبل از استفاده با sg_map بررسی شود.
اطلاعات پارتیشن دیسک را اغلب میتوان با fdisk(8) یافت [آرگومان "-ul" از این نظر مفید است].
برای دستگاههای sg (و دستگاههای بلوکی هنگامی که blk_sgio=1 داده شده است)، این ابزار دستورات SCSI READ و WRITE (از نوع SBC) صادر میکند که برای دیسکها و خواندن از درایوهای CD/DVD/HD-DVD/BD مناسب هستند. آن دستورات برای دستگاههای نوار (tape) قالببندی صحیحی ندارند، بنابراین sg_dd نباید روی دستگاههای نوار استفاده شود. اگر بزرگترین آدرس بلوک در انتقال درخواستی از شماره بلوک ۳۲ بیتی فراتر رود (یعنی 0xffff [یا 0xffffffff])، یک هشدار صادر شده و دستگاه sg از طریق دستورات SCSI READ(16) و WRITE(16) مورد دسترسی قرار میگیرد.
ویژگیهای یک دستگاه بلوکی (پارتیشن) هنگامی که 'blk_sgio=1' استفاده میشود نادیده گرفته میشوند. بنابراین در این فراخوانی به جای پارتیشن دوم، کل دستگاه خوانده میشود:
sg_dd if=/dev/sdb2 blk_sgio=1 of=t bs=512
پشتیبانی از NVME (NVME SUPPORT)
برخی پشتیبانیها برای کپی از و به دستگاههای NVMe در لینوکس اضافه شده است. دو نوع دستگاه کاراکتری ("char") مربوط به NVME وجود دارد، مانند: /dev/nvme<cid> و /dev/ng<cid>n<nsid> که در آن <cid> شناسه کنترلکننده (شروع از 0) و <nsid> شناسه فضای نام NVMe (شروع از 1) است. شکل دوم در /proc/devices با عنوان "nvme-generic" نامیده میشود. دستگاههای بلوکی NVMe دارای این فرم هستند: /dev/nvme<cid>n<nsid>[p<part_id>] که در آن <part_id> اختیاری شناسه پارتیشن است (شروع از 1). در مورد دستگاههای بلوکی NVMe، عمل پیشفرض sg_dd دسترسی به آنها با استفاده از ورودی/خروجی استاندارد یونیکس است (یعنی read(2) یا write(2)). برای دسترسی به آنها با استفاده از دستورات SCSI/NVMe، پرچم "sgio" یا "pt" باید ارائه شود (مانند iflag=pt if=/dev/nvme0n1).
درست همانند پارتیشنهای روی دیسکهای SCSI، دسترسی به پارتیشنهای NVMe (مانند iflag=pt if=/dev/nvme0n1p2) با استفاده از یک رابط عبور مستقیم (pass-through) خطرناک است. دلیل آن این است که هر دو دستورات SCSI و NVMe از هرگونه ترتیبات پارتیشنبندی که لینوکس (یا هر سیستمعامل دیگر) روی آن دیسکها تنظیم کرده است بیاطلاع هستند. به عبارت دیگر، در مثال فوق عبارت "p2" در انتهای if=/dev/nvme0n1p2 هنگامی که از رابط عبور مستقیم استفاده میشود نادیده گرفته میشود.
دستورات READ و WRITE در NVMe در مجموعه دستورات "NVM" قرار دارند که مستلزم مشخص شدن فضای نام NVMe است. این بدان معناست که دستگاه کاراکتری /dev/nvme0 برای این ابزار مفید نیست، زیرا فقط دستورات مدیریتی (administrative) را میتوان به آن ارسال کرد. این باعث میشود /dev/ng<cid>n<nsid> تنها دستگاه کاراکتری ("char") مربوط به NVMe باشد که میتواند با این ابزار استفاده شود. از آنجا که این یک دستگاه بلوکی نیست، دستورات استاندارد read(2) و write(2) یونیکس با آن کار نخواهند کرد؛ بنابراین رابط عبور مستقیم، همراه با صدور دستورات SCSI/NVMe، توسط این ابزار فرض میشود.
اصطلاح «دستور SCSI/NVME» به این واقعیت اشاره دارد که این ابزار دستورات SCSI را صادر میکند و یک لایه پایینتر، در درون libsgutils، آنها را به دستورات متناظر NVMe تبدیل مینماید. این عمل به عنوان یک لایه ترجمه SCSI به NVMe (یا SNTL) شناخته میشود و کنسرسیوم NVMe در اوایل توسعه NVMe یک مقاله رسمی در مورد آن نوشت.
مثالها (EXAMPLES)
در استفاده بسیار شبیه به dd به نظر میرسد:
sg_dd if=/dev/sg0 of=t bs=512 count=1MB
این دستور ۱ میلیون بلوک ۵۱۲ بایتی را از دستگاه مرتبط با /dev/sg0 (که باید دارای بلوکهای ۵۱۲ بایتی باشد) به فایلی به نام t کپی میکند. با این فرض که /dev/sda و /dev/sg0 همان دستگاه باشند، دستور بالا معادل است با:
dd if=/dev/sda iflag=direct of=t bs=512 count=1000000
اگرچه سرعت dd ممکن است در صورتی که bs بزرگتر باشد و count به طور مناسب کاهش یابد، بهبود یابد. استفاده از گزینه 'iflag=direct' بافرسازی و کش کردنی را که معمولاً روی یک دستگاه بلوکی انجام میشود دور میزند.
استفاده از یک دستگاه خام برای انجام کاری مشابه روی یک دیسک ATA:
raw /dev/raw/raw1 /dev/hda
sg_dd if=/dev/raw/raw1 of=t bs=512 count=1MB
برای کپی کردن یک پارتیشن دیسک SCSI به یک پارتیشن دیسک ATA:
raw /dev/raw/raw2 /dev/hda3
sg_dd if=/dev/sg0 skip=10123456 of=/dev/raw/raw2 bs=512
این فرض میکند که یک پارتیشن معتبر روی دیسک SCSI در آدرس بلوک skip دادهشده (پس از نقطه ۵ گیگابایت آن دیسک) یافت میشود و پارتیشن تا انتهای دیسک SCSI ادامه دارد. تعیین صریح count احتمالاً گزینه ایمنتری است. پارتیشن به /dev/hda3 که یک آفست در دیسک ATA به نام /dev/hda است کپی میشود. تعداد دقیق بلوکهای خواندهشده از /dev/sg0 روی /dev/hda نوشته میشوند (یعنی بدون پدینگ یا فاصله پرکننده).
برای زمانسنجی یک خواندن جریانی از اولین ۱ گیگابایت (۲ به توان ۳۰ بایت) روی یک دیسک، میتوان از این ابزار استفاده کرد:
sg_dd if=/dev/sg0 of=/dev/null bs=512 count=2m time=1
پس از تکمیل، این دستور سطری شبیه به این را در خروجی نمایش میدهد: "time to transfer data was 18.779506 secs, 57.18 MB/sec". مقدار "MB/sec" در این مورد برابر با ۱٬۰۰۰٬۰۰۰ بایت در ثانیه است.
از گزینه 'of2=' میتوان برای کپی کردن دادهها و محاسبه md5sum آن بدون نیاز به خواندن مجدد دادهها استفاده کرد:
mkfifo fif
md5sum fif &
sg_dd if=/dev/sg3 iflag=coe of=sg3.img oflag=sparse of2=fif bs=512
این دستور از /dev/sg3 (مانند یک دیسک سوارنشده) ایمیج میگیرد و محتویات آن را در فایل (تنک یا sparse) بنام sg3.img قرار میدهد. بدون خواندن مجدد دادهها، همچنین یک محاسبه md5sum روی ایمیج انجام خواهد داد.
سیگنالها (SIGNALS)
مدیریت سیگنال از dd به امانت گرفته شده است: سیگنالهای SIGINT، SIGQUIT و SIGPIPE تعداد بلوکهای باقیمانده برای انتقال و تعداد رکوردهای ورودی + خروجی را چاپ میکنند؛ سپس رفتار پیشفرض خود را انجام میدهند. سیگنال SIGUSR1 باعث میشود همین اطلاعات نمایش داده شود در حالی که کپی همچنان ادامه مییابد. تمام خروجیهای ناشی از سیگنالها به stderr فرستاده میشوند.
وضعیت خروج (EXIT STATUS)
وضعیت خروج sg_dd در صورت موفقیت 0 است. در غیر این صورت صفحه راهنمای sg3_utils(8) را ببینید. از آنجا که این ابزار در سطحی بالاتر از دستورات منفرد کار میکند، و پرچمهای 'coe' و 'retries' وجود دارند، شکستهای دستورات منفرد SCSI لزوماً باعث خروج فرآیند نمیشوند.
در صورتی که پرچم flock داده شود و فرآیند دیگری قفل انحصاری مشورتی را در اختیار داشته باشد، یک وضعیت خروج اضافی با مقدار ۹۰ ایجاد میشود.
نویسندگان (AUTHORS)
نوشتهشده توسط Douglas Gilbert و Peter Allworth.
گزارش باگها (REPORTING BUGS)
گزارش باگها به <dgilbert at interlog dot com>.
حق نشر (COPYRIGHT)
حق نشر © 2000-2026
Douglas Gilbert
این
نرمافزار
تحت مجوز GPL
نسخه ۲
توزیع شده
است. هیچ
تضمینی
وجود
ندارد؛ حتی
برای
قابلیت
فروش یا
تناسب با یک
هدف خاص.
همچنین ببینید (SEE ALSO)
cmp(1)
یک صفحه وب برای بحث پیرامون sg_dd در آدرس https://sg.danny.cz/sg/sg_dd.html قرار دارد.
نسخهای مبتنی بر ریسههای POSIX از این ابزار به نام sgp_dd در بسته sg3_utils قرار دارد. نسخه دیگری از آن بسته با نام sgm_dd شناخته میشود و از ورودی/خروجی نگاشتشده در حافظه (memory mapped IO) برای افزایش سرعت انتقالها از دستگاههای sg استفاده میکند.
بسته lmbench شامل lmdd است که آن نیز جالب توجه است. برای انتقال دادهها به و از نوارهای مغناطیسی، dt را ببینید که در آدرس https://www.scsifaq.org/RMiller_Tools/index.html یافت میشود.
برای تغییر پارامترهای حالتی که بر کشسازی و بازیابی خطای یک دستگاه SCSI تأثیر میگذارند، sdparm(sdparm) را ببینید.
برای اعتبارسنجی دادهها روی رسانه یا اعتبارسنجی آن در برابر نسخهای دیگر از دادهها، sg_verify(sg3_utils) را ببینید.
همچنین ببینید: raw(8), dd(1), ddrescue(GNU), ddpt
| April 2026 | sg3_utils-1.49 |