وبلاگ نت‌آرامآموزش، تجربه و راهکارهای زیرساخت

خطای held broken packages در اوبونتو؛ چطور وابستگی بسته‌ها را امن درست کنیم؟

راهنمای خواندن خطای وابستگی apt، بررسی hold و نسخه مخزن، شبیه‌سازی تعمیر و نصب امن بسته بدون حذف عجولانه سرویس‌های سرور.

انتشار:
توسط تیم فنی نت‌آرام
۸ دقیقه زمان مطالعه
۰ دیدگاه
محتوای تخصصی، ساده و کاربردی
هماهنگ با هویت حرفه‌ای نت‌آرام
بازگشت به لیست مقالات
تصویر شاخص مقاله خطای held broken packages در اوبونتو؛ چطور وابستگی بسته‌ها را امن درست کنیم؟ در وبلاگ نت‌آرام
محتوای آموزشی وبلاگ نت‌آرام
می‌خواهید روی اوبونتو برنامه‌ای نصب کنید، اما بعد از چند خط نوشته انگلیسی پیام Unable to correct problems, you have held broken packages را می‌بینید. این پیام به زبان ساده یعنی APT نتوانسته ترکیبی از نسخه‌های بسته‌ها را پیدا کند که با هم سازگار باشند. برخلاف ظاهر جمله، همیشه به این معنا نیست که حتماً بسته‌ای را دستی روی حالت hold گذاشته‌اید.
در این راهنما از متن خطا شروع می‌کنیم، بسته و نسخه ناسازگار را پیدا می‌کنیم و قبل از هر تعمیر، نتیجه پیشنهادی APT را بدون اعمال تغییر می‌بینیم. مثال‌ها برای اوبونتوی مبتنی بر APT هستند؛ روی AlmaLinux یا سیستم‌هایی که از dnf استفاده می‌کنند اجرا نکنید.

قبل از شروع: دسترسی و نسخه پشتیبان

دستورها را در ترمینال خود سرور اجرا کنید؛ مثلاً پس از اتصال SSH به سرور مجازی. برای فرمان‌های دارای sudo، کاربر باید مجوز مدیریتی داشته باشد. اگر این یک سرور تولیدی است، پیش از تغییر بسته‌های مربوط به وب، پایگاه داده یا SSH، نسخه پشتیبان قابل بازیابی و دسترسی جایگزین به کنسول سرور داشته باشید. به‌روزرسانی بسته ممکن است سرویس را برای مدت کوتاهی راه‌اندازی مجدد کند.
اگر اکنون پیغام قفل APT یا dpkg می‌بینید، مسئله با این خطا فرق دارد. فایل قفل را حذف نکنید؛ ابتدا راهنمای قفل apt و dpkg را بخوانید. همچنین اگر مخزن خطای امضای NO_PUBKEY دارد، نباید بررسی امضا را خاموش کرد؛ راهنمای رفع NO_PUBKEY برای آن نوشته شده است.

قدم اول: خط‌های قبل از پیام آخر را بخوانید

خروجی دستور ناموفق را از همان خط اول نگه دارید. بالای پیام آخر معمولاً عبارتی مانند این وجود دارد:
کد / دستورpackage-a : Depends: package-b (= 1.2) but 1.3 is to be installed
در این مثال فرضی، package-a به نسخه دقیق 1.2 از package-b نیاز دارد، اما APT می‌خواهد نسخه 1.3 را نصب کند. اسم و شماره نسخه روی سرور شما متفاوت است. لازم نیست نام‌های مثال را نصب کنید؛ نام بسته واقعی را از خروجی خودتان بردارید.
گاهی پیام می‌گوید بسته موردنیاز «قابل نصب نیست» یا «نامزدی برای نصب ندارد». این حالت می‌تواند به مخزن غیرفعال، فهرست قدیمی بسته‌ها، نسخه متفاوت اوبونتو یا مخزن شخص ثالث مربوط باشد. اگر چند خط Depends وجود دارد، از اولین وابستگی مشکل‌دار شروع کنید و کل خروجی را نگه دارید. متن را پیش از فرستادن برای دیگران از نشانی‌های خصوصی، نام کاربری یا توکن پاک کنید.

قدم دوم: فهرست مخزن‌ها را تازه و خطا را جدا کنید

در ترمینال سرور اجرا کنید:
کد / دستورsudo apt-get update
این فرمان فهرست نسخه‌های موجود در مخزن‌های تنظیم‌شده را تازه می‌کند؛ به‌خودی‌خود برنامه‌های نصب‌شده را به نسخه جدید ارتقا نمی‌دهد. در خروجی، Err یا پیام خطا را پیدا کنید. اگر مخزن قابل دسترسی نیست یا امضای آن تأیید نشده، اول همان مشکل را رفع کنید و سپس دوباره فرمان را اجرا کنید. دریافت چند خط موفق در کنار خطای یک مخزن، به معنی سالم بودن همه مخزن‌ها نیست.
بعد این فرمان را بزنید:
کد / دستورsudo apt-get check
این فرمان وضعیت وابستگی‌ها را بررسی می‌کند. اگر نام بسته یا وابستگی مشکل‌دار نشان داده شد، آن را یادداشت کنید. اگر خطایی نمایش داده نشد ولی نصب برنامه خاصی همچنان شکست خورد، ممکن است وضعیت بسته‌های نصب‌شده سالم باشد اما نسخه درخواستی همان برنامه با نسخه‌های موجود سازگار نباشد.
برای دیدن نسخه اوبونتو نیز می‌توانید این فرمان فقط‌خواندنی را اجرا کنید:
کد / دستورcat /etc/os-release
در خروجی به VERSION_ID و نام نسخه نگاه کنید. این اطلاعات کمک می‌کند تشخیص دهید راهنمای نصب یا مخزن، برای نسخه سیستم شما ارائه شده است یا خیر. اطلاعات کامل مدیریت بسته در مستندات رسمی اوبونتو آمده است.

قدم سوم: آیا بسته‌ای عمداً روی hold است؟

این دستور نام بسته‌هایی را که علامت hold دارند نشان می‌دهد:
کد / دستورapt-mark showhold
اگر خروجی خالی است، بسته holdشده‌ای در این فهرست نیست؛ با این وجود وابستگی ناسازگار هنوز می‌تواند علت خطا باشد. اگر نامی می‌بینید، آن را با نام وابستگی‌های خطا مقایسه کنید. بسته ممکن است عمداً برای سازگاری یک نرم‌افزار قدیمی یا پنل مدیریت نگه داشته شده باشد. همه بسته‌ها را یک‌جا از حالت hold خارج نکنید.
فرض کنید مدیر سرور تأیید کرده بسته‌ای به نام example-package دیگر نباید hold باشد. نام نمونه را با نام واقعی جایگزین کنید و فقط برای همان بسته اجرا کنید:
کد / دستورsudo apt-mark unhold example-package
این فرمان علامت hold همان بسته را برمی‌دارد؛ خودش به معنی نصب فوری نسخه جدید نیست، ولی در به‌روزرسانی‌های بعدی اجازه تغییر آن را می‌دهد. دوباره apt-mark showhold را اجرا کنید و ببینید نام موردنظر حذف شده است. اگر دلیل hold را نمی‌دانید یا آن بسته برای سرویس ضروری است، این مرحله را انجام ندهید. معنی hold و unhold در راهنمای رسمی apt-mark توضیح داده شده است.

قدم چهارم: نسخه نصب‌شده و نسخه پیشنهادی را مقایسه کنید

اگر در خطا نام package-b آمده، آن را در فرمان زیر با نام واقعی جایگزین کنید:
کد / دستورapt-cache policy package-b
در خروجی، Installed نسخه نصب‌شده و Candidate نسخه‌ای است که APT اکنون برای نصب در نظر می‌گیرد. پایین‌تر نیز نسخه‌های موجود و مخزن‌های مرتبط نشان داده می‌شوند. اگر Candidate برابر (none) است، APT در وضعیت فعلی نسخه قابل انتخابی برای آن نام پیدا نکرده است. اگر نسخه پیشنهادی با نسخه لازم در پیام Depends فرق دارد، نام نسخه‌ها و مخزنشان سرنخ اصلی است.
برای بسته اصلی و وابستگی مشکل‌دار، این بررسی را جداگانه تکرار کنید. نصب بسته‌ای از مخزن مخصوص نسخه دیگر اوبونتو یا ترکیب مخازن ناسازگار می‌تواند این اختلاف را ایجاد کند. از واردکردن نسخه مخزن یا کلید ناشناس که در یک وبلاگ پیدا کرده‌اید خودداری کنید. مسیر پیکربندی مخازن بسته به نسخه اوبونتو فرق می‌کند؛ در نسخه‌های جدید معمولاً فایل‌های .sources در /etc/apt/sources.list.d دیده می‌شوند و در نسخه‌های قدیمی‌تر ممکن است /etc/apt/sources.list نیز استفاده شود. تغییر منبع را با مستندات رسمی و سازنده همان نرم‌افزار تطبیق دهید.

قدم پنجم: تعمیر را اول شبیه‌سازی کنید

دستور زیر پیشنهاد APT برای اصلاح وابستگی‌های خراب را شبیه‌سازی می‌کند؛ در این حالت بسته‌ای نصب یا حذف نمی‌شود:
کد / دستورsudo apt-get -s -f install
در خروجی به خط‌های نصب، ارتقا و به‌خصوص حذف نگاه کنید. در خروجی انگلیسی Remv نشانه حذف و Inst نشانه نصب یا ارتقا است. اگر قرار است پایگاه داده، وب‌سرور، پنل مدیریت، SSH یا بسته‌ای که نمی‌شناسید حذف شود، ادامه ندهید. شبیه‌سازی تضمین نمی‌کند اسکریپت‌های واقعی نصب یا وضعیت سرویس در اجرای نهایی بدون مشکل باشند؛ فقط برنامه پیشنهادی را نشان می‌دهد.
اگر فهرست تغییرات را می‌شناسید، بکاپ و دسترسی جایگزین دارید و حذف یا تغییر ناخواسته‌ای وجود ندارد، می‌توانید همان تعمیر را بدون حالت شبیه‌سازی اجرا کنید:
کد / دستورsudo apt-get -f install
پیش از پاسخ مثبت، خلاصه‌ای را که دوباره نمایش داده می‌شود بخوانید. اگر با نتیجه شبیه‌سازی فرق دارد یا چیزی نامطمئن است، پاسخ n بدهید و متوقف شوید. از -y، گزینه‌های نادیده‌گرفتن امنیت یا حذف اجباری برای عبور سریع از پیام استفاده نکنید.

اگر هنوز نصب نمی‌شود چه کنیم؟

پس از رفع خطای مخزن یا وابستگی، دوباره sudo apt-get check را اجرا کنید. سپس نصب بسته موردنظر را ابتدا شبیه‌سازی کنید؛ به‌جای example-package نام واقعی را بگذارید:
کد / دستورsudo apt-get -s install example-package
اگر خروجی تغییرات قابل قبول دارد، دستور نصب واقعی را بدون -s و پس از خواندن خلاصه اجرا کنید. اگر هنوز نسخه ناسازگار پیشنهاد می‌شود، خروجی apt-cache policy بسته اصلی و وابستگی آن را همراه نسخه اوبونتو و متن خطا در اختیار مدیر فنی یا سازنده نرم‌افزار قرار دهید. ممکن است لازم باشد مخزن مناسب همان نسخه سیستم فعال یا منبع ناسازگار با برنامه مشخص اصلاح شود؛ انتخاب تصادفی نسخه قدیمی می‌تواند به‌روزرسانی امنیتی را عقب بیندازد.
در پایان برنامه نصب‌شده را با دستور یا صفحه وضعیت خودش آزمایش کنید و اگر سرویس مرتبط تغییر کرده، وضعیت و عملکرد آن را ببینید. وجود پیام پایان نصب بدون خطا شروع خوبی است، اما کارکرد واقعی سرویس را هم باید جداگانه امتحان کرد.
در سرور مجازی ایران نت‌آرام هم مدیریت بسته‌های سیستم‌عامل به نسخه نصب‌شده و دسترسی مدیریتی بستگی دارد؛ مشکل وابستگی با ارتقای پلن به‌تنهایی برطرف نمی‌شود.
اشتراک‌گذاری:
لینکدینتلگرامایکس
مقاله قبلی
مقاله قبلی وجود ندارد.

دیدگاه‌ها (۰)

دیدگاه‌های تاییدشده و پاسخ‌های تیم نت‌آرام