• ครูเอ๊ะ ออนไลน์
    สำนักงานเขตพื้นที่การศึกษามัธยมศึกษา เขต 26 (มหาสารคาม)
    โรงเรียนนาเชือกพิทยาสรรค์ ต.นาเชือก อ.นาเชือก จ.มหาสารคาม 44170

  • ครูเอ๊ะ ออนไลน์
    สำนักงานเขตพื้นที่การศึกษามัธยมศึกษา เขต 26 (มหาสารคาม)
    โรงเรียนนาเชือกพิทยาสรรค์ ต.นาเชือก อ.นาเชือก จ.มหาสารคาม 44170

  • ครูเอ๊ะ ออนไลน์
    สำนักงานเขตพื้นที่การศึกษามัธยมศึกษา เขต 26 (มหาสารคาม)
    โรงเรียนนาเชือกพิทยาสรรค์ ต.นาเชือก อ.นาเชือก จ.มหาสารคาม 44170

  • ครูเอ๊ะ ออนไลน์
    สำนักงานเขตพื้นที่การศึกษามัธยมศึกษา เขต 26 (มหาสารคาม)
    โรงเรียนนาเชือกพิทยาสรรค์ ต.นาเชือก อ.นาเชือก จ.มหาสารคาม 44170

  • ครูเอ๊ะ ออนไลน์
    สำนักงานเขตพื้นที่การศึกษามัธยมศึกษา เขต 26 (มหาสารคาม)
    โรงเรียนนาเชือกพิทยาสรรค์ ต.นาเชือก อ.นาเชือก จ.มหาสารคาม 44170

  • ครูเอ๊ะ ออนไลน์
    สำนักงานเขตพื้นที่การศึกษามัธยมศึกษา เขต 26 (มหาสารคาม)
    โรงเรียนนาเชือกพิทยาสรรค์ ต.นาเชือก อ.นาเชือก จ.มหาสารคาม 44170

  • ครูเอ๊ะ ออนไลน์
    สำนักงานเขตพื้นที่การศึกษามัธยมศึกษา เขต 26 (มหาสารคาม)
    โรงเรียนนาเชือกพิทยาสรรค์ ต.นาเชือก อ.นาเชือก จ.มหาสารคาม 44170

  • ครูเอ๊ะ ออนไลน์
    สำนักงานเขตพื้นที่การศึกษามัธยมศึกษา เขต 26 (มหาสารคาม)
    โรงเรียนนาเชือกพิทยาสรรค์ ต.นาเชือก อ.นาเชือก จ.มหาสารคาม 44170

  • ครูเอ๊ะ ออนไลน์
    สำนักงานเขตพื้นที่การศึกษามัธยมศึกษา เขต 26 (มหาสารคาม)
    โรงเรียนนาเชือกพิทยาสรรค์ ต.นาเชือก อ.นาเชือก จ.มหาสารคาม 44170

การตั้งเวลา Backup ข้อมูลอัตโนมัติจาก Server ต้นทาง ไป Server ปลายทาง ด้วย shell script

ปฐมลิขิต
บทความนี้เกิดจากความต้องการที่จะทำระบบสำรองข้อมูลอัตโนมัติขึ้นใช้งาน โดยการสร้างไฟล์สำรองในเครื่อง Server หลักแล้วส่งไฟล์ดังกล่าวไปไว้อีก Server ตัวนึงเพื่อสำรองข้อมูล ซึ่งจะเป็นการสำรองข้อมูล 2 ชั้น เพื่อให้แน่ใจว่าข้อมูลสำรองของเราจะยังคงอยู่หาก Server หลักเป็นอะไรไป

เตรียมเครื่องมือ
เครื่องมือ หรือโปรแกรมที่ต้องใช้งานในการทำระบบ auto backup มีดังนี้
  • nano โปรแกรม text editor แบบ command line ใน linux ทั่วไป หากไม่มีก็สามารถใช้ text editor ตัวอื่นได้ตามต้องการ เช่น vi 
  • tar โปรแกรมบีบอัดไฟล์ใน linux ใช้งานผ่านทาง command line
  • rsync โปรแกรมคัดลอกไฟล์ ที่มีความสามรถมากมาย ทั้งคัดลอกไฟล์ในเครื่องตัวเอง หรือไปที่เครื่องปลายทางได้
  • ssh โปรแกรม shell terminal สำหรับเชื่อมต่อระหว่าง server เพื่อสั่งงานต่าง ๆ ได้
  • crontab (cron job) โปรแกรมบริหารตารางงานอัตโนมัติ เหมือน Schedule Task ใน Windows
โปรแกรมในข้างต้นส่วนใหญ่มีอยู่ใน Linux อยู่แล้ว ไม่จำเป็นต้องติดตั้งเพิ่ม

เริ่มเขียน Shell Script
ให้เข้าระบบ linux ในสิทธิ์ของ root แล้วเริ่มต้นเขียน shell script ในไฟล์ autobackup.sh โดยคำสั่ง
# nano -w autobackup.sh

จากนั้นทำการกำหนด directory ให้กับไฟล์ที่จะสำรองข้อมูล โดยเราจะทำการสำรองข้อมูลเป็น 7 วัน คือวันจันทร์-อาทิตย์ โดยหากครบรอบก็จะวนทับไฟล์เดิม ดังนั้นระบบเราจะมีไฟล์สำรองเพียง 7 วัน หรือหากอยากสำรองไฟล์เป็นแต่ละวันก็ได้ โดยปรับให้เหมาะสมกับบริบทของท่าน
และให้ตรวจสอบว่า หากยังไม่มี directory ก็ให้สร้างขึ้นมาใหม่ (แต่เราจะต้องมี diretory ชื่อ /backup ในระบบก่อน ถ้าไม่มีก็ใช้คำสั่ง mkdir /backup เพื่อสร้างขึ้นมาใหม่)

#!/bin/sh

NOW=$(date +"%u")
DIR="/backup/$NOW"
if [ ! -d $DIR ]; then
  mkdir $DIR
fi

ขั้นตอนต่อไปคือการสร้างไฟล์สำรอง โดยใช้คำสั่ง tar ดึงไฟล์ที่อยู่ใน directory ที่เราต้องการสำรอง มาบีบอัดไว้ในไฟล์เดียว เพื่อให้ง่ายต่อการใช้งาน โดยในตัวอย่างจะเป็นการสำรองไฟล์ใน /home/thai/domains/thai.ac ทั้งหมด ไปไว้ในไฟล์ /backup/$NOW/$NOW.backup.tar.gz โดย $NOW จะหมายถึงวันที่เรา backup ข้อมูล

GZFILE="$DIR/$NOW.backup.tar.gz"
tar -czvf $GZFILE /home/thai/domains/thai.ac >/dev/null 2>&1

เมื่อเสร็จขั้นตอนแล้วเราจะได้ไฟล์ .tar.gz แล้ว ต่อไปเราจะส่งไฟล์นี้ไปยัง Server อีกตัว ที่เป็น Linux เช่นกัน โดย Server ปลายทางนี้ จะต้องมี ssh และเราต้องมี user สำหรับเข้า ssh โดยในตัวอย่างจะใช้รหัส root ใน server ปลายทางเพื่อส่งข้อมูล

แต่ก่อนที่จะส่งข้อมูลผ่าน ssh ไป server ปลายทางได้ จะต้องทำการสร้าง ssh key ให้กับ server ก่อน เพื่อที่เราจะได้ใช้คำสั่งส่งข้อมูลไป โดยที่ไม่ต้องใส่รหัสผ่านของ ssh ใน server ปลายทาง ไม่ใช่นั้นแล้ว shell script เราจะไม่ทำงานแบบอัตโนมัติ โดยขั้นตอนการสร้าง ssh key มีดังนี้

ที่ server ต้นทาง (ที่มีไฟล์ tar.gz) ใช้คำสั่ง

# ssh-keygen -t rsa

จากนั้นให้ทำการกดปุ่ม Enter 3 ครั้งตามตัวอย่างด้านล่าง

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): [กดปุ่ม Enter]
Enter passphrase (empty for no passphrase): [กดปุ่ม Enter]
Enter same passphrase again: [กดปุ่ม Enter]
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
53:b7:3a:5b:39:22:78:35:e7:cf:44:64:cd:52:d4:a1 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|               o=|
|              .+.|
|          . .E+ o|
|         . . + . |
|        S o o .  |
|       . o = o   |
|      . o + = .  |
|       . . = =   |
|          .   o  |
+-----------------+

เมื่อเสร็จแล้ว ssh key จะถูกสร้างและเก็บไว้ที่  /root/.ssh/id_rsa.pub จากนั้นเราจะส่ง ssh key ดังกล่าวไปที่ server ปลายทางด้วยคำสั่ง (โดย 123.123.123.123 คือ ip ของเครื่อง server ปลายทาง และ root คือชื่อ username ที่เรามีใน server ปลายทาง

# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

เมื่อใช้คำสั่งแล้วจะได้หน้าจอดังนี้ ให้เราทำการใส่รหัสผ่าน root ของ server ปลายทาง

# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
The authenticity of host '123.123.123.123 (123.123.123.123)' can't be established.
RSA key fingerprint is 6f:ad:07:15:65:bf:54:a6:8c:5f:c4:3b:99:e5:2d:34.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '82.165.133.65' (RSA) to the list of known hosts.
[email protected]'s password: [ใส่รหัสผ่าน root ของ server ปลายทาง ]
Now try logging into the machine, with "ssh '[email protected]'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.
เมื่อใส่เรียบร้อยแล้ว ก็เสร็จสิ้นขั้นตอนการสร้าง ssh key จากนั้นให้ทำการทดสอบโดยใช้คำสั่ง
# ssh [email protected]
เราก็จะสามารถเข้าใช้งาน ssh ปลายทางได้โดยไม่ต้องใส่รหัสผ่าน
# ssh [email protected]
 Last login: Wed Dec 18 13:00:57 2017 from 121.121.121.121
 [root@server2 ~]#
ขั้นตอนการส่งไฟล์ข้าม Server เมื่อเราทำการสร้าง ssh key ปลายทางเสร็จเรียบร้อย ขั้นตอนต่อไปเราจะใช้ rsync เพื่อส่งข้อมูลที่เราสำรองไว้ ไปยัง server ปลายทางที่ directory ชื่อ /backupserver
rsync -av $DIR -e ssh [email protected]:/backupserver/
เสร็จสิ้นขั้นตอนการสร้างไฟล์ autobackup.sh ซึ่งสรุปข้อมูลในไฟล์ได้ดังนี้
#!/bin/sh

NOW=$(date +"%u")
DIR="/backup/$NOW"

if [ ! -d $DIR ]; then  
    mkdir $DIR
fi

echo "Backing up file ..."
GZFILE="$DIR/$NOW.backup.tar.gz"
tar -czvf $GZFILE /home/thai/domains/thai.ac >/dev/null 2>&1
echo "Backup file complete."

echo "Sending file ..."
rsync -av $DIR -e ssh [email protected]:/backupserver/
echo "Send file complete.
การออกจาก nano ใช้การกดปุ่ม CTRL + O แล้ว Enter เพื่อบันทึก แล้วกด CRTL + X แล้ว Enter เพื่อออกจาก nano
หลังจากออกจาก nano แล้ว เราต้องทำการกดหนดสิทธิ์ในการทำงานให้กับไฟล์ autobackup.sh ด้วยคำสั่ง
# chmod +x autobackup.sh

ขั้นตอนการตั้งการทำงานอัตโนมัติ ในขั้นตอนนี้เราจะใช้ crontab หรือ cron job ใน linux เพื่อสั่งให้ shell script เราทำงานตามเวลาที่ต้องการ โดยใช้คำสั่ง
# crontab -e
จากนั้นเราจะพบกับการทำงานที่ได้ตั้งค่าไว้อยู่ก่อนแล้ว เช่น
*/15 * * * * /usr/sbin/ntpdate -u clock.nectec.or.th >/dev/null 2>&1
0 5 * * 0 /usr/local/sysbk/sysbk -q
ให้ทำการกดปุ่ม i หนึ่งครั้ง เพื่อทำการ insert ข้อมูลเข้าไป (ตัว crontab นี้จะใช้คำสั่ง vi ในการแก้ไขข้อมูล) โดยเมื่อกด i แล้วเราจะเลือน cursor ไปสุดท้าย แล้วกด Enter เพื่อขึ้นบันทัดใหม่ แล้วทำการใส่คำสั่งดังตัวอย่างนี้
*/15 * * * * /usr/sbin/ntpdate -u clock.nectec.or.th >/dev/null 2>&1
0 5 * * 0 /usr/local/sysbk/sysbk -q
0 2 * * * /root/autobackup.sh
คือการสั่งให้ไฟล์ autobackup.sh ที่อยู่ในไดเร็คทอรี่ /root ทำงานในนาทีที่ 0 ของเวลา 2 นาฬิกา (หรือเวลา 02.00) ของทุกวัน จากนั้นให้กดปุ่ม ESC แล้วตามด้วย SHIFT + : จากนั้นกด wq! แล้วตามด้วย Enter เพื่อเป็นการบันทึกและปิด crontab จบกระบวนการ การทำระบบสำรองข้อมูลข้าม Server แบบอัตโนมัติโดยใช้ shell script ต่อไปเมื่อถืงเวลาที่เรากำหนดไว้ ระบบก็จะทำการสำรองข้อมูล และส่งไปที่ server ปลายทางให้เองอัตโนมัต หรือหากอยากลองใช้งานทันที ก็สามารถใช้คำสั่ง
# ./autobackup.sh
แล้วรอจนการทำงานเสร็จสิ้น โดยเราสามารถไปตรวจสอบที่ server ปลายทางดูได้ว่ามีไฟล์สำรองเกิดขึ้นหรือไม่ ถ้ามีไฟล์แสดงว่าการทำงานทุกอย่างถูกต้องสมบูรณ์

สรุป
การสำรองไฟล์มีหลายวิธี การใช้ shell script ก็เป็นอีกทางเลือกหนึ่งในการใช้งาน หากบทความนี้มีข้อผิดพลาด หรือต้องการให้ปรับปรุงเพิ่มเติม ผู้เขียนยินดีรับคำแนะนำ สุดท้ายหวังว่าบทความนี้จะเป็นประโยชน์กับท่านผู้อ่าน

ขอบคุณครับ
ธวัชชัย ฝ่ายพลแสน

วันที่ 16 มกราคม 2561 เวลา 21.56 น. | เข้าดู 567 ครั้ง