SG_XCOPY(8) SG3_UTILS SG_XCOPY(8)

sg_xcopy - رونوشت داده‌ها به/از فایل‌ها و دستگاه‌ها با استفاده از دستور SCSI EXTENDED COPY (XCOPY)

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

[app=0|1] [bpt=BPT] [cat=0|1] [dc=0|1] [fco=0|1] [id_usage={hold|discard|disable}] [list_id=ID] [prio=PRIO] [time=0|1] [verbose=VERB] [--on_dst|--on_src] [--verbose]

رونوشت داده‌ها به و از هر فایلی. این ابزار به طور خاص برای «فایل‌هایی» اختصاص یافته است که دستگاه‌های اسکازی (SCSI) لینوکس هستند و از دستور SCSI EXTENDED COPY (XCOPY) پشتیبانی می‌کنند.

این ابزار ساختار نحوی و معنایی مشابهی با dd(1) دارد، اما از هیچ «تبدیلی» (conversions) پشتیبانی نمی‌شود.

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

به طور پیش‌فرض دستور XCOPY به OFILE ارسال می‌شود. این رفتار را می‌توان با گزینه‌های --on_src یا iflag=xflag تغییر داد که باعث می‌شوند دستور XCOPY در عوض به IFILE ارسال شود. همچنین بخش «متغیرهای محیطی» را ببینید.

در استاندارد SPC-4 کمیته T10 دستور XCOPY را گسترش داده است، به‌گونه‌ای که اکنون دارای دو گونه است: «LID1» (برای طول شناسه فهرست ۱ بایتی) و «LID4» (برای طول شناسه فهرست ۴ بایتی). این ابزار از گونه قدیمی‌تر LID1 پشتیبانی می‌کند که در SPC-3 و پیش از آن نیز یافت می‌شود. در حالی که گونه LID1 در SPC-4 در سطح دستور (باینری) با XCOPY تعریف‌شده در SPC-3 سازگار است، برخی از نام‌گذاری‌های دستورات تغییر یافته است. این ابزار از نام‌های قدیمی‌تر XCOPY در SPC-3 استفاده می‌کند.

ابزار ddpt از قابلیت xcopy(LID1) مشابه با همین گزینه‌ها و پرچم‌های این ابزار پشتیبانی می‌کند. علاوه بر این، ddpt از زیرمجموعه‌ای از قابلیت‌های xcopy(LID4) پشتیبانی می‌کند که با نام‌های مختلفی چون «xcopy version 2, lite» یا ODX شناخته می‌شود. ODX یک نام تجاری بوده و مخفف Offloaded Data Xfer (یعنی انتقال داده برون‌سپاری‌شده یا آف‌لود شده) است.

اگر مقدار ۱ باشد، مقصد رونوشت در انتهای OFILE آغاز می‌شود. در این حالت فرض می‌شود که OFILE یک فایل معمولی است. مقدار پیش‌فرض ۰ است که در این صورت مقصد رونوشت از ابتدای OFILE شروع می‌شود (احتمالاً با آفست مشخص‌شده توسط SEEK). این گزینه نمی‌تواند همراه با گزینه seek=SEEK استفاده شود.
هر تراکنش ورودی/خروجی (IO) با استفاده از BPT بلوک انجام خواهد شد (یا کمتر، اگر نزدیک به انتهای رونوشت باشد). مقدار پیش‌فرض برای اندازه‌های بلوک منطقی کمتر از ۲۰۴۸ بایت برابر با ۱۲۸ است، در غیر این صورت مقدار پیش‌فرض ۳۲ است. بنابراین برای bs=512 خواندن‌ها و نوشتن‌ها به طور پیش‌فرض هر کدام ۶۴ کیبی‌بایت (KiB) داده منتقل می‌کنند (کمتر اگر نزدیک به انتهای انتقال باشد یا به دلیل محدودیت‌های حافظه). هنگامی که به درایوهای cd/dvd دسترسی پیدا می‌شود، اندازه بلوک منطقی معمولاً ۲۰۴۸ بایت است و مقدار پیش‌فرض bpt به ۳۲ می‌رسد که باز هم به معنای انتقال‌های ۶۴ کیبی‌بایتی است.
که در آن BS باید اندازه بلوک منطقی دستگاه فیزیکی باشد (اگر فایل‌های ورودی یا خروجی از طریق دستورات SCSI مورد دسترسی قرار گیرند). توجه داشته باشید که این با dd(1) متفاوت است که اجازه می‌دهد BS یک مضرب صحیح باشد. پیش‌فرض آن اندازه بلوک منطقی دستگاه است.
بیت CAT از توصیف‌گر بخش (segment descriptor) دستور SCSI EXTENDED COPY را روی ۰ یا ۱ تنظیم می‌کند (پیش‌فرض: ۰). بیت CAT (همراه با بیت PAD) مدیریت داده‌های باقیمانده را کنترل می‌کند. برای جزئیات بخش مدیریت داده‌های باقیمانده را ببینید.
تمام آرگومان‌های CONV نادیده گرفته می‌شوند.
تعداد COUNT بلوک را از IFILE به OFILE کپی می‌کند. پیش‌فرض، حداقل تعداد بلوک‌هایی است (IFILE اگر dc=0 باشد یا OFILE اگر dc=1 باشد) که دستگاه‌های SCSI از دستورات SCSI READ CAPACITY گزارش می‌دهند یا دستگاه‌های بلوکی (یا پارتیشن‌های آن‌ها) گزارش می‌کنند. اندازه فایل‌های معمولی بررسی نمی‌شود. اگر skip=SKIP یا seek=SEEK مشخص شده باشند و تعداد بلوک مشتق شود (یعنی صراحتاً داده نشده باشد)، در این صورت مقدار مشتق‌شده کاهش می‌یابد تا رونوشت از محدوده دستگاه فراتر نرود. اگر نام فایل یک پارتیشن دستگاه بلوکی باشد و COUNT مشخص نشده باشد، به جای اندازه کل دستگاه، از اندازه پارتیشن استفاده می‌شود. اگر COUNT داده نشده باشد (یا count=-1 باشد) و نتوان آن را استخراج کرد، یک پیام خطا صادر شده و هیچ کپی انجام نمی‌شود.
بیت DC در توصیف‌گر بخش دستور SCSI EXTENDED COPY را روی ۰ یا ۱ تنظیم می‌کند (پیش‌فرض: ۰). بیت DC کنترل می‌کند که آیا COUNT به توصیف‌گر مبدأ (dc=0) یا مقصد (dc=1) اشاره دارد.
بیت FCO در توصیف‌گر بخش دستور SCSI EXTENDED COPY را روی ۰ یا ۱ تنظیم می‌کند (پیش‌فرض: ۰). تنظیم بودن بیت فقط رونوشت سریع (Fast Copy Only یا FCO) باعث می‌شود رونوشت با روشی سریع‌تر از دستورات معمولی READ و WRITE در SCSI انجام شود. اگر رونوشت نتواند به روشی سریع‌تر انجام شود، یک کلید حس (sense key) با عنوان «Copy aborted» به همراه حس اضافی «Fast copy not possible» برگردانده می‌شود.
در صورت ارائه، باید همانند مقدار BS داده‌شده به گزینه 'bs=' باشد.
فیلد LIST ID USAGE در فهرست پارامترهای دستور SCSI EXTENDED COPY را در صورتی که آرگومان 'hold' باشد روی ۰، اگر 'discard' باشد روی ۲، و اگر 'disable' باشد روی '3' تنظیم می‌کند.
اگر دستگاه توانایی نگه‌داری داده‌ها را داشته باشد (که با بزرگ‌تر از صفر بودن «حد داده نگه‌داشته‌شده» یا held data limit مشخص می‌شود)، مقدار پیش‌فرض id_usage برابر با 'hold' خواهد بود، در غیر این صورت پیش‌فرض آن 'discard' است.
خواندن از IFILE به جای ورودی استاندارد (stdin). اگر IFILE برابر با '-' باشد، ورودی استاندارد خوانده می‌شود. خواندن از ابتدای IFILE آغاز می‌شود مگر اینکه SKIP داده شده باشد.
که در آن FLAGS فهرستی از یک یا چند پرچم جداشده با کاما است که در زیر شرح داده شده‌اند. این پرچم‌ها با IFILE مرتبط هستند و زمانی که IFILE ورودی استاندارد باشد، نادیده گرفته می‌شوند.
فیلد LIST IDENTIFIER در فهرست پارامترهای دستور SCSI EXTENDED COPY را روی ID تنظیم می‌کند. مقدار ID باید عددی بین ۰ تا ۲۵۵ (شامل هر دو) باشد. مقدار ID معمولاً به طور پیش‌فرض ۱ است، مگر اینکه id_usage=disable باشد که در آن صورت پیش‌فرض ۰ خواهد بود.
در صورت ارائه، باید همانند مقدار BS داده‌شده به گزینه 'bs=' باشد.
نوشتن در OFILE به جای خروجی استاندارد (stdout). اگر OFILE برابر با '-' باشد، در خروجی استاندارد نوشته می‌شود. اگر OFILE برابر با /dev/null باشد، هیچ نوشتن واقعی انجام نمی‌شود. اگر OFILE یک نقطه ('.') باشد، همانند /dev/null با آن رفتار می‌شود (این یک نماد خلاصه‌نویسی است). اگر OFILE از قبل وجود داشته باشد، کوتاه (truncate) نمی‌شود؛ بلکه از ابتدای OFILE بازنویسی می‌گردد مگر اینکه 'oflag=append' یا SEEK داده شده باشد.
که در آن FLAGS فهرستی از یک یا چند پرچم جداشده با کاما است که در زیر شرح داده شده‌اند. این پرچم‌ها با OFILE مرتبط هستند و هنگامی که OFILE برابر با /dev/null، نقطه ('.') یا خروجی استاندارد باشد، نادیده گرفته می‌شوند.
فیلد PRIORITY در فهرست پارامترهای دستور SCSI EXTENDED COPY را روی PRIO تنظیم می‌کند. مقدار پیش‌فرض ۱ است.
نوشتن را از SEEK بلوک (با اندازه bs) از ابتدای OFILE آغاز می‌کند. مقدار پیش‌فرض بلوک ۰ است (یعنی ابتدای فایل).
خواندن را از SKIP بلوک (با اندازه bs) از ابتدای IFILE آغاز می‌کند. مقدار پیش‌فرض بلوک ۰ است (یعنی ابتدای فایل).
هنگامی که ۱ باشد، زمان انتقال را اندازه‌گیری کرده و محاسبه نرخ گذردهی (throughput) را انجام می‌دهد، و نتایج را پس از اتمام در خروجی خطای استاندارد (stderr) نمایش می‌دهد. زمانی که ۰ باشد (پیش‌فرض)، اندازه‌گیری زمان را انجام نمی‌دهد.
با افزایش VERB میزان خروجی اشکال‌زدایی ارسالی به stderr نیز افزایش می‌یابد. مقدار پیش‌فرض صفر است که کمترین میزان خروجی اشکال‌زدایی را به همراه دارد. مقدار ۱ اطلاعات اضافی غیرتکراری را گزارش می‌کند. مقدار ۲ ساختارهای cdb و پاسخ‌های دستورات SCSI غیرتکراری (یعنی مواردی غیر از READ و WRITE) را گزارش می‌دهد. پردازش خطا تکراری در نظر گرفته نمی‌شود. مقادیر ۳ و ۴ برای تمام دستورات SCSI (و فراخوانی‌های یونیکس ()read و ()write) خروجی تولید می‌کنند، بنابراین حجم خروجی می‌تواند بسیار زیاد باشد.
پیام نحوه استفاده را نمایش داده و خارج می‌شود.
دستور XCOPY را به فایل/دستگاه خروجی (یعنی OFILE) ارسال می‌کند. این رفتار پیش‌فرض است مگر اینکه با گزینه‌های --on_src یا iflag=xflag لغو شود. همچنین بخش «متغیرهای محیطی» در زیر را ببینید.
دستور XCOPY را به فایل/دستگاه ورودی (یعنی IFILE) ارسال می‌کند.
معادل با verbose=1. در صورت استفاده مجدد، معادل با verbose=2 و غیره است.
اطلاعات شماره نسخه را چاپ کرده و خارج می‌شود.

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

باعث اضافه شدن پرچم O_APPEND به هنگام باز کردن OFILE می‌شود. برای فایل‌های معمولی، این امر منجر به الحاق داده‌ها به انتهای هرگونه داده موجود می‌شود. این پرچم نمی‌تواند همراه با گزینه seek=SEEK استفاده شود زیرا با یکدیگر تداخل دارند. عملکرد پیش‌فرض این ابزار بازنویسی هرگونه داده موجود از ابتدای فایل است، یا اگر SEEK داده شده باشد، از بلوک SEEK شروع به نوشتن می‌کند. توجه داشته باشید که تلاش برای الحاق (append) به فایل یک دستگاه (مانند یک دیسک) معمولاً نادیده گرفته شده یا ممکن است باعث گزارش یک خطا شود.
باعث اضافه شدن پرچم O_EXCL به هنگام باز کردن IFILE و/یا OFILE می‌شود.
پس از باز کردن فایل مربوطه (یعنی IFILE و/یا OFILE)، تلاش می‌شود با فراخوانی سیستمی ()flock یک قفل انحصاری مشورتی (advisory exclusive lock) به دست آید. آرگومان‌های flock عبارتند از "FLOCK_EX | FLOCK_NB" که باعث می‌شود قفل در صورت در دسترس بودن گرفته شود، در غیر این صورت خطای «temporarily unavailable» (موقتاً در دسترس نیست) ایجاد می‌شود. در حالت اخیر وضعیت خروج ۹۰ تولید شده و هیچ کپی انجام نمی‌شود.
هیچ تأثیری ندارد، صرفاً یک جای‌نگه‌دار است.
بیت PAD از توصیف‌گر بخش دستور SCSI EXTENDED COPY را تنظیم می‌کند. بیت PAD (همراه با بیت CAT) مدیریت داده‌های باقیمانده را کنترل می‌کند. (برای جزئیات به بخش مدیریت داده‌های باقیمانده مراجعه کنید).
هیچ تأثیری ندارد؛ صرفاً برای سازگاری با ddpt قرار دارد.

بیت‌های pad و cat نحوه مدیریت داده‌های باقیمانده را کنترل می‌کنند. از آنجا که داده‌ها می‌توانند بر حسب اندازه بلوک منطقی مبدأ یا مقصد مشخص شوند و هر دو ممکن است اندازه‌های بلوک متفاوتی داشته باشند، در این موارد احتمال وقوع داده‌های باقیمانده وجود دارد. اگر اندازه بلوک منطقی هر دو یکسان باشد، این بیت‌ها هیچ تأثیری ندارند زیرا داده‌های باقیمانده رخ نخواهد داد.

اگر هیچ‌یک از این بیت‌ها تنظیم نشده باشند، دستور EXTENDED COPY با حس اضافی «UNEXPECTED INEXACT SEGMENT» لغو خواهد شد.

اگر فقط بیت cat تنظیم شده باشد، داده‌های باقیمانده نگه‌داری شده و برای توصیف‌گرهای بخش بعدی در دسترس قرار می‌گیرند. داده‌های باقیمانده برای آخرین توصیف‌گر بخش دور ریخته می‌شوند.

اگر بیت pad فقط برای توصیف‌گر مبدأ تنظیم شده باشد، هرگونه داده باقیمانده برای هر دو مبدأ یا مقصد دور ریخته خواهد شد.

اگر بیت pad فقط برای توصیف‌گر مقصد تنظیم شده باشد، با هرگونه داده باقیمانده مبدأ به گونه‌ای رفتار می‌شود که گویی بیت cat تنظیم شده است، اما هرگونه داده باقیمانده مقصد با داده‌های پرکننده پدگذاری می‌شود تا یک انتقال بلوک کامل ایجاد شود.

اگر بیت pad برای هر دو مبدأ و مقصد تنظیم شده باشد، هرگونه داده باقیمانده مبدأ دور ریخته خواهد شد و هرگونه داده باقیمانده مقصد پدگذاری می‌شود.

اگر فراخوانی خط فرمان به طور صریح (و بدون ابهام) مشخص نکند که آیا دستور SCSI XCOPY باید به IFILE (یعنی مبدأ) یا به OFILE (یعنی مقصد) ارسال شود، وجود متغیرهای محیطی XCOPY_TO_SRC و XCOPY_TO_DST بررسی می‌شود. اگر یکی از آن‌ها (و نه هر دو) وجود داشته باشد، نشان می‌دهد که دستور SCSI XCOPY به کجا ارسال خواهد شد. به طور پیش‌فرض دستور XCOPY به OFILE ارسال می‌شود.

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

هنگامی که تنظیم شود، معادل 'oflag=append' است. هنگامی که غیرفعال باشد، عمل بازنویسی روی فایل موجود (در صورت وجود) انجام می‌شود؛ این حالت پیش‌فرض است. پرچم 'append' را ببینید.

کپی کردن داده‌ها به دور از چشم سیستم‌عامل (behind an OS's back) می‌تواند مشکلاتی ایجاد کند. در مورد لینوکس، کاربران باید پیوند زیر را بررسی کنند:
https://linux-mm.org/Drop_Caches

این توالی دستورات ممکن است مفید باشد:
sync; echo 3 > /proc/sys/vm/drop_caches

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

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

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

اگر دستگاهی از عملیات‌های xcopy پشتیبانی کند، باید فیلد 3PC (مخفف Third Party Copy به معنی رونوشت شخص ثالث) را در پاسخ استاندارد INQUIRY خود تنظیم کند. این ابزار صرف‌نظر از مقدار موجود در فیلد 3PC اقدام به انجام عملیات xcopy خواهد کرد، اما اگر این فیلد صفر (غیرفعال) باشد، انتظار می‌رود که عملیات xcopy با شکست مواجه شود.

وضعیت دستور SCSI EXTENDED COPY را می‌توان با sg_copy_results(sg3_utils) استعلام کرد.

در حال حاضر فقط انتقال‌های بلوک به بلوک پیاده‌سازی شده‌اند؛ IFILE و OFILE باید به یک دستگاه بلوکی SCSI اشاره کنند.

هیچ توجهی به پارتیشن‌ها نمی‌شود؛ بنابراین برای مثال /dev/sbc2،‏ /dev/sdc،‏ /dev/sg2 و /dev/bsg/3:0:0:1 همگی به یک چیز اشاره دارند: کل واحد منطقی (یعنی کل دیسک) که از LBA 0 شروع می‌شود. بنابراین هرگونه مشخصه پارتیشن (مانند /dev/sdc2) نادیده گرفته می‌شود. کاربر باید مقادیر SKIP، SEEK و COUNT را با اطلاعات به‌دست‌آمده از دستوری مانند 'fdisk -l -u /dev/sdc' تنظیم کند تا پارتیشن‌ها لحاظ شوند.

قابلیت XCOPY (LID1) به ابزار ddpt که در بسته‌ای با همین نام قرار دارد اضافه شده است. ابزار ddpt روی سایر سیستم‌عامل‌ها (مانند FreeBSD و Windows) نیز اجرا می‌شود در حالی که sg_xcopy فقط روی لینوکس اجرا می‌شود. همچنین ddpt اجازه می‌دهد آرگومان‌های داده‌شده به ibs= و obs= متفاوت باشند.

رونوشت ۲ مگابایت داده از ابتدای یک دستگاه به دستگاه دیگر:

# sg_xcopy if=/dev/sdo of=/dev/sdp count=2048 list_id=2 dc=1
sg_xcopy: if=/dev/sdo skip=0 of=/dev/sdp seek=0 count=1024
Start of loop, count=1024, bpt=65535, lba_in=0, lba_out=0
sg_xcopy: 1024 blocks, 1 command

بررسی وضعیت دستور EXTENDED COPY:

# sg_copy_results --status --list_id=2 /dev/sdp
Receive copy results (copy status):
Held data discarded: Yes
Copy manager status: Operation completed without errors
Segments processed: 1
Transfer count units: 0
Transfer count: 0

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

وضعیت خروج sg_xcopy در صورت موفقیت 0 است. در غیر این صورت به صفحه راهنمای sg3_utils(8) مراجعه کنید.

اگر پرچم flock داده شده باشد و فرآیند دیگری قفل انحصاری مشورتی را در اختیار داشته باشد، یک وضعیت خروج اضافی برابر با 90 تولید می‌شود.

نوشته‌شده توسط Hannes Reinecke و Douglas Gilbert.

گزارش باگ‌ها را به <dgilbert at interlog dot com> ارسال کنید.

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

یک صفحه وب در مورد بررسی sg_dd در نشانی https://sg.danny.cz/sg/sg_dd.html وجود دارد.

نسخه‌ای مبتنی بر ریسه‌های پوزیکس (POSIX threads) از این ابزار با نام sgp_dd در بسته sg3_utils قرار دارد. نسخه دیگری از آن بسته با نام sgm_dd شناخته می‌شود و از ورودی/خروجی نقشه‌برداری‌شده در حافظه (memory mapped IO) برای افزایش سرعت انتقال‌ها از دستگاه‌های sg استفاده می‌کند.

بسته lmbench شامل ابزار lmdd است که آن نیز جالب توجه است. برای انتقال داده‌ها به نوارها و برعکس به ابزار dt مراجعه کنید که در نشانی https://www.scsifaq.org/RMiller_Tools/index.html یافت می‌شود.

برای تغییر پارامترهای حالتی که بر حافظه موقت (caching) و بازیابی خطای دستگاه SCSI تأثیر می‌گذارند، به sdparm(sdparm) مراجعه کنید.

همچنین ببینید: dd(1), sg_copy_results(sg3_utils), ddrescue(GNU), ddpt,ddptctl(ddpt)

سپتامبر ۲۰۲۱ sg3_utils-1.47