ESC را فشار دهید تا بسته شود

رفع خطای status=217/USER در systemd؛ عیب‌یابی User=، Group= و NSS

فهرست

خطای status=217/USER در systemd یعنی آماده‌سازی هویت کاربری سرویس پیش از اجرای برنامه شکست خورده است. ابتدا با systemctl status و journalctl پیام دقیق را ببینید؛ سپس مقدار User=، Group=، وضعیت حساب در NSS و تنظیمات DynamicUser= و PrivateUsers= را بررسی کنید. صرفاً افزایش تعداد Restart یا اجرای سرویس با root راه‌حل امنی نیست.

کد 217/USER چه تفاوتی با خطاهای دیگر دارد؟

در مستند رسمی systemd.exec، کد ۲۱۷ با نام EXIT_USER ثبت شده و به شکست تعیین/تغییر اطلاعات کاربری یا راه‌اندازی User Namespace اشاره دارد. بنابراین این کد لزوماً به معنای خرابی فایل اجرایی یا مشکل دسترسی به فایل‌های برنامه نیست. برای نمونه، 203/EXEC مربوط به اجرای خود برنامه است؛ اگر آن کد را می‌بینید، راهنمای عیب‌یابی status=203/EXEC در systemd مسیر دقیق‌تری دارد.

اگر پس از چند تلاش خطای start-limit-hit هم دیده می‌شود، آن پیام معمولاً نتیجه تلاش‌های مکرر ناموفق است، نه علت اولیه؛ پس از اصلاح هویت کاربر می‌توانید از مراحل رفع خطای start request repeated too quickly برای پاک‌کردن وضعیت شکست استفاده کنید.

پیش‌نیازها و نکات ایمنی

این مراحل برای سرویس‌های systemd در Linux روی VPS یا سرور اختصاصی با دسترسی مدیریتی نوشته شده‌اند. به‌جای example.service نام Unit واقعی را قرار دهید. پیش از تغییر Unit، خروجی systemctl cat را بررسی و از فایل‌های تنظیمات مرتبط نسخه پشتیبان بگیرید؛ ممکن است متغیرهای محیطی حساس در Unit وجود داشته باشند، پس آن‌ها را در تیکت یا خروجی عمومی منتشر نکنید. بدون بررسی DynamicUser کاربر جدید نسازید و سرویس را با User=root راه نیندازید.

گام اول: تأیید خطا در Status و Journal

sudo systemctl status example.service --no-pager -l
sudo journalctl -u example.service -b -n 80 --no-pager

در خروجی به عبارت‌هایی مانند status=217/USER، Failed at step USER یا پیام خطای شناسایی کاربر دقت کنید. اگر به‌جای ۲۱۷، کد دیگری می‌بینید، پیش از هر تغییری همان کد را دنبال کنید. نمونه خروجی:

example.service: Failed at step USER spawning /usr/local/bin/example: No such process
example.service: Main process exited, code=exited, status=217/USER

عبارت پایانی سیستم ممکن است بسته به توزیع، نسخه systemd و علت اصلی متفاوت باشد؛ تنها به متن «No such process» برای نتیجه‌گیری درباره وجود یا نبود کاربر تکیه نکنید.

گام دوم: مقدار User، Group و تنظیمات Unit را بخوانید

sudo systemctl cat example.service
systemctl show example.service -p User -p Group -p DynamicUser -p PrivateUsers -p FragmentPath -p DropInPaths

در خروجی systemctl cat، فایل اصلی و همه Drop-inها را می‌بینید. تنظیمی که در Drop-in مؤثرتر قرار دارد می‌تواند مقدار Unit اصلی را تغییر دهد. نمونه:

User=appsvc
Group=appsvc
DynamicUser=no
PrivateUsers=no

اگر User= به حسابی اشاره می‌کند که در NSS Resolve نمی‌شود، این علت مهمی برای 217/USER است. خطای گروه معمولاً با کد جداگانه 216/GROUP دیده می‌شود؛ بااین‌حال Group= را هم برای کامل‌بودن بررسی کنید. اگر DynamicUser=yes است، نبود کاربر ثابت در /etc/passwd به‌تنهایی خطا نیست؛ systemd می‌تواند حساب موقت مدیریت کند. در این حالت سراغ بررسی User Namespace و خطاهای مربوط بروید.

گام سوم: حساب سرویس و NSS را بررسی کنید

getent passwd appsvc
id appsvc
getent group appsvc
grep -E '^(passwd|group):' /etc/nsswitch.conf

نام appsvc صرفاً مثال است و در فرمان‌های مربوط به کاربر باید با User= و در فرمان getent group با نام گروه واقعی Group= جایگزین شود. در سرویس با حساب ثابت, getent passwd باید رکورد معتبر برگرداند. اگر کاربر از LDAP/SSSD یا منبع هویت شبکه‌ای می‌آید، ممکن است سرویس نام کاربری را در زمان راه‌اندازی Resolve نکند؛ در این صورت وضعیت سرویس هویت و اتصال آن را بررسی کنید، نه اینکه یک حساب محلی هم‌نام بسازید.

برای محیطی که واقعاً SSSD دارد، پس از تأیید استفاده از آن در nsswitch.conf، می‌توانید systemctl status sssd و journalctl -u sssd -b را بررسی کنید. وجود نداشتن SSSD در سروری که فقط حساب محلی دارد، خودِ مشکل نیست.

گام چهارم: راه‌حل مناسب را بر اساس علت انتخاب کنید

۱. نام کاربر یا گروه در Unit اشتباه است

اگر حساب صحیح از قبل وجود دارد، مقدار اشتباه را در Drop-in اختصاصی همین سرویس اصلاح کنید. با دستور زیر ویرایشگر systemd باز می‌شود:

sudo systemctl edit example.service

محتوای نمونه فقط در صورتی معتبر است که حساب و گروه appsvc از قبل با getent تأیید شده باشند:

[Service]
User=appsvc
Group=appsvc

تغییر User= می‌تواند دسترسی سرویس به فایل‌ها، Socketها و مسیرهای داده را تغییر دهد. پیش از Restart، مالکیت و مجوز مسیرهای موردنیاز برنامه را بررسی کنید؛ برای رفع خطای ۲۱۷ به‌صورت کورکورانه chmod 777 نزنید.

۲. حساب ثابت واقعاً حذف شده است

اگر مستندات برنامه صریحاً به یک حساب سیستمی ثابت نیاز دارند، پس از اطمینان از اینکه DynamicUser=no است و نام با حساب شبکه‌ای تداخل ندارد، می‌توانید آن حساب را با روش استاندارد توزیع ایجاد کنید. مثال زیر برای سیستم‌های دارای ابزار useradd است و فقط با نام صحیح و پس از بررسی اجرا می‌شود:

sudo useradd --system --user-group --no-create-home --shell /usr/sbin/nologin appsvc
getent passwd appsvc
getent group appsvc

اگر گروه باید از قبل موجود باشد یا سرویس به UID/GID مشخصی نیاز دارد، این مثال را اجرا نکنید؛ ابتدا UID/GID مورد انتظار را از پشتیبان، مستندات برنامه یا پیکربندی قبلی بازیابی کنید. ایجاد حساب با UID متفاوت می‌تواند دسترسی به فایل‌های موجود را خراب کند.

۳. DynamicUser یا PrivateUsers درگیر است

در حالت DynamicUser=yes حساب می‌تواند هنگام اجرای Unit ساخته شود و با توقف آن از بین برود. PrivateUsers=yes نیز به User Namespace وابسته است. اگر Journal از شکست User Namespace یا محدودیت‌های امنیتی Kernel/Container خبر می‌دهد، محدودیت‌های میزبان، نسخه systemd و سیاست‌های کانتینر را بررسی کنید. خاموش‌کردن این گزینه‌ها یا برداشتن Sandboxing بدون ارزیابی امنیتی راه‌حل پیش‌فرض نیست.

گام پنجم: بررسی صحت Unit و تأیید رفع مشکل

unit_path=$(systemctl show example.service -p FragmentPath --value)
sudo systemd-analyze verify "$unit_path"
sudo systemctl daemon-reload
sudo systemctl reset-failed example.service
sudo systemctl restart example.service
systemctl is-active example.service
sudo systemctl status example.service --no-pager -l
sudo journalctl -u example.service -b -n 30 --no-pager

خروجی مطلوب systemctl is-active برای یک سرویس ماندگار معمولاً active است و دیگر نباید رویداد جدید 217/USER ثبت شود. برای سرویس‌های Type=oneshot، وضعیت inactive (dead) پس از اجرای موفق می‌تواند طبیعی باشد؛ در این حالت Result=success و لاگ اجرای واقعی را بررسی کنید. systemd-analyze verify همه مشکلات runtime یا NSS را تشخیص نمی‌دهد.

اگر سرویس روی VPS اجرا می‌شود، چه چیزهایی به زیرساخت مربوط‌اند؟

در VPS خودمدیریت، امکان بررسی Unit، NSS، لاگ‌های بوت و دسترسی مدیریتی برای تشخیص خطای ۲۱۷ اهمیت دارد. هنگام انتخاب یا جابه‌جایی زیرساخت می‌توانید پلن‌های سرور مجازی وان‌سرور را از نظر منابع و نوع دسترسی موردنیاز مقایسه کنید؛ اما تغییر یا خرید VPS به‌تنهایی حساب اشتباه User=، اختلال NSS یا محدودیت User Namespace سرور فعلی را اصلاح نمی‌کند. پیش از هر مهاجرت، تنظیمات و مالکیت فایل‌های سرویس باید بررسی شوند.

Rollback: اگر تغییر Unit نتیجه نداد

اگر فقط با systemctl edit مقدار User/Group را عوض کرده‌اید، همان Drop-in را دوباره باز کنید و فقط تغییرهای همین نوبت را به مقدار قبلی برگردانید. از systemctl revert بدون بررسی استفاده نکنید، چون می‌تواند Drop-inهای دیگر را نیز حذف کند. پس از بازگردانی:

sudo systemctl daemon-reload
sudo systemctl restart example.service
sudo systemctl status example.service --no-pager -l

اگر حساب جدید ساخته‌اید، آن را صرفاً به دلیل حل‌نشدن مشکل حذف نکنید؛ ابتدا بررسی کنید مالک فایل‌ها یا وابستگی سرویس دیگری نشده باشد. برای آشنایی با ترتیب Unitها و مدیریت وضعیت سرویس، مطلب آشنایی با مدیریت سرویس‌ها در systemd را ببینید.

جمع‌بندی تشخیص

برای 217/USER، ابتدا خروجی واقعی Journal را ملاک قرار دهید؛ سپس User= و Group=، دسترس‌پذیری هویت در NSS و در نهایت DynamicUser/PrivateUsers را بررسی کنید. فقط علت تأییدشده را اصلاح کنید و با Restart کنترل‌شده و لاگ جدید نتیجه را بسنجید. این مسیر از تغییر مجوزهای گسترده، اجرای سرویس با root و دستکاری بی‌دلیل Restart Policy ایمن‌تر است.

5/5 - (1 امتیاز)
اشتراک گذاری نوشته در:

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *