Squid shm_open: دسترسی رد شد — مالکیت حافظهٔ مشترک را بررسی کنید
خطاهای مالکیت حافظهٔ مشترک Squid را از خطاهای مجوز PID، گزارش و پوشهٔ حافظهٔ نهان جدا کنید.
Could not read pid file و shm_open(...): Permission denied میتوانند در یک راهاندازی ناموفق Squid ظاهر شوند. آنها به منابع متفاوتی اشاره میکنند. اصلاح مالکیت پوشهٔ حافظهٔ نهان بهخودیخود هیچیک را درست نمیکند.
در لینوکس، شیء حافظهٔ مشترک POSIX معمولاً زیر /dev/shm نمایش داده میشود. مالک و حالت دسترسی آن مهم است. بنابراین شیئی که هویت اجرای دیگری بر جای گذاشته میتواند موجب شکست فرایند بعدی شود، حتی وقتی squid.conf خواندنی است و درگاه شنود آزاد است.
بازسازی کنید که این نمونه چگونه آغاز شد
راهاندازی معمول سرویس را با هر راهاندازی دستی که در عیبیابی به کار رفته مقایسه کنید. فرایندی که دستی آغاز شده و سرویس بستهبندیشده ممکن است کاربران، مسیرها یا پروندههای پیکربندی متفاوتی داشته باشند. پیش از آنکه شیئی را کهنه بدانید، روشن کنید که آیا نمونهٔ دیگری از Squid هنوز در حال اجراست.
سپس عملیات دقیقی را که شکست خورده بخوانید. خطای PID به مکان پیکربندیشدهٔ PID و پوشهٔ والد آن مربوط است. خطای گزارش به پرونده یا پوشهٔ گزارش مربوط است. خطای راهاندازی حافظهٔ نهان به فضای ذخیرهسازی مربوط است. خطای shm_open به شیء نامدار حافظهٔ مشترک مربوط است و ممکن است سیاست امنیتی اعمالشده بر فرایند را نیز دربرگیرد.
برای هر منبع، دسترسی لازم در زمان اجرا را با مالک و حالت کنونی آن مقایسه کنید. اگر مجوزهای معمولی کافی به نظر میرسند، شواهد رد دسترسی مربوط در SELinux یا AppArmor را بررسی کنید. عبارت “Permission denied” بهتنهایی نشان نمیدهد کدام لایه دسترسی را رد کرده است.
مالکیت را بدون ایجاد مشکل دوم اصلاح کنید
حساب اجرا را با پیکربندی سرویسِ نصب همساز نگه دارید. تبدیل همهچیز به nobody میتواند دسترسی برنامههای کمکی را بشکند و ناسازگاری تازهای با پروندههای مدیریتشدهٔ سرویس پدید آورد.
پاک کردن همهٔ شیءهای شبیه Squid در /dev/shm نیز نخستین گام خوبی نیست. یک شیء نامدار میتواند به نمونهای فعال تعلق داشته باشد. پاکسازی، در صورت نیاز، باید منبعی رهاشده و تأییدشده را نشانه بگیرد، با سرویس آسیبدیدهٔ متوقف، و سپس راهاندازی از طریق سازوکار معمول سرویس انجام شود.
نتیجهٔ سودمند، الگویی همساز از راهاندازی و مالکیت است. اجرای یک فرمان با کاربر root تا زمانی که خطا ناپدید شود میتواند راهاندازی مجدد عادی بعدی را با همان مشکل رها کند.