NBD-CLIENT(8) NBD-CLIENT(8)

nbd-client - متصل شدن به سرور nbd-server(1) جهت استفاده از دستگاه بلوکی صادرشده آن

nbd-client host [ port ] nbd-device [ -connections num ] [ -sdp ] [ -swap ] [ -persist ] [ -nofork ] [ -nonetlink ] [ -systemd-mark ] [ -readonly ] [ -preinit ] [ -block-size block size ] [ -size bytes ] [ -timeout seconds ] [ -name name ] [ -certfile certfile ] [ -keyfile keyfile ] [ -cacertfile cacertfile ] [ -tlshostname hostname ] [ -priority gnutls-priority-string ]

nbd-client -unix path nbd-device [ -connections num ] [ -sdp ] [ -swap ] [ -persist ] [ -nofork ] [ -nonetlink ] [ -systemd-mark ] [ -readonly ] [ -preinit ] [ -block-size block size ] [ -size bytes ] [ -timeout seconds ] [ -name name ]

nbd-client nbd-device

nbd-client -d nbd-device

nbd-client -c nbd-device

nbd-client -l host [ port ]

nbd-client [ -netlink ] -l host

با nbd-client می‌توانید به سروری که nbd-server را اجرا می‌کند متصل شوید، و بدین ترتیب از فضای دیسک خام آن سرور به عنوان یک دستگاه بلوکی روی کلاینت محلی استفاده کنید.

برای انجام این کار، پشتیبانی هسته لینوکس در قالب دستگاه بلوکی شبکه (NBD) ضروری است. هنگامی که این قابلیت را در هسته یا به عنوان یک ماژول داشته باشید، می‌توانید به یک سرور NBD متصل شده و از فایل صادرشده آن از طریق یک فایل دستگاه ویژه بلوکی با شماره اصلی (major mode) ۴۳ استفاده نمایید.

به صورت اختیاری، گزینه‌های طولانی را می‌توان با دو خط تیره در ابتدا نیز مشخص کرد.

گزینه‌های زیر پشتیبانی می‌شوند:

استفاده از اندازه بلوک مشخص‌شده در "block size". مقدار پیش‌فرض ۵۱۲ است؛ مقادیر مجاز ۵۱۲، ۱۰۲۴، ۲۰۴۸ یا ۴۰۹۶ هستند.
استفاده از num اتصال به سرور جهت افزایش سرعت پردازش درخواست‌ها به بهای مصرف منابع بیشتر در سرور. استفاده از این گزینه نیازمند پشتیبانی هسته است که برای نخستین بار در لینوکس ۴.۹ ارائه شد.
نام میزبان یا آدرس IP دستگاهی که nbd-server را اجرا می‌کند. از نسخه ۲.۹.۱۵ به بعد، ابزارهای NBD از IPv6 نیز پشتیبانی می‌کنند.
تنظیم زمان انقضای اتصال بر حسب "seconds". برای کارکرد این گزینه، به هسته‌ای با پشتیبانی از فراخوانی ioctl مقدار NBD_SET_TIMEOUT نیاز است؛ این قابلیت در تاریخ ۲۰۰۷-۱۰-۱۱ به درخت توسعه لینوس اضافه شد و بخشی از هسته ۲.۶.۲۴ است.
درگاه TCP که nbd-server روی آن در سرور اجرا می‌شود.

شماره درگاه به طور پیش‌فرض ۱۰۸۰۹ است، که شماره درگاه اختصاص‌یافته توسط IANA برای پروتکل NBD می‌باشد.

نسخه‌های قبلی ابزارهای nbd از نسخه قدیمی‌تر پروتکل مذاکره به نام "oldstyle" پشتیبانی می‌کردند. این نسخه از پروتکل از نسخه ۳.۱۱ ابزارهای nbd دیگر پشتیبانی نمی‌شود.

فایل ویژه بلوکی (مدخل /dev) که این nbd-client باید به آن متصل شود، که به صورت یک مسیر کامل مشخص می‌شود.

هنگامی که از حالتی استفاده می‌شود که در آن هیچ نام میزبان یا نام export مشخص نشده است، nbd-client پیکربندی لازم را در فایل nbdtab جستجو می‌کند. برای اطلاعات بیشتر، nbdtab(5) را ببینید.

بررسی اینکه آیا دستگاه nbd مشخص‌شده متصل است یا خیر.

اگر دستگاه متصل باشد، nbd-client با وضعیت خروج ۰ خارج شده و شناسه فرایند (PID) نمونه‌ای از nbd-client را که آن را متصل کرده در خروجی استاندارد چاپ می‌کند.

اگر دستگاه متصل نباشد یا وجود نداشته باشد (مثلاً به این دلیل که ماژول nbd بارگذاری نشده است)، nbd-client با وضعیت خروج ۱ خارج می‌شود و چیزی در خروجی استاندارد چاپ نمی‌کند.

اگر خطایی رخ دهد، nbd-client با وضعیت خروج ۲ خارج خواهد شد و چیزی نیز در خروجی استاندارد چاپ نخواهد کرد.

قطع اتصال دستگاه nbd مشخص‌شده از سرور.
درخواست فهرست موارد صادرشده (exports) موجود از سرور. اگر سرور هم از طریق IPv6 و هم از طریق IPv4 عمل export را انجام دهد، این گزینه همه موارد را دو بار فهرست می‌کند؛ در غیر این صورت، همه را فقط یک بار فهرست خواهد کرد.

توجه داشته باشید که این گزینه تنها با فرایندهای nbd-server نسخه ۳.۱ یا بالاتر کار می‌کند و پیش از استفاده باید در پیکربندی سرور (با گزینه "allowlist") فعال شده باشد.

از نسخه ۳.۱۷ به بعد، nbd-client به طور پیش‌فرض از رابط netlink برای پیکربندی دستگاه NBD استفاده می‌کند. این گزینه امکان استفاده از رابط قدیمی‌تر ioctl() را برای پیکربندی دستگاه فراهم می‌سازد.

این گزینه تنها در صورتی در دسترس است که nbd-client در هنگام ساخت با libnl-genl کامپایل شده باشد. اگر چنین نباشد، nbd-client تنها قادر به استفاده از رابط ioctl خواهد بود (و این گزینه در دسترس نخواهد بود).

توجه داشته باشید که نسخه‌های آینده nbd-client استفاده از netlink را اجباری خواهند کرد، اما هنوز زمان اعمال آن تعیین نشده است.

این گزینه در نسخه ۳.۲۷ اضافه شد و به nbd-client دستور می‌دهد تا شناسه netlink را تنظیم کند (نیازمند هسته ۵.۱۴ یا جدیدتر است)، که بعداً می‌توان آن را در /sys/block/nbdN/backend مشاهده کرد. این کار مانع از آن می‌شود که هر فرایندی با استفاده از netlink دستگاه را به طور نامحسوس به یک بک‌اند دیگر بازپیکربندی کند، و نوشتن کد هم‌توان (idempotent) را که در حضور تداخل‌های هم‌زمانی پیکربندی ایمن باشد آسان‌تر می‌سازد.

این گزینه تنها در صورتی در دسترس است که nbd-client با libnl-genl کامپایل شده باشد. اگر چنین نباشد، nbd-client تنها قادر به استفاده از رابط ioctl خواهد بود (و این گزینه در دسترس نخواهد بود).

توجه داشته باشید که نسخه‌های آینده nbd-client استفاده از netlink را اجباری خواهند کرد، اما هنوز مشخص نیست این امر چه زمانی اتفاق می‌افتد.

هنگامی که این گزینه مشخص شود، چنانچه اتصال به دلیل قطعی سرور یا موارد مشابه به طور غیرمنتظره قطع شود، nbd-client بلافاصله سعی می‌کند دستگاه nbd را دوباره متصل نماید.
هنگامی که این گزینه مشخص شود، nbd-client از مذاکره معمول با سرور صرف‌نظر کرده و بلافاصله پس از برقراری اتصال، سوکت را به هسته تحویل می‌دهد. تنها هنگام اتصال به سرورهای اختصاصی NBD که مشخصاً برای این منظور طراحی شده‌اند از این گزینه استفاده کنید. این کار نیازمند تعیین اندازه دستگاه با گزینه -B است و از TLS پشتیبانی نمی‌کند.
هنگامی که این گزینه مشخص شود، nbd-client به هسته اعلام می‌کند که دستگاه را به عنوان فقط-خواندنی در نظر بگیرد، حتی اگر سرور اجازه نوشتن را بدهد.
تحمیل اندازه دستگاه به تعداد بایت‌های مشخص‌شده، به جای استفاده از مقدار به‌دست‌آمده از مذاکره با سرور. مقدار باید مضربی از اندازه بلوک باشد. در صورت استفاده از preinit (-P) برای صرف‌نظر از مذاکره، این گزینه الزامی است.
اتصال به سرور با استفاده از پروتکل سوکت مستقیم (SDP)، به جای IP. برای جزئیات به nbd-server(5) مراجعه کنید.
مشخص می‌کند که این دستگاه NBD به عنوان فضای swap استفاده خواهد شد. این گزینه با اجرای mlockall() و تنظیم امتیاز oom-killer در زمان مناسب، سعی در جلوگیری از بن‌بست‌ها (deadlocks) دارد. با این حال، تضمین نمی‌کند که بتوان به طور کامل از بروز چنین بن‌بست‌هایی جلوگیری کرد.
سیستم راه‌انداز systemd ایجاب می‌کند فرایندهایی که نباید هنگام خاموش شدن سیستم متوقف شوند، با جایگزینی حرف نخست argv[0] خود با نویسه '@' علامت‌گذاری شوند.

این گزینه باعث می‌شود nbd-client این کار را انجام دهد.

توجه داشته باشید که این قابلیت تنها در صورتی عمل می‌کند که nbd-client از درون یک initrd اجرا شود؛ یعنی اگر از یک فایل واحد systemd یا از خط فرمان اجرا شود، systemd این علامت‌گذاری را نادیده خواهد گرفت.

مشخص می‌کند که کلاینت NBD نباید جدا شده و به صورت دیمن در پس‌زمینه درآید. این گزینه عمدتاً برای اشکال‌زدایی کاربرد دارد.

توجه داشته باشید که nbd-client همچنان یک بار فرایند جدیدی ایجاد می‌کند (fork) تا به‌روزرسانی جدول پارتیشن گره دستگاه را فعال نماید. غیرفعال کردن این رفتار ممکن نیست.

غیرفعال کردن استفاده از پیام پروتکل NBD_OPT_GO و اجبار به استفاده از NBD_OPT_EXPORT_NAME به جای آن.

پروتکل NBD دارای دو فاز است: فاز مذاکره و فاز انتقال. برای رفتن از فاز مذاکره به فاز انتقال، کلاینت‌های قدیمی‌تر پیام NBD_OPT_EXPORT_NAME را ارسال می‌کردند که در صورت عدم وجود نام export (یا عدم دسترسی کافی کلاینت)، سرور قادر به تولید پیام خطا نبود. به دلیل این محدودیت‌ها، پیام جایگزین NBD_OPT_GO ایجاد شد که به سرور اجازه می‌دهد در صورت بروز هر مشکلی با پیام خطا پاسخ دهد.

پروتکل به سرور اجازه می‌دهد پیامی را که متوجه نمی‌شود نادیده بگیرد؛ با این حال، متأسفانه برخی پیاده‌سازی‌ها (از جمله نسخه‌های قدیمی‌تر nbd-server) این وضعیت را به درستی مدیریت نکرده و با دریافت پیامی ناشناخته، هماهنگی آن‌ها با کلاینت مختل می‌شد.

هنگام ارسال NBD_OPT_GO، ابزار nbd-client تلاش می‌کند رفتار صحیح را در پیش گرفته و در صورت لزوم به NBD_OPT_EXPORT_NAME بازگردد. اما اگر سرور دچار باگ ذکرشده باشد، این روش عمل نمی‌کند. در چنین موقعیتی، کلاینت پیامی تشخیصی صادر کرده و استفاده از این گزینه را پیشنهاد می‌دهد.

توجه داشته باشید که گزینه متناظری برای nbdtab نیز وجود دارد.

نام export مورد نظر برای استفاده را مشخص می‌کند. در صورت عدم تعیین، nbd-client در صورت وجود، درخواست یک export "پیش‌فرض" را از سرور خواهد کرد.
اتصال به سرور از طریق سوکت دامنه یونیکس در path به جای اتصال به سرور از طریق سوکت TCP. سرور باید روی سوکت مشخص‌شده در حال شنود باشد.
استفاده از فایل مشخص‌شده به عنوان گواهی کلاینت جهت احراز هویت TLS در سرور.
استفاده از فایل مشخص‌شده به عنوان کلید خصوصی گواهی کلاینت.
استفاده از فایل مشخص‌شده به عنوان گواهی CA جهت احراز هویت TLS در سرور.
استفاده از نام میزبان مشخص‌شده برای زمینه TLS. در صورت عدم تعیین، از نام میزبان به کار رفته برای اتصال به سرور استفاده خواهد شد.
ارسال رشته اولویت مشخص‌شده به GnuTLS. از این گزینه می‌توان برای پیکربندی اتصال TLS استفاده کرد؛ برای جزئیات به مستندات GnuTLS مراجعه کنید.

مقدار پیش‌فرض این گزینه NORMAL:-VERS-TLS-ALL:+VERS-TLS1.2 است.

فعال‌سازی هر یک از گزینه‌های مرتبط با TLS باعث می‌شود کلاینت از دستور NBD_OPT_STARTTLS برای ارتقای اتصال به TLS استفاده کند. از آنجا که مذاکره برای پشتیبانی از TLS از فضای کاربری برای یک سوکت هسته بسیار پیچیده خواهد بود (اگر اصلاً ارسال کلیدها به فضای هسته ممکن باشد، که نیست)، روش پیاده‌سازی بدین صورت است که فرایند nbd-client یک جفت‌سوکت (socketpair) ایجاد می‌کند؛ یک سمت آن را به هسته تحویل می‌دهد و سمت دیگر را به یک پراکسی رمزگذاری/رمزگشایی می‌سپارد. نتیجه این است که کلیه ارتباطات پیش از ارسال روی بستر شبکه رمزگذاری می‌شوند؛ با این وجود، انجام این کار در ترکیب با swap روی دستگاه NBD ایمن نیست:

به منظور آزادسازی حافظه از طریق swap، هسته باید مطمئن شود که عمل نوشتن در دستگاه nbd نهایی شده است. برای این منظور، هسته باید بتواند پاسخ NBD_CMD_WRITE را دریافت کند که نشان‌دهنده تکمیل موفقیت‌آمیز نوشتن و امکان آزادسازی حافظه است. اما دریافت داده‌ها از شبکه مستلزم این است که هسته ابتدا حافظه تخصیص دهد، که اگر با کمبود حافظه مواجه باشیم (وضعیتی معمول هنگام تلاش برای swap) این امر ناممکن است. این حالت در صورت کمبود حافظه و حجم بالای ترافیک شبکه، احتمالاً موجب بروز بن‌بست (deadlock) خواهد شد.

برای برطرف کردن این مشکل، هسته گزینه PF_MEMALLOC را روی سوکت nbd تنظیم می‌کند؛ هنگام کمبود حافظه، هسته تمام بسته‌ها را به جز بسته‌هایی که مقصد آن‌ها سوکتی با این گزینه فعال است دور می‌اندازد، و به سازوکار ارسال مجدد معمول TCP متکی می‌شود تا داده‌ها از بین نروند. این کار از بن‌بست توصیف‌شده در بالا جلوگیری می‌کند.

با این حال، گزینه PF_MEMALLOC روی سوکتی تنظیم می‌شود که به دستگاه nbd متصل است، نه روی سوکت رمزگذاری‌شده‌ای که به پراکسی رمزگذاری/رمزگشایی متصل است. بنابراین، در زمان استفاده از TLS، گزینه PF_MEMALLOC روی سوکتی که در عمل داده‌ها را از شبکه دریافت می‌کند تنظیم نشده و در نتیجه بن‌بست مجدداً رخ خواهد داد.

به همین دلیل، چنانچه در زمان استفاده از TLS گزینه -swap به کار رود، nbd-client یک هشدار مناسب صادر خواهد کرد.

چند مثال از نحوه استفاده از nbd-client:

•
برای اتصال به سروری که روی پورت ۲۰۰۰ در میزبان "server.domain.com" در حال اجرا است، با استفاده از فایل ویژه بلوکی کلاینت "/dev/nbd0":
nbd-client server.domain.com 2000 /dev/nbd0
•
برای اتصال به سروری که روی پورت ۲۰۰۱ در میزبان "swapserver.domain.com" در حال اجرا است، با استفاده از فایل ویژه بلوکی کلاینت "/dev/nbd1"، برای مقاصد swap:
nbd-client swapserver.domain.com 2001 /dev/nbd1 -swap
•
برای قطع اتصال فوق (پس از اطمینان از اینکه فایل ویژه بلوکی دیگر مورد استفاده نیست):
nbd-client -d /dev/nbd1

nbd-server(1), nbdtab(5)

ماژول هسته NBD و ابزارهای NBD توسط Pavel Machek (pavel@ucw.cz) نوشته شده‌اند.

ماژول هسته اکنون توسط Paul Clements (Paul.Clements@steeleye.com) نگهداری می‌شود، در حالی که ابزارهای فضای کاربری توسط Wouter Verhelst (wouter@debian.org) نگهداری می‌شوند.

این صفحه راهنما توسط Wouter Verhelst (<wouter@debian.org>) برای سیستم گنو/لینوکس دبیان نوشته شده است (اما ممکن است توسط دیگران نیز استفاده شود). اجازه کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز عمومی همگانی گنو (GPL)، نسخه ۲، منتشرشده توسط بنیاد نرم‌افزار آزاد اعطا می‌شود.

$Date$