.TH dd_rescue 1 "2025-06-24" "Kurt Garloff" "Data recovery and protection tool" . .SH NAME (نام) dd_rescue \- ابزار بازیابی و محافظت از داده‌ها . .SH SYNOPSIS (خلاصه دستور) .na .nh .B dd_rescue [options] infile outfile . .br .B dd_rescue [options] [-2/-3/-4/-z/-Z seed/seedfile] outfile . .br .B dd_rescue [options] [--shred2/--shred3/--shred4/--random/--frandom seed/seedfile] outfile . .SH DESCRIPTION (توضیحات) .B dd_rescue ابزاری است که داده‌ها را از یک منبع (پرونده، دستگاه بلوکی، لوله، ...) به یک (یا چند) پرونده خروجی رونوشت می‌کند. .PP اگر پرونده‌های ورودی و خروجی قابل جستجو (seekable) باشند (دستگاه‌های بلوکی یا پرونده‌های معمولی)، .B dd_rescue رونوشت را با بلوک‌های بزرگ (softbs) انجام می‌دهد تا کارایی را افزایش دهد. هنگامی که با خطای خواندن مواجه شود، .B dd_rescue به خواندن بلوک‌های کوچک‌تر (hardbs) بازمی‌گردد تا بازیابی بیشترین مقدار داده ممکن شود. اگر بلوک‌ها همچنان قابل خواندن نباشند، .B dd_rescue به‌طور پیش‌فرض در پرونده خروجی نیز از روی آن‌ها عبور می‌کند و مانع از بازنویسی داده‌هایی می‌شود که ممکن است در اجرای قبلی با موفقیت در آنجا رونوشت شده باشند. (گزینه -A / --alwayswrite این رفتار را تغییر می‌دهد.). . .PP .B dd_rescue می‌تواند در جهت معکوس نیز رونوشت بگیرد، که امکان نزدیک شدن به یک نقطه خراب (bad spot) را از هر دو جهت فراهم می‌کند. از آنجا که تلاش برای خواندن از روی یک نقطه خراب با اندازه قابل‌توجه می‌تواند بسیار طول بکشد (و احتمالاً آسیب بیشتری ایجاد کند)، این یک بهینه‌سازی مهم هنگام بازیابی داده است. ابزار .B dd_rhelp از این ویژگی بهره می‌برد و بازیابی داده‌ها را خودکار می‌سازد. .B dd_rescue (به‌طور پیش‌فرض) اندازه پرونده خروجی را کوتاه (truncate) نمی‌کند. .PP .B dd_rescue به‌طور پیش‌فرض پیشرفت را گزارش می‌دهد، و در صورت تمایل در یک پرونده وقایع (logfile) نیز می‌نویسد. این ابزار یک نوار پیشرفت دارد و زمان باقی‌مانده را تخمین می‌زند. .B dd_rescue دارای مجموعه‌ای گسترده از گزینه‌ها است که رفتار آن را تغییر می‌دهند؛ مانند امکان استفاده از direct IO برای ورودی/خروجی، استفاده از fallocate() برای تخصیص پیشاپیش فضا به پرونده خروجی، استفاده از رونوشت splice (قابلیت zerocopy درون هسته) برای کارایی بیشتر، جستجو برای بلوک‌های خالی جهت ساخت پرونده‌های متخلخل (sparse files)، یا استفاده از یک مولد اعداد شبه‌تصادفی (PRNG) برای بازنویسی سریع داده‌ها با اعداد تصادفی. .PP حالت‌های بازنویسی پارتیشن‌ها یا پرونده‌ها با اعداد شبه‌تصادفی باعث شده که .B dd_rescue ابزاری مناسب برای حذف امن داده‌ها باشد و بنابراین نه تنها یک ابزار بازیابی داده و پشتیبان‌گیری، بلکه یک ابزار محافظت از داده نیز به شمار آید. .PP می‌توانید از "-" به عنوان infile یا outfile استفاده کنید که به معنای stdin یا stdout است. توجه داشته باشید این یعنی پرونده مورد نظر قابلیت جستجو (seekable) ندارد، که کاربرد برخی قابلیت‌های dd_rescue را محدود می‌سازد. . .SH OPTIONS (گزینه‌ها) هنگام پردازش اعداد، .B dd_rescue واحد را بایت در نظر می‌گیرد. پسوندهای زیر را می‌پذیرد: .br b -- ۵۱۲ واحد اندازه (بلوک‌ها) .br k -- ۱۰۲۴ واحد اندازه (کیلوبایت دودویی، kiB) .br M -- 1024^2 واحد اندازه (مگابایت دودویی، MiB) .br G -- 1024^3 واحد اندازه (گیگابایت دودویی، GiB) .PP گزینه‌های زیر می‌توانند برای تغییر رفتار .B dd_rescue به کار روند. . .SS General options (گزینه‌های عمومی) .TP 8 .BR \-h ", " \-\-help این گزینه به .B dd_rescue می‌گوید که فهرستی از گزینه‌ها را چاپ کرده و خارج شود. .TP 8 .BR \-V ", " \-\-version نمایش شماره نسخه و خروج. .TP 8 .BR \-q ", " \-\-quiet به .B dd_rescue می‌گوید که خروجی کمتری تولید کند. .TP 8 .BR \-v ", " \-\-verbose خروجی .B dd_rescue را پرحرف‌تر (مشروح‌تر) می‌کند. .TP 8 .BI \-c\ 0/1 \fR,\ \fB\-\-color= 0/1 مشخص می‌کند که آیا .B dd_rescue از رنگ‌ها استفاده کند یا خیر. به‌طور پیش‌فرض استفاده می‌کند، مگر اینکه نوع پایانه از TERM ناشناخته یا dumb باشد یا به -m یا -mono ختم شود. .TP 8 .BR \-f ", " \-\-force موجب می‌شود .B dd_rescue برخی از بررسی‌های اولیه سلامت (sanity checks) را نادیده بگیرد (مثلاً فعال کردن خودکار جهت معکوس هنگامی که پرونده ورودی و خروجی یکی هستند و ipos < opos). .TP 8 .BR \-i ", " \-\-interactive به .B dd_rescue می‌گوید که پیش از بازنویسی پرونده‌های موجود تأیید بخواهد. . .SS Block sizes (اندازه‌های بلوک) .TP 8 .BI \-b\ softbs \fR,\ \fB\-\-softbs= softbs \fR,\ \fB\-\-bs= softbs اندازه بلوک (بزرگ‌تر) را به .IR softbs بایت تنظیم می‌کند. .B dd_rescue داده‌ها را در بسته‌هایی با این اندازه منتقل می‌کند مگر اینکه خطای خواندن رخ دهد (یا به پایان پرونده ورودی یا حداکثر اندازه انتقال رسیده باشد). مقدار پیش‌فرض برای این گزینه 64k برای buffered I/O و 1M برای direct I/O است. .TP 8 .BI \-B\ hardbs \fR,\ \fB\-\-hardbs= hardbs \fR,\ \fB\-\-block\-size= hardbs اندازه بلوک جایگزین (کوچک‌تر) را به .IR hardbs بایت تنظیم می‌کند. هنگامی که .B dd_rescue با خطاهای خواندن مواجه شود، به رونوشت داده‌ها در بسته‌هایی با این اندازه بازمی‌گردد. مقدار پیش‌فرض 4k برای buffered I/O و ۵۱۲ بایت برای direct I/O است. .br .IR hardbs باید مساوی یا کوچک‌تر از .IR softbs باشد. اگر هر دو اندازه بلوک یکسان باشند، هیچ سازوکار بازگشتی (و در نتیجه تلاش مجددی) هنگام خطاهای خواندن انجام نخواهد شد. .TP 8 .BI \-y\ syncsize \fR,\ \fB\-\-syncfreq= syncsize به .B dd_rescue می‌گوید که روی پرونده خروجی به‌ازای هر .IR syncsize بایت، fsync() را فراخوانی کند (به مضربی از بلوک‌های با اندازه .IR softbs گرد خواهد شد). همچنین نشانگر پیشرفت را حداقل با همین تناوب به‌روزرسانی می‌کند. به‌طور پیش‌فرض، .IR syncsize روی ۰ تنظیم شده است، به این معنی که fsync() تنها در پایان عملیات رونوشت فراخوانی می‌شود. . .SS "موقعیت‌ها و طول (Positions and length)" .TP 8 .BI \-s\ ipos \fR,\ \fB\-\-ipos= ipos \fR,\ \fB\-\-input\-position= ipos موقعیت شروع .IR infile را روی .IR ipos تنظیم می‌کند. توجه داشته باشید که ipos بر حسب بایت مشخص می‌شود (اما پسوندها نیز قابل استفاده‌اند، بالا را ببینید)، نه بر اساس بلوک‌هایی با اندازه .IR softbs یا .IR hardbs . مقدار پیش‌فرض برای این گزینه 0 است. هنگام استفاده از رونوشت‌برداری در جهت معکوس، .IR ipos با مقدار 0 به صورت ویژه در نظر گرفته شده و به معنای انتهای پرونده است. .br موقعیت‌های منفی به پیام خطا منجر می‌شوند. .TP 8 .BI \-S\ opos \fR,\ \fB\-\-opos= opos \fR,\ \fB\-\-output\-position= opos موقعیت شروع .IR outfile را روی .IR opos تنظیم می‌کند. در صورت عدم تعیین، .IR opos روی .IR ipos تنظیم می‌شود، بنابراین آفست‌های پرونده در پرونده ورودی و خروجی یکسان خواهند بود. برای رونوشت‌برداری در جهت معکوس، تعیین صریح .IR opos برابر با 0، موقعیت را در انتهای پرونده خروجی قرار می‌دهد. .TP 8 .BR \-x ", " \-\-extend ", " \-\-append تفسیر موقعیت خروجی را طوری تغییر می‌دهد که از انتهای پرونده خروجی موجود شروع شود، و الحاق به پرونده را تسهیل می‌کند. اگر پرونده خروجی وجود نداشته باشد، خطا گزارش شده و اجرای .B dd_rescue متوقف خواهد شد. .TP 8 .BI \-m\ maxxfer \fR,\ \fB\-\-maxxfer= maxxfer \fR,\ \fB\-\-max\-size= maxxfer حداکثر تعداد بایت‌هایی را مشخص می‌کند (پسوندها اعمال می‌شوند، اما بر حسب بلوک شمارش نمی‌شود) که .B dd_rescue رونوشت می‌کند. اگر پیش از انتقال .IR maxxfer بایت، انتهای پرونده (EOF) فرا برسد، این گزینه بدون هشدار نادیده گرفته خواهد شد. .TP 8 .BR \-M ", " \-\-noextend به .B dd_rescue می‌گوید که پرونده خروجی را گسترش ندهد. این گزینه به‌ویژه هنگام بازنویسی پرونده با داده‌های تصادفی یا صفرها برای امحای امن داده‌ها مفید است. اگر پرونده خروجی وجود نداشته باشد، یک پیام خطا تولید شده و برنامه متوقف می‌شود. . .SS "مدیریت خطا (Error handling)" .TP 8 .BI \-e\ maxerr \fR,\ \fB\-\-maxerr= maxerr به .B dd_rescue می‌گوید که پس از مواجهه با .IR maxerr خطای خواندن، خارج شود. به طور پیش‌فرض، این مقدار روی 0 تنظیم شده است که باعث می‌شود .B dd_rescue تلاش کند تا رسیدن به EOF (یا انتقال .IR maxxfer بایت) به پیشروی ادامه دهد. .TP 8 .BR \-w ", " \-\-abort_we باعث می‌شود .B dd_rescue با هر خطای نوشتن متوقف شود. به طور پیش‌فرض، هنگام خطاهای گزارش‌شده در نوشتن، .B dd_rescue تلاش می‌کند بلوک‌ها را با نوشتن در اندازه‌های کوچکتر بازنویسی کند، تا یک خرابی کوچک در بلوکی بزرگتر باعث نوشته نشدن کل بلوک نشود. توجه داشته باشید که این موضوع ممکن است به طور مشابه توسط هسته سیستم‌عامل شما در نوشتن‌های بافری مدیریت شود بدون آنکه کاربر یا dd_rescue متوجه شوند؛ منطق تلاش مجدد در نوشتن در dd_rescue بیشتر برای ورودی/خروجی مستقیم (direct I/O) سودمند است که در آن خطاهای نوشتن را می‌توان به طور قابل اتکا شناسایی کرد. .br تشخیص خطای نوشتن در حالت نوشتن بافری نامطمئن است؛ هسته وضعیت موفقیت را گزارش می‌کند و ردپای عملیات ناموفق writeback ممکن است بعداً فقط در syslog شما ظاهر شود. dd_rescue با فراخوانی fsync() و بررسی دقیق مقادیر بازگشتی فراخوانی‌های fsync() و close() تلاش می‌کند متوجه این امر شود. .br توجه داشته باشید که .B dd_rescue در صورتی که نوشتن در پرونده خروجی به گزارش نبود فضای کافی توسط سیستم‌عامل منجر شود، خارج می‌شود. . .SS "پرونده‌های پراکنده و پرهیز از نوشتن (Sparse files and write avoidance)" .TP 8 .BR \-A ", " \-\-alwayswrite رفتار .B dd_rescue را تغییر می‌دهد تا در صورت عدم امکان خواندن پرونده ورودی، صفرها را در پرونده خروجی بنویسد. به طور پیش‌فرض، برنامه تنها از آن رد می‌شود و هر محتوایی را که قبلاً در آن موقعیت در پرونده خروجی بوده باقی می‌گذارد. رفتار پیش‌فرض ممکن است مطلوب باشد، اگر مثلاً عملیات پیشین رونوشت‌برداری داده‌های سالمی را در جای خود قرار داده باشد؛ اما اگر پرونده خروجی حاوی اطلاعات زائد (یا اطلاعات حساس) باشد که بهتر است با صفر بازنویسی شوند، ممکن است نامطلوب باشد. .TP 8 .BR \-a ", " \-\-sparse باعث می‌شود .B dd_rescue به دنبال بلوک‌های خالی (حداقل به اندازه نصف .IR softbs ) یعنی بلوک‌های پر از صفر بگردد. به جای نوشتن آن صفرها در پرونده خروجی، به سمت جلو در پرونده خروجی جهش می‌کند، که به ایجاد یک پرونده پراکنده (sparse file) و صرفه‌جویی در فضای سیستم پرونده خروجی (در صورت پشتیبانی از پرونده‌های پراکنده) می‌انجامد. توجه داشته باشید که اگر پرونده خروجی از قبل موجود باشد و در مکانی که صفرها نادیده گرفته می‌شوند داده ذخیره شده باشد، این امر منجر به یک رونوشت ناکامل خواهد شد به طوری که پرونده خروجی در مکان‌هایی که بلوک‌های صفر جهش شده‌اند با پرونده ورودی تفاوت خواهد داشت. .B dd_rescue تلاش می‌کند این موضوع را تشخیص دهد و هشدار صادر کند، اما مانع از رخ دادن آن نمی‌شود. هنگام کار با پرونده‌های پراکنده، succxfer داده‌های واقعاً نوشته‌شده را گزارش می‌دهد، نه بخش‌هایی که در حین نوشتن نادیده گرفته شده‌اند. .TP 8 .BR \-W ", " \-\-avoidwrite باعث می‌شود .B dd_rescue پیش از نوشتن، یک بلوک (به اندازه .IR softbs ) را از پرونده خروجی بخواند. اگر این بلوک از قبل با داده‌ای که قرار است روی آن نوشته شود یکسان باشد، عملاً از نوشتن آن صرف‌نظر می‌شود. این گزینه می‌تواند برای دستگاه‌هایی مفید باشد که برای نمونه نوشتن روی آنها باید محدود شود (مثلاً چون ممکن است بر طول عمر باقی‌مانده تأثیر بگذارد یا بسیار کندتر از خواندن است). .TP 8 .BI \-@\ readtime \fR,\ \fB\-\-sparse_nonslow=readtime بهینه‌سازی برای رونوشت‌های پراکنده است. هنگامی که .BB dd_rescue برای پاکسازی یک دستگاه (یا پارتیشن) با بازنویسی روی خودش استفاده می‌شود، گزینه -a (--sparse) به خوبی می‌تواند برای جلوگیری از نوشتن صفرها روی فضای تخصیص‌نیافته (مثلاً در SSDها) استفاده شود. اما اگر بلوک‌ها از قبل تخصیص یافته باشند و کاملاً صفر باشند، و خواندن آنها بسیار کند باشد، ممکن است بخواهیم استثنا قائل شویم و آنها را دوباره با صفر بازنویسی کنیم. .BB dd_rescue می‌تواند این حالت را از طریق کند بودن خواندن تشخیص دهد. بنابراین با استفاده از این گزینه، می‌توان یک حد (به ثانیه) برای زمانی که خواندن ممکن است طول بکشد پیش از اینکه نوشتن صفر در حالت sparse انجام شود، تعیین کرد. ممکن است بخواهید هنگام احیای SSDها این مقدار را روی حدود ۳ تنظیم کنید. . .SS "بهینه‌سازی‌های دیگر (Other optimization)" .TP 8 .BR \-R ", " \-\-repeat به .B dd_rescue می‌گوید تنها یک بلوک (به اندازه .IR softbs ) را بخواند و سپس آن را مکرراً در پرونده خروجی بنویسد. توجه داشته باشید که این کار منجر به عدم رسیدن به EOF در پرونده ورودی می‌شود و باید همراه با یک حد برای اندازه انتقال (گزینه‌های -m یا -M) یا هنگام پر کردن کامل یک دستگاه خروجی استفاده شود. .br اگر نام پرونده ورودی برابر با "/dev/zero" باشد، این گزینه به طور خودکار فعال می‌شود. .TP 8 .BR \-u ", " \-\-rmvtrim به .B dd_rescue دستور می‌دهد پرونده خروجی را پس از اتمام نوشتن حذف کرده و دستور FITRIM را روی سیستم پرونده‌ای که حاوی پرونده خروجی است اجرا کند. این کار تنها زمانی منطقی است که نوشتن صفرها (یا اعداد تصادفی) مد نظر باشد، بر خلاف انتقال محتوای مفید از یک پرونده دیگر. (اگر این گزینه همراه با یک پرونده ورودی معمولی و بدون استفاده از \-f (\-\-force) مشخص شود، dd_rescue درخواست تأیید خواهد کرد.) این گزینه می‌تواند برای اطمینان از اینکه تمام بلوک‌های خالی یک سیستم پرونده با صفر پر شده‌اند (به جای اینکه حاوی قطعات پرونده‌های حذف‌شده با اطلاعات بالقوه حساس باشند) استفاده شود. .br فراخوانی ioctl مربوط به FITRIM (در لینوکس) به فضای ذخیره‌سازی اعلام می‌کند که فضای آزادشده را استفاده‌نشده در نظر بگیرد (مشابه ابزار fstrim یا گزینه discard) با صدور دستورهای ATA TRIM یا SCSI DISCARD/WRITE_SAME. این کار تنها با دسترسی مدیر سیستم (superuser) موفق خواهد بود (اما در غیر این صورت می‌توان این خطا را با خیال راحت نادیده گرفت). این ویژگی برای اطمینان از عملکرد کامل حافظه‌های فلش / SSD یا آزادسازی فضا در فضاهای ذخیره‌سازی thinly provisioned مفید است. توجه داشته باشید که FITRIM ممکن است روی سیستم‌های پرونده بزرگ طول بکشد، به‌ویژه اگر سیستم‌های پرونده با گزینه discard متصل نشده باشند و مدتی (مثلاً با fstrim) تریم نشده باشند. همه سیستم‌های پرونده و همه فضاهای ذخیره‌سازی مبتنی بر فلش از این قابلیت پشتیبانی نمی‌کنند. .TP 8 .BR \-k ", " \-\-splice به .B dd_rescue می‌گوید به جای خواندن بلوک‌ها در بافر فضای کاربر، از عملیات رونوشت درون هسته‌ای لینوکس به صورت zerocopy یعنی splice() استفاده کند. توجه داشته باشید که این حالت عملیاتی مانع از پشتیبانی از شماری از قابلیت‌های .B dd_rescue می‌شود که به طور معمول قابل استفاده هستند، مانند عقب‌نشینی به اندازه‌های بلوک کوچکتر، پرهیز از نوشتن، حالت پراکنده، بهینه‌سازی تکرار، و رونوشت در جهت معکوس. هشداری برای آگاه کردن کاربر صادر می‌شود. .TP 8 .BR \-P ", " \-\-fallocate باعث می‌شود .B dd_rescue تابع fallocate() را روی پرونده خروجی فراخوانی کند، و به سیستم پرونده بگوید چه میزان فضا را برای پرونده خروجی از پیش تخصیص دهد. (اندازه بر اساس موقعیت پایانی مورد انتظار، که از طول پرونده ورودی و .IR maxxfer استنباط می‌شود، تعیین می‌گردد). در سیستم‌های پرونده‌ای که پشتیبانی می‌کنند، این امر منجر به تصمیم‌گیری‌های بهتر در تخصیص فضا شده و از تکه‌تکه شدن (fragmentation) جلوگیری می‌کند. (توجه داشته باشید که استفاده هم‌زمان از sparse به همراه fallocate() منطقی نیست.) .br این گزینه تنها در صورتی در دسترس است که dd_rescue با پشتیبانی از fallocate() کامپایل شده باشد. برای پشتیبانی بهینه، باید با کتابخانه libfallocate کامپایل شده باشد. .TP 8 .BI \-C\ rate \fR,\ \fB\ \-\-ratecontrol= rate سرعت انتقال .B dd_rescue را به .IR rate (در ثانیه) محدود می‌کند. پسوندهای معمول مجاز هستند. توجه داشته باشید که این گزینه میانگین سرعت را محدود می‌کند؛ سرعت لحظه‌ای ممکن است تا دو برابر این حد باشد. حالت پیش‌فرض نامحدود است. توجه داشته باشید که اگر می‌خواهید به کمتر از 32k (kB/s) بروید، باید از softblocksizeهای کوچک‌تر استفاده کنید. . .SS Misc options (گزینه‌های گوناگون) .TP 8 .BR \-r ", " \-\-reverse به .B dd_rescue دستور می‌دهد که رونوشت را در جهت معکوس، با شروع از .IR ipos (که مقدار ویژه 0 در آن به معنای EOF یا انتهای پرونده است) و به سوی آغاز پرونده انجام دهد. این کار به‌ویژه زمانی سودمند است که پرونده ورودی دارای یک نقطه خراب (bad spot) باشد که پرش از روی آن ممکن است بسیار زمان‌بر باشد، بنابراین نزدیک شدن به آن از هر دو جهت زمان زیادی را ذخیره می‌کند (و ممکن است از آسیب بیشتر جلوگیری کند). .br توجه داشته باشید که اگر پرونده ورودی و خروجی یکسان باشند و موقعیت ورودی کوچک‌تر از موقعیت خروجی باشد، .B dd_rescue به‌طور خودکار به رونوشت در جهت معکوس جابه‌جا می‌شود، مشابه هوشمندی‌ای که memmove() برای جلوگیری از دست رفتن داده هنگام رونوشت بخش‌های هم‌پوشان به کار می‌گیرد. گزینه -f / --force مانع از اجرای این هوشمندی می‌شود. .TP 8 .BR \-p ", " \-\-preserve هنگام رونوشت پرونده‌ها، این گزینه موجب می‌شود فراداده‌های پرونده (مهر زمانی، مالکیت، حقوق دسترسی، xattrها) رونوشت شوند، مشابه گزینه‌ای به همین نام در برنامه cp. .br توجه داشته باشید که ACLها و xattrها تنها در صورتی رونوشت خواهند شد که .B dd_rescue با پشتیبانی از libxattr همگردانی شده باشد و این کتابخانه بتواند به‌صورت پویا روی سامانه بارگذاری شود. همچنین توجه داشته باشید که ناتوانی در رونوشت ویژگی‌ها با .IR -p یک شکست به شمار نمی‌رود و در نتیجه تأثیر منفی بر کد خروج dd_rescue نخواهد داشت. این رفتار را می‌توان با یک .IR -p دوم تغییر داد، که منجر به خروج زودهنگام (کد ۲۶) برای خطاهای مالکیت و مجوز و کد خروج غیرصفر برای خطاهای رونوشت زمان‌ها و xattr می‌شود. .TP 8 .BR \-t ", " \-\-truncate به .B dd_rescue دستور می‌دهد پرونده خروجی را با O_TRUNC باز کند، که باعث می‌شود پرونده خروجی (در صورتی که یک پرونده معمولی باشد) پیش از نوشتن به 0 بایت بریده (truncate) شود و تمام محتوای پیشین آن پاک گردد. به‌طور پیش‌فرض، .B dd_rescue محتوای قبلی را حذف نمی‌کند. .TP 8 .BR \-T ", " \-\-trunclast به .B dd_rescue دستور می‌دهد پس از پایان عملیات رونوشت، اندازه پرونده خروجی را تا بالاترین موقعیت رونوشت‌شده کوتاه کند، و بدین ترتیب اطمینان حاصل شود داده‌ای فراتر از پایان داده‌های رونوشت‌شده در این اجرا وجود ندارد. .TP 8 .BR \-d ", " \-\-odir_in به .B dd_rescue دستور می‌دهد .IR infile را با O_DIRECT باز کند و بافرهای هسته را دور بزند. اگرچه این گزینه اثر منفی بر کارایی دارد (هسته برای ورودی/خروجی بافرشده پیش‌خوانی انجام می‌دهد)، اما موجب می‌شود خطاها سریع‌تر شناسایی شوند (هسته تلاش دوباره نمی‌کند) و واحدهای کوچک‌تر ورودی/خروجی (اندازه سکتور سخت‌افزاری، ۵۱۲ بایت برای بیشتر دیسک‌های سخت) را امکان‌پذیر می‌سازد. .br ممکن است O_DIRECT در همه پلتفرم‌ها در دسترس نباشد. .TP 8 .BR \-D ", " \-\-odir_out به .B dd_rescue دستور می‌دهد .IR outfile را با O_DIRECT باز کند و بافرهای هسته را دور بزند. این کار تأثیر منفی چشمگیری بر کارایی دارد، زیرا برنامه بر خلاف ماهیت ناهمگام بازنویسی بافرشده، باید منتظر بنشیند تا عملیات نوشتن روی دیسک‌ها ثبت شود. در مقابل، وضعیت بازگشتی نوشتن از این طریق مطمئن است و قطعات کوچک‌تر ورودی/خروجی (اندازه سکتور سخت‌افزاری، ۵۱۲ بایت) امکان‌پذیر خواهند بود. . .SS Logging (ثبت وقایع) .TP 8 .BI \-l\ logfile \fR,\ \fB\-\-logfile= logfile مگر در حالت بی‌صدا، .B dd_rescue به‌طور پیوسته وضعیت عملیات رونوشت را در stderr به‌روزرسانی می‌کند. با این گزینه، این گزارش‌ها در .IR logfile مشخص‌شده نیز نوشته می‌شوند. نویسه‌های کنترلی (برای بردن مکان‌نما به بالا جهت بازنویسی روی خطوط وضعیت موجود) در پرونده وقایع نوشته نمی‌شوند. .TP 8 .BI \-o\ bbfile \fR,\ \fB\-\-bbfile= bbfile به .B dd_rescue دستور می‌دهد فهرستی از بلوک‌های خراب را در .IR bbfile بنویسد. این پرونده شامل فهرستی از اعداد (ASCII) خواهد بود، یکی در هر سطر، که در آن اعداد آفست را بر حسب بلوک‌هایی با اندازه .IR hardbs مشخص می‌کنند. قالب این پرونده با خروجی badblocks سازگار است. با استفاده از dd_rescue روی یک دستگاه بلوکی (پارتیشن) و تنظیم .IR hardbs به اندازه بلوک سیستم‌پرونده‌ای که می‌خواهید بسازید، باید بتوانید .IR bbfile را همراه با گزینه -l به mke2fs بدهید. . .SS Multiple output files (چندین پرونده خروجی) .TP 8 .BI \-Y\ ofileX \fR,\ \fB\-\-outfile= ofileX \fR,\ \fB\-\-of= ofileX اگر می‌خواهید داده‌ها را به‌طور هم‌زمان در چندین پرونده رونوشت کنید، می‌توانید این گزینه را مشخص کنید. این گزینه می‌تواند چندین بار مشخص شود، بنابراین رونوشت‌های متعددی می‌توانند ایجاد شوند. توجه داشته باشید که این‌ها پرونده‌های خروجی ثانویه هستند؛ موقعیت پرونده آن‌ها با پرونده خروجی اصلی یعنی .IR outfile مشترک است. خطاها هنگام نوشتن در یک پرونده خروجی ثانویه نادیده گرفته می‌شوند. . .SS Data protection by overwriting with random numbers (محافظت از داده با بازنویسی با اعداد تصادفی) .TP 8 .BI \-z\ RANDSEED \fR,\ \fB\-\-random= RANDSEED .PD 0 .TP .BI \-Z\ RANDSEED \fR,\ \fB\-\-frandom= RANDSEED .TP .BI \-2\ RANDSEED \fR,\ \fB\-\-shred2= RANDSEED .TP .BI \-3\ RANDSEED \fR,\ \fB\-\-shred3= RANDSEED .TP .BI \-4\ RANDSEED \fR,\ \fB\-\-shred4= RANDSEED .PD 1 .\".PD 0 .\".IP "\fB\-5\fR \fIRANDSEED\fR,\ \fB\-\-shred5=\fR\fIRANDSEED\fR" 4 هنگامی که می‌خواهید یک پرونده، پارتیشن یا دیسک را با داده‌های تصادفی بازنویسی کنید، استفاده از /dev/urandom (در لینوکس) به عنوان ورودی ایده چندان خوبی نیست؛ این رابط برای فراهم آوردن پهنای باند بالا طراحی نشده است. بهتر است از یک مولد اعداد شبه‌تصادفی (PRNG) در فضای کاربری استفاده کنید. با گزینه -z / --random، از PRNG کتابخانه C استفاده می‌شود. با -Z / --frandom و گزینه‌های -2/-3/-4 / --shred2/3/4، یک PRNG مبتنی بر RC4 به کار گرفته می‌شود. .br توجه داشته باشید که در این حالت، هیچ .IR infile ای وجود ندارد، بنابراین نخستین آرگومان غیرگزینه‌ای همان پرونده خروجی است. .br مولد PRNG به مقدار بذر (seed) نیاز دارد؛ مولد PRNG کتابخانه C یک عدد صحیح ۳۲ بیتی (۴ بایت) می‌گیرد؛ مولد PRNG مبتنی بر RC4 مقدار ۲۵۶ بایت می‌گیرد. اگر .IR RANDSEED یک عدد صحیح باشد، آن عدد صحیح برای بذردهی به PRNG کتابخانه C استفاده خواهد شد. برای روش RC4، مولد PRNG کتابخانه C سپس ۲۵۶ بایت را برای بذردهی به آن تولید می‌کند. این کار داده‌های PRNG تکرارپذیر ایجاد می‌کند. مقدار RANDSEED برابر 0 استثنایی است؛ این مقدار مقداری بر پایه زمان کنونی و PID فرایند به همراه تصادفی‌سازی پردازنده (در صورت دسترسی) می‌سازد و برای چندین بار اجرای .B dd_rescue متفاوت خواهد بود. .br اگر .IR RANDSEED یک عدد صحیح نباشد، نام پرونده‌ای در نظر گرفته می‌شود که مقادیر بذر را می‌توان از آن خواند. .B dd_rescue مقدار ۴ یا ۲۵۶ بایت را از پرونده می‌خواند تا به PRNG کتابخانه C یا RC4 بذر بدهد. برای به دست آوردن اعداد شبه‌تصادفی خوب، استفاده از /dev/urandom برای بذردهی ایده مناسبی است. .br حالت‌های -2/-3/-4 یا به عبارت دیگر --shred2/--shred3/--shred4 پرونده خروجی را چندین بار بازنویسی می‌کنند؛ پس از هر گذر، fsync() اطمینان می‌دهد که داده‌ها حتماً در پرونده ثبت شده‌اند. آخرین گذر در این حالت‌ها پرونده را با صفر بازنویسی می‌کند. دلیل انجام این کار پنهان کردن آسان‌تر بازنویسی داده‌های مهم، تسهیل بازیافت بلوک‌های خالی در سامانه‌های ذخیره‌سازی هوشمند (مانند SSDها) و فشرده‌سازی بهتر تصویر سیستم‌پرونده حاوی چنین داده‌هایی است. .br با -2 / --shred2، یک گذر با PRNG تولیدشده با RC4 انجام می‌شود و سپس صفرها نوشته می‌شوند. با -3 / --shred3، دو گذر با اعداد تصادفی تولیدشده با RC4 PRNG و یک گذر صفر وجود دارد؛ دومین گذر PRNG اعداد معکوس (وارون بیتی) گذر نخست را می‌نویسد. گزینه -4 / --shred4 مانند -3 / --shred3 عمل می‌کند، همراه با یک گذر اضافی با اعداد تصادفی مستقل به عنوان گذر سوم. . .SS Plugins (پلاگین‌ها) از نسخهٔ 1.42 به بعد، .B dd_rescue دارای یک رابط برای پلاگین‌ها است. پلاگین‌ها توانایی تحلیل داده‌های رونوشت‌شده یا دگرگون ساختن آن‌ها را پیش از نوشته‌شدن دارند. . .TP 8 .BI \-L\ plugin1[=param1[:param2[:..]]][,plugin2[=..][,..]] .PD 0 .TP .BI \-\-plugins= plugin1[=param1[:param2[:..]]][,plugin2[=..][,..]] .PD 1 پلاگین‌های plugin1 و... را بارگذاری کرده و پارامترها را به آن‌ها منتقل می‌کند. تمام پلاگین‌ها باید دست‌کم از پارامتر help پشتیبانی کنند و اطلاعاتی دربارهٔ نحوهٔ استفادهٔ خود ارائه دهند. .br پلاگین‌ها ممکن است محدودیت‌هایی را بر dd_rescue تحمیل کنند. پلاگین‌هایی که داده‌ها را بررسی می‌کنند نمی‌توانند با splice کار کنند، زیرا splice از رونوشت داده‌ها به فضای کاربری جلوگیری می‌کند. همچنین این رابط در حال حاضر امکان رونوشت در جهت معکوس را فراهم نمی‌کند. برخی پلاگین‌ها ممکن است محدودیت‌های بیشتری در رابطه با تراز بودن داده‌ها در پرونده یا عدم استفاده از تشخیص بخش‌های خالی (sparse detection) اعمال کنند. .br بخش .B PLUGINS را برای مرور کلی پلاگین‌های موجود مشاهده کنید. . .SH PLUGINS (پلاگین‌ها) .SS null پلاگین null (به نام ddr_null) کاری انجام نمی‌دهد، مگر اینکه گزینه‌های .B [no]lnchange یا .B [no]change را تعیین کنید که در این صورت پلاگین به سایر بخش‌ها اعلام می‌کند که طول خروجی یا داده‌های جریان را دگرگون می‌سازد. (با پیشوند no، دوباره به وضعیت پیش‌فرض عدم تغییر بازنشانی می‌شود.) این قابلیت ممکن است برای آزمایش یا برای تأثیرگذاری بر اینکه پلاگین hash کدام پرونده را برای خواندن/نوشتن ویژگی‌های گسترش‌یافته (extended attributes) در نظر بگیرد و همچنین تغییر رفتار پلاگین‌ها در زمینهٔ تشخیص حفره‌ها (hole detection) مفید باشد. .br همچنین ddr_null_ddr به شما امکان می‌دهد .B debug را تعیین کنید که در این حالت صرفاً بلوک‌هایی را که از خود عبور می‌دهد گزارش می‌کند. . .SS hash هنگامی که پلاگین hash (که از این پس به عنوان ddr_hash یاد می‌شود) بارگذاری شود، یک هش رمزنگاری و در صورت تمایل یک HMAC بر روی داده‌های رونوشت‌شده محاسبه می‌کند و نتیجه را در پایان عملیات رونوشت نمایش می‌دهد. الگوریتم هش را می‌توان با تعیین .B alg[o[rithm]]=ALG انتخاب کرد که در آن ALG یکی از گزینه‌های md5، sha1، sha256، sha224، sha512، sha384 است. (برای دریافت فهرست، alg=help را مشخص کنید.) برای کوتاه‌سازی نحو دستور، می‌توان بخش =alg را حذف کرد. .br برای سازگاری با نسخه‌های پیشین، به پلاگین hash می‌توان با نام قدیمی MD5 نیز اشاره کرد؛ در این حالت به‌طور پیش‌فرض از الگوریتم md5 استفاده می‌شود. .br مقدار محاسبه‌شده باید با اجرای md5sum/sha256sum/... بر روی پرونده مقصد یکسان باشد (مگر اینکه تنها بخشی از پرونده را بنویسید)، اما با عدم دسترسی دوباره به پرونده (که احتمالاً حجیم است)، در زمان صرفه‌جویی می‌کند. پلاگین hash عملیات نوشتن متناوب (sparse) و آفست‌های دلخواه را به خوبی مدیریت می‌کند. .PP .B multipart=CHUNKSIZE به ddr_hash اعلام می‌کند که چندین چِک‌سام برای قطعاتی از پرونده به اندازه CHUNKSIZE محاسبه کند و سپس با ایجاد یک چِک‌سام از روی چِک‌سام‌های قطعات، آن‌ها را به یک چِک‌سام ترکیبی تبدیل نماید. این همان روشی است که چِک‌سام برای اشیاء چندبخشی S3 محاسبه می‌شود (با استفاده از هش md5)؛ خروجی در آنجا چِک‌سام ترکیبی به همراه یک خط تیره و تعداد بخش‌های ضمیمه‌شده است. .br توجه داشته باشید که این ویژگی در نسخه 1.99.6 جدید است و هنوز شرایطی را که در آن آفست‌ها به همراه اندازه بلوک‌ها دقیقاً با CHUNKSIZE هم‌تراز نمی‌شوند، به طور کامل مدیریت نمی‌کند. پیاده‌سازی این بخش بعداً تکمیل خواهد شد. سایر ویژگی‌ها مانند بخش‌های append/prepend/hmac نیز به خوبی با محاسبه چِک‌سام چندبخشی کار نمی‌کنند. .PP پلاگین ddr_hash همچنین از پارامتر .B append=STRING پشتیبانی می‌کند که رشته مشخص‌شده STRING را پیش از محاسبه هش رمزنگاری به خروجی پیوست می‌نماید. با فرض اینکه STRING یک راز مشترک (shared secret) است، این قابلیت عملاً می‌تواند برای محافظت در برابر کسی که بدون آگاهی از راز، محتوا را تغییر می‌دهد (و هش را دوباره محاسبه می‌کند) بدون اینکه کسی متوجه شود، به کار رود. بنابراین این روش، راهکاری ارزان برای امضای رمزنگاری است (اما با رازهای مشترک در مقایسه با رمزنگاری کلید عمومی). از HMAC برای راهکاری تا حدی بهتر جهت امضای داده‌ها با راز مشترک استفاده کنید. .br همچنین ddr_hash از .B prepend=STRING پشتیبانی می‌کند که احتمالاً حمله با جستجوی فراگیر (brute force) به آن نسبت به رشته پیوست‌شده سخت‌تر است. توجه داشته باشید که ddr_hash همواره مضاربی از اندازه بلوک الگوریتم هش را در ابتدا قرار می‌دهد و رشته STRING را با 0 تکمیل (pad) می‌کند تا مطابقت داشته باشد. .PP می‌توان از ddr_hash برای محاسبه یک HMAC (کُد احراز اصالت پیام مبتنی بر هش) به جای هش ساده استفاده کرد. HMAC از یک گذرواژه استفاده می‌کند که دو بار به داده‌ها اضافه و تبدیل شده و سپس دو بار هش می‌شود. تصور می‌شود که HMAC تا حدی بهتر از هش ساده (با یک راز ساده پیشوند شده) در برابر حملات گسترش طول (extension) یا برخورد (collision) محافظت می‌کند، بنابراین روش بهتری برای احراز اصالت داده‌ها با یک راز مشترک است. (در صورتی که به طرحی با بیش از یک راز نیاز داشته باشید، می‌توانید علاوه بر HMAC از append/prepend نیز استفاده کنید.) .br هنگامی که HMAC با یکی از پارامترهای زیر فعال شود، هم هش ساده و هم HMAC توسط ddr_hash محاسبه می‌شوند. هر دو در کنسول/گزارش نمایش داده می‌شوند، اما HMAC به جای مقدار هش جهت نوشتن در پرونده CHECKSUMS یا در یک ویژگی گسترش‌یافته (extended attribute) یا برای بررسی اعتبار استفاده می‌شود (پایین را ببینید). .B hmacpwd=STRING راز مشترک (گذرواژه) را برای محاسبه HMAC تعیین می‌کند. ارسال رمز در خط فرمان این عیب را دارد که شل ممکن است برخی بایت‌ها را به عنوان نویسه‌های ویژه تفسیر کند و اینکه خط فرمان ممکن است برای همهٔ کاربران واردشده به سیستم قابل مشاهده باشد. .B hmacpwdfd=INT یک توصیف‌گر پرونده را تعیین می‌کند که رمز (گذرواژه) برای محاسبه HMAC از آن خوانده خواهد شد. تعیین 0 به معنای ورودی استاندارد (stdin) است که در این صورت ddr_hash حتی یک اعلان (prompt) برای شما نمایش می‌دهد... سایر اعداد ممکن است در حالتی مفید باشند که dd_rescue از برنامه دیگری فراخوانی شود که لوله‌ای را برای انتقال رمز باز می‌کند. .B hmacpwdnm=INNAME پرونده‌ای را تعیین می‌کند که راز مشترک (گذرواژه) از آن خوانده می‌شود. توجه داشته باشید که تمام بایت‌ها (تا حداکثر 2048 بایت) خوانده شده و مورد استفاده قرار می‌گیرند، از جمله فاصله‌های خالی انتهایی، بایت‌های 0 یا خطوط جدید. .br لطفاً توجه داشته باشید که پلاگین ddr_hash در این مقطع تمهیدات زیادی برای جلوگیری از باقی ماندن گذرواژه/راز پیشوند/پیوست‌شده در حافظه یا نشت آن به پرونده swap/page در نظر نمی‌گیرد. (این مورد زمانی که بر روی پلاگین‌های رمزنگاری کار کنم بهبود خواهد یافت.) .PP پلاگین ddr_hash پارامتر .B output را می‌پذیرد که باعث می‌شود ddr_hash هش رمزنگاری را با همان قالبی که md5sum/sha256sum/... استفاده می‌کنند به stdout ارسال کند. شما همچنین می‌توانید .B outfd=INT را تعیین کنید تا پلاگین هش را در توصیف‌گر پرونده متفاوتی که با عدد صحیح INT مشخص شده بنویسد. توجه داشته باشید که ddr_hash همواره داده‌ها را در حالت دودویی پردازش می‌کند و این موضوع را به درستی با یک ستاره (*) در خروجی تولیدشده توسط output/outfd= نشان می‌دهد. .br چِک‌سام را می‌توان با ارائه پارامتر .B outnm=OUTNAME در یک پرونده نیز نوشت. سپس پرونده‌ای با نام OUTNAME ایجاد خواهد شد و خطی سازگار با md5sum/sha256sum/... در پرونده درج می‌شود. اگر پرونده وجود داشته باشد و حاوی مدخلی برای این پرونده باشد، به‌روزرسانی خواهد شد. اگر پرونده موجود باشد و حاوی مدخلی برای این پرونده نباشد، مدخلی به آن افزوده می‌شود. در صورت حذف OUTNAME، از نام پرونده CHECKSUMS.alg (یا در صورت فعال بودن HMAC، از HMACS.alg) استفاده خواهد شد (alg با الگوریتم انتخابی جایگزین می‌شود). اگر چِک‌سام قابل نوشتن نباشد، هشداری نمایش داده شده و کد خروج dd_rescue غیرصفر خواهد شد. .PP چِک‌سام را می‌توان با استفاده از .B chknm=CHKNAME . اعتبارسنجی کرد. پرونده خوانده خواهد شد و ddr_hash به دنبال خطی سازگار با md5sum/sha256sum/... با نام پرونده منطبق می‌گردد تا چِک‌سام را از آن بردارد و با چِک‌سام محاسبه‌شده مقایسه کند. در صورت حذف NAME، همان پیش‌فرض توضیح داده شده در بالا (در outnm=...) استفاده خواهد شد. همچنین در صورت تمایل می‌توانید با تعیین گزینهٔ .B check چِک‌سام را از ورودی استاندارد بخوانید. .br توجه داشته باشید که در هر صورت، بررسی تنها پس از اتمام عملیات رونوشت انجام می‌شود -- بنابراین یک چِک‌سام نادرست مانع از انجام رونوشت نخواهد شد. با این حال، کد خروج dd_rescue خطا را نشان خواهد داد. (اگر می‌خواهید از رونوشت داده‌ها با چِک‌سام معیوب به مقصد نهایی جلوگیری کنید، از یک مقصد موقت استفاده کنید که در صورت بروز خطا آن را حذف کنید و تنها زمانی که مقدار خروج dd_rescue برابر 0 بود آن را به مکان نهایی منتقل کنید؛ البته می‌توانید پیش‌تر برای آزمایش در dev/null/ نیز رونوشت بگیرید، اما خواندن پرونده ورودی برای بار دوم ممکن است بسیار پرهزینه باشد.) .br اگر علاوه بر .B chknm (یا .B chk_xattr ) گزینهٔ .B chkadd تعیین شود، آنگاه چِک‌سام ناموجود به عنوان خطا گزارش نخواهد شد، بلکه در عوض مدخلی به پرونده چِک‌سام (یا xattr) اضافه می‌شود. عدم تطابق همچنان به عنوان خطا گزارش شده و پرونده چِک‌سام به‌روزرسانی نخواهد شد. .PP می‌توانید با استفاده از گزینهٔ .B set_xattr هش رمزنگاری را درون پرونده‌ها ذخیره کنید. هش به‌طور پیش‌فرض در ویژگی گسترش‌یافته user.checksum.ALG ذخیره می‌شود (در صورت فعال بودن HMAC، در user.hmac.ALG)، اما می‌توانید با تعیین .B set_xattr=XATTR\.NAME نام ویژگی را تغییر دهید. اگر xattr قابل نوشتن نباشد، خطایی گزارش خواهد شد، مگر اینکه گزینهٔ .B fallb[ack][=CHKNAME] را نیز مشخص کنید. در این حالت، ddr_hash تلاش می‌کند چِک‌سام را در پرونده چِک‌سام CHKNAME بنویسد. (برای پیش‌فرض CHKNAME، گزینه outnm= در بالا را ببینید.) .br گزینهٔ .B chk_xattr بررسی خواهد کرد که آیا هش محاسبه‌شده با مقدار خوانده‌شده از ویژگی گسترش‌یافته مطابقت دارد یا خیر. همان نام پیش‌فرض ویژگی اعمال می‌شود و شما به همین ترتیب می‌توانید آن را با .B chk_xattr=XATTR\.NAME . تغییر دهید. عدم وجود ویژگی به عنوان خطا تلقی می‌شود (اگرچه در صورت مشخص کردن گزینه fallback، همان راهکار جایگزین امتحان می‌شود). یک چِک‌سام خراب نیز مسلماً خطا در نظر گرفته می‌شود، اما دقیقاً مانند checknm=CHKNAME مانع از رونوشت نخواهد شد. توضیحات مربوطه در آن بخش را ببینید. .PP توجه داشته باشید که برای output، outfd، outnm=، set_xattr، پلاگین ddr_hash از نام پرونده خروجی برای پیوست کردن چِک‌سام به آن استفاده خواهد کرد (چه با تنظیم xattr یا نام پرونده استفاده‌شده در پرونده چِک‌سام)، مگر اینکه پلاگینی در زنجیره بعد از ddr_hash مشخص کند که داده‌ها را تغییر می‌دهد. در این صورت هشدار می‌دهد و چِک‌سام را به نام پرونده ورودی مرتبط می‌کند، مگر اینکه پلاگین دیگری قبل از ddr_hash در زنجیره وجود داشته باشد که آن هم تغییر داده‌ها را نشان دهد. در این حالت پرونده‌ای وجود ندارد که چِک‌سام بتواند به آن مرتبط شود و ddr_hash خطایی را گزارش خواهد کرد. .br به همین ترتیب برای chknm=، check، chk_xattr، پلاگین ddr_hash از نام پرونده ورودی برای دریافت چِک‌سام استفاده می‌کند (چه با خواندن xattr یا با جستجوی نام پرونده ورودی در یک پرونده چِک‌سام)، مگر اینکه پلاگینی در زنجیره قبل از ddr_hash وجود داشته باشد که تغییر داده‌ها را اعلام کند. در این صورت از نام پرونده خروجی استفاده خواهد شد، مگر اینکه پلاگین دیگری بعد از ddr_hash نیز تغییر داده‌ها را نشان دهد که در این حالت پرونده‌ای وجود ندارد که بتوان چِک‌سام را از آن دریافت کرد و بنابراین خطایی گزارش می‌شود. .PP اگر سیستم شما از ویژگی‌های گسترش‌یافته (extended attributes) پشتیبانی می‌کند، این ویژگی‌ها این مزیت را دارند که همراه با پرونده‌ها منتقل می‌شوند؛ بنابراین تغییر نام یا رونوشت (با dd_rescue -p) چِک‌سام را حفظ خواهد کرد. از سوی دیگر پرونده‌های چِک‌سام در همه جا قابل پردازش هستند (از جمله انتقال از طریق ftp یا http) و می‌توان آن‌ها را با PGP/GnuPG به‌صورت رمزنگاری‌شده امضا کرد. .PP لطفاً توجه داشته باشید که الگوریتم md5 دیگر برای محافظت مناسب در برابر تلاش‌های مخرب جهت پنهان‌سازی تغییر داده‌ها توصیه نمی‌شود؛ دیگر برای جلوگیری از برخورد هش‌ها (hash collisions) به اندازه کافی امن تلقی نمی‌شود. الگوریتم sha1 اندکی بهتر است، اما تا سال 2017 آن نیز شکسته شده است. توصیه می‌شود از خانواده هش‌های SHA-2 استفاده کنید. روی رایانه‌های 32بیتی، استفاده از sha256 را توصیه می‌کنم، در حالی که در سیستم‌های 64بیتی، sha512 سریع‌تر و در نتیجه بهترین گزینه است. توجه داشته باشید که در برخی پردازنده‌های x86-64 و اغلب پردازنده‌های armv8/aarch64 شتاب‌دهنده سخت‌افزاری برای sha256 وجود دارد، بنابراین در آنجا از sha512 سریع‌تر عمل می‌کند. ابزار dd_rescue این شتاب‌دهنده را شناسایی کرده و مورد استفاده قرار می‌دهد (از نسخه 1.99.16 به بعد). .PP پلاگین ddr_hash همچنین از کد و هش‌های HMAC برای اشتقاق کلیدها از گذرواژه‌ها با استفاده از PKCS5 PBKDF2 (تابع اشتقاق کلید مبتنی بر گذرواژه) پشتیبانی می‌کند که به شما امکان می‌دهد با استفاده از یک سالت (salt) و یک عملیات نسبتاً سنگین کشش کلید (key stretching)، محافظت در برابر گذرواژه‌های متوسط را بهبود بخشید. این ویژگی صرفاً برای آزمایش در نظر گرفته شده و ممکن است در آینده حذف شود. بنابراین در این صفحه راهنما مستند نشده است. برای خلاصه‌ای کوتاه از نحوه استفاده، تابع راهنمای داخلی را ببینید. . .SS crypt پلاگین crypt امکان رمزگذاری و رمزگشایی بلادرنگ داده‌ها را فراهم می‌کند. در حال حاضر این افزونه از انواع رمزهای AES پشتیبانی می‌نماید. صفحهٔ راهنمای .BR ddr_crypt (1) را برای جزئیات بیشتر ببینید. . .SS lzo (پلاگین lzo) پلاگین lzo امکان فشرده‌سازی و خارج کردن داده‌ها از فشردگی را با استفاده از liblzo2 فراهم می‌کند. lzo الگوریتمی است که نسبت به بیشتر الگوریتم‌های دیگر سریع‌تر عمل می‌کند اما داده‌ها را به آن اندازه فشرده نمی‌سازد. برای جزئیات بیشتر به صفحه راهنمای .BR ddr_lzo (1) مراجعه کنید. . .SS ddr_lzma (پلاگین ddr_lzma) پلاگین فشرده‌سازی/خارج کردن از فشردگی xz با استفاده از liblzma. از بیشتر گزینه‌های رایج ابزارهای xz پشتیبانی می‌کند. lzma الگوریتمی است که پرونده‌هایی با فشردگی بالا تولید می‌کند به قیمت مصرف بالای پردازنده (CPU) و حافظه در حین فشرده‌سازی. خارج کردن از حالت فشرده سریع است. برای جزئیات بیشتر به صفحه راهنمای .BR ddr_lzma (1) مراجعه کنید. . .SH EXIT STATUS (وضعیت خروج) در صورت تکمیل موفقیت‌آمیز، .B dd_rescue کد خروج 0 را برمی‌گرداند. هر کد خروج دیگری نشان می‌دهد که برنامه به دلیل بروز وضعیت خطا متوقف شده یا عملیات رونوشت‌برداری از داده‌ها کاملاً موفقیت‌آمیز نبوده است. .PP .\"TODO: Better documentation of the error codes! . .SH EXAMPLES (مثال‌ها) .TP .BI dd_rescue\ \-k\ \-P\ \-p\ \-t\ infile\ outfile پرونده .IR infile را به .IR outfile رونوشت می‌کند و هنگام باز کردن پرونده خروجی، آن را کوتاه‌سازی (truncate) می‌نماید (بنابراین هرگونه داده قبلی درون آن حذف می‌شود)، در پایان دسترسی‌ها (mode)، زمان‌ها و مالکیت را رونوشت می‌کند، از fallocate برای رزرو فضا برای پرونده خروجی بهره می‌گیرد و از روش بهینه رونوشت splice درون هسته استفاده می‌کند. .TP .BI dd_rescue\ \-A\ \-d\ \-D\ \-b\ 512\ /dev/sda\ /dev/sda محتوای هر سکتور دیسک sda را می‌خواند و آن را در همان مکان بازنویسی می‌کند. دیسک‌های سخت معمولی سکتورهای متزلزل و معیوب را هنگام نوشتن مجدداً تخصیص می‌دهند (reallocate)، بنابراین در صورت وجود خطاهای قبلی، این عملیات ممکن است باعث شود کل دیسک دوباره قابل استفاده گردد. با این حال، بلوک‌های غیرقابل‌خواندن پس از این حاوی صفر خواهند بود. .TP .BI dd_rescue\ \-2\ /dev/urandom\ \-M\ outfile پرونده .IR outfile را دو بار بازنویسی می‌کند؛ یک بار با اعداد شبه‌تصادفی باکیفیت و سپس با صفرها. .TP .BI dd_rescue\ \-t\ \-a\ image1.raw\ image2.raw یک تصویر سامانه پرونده (filesystem image) را رونوشت می‌کند و به دنبال بلوک‌های خالی می‌گردد تا یک پرونده خروجی متخلخل (sparse) برای صرفه‌جویی در فضای دیسک ایجاد کند. (اگر سامانه پرونده مبدأ کمی استفاده شده باشد، ساختن یک پرونده بزرگ حاوی صفر روی آن سامانه پرونده و حذف مجدد آن پیش از این عملیات، باعث ایجاد سکتورهای بیشتری با مقدار صفر خواهد شد. دستور .BI dd_rescue\ \-u\ /dev/zero\ DUMMY این کار را محقق خواهد کرد...) .TP .BI dd_rescue\ \-ATL\ hash=md5:output,lzo=compress:bench,MD5:output\ in\ out.lzo پرونده .IR in را به .IR out.lzo با استفاده از فشرده‌سازی lzo (lzo1x_1) و محاسبه هش md5 (چک‌سام) روی هر دو پرونده رونوشت می‌کند. هش‌های md5 برای هر دو پرونده نیز در قالب خروجی md5sum روی stdout نوشته می‌شوند. توجه داشته باشید که پارامتر compress برای lzo در اینجا اکیداً الزامی نیست؛ پلاگین می‌توانست آن را از روی نام پرونده‌ها استنتاج کند. این مثال نشان می‌دهد که می‌توانید چندین پلاگین را با پارامترهای متعدد تعیین کنید؛ پلاگین‌ها یک زنجیره پالایه (filter chain) تشکیل می‌دهند. می‌توانید یک پلاگین یکسان را چندین بار مشخص کنید. .TP .BI dd_rescue\ \-L\ hash=sha512:set_xattr:fallb,null=change\ infile\ /dev/null پرونده .IR infile را می‌خواند و هش sha512 آن را محاسبه می‌کند. آن را در ویژگی کاربر user.checksum.sha512 پرونده ورودی ذخیره می‌کند (و اگر xattr قابل نوشتن نباشد، به عنوان جایگزین آن را در CHECKSUMS.sha512 می‌نویسد). به کاربرد پلاگین null با جعل تغییر داده توسط پارامتر change توجه کنید؛ این امر باعث می‌شود پلاگین hash روی پرونده ورودی بنویسد که در حالت عادی این کار را نمی‌کرد. البته در صورتی که مجوزهای لازم برای نوشتن xattr روی infile یا نوشتن چک‌سام در CHECKSUMS.sha512 را نداشته باشید، این عملیات با شکست مواجه خواهد شد. .PP برای آشنایی با قابلیت‌ها همچنین به README.dd_rescue و ddr_lzo(1) رجوع کنید. . .SH TESTING (آزمایش) کد آزمایش‌نشده تقریباً همیشه دارای اشکال (bug) است. اتفاقاً من یک دیسک سخت آسیب‌دیده دارم که هر از گاهی از آن برای آزمایش dd_rescue استفاده می‌کنم. اما برای امکان‌پذیر ساختن آزمایش خودکار بازیابی خطا، بهتر است خرابی‌های قابل پیش‌بینی وجود داشته باشد تا برنامه با آن‌ها مواجه شود. بنابراین یک چارچوب تزریق خطا (fault injection) تعبیه شده است. .br مشخص کردن .B -F\ 5w/1,17r/3,42r/-1,80-84r/0 در خط فرمان موجب می‌شود که نوشتن بلوک پنجم (شمارش‌شده بر اساس hardblocksize) یک بار با شکست مواجه شود (که dd_rescue باید از آن بازیابی شود، چرا که برای نوشتن‌های ناموفق بار دوم تلاش می‌کند)، بلوک شماره ۱۷ سه بار در خواندن شکست بخورد، بلوک شماره ۴۲ یک بار به درستی خوانده شود اما پس از آن با شکست مواجه گردد، در حالی که بلوک‌های ۸۰ تا ۸۳ کاملاً غیرقابل خواندن هستند (بی‌نهایت بار شکست خواهند خورد). توجه داشته باشید که این بازه، بلوک پایانی را شامل نمی‌شود (80-84 یعنی ۴ بلوک که از ۸۰ شروع می‌شوند). .br آفست‌های بلوک همیشه بر حسب موقعیت‌های مطلق محاسبه می‌شوند، بنابراین شروع از وسط یک پرونده با -s یا رونوشت‌برداری معکوس تأثیری بر موقعیت مطلقی که مورد تزریق خطا قرار می‌گیرد نخواهد داشت. (این رفتار از نسخه 1.98 تغییر یافته است.) .br گزینه .B -H percent در خط فرمان با بازگرداندن خواندن‌ها و نوشتن‌های ناقص و همچنین بازگرداندن نشانه‌ای مبنی بر اینکه خواندن یا نوشتن باید مجدداً انجام شود چرا که فراخوان سیستمی قطع شده یا مسدود خواهد شد، در خواندن و نوشتن هرج‌ومرج ایجاد می‌کند. درصد تعیین‌شده هم بر فراخوان‌های قطع‌شده و هم بر خواندن‌ها/نوشتن‌های ناقص اعمال خواهد شد. طبق مستندات GNU libc، چنین مواردی می‌توانند رخ دهند؛ این واقعیت که آن‌ها به ندرت و تنها تحت شرایط خاصی رخ می‌دهند، آزمایش آن‌ها را دشوار می‌کند، از این رو این گزینه برای وادار کردن آن به وقوع تصادفی در نظر گرفته شده است. (این موضوع به رفع اشکالاتی در 1.99.21 انجامید.) .br .SH BUGS/LIMITATIONS (اشکالات/محدودیت‌ها) کد منبع از توابع ۶۴ بیتی ارائه‌شده توسط glibc برای موقعیت‌یابی در پرونده (file positioning) استفاده می‌کند. با این حال، ممکن است هسته شما از آن پشتیبانی نکند، بنابراین ممکن است قادر به رونوشت کردن پارتیشن‌های بزرگ‌تر از ۲ گیگابایت درون یک پرونده نباشید. .br این برنامه با استفاده از لینوکس نوشته شده و تنها روی چند سامانه لینوکسی آزمایش شده است. کاربرانی گزارش کرده‌اند که با موفقیت از آن در سایر سامانه‌های شبه‌یونیکس (مانند xBSD یا M*cOS) استفاده کرده‌اند، اما این سامانه‌ها به ندرت پوشش آزمایش منظم دریافت می‌کنند؛ بنابراین اکیداً توصیه می‌شود پیش از اتکا به dd_rescue روی سامانه‌های غیرمبتنی بر لینوکس، به طور مناسب آن را آزمایش کنید (احتمالاً با استفاده از مجموعه آزمون make check ارائه‌شده همراه با توزیع منبع). .br در حال حاضر، توالی فرار (escape sequence) برای بالا بردن مکان‌نما در کد منبع به صورت ثابت نوشته شده است. این توالی برای بیشتر شبیه‌سازهای پایانه (شامل vt100 و linux) مناسب است، اما به جای آن باید از پایگاه داده توصیف پایانه استفاده شود. .br از زمان dd_rescue-1.10، پرونده‌های ورودی یا خروجی غیرقابل جستجو (non-seekable) پشتیبانی می‌شوند، اما البته محدودیت‌هایی برای بازیابی خطاها در چنین مواردی وجود دارد. .PP dd_rescue بازیابی پرونده‌ها یا پارتیشن‌های خراب را به وسیله نگهداری خودکار فهرستی از سکتورهای رونوشت‌شده و نزدیک شدن به نقاط آسیب‌دیده از هر دو سمت خودکار نمی‌کند. یک اسکریپت کمکی به نام dd_rhelp از LAB Valentin وجود دارد که این کار را انجام می‌دهد. ادغام چنین حالتی در خود .B dd_rescue امری پیچیده است و به دلیل پیچیدگی کد منبع ممکن است انجام نشود. .br همچنین ابزاری به نام GNU ddrescue وجود دارد که یک بازپیاده‌سازی از این ابزار است و قابلیت‌های لازم برای خودکارسازی بازیابی پرونده‌های خراب را به شیوه‌ای که dd_rhelp عمل می‌کند، در بر دارد. این ابزار تنوع ویژگی‌های dd_rescue را ندارد، اما گزارش شده است که کار با آن برای بازیابی خطا نسبت به dd_rescue به همراه dd_rhelp ساده‌تر است. .PP اگر داده‌های شما بسیار ارزشمند است و در نظر دارید دیسک خود را به یک شرکت بازیابی داده بفرستید، شاید بهتر باشد از ابزارهای تصویربرداری مانند dd_rescue، dd_rhelp یا GNU ddrescue استفاده نکنید. اگر بدشانس باشید، دیسک متحمل آسیب مکانیکی شده است (برای نمونه در اثر ضربه یا افتادن)، و ادامه استفاده از آن ممکن است باعث آسیب بیشتر هد به سطح دیسک شود. شاید بتوانید این وضعیت را با افزایش سریع شمارش خطاها در مشخصه‌های SMART یا شنیدن صدای کلیک تشخیص دهید. .PP لطفاً اشکالات را از طریق رایانامه به من گزارش کنید. . .SS Data destruction considerations (ملاحظات تخریب داده‌ها) حالت‌های بازنویسی داده‌ها با اعداد شبه‌تصادفی به منظور حذف امن داده‌های حساس، عمداً تنها تعداد محدودی بازنویسی انجام می‌دهند. در حالی که تحلیل کلاسیک پیتر گوتمن (Peter Gutmann) نتیجه می‌گیرد که فناوری دیسک‌های سخت آن زمان برای واقعاً امن بودن نیازمند تعداد بیشتری بازنویسی بوده است، نویسنده بر این باور است که فناوری دیسک‌های سخت امروزی اجازه بازیابی داده‌های سکتورهایی را که با حالت --shred4 بازنویسی شده‌اند نمی‌دهد. این امر مطابق با توصیه‌های BSI GSDS M7.15 است. .br بازنویسی کل پارتیشن‌ها یا دیسک‌ها با اعداد تصادفی روشی نسبتاً امن برای نابودسازی داده‌ها است، مگر آنکه دستگاه ذخیره‌سازی زیرین رفتارهای پیچیده و پنهانی بیش از حدی داشته باشد. درایوهای SSD در لایه ترجمه فلش (FTL) خود کارهای پیچیده‌ای انجام می‌دهند، بنابراین ممکن است این ابزار برای رهایی کامل از داده‌ها ناکافی باشد. در چنین حالتی از SECURITY_ERASE (با استفاده از hdparm) استفاده کنید یا -- در صورت دسترسی -- داده‌ها را با AES256 رمزگذاری کرده و کلید را با امنیت نابود سازید. دیسک‌های سخت معمولی خطر کوچکی برای نشت چند سکتور به دلیل تخصیص مجدد سکتورهای ناپایدار دارند. .br برای نابودسازی امن تک‌پرونده‌ها، نتایج ممکن است متفاوت باشد. هرچه سامانه پرونده شما پیشرفته‌تر باشد، احتمال مؤثر بودن تخریب dd_rescue کمتر خواهد بود. به‌ویژه سامانه‌های پرونده دارای ژورنال ممکن است داده‌های قدیمی را در ژورنال نگه دارند. سامانه‌های پرونده‌ای که کپی هنگام نوشتن (COW) انجام می‌دهند مانند btrfs، بسیار محتمل است که نسخه‌های قدیمی از پرونده به‌ظاهر پاک‌شده شما را داشته باشند. پر کردن سامانه پرونده با صفر (dd_rescue -u /dev/zero /path/to/fs/DUMMYNAME) ممکن است تا حدی کمک کند تا سامانه پرونده را پس از بازنویسی پرونده‌های حیاتی با اعداد تصادفی، به آزادسازی و بازنویسی داده‌های غیرجاری وادار کند. در صورت امکان، بهتر است کل یک پارتیشن یا دیسک را نابود کنید. . .SH SEE ALSO (همچنین ببینید) .BR README.dd_rescue .BR README.dd_rhelp .BR ddr_lzo (1) .br .BR wipe (1) .BR shred (1) .BR ddrescue (1) .BR dd (1) . .SH AUTHOR (نویسنده) Kurt Garloff . .SH CREDITS (قدردانی) بسیاری از اشکالات کوچک توسط Valentin LAB، نویسنده .B dd_rhelp گزارش شده‌اند. .br مولد شبه‌تصادفی RC4 PRNG (frandom) یک پورت از PRNG حالت هسته Eli Billauer است. .br تعدادی از ایده‌ها و پیشنهادات اخیر از سوی Thomas ارائه شده‌اند. .SH COPYRIGHT (حق نشر) این برنامه تحت مجوز عمومی همگانی گنو (GNU GPL) نگارش ۲ یا ۳ \- به انتخاب شما \- محافظت می‌شود. .SH HISTORY (تاریخچه) از نگارش 1.10، پرونده‌های ورودی و خروجی غیرقابل جستجو (non seekable) پشتیبانی می‌شوند. .br رونوشت مستقیم (Splice copy) با پرچم -k از نگارش 1.15 پشتیبانی می‌شود. .br نوار پیشرفت از نگارش 1.17 وجود دارد. .br پشتیبانی از پیش‌تخصیص فضا (fallocate) با پرچم -P از نگارش 1.19 وجود دارد. .br از نگارش 1.23، مقدار پیش‌فرض به -y0 تغییر یافته که کارایی را بهبود می‌بخشد. .br حالت‌های اعداد شبه‌تصادفی از نگارش 1.29 آغاز شدند. .br اجتناب از نوشتن با پرچم -W در نگارش 1.30 پیاده‌سازی شده است. .br پرونده‌های خروجی چندگانه با پرچم -Y در نگارش 1.32 افزوده شدند. .br گزینه‌های طولانی و صفحه راهنما (man page) در نگارش 1.33 آمدند. .br تشخیص بهینه‌شده پرونده‌های متخلخل (SSE2، armv6، اسمبلی armv8، AVX2) از نگارش 1.35 وجود داشته و تا 1.43 ارتقا یافته است. .br پشتیبانی از رونوشت صفات گسترش‌یافته با استفاده از libxattr از نگارش 1.40 فراهم شده است. .br حذف و پاک‌سازی (fstrim) سامانه پرونده خروجی از نگارش 1.41 وجود دارد. پشتیبانی از کامپایل با bionic (کتابخانه C اندروید) با اکثر قابلیت‌های فعال نیز در نگارش 1.41 اضافه شد. .br پلاگین‌ها از نگارش 1.42 وجود دارند؛ پلاگین MD5 در 1.42 و پلاگین lzo در 1.43 آمدند. نگارش 1.44 نام پلاگین MD5 را به hash تغییر داد و پشتیبانی از خانواده درهم‌سازهای SHA-2 را افزود. نگارش 1.45 پشتیبانی از SHA-1 و امکان ذخیره و اعتبارسنجی چکسام‌ها را اضافه کرد. .br نگارش 1.98 قابلیت رمزگذاری و چارچوب تزریق خطا (fault injection) را آورد، 1.99 پشتیبانی از شتاب‌دهنده رمزنگاری ARMv8 را اضافه کرد. 1.99.5 قابلیت کنترل نرخ (ratecontrol) را به همراه داشت. 1.99.6 چکسام‌های چندبخشی به سبک S3 را معرفی کرد. 1.99.7-12 بهینه‌سازی‌های بیشتری در کارایی رمزنگاری و سازگاری با openSSL-1.1 و -3.0 آوردند. 1.99.13-16 بهینه‌سازی‌های بیشتری شامل شتاب‌دهنده sha256 به همراه داشتند. 1.99.17 پشتیبانی از liblzma (xz) را معرفی کرد. 1.99.18-19 آن را با پشتیبانی از حفره‌ها (holes) بهبود بخشیدند. 1.99.20-21 زنجیره‌های پیچیده پلاگین را مقاوم‌سازی کردند و مسائل مربوط به نیاز به تلاش مجدد در مسیر نوشتن را به طور سامانمند مدیریت نمودند. .PP برخی اطلاعات تکمیلی در نشانی زیر قابل دسترسی است: .br http://garloff.de/kurt/linux/ddrescue/ .br ابزار .B dd_rhelp اثر Valentin LAB در نشانی زیر در دسترس است: .br http://www.kalysto.org/utilities/dd_rhelp/index.en.html