ndctl-create-namespace -
آمادهسازی
یا
بازپیکربندی
یک فضای
نام
ndctl create-namespace [<options>]
ظرفیت یک REGION
از NVDIMM (بازه
پیوستهای
از حافظه
پایدار) از
طریق یک یا
چند دستگاه
NAMESPACE در دسترس
قرار
میگیرد. REGION
اصطلاحی در
لینوکس
برای چیزی
است که ACPI و UEFI
آن را DIMM-interleave-set یا
یک system-physical-address-range
مینامند
که (توسط
کنترلکننده
حافظه) در
میان یک یا
چند ماژول
حافظه به
صورت
خطبندیشده
(striped) توزیع شده
است.
مشخصات UEFI
پروتکل NVDIMM Label
Protocol را به
عنوان
ترکیبی از
روشهای
دسترسی به
ناحیه
برچسب (label area) و
یک قالب
داده برای
ایجاد یک یا
چند شیء NAMESPACE از
یک REGION تعریف
میکند.
توجه داشته
باشید که
پشتیبانی
از برچسب
اختیاری
است و اگر
لینوکس
قابلیت
برچسب را
تشخیص
ندهد، به
طور خودکار
به ازای هر
ناحیه یک
فضای نام
«بدون
برچسب» (label-less)
نمونهسازی
میکند.
نمونههایی
از فضاهای
نام بدون
برچسب
مواردی
هستند که
توسط گزینه
خط فرمان
هسته memmap=ss!nn
ایجاد
شدهاند (به
ویکی nvdimm در kernel.org
مراجعه
کنید)، یا
NVDIMMهایی که
فاقد یک namespace index
معتبر در
ناحیه
برچسب خود
هستند.
نکته
فضاهای
نام بدون
برچسب فاقد
بسیاری از
ویژگیهای
همتایان
دارای
برچسب (label-rich)
خود هستند.
برای
نمونه،
اندازه
آنها قابل
تغییر
نیست، یا
نمیتوان
آنها را
بهطور
کامل destroy کرد
(یعنی فضای
آنها
بازپس
گرفته
نمیشود). یک
عملیات destroy
هرگونه
فراداده
مختص حالت
(mode-specific) را صفر
میکند. در
نهایت،
برای
عملیات create-namespace
روی فضاهای
نام بدون
برچسب، ndctl
بررسیهای
دردسترسبودن
ظرفیت region را
نادیده
میگیرد و
همیشه
درخواست را
با استفاده
از تمام
ظرفیت region
پاسخ
میدهد.
تنها
عملیات
بازپیکربندی
پشتیبانیشده
روی یک فضای
نام بدون
برچسب،
تغییر mode آن
است.
یک فضای
نام
میتواند
طوری
آمادهسازی
شود که در
یکی از ۴
حالت fsdax، devdax،
sector و raw کار
کند. در
اینجا
مدلهای
کاربردی
مورد
انتظار
برای این
حالتها
آمده است:
•fsdax: حالت
Filesystem-DAX حالت
پیشفرض یک
فضای نام
هنگام
تعیین
دستور ndctl create-namespace
بدون هیچ
گزینهای
است. این
حالت یک
دستگاه
بلوکی (/dev/pmemX[.Y])
ایجاد
میکند که
از
قابلیتهای
DAX
سیستمفایلهای
لینوکس
(تاکنون xfs و ext4)
پشتیبانی
میکند. DAX
حافظه نهان
صفحه (page cache) را
از مسیر I/O حذف
کرده و به mmap(2)
امکان
میدهد
نگاشتهای
مستقیمی به
رسانه
حافظه
پایدار
برقرار کند.
قابلیت DAX به
بارهای
کاری /
مجموعههای
کاری (working-sets) که
از ظرفیت page cache
فراتر
میروند
اجازه
میدهد تا
سقف ظرفیت
حافظه
پایدار
مقیاسپذیر
شوند.
بارهای
کاری که در page cache
میگنجند
یا
انتقالهای
داده حجیم
انجام
میدهند
ممکن است
سودی از DAX
نبرند. در
صورت
تردید، این
حالت را
انتخاب
کنید.
•devdax: حالت
Device-DAX
قابلیتهای
نگاشت DAX
مشابه mmap(2) را
مانند Filesystem-DAX
فراهم
میسازد. با
این حال، به
جای یک
دستگاه
بلوکی که
بتواند از
یک
سیستمفایل
مجهز به DAX
پشتیبانی
کند، این
حالت یک
فایل
دستگاه
نویسهای
منفرد (/dev/daxX.Y)
ارائه
میدهد. از
این حالت
برای
اختصاص
حافظه
پایدار به
یک ماشین
مجازی، ثبت
حافظه
پایدار
برای RDMA، یا
در مواردی
که
نگاشتهای
بسیار عظیم
مورد نیاز
است
استفاده
کنید.
•sector: از این
حالت برای
میزبانی
سیستمفایلهای
قدیمی که از
فراداده
جمعآزمایی
(checksum)
نمیگیرند
یا
برنامههایی
که پس از
خرابی
ناگهانی
برای
سکتورهای
ناقص (torn sectors)
آماده
نیستند
استفاده
کنید.
کاربرد
مورد
انتظار
برای این
حالت،
درایوهای
راهاندازی
(boot) کوچک است.
این حالت با
سایر
سیستمعاملها
سازگار
است.
•raw: حالت Raw
در عمل
صرفاً یک
دیسک حافظه
است که از DAX
پشتیبانی
نمیکند.
معمولاً
این وضعیت
نشاندهنده
فضای نامی
است که توسط
ابزارها یا
یک
سیستمعامل
دیگر ایجاد
شده که نحوه
ساخت فضای
نام در
حالتهای fsdax
یا devdax
لینوکس را
نمیدانسته
است. این
حالت با
سایر
سیستمعاملها
سازگار
است، اما
مجدداً از
عملیات DAX
پشتیبانی
نمیکند.
ایجاد یک
فضای نام pmem
با حداکثر
اندازه
ممکن در
حالت fsdax
(حالت
پیشفرض)
ndctl create-namespace
تبدیل namespace0.0
به حالت sector
ndctl create-namespace -f -e namespace0.0 --mode=sector
-m, --mode=
•"raw":
ظرفیت فضای
نام را
مستقیماً
به همراه
محدودیتهایی
در دسترس
قرار
میدهد. یک
فضای نام
خام (raw) pmem از
اتمیک بودن
سکتور (sector atomicity)
پشتیبانی
نمیکند
(حالت «sector» را
در زیر
ببینید). یک
فضای نام pmem
در حالت raw
ممکن است
بسته به
هسته،
پشتیبانی
محدود یا
عدم
پشتیبانی
از dax داشته
باشد. به
عبارت
دیگر،
عملیاتهایی
مانند direct-I/O که
یک بافر dax را
هدف قرار
میدهند
ممکن است
برای یک
فضای نام pmem
در حالت raw با
شکست مواجه
شوند یا
بهصورت
غیرمستقیم
از طریق یک
بافر page-cache
انجام شوند.
برای
عملیات dax،
حالتهای
«fsdax» و «devdax» را
ببینید.
•"sector":
حافظه
پایدار با
توجه به
اینکه به
صورت بایتی
آدرسپذیر
است، از
اتمیک بودن
سکتور
پشتیبانی
نمیکند.
جنبه
چالشبرانگیز
پارگی
سکتور (sector tearing)
این است که
بیشتر
برنامهها
نمیدانند
وابستگی به
بهروزرسانی
اتمیک
سکتور
دارند. یک
دیسک سنتی
به ندرت
دچار پارگی
سکتور
میشود و در
صورت وقوع،
تقریباً
بهطور قطع
در زمان
دسترسی
خطای
جمعآزمایی
(checksum)
بازمیگرداند.
دستگاههای
حافظه
پایدار
همواره و به
شکلی خاموش
دچار پارگی
خواهند شد.
تا زمانی که
یک برنامه
از نظر
پایداری در
برابر
پارگی
سکتور
بررسی و
تأیید نشده
باشد،
استفاده از
حالت «امن»
(safe) توصیه
میشود. این
امر مقداری
سربار
عملکردی
ایجاد کرده
و قابلیت dax را
غیرفعال
میکند
(همچنین به
عنوان حالت
«safe» یا «btt»
شناخته
میشود).
•"fsdax": یک
فضای نام pmem
در این حالت
از عملیات dax
با یک
سیستمفایل
مبتنی بر
دستگاه
بلوکی
پشتیبانی
میکند (در
نسخههای
پیشین ndctl این
حالت «memory»
نام داشت).
این حالت به
هزینه
تخصیص
فراداده به
ازای هر
صفحه (per-page metadata)
تمام
میشود. این
ظرفیت
میتواند
از «System RAM» یا از
بخشی
رزروشده از
«Persistent Memory» تخصیص
یابد (گزینه
--map= را ببینید).
نکته: برای
عملیات dax
وجود یک
سیستمفایل
که از DAX
پشتیبانی
کند الزامی
است. اگر از
دستگاه
بلوکی خام (/dev/pmemX)
مستقیماً و
بدون
سیستمفایل
استفاده
شود، از page cache
استفاده
خواهد کرد.
برای
دسترسی
مستقیم به
دستگاه
بدون
سیستمفایل
با
پشتیبانی
از dax، حالت
«devdax» را
ببینید.
•"devdax":
رابط
دستگاه
نویسهای device-dax
همتای
دسترسی خام
و
تخصیصایستای
filesystem-dax است (در
نسخههای
پیشین ndctl این
حالت «dax» نام
داشت). این
حالت اجازه
میدهد
محدودههای
حافظه بدون
نیاز به یک
سیستمفایل
واسط نگاشت
شوند. رابط device-dax
دقیق،
سختگیرانه
و
قابلپیشبینی
است. بهطور
خاص این
رابط:
•دقت و
دانهبندی
خطا (fault granularity) را بر
اساس
اندازه
صفحه
مشخصشده
در زمان
پیکربندی
(در معماری x86
برابر با 4K، 2M
یا 1G) تضمین
میکند.
•با
سختگیری
نسبت به
سناریوهای
نقص
پشتیبانیشده،
رفتار قطعی
و
قابلپیشبینی
را اعمال
میکند؛ به
عنوان مثال
اگر
دستگاهی با
تراز ۲
مگابایت
پیکربندی
شده باشد،
تلاش برای
ایجاد نقص
در یک آفست
با تراز ۴
کیلوبایت
منجر به
ارسال
سیگنال SIGBUS
خواهد شد. ::
توجه داشته
باشید که هر
دو حالت fsdax و
devdax برای
سازگاری
بینمعماری
(cross-arch) به تراز
فیزیکی ۱۶
مگابایت (16MiB)
نیاز دارند.
بهطور
پیشفرض ndctl
در صورت عدم
تراز آدرس
شروع
فیزیکی با
۱۶
مگابایت،
تلاش برای
ایجاد
فضاهای نام
در این
حالتها را
متوقف
میکند.
گزینه --force سعی
میکند در
صورت
پشتیبانی
پلتفرم از
تراز
کوچکتر
این
محدودیت را
نادیده
بگیرد، اما
این کار
توصیه
نمیشود.
-s, --size=
برای
دستگاههای
NVDIMM که از
برچسبهای
فضای نام
پشتیبانی
میکنند،
اندازه
فضای نام را
بر حسب بایت
تنظیم
میکند. در
غیر این
صورت،
مقدار
پیشفرض آن
حداکثر
اندازه
مشخصشده
توسط
سفتافزار
پلتفرم است.
این گزینه
از
پسوندهای
«k» یا «K»
برای
کیبیبایت
(KiB)، «m» یا «M»
برای
میبیبایت
(MiB)، «g» یا «G»
برای
گیبیبایت (GiB)
و «t» یا «T»
برای
تیبیبایت (TiB)
پشتیبانی
میکند.
برای فضاهای نام pmem، اندازه باید مضربی از پهنای درهمتنیدگی (interleave-width)
و تراز فضای نام باشد (زیر را ببینید).
-a, --align
برنامههایی
که مایلند
نگاشتهای
حافظه dax را با
مدخلهای
جدول صفحه (PTE)
بزرگتر از
اندازه
صفحه پایه
سیستم (4K در x86)
ایجاد
کنند، به یک
فضای نام
حافظه
پایدار با
تراز کافی
نیاز دارند.
برای
حالتهای
«fsdax» و «devdax» این
مقدار
بهطور
پیشفرض 2M
است. توجه
داشته
باشید که
حالت «devdax»
همه
نگاشتها
را ملزم به
تراز بودن
با این
مقدار
میکند،
یعنی تلاش
برای
نگاشتهای
غیرهمتراز
را رد
میکند.
تنظیمات
تراز در «fsdax»
تراز شروع
extentهای
سیستمفایل
را تعیین
میکند و
ممکن است
دانهبندیهای
ممکن را
محدود کند؛
اگر نگاشت
بزرگ ممکن
نباشد، بی
سر و صدا به
اندازه
صفحه
کوچکتر
بازمیگردد.
-e, --reconfig=
بازپیکربندی
یک فضای نام
موجود. این
گزینه یک
میانبُر
برای توالی
زیر است:
•خواندن
تمام
پارامترها
از @victim_namespace
•نابودسازی
@victim_namespace
•ایجاد
@new_namespace با ترکیب
پارامترهای
قدیمی و
پارامترهای
جدید :: توجه
داشته
باشید که
پیامد اصلی
چرخه destroy-create این
است که
دادههای
موجود در @victim_namespace
در @new_namespace حفظ
نمیشوند.
ویژگیهای
منتقلشده
از @victim_namespace
عبارتند از
هندسه (geometry)،
حالت (mode) و نام
(نه شناسه uuid،
مگر با
تعیین --uuid=). هیچ
تلاشی برای
حفظ
دادهها
انجام
نمیشود و
هرگونه
داده قدیمی
که در @new_namespace
قابل
مشاهده
باشد صرفاً
اتفاقی است
و نه بر اساس
قاعده. تنها
روش قابل
اعتماد
برای پر
کردن @new_namespace با
دادههای
@victim_namespace،
«پشتیبانگیری
و بازیابی»
(Backup and restore) است.
-u, --uuid=
استفاده
از این
گزینه
توصیه
نمیشود
زیرا در هر
بار ایجاد
(یا
بازایجاد)
فضای نام،
باید یک uuid
جدید تولید
شود. با این
وجود، برای
سناریوهای
بازیابی
میتوان uuid را
مشخص کرد.
-n, --name=
برای
دستگاههای
NVDIMM که از
برچسبهای
فضای نام
پشتیبانی
میکنند،
یک نام
خوانا برای
فضای نام
مشخص
میکند. این
نام به
عنوان یک
مشخصه
دستگاه
برای
استفاده در
قوانین udev در
دسترس است.
-l, --sector-size
تعیین
اندازه
سکتور
منطقی
(اندازه LBA)
دستگاه
بلوکی
لینوکس
مرتبط با یک
فضای نام.
-M, --map=
یک فضای
نام pmem در
حالت «fsdax» یا
«devdax»
نیازمند
تخصیص
فراداده به
ازای هر
صفحه است.
این تخصیص
میتواند
از یکی از دو
منبع زیر
تأمین شود:
•"mem":
حافظه
معمول
سیستم (RAM)
•"dev":
حافظه
پایدار
رزروشده از
خود فضای
نام :: با توجه
به نسبت
ظرفیتهای
«Persistent Memory» به «System
RAM»، این
تخصیص
بهطور
پیشفرض با
رزرو فضا
مستقیماً
از درون
فضای نام
انجام
میشود ("--map=dev").
میزان
سربار ۶۴
بایت به
ازای هر ۴
کیلوبایت
(۱۶
گیگابایت
به ازای هر ۱
ترابایت) در
معماری x86
است.
-c, --continue
پس از
ایجاد یک
فضای نام
متوقف
نشوید؛ در
عوض تا جای
ممکن و به
صورت
حریصانه در
چارچوب
محدودیتهای
فیلتر --bus و --region
فضاهای نام
بیشتری
ایجاد کنید.
در صورت
بروز
هرگونه خطا
در
تلاشهای
ایجاد،
عملیات
متوقف
خواهد شد
مگر اینکه
گزینه --force نیز
ارائه شده
باشد.
-f, --force
مگر
اینکه این
گزینه مشخص
شود، در
صورتی که
فضای نام در
حال حاضر
فعال باشد،
عملیات reconfigure namespace
با شکست
مواجه
خواهد شد.
تعیین --force
باعث
میشود
فضای نام
پیش از تلاش
برای انجام
عملیات
غیرفعال
گردد. با این
حال، اگر
فضای نام
سوار (mount) شده
باشد،
عملیاتهای
disable namespace و reconfigure namespace
لغو خواهند
شد. فضای نام
پیش از
بازپیکربندی
باید پیاده
(unmount) شود.
هنگامی که
همراه با --continue
استفاده
شود، حلقه
ایجاد فضای
نام حتی در
صورت
مواجهه با
خطا در
فضاهای نام
میانی
ادامه
مییابد.
-L, --autolabel, --no-autolabel
دستگاههای
NVDIMM قدیمی از
برچسبهای
فضای نام
پشتیبانی
نمیکنند.
در این صورت
هسته
فضاهای
نامی به
اندازه کل
ناحیه (region-sized)
ایجاد
میکند که
قابل حذف
نیستند.
حالت آنها
قابل تغییر
است، اما
نمیتوان
اندازه
آنها را
کوچکتر از
ناحیه والد
تغییر داد.
این وضعیت
یک «فضای
نام بدون
برچسب» (label-less namespace)
نامیده
میشود. در
مقابل، NVDIMMها
و
هایپروایزرهایی
که از تعریف
ناحیه
برچسب ACPI
6.2 (بخش
6.5.10 مشخصات ACPI
6.2،
روشهای
برچسب NVDIMM)
پشتیبانی
میکنند،
از عملکرد
«فضای نام
برچسبدار»
(labelled namespace)
پشتیبانی
مینمایند.
•دو حالت
وجود دارد
که در آنها
هسته به طور
پیشفرض
روی حالت
بدون برچسب
قرار
میگیرد:
•NVDIMM از
برچسبها
پشتیبانی
نمیکند
•دستگاه
NVDIMM از
برچسبها
پشتیبانی
میکند،
اما بلوک
شاخص برچسب
(Label Index Block، به UEFI 2.7
مراجعه
کنید) وجود
ندارد.
•در حالت
دوم،
پیکربندی
میتواند
با نوشتن یک
بلوک شاخص
روی تمام
DIMMهای یک
ناحیه و
فعالسازی
مجدد آن
ناحیه، به
عملکرد
برچسبدار
ارتقا یابد.
قابلیت
autolabel
در دستور
ndctl
create-namespace --reconfig به طور
پیشفرض
سعی میکند
در صورتی که
تشخیص دهد
تمام ظرفیت DIMM
توسط فضای
نام در حال
بازپیکربندی
مورد ارجاع
قرار گرفته
است، این
کار را
انجام دهد.
در غیر این
صورت،
چنانچه
متوجه شود
یک DIMM در بیش
از یک ناحیه
مشارکت
ظرفیتی
دارد،
برچسبگذاری
خودکار
ناموفق شده
و در حالت
بدون برچسب
باقی
میماند.
این بررسی
از دست رفتن
ناخواسته
دادههای
ناحیه دیگر
که در حال
استفاده
فعال است
جلوگیری
میکند.
گزینه
--autolabel به
طور
پیشفرض
اعمال
میشود و
گزینه
--no-autolabel را
میتوان
برای
غیرفعال
کردن این
رفتار
استفاده
کرد. هنگامی
که
برچسبگذاری
خودکار با
شکست مواجه
میشود و
همچنان
عملکرد
برچسبدار
مورد نظر
است،
خطمشی
ایمنی را
میتوان با
اجرای
دستورات
زیر دور زد؛
توجه داشته
باشید که با
اجرای این
دستورات
تمامی
دادههای
موجود در
تمام
ناحیهها
از دست
خواهند رفت:
ndctl disable-region all
ndctl init-labels all
ndctl enable-region all
-R, --autorecover, --no-autorecover
به طور
پیشفرض،
چنانچه
تلاشی برای
ایجاد فضای
نام با شکست
مواجه شود،
ndctl فضای نام
ناقص
مقداردهیشده
را پاکسازی
میکند. از
--no-autorecover برای
غیرفعال
کردن این
رفتار در
سناریوهای
اشکالزدایی
و توسعه
استفاده
کنید که در
آنها حفظ
وضعیت
برچسب و info-block پس
از وقوع خطا
سودمند
است.
-v, --verbose
ارسال
پیامهای
اشکالزدایی
برای
فرایند
ایجاد فضای
نام.
-r, --region=
نام
دستگاه regionX
یا یک شماره
شناسه region.
عملیات را
به region (یا regionهای)
مشخصشده
محدود
میکند.
کلمه کلیدی
all میتواند
برای نشان
دادن عدم
وجود
هرگونه
محدودیت
تعیین شود،
هرچند این
کار معادل
عدم ارائه
گزینه --region
است.
-b, --bus=
شماره
شناسه bus یا یک
رشته
ارائهدهنده
(مانند "ACPI.NFIT").
عملیات را
به bus (یا busهای)
مشخصشده
محدود
میکند.
کلمه کلیدی
all میتواند
برای مشخص
کردن عدم
وجود
هرگونه
محدودیت
استفاده
شود، هرچند
این کار
معادل عدم
ارائه
گزینه --bus است.
حق نشر © 2016 -
2022، شرکت Intel.
مجوز GPLv2: گنو GPL
نسخه ۲
http://gnu.org/licenses/gpl.html. این
نرمافزار
آزاد است:
شما برای
تغییر و
بازتوزیع
آن آزاد
هستید.
هیچگونه
ضمانتی
وجود
ندارد، تا
حدی که
قانون
اجازه
میدهد.