مدیریت systemd Unit ها در اوبونتو
به منظور کسب مهارت در مدیریت سیستم اوبونتو، درک مفاهیم systemd Unit ها با تاکید خاص بر دو نوع خاص به نام اهداف (Targets) و سرویسها (Services) مهم است.
بنابراین، هدف این درس، ارائه یک نمای کلی از systemd Unit های مختلف است که توسط اوبونتو پشتیبانی میشوند، همراه با یک نمای کلی از نحوه پیکربندی بسیاری از سرویسهایی که در بکگراند یک سیستم لینوکس در حال اجرا، اجرا میشوند.
آشنایی با اهداف systemd در اوبونتو
اوبونتو را میتوان به گونهای پیکربندی کرد که در یکی از چندین حالت (که به آنها Target یا هدف گفته میشود) راهاندازی شود، که هر کدام برای ارائه سطح خاصی از عملکرد سیستمعامل طراحی شدهاند. هدفی که سیستم به طور پیشفرض بوت میشود توسط مدیر سیستم بر اساس هدفی که سیستم برای آن استفاده میشود پیکربندی میشود. به عنوان مثال، یک سیستم دسکتاپ به احتمال زیاد برای بوت شدن با استفاده از هدف رابط کاربری گرافیکی پیکربندی میشود، در حالی که سیستم سرور مبتنی بر ابر احتمالا در سطح هدف چند کاربر راهاندازی میگردد.
در طول فرآیند بوت، فرآیندی به نام systemd پوشه /etc/systemd/system را بررسی میکند تا تنظیمات هدف پیشفرض را پیدا کند. پس از شناسایی هدف پیشفرض، شروع به راهاندازی یونیتهای systemd مرتبط با آن هدف میکند تا سیستم با تمام فرآیندهای لازم در حال اجرا بوت شود.
آشنایی با سرویسهای systemd در اوبونتو
یک سرویس اساسا فرآیندی است که معمولا در پسزمینه اجرا میشود و عملکرد خاصی را ارائه میکند. به عنوان مثال، سرویس sshd، فرآیند پسزمینه (همچنین به عنوان daemon شناخته میشود) است که دسترسی پوسته ایمن به سیستم را فراهم میکند. اهداف مختلف systemd برای راهاندازی خودکار مجموعههای مختلف سرویسها، بسته به عملکردی که قرار است توسط آن هدف ارائه شود، پیکربندی شدهاند. اهداف و سرویسها انواع یونیتهای systemd هستند که در این درس به آن پرداخته خواهد شد.
توضیحات هدف systemd در اوبونتو
همانطور که قبلا ذکر شد، اوبونتو را میتوان در یکی از تعدادی از سطوح هدف راهاندازی کرد. هدف پیشفرض که سیستم برای راهاندازی روی آن پیکربندی شده است، به نوبه خود تعیین میکند که کدام یونیتهای systemd راهاندازی شوند. اهدافی که به طور خاص به راهاندازی و خاموش شدن سیستم مربوط میشوند را میتوان به صورت زیر خلاصه کرد:
- poweroff.target: این هدفی است که در آن سیستم خاموش میشود. به دلایل واضح بعید است که شما این را به عنوان هدف پیش فرض خود بخواهید.
- rescue.target: باعث می شود سیستم در حالت تککاربر راهاندازی شود که تحت آن فقط کاربر اصلی میتواند وارد شود. در این حالت سیستم هیچ شبکهای، رابط کاربری گرافیکی یا خدمات چندکاربره را راهاندازی نمیکند. این سطح اجرا برای مدیران سیستم برای انجام فعالیتهای تعمیر و نگهداری یا تعمیر سیستم ایدهآل است.
- multi-user.target: سیستم را به حالت چندکاربره با قابلیت ورود به کنسول مبتنی بر متن راهاندازی میکند.
- graphical.target: سیستم را در حالت شبکهای و چندکاربره با قابلیت X Window System بوت میکند. به طور پیشفرض محیط دسکتاپ گرافیکی در پایان فرآیند بوت شروع میشود. این رایجترین سطح اجرا برای استفاده از دسکتاپ یا ایستگاه کاری است.
- reboot.target: سیستم را دوباره راهاندازی میکند. هدف دیگری که، به دلایل واضح، بعید است که آن را به عنوان پیشفرض خود بخواهید.
علاوه بر اهداف فوق، این سیستم شامل حدود 70 هدف دیگر نیز میشود که بسیاری از آنها اساسا اهداف فرعی هستند که توسط اهداف اصلی فوق استفاده میشوند. به عنوان مثال، در پسزمینه، multiuser.target نیز هدفی به نام basic.target را شروع میکند که به نوبه خود واحد sockets.target را که برای ارتباط بین فرآیندهای مختلف مورد نیاز است، راهاندازی میکند. این تضمین میکند که تمام سرویسهایی که هدف چندکاربره به آنها وابسته است نیز در طول فرآیند بوت شروع شوند.
با اجرای فرمان زیر در پنجره ترمینال میوان لیستی از اهداف و سرویسهایی که یک هدف مشخص شده به آنها وابسته است مشاهده کرد:
1 |
# systemctl list-dependencies <target> |
به عنوان مثال، تصویر زیر فهرستی جزئی از وابستگیهای systemd را برای هدف چندکاربره نشان میدهد (فهرست کامل شامل بیش از 120 هدف و سرویس مورد نیاز برای یک سیستم چندکاربره است):
این فهرست به عنوان یک درخت سلسلهمراتبی ارائه میشود که نشان میدهد چگونه برخی از وابستگیها وابستگیهای فرعی خود را دارند. برای مثال، پیمایش به انتهای لیست نشان میدهد که هدف چندکاربره با سرویس و وابستگیهای فرعی به local-fs.target بستگی دارد:
نقاط رنگی سمت چپ هر ورودی در لیست وضعیت فعلی آن سرویس یا هدف را به شرح زیر نشان میدهد:
- سبز: سرویس یا هدف فعال و در حال اجرا است.
- سفید: سرویس یا هدف غیرفعال (مرده) است. معمولا به دلیل اینکه سرویس یا هدف هنوز فعال نشده است، به دلایلی متوقف شده است، یا شرایطی که سرویس یا هدف به آن وابسته است برآورده نشده است.
- قرمز: سرویس یا هدف به دلیل یک خطای مهلک اجرا نشدند.
برای اطلاع از جزئیات بیشتر در مورد وضعیت یک واحد systemd، از فرمان systemctl status و سپس نام واحد (Unit) به صورت زیر استفاده کنید:
1 2 3 4 5 6 7 |
# systemctl status systemd-machine-id-commit.service ◉ systemd-machine-id-commit.service - Commit a transient machine-id on disk Loaded: loaded (/usr/lib/systemd/system/systemd-machine-id-commit.service; static; vendor preset: disabled) Active: inactive (dead) Condition: start condition failed at Thu 2019-02-14 15:27:47 EST; 1h 14min ago ConditionPathIsMountPoint=/etc/machine-id was not met Docs: man:systemd-machine-id-commit.service(8) |
شناسایی و پیکربندی هدف پیشفرض
هدف پیش فرض فعلی برای یک سیستم اوبونتو را می توان با استفاده از فرمان systemctl به صورت زیر شناسایی کرد:
1 |
# systemctl get-default multi-user.target |
در مورد بالا، سیستم به طور پیشفرض برای بوت شدن با استفاده از هدف چندکاربره پیکربندی شده است. تنظیمات پیشفرض را میتوان در هر زمان با استفاده از فرمان systemctl با گزینه set-default تغییر داد. مثال زیر هدف پیشفرض را تغییر میدهد تا در دفعه بعد که سیستم بوت میشود، رابط کاربری گرافیکی را شروع کند:
1 2 |
# systemctl set-default graphical.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/ graphical.target. |
خروجی از عملیات تغییر پیشفرض، مراحل انجام شده در پسزمینه توسط فرمان systemctl برای اجرای تغییر را نشان میدهد. پیشفرض فعلی با ایجاد یک لینک سمبولیک از فایل default.target واقع در /etc/systemd/system پیکربندی میشود تا به فایل مورد نظر مربوطه در پوشه /usr/lib/systemd/system (در این مورد فایل graphical.target) اشاره کند.
شناخت واحدهای systemd و انواع واحدها
همانطور که قبلا ذکر شد، اهداف و سرویشها هر دو نوع واحد systemd هستند. همه فایلهای داخل پوشه /usr/lib/systemd/system به عنوان فایلهای پیکربندی واحد systemd نامیده میشوند که هر کدام نشان دهنده یک واحد systemd هستند. هر واحد به نوبه خود به عنوان یک نوع واحد خاص طبقهبندی میشود. اوبونتو از 12 نوع واحد مختلف از جمله انواع واحدهای هدف و سرویس که قبلا در این درس توضیح داده شده است، پشتیبانی میکند.
نوع فایل واحد همراه پسوند نام فایل همانطور که در جدول زیر آمده است، نشان داده شده است:
نام واحد | پسوند نام فایل | شرح |
---|---|---|
Service | .service | سرویس سیستم |
Target | .target | گروهی از واحدهای systemd |
Automount | .automount | نقطه نصب خودکار فایلسیستم |
Device | .device | شناسایی فایل دستگاه توسط هسته. |
Mount | .mount | نقطه نصب فایل سیستم |
Path | .path | فایل یا دایرکتوری در یک فایلسیستم. |
Scope | .scope | فرآیند ایجاد شده خارجی. |
Slice | .slice | گروهی از واحدهای سازمان یافته به صورت سلسله مراتبی که فرآیندهای سیستم را مدیریت میکنند. |
Snapshot | .snapshot | وضعیت ذخیره شده مدیر systemd. |
Socket | .socket | سوکت ارتباط بینفرآیندی. |
Swap | .swap | دستگاه Swap یا فایل Swap. |
Timer | .timer | تایمر systemd. |
توجه داشته باشید که نوع Target Unit با انواع دیگر متفاوت است زیرا اساسا از گروهی از واحدهای systemd مانند سرویسها یا اهداف دیگر تشکیل شده است.
تغییر پویای هدف فعلی
فرمان systemctl set-default که قبلا مشخص شد، هدفی را مشخص میکند که دفعه بعد که سیستم شروع به کار میکند، استفاده میشود، اما وضعیت سیستم در حال اجرا را تغییر نمیدهد. برای تغییر به یک هدف دیگر به صورت پویا، یک بار دیگر از فرمان systemctl استفاده کنید، این بار با استفاده از گزینه isolate و سپس هدف مقصد. به عنوان مثال، برای تغییر سیستم فعلی به هدف گرافیکی بدون راهاندازی مجدد، از فرمان زیر استفاده میشود:
1 |
# systemctl isolate graphical.target |
پس از اجرا، سیستم محیط دسکتاپ گرافیکی را راهاندازی میکند.
فعال کردن، غیرفعال کردن و Mask کردن واحدهای systemd
یک سیستم اوبونتو که به تازگی نصب شده است شامل واحدهای سرویسهای systemd پایه خواهد بود، اما بعید است که شامل تمام سرویسهایی باشد که در نهایت پس از وارد شدن به یک محیط تولید، مورد نیاز سیستم باشد. به عنوان مثال، نصب اولیه اوبونتو، معمولا شامل بستههای لازم برای اجرای وبسرور آپاچی نمیشود، عنصر کلیدی آن واحد apache2.service است.
مدیر سیستم با نصب بستههای آپاچی لازم با استفاده از فرمان زیر این مشکل را حل میکند:
1 |
# apt install apache2 |
پس از پیکربندی وبسرور، وظیفه بعدی بررسی وضعیت واحد سرویس apache2 برای شناسایی فعال شدن آن به عنوان بخشی از فرآیند نصب است:
1 2 3 4 5 6 7 8 9 10 11 |
# systemctl status apache2.service ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Wed 2020-04-08 14:34:54 EDT; 34s ago Main PID: 3513 (apache2) Tasks: 55 (limit: 4915) CGroup: /system.slice/apache2.service ├─3513 /usr/sbin/apache2 -k start ├─3515 /usr/sbin/apache2 -k start └─3516 /usr/sbin/apache2 -k start |
همانطور که از خروجی بالا میبینیم، سرویس apache2 از قبل بارگذاری و بدون نیاز به راه اندازی دستی فعال است. دلیل آن این است که پیشتنظیم طوری تنظیم شده است که از شروع سرویس پس از اتمام نصب اطمینان حاصل شود.
یک سرویس در حال اجرا ممکن است در هر زمان به شرح زیر متوقف شود:
1 |
# systemctl stop apache2.service |
از آنجایی که این سرویس به عنوان فعال در خروجی وضعیت فهرست شده است، دفعه بعد که سیستم به هدف فعلی راه اندازی مجدد میشود، سرویس apache2 به طور خودکار شروع به کار میکند. برای مثال، با فرض اینکه سرویس در زمانی که سیستم هدف چندکاربره را اجرا میکرد، فعال شده باشد، سرویس apache2 به عنوان وابستگی دیگری به واحد multi-user.target systemd اضافه میشود.
در پشت صحنه، systemctl با ایجاد لینکهای سمبولیک در پوشه .wants برای هدف در پوشه /etc/systemd/system، وابستگیهایی را به اهداف اضافه میکند. به عنوان مثال، واحد multi-user.target دارای یک پوشه به نام multi-user.target.wants در /etc/systemd/system است که حاوی لینکهای سمبولیک به تمام واحدهای systemd واقع در /usr/lib/systemd/system است که روی آنها وابسته است بررسی این پوشه ارتباطی با وابستگیهای فهرست شده توسط فرمان systemctl list-dependencies را نشان میدهد.
برای غیرفعال کردن یک سرویس به طوری که دیگر به صورت خودکار به عنوان وابستگی هدف شروع نشود، به سادگی آن را به صورت زیر غیرفعال کنید:
1 |
# systemctl disable apache2.service |
این فرمان لینک سمبولیک فایل واحد apache2.service را از دایرکتوری .wants حذف میکند تا دیگر یک وابستگی نباشد و به این ترتیب دفعه بعد که سیستم بوت میشود راهاندازی نمیشود.
پوشه .wants حاوی وابستگیهایی است که اگر در دسترس نباشد، مانع از راهاندازی و عملکرد دستگاه نمیشود. وابستگیهای اجباری (به عبارت دیگر وابستگیهایی که در صورت در دسترس نبودن باعث از کار افتادن واحد میشوند) باید در پوشه .requires (به عنوان مثال target.requires) قرار گیرند.
علاوه بر فعال و غیرفعال کردن، میتوان یک واحد systemd را به صورت زیر پوشش داد:
1 |
# systemctl mask apache2.service |
یک واحد systemd ماسکدار را نمیتوان تحت هیچ شرایطی فعال، غیرفعال یا راهاندازی کرد، حتی اگر بهعنوان وابستگی برای واحد دیگری فهرست شده باشد. در واقع، تا آنجا که به سیستم مربوط میشود، به این صورت است که گویی یک واحد systemd ماسک شده دیگر وجود ندارد. این میتواند برای اطمینان از اینکه یک واحد بدون توجه به شرایط سیستم هرگز راهاندازی نمیشود مفید باشد. تنها راه برای بازیابی مجدد دسترسی به سرویس این است که Mask آن را بردارید:
1 |
# systemctl unmask apache2.service |
کار با واحدهای systemd در Cockpit
علاوه بر تکنیکهای خط فرمان که تاکنون در این درس ذکر شده است، امکان بررسی و مدیریت واحدهای systemd از داخل رابط مبتنی بر وب Cockpit نیز وجود دارد. با فرض اینکه Cockpit نصب و راهاندازی شده است، با ورود به Cockpit و انتخاب گزینه خدمات در قسمت دسترسی به لیست واحدهای سیستم در سیستم میتوان به آن دسترسی پیدا کرد. پانل ناوبری سمت چپ با علامت A در تصویر زیر:
دکمه با علامت B واحدهایی از انواع خاص را در ناحیه اصلی با علامت C نشان میدهد، جایی که وضعیت فعلی هر واحد در ستون State فهرست شده است.
با انتخاب یک واحد از لیست، اطلاعات دقیق نمایش داده میشود. به عنوان مثال، صفحه جزئیات یک نمونه apparmor.service را نشان میدهد که شامل گزارشهای سرویس (A) و گزینههای منو (B) برای انجام کارهایی مانند شروع، توقف، فعال/غیرفعال کردن و پوشاندن/پاک کردن دستگاه است.
خلاصه
یک سیستم اوبونتو که به تازگی نصب شده است شامل مجموعه پایهای از واحدهای سیستم است که بسیاری از آنها در پسزمینه اجرا میشوند تا بسیاری از عملکردهای سیستم را ارائه دهند. این واحدها بر اساس نوع دستهبندی میشوند که رایجترین آنها اهداف و سرویسها است. واحد هدف صرفا گروهی از واحدهای دیگر است که قرار است به طور جمعی راهاندازی شوند. سیستم دارای یک واحد هدف پیشفرض است که واحدهای دیگری را که قرار است هر بار که سیستم راهاندازی میشوند راهاندازی شوند، تعریف میکند. رایجترین اهداف آنهایی هستند که سیستم را در حالت چندکاربره یا گرافیکی بوت میکنند. ابزار خط فرمان systemctl طیف وسیعی از گزینهها را برای انجام وظایف پیکربندی واحد systemd فراهم میکند، که بسیاری از آنها از طریق رابط مبتنی بر وب Cockpit نیز در دسترس هستند.
منبع: answertopia.comدرباره فرشید نوتاش حقیقت
همیشه نیازمند یک منبع آموزشی فارسی در حوزه نرمافزارهای آزاد/ متنباز و سیستمعامل گنو/لینوکس بودم. از این رو این رسالت رو برای خودم تعریف کردم تا رسانه «محتوای باز» رو بوجود بیارم.
نوشتههای بیشتر از فرشید نوتاش حقیقتاین سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
دیدگاهتان را بنویسید