Duperemove(8) System Manager’s Manual Duperemove(8)

duperemove - یافتن نواحی تکراری در فایل‌ها و ارسال آن‌ها جهت حذف تکرار

duperemove گزینه‌ها فایل‌ها...

دستور duperemove ابزاری ساده برای یافتن نواحی تکراری در فایل‌ها و ارسال آن‌ها جهت یکسان‌سازی و حذف تکرار داده‌ها (deduplication) است. هنگامی که فهرستی از فایل‌ها به آن داده شود، محتوای آن‌ها را هش کرده و آن هش‌ها را با یکدیگر مقایسه می‌کند تا نواحی منطبق بر یکدیگر را شناسایی و دسته‌بندی نماید. در صورت ارائه گزینه -d، دستور duperemove این نواحی را با استفاده از فراخوانی کنترلی (ioctl) موسوم به FIDEDUPERANGE در هسته لینوکس، جهت حذف تکرار ارسال می‌کند.

دستور duperemove هش‌ها را هم برای اکستنت‌های (extents) هر فایل و هم برای کل محتوای فایل محاسبه می‌کند. به‌صورت اختیاری، امکان محاسبه هش‌ها بر مبنای هر بلوک نیز وجود دارد.

دستور duperemove می‌تواند هش‌های محاسبه‌شده را در یک فایل هش (hashfile) ذخیره کند. اگر یک فایل هشِ از پیش موجود به آن داده شود، duperemove تنها هش فایل‌هایی را محاسبه می‌کند که از زمان آخرین اجرا تغییر کرده‌اند. بنابراین می‌توانید با تغییر داده‌ها، duperemove را مکرراً روی آن‌ها اجرا کنید بدون آنکه نیاز باشد داده‌های بدون تغییر دوباره بررسی و چِک‌سام شوند. برای اطلاعات بیشتر درباره فایل‌های هش، گزینه --hashfile در ادامه و همچنین بخش مثال‌ها را ببینید.

دستور duperemove همچنین می‌تواند ورودی را از برنامه fdupes دریافت کند؛ گزینه --fdupes در ادامه را بررسی کنید.

ابزار Duperemove دارای دو حالت عملیاتی اصلی است که یکی از آن‌ها زیرمجموعه دیگری محسوب می‌شود.

هنگامی که برنامه بدون گزینه -d (حالت پیش‌فرض) اجرا شود، duperemove یک یا چند جدول از اکستنت‌های منطبق را چاپ می‌کند که به تشخیص آن، نامزدهای مناسبی برای حذف تکرار هستند. در نتیجه، حالت فقط‌خواندنی برای مشاهده اینکه duperemove در صورت اجرا با -d چه اقداماتی انجام خواهد داد مفید است.

به‌طور کلی، duperemove به نحوه بازنمایی زیربنایی اکستنت‌هایی که پردازش می‌کند اهمیتی نمی‌دهد. برخی از آن‌ها ممکن است فشرده باشند، تحت عملیات ورودی/خروجی (I/O) قرار داشته باشند، یا حتی قبلاً تکرار آن‌ها حذف شده باشد. در حالت حذف تکرار (dedupe)، هسته لینوکس این جزئیات را مدیریت می‌کند و بنابراین ما سعی نمی‌کنیم این کارها را دوباره تکرار کنیم.

عملکرد این حالت مشابه حالت فقط‌خواندنی است، با این تفاوت که اکستنت‌های تکراریِ یافت‌شده در مرحله «خواندن، هش کردن و مقایسه»، در عمل برای حذف تکرار ارسال می‌شوند. اکستنت‌هایی که تکرار آن‌ها قبلاً حذف شده است نادیده گرفته خواهند شد. پس از تکمیل عملیات، تخمینی از کل داده‌های تکراری حذف‌شده چاپ خواهد شد. این تخمین با مقایسه مقدار کل بایت‌های مشترک در هر فایل قبل و بعد از عملیات حذف تکرار محاسبه می‌شود.

آرگومان files می‌تواند به فهرستی از فایل‌های معمولی و دایرکتوری‌ها اشاره کند یا یک خط تیره (-) باشد تا فایل‌ها از ورودی استاندارد خوانده شوند. اگر یک دایرکتوری مشخص شود، تمام فایل‌های معمولی درون آن نیز پویش خواهند شد. همچنین می‌توان با سوییچ -r به duperemove دستور داد تا دایرکتوری‌ها را به‌صورت بازگشتی پویش کند.

فعال‌سازی پیمایش بازگشتی دایرکتوری‌ها.
حذف تکرار در نتایج - تنها روی سیستم‌فایل‌های btrfs و xfs کار می‌کند. استفاده از این گزینه به‌صورت دو بار باعث غیرفعال شدن بررسی سیستم‌فایل و تلاش برای اجرای ioctl در هر صورت می‌شود.
استفاده از یک فایل برای ذخیره‌سازی هش‌ها به‌جای استفاده از حافظه رم. این گزینه مصرف حافظه duperemove را به‌شدت کاهش می‌دهد و زمانی که مجموعه‌داده شما بیش از چند فایل باشد توصیه می‌شود. همچنین فایل‌های هش قابلیت استفاده مجدد دارند و به شما امکان می‌دهند میزان هش‌کردن انجام‌شده در اجراهای بعدی را بیش از پیش کاهش دهید.

اگر hashfile وجود نداشته باشد ایجاد خواهد شد. اگر وجود داشته باشد، duperemove مسیرهای فایل ذخیره‌شده درون آن را برای بررسی تغییرات چک می‌کند. فایل‌هایی که تغییر کرده باشند مجدداً پویش شده و هش‌های به‌روزشده آن‌ها در hashfile نوشته خواهد شد. فایل‌های حذف‌شده از hashfile پاک می‌شوند.

فایل‌های جدید تنها در صورتی به hashfile اضافه می‌شوند که از طریق آرگومان files قابل کشف باشند. به همین دلیل احتمالاً مایل خواهید بود در هر بار اجرای duperemove، همان فهرست files و آرگومان‌های -r را ارائه دهید. الگوریتم کشف فایل کارآمد است و هر فایل را فقط یک بار بررسی می‌کند، حتی اگر از قبل در hashfile وجود داشته باشد.

افزودن یک مسیر جدید به فایل هش به‌سادگی با اضافه کردن آن به آرگومان files انجام می‌شود.

هنگام حذف تکرار با استفاده از فایل هش، duperemove از پردازش فایل‌هایی که از زمان آخرین عملیات تغییر نکرده‌اند خودداری می‌کند.

اجرای فاز حذف تکرار به ازای هر N فایل تازه‌پویش‌شده. این گزینه مصرف حافظه را برای مجموعه‌داده‌های بزرگ یا هنگام جستجوی جزئی اکستنت‌ها به‌میزان زیادی کاهش می‌دهد، اما کارایی چندنخی (multithreading) را کم می‌کند.

به‌دلیل این بار اضافی کوچک، مقدار آن باید بر اساس اندازه متوسط فایل‌ها و blocksize انتخاب شود.

مقدار پیش‌فرض برای جستجوهای صرفاً بر مبنای اکستنت معقول است، در حالی که اگر duperemove را روی فایل‌های بسیار بزرگ (مانند ماشین‌های مجازی و غیره) اجرا می‌کنید، می‌توانید آن را تا مقدار 1 پایین بیاورید.

به‌طور پیش‌فرض، اندازه دسته‌بندی روی 1024 تنظیم شده است.

چاپ اعداد با فرمت خوانا برای انسان.
حالت بی‌صدا (Quiet). دستور duperemove تنها خطاها و یک خلاصه کوتاه از هر عملیات حذف تکرار را چاپ خواهد کرد.
نمایش خروجی با جزئیات کامل (Verbose).
چاپ متن راهنما.

اجرا در حالت fdupes. با این گزینه می‌توانید خروجی برنامه fdupes را به duperemove لوله‌کشی (pipe) کنید تا تکرار فایل‌های یکسانِ یافت‌شده را حذف نماید. هنگام دریافت فهرست فایل‌ها به این روش، duperemove از مرحله محاسبه هش صرف‌نظر خواهد کرد.
چاپ تمام فایل‌های موجود در فایل هش و خروج از برنامه. به گزینه --hashfile نیاز دارد. در صورت اجرا همراه با -v، اطلاعات بیشتری را درباره هر فایل چاپ خواهد کرد.
حذف فایل از پایگاه‌داده و خروج از برنامه. اگر یک خط تیره (-) ارائه شود، duperemove فهرست را از ورودی استاندارد می‌خواند. به گزینه --hashfile نیاز دارد.

نکته: اگر نام فایل‌ها را از نمونه دیگری از duperemove لوله‌کشی می‌کنید، توصیه می‌شود ابتدا آن‌ها را در یک فایل موقت ذخیره کنید، زیرا اجرای همزمان duperemove روی یک فایل هش یکسان ممکن است باعث خرابی آن فایل هش شود.

خواندن بلوک‌های داده و نادیده گرفتن بلوک‌های صفرشده؛ این گزینه برای افزایش سرعت duperemove مفید است، اما می‌تواند مانع از حذف تکرار فایل‌های تمام‌صفر شود.
استفاده از اندازه بلوک مشخص‌شده برای خواندن اکستنت‌های فایل. مقدار پیش‌فرض 128K است.
استفاده از N نخ برای عملیات ورودی/خروجی (I/O). این گزینه در فازهای محاسبه هش فایل و حذف تکرار استفاده می‌شود. مقدار پیش‌فرض به‌طور خودکار بر اساس تعداد پردازنده‌های میزبان شناسایی می‌شود.
استفاده از N نخ برای وظایف وابسته به پردازنده (CPU bound). این گزینه در فاز یافتن اکستنت‌های تکراری استفاده می‌شود. مقدار پیش‌فرض به‌طور خودکار بر اساس تعداد پردازنده‌های میزبان شناسایی می‌شود.

نکته: قابلیت چندریسمانی همزمان (Hyperthreading) می‌تواند تأثیر منفی بر کارایی فاز یافتن اکستنت‌ها بگذارد. اگر duperemove یک پردازنده اینتل با هایپرتردینگ را شناسایی کند، از نیمی از تعداد هسته‌های گزارش‌شده توسط سیستم برای وظایف وابسته به پردازنده استفاده خواهد کرد.

فهرستی از گزینه‌ها با جداکننده کاما که نحوه حذف تکرار را تغییر می‌دهند. برای غیرفعال کردن یک گزینه، عبارت `no` را به ابتدای آن اضافه کنید.
[no]partial
برنامه duperemove اغلب می‌تواند با مقایسه بخش‌هایی از اکستنت‌ها با یکدیگر، موارد تکراری بیشتری پیدا کند. این فرآیند می‌تواند وظیفه‌ای طولانی و نیازمند بار پردازشی شدید باشد، بنابراین به‌طور پیش‌فرض غیرفعال است. برای محدود کردن اثرات منفی این گزینه، استفاده از --batchsize توصیه می‌شود.

کد مربوط به این گزینه در حال توسعه فعال است و در نتیجه ممکن است مفاهیم آرگومان partial در آینده تغییر کند.

[no]same
پیش‌فرض on (فعال) است. اجازه حذف تکرار اکستنت‌ها در درون همان فایل یکسان.
[no]only_whole_files
پیش‌فرض off (غیرفعال) است. برنامه duperemove تنها روی کل فایل کار خواهد کرد. هر دو حالت حذف تکرار مبتنی بر اکستنت و مبتنی بر بلوک غیرفعال خواهند شد. فایل هش کوچک‌تر خواهد بود و برخی عملیات سریع‌تر می‌شوند، اما کارایی حذف تکرار مسلماً کاهش خواهد یافت.
این گزینه در درجه اول برای آزمایش است. اگر قصد استفاده از فایل‌های هش را دارید، گزینه --hashfile را ببینید.

خواندن هش‌ها از یک فایل هش. با این گزینه نیازی به ارائه فهرست فایل‌ها نیست. عملیات حذف تکرار در صورتی قابل انجام است که duperemove از همان دایرکتوری پایه‌ای اجرا شود که در فایل هش ذخیره شده است (اساساً duperemove باید بتواند فایل‌ها را پیدا کند).

این گزینه در درجه اول برای آزمایش است. اگر قصد استفاده از فایل‌های هش را دارید، گزینه --hashfile را ببینید.

نوشتن هش‌ها در یک فایل هش. این هش‌ها را می‌توان در تاریخی دیگر خواند و عملیات حذف تکرار را بر اساس آن‌ها انجام داد.

چاپ پیام‌های خطایابی؛ در صورت انتخاب، گزینه -v را نیز تحمیل می‌کند.
منسوخ شده است؛ گزینه --io-threads در بالا را ببینید.
می‌توانید فایل‌ها و پوشه‌های خاصی را از فرآیند حذف تکرار مستثنی کنید. این امر به‌عنوان مثال می‌تواند برای نادیده گرفتن نقاط سوارشدن اسنپ‌شات‌های ساب‌والیوم (subvolume snapshot) مفید باشد. مگر اینکه یک مسیر کامل برای استثنا ارائه دهید، الگوی استثنا نسبت به دایرکتوری کاری فعلی در نظر گرفته خواهد شد. نکته دیگری که باید در نظر داشت این است که پوسته‌ها معمولاً الگوهای تطبیق (glob pattern) را گسترش می‌دهند، بنابراین الگوی ارائه‌شده باید در کوتیشن قرار گیرد. با در نظر گرفتن همه موارد، روش صحیح ارائه الگوی استثنا به این صورت است: duperemove --exclude "/path/to/dir/file*" /path/to/dir

حذف تکرار فایل‌ها در دایرکتوری foo/ به‌همراه پیمایش بازگشتی در تمام زیردایرکتوری‌ها. بهتر است از این حالت تنها برای مجموعه‌داده‌های کوچک استفاده کنید:

duperemove -dr /foo

استفاده از duperemove به همراه fdupes برای حذف تکرار فایل‌های یکسان در زیر دایرکتوری foo:

fdupes -r /foo | duperemove --fdupes

برنامه Duperemove می‌تواند به‌صورت اختیاری هش‌های محاسبه‌شده را در یک فایل هش ذخیره کند. فایل‌های هش دو مزیت اصلی دارند: مدیریت مصرف حافظه و قابلیت استفاده مجدد. هنگام استفاده از فایل هش، duperemove هش‌های محاسبه‌شده را به‌جای حافظه اصلی، به‌صورت جریانی در آن فایل می‌نویسد.

اگر Duperemove با یک فایل هش موجود اجرا شود، تنها فایل‌هایی را پویش می‌کند که از زمان آخرین به‌روزرسانی فایل هش تغییر کرده‌اند. آرگومان files مشخص می‌کند که duperemove کدام دایرکتوری‌ها را برای یافتن فایل‌های تازه اضافه‌شده پویش کند. در ساده‌ترین حالت استفاده، duperemove را با همان پارامترها دوباره اجرا می‌کنید و این برنامه فقط فایل‌های تغییریافته یا تازه اضافه‌شده را پویش می‌کند - مثال اول در زیر را ببینید.

حذف تکرار فایل‌ها در دایرکتوری foo و ذخیره هش‌ها در foo.hash. می‌توانیم این دستور را بارها اجرا کنیم و duperemove تنها فایل‌های تغییریافته یا تازه اضافه‌شده را چِک‌سام کرده و تکرار آن‌ها را حذف می‌کند:

duperemove -dr --hashfile=foo.hash foo/

عدم پویش برای فایل‌های جدید، صرفاً به‌روزرسانی فایل‌های تغییریافته یا حذف‌شده و سپس حذف تکرار:

duperemove -dr --hashfile=foo.hash

افزودن دایرکتوری bar به فایل هش و کشف هرگونه فایلی که اخیراً به foo اضافه شده است:

duperemove -dr --hashfile=foo.hash foo/ bar/

فهرست کردن فایل‌های ردگیری‌شده توسط foo.hash:

duperemove -L --hashfile=foo.hash

بله. به‌طور مشخص، duperemove خود داده‌ها را یکسان‌سازی نمی‌کند. این ابزار صرفاً نامزدهای حذف تکرار را می‌یابد و آن‌ها را به ioctl موسوم به FIDEDUPERANGE در هسته لینوکس ارسال می‌کند. به‌منظور تضمین یکپارچگی داده‌ها، هسته دسترسی‌های دیگر به فایل را مسدود کرده و پیش از اقدام به حذف تکرار، مقایسه‌ای بایت‌به‌بایت انجام می‌دهد.

بله. هسته لینوکس وظیفه کار با داده‌های واقعی را بر عهده دارد. از طرف duperemove نیز از یک موتور پایگاه‌داده تراکنشی استفاده می‌شود. در نتیجه شما می‌توانید برنامه را در هر نقطه‌ای با ctrl-c متوقف کرده و مجدداً اجرا نمایید بدون اینکه با خرابی فایل هش خود مواجه شوید. در صورت بروز باگ، ممکن است فایل هش آسیب ببیند اما داده‌های شما هرگز دچار مشکل نخواهند شد.

برنامه duperemove به‌طور پیش‌فرض در سطح دقت اکستنت (extent granularity) عمل می‌کند. این بدان معناست که اگر دو فایل از نظر منطقی یکسان باشند (محتوای یکسانی داشته باشند) اما با ساختار اکستنت متفاوتی روی دیسک قرار گرفته باشند، تکرار آن‌ها حذف نخواهد شد. به‌عنوان مثال، اگر دو فایل هر کدام 128 کیلوبایت باشند و محتوای یکسانی داشته باشند، اما یکی از آن‌ها از یک اکستنت 128 کیلوبایتی منفرد و دیگری از دو اکستنت 64 کیلوبایتی تشکیل شده باشد، تکرار آن‌ها حذف نخواهد شد. این رفتار وابسته به پیاده‌سازی فعلی است و با بهبود duperemove ممکن است تغییر کند.

حذف داده‌های تکراری منجر به افزایش تکه‌تکه‌شدگی (fragmentation) می‌شود. اندازه بلوک انتخاب‌شده می‌تواند بر این امر اثرگذار باشد. اندازه‌های بزرگ‌تر بلوک تکه‌تکه‌شدگی کمتری ایجاد می‌کنند اما ممکن است فضای زیادی را آزاد نکنند. برعکس، اندازه‌های کوچک‌تر بلوک ممکن است فضای بیشتری آزاد کنند اما به قیمت افزایش تکه‌تکه‌شدگی تمام شوند.

برنامه duperemove پس از عملیات حذف تکرار، تخمینی از فضای ذخیره‌شده را برای شما چاپ خواهد کرد.

با اجرای دستور `btrfs fi df` قبل و بعد از هر بار اجرای duperemove می‌توانید تصویر دقیق‌تری به دست آورید.

در مورد استفاده از ابزار `df` در btrfs دقت کنید - معمول است که گزارش فضا در حین پردازش به‌روزرسانی‌های با تأخیر (delayed updates) «عقب بماند»، بنابراین اجرای فوری df بلافاصله پس از حذف تکرار ممکن است هیچ ذخیره فضایی را نشان ندهد.

در حال حاضر duperemove می‌تواند تشخیص دهد که برخی از اکستنت‌های زیربنایی با فایل‌های دیگر به اشتراک گذاشته شده‌اند، اما نمی‌تواند مشخص کند که آن اکستنت‌ها دقیقاً با کدام فایل‌ها مشترک هستند.

تصور کنید duperemove در حال بررسی مجموعه‌ای از فایل‌ها است و متوجه یک ناحیه داده مشترک در یکی از آن‌ها می‌شود. آن داده ممکن است با فایلی خارج از این مجموعه مشترک باشد. از آنجا که duperemove نمی‌تواند این اطلاعات را تفکیک کند، داده‌های مشترک را به حساب عملیات حذف تکرار جاری منظور می‌کند، در حالی که در واقعیت ممکن است هسته سیستم‌عامل فرآیند حذف تکرار بیشتری را برای ما انجام داده باشد.

این موضوع کمی پیچیده است، اما به قابلیتی در Btrfs به نام bookending مربوط می‌شود. مطلب ویکی Btrfs این موضوع را با جزئیات توضیح می‌دهد.

به‌طور کلی، بازنمایی زیربنایی یک اکستنت در Btrfs (به‌جز موارد استثنایی کوچک) قابل تفکیک نیست. بنابراین گاهی اوقات ممکن است در شرایطی قرار بگیریم که یک اکستنتِ فایل تا حدی تکرارش حذف شود (و اکستنت‌ها به‌عنوان مشترک علامت‌گذاری شوند)، اما آیتم اکستنت زیربنایی در دیسک آزاد یا کوتاه (truncate) نشود.

دستور duperemove در خواندن و فهرست‌بندی داده‌ها سریع عمل می‌کند. اجراهای حذف تکرار با محدودیت حافظه رم مواجه خواهند شد، مگر اینکه از گزینه --hashfile استفاده شود. گزینه --hashfile به duperemove اجازه می‌دهد تا هش‌های تکراری را موقتاً روی دیسک ذخیره کند، بنابراین سربار بزرگ حافظه رم برطرف شده و امکان پویش و حذف تکرار حجم بسیار بیشتری از داده‌ها فراهم می‌شود. با این حال، در عمل شما با سرعت دیسک‌ها و پردازنده خود محدود خواهید شد. در شرایطی که منابع محدود هستند، ممکن است با تقسیم مجموعه داده ورودی به بخش‌های کوچک‌تر به موفقیت دست یابید.

هنگام استفاده از فایل هش، duperemove تنها هش‌های تکراری را در حافظه رم ذخیره می‌کند. در طول کارکرد عادی، درخت هش بیشترین بخش از مصرف حافظه duperemove را تشکیل می‌دهد. از نسخه v0.11 برنامه Duperemove، اندازه ورودی‌های هش 88 بایت است. اگر تعداد بلوک‌های تکراری در مجموعه داده خود را بدانید، می‌توانید با ضرب کردن آن در اندازه ورودی هش، به یک تخمین تقریبی از مصرف حافظه دست یابید.

ارقام واقعی کارایی به سخت‌افزار بستگی دارد - اطلاعات به‌روز نتایج آزمایش‌ها در ویکی duperemove نگهداری می‌شود (پیوند زیر را ببینید).

فایل‌های هش اساساً فایل‌های پایگاه‌داده sqlite3 با چند جدول هستند که بزرگ‌ترین آن‌ها جداول files و extents هستند. هر ورودی جدول extents حدود 72 بایت است، اگرچه ممکن است با افزودن ویژگی‌های جدید افزایش یابد. اندازه یک ورودی جدول files به مسیر فایل بستگی دارد، اما یک تخمین خوب حدود 270 بایت به ازای هر فایل است. تعداد اکستنت‌ها در یک مجموعه داده مستقیماً با سطح تکه‌تکه‌شدگی فایل متناسب است.

اگر تعداد کل اکستنت‌ها و فایل‌ها را در مجموعه داده خود بدانید، می‌توانید اندازه فایل هش را به صورت زیر محاسبه کنید:

Hashfile Size = Num Hashes * 72 + Num Files * 270

به‌عنوان مثالی در دنیای واقعی برای ۱ ترابایت داده (۸۳۸۸۶۰۸ بلوک ۱۲۸ کیلوبایتی) توزیع‌شده در ۱۰۰۰ فایل:

8388608 * 72 + 270 * 1000 = 755244720

که معادل حدود ۷۲۰ مگابایت برای ۱ ترابایت داده در ۱۰۰۰ فایل است.

توجه داشته باشید که هیچ‌یک از این محاسبات سربار پایگاه‌داده را در نظر نمی‌گیرد.

در حال حاضر حذف تکرار داده‌ها تنها توسط سیستم‌فایل‌های btrfs و xfs پشتیبانی می‌شود.

صفحه پروژه Duperemove در گیت‌هاب: github

همچنین صفحه ویکی پروژه: wiki

•
hashstats(8)
•
filesystems(5)
•
btrfs(8)
•
xfs(8)
•
fdupes(1)
•
ioctl_fideduprange(2)
01 Mar 2025 duperemove 0.15.1