LUKSMETA(8)   LUKSMETA(8)

luksmeta - ابزاری برای ذخیره‌سازی فراداده در هدر LUKSv1

luksmeta test -d DEVICE

luksmeta nuke -d DEVICE [-f]

luksmeta init -d DEVICE [-f] [-n]

luksmeta show -d DEVICE [-s SLOT]

luksmeta save -d DEVICE [-s SLOT] -u UUID < DATA

luksmeta load -d DEVICE -s SLOT [-u UUID] > DATA

luksmeta wipe -d DEVICE -s SLOT [-u UUID] [-f]

ابزار luksmeta به مدیر سیستم امکان می‌دهد تا فراداده‌ها را در فاصله خالی میان پایان هدر LUKSv1 و آغاز داده‌های رمزنگاری‌شده ذخیره کند. این قابلیت برای ذخیره داده‌هایی که پیش از بازگشایی قفل حجم در دسترس هستند، معمولاً جهت استفاده در طول فرآیند باز کردن قفل حجم، بسیار سودمند است.

فراداده در مجموعه‌ای از اسلات‌های دارای نوع شناسه یکتا (UUID) ذخیره می‌شود که امکان نگهداری چندین بلوک فراداده را فراهم می‌کند. گرچه اسلات‌های luksmeta از اسلات‌های LUKS الهام گرفته شده‌اند، اما از نظر عملکردی کاملاً مستقل هستند و صرفاً ارتباطی غیرالزامی با یکدیگر دارند. اسلات‌ها صرفاً نشان می‌دهند که یک قطعه فراداده معین با یک رمز عبور مشخص در LUKSv1 (در اسلاتی با شماره مشابه) در ارتباط است. با این حال، خود luksmeta نسبت به ارتباط میان یک اسلات LUKSv1 و اسلات هم‌شماره آن در luksmeta بی‌تفاوت است، به‌جز یک استثنا (که در ادامه به تفصیل آمده است).

پس از اینکه یک حجم LUKSv1 با استفاده از cryptsetup(8) مقداردهی اولیه شد، باید برای ذخیره‌سازی فراداده نیز توسط luksmeta init مقداردهی اولیه شود. پس از تکمیل این مرحله، دستگاه آماده ذخیره‌سازی فراداده خواهد بود.

داده‌ها را می‌توان با استفاده از luksmeta save در یک اسلات نوشت یا با استفاده از luksmeta load از یک اسلات خواند. شما همچنین می‌توانید داده‌های موجود در یک اسلات را با استفاده از luksmeta wipe پاک کنید یا با استفاده از luksmeta show وضعیت اسلات‌ها را جویا شوید.

اغلب چنین تصور می‌شود که ذخیره فراداده در یک اسلات نیازمند یک UUID مشخص است یا یک مرجع رسمی ثبت انواع UUID وجود دارد. این تصور نادرست است.

عبارت UUID مخفف Universally Unique IDentifier (شناسه یکتای جهانی) است. شناسه‌های UUID یک نوع داده استاندارد و پرکاربرد هستند که برای شناسایی بدون نیاز به یک مرجع مرکزی به کار می‌روند. برای استانداردهای مرتبط، به ISO 9834-8:2005 و RFC 4122 مراجعه کنید.

شناسه‌های UUID به‌اندازه کافی بزرگ هستند که برخورد و تداخل آن‌ها در عمل ناممکن است. بنابراین اگر برنامه شما می‌خواهد داده‌ها را در یک اسلات luksmeta ذخیره کند، کافی است UUID اختصاصی خود را تولید کنید و همواره از آن برای ارجاع به نوع داده خود بهره ببرید. اگر چندین نوع داده دارید، می‌توانید آزادانه چندین UUID تولید کنید.

ساده‌ترین روش برای تولید یک UUID استفاده از uuidgen(1) است. با این حال، هر تولیدکننده UUID سازگار با استاندارد کفایت می‌کند.

پیش از خواندن یا نوشتن فراداده، دستگاه بلوکی LUKSv1 باید برای ذخیره‌سازی فراداده مقداردهی اولیه شود. سه دستور در این فرآیند کمک می‌کنند: luksmeta test، luksmeta nuke و luksmeta init.

دستور luksmeta test صرفاً یک دستگاه بلوکی موجود را بررسی می‌کند تا مشخص شود آیا برای ذخیره‌سازی فراداده مقداردهی اولیه شده است یا خیر. این دستور هیچ خروجی متنی تولید نمی‌کند، بنابراین حتماً کد بازگشتی آن را بررسی کنید (بخش زیر را ببینید).

دستور luksmeta nuke تمام فضای خالی هدر LUKSv1 را صفر (پاکسازی) می‌کند. از آنجا که این عملیات تخریب‌کننده است، پیش از پاکسازی این فضا نیاز به تایید کاربر خواهد بود مگر اینکه گزینه -f داده شده باشد.

دستور luksmeta init دستگاه بلوکی LUKSv1 را برای ذخیره‌سازی فراداده مقداردهی اولیه می‌کند. این فرآیند تمام داده‌های موجود در فاصله خالی هدر LUKSv1 را پاک خواهد کرد. به همین دلیل، این دستور پیش از نوشتن هرگونه داده نیاز به تایید کاربر دارد مگر اینکه گزینه -f مشخص شده باشد. توجه داشته باشید که اگر دستگاه از قبل مقداردهی اولیه شده باشد، این دستور بدون اعمال هیچ تغییری با موفقیت پایان می‌یابد. اگر می‌خواهید ایجاد یک وضعیت مقداردهی اولیه تمیز را تحمیل کنید، می‌توانید گزینه -n را مشخص نمایید تا فاصله خالی هدر LUKSv1 پیش از مقداردهی اولیه (اما پس از تایید کاربر) به‌طور کامل پاکسازی شود.

دستور luksmeta show وضعیت کنونی اسلات‌ها را روی دستگاه بلوکی LUKSv1 نمایش می‌دهد. اگر اسلاتی مشخص نشود، جدولی شامل شماره اسلات، وضعیت اسلات متناظر در LUKSv1 و UUID داده‌های ذخیره‌شده در اسلات luksmeta (یا عبارت "empty" در صورتی که داده‌ای ذخیره نشده باشد) را چاپ می‌کند. اگر یک اسلات مشخص شود، این دستور صرفاً شناسه UUID داده موجود در اسلات را چاپ می‌کند. در صورتی که اسلات حاوی داده نباشد، چیزی چاپ نمی‌شود.

مدیریت فراداده در اسلات‌ها با سه دستور انجام می‌شود: luksmeta save، luksmeta load و luksmeta wipe. این دستورات به‌ترتیب فراداده را در یک اسلات می‌نویسند، فراداده را از یک اسلات می‌خوانند و فراداده را در یک اسلات پاک می‌کنند.

دستور luksmeta save فراداده را از ورودی استاندارد می‌خواند و آن را با استفاده از UUID مشخص‌شده در اسلات تعیین‌شده می‌نویسد. اگر اسلاتی مشخص نشود، luksmeta اولین شماره اسلاتی را جستجو می‌کند که اسلات متناظر LUKSv1 آن غیرفعال و اسلات luksmeta آن خالی باشد. این مورد تنها ارتباط رسمی میان اسلات‌های LUKSv1 و اسلات‌های luksmeta را نشان می‌دهد. در این حالت، فراداده با استفاده از UUID تعیین‌شده در نخستین اسلات قابل استفاده نوشته می‌شود و شماره اسلات در خروجی استاندارد چاپ می‌گردد. در هر دو حالت، این دستور هرگز روی داده‌های موجود بازنویسی نخواهد کرد. برای جایگزینی داده‌ها در یک اسلات، باید پیش از luksmeta save دستور luksmeta wipe را اجرا کنید.

دستور luksmeta load داده‌ها را از اسلات مشخص‌شده می‌خواند و در خروجی استاندارد می‌نویسد. اگر یک UUID مشخص شده باشد، دستور بررسی می‌کند که آیا UUID مرتبط با فراداده در آن اسلات با UUID مشخص‌شده مطابقت دارد یا خیر. این بررسی نوع داده کمک می‌کند تا اطمینان یابید همواره نوع داده‌ای را دریافت می‌کنید که انتظارش را دارید. اگر شناسه‌های UUID مطابقت نداشته باشند، دستور با شکست مواجه می‌شود.

دستور luksmeta wipe داده‌ها را از اسلات داده‌شده پاک می‌کند. اگر یک UUID مشخص شود، دستور بررسی می‌کند که آیا UUID مرتبط با فراداده در آن اسلات با UUID مشخص‌شده مطابقت دارد یا خیر. این بررسی نوع داده تضمین می‌کند که تنها داده‌ای را پاک کنید که قصد پاکسازی آن را داشته‌اید. از آنجا که این یک عملیات تخریب‌کننده است، پیش از پاکسازی هرگونه داده، نیاز به تایید کاربر خواهد بود مگر اینکه گزینه -f داده شده باشد. توجه داشته باشید که تلاش برای پاک کردن اسلاتی که از قبل خالی است، با موفقیت همراه خواهد بود.

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

هنگام طراحی این ابزار، این احتمال در نظر گرفته شد که کاربران مایل باشند تعداد اسلات‌های قابل استفاده را به ازای فضای ذخیره‌سازی بیشتر در اسلات‌های به‌کاررفته کاهش دهند. به‌منظور ارائه این انعطاف‌پذیری، میزان فضای در دسترس برای هر اسلات پویا است. به بیان ساده، اندازه اسلات‌ها ثابت نیست. این بدان معناست که این احتمال وجود دارد (و حتی تا حدی محتمل است) که در حین اجرای luksmeta save با خطایی مبنی بر ناکافی بودن فضا مواجه شوید.

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

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

•-d DEVICE, --device=DEVICE : دستگاهی که عملیات روی آن انجام می‌شود.
•-s SLOT, --slot=SLOT : شماره اسلاتی که عملیات روی آن انجام می‌گیرد.
•-u UUID, --uuid=UUID : شناسه UUID مرتبط با عملیات.
•-f, --force : سرکوب اجباری تمامی درخواست‌های تایید کاربر.

این دستور از مقادیر بازگشتی تعریف‌شده در sysexits.h استفاده می‌کند. موارد زیر خطاهای عمومی (و کدهای خروج عددی متناظر با آن‌ها) هستند که معنای آن‌ها میان تمام دستورات luksmeta مشترک است:

•EX_OK (0): عملیات با موفقیت انجام شد.
•EX_USAGE (64): برنامه با پارامترهای نامعتبر فراخوانی شده است.
•EX_DATAERR (65): شناسه UUID مشخص‌شده با UUID اسلات مطابقت ندارد.
•EX_NOINPUT (66): خطایی هنگام خواندن از ورودی استاندارد رخ داده است.
•EX_OSERR (71): یک خطای تعریف‌نشده در سیستم‌عامل رخ داده است.
•EX_OSFILE (72): دستگاه مقداردهی اولیه نشده یا دچار آسیب شده است.
•EX_CANTCREAT (73): فضای کافی در هدر LUKSv1 وجود ندارد.
•EX_IOERR (74): هنگام نوشتن روی دستگاه خطای ورودی/خروجی (I/O) رخ داده است.
•EX_NOPERM (77): کاربر در طول درخواست تایید، مجوز لازم را اعطا نکرد.

علاوه بر این، luksmeta save هنگامی که تلاش کنید داده‌ها را در اسلاتی که از قبل پر شده ذخیره نمایید، کد EX_UNAVAILABLE را بازمی‌گرداند. به همین ترتیب، luksmeta load نیز هنگامی که تلاش کنید از یک اسلات خالی داده بخوانید، کد EX_UNAVAILABLE را برمی‌گرداند.

از بین بردن تمام داده‌ها (شامل داده‌های LUKSMeta) در فاصله خالی هدر LUKSv1 و مقداردهی اولیه این فضا برای ذخیره‌سازی LUKSMeta:

$ luksmeta init -n -f -d /dev/sdz

اگر قبلاً مقداردهی اولیه شده کاری انجام نشود؛ در غیر این صورت، از بین بردن تمام داده‌های غیر LUKSMeta در فاصله خالی هدر LUKSv1 و مقداردهی اولیه این فضا برای ذخیره‌سازی LUKSMeta:

$ luksmeta init -f -d /dev/sdz

نوشتن داده در یک اسلات:

$ UUID=*uuidgen*
$ echo $UUID
31c25e3b-b8e2-4eaa-a427-23aa882feef2
$ echo "Hello, World" | luksmeta save -d /dev/sdz -s 0 -u $UUID

بازخوانی داده‌ها:

$ luksmeta load -d /dev/sdz -s 0 -u $UUID
Hello, World

پاک کردن داده‌ها از اسلات:

$ luksmeta wipe -d /dev/sdz -s 0 -u $UUID

پاک کردن تمامی آثار و نشانه‌های LUKSMeta:

$ luksmeta nuke -f -d /dev/sdz

Nathaniel McCallum <npmccallum@redhat.com>

cryptsetup(8), uuidgen(1)

03/19/2026