PrivateTmp: قلاب فایل را نوشت، پس کجا رفت؟
یک فضای نام موقت خصوصی فایل را پنهان میکند، نه اینکه آن را حذف کند. پیش از تغییر واحد، ریشهٔ فرایند را بررسی کنید و سپس به دادههای مشترک مسیری واقعی بدهید.
قلابها موفقیت را گزارش میکنند، و همان مسیر هنوز از یک صدف خالی به نظر میرسد. هر دو گفته میتوانند همزمان درست باشند، زیرا یک سرویس systemd ممکن است در فضای نام سوارکاری خودش با یک پوشهٔ موقت خصوصی زندگی کند. وقتی این را فهمیدیم، پرسش جالب این است که آیا نوشتن اصلاً موفق شده بود.
دو پوشهٔ موقت، یک مسیر
تنظیم جداسازی به واحد دیدی خصوصی از پوشههای موقت میدهد، نه اینکه آنها را فقطخواندنی کند. فرایندهای بیرون از واحد نمیتوانند ببینند که آنجا چه مینویسد، و هر چیزی که پشت سر بگذارد هنگام توقف واحد دور ریخته میشود. بنابراین مسیری که قلاب چاپ میکند و مسیری که از صدف بررسی میشود میتوانند به اشیای متفاوتی با نام یکسان اشاره کنند.
این یک مسئلهٔ دیدپذیری است، و شبیه مسئلهٔ از دست رفتن داده به نظر میرسد. چیزی حذف نشده، چون فایل صرفاً در فضای نامی است که صدف عضوی از آن نیست. همان فرمان وقتی درون واحد اجرا میشود متفاوت رفتار میکند، و همین مشاهده معمولاً بحث را حل میکند. پیش از هر نتیجهای دربارهٔ نوشتن، تنظیمات واحد را بخوانید.
نادیدنی را از نانوشتنی جدا کنید
نوشتن موفق و بازکردن ناموفق شواهد متفاوتی تولید میکنند، و همین تفاوت تعیینکنندهٔ تعمیر است. اگر قلاب میگوید فایل ساخته شده اما خوانندهٔ بیرونی آن را پیدا نمیکند، با پرسش فضای نام روبهرو هستید. اگر قلاب خطای دسترسی یا بازکردن ناموفق را گزارش کند، فایل هرگز نوشته نشده و هیچ تغییری در فضای نام کمکی نمیکند.
systemctl show [email protected] -p PrivateTmp -p User -p Group -p RuntimeDirectory
systemctl show [email protected] -p MainPID --value
sudo ls -l /proc/PID/root/tmp/client-stateمسیر ریشهٔ فرایند دید خود سرویس به سامانهپرونده را آشکار میکند، مشروط به بررسیهای دسترسی روی آن فرایند تا وقتی هنوز در حال اجراست. ژورنال واحد را در همان نشست بخوانید، چون خطای نوشتن و فایل گمشده وقتی کسی علت را از قبل تصمیم گرفته باشد بهراحتی با هم اشتباه میشوند.
به دادههای مشترک جایگاهی صریح بدهید
دادهای که فقط سرویس به آن نیاز دارد در پوشهٔ موقت خصوصی خودش قرار میگیرد. دادهای که فرایند دیگری باید بخواند به مسیری نیاز دارد که برای هر دو تعریف شده باشد، با مالک، حالت و انقضای مشخص. پیش از ویرایش واحد تصمیم بگیرید کدامیک از این دو حالت را دارید. بیشتر این رخدادها از آنجا میآید که فایلی خصوصی مانند فایلی مشترک رفتار شود.
[Service]
RuntimeDirectory=openvpn-hook-office
RuntimeDirectoryMode=0750پوشهٔ زمان اجرا پوشه را زیر ناحیهٔ زمان اجرای سامانه قرار میدهد، آن را برای کاربر و گروه پیکربندیشدهٔ واحد میسازد و هنگام توقف واحد آن را برمیدارد. آن را از طریق یک drop-in اضافه کنید تا واحد بستهٔ نصب دستنخورده بماند، سپس مدیر را دوباره بار کنید و آن نمونه را دوباره راه بیندازید، با پذیرش اینکه کلاینتهایش دوباره وصل میشوند.
هر پوشهٔ زمان اجرایی را که واحد نصبشده از قبل لازم دارد نگه دارید. جایگزین کردن فهرست بهجای افزودن به آن روش رایجی است برای شکستن ویژگی نامرتبطی که هیچکس آن را به این تغییر ربط نمیدهد.
دو لایهٔ امتیاز میتوانند اختلاف داشته باشند
مدیر سرویس پوشه را برای کاربر پیکربندیشدهٔ واحد میسازد، در حالی که دیمن VPN میتواند پیش از اجرای قلاب اتصال جداگانه به حساب خودش پایین بیاید. اینها لایههای متفاوتی هستند و میتوانند هویتهای متفاوتی را نام ببرند.
پوشهای متعلق به root با حالتی محدودکننده برای دیمنی که از قبل از امتیازات صرفنظر کرده کاملاً دیدنی است، و با این حال برایش نانوشتنی. آنگاه خطا بهصورت مسئلهٔ دسترسی خوانده میشود، هرچند مسیر دقیقاً همانجایی است که انتظار داشتید. مالک پوشه را با هویتی که قلاب گزارش میکند مقایسه کنید. وقتی متفاوت باشند، حالت هرگز پرسش نبوده است.
پیش از تغییر مالکیت بررسی کنید قلاب واقعاً با چه هویتی اجرا میشود. تغییر کاربر اجرای سرویس برای درست کردن یک پوشه میتواند دسترسی به دستگاه و امتیازات شبکه را جای دیگری تغییر دهد، که بهایی بزرگ برای مشکلی کوچک است.
کل تحویل را بررسی کنید
چهار چیز را همزمان تأیید کنید: قلاب با هویت واقعی خود مینویسد، خوانندهٔ موردنظر میتواند فایل را مصرف کند، کاربران نامرتبط نمیتوانند، و توقف واحد همانگونه که طراحی شده پاکسازی میکند. ظاهر شدن فایلی در پوشهٔ موقت مشترک میزبان الزام نیست، و معمولاً نشانهٔ آن است که تبادل هرگز مسیر خودش را به دست نیاورده. خواننده را پس از راهاندازی دوباره آزمایش کنید، نه فقط در نخستین اجرا. رفتار پاکسازی بخشی از طراحی است، پس آن را مشاهده کنید نه اینکه فرض کنید.
وضعیت پایدار به جایی تعلق دارد که طول عمر هماهنگ داشته باشد، چون پوشهٔ زمان اجرا ساخته شده تا ناپدید شود. مکان را بر اساس طول عمر انتخاب کنید نه بر اساس راحتی. این عادت از نسخهٔ بعدی همین بررسی جلوگیری میکند.