لطفا وارد شوید یا ثبت‌نام کنید تا به انجمن‌ها دسترسی کامل داشته باشید.



 
امتياز موضوع :
  • 0 رأي - معدل امتيازات : 0
  • 1
  • 2
  • 3
  • 4
  • 5
Backup script
2005-07-19, 10:03 PM,
ارسال : #1
Backup script
سلام دوستان

هفته گذشته یک کار نصب و راه اندازی سرور دستم بود و لازم بود برای یک شرکت که حدودا ۲۰ تا کارمند داره یک سرور نصب کنم. شرکت قبلا یک سرور لینوکس به عنوان فایل سرور داشت ودر طرف client هم همهجور سیستم عاملی پیدا میشد ویندوز لینوکس و اپل بنابراین برای اشتراک گذاری هم از samba استفاده می کردند.
حالا قرار بود که من بر روی یک سرور جدید که خریده بودند750 Dell PowerEdge یک سیستم جدید با سامبا ۳ نصب کنم و در ضمن کاری کنم که فایل های مربوط به پروژه ها هم خیلی با اطمینان بالا ذخیره و Backup بشه.

حالا میخوام در اینجا براتون شرح بدم که چطوری انجام شد که شاید به درد شما هم بخوره.

سرور دارای دو هارد دیسک SATA بود ولی بدون سخت افزار کنترلر سیستم RAID با استفاده از سیستم نرم افزاری مربوط به سیستم RAID و mdtool و تونستم کاری کنم که تمام فایل سیستم روی هارد دارای RAID-1 باشه و فایلها بطور هم زمان بر روی هر دو هارد نوشته بشن در واقع یک سیستم mirror کامل.

خوب این کافی نبود و آنها می خواستند بدون پرداختن پول اضافی برای یک سیستم Backup یک سیستم اتوماتیک داشته باشند که هر شب بعد از پایان ساعت کاری از تمام فایل هایی روی سرور یک Backup تهیه کنه و روی یک سرور دیگه کپی کنه.
اطلاعات لینوکسی که داشتم را جمع و جور کردن و شروع کردم به نوشتن یک اسکریپت که بتونه این کار را انجام بده. بعد از جستجو ها فراوان و پرسیدن از افراد مختلف در اینترنت موفق به تهیه این اسکریپت شدم و خواستم که اون را در اختیار شما ها هم قرار بدم با این امید که شما ها از اون سود ببرید و این اسکریپت را کاملتر کنید.

- سرور اصلی اسمش رو گذاشتم Helium و سیستمی که قرار است روی اون Backup تهیه بشه اسمش هست Neon

- در ابتدا از دایرکتوری که قرار است پشتیبان تهیه بشه یک فایل آرشیو tar.bz2 تهیه میشه و در یک دایرکتوری موقتی TEMP ذخیره میشه.

- بعد با استفاده از scp این فایل آرشیو تهیه شده بر روی سیستم Backup کپی میشه. برای این که این کار بدون وارد کردن پسورد وارد بشه لازم است که کلید مربوط به سیستم Backup روی سرور کپی بشه. چگونگی این کار را در قسمت آخر توضیح میدم

- بعد از کپی از این فایل یک md5 ویا اثر انگشت می گیرم و فایل اثر انگشت که خیلی کوچیک است رو به سیستم Backup کپی می کنم.

- حالا این اثر انگشت را با فایلی که کپی کردم کنترل می کنم تا ببینم که فایل ‌Backup درست کپی شده یا در طول کار کپی کردن که خیلی هم طول میکشه بدلیل مشکلات شبکه خراب شده .

- بعد از موفقیت آمیز بودن کار چک کردن درواقع کار تمام است. اما اگر این کار هر شب انجام بشه بعد از چند وقت فضای هارد سیستم پشتیبان پر میشه. برای همین هم من یک اسکریپت کوچک دیگه نوشتم که فایل های روی سیستم پشتیبان را چک می کنه و جدیدترین ۷ فایل آخر را نگه می داره و بقیه را پاک می کنه. این عدد را شما می تونین به دلخواه تغییر بدین .
- برای اجرا اسکریپت تمیز کاری بر روی Neon از روز سرور اصلی helium با استفاده از ssh به سیستم Neon وصل می شیشم و اون اسکریپ را اجرا می کنم
- تمامی کارها در یک logfile مستند سازی میشه و در صورت که مشکلی بوجود آمده باشه بعدا میشه فهمید که از کجاست.

- تنها اولین اسکریپت در cronjob مربوط به سرور اصلی قرار داده شده.

- اگر در شبکه شما یک سیستم DNS فعال نیست بایستی بجای اسامی ماشین ها IP_Address آنها را وارد کنید.


اسکریپت اصلی برای تهیه پشتبان بر روی ماشین Helium

[ltr]
کد :
#!/bin/bash

##### CONSTANTS #########

# DIR_LIST lists all directories which should be backuped.
DIR_LIST="/special2/transPro"


# file to write log to
LOG_FILE=/var/log/backup_to_neon.log

# date to use in file name
DATE=`date +%F--%H-%M-%S`

# directory to temporarily store backup
TEMP_DIR=/special1/tmp

# the time the script waits before beginning the backup, usefull if the
# destination computer needs some time to boot and this script is run
# by cron
SLEEP_TIME=2

###### FUNCTIONS ######

# void create_exclude_list()
# create a line-separated list from EXCLUDE_DIR_LIST in $TEMP_DIR/.backup_to_neon/exclude_list
#
function create_exclude_list
{
    for i in $EXCLUDE_DIR_LIST ; do
    echo $i >> $TEMP_DIR/.backup_to_neon/exclude_list;
    done
}

# void log_to_file_and_stdout(char* log_file, char* text)
# function to write a message (2nd arg) to STDOUT and a log file (1st arg)
#
function log_to_file_and_stdout
{
    local FILENAME=$1
    shift
    echo -e $@
    echo -e $DATE: $@ >> $FILENAME || echo "$0: ERROR Could not write log to $FILENAME."
}



# void log_and_die(char* log_file, char* text)
# function to write a message (2nd arg) to STDOUT and a log file (1st arg)
# and exit the program
#
function log_and_die
{
    log_to_file_and_stdout $@
    cleanup || log_to_file_and_stdout "$LOG_FILE" "ERROR: Could not cleanup! What a mess!\n Please take a look at \"$TEMP_DIR/.backup_to_neon\""
    exit 1
}

# int cleanup()
# function removes all temporarily created files and directories
# returns 0 is successfull or 1 if not
#
function cleanup
{
    rm -fr $TEMP_DIR/.backup_to_neon || return 1
    return 0
}


function md5check
{
    cd $TEMP_DIR/.backup_to_neon
    md5sum backup_transPro_$DATE.tar.bz2 > backup_transPro_$DATE.tar.bz2.md5
    
    scp -q $TEMP_DIR/.backup_to_neon/backup_transPro_$DATE.tar.bz2.md5 neon:/data/Backup_from_helium || log_and_die "$LOG_FILE" "ERROR running \" scp $TEMP_DIR/.backup_to_neon/backup_transPro_$DATE.tar.bz2.md5 neon:/data/Backup_from_helium\""
    
    ssh neon "(cd /data/Backup_from_helium ; md5sum --status -c backup_transPro_$DATE.tar.bz2.md5)" || log_and_die "$LOG_FILE" "FATAL! neon:/data/Backup_from_helium/backup_transPro_$DATE.tar.bz2 is different to the file created on helium (md5sum does not match $TEMP_DIR/.backup_to_neon/backup_transPro_$DATE.tar.bz2)!"
    
    log_to_file_and_stdout "$LOG_FILE" "Backup was successfully copied to neon."
}


###### PROGRAM (main ;) ########

log_to_file_and_stdout "$LOG_FILE" "------ Starting Backup at $DATE ------"

# wait for destination computer
log_to_file_and_stdout "$LOG_FILE" "sleeping for $SLEEP_TIME seconds..."
sleep $SLEEP_TIME
if ! ping -qc 1 neon &> /dev/null ; then
    log_and_die "$LOG_FILE" "FATAL destination server \"neon\" seems to be down!" ;
fi
log_to_file_and_stdout "$LOG_FILE" "...beginning backup."

# clean possible old (failed) backups

if test -d $TEMP_DIR/.backup_to_neon; then
     rm -r $TEMP_DIR/.backup_to_neon;
fi

# create directory to temporarily store backup

mkdir -p -m 700 $TEMP_DIR/.backup_to_neon || log_and_die "$LOG_FILE" "ERROR running \"mkdir -P -m 700 $TEMP_DIR/.backup_to_neon\""


# create backup
cd /
nice tar -cp -f $TEMP_DIR/.backup_to_neon/backup_transPro_$DATE.tar $DIR_LIST >> $LOG_FILE || log_and_die "$LOG_FILE" "ERROR running \"tar cvpf $TEMP_DIR/.backup_to_neon/backup_transPro_$DATE.tar $DIR_LIST\""


# compress archive
nice bzip2 -zf9 $TEMP_DIR/.backup_to_neon/backup_transPro_$DATE.tar || log_and_die "$LOG_FILE" "ERROR running \"bzip2 -zf9 $TEMP_DIR/.backup_to_neon/backup_transPro_$DATE.tar\""

# copy backup to neon
nice scp -q $TEMP_DIR/.backup_to_neon/backup_transPro_$DATE.tar.bz2 neon:/data/Backup_from_helium || log_and_die "$LOG_FILE" "ERROR running \"scp $TEMP_DIR/.backup_to_neon/backup_transPro_$DATE.tar.bz2 neon:/data/Backup_from_helium\""

# check integrity of copied file
md5check

# let script on neon cleanup the backup directory
ssh neon /usr/local/sbin/cleanup_backup_dir.sh || log_and_die "$LOG_FILE" "ERROR running \"ssh neon /usr/local/sbin/cleanup_backup_dir.sh\""

# cleanup our temporary directory
cleanup || log_and_die "$LOG_FILE" "ERROR running \"cleanup\""

# perfect :)
DATE=`date +%F--%H-%M-%S`
log_to_file_and_stdout "$LOG_FILE" "------ Finished Backup at $DATE ------"
exit 0
[/ltr]
این هم اسکریپت مربوط به تمیز کاری بر روی سیستم Backup ویا اون سیستمی که من اسمش را گذاشتم Neon
[ltr]
کد :
#!/bin/bash

# put this file in /usr/local/sbin/cleanup_backup_dir.sh
FILENAME=helium_backup

cd /data/Backup_from_helium

# count files and remove oldest if there are more that 7.
TEST=0
while test 0 -eq $TEST ; do
    if test 7 -lt `ls backup_transPro_*.tar.bz2 | wc -l`; then
    DEL_FILE=`ls backup_transPro_*.tar.bz2 | sort | head -n 1`
    rm -f $DEL_FILE $DEL_FILE.md5
    else
    TEST=1;
    fi
done
:

chmod 700 *
chown backupuser:users *
[/ltr]
- چطور میشه بدون وارد کردن پسورد روی یک ماشین دیگه login کرد. بر روی ماشینی که می خواهین بر روش بدون پسورد login کنید این کار ها را انجام بدید
[ltr]
کد :
ssh-keygen -t rsa

scp .ssh/id_rsa.pub myserver.mydomain:.ssh/authorized_keys2

ویا
cat .ssh/id_rsa.pub|ssh myserver "cat >>.ssh/authorized_keys2"
[/ltr]
- این روش تهیه Backup خیلی کم خرج است و روش بدی نیست ولی هر بار بایستی که تمامی فایل ها کپی بشن و کار زیادی از هارد دیسک می کشه.
- روش دیگه استفاده از rsync هست . با استفاده از rsync میشد کاری کرد که هر فایلی که بر روی Helium هست بر روی Neon هم باشه و روزی یک بار کنترل بشه و در صورتی که فایلی اضافه و یا کم شده فقط تغییرات بروی Neon اعمال بشه. ولی بدیش این بود که نمیشد چندین Backup مربوط به روز های گذشته را داشت. البته باید بگم که این کار هم ممکن است و باید cronjon ها را بر روی زمان های مختلف تنظیم کرد تا عمل هماهنگ سازی به تر تیب روز های هفته انجام بشه.
یک بدی دیگه rscny این بود که بایستی فایل ها بصورت باز و آرشیو نشده بر روی Neon قرار می گرفتند و من اینقدر فضای کافی نداشتم. و هر بار می بایستی فایل ها را برای انجام عمل هماهنگ سازی باز می کردم.

شاید یکی از شما دوستان اسکریپتی با استفاده از rsync برای تهیه Backup بنویسه و در اختیار همه بذاره


خوب همچین کاری را می شد با دوتا سیستم ویندوز با این امنیت ssh انجام داد؟

قربان شما
کیا
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-19, 10:31 PM,
ارسال : #2
Re: Backup script
kiat نویسنده :سلام دوستان

خوب همچین کاری را می شد با دوتا سیستم ویندوز با این امنیت ssh انجام داد؟

قربان شما
کیا

خیلی جالب بود ، من شخصا استفاده کردم ، ولی دو تا نکته .

کپی کردن کلید ها کار خیلی امنی نیست ، چون اگه یه سیستم شما کرک شه ، دومی هم از دست میره ، راه بهتر استفاده از یه جور Host Based Authentication بر اساس آدرس و صد البته کلید SSH باشه .

نمیدونم این Helium چه پروسسوری داره ، ولی عموما استفاده از bz2 رو توصیه نمیکنم ، برای Neon شاید ۱۰ مگابایت با ۱۵ مگابایت خیلی فرق نکنه ولی روی Helium شاید باعث استفاده زیادی از پروسسور موقع سرویس دادن بشه .

Wish you Were here ...
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-19, 10:49 PM,
ارسال : #3
 
بعد از مدت‌ها یک تاپیک عالی پیدا شد. مرسی کیا جان Smile
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-19, 10:51 PM,
ارسال : #4
 
دست شما درد نکند،‌جالب بود و آموزندهSmile

لطفا قبل از اينکه سؤالات خود را در انجمن مطرح کنيد،‌حتما قوانين انجمن‌ها را مطالعه فرماييد.
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-19, 10:57 PM,
ارسال : #5
 
خوب باید می نوشتم که این کار را یک کار بر معمولی انجام میده که اسمش هست backupuser و روی هر دو سیستم هم به همین نام است و
- هرگز نباید اجازه login کردن بدون پسورد برای root داد
- سرور داخل زون سبز داخلی و پشت سر دیوار آتش قرار دارند
- بهر حال شما باید از یک روشی استفاده کنین که بدون پسورد بازدن ssh بشه login کرد و کار ها را انجام داد


در مورد استفاده از bz2 با ید بگم که اسکریپت ساعت 12 شب از خواب پا میشه و در حالی که تمام کارمندان تو خونه ها شون خوابیدن شروع به کار میکنه پس سرویسی و جود نداره و این پروسسور تنبل بجایی اینکه بگیره بخوابه میتونه یک کم کار کنه

در ضمن فایل های backup من هر کدوم حدود 5.5 GB هستن زمان آرشیو کردنشون خیلی طوال میکشه حدودا یک ساعت این رو میتونم از logfile ها بخونم ولی حجم فایل ها برام خیلی مهم است چون او سیستم backup یک workstation قدیمی است با دوتا هارد 40 تفاوت gz , bz2 حدود 30% میشه باتوجه به ا ینکه فایلها اکثرا فایل های سورس بصورت نوشتاری هستن

میرم در این مورد Host Based Authentication یک کم گو گل کنم مرسی
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-19, 11:20 PM,
ارسال : #6
 
kiat نویسنده :خوب باید می نوشتم که این کار را یک کار بر معمولی انجام میده که اسمش هست backupuser و روی هر دو سیستم هم به همین نام است و
- هرگز نباید اجازه login کردن بدون پسورد برای root داد
- سرور داخل زون سبز داخلی و پشت سر دیوار آتش قرار دارند
- بهر حال شما باید از یک روشی استفاده کنین که بدون پسورد بازدن ssh بشه login کرد و کار ها را انجام داد


در مورد استفاده از bz2 با ید بگم که اسکریپت ساعت 12 شب از خواب پا میشه و در حالی که تمام کارمندان تو خونه ها شون خوابیدن شروع به کار میکنه پس سرویسی و جود نداره و این پروسسور تنبل بجایی اینکه بگیره بخوابه میتونه یک کم کار کنه

در ضمن فایل های backup من هر کدوم حدود 5.5 GB هستن زمان آرشیو کردنشون خیلی طوال میکشه حدودا یک ساعت این رو میتونم از logfile ها بخونم ولی حجم فایل ها برام خیلی مهم است چون او سیستم backup یک workstation قدیمی است با دوتا هارد 40 تفاوت gz , bz2 حدود 30% میشه باتوجه به ا ینکه فایلها اکثرا فایل های سورس بصورت نوشتاری هستن

میرم در این مورد Host Based Authentication یک کم گو گل کنم مرسی





Look for Rhosts RSA Authentication

Wish you Were here ...
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-20, 08:00 AM,
ارسال : #7
 
خیلی جالب بود! ولی با این حال من هم با Zoup در مورد bz2 موافقم!

البته چون سرور توی اینترنت نیست و باری روش در اون ساعت خاص اعمال نمی‌شه مشکلی نداره، در غیر اینصورت ممکنه باعث overload شدن سرور بشه!

ضمنا آیا نمی‌شد که دایرکتوری بکاپ مقصد رو با nfs به اشتراک بگذارید و بعد از اتمام کپی unmount اش کنید؟

[ltr]Life *free = new Life(const long OpenSource);[/ltr]
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-20, 12:57 PM,
ارسال : #8
 
برای استفاده از nfs لازم بود که دایرکتوری های روی سرور اصلی و یا روی سیستم پشتیبان با استفاده از nfs به اشتراک گذاشته بشه. یعنی میبایستی این دایرکتوری ها برای استفاده توسط یک سیستم برایIP-Address سیستم دیگه آزاد باشه. مشکل استفاده از nfs هم در همین است یعنی آزاد سازی برا یک IP دیگه. از آنجایی که هرکس دارای این IP باشه اجازه استفاده از این فایل ها است کار جالبی نبود. یعنی هر کدام از کارمندان میتونستن به کامیپوتر خودشون این IP را بدن و سپس فایل ها را mount کنن. مشکل ناامنی nfs هم در همین است.

ولی میشود با تنظیمات دیگه ای از nfs استفاده کرد. مثلا میشه که من یک دایرکتوری temp برروی سیستم پشتیبان درست کتم و این دایرکتوری را به اشتراک بذارم و بعد از انجام کار کپی کردن فایلها دایرکتوری temp را خالی کرده و فایلهای خودم را به جایی دیگری منتقل کنم که با nfs به اشتراک گذاشته نشده.
مشکل دیگر استفاده از nfs انتقال داده ها در شبکه بصورت رمز گذاری نشده است یعنی کسی میتونه وسط راه پاکت های ارسالی را بدزده.

البته این کار را میشد با استفاده از samba انجام داد ولی تنظیمات اون طولانی تر بود و میبایستی که ssl میشد.

یک کار دیگری که در این مورد انجام دادم قرار دادن دو کارت شبکه گیگابیتی در هر دو سیستم و لینک کردن آنها با استفاده از یک کابل شبکه cross over بود و بعد به آنها IP مربوط به زون دیگری دادم که مثلا ۱۹۲.۱۶۸.۲۰.۱ و ۱۹۲.۱۶۸.۲۰.۲ این طوری کار انتقال اطاعات خیلی پر سرعت تر و امن تر بود و اطلاعات من لازم نبود که از طریق سویچ عمومی رد و بدل بشن بکه از طریق این کانال خصوصی. در این صورت میشد که از nfs استفاده کرد و لی باز هم همان کار کپی کردن با scp را ترجیح دادم.
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-20, 01:35 PM,
ارسال : #9
 
خیلی تمیز و خوب! :-) فکر کنم با gpg هم رمزنگاریشون کنید دیگه فرایند حفاظت اطلاعات کامل میشه :-)

[ltr]Life *free = new Life(const long OpenSource);[/ltr]
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-21, 08:23 AM,
ارسال : #10
 
استفاده از bzip2 روی سرور های خیلی قوی هم می تونه برای حجم های بالا باعث overload شدن بشه . ایده دوکارت شبکه مجزا بسیار جالب بود و ایده خیلی خوبی از کار در اومده تا حالا. البته من همیشه پشتیبان های افزایشی رو ترجیح میدم ولی در این مورد چون پیاده سازی خوبی داشته برای مورد های مشابه می تونه بسیار جالب باشد.
حالا که مبحث به این خوبی شد بد نیست اشاره ای هم به Bacula بکنیم. به خصوص برای محیط هایی که از چندین پلتفرم همزمان استفاده می کنند.
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-07-21, 09:42 AM,
ارسال : #11
 
کیا جان دستت جدا درد نکنه.
برای من به شخصه جالب بود.
اگر تهران بودی حتما باید می امدید و به جمع اموزشی ها می پیوستید و شبکه را هم به ما کمک می کردید.
علی

linux is a way to be free. i
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ


رفتن به انجمن :


کاربران در حال مشاهده موضوع : 1 مهمان