کامل بازسازی /etc/virtual در DirectAdmin: تعمیر فایل‌ها، ریست پرمیشن‌ها و جلوگیری از خطاهای useradd

این مقاله یک راهنمای جامع برای بازسازی کامل ساختار ایمیل در DirectAdmin است. شامل بازسازی /etc/virtual، تولید مجدد فایل‌های domains و domainowners، تعمیر فولدرهای دامنه، ریست پرمیشن‌های سیستم، و جلوگیری از مشکلات قفل شدن useradd هنگام ری‌استورهای موازی. تمام اسکریپت‌ها و دستورات لازم برای بازیابی امن و دقیق ارائه شده‌اند.

DirectAdmin virtual directoryrebuild /etc/virtualdomainowners repair

~6 min read • Updated Mar 1, 2026

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 در هر لحظه اجرا شود.


Written & researched by Dr. Shahin Siami