SGP_DD(8) SG3_UTILS SGP_DD(8)

sgp_dd - کپی داده‌ها به و از فایل‌ها و دستگاه‌ها، به‌ویژه دستگاه‌های SCSI

sgp_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] [coe=0|1] [cdbsz=6|10|12|16] [deb=VERB] [dio=0|1] [sync=0|1] [thr=THR] [time=0|1] [verbose=VERB] [--chkaddr] [--dry-run] [--nocopy] [--progress] [--verbose]

کپی داده‌ها به و از هر فایلی. به‌طور ویژه برای «فایل‌هایی» که دستگاه‌های عمومی اسکازی لینوکس (sg) و دستگاه‌های خام (raw) هستند، تخصیص یافته است. قواعد نوشتاری و معنایی آن شبیه به dd(1) است اما هیچ تبدیلی انجام نمی‌دهد. برای افزایش سطح موازی‌سازی از ریسه‌های پازیکس (POSIX threads یا همان "pthreads") بهره می‌برد. این کار در برخی موارد سرعت را بهبود می‌بخشد.

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

هر تراکنش ورودی/خروجی با استفاده از BPT بلوک (یا کمتر، اگر نزدیک پایان عملیات کپی باشد) انجام خواهد شد. پیش‌فرض برای اندازه‌های بلوک کمتر از ۲۰۴۸ بایت برابر ۱۲۸ است، در غیر این صورت پیش‌فرض ۳۲ خواهد بود. بنابراین برای bs=512 خواندن‌ها و نوشتن‌ها به‌طور پیش‌فرض هرکدام ۶۴ کیلوبایت داده انتقال می‌دهند (اگر نزدیک پایان انتقال یا محدودیت‌های حافظه باشد کمتر). هنگام دسترسی به درایوهای سی‌دی/دی‌وی‌دی، اندازه بلوک معمولاً ۲۰۴۸ بایت است و پیش‌فرض bpt به ۳۲ تغییر می‌یابد که مجدداً به معنای انتقال‌های ۶۴ کیلوبایتی است.
که در آن BS باید اندازه بلوک دستگاه فیزیکی باشد. توجه داشته باشید این مورد با dd(1) که اجازه می‌دهد 'bs' ضریب صحیحی از اندازه بلوک واقعی دستگاه باشد تفاوت دارد. مقدار پیش‌فرض ۵۱۲ است که معمولاً برای دیسک‌ها درست است اما برای دیسک‌های نوری (که معمولاً بلوک‌های ۲۰۴۸ بایتی دارند) نادرست است.
اندازه دستورات SCSI READ یا SCSI WRITE صادرشده برای نام‌های دستگاه sg. پیش‌فرض بلوک‌های دستوری اسکازی ۱۰ بایتی است (مگر محاسبات نشان دهند شماره بلوک ۴ بایتی ممکن است رد شود، که در این صورت پیش‌فرض به دستورات اسکازی ۱۶ بایتی تغییر می‌کند).
coe=0 | 1
تنظیم روی ۱ برای ادامه دادن در صورت بروز خطا (continue on error). فقط بر خطاهای دستگاه‌های sg اعمال می‌شود. بنابراین خطا در فایل‌های دیگر موجب توقف sgp_dd خواهد شد. پیش‌فرض ۰ است که به معنای توقف با هر خطایی است. برای اطلاعات بیشتر فلگ 'coe' را ببینید.
کپی کردن COUNT بلوک از IFILE به OFILE. پیش‌فرض کمترین مقدار (بین IFILE و OFILE) تعداد بلوک‌هایی است که دستگاه‌های sg از دستورات SCSI READ CAPACITY گزارش می‌دهند یا دستگاه‌های بلوکی (یا پارتیشن‌های آن‌ها) گزارش می‌کنند. اندازه فایل‌های عادی ارزیابی نمی‌شود. اگر skip=SKIP یا seek=SEEK مشخص شده باشند و شمارش استنتاج شود (یعنی به‌طور صریح داده نشده باشد)، آن شمارش کاهش می‌یابد تا عملیات کپی از دستگاه فراتر نرود. اگر نام فایل یک پارتیشن دستگاه بلوکی باشد و COUNT داده نشده باشد، به جای اندازه کل دستگاه از اندازه پارتیشن استفاده می‌شود. اگر COUNT داده نشود و قابل استنتاج هم نباشد، پیام خطایی صادر شده و کپی انجام نمی‌گیرد.
اطلاعات اشکال‌زدایی را چاپ می‌کند. اگر VERB برابر ۰ باشد (پیش‌فرض)، کمترین اطلاعات اشکال‌زدایی ارائه می‌شود و با افزایش VERB میزان اطلاعات بیشتر خواهد شد (حداکثر خروجی اشکال‌زدایی زمانی است که VERB برابر ۹ باشد).
dio=0 | 1
پیش‌فرض ۰ است که ورودی/خروجی غیرمستقیم (indirect IO) را انتخاب می‌کند. مقدار ۱ تلاش می‌کند ورودی/خروجی مستقیم (direct IO) انجام دهد، و در صورتی که در دسترس نباشد، به ورودی/خروجی غیرمستقیم بازمی‌گردد و این موضوع را هنگام اتمام کار ثبت می‌کند. اگر ورودی/خروجی مستقیم انتخاب شده باشد و مقدار /sys/module/sg/parameters/allow_dio برابر ۰ باشد، هشداری صادر می‌شود (و ورودی/خروجی غیرمستقیم انجام می‌گیرد). برای کنترل دقیق‌تر از 'iflag=dio' یا 'oflag=dio' استفاده کنید.
در صورت ارائه، باید برابر با همان BS داده‌شده به گزینه 'bs=' باشد.
خواندن از IFILE به جای ورودی استاندارد (stdin). اگر IFILE برابر '-' باشد از ورودی استاندارد خوانده می‌شود. خواندن از ابتدای IFILE آغاز می‌شود مگر اینکه SKIP مشخص شده باشد.
که در آن FLAGS فهرستی از یک یا چند فلگ جداشده با ویرگول مطابق توضیحات زیر است. این فلگ‌ها به IFILE اختصاص دارند و زمانی که IFILE ورودی استاندارد باشد نادیده گرفته می‌شوند.
در صورت ارائه، باید برابر با همان BS داده‌شده به گزینه 'bs=' باشد.
نوشتن در OFILE به جای خروجی استاندارد (stdout). اگر OFILE برابر '-' باشد در خروجی استاندارد نوشته می‌شود. اگر OFILE برابر /dev/null باشد هیچ عمل نوشتن واقعی انجام نمی‌گیرد. اگر OFILE نقطه ('.') باشد به همان شکل /dev/null با آن برخورد می‌شود (این یک میان‌بر است). اگر OFILE از پیش وجود داشته باشد، کوتاه‌سازی (truncate) _نمی‌شود_؛ بلکه از ابتدای OFILE بازنویسی می‌گردد مگر اینکه 'oflag=append' یا SEEK مشخص شده باشد.
که در آن FLAGS فهرستی از یک یا چند فلگ جداشده با ویرگول مطابق توضیحات زیر است. این فلگ‌ها به OFILE اختصاص دارند و زمانی که OFILE برابر /dev/null، '.' (نقطه) یا خروجی استاندارد باشد نادیده گرفته می‌شوند.
نوشتن را از SEEK بلوک به اندازه bs از ابتدای OFILE آغاز می‌کند. پیش‌فرض بلوک ۰ است (یعنی ابتدای فایل).
خواندن را از SKIP بلوک به اندازه bs از ابتدای IFILE آغاز می‌کند. پیش‌فرض بلوک ۰ است (یعنی ابتدای فایل).
زمانی که ۱ باشد، در پایان انتقال دستور SYNCHRONIZE CACHE را روی OFILE اجرا می‌کند. فقط زمانی فعال است که OFILE نام فایل دستگاه sg باشد.
که در آن THR تعداد ریسه‌های کارگر (پیش‌فرض ۴) است که برای کپی موازی تلاش می‌کنند. حداقل ۱ و حداکثر ۱۰۲۴ است.
زمانی که ۱ باشد، زمان انتقال اندازه‌گیری شده و محاسبه توان عملیاتی (throughput) انجام می‌شود و نتایج در پایان کار (به خروجی استاندارد خطا) فرستاده می‌شود. زمانی که ۰ باشد (پیش‌فرض) هیچ زمان‌سنجی انجام نمی‌گیرد.
افزایش پرگویی. معادل deb=VERB. برای سازگاری با sg_dd و sgm_dd افزوده شده است.
این گزینه بررسی می‌کند که هر بلوک خوانده‌شده شامل آدرس بلوک (۳۲ بیتی) آن بلوک باشد. اگر این بررسی شکست بخورد، عملیات کپی با خطای عدم تطابق (miscompare) متوقف می‌شود. این بررسی مکمل تولید بلوک‌هایی با 'sg_dd iflag=00,ff' است که حاوی آدرس بلوک خود (۳۲ بیتی، big endian) هستند. هنگامی که --chkaddr یک بار استفاده شود، تنها آدرس اولین بلوک در هر بلوک بررسی می‌شود. اگر دو بار استفاده شود، هر آدرس بلوکی (که در یک بلوک جا گیرد) بررسی خواهد شد.
تمام مراحل تجزیه خط فرمان و آماده‌سازی را انجام می‌دهد اما از کپی یا خواندن واقعی صرف‌نظر می‌کند. آن آماده‌سازی ممکن است شامل باز کردن 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 است. توجه داشته باشید که تلاش برای الحاق به یک فایل دستگاه (مثلاً دیسک) معمولاً نادیده گرفته می‌شود یا ممکن است خطایی ایجاد کند.
ادامه در صورت بروز خطا (continue on error). هنگامی که همراه با 'iflag=' تعیین شود، خطایی که در یک دستور SCSI منفرد (معمولاً بلوک‌های 'bpt') رخ دهد ثبت می‌شود (از طریق پیام خطایی که به خروجی استاندارد خطا ارسال می‌شود)، سپس صفرهایی در بافر برای عملیات نوشتن متناظر جایگزین می‌شوند و کپی ادامه می‌یابد. توجه داشته باشید که ابزار sg_dd در چنین موقعیت‌های خطایی با 'iflag=coe' پیچیده‌تر و پیشرفته‌تر عمل می‌کند. هنگامی که همراه با 'oflag=' مشخص شود، هر خطایی که توسط یک دستور SCSI WRITE گزارش شود به خروجی استاندارد خطا فرستاده شده و کپی ادامه می‌یابد (گویی مشکلی رخ نداده است).
درخواست می‌کند که گره دستگاه sg مرتبط با این فلگ ورودی/خروجی مستقیم (direct IO) انجام دهد. اگر ورودی/خروجی مستقیم در دسترس نباشد، به ورودی/خروجی غیرمستقیم بازگشته و این نکته را در پایان ثبت می‌کند. اگر ورودی/خروجی مستقیم انتخاب شود و /sys/module/sg/parameters/allow_dio برابر ۰ باشد، هشداری صادر می‌شود (و ورودی/خروجی غیرمستقیم انجام می‌گیرد).
باعث افزوده شدن فلگ O_DIRECT هنگام باز کردن IFILE یا OFILE می‌شود. این فلگ به هم‌ترازی حافظه روی ورودی/خروجی نیاز دارد. بنابراین بافرهای حافظه کاربر بر اساس اندازه صفحه هم‌تراز می‌شوند. روی دستگاه‌های sg، فایل‌های عادی یا فایل‌های خام هیچ تأثیری ندارد.
بیت DPO (غیرفعال‌سازی خارج کردن از صفحه / disable page out) را در دستورات SCSI READ و SCSI WRITE تنظیم می‌کند. برای انواع ۶ بایتی cdb دستورات READ و WRITE پشتیبانی نمی‌شود. نشان می‌دهد که داده‌ها احتمالاً نیازی نیست در حافظه پنهان دستگاه (مانند دیسک) باقی بمانند. ممکن است سرعت کپی رسانه را افزایش دهد یا باعث شود کپی تأثیر کمتری بر سایر کاربران دستگاه داشته باشد.
باعث افزوده شدن فلگ O_SYNC هنگام باز کردن IFILE یا OFILE می‌شود. پیشوند 'd' برای کاهش سردرگمی با گزینه 'sync=0|1' که عملکرد دیگری دارد (یعنی همگام‌سازی با رسانه در پایان انتقال) اضافه شده است.
باعث افزوده شدن فلگ O_EXCL هنگام باز کردن IFILE یا OFILE می‌شود.
باعث تنظیم بیت FUA (دسترسی اجباری به واحد / force unit access) در دستورات SCSI READ یا SCSI WRITE می‌شود. این فلگ فقط با دستگاه‌های sg تأثیر دارد. انواع ۶ بایتی دستورات SCSI READ و WRITE از بیت FUA پشتیبانی نمی‌کنند. فقط برای نام فایل‌های دستگاه sg فعال است.
فقط می‌تواند در لیست آرگومان‌های iflag=FLAGS یا oflag=FLAGS استفاده شود، نه در هر دو. سمتی از عملیات کپی که مشخص شده است از ورودی/خروجی نقشه‌برداری‌شده در حافظه مبتنی بر فراخوانی سیستمی mmap(2) استفاده خواهد کرد. هنگامی که فراخوانی سیستمی mmap(2) روی یک دستگاه sg استفاده می‌شود، گرداننده sg بافر مقصد یا مبدأ DMA خود را مجدداً به فضای کاربری نگاشت می‌کند.
هیچ تأثیری ندارد، صرفاً یک پرکننده است.

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

ادامه در صورت بروز خطا به طور پیش‌فرض ۰ (خاموش) است. هنگامی که ۱ باشد، معادل 'iflag=coe oflag=coe' شرح داده شده در بخش FLAGS در بالا است. شبیه به 'conv=noerror,sync' در ابزار dd(1) است. پیش‌فرض ۰ است که به معنی توقف در صورت بروز خطا می‌باشد. پردازش‌های پیشرفته‌تر coe=1 هنگام خواندن توسط ابزار sg_dd انجام می‌گیرد.
بیت دسترسی اجباری به واحد (force unit access). هنگامی که ۳ باشد، fua هم در IFILE و هم در OFILE تنظیم می‌شود؛ هنگامی که ۲ باشد، fua روی IFILE تنظیم می‌شود؛ هنگامی که ۱ باشد، fua روی OFILE تنظیم می‌شود؛ و هنگامی که ۰ باشد (پیش‌فرض)، fua در هر دو پاک می‌شود. فلگ 'fua' را ببینید.

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

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

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

آرگومان‌های COUNT، SKIP و SEEK می‌توانند مقادیر ۶۴ بیتی (یعنی اعداد بسیار بزرگ) بپذیرند. مقادیر دیگر به آنچه که در یک عدد ۳۲ بیتی علامت‌دار جا می‌گیرد محدود هستند.

داده‌ها معمولاً در یک فرآیند ۲ مرحله‌ای به فضای کاربری وارد می‌شوند: ابتدا آداپتور SCSI از طریق DMA به بافرهای هسته منتقل می‌کند و سپس گرداننده sg این داده‌ها را به حافظه کاربر کپی می‌کند (عملیات نوشتن این ترتیب را برعکس انجام می‌دهد). به این عمل "ورودی/خروجی غیرمستقیم" (indirect IO) گفته می‌شود و گزینه 'dio' برای انتخاب "ورودی/خروجی مستقیم" (direct IO) وجود دارد که مستقیماً از طریق DMA به حافظه کاربر منتقل می‌کند. به دلیل برخی مسائل، ورودی/خروجی مستقیم در گرداننده sg غیرفعال است و برای فعال‌سازی آن نیاز به تغییر پیکربندی وجود دارد.

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

چرا از sgp_dd استفاده کنیم؟ زیرا در برخی موارد دو برابر سریع‌تر از dd است (عمدتاً با دستگاه‌های sg؛ دستگاه‌های خام مقداری بهبود نشان می‌دهند). دلیل دیگر این است که کپی‌های بزرگ حافظه پنهان دستگاه بلوکی را پر می‌کنند که بر فعالیت‌های دیگر سیستم تأثیر منفی دارد.

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

کاربرد آن بسیار شبیه به dd به نظر می‌رسد:

sgp_dd if=/dev/sg0 of=t bs=512 count=1MB

این دستور ۱ میلیون بلوک ۵۱۲ بایتی را از دستگاه مرتبط با /dev/sg0 (که باید بلوک‌های ۵۱۲ بایتی داشته باشد) به فایلی به نام t کپی می‌کند. با فرض اینکه /dev/sda و /dev/sg0 یک دستگاه باشند، دستور بالا معادل است با:

dd if=/dev/sda of=t bs=512 count=1000000

هرچند اگر bs بزرگ‌تر بود و count متناسب با آن مقیاس‌بندی می‌شد، ممکن بود سرعت dd افزایش یابد. استفاده از یک دستگاه خام برای انجام عملی مشابه روی دیسک ATA:

raw /dev/raw/raw1 /dev/hda
sgp_dd if=/dev/raw/raw1 of=t bs=512 count=1MB

برای کپی کردن یک پارتیشن دیسک SCSI به یک پارتیشن دیسک ATA:

raw /dev/raw/raw2 /dev/hda3
sgp_dd if=/dev/sg0 skip=10123456 of=/dev/raw/raw2 bs=512

این فرض می‌کند یک پارتیشن معتبر روی دیسک SCSI در آدرس بلوک skip داده‌شده (پس از نقطه ۵ گیگابایتی آن دیسک) پیدا شده است و پارتیشن تا انتهای دیسک SCSI ادامه می‌یابد. مشخص کردن صریح count گزینه امن‌تری است.

برای انجام کپی سریع از یک دیسک SCSI به دیسک دیگر با هندسه مشابه (با رد کردن خطاهای دیسک مبدأ):

sgp_dd if=/dev/sg0 of=/dev/sg1 bs=512 coe=1

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

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

گزارش اشکالات به <dgilbert at interlog dot com>.

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

نسخه ساده‌تر و بدون ریسه این ابزار اما با منطق پیشرفته‌تر "ادامه در صورت خطا"، sg_dd نام دارد و همچنین در بسته sg3_utils یافت می‌شود. بسته lmbench شامل lmdd است که آن هم جالب توجه است. raw(8), dd(1)

2026-04-01 sg3_utils-1.49