~6 دقیقه مطالعه • بروزرسانی ۱۰ اسفند ۱۴۰۴
1. بازسازی کامل دایرکتوری /etc/virtual
اگر دایرکتوری /etc/virtual خراب شده یا فایلهای مهم آن حذف شدهاند، میتوانید با مراحل زیر آن را از صفر بازسازی کنید.
1.1 بکآپ گرفتن از نسخه فعلی
cd /etc
cp -Rp virtual virtual.backup
1.2 ایجاد دایرکتوری جدید با پرمیشن صحیح
mkdir -p /etc/virtual
chmod 755 /etc/virtual
chown mail:mail /etc/virtual
1.3 ساخت اسکریپت بازسازی
فایل /root/fix.sh را ایجاد کنید و محتوای زیر را داخل آن قرار دهید:
#!/bin/sh
echo -n '' > /etc/virtual/domains
echo -n '' > /etc/virtual/domainowners
mkdir -p /etc/virtual/`hostname`
chown mail:mail /etc/virtual/`hostname`
chmod 711 /etc/virtual/`hostname`
echo `hostname` >> /etc/virtual/domains
for u in `ls /usr/local/directadmin/data/users`; do
{
for d in `cat /usr/local/directadmin/data/users/$u/domains.list`; do
{
echo "$d: $u" >> /etc/virtual/domainowners
echo "$d" >> /etc/virtual/domains
DMN=/etc/virtual/$d
mkdir -p $DMN
chmod 711 $DMN
chown mail:mail $DMN
touch $DMN/aliases
if [ ! -s $DMN/aliases ]; then
echo "$u: $u" > $DMN/aliases
fi
touch $DMN/autoresponder.conf
touch $DMN/filter
touch $DMN/filter.conf
touch $DMN/passwd
touch $DMN/quota
touch $DMN/vacation.conf
chown mail:mail $DMN/*
mkdir -p $DMN/majordomo
chmod 751 $DMN/majordomo
chown majordomo:daemon $DMN/majordomo
mkdir -p $DMN/reply
chmod 700 $DMN/reply
chown mail:mail $DMN/reply
for p in `cat /usr/local/directadmin/data/users/$u/domains/$d.pointers | cut -d= -f1 2>/dev/null`; do
{
echo "$p: $u" >> /etc/virtual/domainowners
echo "$p" >> /etc/virtual/domains
ln -s $d /etc/virtual/$p
};
done;
}
done;
}
done;
chown mail:mail /etc/virtual/domains
chown mail:mail /etc/virtual/domainowners
chmod 644 /etc/virtual/domainowners
chmod 644 /etc/virtual/domains
1.4 اجرای اسکریپت
chmod 755 /root/fix.sh
/root/fix.sh
1.5 بازسازی Majordomo
da build majordomo
---
2. بازسازی فایل /etc/virtual/domains در صورت حذف شدن
اسکریپت زیر را ایجاد کنید:
/etc/virtual/fix_domains.sh
محتوا:
#!/bin/sh
echo `hostname`
for u in `ls /usr/local/directadmin/data/users`; do
{
for d in `cat /usr/local/directadmin/data/users/$u/domains.list`; do
{
echo "$d"
for p in `cat /usr/local/directadmin/data/users/$u/domains/$d.pointers 2>/dev/null | cut -d= -f1`; do
{
echo "$p"
}
done;
}
done;
}
done;
اجرای اسکریپت و تنظیم پرمیشن
cd /etc/virtual
chmod 755 fix_domains.sh
./fix_domains.sh > domains
chmod 644 domains
chown mail:mail domains
---
3. بازسازی فایل /etc/virtual/domainowners در صورت حذف شدن
اسکریپت زیر را ایجاد کنید:
/etc/virtual/fix_domainowners.sh
محتوا:
#!/bin/sh
for u in `ls /usr/local/directadmin/data/users`; do
{
for d in `cat /usr/local/directadmin/data/users/$u/domains.list`; do
{
echo "$d: $u"
for p in `cat /usr/local/directadmin/data/users/$u/domains/$d.pointers | cut -d= -f1 2>/dev/null`; do
{
echo "$p: $u"
}
done;
}
done;
}
done;
اجرای اسکریپت و تنظیم پرمیشن
cd /etc/virtual
chmod 755 fix_domainowners.sh
./fix_domainowners.sh > domainowners
chmod 644 domainowners
chown mail:mail domainowners
---
4. بازسازی فولدر یک دامنه خاص
اگر فقط فولدر یک دامنه خالی شده، میتوانید آن را دستی بازسازی کنید:
cd /etc/virtual/domain.com
echo "fred: fred" > aliases
touch autoresponder.conf
touch filter
touch filter.conf
touch passwd
touch quota
touch vacation.conf
echo "*: :fail:" >> aliases
chown mail:mail *
mkdir -p majordomo
chmod 751 majordomo
chown majordomo:daemon majordomo
mkdir -p reply
chmod 700 reply
chown mail:mail reply
chown mail:mail .
برای مشاهده لیست ایمیلها:
ls -la /home/fred/imap/domain.com
---
5. ریست پرمیشنها و مالکیت فایلهای سیستمی DirectAdmin
اگر دادهها را به دیسک جدید منتقل کردهاید و پرمیشنها اشتباه هستند:
cd /usr/local/directadmin/scripts
./set_permissions.sh all
برای ریست پرمیشنهای یک دامنه خاص:
./set_permissions.sh domaindir domain.com
---
6. جلوگیری از خطای useradd هنگام ریاستورهای موازی
اگر چند ریاستور همزمان انجام دهید، ممکن است /etc/passwd قفل شود. برای جلوگیری، اسکریپت قفلگذاری بسازید.
6.1 اسکریپت pre-create
/usr/local/directadmin/scripts/custom/user_create_pre/lock.sh
محتوا:
#!/bin/bash
LOCK=/etc/passwd.da_lock
ATTEMPTS=100
set -C
while [ $ATTEMPTS -gt 0 ]; do
ATTEMPTS=$(( ATTEMPTS-1 ))
2>/dev/null >$LOCK
RET=$?
if [ "$RET" = "0" ]; then
break
fi
sleep 0.2
done
if [ $ATTEMPTS -eq 0 ]; then
if [ -e /etc/passwd.lock ]; then
echo "Unable to get lock on $LOCK and /etc/passwd.lock still exists. User $username not created"
exit 1
fi
echo "Unable to get lock on $LOCK but /etc/passwd.lock does not exist. Proceeding anyway"
rm -f $LOCK
fi
exit 0
6.2 اسکریپت post-create
/usr/local/directadmin/scripts/custom/user_create_post/lock.sh
محتوا:
#!/bin/bash
LOCK=/etc/passwd.da_lock
rm -f $LOCK
exit 0
6.3 اعمال دسترسی
chmod 755 /usr/local/directadmin/scripts/custom/user_create_pre/lock.sh
chmod 755 /usr/local/directadmin/scripts/custom/user_create_post/lock.sh
این کار تضمین میکند که فقط یک فرآیند useradd در هر لحظه اجرا شود.
نوشته و پژوهش شده توسط دکتر شاهین صیامی