آموزش فعالسازی rc.local در Ubuntu، CentOS و AlmaLinux و راه‌اندازی هنگام ریبوت
در این مقاله به صورت گام‌به‌گام روش فعالسازی فایل rc.local در توزیع‌های لینوکس را بررسی می‌کنیم.

آموزش فعالسازی rc.local در Ubuntu، CentOS و AlmaLinux و راه‌اندازی هنگام ریبوت

این مقاله راهنمای گام‌به‌گام فعالسازی rc.local در سیستم‌های Ubuntu، CentOS و AlmaLinux است. با استفاده از این آموزش، مدیران سیستم و DevOpsها می‌توانند اسکریپت‌ها را به آسانی هنگام بوت سیستم اجرا کنند.
0 股票
0
0
0
0

 

آیا هنوز به rc.local نیاز دارید؟

در این راهنما گام‌به‌گام یاد می‌گیریم چگونه فایل سنتی rc.local را در توزیع‌های متداول لینوکس مثل UbuntuCentOSAlmaLinux فعال کرده و اسکریپت‌ها یا دستورات مورد نیاز را هنگام بوت اجرا کنیم.

اگرچه systemd به‌عنوان init پیش‌فرض رایج شده است، rc.local هنوز برای اجرای سریع و سادهٔ اسکریپت‌های کوتاه هنگام بوت مفید است. در ادامه روش‌ها، مثال‌ها، نکات امنیتی و جایگزین‌های مدرن آورده شده‌اند.

 

فعالسازی rc.local در Ubuntu (18.04، 20.04، 22.04 و بالاتر)

در اوبونتوهای جدید که از systemd استفاده می‌کنند می‌توان rc.local را به صورت زیر فعال کرد. مراحل کلی شامل ایجاد فایل، تنظیم مجوز و ایجاد/فعال‌سازی یک unit برای سازگاری با systemd است.

گام‌های کلی

  1. ایجاد فایل /etc/rc.local و افزودن شِبانگ و دستورات مورد نظر.
  2. دادن مجوز اجرایی به فایل.
  3. ایجاد یا فعال‌سازی unit مربوط به rc.local در systemd (در صورت نبود).
  4. بارگذاری، فعال‌سازی و بررسی وضعیت سرویس.

مثال یک فایل نمونه /etc/rc.local (همیشه در انتها exit 0 قرار دهید):

#!/bin/bash
# Example: start Docker container named myapp
docker start myapp || docker run -d --name myapp myimage
# simple sysctl
/sbin/sysctl -w net.ipv4.ip_forward=1
exit 0

سپس مجوز را تنظیم کنید:

sudo chmod +x /etc/rc.local

اگر unit مربوطه وجود ندارد آن را بسازید:

sudo tee /etc/systemd/system/rc-local.service > /dev/null <<'EOF'
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

و در نهایت:

sudo systemctl daemon-reload
sudo systemctl enable rc-local.service
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
sudo journalctl -u rc-local.service -b

 

فعالسازی rc.local در CentOS 7/8 و AlmaLinux 8/9

توزیع‌های مبتنی بر RHEL مسیرهای متفاوتی دارند؛ مسیر سنتی معمولاً /etc/rc.d/rc.local است. مراحل کلی مشابه اوبونتو است اما به مسیر و نکات SELinux توجه کنید.

مسیرهای معمول

  • /etc/rc.d/rc.local مسیر سنتی در RHEL/CentOS است.
  • در برخی سیستم‌ها ممکن است لینک /etc/rc.local وجود داشته باشد.

گام‌های فعالسازی (CentOS / AlmaLinux)

ایجاد/ویرایش فایل:

sudo nano /etc/rc.d/rc.local
#!/bin/bash
# Example: mount NFS or start a container
mount -a
/usr/bin/my-startup-script.sh &
exit 0

مجوز اجرایی:

sudo chmod +x /etc/rc.d/rc.local

در صورت نبودن unit آن را بسازید:

sudo tee /etc/systemd/system/rc-local.service > /dev/null <<'EOF'
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionPathExists=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

و سپس:

sudo systemctl daemon-reload
sudo systemctl enable rc-local.service
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
sudo journalctl -u rc-local.service -b
sudo restorecon -v /etc/rc.d/rc.local
# or temporarily change context
sudo chcon -t bin_t /etc/rc.d/rc.local

همچنین بهتر است در اسکریپت‌ها از مسیرهای مطلق مانند /usr/bin/docker استفاده کنید تا وابستگی به PATH کمتر شود.

 

نمونه‌های عملی و نکات کاربردی

مثال — اجرای اسکریپت راه‌انداز Docker

#!/bin/bash
# start redis container at boot
/usr/bin/docker run -d --name redis-cache --restart unless-stopped redis:6
exit 0

笔记: استفاده از گزینه –restart unless-stopped باعث می‌شود Docker مدیریت بازگشت کانتینر را بر عهده بگیرد.

مثال — mount شبکه‌ای قبل از اجرای سرویس

اگر اسکریپت نیازمند mount شدن NFS است، unit systemd را با وابستگی‌های مناسب تغییر دهید:

[Unit]
After=network-online.target remote-fs.target
Wants=network-online.target remote-fs.target

اجرای اسکریپت طولانی یا سرویس دائمی — راهِ بهتر

برای کارهای طولانی یا سرویس‌محور بهتر است یک unit اختصاصی systemd بسازید تا از امکاناتی مانند Restart و مانیتورینگ استفاده کنید:

sudo tee /etc/systemd/system/myjob.service > /dev/null <<'EOF'
[Unit]
Description=My Long Running Job
After=network-online.target

[Service]
Type=simple
User=myuser
ExecStart=/usr/local/bin/my-long-script.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now myjob.service

 

اشکال‌زدایی رایج

  • سرویس در وضعیت failed:sudo journalctl -u rc-local.service -b برای دیدن لاگ استفاده کنید.
  • پرمیشن: مطمئن شوید فایل اجرایی است (chmod +x) و شِبانگ در ابتدا وجود دارد.
  • مسیرهای نسبی: همیشه از مسیرهای مطلق برای باینری‌ها استفاده کنید.
  • متغیرهای محیطی: rc.local یک محیط محدود دارد؛ متغیرهایی مثل PATH را صریح تعریف کنید یا مسیر کامل بنویسید.
  • SELinux: خطاهای AVC را بررسی کنید و context را تنظیم کنید.
  • وابستگی‌ها: اگر اسکریپت به شبکه یا فایل‌سیستم وابسته است، unit باید After=Wants= مناسب داشته باشد.

 

جایگزین‌ها و بهترین روش‌ها

  • systemd unit اختصاصی: برای سرویس‌ها بهترین گزینه است.
  • crontab @reboot: برای وظایف ساده کاربرانه مناسب است:
    @reboot /usr/local/bin/myscript.sh
  • cloud-init: در محیط‌های ابری برای پیکربندی اولیه مناسب است.
  • ابزارهای مدیریت پیکربندی مثل Ansible: برای اعمال تغییرات تکرارشونده و قابل مدیریت کاربرد دارد.

 

نکات امنیتی و عملیاتی

از اجرای دستورات حساس در rc.local خودداری کنید. بهتر است اسکریپت‌ها با مالکیت مشخص اجرا شوند یا از قابلیت 用户= در systemd استفاده شود.

همیشه خروجی اسکریپت‌ها را لاگ کنید و از مجوزهای محدود استفاده نمایید. مثال:

/usr/local/bin/myscript.sh >> /var/log/rc.local.log 2>&1
chmod 700 /usr/local/bin/myscript.sh

برای محیط‌های تولید قبل از اعمال تغییرات در سرورهای مهم، در محیط staging تست انجام دهید.

 

رابطه این آموزش با خدمات شرکت

خدمات شرکت ما در بیش از 85 لوکیشن جهانی شامل VPS، سرور ابری، سرور گرافیکی (GPU)، سرور اختصاصی و موارد شبکه‌ای این امکان را فراهم می‌کند که:

  • در VPSهای مخصوص ترید یا گیم، اسکریپت‌های راه‌انداز را سریع اجرا کنید.
  • در سرورهای GPU از unitهای systemd برای راه‌اندازی سرویس‌های سنگین استفاده کنید تا پس از ریبوت پردازش به‌درستی آغاز شود.
  • در سرورهای شبکه‌ای و ضد DDoS، unitهای systemd سفارشی برای اجرای اسکریپت‌های شبکه‌ای و iptables بسازید.
  • تیم پشتیبانی در موارد SELinux، مسیرهای mount و dependencyها در دسترس است.

 

جمع‌بندی و پیشنهادات نهایی

با وجود systemd، rc.local همچنان راهی ساده برای اجرای فرمان‌های سفارشی در بوت است، اما برای پایداری و مانیتورینگ بهتر است از unitهای systemd استفاده کنید.

همیشه به مجوزها، SELinux و وابستگی سرویس‌ها توجه داشته باشید و از لاگ‌ها برای اشکال‌زدایی استفاده کنید.

اگر نیاز خاصی دارید (مثلاً اجرای خودکار ربات ترید، آماده‌سازی محیط GPU یا پیکربندی شبکه سرور گیم)، تیم فنی ما در لوکیشن‌های مختلف آماده راهنمایی است.

 

常见问题解答

您可能也喜欢