Sysctl کیست؟ توضیح بده.
sysctl رابطی در سیستم‌عامل‌های لینوکس و بی‌اس‌دی است که به کمک آن می‌توان پارامترهای سیستم را بررسی کرد یا آنها را به شکل پویا تغییر داد. مکانیسم پیاده‌سازی این رابط در این دو سیستم بسیار متفاوت است.در بی‌اس‌دی، این پارامترها معمولاً اشیائی در یک پایگاه مدیریت اطلاعات (MIB) هستند که توصیف‌کنندهٔ محدودیت‌های تنظیم‌پذیری از قبیل اندازه حافظه اشتراکی، تعداد ریسه‌های سیستم‌عامل که به عنوان کلاینت ان‌اف‌اس استفاده می‌شوند، تعداد کل فرایندها در سیستم، فعال‌سازی یا غیرفعال‌سازی IP forwarding، تنظیم محدودیت‌های امنیتی بر روی کاربر ریشه (سکیورلول)، یا خروجی‌های مربوط به اشکال‌زدایی است.در بی‌اس‌دی، چند روش برای تغییر دادن این پارامترها وجود دارد. برنامه‌ها می‌توانند به کمک فراخوان‌های سیستمی یا پوشاننده فراخوان سیستمی این پارامترها را تغییر دهند، همچنین یک دستور مدیریتی خاص برای تغییر دادن این پارامترها وجود دارد که مدیر سیستم می‌تواند با استفاده از آن اقدام به تغییر دادن این پارامترها نماید. همچنین یک فایل پیکربندی در مسیر /etc/sysctl.conf هم در سیستم گنجانده شده تا امکان تغییر دادن این پارامترها در همگام بوت شدن و بالا آمدن سیستم فراهم شود. (پس از راه‌اندازی مجدد سیستم پارامترهای تغییر کرده به حالت اولیه خود برمی‌گردند و ماندگار نیستند)این قابلیت در ۴٫۴بی‌اس‌دی ظاهر شد. مزیت این رابط نسبت به hardcode کردن پارامتر در سیستم این است که بدون نیاز به کامپایل مجدد هسته سیستم‌عامل، می‌توان پارامترهای آن را به شکل پویا تغییر داد. در حالتی که پارامترها به شکل ثابت در هسته hardcode می‌شوند، برای تغییر دادن آنها نیاز به کامپایل مجدد هسته سیستم است که عملی وقت‌گر محسوب می‌شود.در لینوکس، رابط sysctl از طریق سیستم‌فایل procfs و تحت دایرکتوری /proc/sys هم در دسترس است (که البته با /sys متفاوت است و نباید آنها را با هم اشتباه گرفت). (در بی‌اس‌دی معمولاً از سیستم‌فایل procfs استفاده نمی‌شود و غیرفعال است) این تفاوت‌هایی که بین لینوکس و بی‌اس‌دی وجود دارد به این معنی است که برای بررسی کردن مقادیر این پارامترها در لینوکس، احتیاج است تا فایل مورد نظر در یک سیستم فایل مجازی باز شود، محتوای آن خوانده شود، سپس محتوای خوانده شده باید تجزیه شود و در نهایت فایل بسته شود. فراخوان سیستمی sysctl() در لینوکس وجود دارد، اما یک تابع پوشا برای این فراخوان سیستمی در کتابخانه سی گنو وجود ندارد و استفاده از آن پیشنهاد نمی‌شود.در بی‌اس‌دی، همان‌طور که در صفحه راهنمای sysctl(3) تشریح شده، فراخوان سیستمی sysctl() مستقیماً در هسته سیستم‌عامل پیاده‌سازی شده است. در لینوکس، فراخوان سیستمی sysctl()، به صورت یک پوشاننده برای رویه‌های سیستم‌فایل که برای دسترسی به محتویات دایرکتوری /proc استفاده می‌شوند، نوشته شده است. به عبارت دیگر، این فراخوان سیستمی در لینوکس، در حقیقت فایل‌های موجود در شاخه /proc/sys را باز کرده، محتوای آنها را تغییر می‌دهد و سپس فایل را می‌بندد. تأثیر این کار را به راحتی می‌توان در هنگام استفاده از ابزارهای نظارت بر سیستم مشاهده کرد. برای مثال، در لینوکس، اجرای برنامه top و سپس فشردن و نگه‌داشتن کلید space به منظور تازه کردن لحظه به لحظه اطلاعات، باعث می‌شود تا زمان زیادی از پردازنده استفاده شود. در سیستم‌های بی‌اس‌دی اینگونه نیست. البته در لینوکس از فراخوان سیستمی sysctl() به ندرت به چنین شکلی استفاده می‌شود و این مسئله یک نگرانی مهم محسوب نمی‌شود.مثال.با فعال کردن IP forwarding، سیستم به صورت یک مسیریاب عمل می‌کند و بسته‌های شبکه می‌توانند در بین کارت‌های شبکه سیستم جابجا شوند و پیمایش کنند. در بی‌اس‌دی، این قابلیت با ۱ کردن پارامتر net.inet.ip.forwarding فعال می‌شود. نام این پارامتر در لینوکس net.ipv4.ip_forward است. در بیشتر سیستم‌ها، استفاده از دستور sysctl -w parameter=۱ باعث می‌شود تا تنظیمات تا راه‌اندازی مجدد سیستم حفظ شوند. اگر بخواهیم این پارامتر همیشه در همگام بوت شدن سیستم فعال شود، باید چیزی مانند parameter=۱ را به فایل /etc/sysctl.conf اضافه کنیم. به علاوه، برخی از پارامترها به صورت فقط-خواندنی هستند و نمی‌توان آنها را تغییر داد. تنها راه تغییر دادن اینگونه پارامترها این است که آنها را به فایل /boot/loader.conf اضافه کنیم یا اینکه آنها را به شکل ثابت در هسته فعال کنیم (این کار با کامپایل مجدد هسته امکان‌پذیر است)