HARDLINK(1) دستورهای کاربری HARDLINK(1)

hardlink - ایجاد پیوندهای سخت تکراری برای صرفه‌جویی در فضای دیسک

hardlink [options] directory|file...

hardlink ابزاری است که نسخه‌های کپی یک فایل را با پیوندهای سخت (hardlinks) یا کلون‌های رونوشت‌در‌زمان‌نوشتن (copy-on-write clones) جایگزین می‌کند و در نتیجه موجب صرفه‌جویی در فضای دیسک می‌شود.

hardlink ابتدا یک درخت دودویی از اندازه‌های فایل‌ها ایجاد می‌کند و سپس محتوای فایل‌هایی را که اندازهٔ یکسانی دارند مقایسه می‌کند. دو روش اصلی برای مقایسه محتوا وجود دارد. روش memcmp مستقیماً بلوک‌های داده را از فایل‌ها می‌خواند و آن‌ها را مقایسه می‌کند. روش دیگر بر پایه جمع‌های کنترلی (مانند SHA256) است؛ در این حالت برای هر بلوک داده یک جمع کنترلی توسط رابط برنامه‌نویسی رمزنگاری هسته لینوکس (Linux kernel crypto API) محاسبه می‌شود و این جمع کنترلی در فضای کاربری ذخیره شده و برای مقایسه فایل‌ها استفاده می‌شود.

برای هر فایل همچنین یک بافر «مقدماتی» (intro) به اندازهٔ ۳۲ بایت در حافظه موقت (cache) نگهداری می‌شود. این بافر مستقل از روش مقایسه و مقادیر درخواستی cache-size و io-size استفاده می‌شود. بافر «مقدماتی» عملیات با محتوای داده را به طور چشمگیری کاهش می‌دهد زیرا فایل‌ها اغلب از همان ابتدا با یکدیگر تفاوت دارند.

-c, --content

هنگام تعیین یکسان بودن دو فایل، فقط محتوای فایل را در نظر می‌گیرد و ویژگی‌ها (صفات) را نادیده می‌گیرد. معادل -pot است.

-b, --io-size size

اندازه بافر read(2) یا sendfile(2) که هنگام مقایسه محتوای فایل‌ها استفاده می‌شود. آرگومان size می‌تواند با پسوندهای ضربی مانند KiB، MiB و غیره همراه شود. «iB» اختیاری است، برای مثال «K» همان معنی «KiB» را دارد. پیش‌فرض برای روش memcmp برابر 8KiB و برای سایر روش‌ها 1MiB است. تنها روش memcmp از حافظه پردازش برای بافر استفاده می‌کند؛ روش‌های دیگر از روش کپی‌صفر (zero-copy) بهره می‌برند و عملیات ورودی/خروجی (I/O) در داخل هسته انجام می‌شود. اندازه ممکن است در حین اجرا برای جای دادن تعداد جمع‌های کنترلی ذخیره‌شدهٔ محتوا تغییر کند.

-d, --respect-dir

تنها سعی می‌کند فایل‌هایی با نام دایرکتوری (پوشه) یکسان را پیوند دهد. دایرکتوری سطح بالا (همان‌طور که در خط فرمان hardlink مشخص شده است) نادیده گرفته می‌شود. برای مثال، hardlink --respect-dir /foo /bar فایل /foo/some/file را با /bar/some/file پیوند می‌دهد، اما نه با /bar/other/file. اگر با --respect-name ترکیب شود، کل مسیرها (به جز دایرکتوری سطح بالا) مقایسه می‌شوند.

-f, --respect-name

تنها سعی می‌کند فایل‌هایی با نام (پایه) یکسان را پیوند دهد. اکیداً توصیه می‌شود به جای -f از گزینه‌های طولانی استفاده کنید، زیرا این گزینه توسط سایر پیاده‌سازی‌های hardlink به شکل متفاوتی تفسیر می‌شود.

-F, --prioritize-trees

در صورتی که چندین فایل یکسان در درخت‌های مختلف وجود داشته باشد، فایل‌های یافت‌شده در اولین دایرکتوری سطح بالای مشخص‌شده را نگه می‌دارد. برای مثال، hardlink foo/ bar/ فایل‌های موجود در bar/ را به فایل‌های یکسان در دایرکتوری foo/ پیوند می‌دهد.

-i, --include regex

یک عبارت باقاعده (regular expression) برای گنجاندن فایل‌ها. اگر گزینهٔ --exclude داده شده باشد، این گزینه فایل‌هایی را که در غیر این صورت مستثنی می‌شدند دوباره شامل می‌کند. اگر این گزینه بدون --exclude استفاده شود، تنها فایل‌های منطبق با الگو گنجانده می‌شوند.

-l, --list-duplicates

هیچ پیوندی ایجاد نمی‌کند، بلکه مسیر مطلق هر فایل تکراری را در یک سطر جداگانه فهرست می‌کند که پیش از هر کدام یک متمایزکننده یکتای ۱۶ بایتی و یک نویسه برگه (tab) قرار دارد.

-m, --maximize

در میان فایل‌های یکسان، فایلی با بیشترین تعداد پیوند (link count) را نگه می‌دارد.

-M, --minimize

در میان فایل‌های یکسان، فایلی با کمترین تعداد پیوند را نگه می‌دارد.

--mount

در میان سیستم‌فایل‌های مختلف پیمایش نمی‌کند (در همان سیستم‌فایل باقی می‌ماند).

-n, --dry-run

عملیاتی انجام نمی‌دهد، فقط آنچه رخ خواهد داد را چاپ می‌کند.

-o, --ignore-owner

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

-O, --keep-oldest

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

-p, --ignore-mode

فایل‌ها را حتی اگر حالت دسترسی (mode) آن‌ها متفاوت باشد، مقایسه کرده و پیوند می‌دهد. نتایج ممکن است تا حدی غیرقابل پیش‌بینی باشد.

-q, --quiet

حالت بی‌صدا، چیزی چاپ نمی‌کند.

-r, --cache-size size

اندازه حافظه موقت (cache) برای جمع‌های کنترلی محتوا. همه روش‌های غیر memcmp جمع کنترلی را برای هر بلوک محتوای فایل محاسبه می‌کنند (به --io-size مراجعه کنید)، این جمع‌های کنترلی برای مقایسه بعدی در حافظه موقت ذخیره می‌شوند. این اندازه برای فایل‌های بزرگ یا مجموعه‌های بزرگی از فایل‌های هم‌اندازه مهم است. مقدار پیش‌فرض 10MiB است.

--reflink[=when]

ایجاد کلون‌های رونوشت‌در‌زمان‌نوشتن (معروف به reflink) به جای پیوندهای سخت. فایل‌های reflink شده تنها داده‌های روی دیسک را به اشتراک می‌گذارند، اما حالت دسترسی فایل و مالک می‌توانند متفاوت باشند. توصیه می‌شود از این گزینه همراه با گزینه‌های --ignore-owner و --ignore-mode استفاده شود. این گزینه به طور ضمنی --skip-reflinks را فعال می‌کند تا فایل‌هایی را که قبلاً کلون شده‌اند نادیده بگیرد.

آرگومان اختیاری when می‌تواند never، always یا auto باشد. اگر آرگومان when حذف شود، مقدار پیش‌فرض آن auto خواهد بود، به این معنی که hardlink نوع سیستم‌فایل را بررسی می‌کند و تنها در BTRFS، XFS و ZFS از reflink استفاده می‌کند و در صورت عدم امکان ایجاد reflink، به پیوندهای سخت بازمی‌گردد. آرگومان always تشخیص نوع سیستم‌فایل و بازگشت به پیوندهای سخت را غیرفعال می‌کند، به این معنی که تنها reflinkها مجاز هستند.

--skip-reflinks

نادیده گرفتن فایل‌هایی که قبلاً کلون شده‌اند. این گزینه ممکن است بدون --reflink هنگام ایجاد پیوندهای سخت سنتی استفاده شود.

-s, --minimum-size size

حداقل اندازه برای در نظر گرفتن. مقدار پیش‌فرض این گزینه 1 است، بنابراین فایل‌های خالی پیوند داده نخواهند شد. آرگومان size می‌تواند با پسوندهای ضربی مانند KiB (=1024)، MiB (=1024*1024) و به همین ترتیب برای GiB، TiB، PiB، EiB، ZiB و YiB همراه شود («iB» اختیاری است، به عنوان مثال «K» همان معنی «KiB» را دارد).

-S, --maximum-size size

حداکثر اندازه برای در نظر گرفتن. به طور پیش‌فرض این مقدار 0 است و 0 معنای ویژه نامحدود دارد. آرگومان size می‌تواند با پسوندهای ضربی مانند KiB (=1024)، MiB (=1024*1024) و به همین ترتیب برای GiB، TiB، PiB، EiB، ZiB و YiB همراه شود («iB» اختیاری است، به عنوان مثال «K» همان معنی «KiB» را دارد).

-t, --ignore-time

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

-v, --verbose

خروجی با جزئیات، توضیح دادن کارهای در حال انجام برای کاربر. در صورت یک بار مشخص شدن، هر فایل پیوند داده‌شده نمایش داده می‌شود. اگر دو بار مشخص شود، همچنین هر مقایسه را نشان می‌دهد.

-x, --exclude regex

یک عبارت باقاعده که فایل‌ها را از مقایسه و پیوند داده شدن مستثنی می‌کند. این گزینه می‌تواند چندین بار استفاده شود.

--exclude-subtree regex

یک عبارت باقاعده که کل دایرکتوری‌ها را از مقایسه و پیوند داده شدن مستثنی می‌کند. این گزینه نیز می‌تواند چندین بار استفاده شود.

-X, --respect-xattrs

تنها سعی می‌کند فایل‌هایی با ویژگی‌های گسترش‌یافتهٔ (xattrs) یکسان را پیوند دهد.

-y, --method name

تنظیم روش مقایسه محتوای فایل. روش‌های پشتیبانی‌شده در حال حاضر عبارتند از: sha256، sha1، crc32c و memcmp. پیش‌فرض sha256 است، یا اگر رابط برنامه‌نویسی رمزنگاری لینوکس در دسترس نباشد memcmp خواهد بود. روش‌های مبتنی بر جمع کنترلی به صورت کپی‌صفر پیاده‌سازی شده‌اند، به این معنی که محتویات فایل در فضای کاربری کپی نمی‌شوند و تمام محاسبات در هسته انجام می‌شود.

-z, --zero

جداسازی سطرها با یک بایت NUL به جای خط جدید (برای -l).

-h, --help

نمایش متن راهنما و خروج.

-V, --version

نمایش نسخه و خروج.

دستور hardlink یک یا چند دایرکتوری را دریافت می‌کند که برای یافتن فایل‌های قابل پیوند در آن‌ها جستجو خواهد شد.

ULFILEEQ_DEBUG=all

خروجی اشکال‌زدایی را برای مقایسه‌های فایل فعال می‌کند.

پیاده‌سازی اولیهٔ hardlink از گزینهٔ -f برای اجبار به ایجاد پیوندهای سخت میان سیستم‌فایل‌ها استفاده می‌کرد. این ویژگی که به‌ندرت قابل استفاده بود دیگر توسط hardlink فعلی پشتیبانی نمی‌شود.

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

چندین پیاده‌سازی از hardlink وجود دارد. اولین پیاده‌سازی توسط Jakub Jelinek برای توزیع Fedora انجام شد، این پیاده‌سازی در util-linux بین نسخه‌های v2.34 تا v2.36 استفاده شده است. پیاده‌سازی فعلی بر پایه نسخه Debian از Julian Andres Klode است.

برای گزارش باگ‌ها از ردیاب مشکلات https://github.com/util-linux/util-linux/issues.

دستور hardlink بخشی از بستهٔ util-linux است که می‌توان آن را از بایگانی هسته لینوکس https://www.kernel.org/pub/linux/utils/util-linux.

2026-09-02 util-linux 2.42.3