SGM_DD(8) SG3_UTILS SGM_DD(8)

sgm_dd - کپی داده به و از پرونده‌ها و دستگاه‌ها، به‌ویژه دستگاه‌های SCSI

sgm_dd [bs=BS] [count=COUNT] [ibs=BS] [if=IFILE] [iflag=FLAGS] [obs=BS] [of=OFILE] [oflag=FLAGS] [seek=SEEK] [skip=SKIP] [--help] [--version]

[bpt=BPT] [cdbsz=6|10|12|16] [dio=0|1] [sync=0|1] [time=0|1] [verbose=VERB] [--dry-run] [--nocopy] [--progress] [--verbose]

کپی داده‌ها به و از هر پرونده‌ای. ویژه «پرونده‌هایی» که دستگاه‌های عمومی SCSI لینوکس (sg) و دستگاه‌های خام هستند. از انتقال‌های نگاشت حافظه (memory mapped) روی دستگاه‌های sg استفاده می‌کند. دارای نحو و معنایی مشابه با dd(1) است اما هیچ تبدیلی انجام نمی‌دهد.

تنها زمانی انتقال‌های نگاشت حافظه را انجام می‌دهد که IFILE یا OFILE دستگاه‌های عمومی SCSI (sg) باشند.

اگر هر دو IFILE و OFILE دستگاه‌های sg باشند، انتقال‌های نگاشت حافظه روی IFILE انجام می‌شوند. اگر هیچ فلگ دیگری مشخص نشود، عملیات IO غیرمستقیم روی OFILE انجام می‌شود. اگر 'oflag=dio' داده شود، عملیات IO مستقیم روی OFILE آزمایش می‌شود. اگر IO مستقیم در دسترس نباشد، این ابزار به IO غیرمستقیم بازمی‌گردد و این موضوع را در پایان کپی گزارش می‌کند.

گروه اول در خلاصه دستور بالا عملوندهای «استاندارد» dd(1) در یونیکس هستند. گروه دوم گزینه‌های اضافی افزوده‌شده توسط این ابزار می‌باشند. هر دو گروه در زیر تعریف شده‌اند.

هر تراکنش ورودی/خروجی با استفاده از BPT بلوک انجام می‌شود (یا در نزدیکی انتهای کپی کمتر). مقدار پیش‌فرض برای اندازه‌های بلوک کمتر از ۲۰۴۸ بایت برابر ۱۲۸ است، در غیر این صورت مقدار پیش‌فرض ۳۲ است. بنابراین برای bs=512 خواندن‌ها و نوشتن‌ها به‌طور پیش‌فرض هرکدام ۶۴ کیبی‌بایت داده را منتقل می‌کنند (در صورت نزدیک بودن به انتهای انتقال یا محدودیت‌های حافظه کمتر). هنگام دسترسی به درایوهای cd/dvd، اندازه بلوک معمولاً ۲۰۴۸ بایت است و bpt به‌طور پیش‌فرض ۳۲ است که باز هم به معنای انتقال‌های ۶۴ کیبی‌بایتی است.
که در آن BS باید اندازه بلوک دستگاه فیزیکی باشد. توجه داشته باشید که این با dd(1) که اجازه می‌دهد BS یک ضریب صحیح باشد متفاوت است. پیش‌فرض 512 است که معمولاً برای دیسک‌ها درست است اما برای cdromها (که معمولاً دارای بلوک‌های 2048 بایتی هستند) نادرست است. برای این ابزار، حداکثر اندازه هر عملیات IO منفرد برابر BS * BPT بایت است.
اندازه دستورات SCSI READ و/یا WRITE صادرشده روی نام‌های دستگاه sg. مقدار پیش‌فرض بلوک‌های دستوری SCSI ده بایتی است (مگر اینکه محاسبات نشان دهد که ممکن است از شماره بلوک ۴ بایتی فراتر رود، که در این صورت به‌طور پیش‌فرض دستورات SCSI شانزده بایتی خواهد بود).
کپی COUNT بلوک از IFILE به OFILE. پیش‌فرض حداقل تعداد بلوک‌هایی (میان IFILE و OFILE) است که دستگاه‌های sg از دستورات SCSI READ CAPACITY گزارش می‌دهند یا دستگاه‌های بلوکی (یا پارتیشن‌های آن‌ها) گزارش می‌کنند. پرونده‌های معمولی برای اندازه‌شان بررسی نمی‌شوند. اگر skip=SKIP یا seek=SEEK داده شود و تعداد مشتق شود (یعنی به‌طور صریح داده نشود)، آنگاه تعداد مشتق‌شده کاهش می‌یابد تا کپی از دستگاه فراتر نرود. اگر نام پرونده یک پارتیشن دستگاه بلوکی باشد و COUNT داده نشود، اندازه پارتیشن به‌جای اندازه کل دستگاه استفاده می‌شود. اگر COUNT داده نشود و نتوان آن را مشتق کرد، پیام خطایی صادر شده و هیچ کپی انجام نمی‌شود.
dio=0 | 1
اجازه انتخاب IO مستقیم در سمت نوشتن (یعنی روی OFILE) را می‌دهد. فقط زمانی مجاز است که سمت خواندن (یعنی IFILE) یک دستگاه sg باشد. وقتی ۱ باشد ممکن است یک کپی «بدون کپی» رخ دهد (یعنی انتقال با mmap در خواندن به فضای کاربر و IO مستقیم از آنجا در نوشتن، که به طور بالقوه دو DMA و بدون کپی داده از سوی پردازنده است). پیش‌فرض ۰ است. اقدام مشابه با 'dio=1' از طریق 'oflag=dio' نیز در دسترس است.
در صورت ارائه باید برابر با BS داده‌شده به گزینه 'bs=' باشد.
خواندن از IFILE به‌جای stdin. اگر IFILE برابر '-' باشد از stdin خوانده می‌شود. خواندن از ابتدای IFILE شروع می‌شود مگر اینکه SKIP داده شده باشد.
که در آن FLAGS فهرستی جداشده با کاما از یک یا چند فلگ است که در زیر تشریح شده‌اند. این فلگ‌ها با IFILE مرتبط هستند و زمانی که IFILE برابر stdin باشد نادیده گرفته می‌شوند.
در صورت ارائه باید برابر با BS داده‌شده به گزینه 'bs=' باشد.
نوشتن در OFILE به‌جای stdout. اگر OFILE برابر '-' باشد در stdout می‌نویسد. اگر OFILE برابر ‎/dev/null‎ باشد، هیچ نوشتن واقعی انجام نمی‌شود. اگر OFILE برابر '.' (نقطه) باشد به همان شیوه ‎/dev/null‎ با آن رفتار می‌شود (این یک نماد اختصاری است). اگر OFILE وجود داشته باشد، کوتاه نمی‌شود؛ از ابتدای OFILE بازنویسی می‌شود مگر اینکه 'oflag=append' یا SEEK داده شده باشد.
که در آن FLAGS فهرستی جداشده با کاما از یک یا چند فلگ است که در زیر مشخص شده‌اند. این فلگ‌ها با OFILE مرتبط هستند و زمانی که OFILE برابر ‎/dev/null‎، '.' (نقطه) یا stdout باشد نادیده گرفته می‌شوند.
شروع نوشتن از SEEK بلوک به اندازه bs از ابتدای OFILE. پیش‌فرض بلوک ۰ است (یعنی ابتدای پرونده).
شروع خواندن از SKIP بلوک به اندازه bs از ابتدای IFILE. پیش‌فرض بلوک ۰ است (یعنی ابتدای پرونده).
هنگامی که ۱ باشد، دستور SYNCHRONIZE CACHE را در پایان انتقال روی OFILE اجرا می‌کند. تنها زمانی فعال است که OFILE نام پرونده یک دستگاه sg باشد.
هنگامی که ۱ باشد، زمان انتقال را اندازه گرفته و محاسبه توان عملیاتی را انجام می‌دهد و نتایج را در پایان (در stderr) خروجی می‌دهد. وقتی ۰ (پیش‌فرض) باشد زمان‌بندی را انجام نمی‌دهد.
با افزایش VERB مقدار خروجی اشکال‌زدایی ارسالی به stderr نیز افزایش می‌یابد. مقدار پیش‌فرض صفر است که حداقل مقدار خروجی اشکال‌زدایی را به همراه دارد. مقدار ۱ اطلاعات اضافی غیرتکراری را گزارش می‌دهد. مقدار ۲ cdbها و پاسخ‌ها را برای دستورات SCSI غیرتکراری (یعنی به غیر از READ و WRITE) گزارش می‌کند. پردازش خطا تکراری محسوب نمی‌شود. مقادیر ۳ و ۴ خروجی برای تمام دستورات SCSI (و فراخوانی‌های read() و write() یونیکس) تولید می‌کنند، بنابراین می‌تواند حجم خروجی بسیار بالایی داشته باشد.
تمام تجزیه و آماده‌سازی خط فرمان را انجام می‌دهد اما از کپی یا خواندن واقعی صرف‌نظر می‌کند. این آماده‌سازی ممکن است شامل باز کردن IFILE یا OFILE برای تعیین طول آن‌ها باشد. این گزینه می‌تواند برای آزمایش نحو فراخوانی‌های پیچیده خط فرمان پیش از اجرای آن‌ها مفید باشد.
نمایش پیام راهنما و خروج.
این گزینه باعث می‌شود ابزار در زمانی که در غیر این صورت اقدام به نوشتن در OFILE یا stdout می‌کرد، خارج شود. نوع گزینه بلند را می‌توان به --nc خلاصه کرد. روش صریح برای دستور دادن به این ابزار جهت خواندن فقط IFILE استفاده از ‎'--of=/dev/null'‎ در فراخوانی است. این گزینه ممکن است به عنوان ایمنی مضاعف در مواردی تلقی شود که ‎'--of=/dev/null'‎ داده نشده یا اشتباه نوشته شده است.
این گزینه باعث می‌شود گزارش پیشرفت هر دو دقیقه یک‌بار تا پایان کپی خروجی داده شود. پس از اتمام کپی، سطری با عنوان «completed» چاپ می‌شود تا گزارش نهایی از گزارش‌های پیشرفت پیشین متمایز گردد. با دو بار استفاده، گزارش پیشرفت هر یک دقیقه است و با سه بار استفاده هر ۳۰ ثانیه خواهد بود.
در صورت ارائه این گزینه، گزینه 'time=1' به‌طور ضمنی تنظیم می‌شود.
یک بار استفاده از آن معادل verbose=1 است. دو بار استفاده (مانند ‎"-vv"‎) معادل verbose=2 است و الی آخر.
نمایش اطلاعات شماره نگارش و خروج.

در اینجا فهرستی از فلگ‌ها و معانی آن‌ها آمده است:

باعث می‌شود فلگ O_APPEND به باز کردن OFILE اضافه شود. برای پرونده‌های معمولی، این امر منجر به ضمیمه شدن داده‌ها به انتهای داده‌های موجود خواهد شد. نمی‌توان همراه با گزینه seek=SEEK استفاده کرد زیرا با هم تداخل دارند. عمل پیش‌فرض این ابزار بازنویسی هرگونه داده موجود از ابتدای پرونده است، یا اگر SEEK داده شود، از بلوک SEEK شروع به نوشتن می‌کند. توجه داشته باشید که تلاش برای ضمیمه کردن به یک پرونده دستگاه (مثلاً یک دیسک) معمولاً نادیده گرفته شده یا ممکن است باعث گزارش خطا شود.
فقط با oflag فعال است (یعنی 'oflag=dio'). عملکرد آن در توضیحات گزینه 'dio=1' در بالا شرح داده شده است.
باعث می‌شود فلگ O_DIRECT به باز کردن IFILE و/یا OFILE اضافه شود. این فلگ نیازمند مقداری تراز حافظه روی IO است. از این رو بافرهای حافظه کاربر با اندازه صفحه تراز می‌شوند. روی پرونده‌های sg، عادی یا خام تاثیری ندارد.
تنظیم بیت DPO (غیرفعال کردن صفحه به بیرون) در دستورات SCSI READ و WRITE. برای گونه‌های cdb شش بایتی READ و WRITE پشتیبانی نمی‌شود. نشان می‌دهد که داده‌ها احتمالاً نیازی به ماندن در حافظه نهان دستگاه (مانند دیسک) ندارند. ممکن است کپی رسانه را تسریع کرده و/یا باعث شود کپی رسانه تاثیر کمتری بر سایر کاربران دستگاه داشته باشد.
باعث می‌شود فلگ O_SYNC به باز کردن IFILE و/یا OFILE اضافه شود. پیشوند "d" برای کاهش ابهام با گزینه 'sync=0|1' که عملکرد دیگری دارد (یعنی همگام‌سازی با رسانه در انتهای انتقال) اضافه شده است.
باعث می‌شود فلگ O_EXCL به باز کردن IFILE و/یا OFILE اضافه شود.
باعث می‌شود بیت FUA (اجبار به دسترسی واحد) در دستورات SCSI READ و/یا WRITE تنظیم شود. این فقط روی دستگاه‌های sg تاثیر دارد. گونه‌های ۶ بایتی دستورات SCSI READ و WRITE از بیت FUA پشتیبانی نمی‌کنند. فقط برای نام پرونده‌های دستگاه sg فعال است.
هیچ اثری ندارد، صرفاً یک نگه‌دارنده مکان است.

در اینجا برخی از گزینه‌های منسوخ‌شده که همچنان وجود دارند آورده شده است:

بیت اجبار به دسترسی واحد. در صورت ۳ بودن، fua روی هر دو IFILE و OFILE تنظیم می‌شود؛ در صورت ۲ بودن، fua روی IFILE تنظیم می‌شود؛ در صورت ۱ بودن، fua روی OFILE تنظیم می‌شود؛ در صورت ۰ بودن (پیش‌فرض)، fua روی هر دو پاک است. فلگ 'fua' را ببینید.

یک دستگاه خام پیش از استفاده از sgm_dd باید به یک دستگاه بلوکی مقید شود. برای اطلاعات بیشتر درباره مقید کردن دستگاه‌های خام، raw(8) را ببینید. برای اطمینان، نگاشت دستگاه sg به دستگاه‌های بلوکی SCSI باید پیش از استفاده با ابزار lsscsi بررسی شود.

اطلاعات پارتیشن دستگاه خام اغلب با fdisk(8) یافت می‌شود [آرگومان «-ul» در این زمینه مفید است].

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

پارامترهای count، skip و seek می‌توانند مقادیر ۶۴ بیتی بپذیرند (یعنی اعداد بسیار بزرگ). سایر مقادیر محدود به مقداری هستند که در یک عدد علامت‌دار ۳۲ بیتی جا شود.

داده‌ها معمولاً در یک فرآیند ۲ مرحله‌ای به فضای کاربر می‌رسند: ابتدا آداپتور SCSI از طریق DMA داده‌ها را در بافرهای هسته قرار می‌دهد و سپس درایور sg این داده‌ها را در حافظه کاربر کپی می‌کند (عملیات نوشتن این توالی را معکوس می‌کند). با انتقال‌های نگاشت حافظه، یک بافر هسته که توسط sg رزرو شده است در فضای کاربر نگاشت می‌شود (فراخوانی سیستمی mmap(2) را ببینید). وقتی این کار انجام شد، کپی دوم (اضافی) از بافرهای هسته به فضای کاربر لازم نیست. از این رو انتقال سریع‌تر است و به بار پردازشی کمتری از سوی CPU نیاز دارد.

تمام خروجی‌های اطلاعاتی، هشدار و خطا به stderr ارسال می‌شوند تا پرونده خروجی dd بتواند stdout باشد و تمیز بماند. اگر گزینه‌ای داده نشود، پیام راهنما خروجی داده شده و کار دیگری انجام نمی‌شود.

برای دستگاه‌های sg، این ابزار دستورات SCSI READ و WRITE (SBC) صادر می‌کند که برای دیسک‌ها و خواندن از درایوهای CD/DVD/BD مناسب است. این دستورات برای دستگاه‌های نوار مغناطیسی فرمت درستی ندارند، بنابراین sgm_dd نباید روی دستگاه‌های نوار استفاده شود.

این ابزار در صورت مواجهه با هر خطایی، کپی را متوقف می‌کند. برای منطق پیشرفته‌تر «کپی در صورت خطا» ابزار sg_dd (و فلگ 'coe' آن) را ببینید.

مثال‌های ارائه‌شده در صفحه راهنمای sg_dd(8) را ببینید.

رسیدگی به سیگنال‌ها از dd گرفته شده است: SIGINT، SIGQUIT و SIGPIPE تعداد بلوک‌های باقی‌مانده برای انتقال و تعداد رکوردهای ورودی + خروجی را گزارش می‌دهند؛ سپس رفتار پیش‌فرض خود را انجام می‌دهند. SIGUSR1 باعث خروجی داده شدن همان اطلاعات می‌شود اما کپی ادامه می‌یابد. تمام خروجی‌های ناشی از سیگنال‌ها به stderr فرستاده می‌شوند.

وضعیت خروج sgm_dd در صورت موفقیت 0 است. در غیر این صورت صفحه راهنمای sg3_utils(8) را ببینید. از آنجا که این ابزار در سطحی بالاتر از دستورات منفرد کار می‌کند، و فلگ‌های 'coe' و 'retries' وجود دارند، شکست دستورات SCSI منفرد لزوماً باعث خروج فرآیند نمی‌شود.

نوشته شده توسط Douglas Gilbert و Peter Allworth.

گزارش باگ‌ها به <dgilbert at interlog dot com>.

حق نشر © 2000-2026 Douglas Gilbert
این نرم‌افزار تحت مجوز GPL نگارش ۲ توزیع می‌شود. هیچ ضمانتی وجود ندارد؛ حتی برای قابلیت فروش یا تناسب برای یک هدف خاص.

ساده‌ترین گونه این ابزار sg_dd نامیده می‌شود. نسخه ریسه‌های POSIX از این ابزار با نام sgp_dd در بسته sg3_utils قرار دارد. بسته lmbench شامل lmdd است که آن نیز جالب توجه است. dd(1), ddpt(ddpt), raw(8)

April 2026 sg3_utils-1.49