Category: Linux (OS, shell script, etc)

  • How to create PSU VPN (L2TP/IPSec) connection Ubuntu 13.04?

    * ติดตั้งโปรแกรมชื่อ l2tp-ipsec-vpn ด้วยคำสั่ง

    $sudo apt-get install l2tp-ipsec-vpn

    ดังภาพ
    Screenshot from 2013-04-29 11:02:30
    * ตอบ y
    Screenshot from 2013-04-29 11:03:16
    * ตอบ No
    Screenshot from 2013-04-29 11:03:31
    Screenshot from 2013-04-29 11:03:40
    * กด OK
    Screenshot from 2013-04-29 11:03:53
    * สั่ง reboot เครื่อง
    Screenshot from 2013-04-29 11:04:12
    * เมื่อบูทเสร็จจะพบว่ามีไอคอนเพิ่มมาบนพาเนล
    Screenshot from 2013-04-29 11:44:16
    * คลิกซ้ายเลือก Edit Connection
    Screenshot from 2013-04-29 12:00:41
    * หน้าจอจะมืดลงและมีช่องให้ใส่พาสเวิร์ดของผู้ใช้ลงไปแล้วกด OK
    Screenshot from 2013-04-29 12:02:16
    * จะได้หน้าจอดังรูป
    Screenshot from 2013-04-29 11:21:03
    * คลิก Add จะได้หน้าจอดังรูป ใส่ vpn.psu.ac.th ลงไปในช่อง Connection name กด OK
    Screenshot from 2013-04-29 11:21:32
    * ได้ดังรูป
    Screenshot from 2013-04-29 12:06:09
    * คลิก Edit กรอกข้อความตามรูป
    Screenshot from 2013-04-29 11:22:00
    * คลิก PPP เลือกตามรูป ในช่อง Username และ Password ให้ใช้ PSU Passport
    Screenshot from 2013-04-29 11:22:30
    * คลิก IP setting คลิกเครื่องหมายถูกในช่องสี่เหลี่ยมหน้าข้อความ Obtain DNS server address automatically กด OK
    Screenshot from 2013-04-29 11:23:35
    * กด OK ออกมาจนสุดคลิก Close คลิก OK
    Screenshot from 2013-04-29 11:24:14
    * Reboot อีกครั้ง
    * คลิกที่ไอคอน เลือก vpn.psu.ac.th
    Screenshot from 2013-04-29 11:31:28
    Screenshot from 2013-04-29 11:25:37
    * เมื่อเชื่อมต่อสำเร็จจะเป็นดังรูป
    Screenshot from 2013-04-29 11:28:29
    * สำหรับ Linux Mint 15 อาจจะต้องทำคำสั่งนี้ก่อนจึงจะใช้งานได้

    sudo apt-add-repository ppa:werner-jaeger/ppa-werner-vpn
    sudo apt-get update && sudo apt-get install l2tp-ipsec-vpn

    * ขอให้สนุกครับ

    ที่มา http://rapidvpn.com/setup-vpn-l2tp-ubuntu.htm

  • Linux Mint – แหล่งรวมรวมเอกสาร ข้อมูลความรู้ต่างๆ

    Linux Mint – แหล่งรวมรวมเอกสาร ข้อมูลความรู้ต่างๆ
    ลิงค์ http://opensource.cc.psu.ac.th/Linuxmint

    1-วิธีตั้งค่าให้อัปเดต Linux Mint ได้เร็วขึ้น ทำได้โดยการตั้งค่าให้ติดต่อกับ server ในประเทศไทย
    ลิงค์ http://opensource.cc.psu.ac.th/วิธีตั้งค่าให้อัปเดต_Linux_Mint_ได้เร็วขึ้น

    2-วิธีปรับการตั้งค่า Linux Mint – Boot Options กรณีติดตั้ง Multi OS ปรับการหน่วงเวลาการเลือก OS
    ลิงค์ http://opensource.cc.psu.ac.th/วิธีปรับการตั้งค่า_Linux_Mint_-_Boot_Options_กรณีติดตั้ง_Multi_OS_ปรับการหน่วงเวลาการเลือก_OS

    3-คำสั่งตรวจสอบรายชื่อ packages ที่ติดตั้งในระบบปฎิบัติการ Linux Mint, Ubuntu, Debian
    ลิงค์ http://opensource.cc.psu.ac.th/คำสั่งตรวจสอบรายชื่อ_packages_ที่ติดตั้งในระบบปฎิบัติการ_Linux_Mint,_Ubuntu,_Debian

    4-แก้ไข Firefox browser แจ้งว่าใช้ flash player ที่ไม่ปลอดภัย หรือ Outdated
    ลิงค์ http://opensource.cc.psu.ac.th/แก้ไข Firefox browser แจ้งว่าใช้ flash player ที่ไม่ปลอดภัย

    5-ตั้งค่า VPN สำหรับ Linux Mint
    ลิงค์ http://opensource.cc.psu.ac.th/ตั้งค่า_VPN_สำหรับ_Linux_Mint

    และอื่นๆที่จะมีเพิ่มเติมมาเรื่อยๆ

  • ตัวอย่างการใช้งาน mutt เพื่อส่ง email แบบ command line

    เมื่อต้องการส่ง email ด้วย command line วิธีที่ถูกต้องที่สุด ไม่ผูกติดกับ email client program บน Linux คือการสร้างไฟล์ แล้วส่งผ่าน sendmail ไม่ว่าจะเป็น original sendmail หรือ backward-compatibility ของ postfix ก็ตาม (จะกล่าวในอีกบทความหนึ่ง)

    แต่หากต้องการความง่าย ก็ลองใช้วิธีนี้ดูครับ

    ผ่านโปรแกรมชื่อ mutt

    ตัวอย่างคือ

    1. ส่ง email ไปให้ username.s@xxx.psu.ac.th

    2. บอกว่า ส่งจาก IT Department ซึ่ง email address เป็น blah@itdept.xxx.psu.ac.th

    3. มี Subject ว่า This is Subject

    4. แนบไฟล์ชื่อ test.txt

    5. แต่จดหมายนี้ ไม่ต้องการให้ผู้ใช้ตอบกลับ จึงส่งให้ no-reply@xxx.psu.ac.th เพื่อโยนทิ้งทันที

    6. เนื้อความ ว่า Hello World

     

    สามารถใช้คำสั่งต่อไปนี้

    export REPLYTO="no-reply@xxx.psu.ac.th"; export EMAIL="IT Department <blah@itdept.xxx.psu.ac.th>"; echo "Hello World" | mutt -s "This is Subject" -a test.txt -- kanakorn.h@psu.ac.th

  • บันทึกการสร้าง LVM Partition

    เนื่องจากมี disk ขนาดแค่ 560 GB หลายลูก แต่ต้องการเอามารวมกันให้เป็น Volume ใหญ่ๆ และไม่ใช้ RAID
    เขียนเป็นบันทึกเก็บไว้ จึงอยากเอามานำเสนอ เผื่อเป็นประโยชน์

    1. มี /dev/sdb , /dev/sdc , /dev/sdd ก้อนละ 560 GB อยู่ ต้องทำ LVM

    เป้าหมายคือ ต้องการได้ Device สำหรับการ mount ชื่อ /dev/virtual1/logical1

    reference:
    http://www.howtoforge.com/linux_lvm
    http://www.linuxquestions.org/questions/linux-hardware-18/lvcreate-with-max-size-available-749253/
    2. ติดตั้ง lvm software ด้วยคำสั่ง

    apt-get install lvm2 dmsetup mdadm reiserfsprogs xfsprogs

    3. สร้าง partition ใน physical disk ให้เป็นของ LVM Partition

    sudo su
    fdisk /dev/sdb
    Command (m for help): n
    Partition type: p
    Partition number (1-4, default 1): 1
    First sector (2048-1073741823, default 2048):
    Last sector, +sectors or +size{K,M,G} (2048-1073741823, default 1073741823):
    Command (m for help): t
    Hex code (type L to list codes): 8e
    Command (m for help): w

    ทำเช่นเดียวกับกับทั้ง /dev/sdc, /dev/sdd

    4. ต่อไป สร้าง Physical Volume ของ LVM
    pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
    pvdisplay

    5. ต่อไป สร้าง Group Volume ของ LVM
    vgcreate virtual1 /dev/sdb1 /dev/sdc1 /dev/sdd1
    vgdisplay
    vgscan

    6. ต่อไป สร้าง Logical Volume ของ LVM (เต็มพื้นที่ที่มี)
    lvcreate --name logical1 -l 100%Free virtual1
    lvdisplay
    lvscan

    7. ต่อไป สร้าง Filesystem แบบ ext4
    mkfs.ext4 /dev/virtual1/logical1

    8. แก้ fstab แล้ว mount
    vi /etc/fstab
    /dev/virtual1/logical1 /var/spool/mailbackup ext4 rw,noatime 0 0
    mount -a

  • elvisnox: text is invisible in black background xterm

    *Ubuntu 13.04 แก้ปัญหานี้แล้วครับ

    หลังจากเข้าร่วม ติว “VirtualBox Networking + vi + Shell Scripts” ก็ติดใจใช้แต่ elvis (elvis เป็น vi editor ชนิดหนึ่ง http://fivedots.coe.psu.ac.th/~cj/LUG/vi.pdf สามารถติดตั้งเพิ่มโดยใช้คำสั่ง

    $sudo apt-get install elvis

    ซึ่งเมื่อติดตั้งแล้ว elvis จะกลายเป็น default editor ทันที ดูได้จากคำสั่ง

    $sudo update-alternative --config editor

    ดังรูป
    Selection_003 )

    มาโดยตลอด ติดอยู่อย่างเดียวคือ เมื่อติดตั้งแล้ว เมื่อเปิด vi ขึ้นมาพบว่าหน้าจอเป็นสีดำทั้งหมด Angry
    Screenshot from 2013-04-17 13:37:57

    ก็ต้องมาเปลี่ยนสีของ terminal เพื่อให้อ่านออกเป็นแบบนี้

    Screenshot from 2013-04-17 13:46:52

    อีกวิธีไม่ต้องแก้สีของโปรไฟล์ คือ แก้ค่าในแฟ้ม /etc/elvis/elvis.clr

    $sudo vi /etc/elvis/elvis.clr

    ให้มองหาข้อความ case termcap { แล้วแก้ตรงบรรทัดที่เขียนว่า color normal yellow or black เป็น color normal yellow on black เซฟแล้วลองเรียก vi ใหม่ได้ผลดังนี้

    Screenshot from 2013-04-17 13:49:40

    สงสัยจะใส่ค่า config ผิดตั้งแต่ตัวติดตั้ง What?! ขอให้สนุกครับ

    ที่มา http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=474202

  • Recovering Files From ecryptfs Encrypted Home

    ผมเจอปัญหาว่ามีเครื่องเสีย ผมต้องเข้าไปช่วยกู้ข้อมูลในดิสก์ที่เสีย แต่ก็พบว่า home directory ได้ทำ encrypt ไว้ในตอนติดตั้ง ubuntu 10.04 desktop ผมจึงค้นหาดูพบหลายบทความ แต่มาลงตัวที่บทความนี้ http://www.kaijanmaki.net/2009/10/26/recovering-files-from-ecryptfs-encrypted-home/ เป็นจุดเริ่มต้นให้ลองทำตามดู

    ผมทำ Virtual Machine เป็น guest ใน Oracle VM VirtualBox โดยติดตั้ง ubuntu 10.04 desktop (จะลองกับ 12.04 หรืออื่นๆก็คงได้) แล้วลองสร้างไฟล์ test.txt, test2.txt จากนั้น shutdown เครื่อง guest แล้วบูตอีกทีด้วยไฟล์ ubuntu-10.04.4-desktop-i386.iso แล้วเลือก Try ubuntu

    เมื่อเข้าถึงหน้ากราฟิกแล้ว คลิกเมนู places, เลือก disk ที่ต้องการ จากนั้นเปิด terminal เพื่อออกไปทำงานในโหมด command line

    ใช้คำสั่ง df ดูจะเห็นว่าดิสก์ถูก mount เป็นชื่อ ดังนี้

    /dev/sda1 /media/c460e698-ae7a-478e-a9fa-7ea4beb4f7c6

    ให้เข้าทำงานเป็น root

    ubuntu@ubuntu:~$ sudo su

    ลองตรวจสอบดูว่ามีอะไรอยู่ข้างในบ้างด้วยคำสั่งข้างล่างนี้

    root@ubuntu:~# ls -l /media/c460e698-ae7a-478e-a9fa-7ea4beb4f7c6/home/mama/
     total 0
     lrwxrwxrwx 1 1000 1000 56 2013-04-10 08:52 Access-Your-Private-Data.desktop -> /usr/share/ecryptfs-utils/ecryptfs-mount-private.desktop
     lrwxrwxrwx 1 1000 1000 52 2013-04-10 08:52 README.txt -> /usr/share/ecryptfs-utils/ecryptfs-mount-private.txt

    ตรวจสอบดูว่าไฟล์ต่างๆ น่าจะซ่อนอยู่ที่ไหนก็พบว่าอยู่ที่นี่

    root@ubuntu:~# ls -l /media/c460e698-ae7a-478e-a9fa-7ea4beb4f7c6/home/.ecryptfs/mama/.Private/
     total 276
     -rw-r--r-- 1 1000 1000 12288 2013-04-10 09:10 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmC1PAe3rM36mt8nRtyRWtxlE--
     drwxr-xr-x 4 1000 1000  4096 2013-04-10 09:06 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmC2Yj-dqfvpHuYFJe32oPmP---
     drwx------ 4 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmC3kM22hNF7litgpIAwtmwtU--
     drwx------ 2 1000 1000  4096 2013-04-10 09:11 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmC7W8YJQSLe20t0XJHf6xjB---
     -rw-r--r-- 1 1000 1000 12288 2013-04-10 08:52 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmC9cPIgv52y7AFWY.H1WCtTE--
     -rw------- 1 1000 1000 12288 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmC9dcmZbWv.pjpzikXKTE2xU--
     lrwxrwxrwx 1 1000 1000   104 2013-04-10 08:52 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmC9u1V-uJOrNxm7ZdoXYvX5E-- -> ECRYPTFS_FNEK_ENCRYPTED.FXaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCGOuByR46pE4zxC1IyPOC1XMuz8uG9d.Y91Nys0NXy1o-
     drwx------ 2 1000 1000  4096 2013-04-10 09:06 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCBinhrU4ijNIOXaDLIUmz6---
     drwxr-xr-x 6 1000 1000  4096 2013-04-10 09:08 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCbQymH7oV5njbGxrao6qK.E--
     drwx------ 2 1000 1000  4096 2013-04-10 09:11 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCcib.jfkdAKRfPUX3SRC3PE--
     drwx------ 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCd8fDbrGkyQn76SLx7OFbWk--
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCf9KXChgI4vRxtQINyM5f2U--
     -rw-r--r-- 1 1000 1000 12288 2013-04-10 09:08 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmC.FSa4ytf8l5gxGoCy5Z.hU--
     -rw-r--r-- 1 1000 1000 12288 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCHD.zza5bDIfbpJCBK20OEk--
     drwx------ 7 1000 1000  4096 2013-04-10 09:11 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCHMmbRJdm8bOuKAIY9l2nNE--
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCI0txn1fN.CnTaplNnnfw-E--
     -rw-r--r-- 1 1000 1000 12288 2013-04-10 09:10 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCinSVUy2qcWnG4Fkkvq3TbE--
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCJCe9LKWs69b5Gm7sz9l8bk--
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCkjHGX5Z.4t2crv-B-HErFE--
     drwx------ 3 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCkL2EHaUs.epFv6xhN2RgnE--
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCNnJ2nY9cMM4vKFU6acxrIE--
     drwx------ 3 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmC-NphMDal80t55pvvVnvyiE--
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCNYJp37Rmr3eJHZWw-yuZiE--
     -rw------- 1 1000 1000 12288 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCRIV.WMwNJ.HPDn2Qm9Is4---
     -rw------- 1 1000 1000 12288 2013-04-10 09:11 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCRqHIvRgijJ2kR4EkiHAV.U--
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCTnsCL.MmBrnuuZJB7rUqu---
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCt-qx19u1J7cqrJdDeAcGXU--
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCtrtmC.5pOzU71mXW9lsBTU--
     -rw-r--r-- 1 1000 1000 12288 2013-04-10 08:52 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCtZB8bfkkrg5Vwn12I0a36k--
     -rw-r--r-- 1 1000 1000 12288 2013-04-10 08:52 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCugEFlA5kzGzGdCrk98SRdk--
     -rw------- 1 1000 1000 12288 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCUvV.UqheVgE8ii35hI1CD---
     drwxr-xr-x 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCwkbU8zR9wlpqaW.qpSOOG---
     -rw-r--r-- 1 1000 1000 12288 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCWmtlLdW3Fscyzdv92P7ya---
     drwx------ 2 1000 1000  4096 2013-04-10 09:05 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCxb3ohG01RPLQKdGf5aGO0k--
     lrwxrwxrwx 1 1000 1000   104 2013-04-10 08:52 ECRYPTFS_FNEK_ENCRYPTED.FWaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCY20y7DesFofU3WXsupOCaU-- -> ECRYPTFS_FNEK_ENCRYPTED.FXaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCHlpTqADLNpd4HnYAdygClBA6cPCLon7WcZ6N6OFCv8g-
     -rw------- 1 1000 1000 12288 2013-04-10 09:11 ECRYPTFS_FNEK_ENCRYPTED.FXaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCpbeOQivGSuvqOu51OftghDjzC0ltpVNARnFgkWRBi-2-
     -rw------- 1 1000 1000 12288 2013-04-10 09:11 ECRYPTFS_FNEK_ENCRYPTED.FXaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCpmXGVsVsyK8V95y22w4vq88Zp17vcB8FLxmDpAeLfzM-
     -rw-r--r-- 1 1000 1000 12288 2013-04-10 08:52 ECRYPTFS_FNEK_ENCRYPTED.FXaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCpmXGVsVsyK8V95y22w4vqAzU.HY0GIf1CP9WH.239TU-
     drwx------ 2 1000 1000  4096 2013-04-10 09:09 ECRYPTFS_FNEK_ENCRYPTED.FXaiRtz3Ag4mTURWaW1nT.6mYpw-PkyvsXmCpmXGVsVsyK8V95y22w4vq-Qwp5WNWvevyfXuTlIfkN2-

    เข้าสู่ขั้นตอนการกู้ข้อมูล โดยสร้างไดเรกทอรีใน /mnt ดังนี้

    root@ubuntu:/home/ubuntu# cd /mnt
    root@ubuntu:/mnt# mkdir oldhome
    root@ubuntu:/mnt# ln -s /media/c460e698-ae7a-478e-a9fa-7ea4beb4f7c6/home/.ecryptfs/mama/.Private oldprivate

    ตรวจสอบดูว่าได้ผลตามต้องการ

    root@ubuntu:/mnt# ls -l /mnt
    total 12
    drwx------ 24 mama mama 4096 2013-04-10 16:11 oldhome
    lrwxrwxrwx  1 root root   72 2013-04-10 20:51 oldprivate -> /media/c460e698-ae7a-478e-a9fa-7ea4beb4f7c6/home/.ecryptfs/mama/.Private

    เราจะต้องเข้าไปสร้าง passphase จากรหัสผ่านของบัญชีผู้ใช้งาน ในที่นี่คือ username ชื่อ mama มีรหัสผ่าน 123456 โดยการเข้าไปใช้คำสั่ง ecryptfs-unwrap-passphrase กับไฟล์ wrapped-passphrase ซึ่งตามความเป็นจริง เราจะต้องรู้ passphase ยาวๆนี้อยู่แล้ว แต่ไม่รู้ก็ไม่เป็นไร

    เข้าไปไดเรกทอรีเพื่อจะได้ไม่ต้องพิมพ์คำสั่งยาวๆ

    root@ubuntu:/mnt# cd /media/c460e698-ae7a-478e-a9fa-7ea4beb4f7c6/home/

    ใช้คำสั่งเพื่อสร้าง passphase

    root@ubuntu:/media/c460e698-ae7a-478e-a9fa-7ea4beb4f7c6/home# ecryptfs-unwrap-passphrase .ecryptfs/mama/.ecryptfs/wrapped-passphrase
    Passphrase: 123456

    ตรงนี้ใส่รหัสผ่านของ username ที่มี home directory encrypted คือ mama มีรหัสผ่าน 123456 ไว้

    ได้ผลคือได้ passphase ยาวๆ ออกมา ซึ่งจะถูกนำไปใช้ต่อไป

    44dcd2be32726c9925eb2403e295aa2e

    ออกจากไดเรกทอรี

    root@ubuntu:/media/c460e698-ae7a-478e-a9fa-7ea4beb4f7c6/home# cd

    ตอนนี้จะมีการถาม passphase อีก หากใช้วิธี copy และ paste ได้จะสะดวกกว่าคีย์ทั้งหมดทีละตัว

    root@ubuntu:~# ecryptfs-add-passphrase --fnek
    Passphrase: ใส่ 44dcd2be32726c9925eb2403e295aa2e ที่ได้มา

    ได้ผลลัพธ์

    Inserted auth tok with sig [f09d3c0aedc95c7b] into the user session keyring
    Inserted auth tok with sig [ae779fc532c1b27e] into the user session keyring

    เราจะใช้ค่า ae779fc532c1b27e ในขั้นตอนต่อไป

    root@ubuntu:~# mount -t ecryptfs /mnt/oldprivate /mnt/oldhome
    Passphrase: ใส่ 44dcd2be32726c9925eb2403e295aa2e ที่ได้มา
    Select cipher:
    1) aes: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
    2) blowfish: blocksize = 16; min keysize = 16; max keysize = 56 (not loaded)
    3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 (not loaded)
    4) twofish: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
    5) cast6: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
    6) cast5: blocksize = 8; min keysize = 5; max keysize = 16 (not loaded)
    Selection [aes]: กด Enter
    Select key bytes:
    1) 16
    2) 32
    3) 24
    Selection [16]:  กด Enter
    Enable plaintext passthrough (y/n) [n]: n
    Enable filename encryption (y/n) [n]: y
    Filename Encryption Key (FNEK) Signature [f09d3c0aedc95c7b]: ae779fc532c1b27e ใส่ค่านี้
    Attempting to mount with the following options:
    ecryptfs_unlink_sigs
    ecryptfs_fnek_sig=ae779fc532c1b27e
    ecryptfs_key_bytes=16
    ecryptfs_cipher=aes
    ecryptfs_sig=f09d3c0aedc95c7b
    WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt],
    it looks like you have never mounted with this key
    before. This could mean that you have typed your
    passphrase wrong.
    
    Would you like to proceed with the mount (yes/no)? : yes
    Would you like to append sig [f09d3c0aedc95c7b] to
    [/root/.ecryptfs/sig-cache.txt]
    in order to avoid this warning in the future (yes/no)? : no
    Not adding sig to user sig cache file; continuing with mount.
    Mounted eCryptfs

    หากได้บรรทัด Mounted eCryptfs ก็ไชโยได้ แต่ถ้าไม่สำเร็จจะฟ้องเป็น error ก็เพราะระบุตำแหน่ง directory ที่มีไฟล์ encrypted ไม่ถูกต้องในขั้นตอนแรกๆ ที่เป็นคำสั่ง ln -s

    หากทำสำเร็จ เราลอง ใช้คำสั่งดูรายชื่อไฟล์

    root@ubuntu:~# ls -l /mnt/oldhome/
    total 80
    drwxr-xr-x 2 mama mama 4096 2013-04-10 16:05 Desktop
    drwxr-xr-x 2 mama mama 4096 2013-04-10 16:05 Documents
    drwxr-xr-x 2 mama mama 4096 2013-04-10 16:05 Downloads
    -rw-r--r-- 1 mama mama  179 2013-04-10 15:52 examples.desktop
    drwxr-xr-x 2 mama mama 4096 2013-04-10 16:05 Music
    -rw-r--r-- 1 mama mama   33 2013-04-10 16:08 mypassphase
    drwxr-xr-x 2 mama mama 4096 2013-04-10 16:05 Pictures
    drwxr-xr-x 2 mama mama 4096 2013-04-10 16:05 Public
    drwxr-xr-x 2 mama mama 4096 2013-04-10 16:05 Templates
    -rw-r--r-- 1 mama mama   16 2013-04-10 16:10 test2.txt
    -rw-r--r-- 1 mama mama   15 2013-04-10 16:10 test.txt
    drwxr-xr-x 2 mama mama 4096 2013-04-10 16:05 Videos

    จะเห็นไฟล์ตามปกติ ซึ่งมีไฟล์ที่ผมสร้างไว้คือ test.txt และ test2.txt

    ผมเคยเก็บ passphase ไว้เพื่อเปรียบเทียบ ซึ่งก็ตรงกับที่เราสร้าง passphase ในขั้นตอนด้านบนจากรหัสผ่านของ username mama

    root@ubuntu:~# cat /mnt/oldhome/mypassphase
    44dcd2be32726c9925eb2403e295aa2e

    ถึงตอนนี้ หากเป็นการกู้ข้อมูล ก็ทำการคัดลอกไฟล์ตามสะดวก

    เมื่อคัดลอกไฟล์ที่ต้องการแล้ว ก็ทำการ unmount เพื่อเลิกใช้ดิสก์นั้น

    root@ubuntu:~# umount /mnt/oldhome

    หวังว่าคงเป็นประโยชน์สำหรับ ใครที่บังเอิญติดตั้งแบบ encrypted home directory เอาไว้ แล้ววันหนึ่งต้องกู้ข้อมูล หรือใครจะลองทำดูก็ได้นะ

    หากโชคดีไฟล์ wrapped-passphrase ไม่เสียหาย ก็จะทำได้สำเร็จครับ

  • แนวทางการ Backup บน Ubuntu Server (กรณีระบบ PSU EMail)

    เนื่องจากจะจัดทำระบบ Backup and Recovery ระบบ Mail ซึ่งทำงานอยู่บน Ubuntu จึงทำการรบรวมข้อมูล และหาแนวทางที่เหมาะสม

     

    ก่อนจะตัดสินใจเลือก แผนการ Backup ที่เหมาะสม ก็ควรพิจารณาเรื่องต่อไปนี้ด้วย [1]

    1. WHY: จุดประสงค์การ Backup/Restore, ถ้าข้อมูลสูญหายจริงๆจะเกิดความเสียหายขนาดไหน ?

    2. WHAT: สิ่งที่จะทำการ Backup, ทั้ง Hard Drive? หรือเป็นข้อมูลบางส่วน?

    3. WHEN: เวลาที่ดีที่สุดที่จะ Backup, บ่อยขนาดไหน, จะทำการ Full/Incremental Backup เมื่อใดบ้าง ?

    4. WHERE: เก็บ Backup ไว้ที่ใด, ในเครื่องนั้นๆ, เก็บไว้ภายนอก หรือใช้บริการ Cloud Storage

    5. MEDIUM: สื่อที่ใช้จัดเก็บ, USB Stick, External HDD, Tape หรือ Backup Server

     

    ประเภทของการ Backup [1]

    1. Full: สำรองทุกสิ่งอย่าง

    2. Incremental: สำรองเฉพาะสิ่งที่เพิ่มขึ้นมา นับจากการสำรองครั้งล่าสุด

    3. Differential:  เหมือนกับ Incremental แต่เก็บเฉพาะไฟล์ที่ยังไม่ปรับค่า Archive bit (ในกรณี Windows Filesystem)

     

    วิธีการ Backup : จากการสำรวจ พบว่าบน Ubuntu มีเครื่องมือ และวิธีการให้ใช้มากมาย เช่น SimpleBackupSuite, grsync, pybackpack หรือที่ติดมาพร้อมกับ Ubuntu Desktop อย่าง Déjà Dup [1] แต่เครื่องมือเหล่านี้เหมาะสำหรับการใช้งานแบบ Desktop Computer มากกว่า แต่ในระบบ Mail Server ซึ่งมีปริมาณข้อมูลจำนวนมาก และเป็นของผู้ใช้จำนวนมาก (ในระบบมีผู้ใช้รวม 6000 คน) จึงควรต้องมีการทำงานที่ยืดหยุ่นกว่า และสามารถปรับแต่งตามต้องการได้

    จึงพิจารณาใช้ tar เพื่อทำการ Full [2] และ Incremental Backup [3] แล้วจึงใช้ rsync ส่งไฟล์ไปเก็บไว้ที่ Backup Server ต่อไป

     

    ในกรณี PSU Email มีลักษณะดังนี้

    1. เก็บ email แต่ละฉบับเป็นแบบไฟล์ ไฟล์ขนาดเล็กๆ

    2. ไม่มีการเขียนทับไฟล์เดิม (เว้นแต่ Index ของ Mailbox ซึ่งไม่จำเป็นนัก เพราะ ต้อง rebuild ใหม่เมื่อทำการ restore)

    3. เมื่อมี email ใหม่เข้ามา จะทำการสร้างไฟล์ใหม่ โดยแต่ละไฟล์จะเป็นตัวเลข เพิ่มขึ้นเรื่อยๆ ไม่ซ้ำเดิมแน่นอน

    4. เมื่อผู้ใช้สามารถ สร้าง และ rename ชื่อ directory ได้
    พิจารณาคำถามข้างต้น แล้วให้ตำตอบ

    WHY: เพื่อสำรอง email ไว้ให้ ในกรณีฉุกเฉินที่ผู้ใช้ลบ email ไปโดยไม่ตั้งใจ

    WHAT: email อยู่บน disk แยกออกไป, ทำการสำรองเฉพาะไฟล์ใน directory จัดเก็บ ซึ่งใช้เนื้อที่รวม 600 GB ซึ่งเป็นของผู้ใช้ในระบบ 6,000 คน, ข้อมูลมีลักษณะเป็นไฟล์ขนาดเล็กจำนวนมาก และมีการเพิ่มและลดจำนวน แต่ไม่มีการแก้ไขไฟล์, มีการเพิ่ม/ลบ/เปลี่ยนชื่อ directory

    WHEN: จากสถิติการใช้งาน พบว่า ผู้ใช้ใช้งานน้อยที่สุดหลังเวลา 03:00 ของทุกวัน และในวันอาทิตย์เป็นวันที่มีปริมาณการใช้งานน้อยที่สุด และจากการย้ายระบบครั้งล่าสุด พบว่าการทำ Full Backup ใช้เวลา 16 ชั่วโมง ส่วนการทำ Incremental Backup ประจำวัน ใช้เวลาประมาณ 1 ชั่วโมง จึงเลือกสำรองแบบ Full ทุกวันอาทิตย์ เริ่มเวลา 00:01 และทำ Incremental ในวันจันทร์ ถึงเสาร์ เริ่มเวลา 03:01

    WHERE: เนื่องจากในอนาคตวางแผนจะปรับเป็นระบบ Distributed Mailbox จึงวางระบบให้ Backup เก็บไว้ในเครื่องก่อน แล้วใช้ rsync ไปเก็บไว้ใน Backup Server แล้วมีระบบย้ายข้อมูลเก่า ลงไปเก็บใน External HDD เพื่อสำรองไว้ในระยะยาวได้

    MEDIUM: สำรองลงใน Local Disk ก่อน แล้ว rsync ไปลงใน Backup Server จากนั้นย้ายลง External HDD

     

    แนวทางการ Backup ที่เลือกใช้สำหรับ PSU Email (เป็นเพียงตัวอย่าง)

    1. การทำ Full Backup : ให้ระบบเข้าไป Backup ข้อมูลใน Mailbox ของผู้ใช้ เป็นรายคน (เช่น username.s) จาก directory /var/spool/mail/ ทุกวันอาทิตย์ เวลา 00:01 โดยเก็บไฟล์ไว้ที่ /path/to/backupfile ด้วยคำสั่ง

    tar -zcf  /path/to/backupfile/username.s-f-20130414.tar.gz -g  /path/to/backupfile/username.s-20130414.snar   /var/spool/mail/username^s/

    2. การทำ Incremental Backup: ทำคล้ายกับ Full Backup แต่ใช้คำสั่งต่อไปนี้ ทุกวันจันทร์ ถึงเสาร์ เวลา 03:01

    tar -zcf  /path/to/backupfile/username.s-i-20130415.tar.gz -g  /path/to/backupfile/username.s-20130414.snar   /var/spool/mail/username^s/

    3. เมื่อทำครบทุก mailbox จึงทำการ Rsync ไปเก็บไว้ใน Backup Server ต่อไป

     

    Reference

    [1] https://help.ubuntu.com/community/BackupYourSystem

    [2] http://www.gnu.org/software/tar/manual/html_chapter/Backups.html

    [3] http://www.tuxradar.com/content/quick-guide-backups-using-tar

  • InnoDB Storage Engine Data Recovery สำหรับ MySQL database

    ปัญหาของการลืม password ของ root ของ MySQL ไม่ได้เป็นปัญหาเดียวที่ผมเจอ ในเรื่องของการใช้งาน MySQL Database Server ถึงแม้จะไม่บ่อยนัก แต่ก็บ่อยมากพอที่จะทำให้ ใน 2-3 ครั้งให้หลัง ผม “จำ” วิธีการแก้ปัญหาได้ โดยไม่ต้องพึ่งพา google อีกต่อไป

    ถ้าจะว่าไป ถ้าปัญหานี้ เกิดขึ้น “บ่อย” กว่าเดิมอีกซักหน่อย ผมก็คง “จำ” root password ได้ (เพราะต้องใช้บ่อยขึ้น) และส่งผลในทางกลับ ทำให้ ไม่ลืม root password และทำให้ปัญหานี้ไม่ใช่ปัญหาอีกต่อไป — ฟังดูย้อนแย้ง ชวนขยักขย่อน หรือเปล่าครับ 🙂

    แต่ไม่ว่าอย่างไร … การลืม password ในระดับสร้างความหงุดหงิดรำคาญใจแค่นั้นเอง ความรู้สึกอย่างมากก็คือ “ลืมอีกแล้ว ต้องรีเซ็ทพาสเวิร์ดอีกรอบ งี่เง่าจริงๆ!”  แต่มีปัญหาอีกอย่างที่ … ไม่ได้เกิดขึ้นบ่อย … นานๆเกิดที แต่พอเกิดขึ้นมาแล้ว ทำให้ระดับความเครียดของ sysadmin พุ่งขึ้นสูงอย่างฉับพลัน

    ปัญหาแบบที่ว่า เกิดขึ้น ในลักษณะนี้ ครับ นี่คือข้อความทีี่มีอยู่ในไฟล์ “/var/log/mysql/error.log”

    InnoDB: Database was not shut down normally!
    InnoDB: Starting crash recovery.
    InnoDB: Reading tablespace information from the .ibd files...
    InnoDB: Restoring possible half-written data pages from the doublewrite
    InnoDB: buffer...
    InnoDB: Doing recovery: scanned up to log sequence number 7 3581528990
    InnoDB: Error: page 4 log sequence number 7 3581552218
    InnoDB: is in the future! Current system log sequence number 7 3581528990.
    InnoDB: Your database may be corrupt or you may have copied the InnoDB
    InnoDB: tablespace but not the InnoDB log files. See
    InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
    InnoDB: for more information.

    ก่อนที่จะมาถึงที่จุดนี้ อาการของตัว mysql server ก็คือว่า load ของ mysqld ตัว daemon ทำงานอยู่แกว่งอยู่ในช่วง 90-100% อยู่ตลอดเวลา หลังจาก boot เครื่องขึ้นมา และถึงแม้จะไม่มีการใช้งาน mysql server จาก process อื่นๆเลย (ผมทดสอบโดยการ shutdown ตัว web server ซึ่งเป็น client เพียงตัวเดียวที่ใช้งาน mysql server อยู่) ก็ไม่ได้ทำให้ load ของตัว mysqld ลดลง

    หลังจากลองตรวจสอบจาก system log ของระบบ จนไปเจอข้อความข้างบนใน error log ของ mysql เองก็เลยรู้ว่าปัญหาอยู่ที่ ไฟล์ที่บันทึกข้อมูล/transaction ของ MySQL มีปัญหา

    ปัญหานั้นมาจากใหน? ปัญหาเกิดขึ้นจากข้อมูลของ MySQL database ที่ผมได้มานั้น ได้มาจากการ copy (อันที่จริง rsync — แต่นั่นไม่ใช่ประเด็น)  ไฟล์ข้อมูลของ MySQL database ในขณะที่ตัว database server ยังเปิดใช้งานอยู่

    เมื่อมาคิดอีกทีในตอนหลัง วิธีการที่ดีกว่าสำหรับการ copy database มาครั้งนั้น สิ่งที่ควรจะทำก็คือการ dump database โดยใช้คำสั่ง mysqldump แล้วเอาไฟล์ sql ที่ได้จากการ dump อันนั้นมา import กลับเข้า  database อีกทีในตอนหลัง

    แต่จะว่าไปชีวิตของ admin ก็ไม่ง่ายอย่างนั้น ข้อแรกการที่ผมจะ dump ข้อมูลจาก database server ออกมาทั้งหมดได้ ผมจะต้องรู้ root password ของ database server อันนั้น … ถึงแม้ผมจะสามารถใช้สิทธิของ root บนระบบนั้นๆได้ แต่ … ผมไม่รู้ทั้ง root password ของ system และ ไม่รู้ root password ของ mysql ด้วยเหมือนกัน … อ้าว งั้นก็ reset root password ของ mysql เสียก่อนสิ โดยใช้วิธีการที่ผมได้อธิบายไปแล้ว ในบันทึกที่แล้ว … จะมีปัญหาอะไรล่ะ? มีครับ ระบบที่ว่ามีการใช้งานอยู่ตลอดเวลา database server เป็นองค์ประกอบสำคัญ ในขณะนั้นผมไมแน่ใจว่า การที่จะ shutdown และ restart mysql server จะส่งผลกระทบต่อการทำงานของส่วนอื่นๆของระบบอย่างไรบ้าง ถ้า restart ตัว database server แล้ว การทำงานส่วนอื่นๆที่เหลือ จะกลับมาทำงานได้ตามปกติหรือเปล่า? หรือผมจะต้อง restart สซอฟต์วแร์ส่วนอื่นๆที่เกี่ยวข้องด้วย? … ผมไม่มีคำตอบในขณะนั้น และไม่อยากจะเสี่ยงหาคำตอบบนระบบที่มีคนใช้งานอยู่จริง (แบบว่ากล้วน่ะครับ ทำงานเป็น admin มาหลายปี ก็ยังทำใจไม่ได้ครับ)

    ผมมี database อยู่ในมือแล้ว มันมีปัญหา ก็ซ่อมมันสิ … สมมติว่า database ตัวที่ใช้งานจริงมีปัญหาแบบเดียวกัน จะทำยังไง? ก็ต้องหาวิธีการแก้ไขแบบเดียวกันใช่ใหม?

    เอ่อ … อันที่จริง วิธีการที่ดีกว่า สำหรับ ระบบที่ใช้งานอยู่จริงๆ ก็คือ “ป้องกัน” และ “สำรอง” ครับ แต่ในขณะที่ผมยังไม่มี ระบบที่ว่าอยู่ในมือ ก็สมมติเอาก่อนแล้วกันว่า ผมเจอปัญหากับ database พัง แล้วต้องหาวิธีการกู้ database ให้กลับมาใช้งานให้ได้ …

    โอเค, งั้นก็ได้ เริ่มกันเลย ใน error message ของ mysql เองก็มี URL ให้อยู่แล้ว ดีกว่าระบบอื่นๆอีก 2-3 ระบบที่ผมเคยเจอมา นอกเหนือจากจะไม่มีตัวช่วย ที่จะชี้ว่าจะไปหาข้อมูลเพิ่ม เพื่อแก้ปัญหาได้ที่ใหน ข้อมูลเกีี่ยวกับ error ที่แสดงออกมายัง มากเกินความจำเป็น ข้อมูลที่สำคัญที่เกี่ยวกับข้อผิดพลาด ถูกซ่อนเอาไว้ในกองของข้อมูลอื่นที่ไม่เกี่ยวข้อง ที่นอกจากจะไม่ช่วยในการแก้ปัญหาแล้ว ยังช่วยให้หลงทางอีกต่างหาก

    นี่, มี URL ให้แล้ว http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html ก็เปิด web browser ขึ้นมาอ่านเลยสิ

    ถ้าคุณอ่านมาจนถึงบรรทัดนี้แล้ว และจะลอง ตัด/แปะ URL อันที่ว่านี่ใน web browser ดูนะครับ คุณก็จะเจอว่า

    แป่ว … Page Not Found …

    อันนี้ ไม่ใช่ว่า MySQL version 5.1 มันจะเก่าจนเกินไปนะครับ เพราะถ้าลองหาอย่างอื่นดู ในส่วนของ reference/manual ก็จะหาเจอ แต่ว่า ส่วนของ forcing-recovery สำหรับ InnoDB Engine อันที่จริงแล้ว อยู่ที่นี่ครับ

    http://dev.mysql.com/doc/refman/5.1/en/forcing-innodb-recovery.html

    มี bug อยู่ใน error message ของ MySQL ครับ

    แต่ถึงกระนั้น หลังจากลองทำตามดูตามคำแนะนำ ใน page ที่ว่านี่แล้ว (ปรับค่า innodb_force_recovery ขึ้นไปเรื่อยๆ แล้ว restart mysql ดู) ก็ยังมีปัญหาอย่างเดิม ยังไม่สามารถแก้ปัญหาได้

    อาจจะเป็นกรณีที่โชคยังดีอยู่บ้าง ตรงที่ว่า ถึงแม้จะมี error เกิดขึ้นแต่ตัว server ก็ยังทำงานได้ และรับการติดต่อจากตัว mysql client แสดงว่าส่วนของฐานข้อมูลที่มีปัญหา “น่าจะ” (ผมเดาเอา) ยังไม่ร้ายแรงมาก เมื่อลอง query ข้อมูลดูบางส่วนก็ปรากฏว่ายังใช้งานได้ หลังจากลองทำตามคำแนะนำใน mysql document เองแล้วงยังไม่ work หาอ่านคำแนะนำจากที่อื่น มีคำแนะนำให้ dump database ออกมา แล้วค่อยใส่กลับเข้าไปใหม่ ผมก็เลยลองดู …

    ปรากฏว่า วิธีการนี้สามารถใช้งานได้ มีขั้นตอนที่ผมลองผิดลองถูกเพิ่มขึ้นอีกหน่อยนึง ถึงจะทำให้ database กลับมาใช้งานได้ ก็เลยคิดว่าจะเอามาบันทึกไว้ที่นี่

    โดยสรุป: ผมยังไม่รู้วิธีการที่จะแก้ปัญหาทั้งหมดนะครับ สมมติว่า ถ้า database เกิดพังมากกว่านี้ วิธีการนี้ก็อาจจะใช้งานไม่ได้ (ผมเคยลองพัง database ที่ใช้ InnoDB engine แล้ว ปรากฏว่า mysqld ไม่สามารถ start ขึ้นมาทำงานได้ … ซึ่งถ้าเป้นกรณีนั้น วิธีการที่ผมจะพูดถึงก็ไม่มีประโยชน์อะไรเหมือนกัน) แต่ถ้ามันอาการแย่กว่า แบบที่ document ของ MySQL แนะนำเอาไว้แล้ว ทำตามแล้วยังมีปัญหาอยู่ วิธีการนี้ก็อาจจะมีประโยชน์อยู่บ้างในบางระดับ … ผมหวังเอาไว้อย่างนั้นนะครับ

    โดยหลักแล้วก็คือ การ dump database ออกมาเป็น sql file แล้วก็ import กลับเข้าไปแค่นั้นเองครับ … ในกรณีนี้ ผมยังไม่รู้ root password ของ mysql และ ผมจะเปลี่ยนมันทหลัง แต่ในตอนนี้ผมต้องการให้ database ทั้งหมดถูกต้อง และ mysql server กลับมาทำงานได้ โดย load ไม่ได้อยู่ที่ 90-100% ตลอดเวลาก่อน

    ขั้นตอน

    $ sudo service mysql stop
    $ sudo /usr/sbin/mysqld --skip-grant-tables &
    $ MYPID=$!
    $ mysqldump --all-databases > all.sql
    $ sudo kill -QUIT $MYPID

    เพื่อที่จะให้สามารถ dump database ได้ โดยที่ผมไม่รู้ root password ผมก็ต้องให้ mysql ทำงานใน mode ที่ไม่ตรวจสอบ privileges โดยการใช้ option “–skip-grant-tables” ซึ่งหลังจากนั้น ก็จะทำให้ผมใช้คำสั่ง mysqldump สำหรับ dump database ได้ เมื่อใช้ option –all-databases ก็จะเป็นการ dump ทุกๆ database ที่มีอยู่ และเก็บลงในไฟล์ชื่อ all.sql

    หลังจาก dump เสร็จก็ terminate mysqld process โดยการส่ง SIGQUIT signal ให้กับ process ของ mysqld

    หลังจากนี้ เพื่อที่จะเก็บ ข้อมูลเดิมทั้งหมดเอาไว้ก่อน ผมก็จะย้าย directory ที่เก็บข้อมูลของ mysql ไปเก็บไว้ในชื่อ mysql.0 และสร้าง directory สำหรับ mysql ขึ้นมาใหม่ โดยการใช้คำสั่งต่อไปนี้ครับ

    $ sudo mv /var/lib/mysql /var/lib/mysql.0
    $ sudo mkdir /var/lib/mysql
    $ sudo chown mysql:mysql /var/lib/mysql
    $ sudo chmod 700 /var/lib/mysql

    หลังจากนั้นก็จะเป็นการ import ข้อมูลของ mysql กลับเข้าไป ซึ่งก็ต้อง start mysql server กลับขึ้นมาอีกรอบ และให้มันสร้างไฟล์อื่นๆที่จำเป็นใน mysql directory

    $ sudo /usr/sbin/mysqld --skip-grant-tables &
    $ MYPID=$!
    $ mysql < all.sql
    $ sudo kill -QUIT $MYPID
    
    

    ถึงขั้นตอนนี้ database ที่เรา dump ออกมาในตอนแรกก็ถูก import กลับเขาไปใน database อีกครั้ง รวมทั้ง privileges และ password ทั้งหมดด้วย ซึ่งเราสามารถใช้คำสั่ง

    $ sudo service mysql start

    เพื่อให้ database กลับมาทำงานตามปกติ

    ซึ่งในกรณีของผม ตัว database สามารถกลับมาทำงานได้ load ของ mysqld กลับเข้าสู่สภาวะปกติ (เข้าใกล้ 0 เมื่อไม่มีการใช้งาน) ไม่มีข้อความแสดง error ในไฟล์ /var/log/mysql/error.log จะมีแต่ข้อความแสดงการทำงานตามปกติ) และตัว application ที่ใช้งาน database ใช้งานได้อย่างถูกต้อง

    ผมอาจจะแค่โชคดี สำหรับการซ่อมแซม database ที่พังเสียหายในกรณีนี้ แต่คิดว่าบันทึกในสิ่งที่ทำไว้ ก็อาจจะมีประโยชน์สำหรับคนที่อาจจะเจอเหตุการณ์แบบเดียวกันครับ