New HDD upgrade (120GB => 500GB)

เนื่องจากช่วงอาทิตย์ที่แล้ว ได้รับเชิญเข้าร่วมงานประชุมระดมสมองเชิงปฏิบัติการ "การพัฒนาภาษาไทยในซอฟต์แวร์โอเพนซอร์ส" ซึ่งทาง NECTEC เป็นผู้จัด สถานที่จัดงานคือ เป็นรีสอร์ทในจังหวัดนครราชสีมา ก่อนจะไปร่วมงานได้เสาะหา HDD 500GB 7200rpm ซึ่งทางร้านได้สั่งมาให้แบบไม่ทันตั้งตัว จึงจัดงบไปสอยมาโดยเร็ว พร้อมกับคิดไปพร้อมว่าจะย้ายข้อมูลจากก้อนเดิม (120GB) มาก้อนใหม่ (500GB) ยังไงดี

คืนแรกที่ได้ HDD มา ซึ่งได้สอย Enclosure USB2.0 มาด้วย ได้พยายามดึงข้อมูลจากก้อนเดิม (sda) ไปก้อนใหม่ (sdb) ด้วยคำสั่งอันทรงพลัง

# dd if=/dev/sda of=/dev/sdb

ด้วยความเร็ว 4 - 5 MB/s ไม่ได้จับเวลาแน่นอน แต่ทำไว้ก่อนนอน ตื่นมาก็เห็นว่าหยุดส่งข้อมูลแล้ว จัดแจงเปลี่ยนถ่ายก้อนใหม่เข้าสู่เครื่องด้วยประสบการณ์ในการบำรุงรักษาพัดลม CPU เมื่อคราวก่อน (Vaseline Fix) ไม่มีอะไรยุ่งยาก ผลที่ได้คือ boot เข้ามาปกติ ยิ้มในใจว่ารอดแล้ว

คิดการถัดไปคือ ขยาย partition เพื่อใช้เนื้อที่ที่เหลือ แต่ต้องตกใจ เมื่อสั่ง

# fdisk /dev/sda -l
...
...
Partition 1 does not start on physical sector boundary
...
...

จริง ๆ ก็ไม่ใช่ครั้งแรกที่เจอปัญหานี้ แต่ต่างตรงที่ว่า คราวแรกที่เจอตอนไปร่วมงาน NLC ที่ NECTEC ที่จำเป็นต้อง clone disk ในคราวนั้นไม่ได้ติดใจอะไร เนื่องจากทาง NECTEC ได้เตรียมต้นฉบับใหม่อีกรอบ เลยไม่ได้ติดใจอะไรมากมาย แต่พอมาเจอกับตัวเองคราวนี้ ต้องออกแรงหาสาเหตุ และในที่สุดก็พบสาเหตุ คือ HDD สองก้อนมี Physical Sector ไม่เท่ากัน คือ

120 GB:

# fdisk /dev/sda -l
...
...
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
...
...

500 GB:

# fdisk /dev/sda -l
...
...
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
...
...

จึงเป็นประเด็นที่ทำให้เกิดปัญหาว่า เราไม่สามารถจะ clone partition table จากก้อนเดิม มาก้อนใหม่ได้ตรง ๆ การรอคอยทั้งคืนที่ผ่านมาไม่เกิดผลอะไรเลย T_T

นั่งคิดหาวิธีการ กับเจ้าดิว เนื่องจากสิ่งที่เป็นอุปสรรคคือ "เวลา" เนื่องจากมีกำหนดการเดินทางไป ขอนแก่น ตอนบ่าย ดังนั้นจึงเหลือเวลาให้ดำเนินการไม่เกิน 3 ชั่วโมงครึ่ง สิ่งที่เราคิดกันได้คือ ถ้าใช้ USB ในการ clone เราจะทำ speed ไม่ได้แน่ ๆ และอีกอย่างคือ เมื่อนำ HDD ต่อกับ enclosure เราจะได้ Physical Sector size แค่ 512 Bytes เท่านั้น ซึ่งไม่ถูกต้องอยู่ดี หลังจากคิดกันสักครู่เราก็ได้ solution ดังนี้คือ

  • นำ HDD ทั้งสองลูก (120GB/500GB) ต่อเข้าเครื่อง Notebook เครื่องละลูก
  • จัดการสร้าง partition ในสภาวะที่เครื่องรู้จัก Physical Sector size เป็น 4096 Bytes โดยในส่วนของ partition ที่จะไม่มีการขยายจะกำหนด จำนวน sector ให้เท่ากับต้นฉบับ
    ข้อมูล partition ดูได้ด้วยคำสั่งที่เครื่อง 120 GB
    # sfdisk -d /dev/sda
    
    # partition table of /dev/sda
    unit: sectors
    
    /dev/sda1 : start=     2048, size=  1959868, Id=83
    /dev/sda2 : start=  1961984, size= 97659136, Id=83
    ...
    ...
  • หลังจากกำหนด partition เพื่อให้ได้ขนาดตาม HDD ก้อนเดิม และเพิ่มขนาดให้ใหญ่ขึ้นในส่วนที่ต้องการขยายใน HDD ก้อนใหม่แล้ว จึงเริ่มทำการคัดลอกข้อมูล คราวนี้เราส่งข้อมูลผ่าน Gigabit Ethernet โดยใช้ Swiss Army Knife อย่าง netcat
    500 GB:
    # nc -l 192.168.100.1 2222 > /dev/sda1
    

    120GB:

    # nc 192.168.100.1 2222 < /dev/sda1
    

    และทำเช่นเดียวกัน กับ sda2, sda3 ส่วน sda4 ซึ่งเป็น swap ตัดสินใจจะสร้างใหม่เลย ตามคำแนะนำของ madduct (http://madduck.net/docs/cryptdisk/) ซึ่งผมก็ใช้วิธีนี้ในการทำ cryptdisk ตั้งแต่คราวแรก

ความเร็วที่ได้อยู่ราว ๆ 30 MB/s ซึ่งเพิ่มจากเดิมราว ๆ 6 เท่า และคำนวณเวลาคร่าว ๆ ก็พบว่าความเร็วนี้ สามารถที่จะทำให้เสร็จภายในกรอบเวลาคือ 3 ชั่วโมงครึ่ง

หลังจากถ่ายข้อมูลเรียบร้อย สิ่งที่ต้องทำเพิ่มคือ ติดตั้ง GRUB โดยต้องพึ่ง Debian Installer เพื่อจะเข้าสู่โหมด Rescue และ chroot เข้าไปยัง root ของ HDD และติดตั้ง GRUB

เนื่องจากเครื่องผมทำ Encryption File System ไว้ ทำให้ติดปัญหาว่า หลังจากติดตั้ง GRUB แล้ว ถอดรหัส HDD แล้วก็ยัง boot ไม่ขึ้น ต้องทำการ update-initramfs อีกครั้งจึง boot ได้ปกติ และตอนนี้ fdisk ก็ไม่แจ้ง warning แล้ว

# fdisk /dev/sda -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xe9dbfc26

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     1961915      979934   83  Linux
/dev/sda2         1961984    99621119    48829568   83  Linux
/dev/sda3        99622912   959782911   430080000   83  Linux
/dev/sda4       959782912   976773119     8495104   83  Linux

หลังจากมั่นใจแล้วว่า fdisk ไม่แจ้ง warning ก็ใช้ Debian Installer เพื่อเข้า rescue mode อีกครั้ง เพื่อที่จะขยาย partition

# cryptsetup resize sda3_crypt
# e2fsck -f /dev/mapper/sda3_crypt
# resize2fs /dev/mapper/sda3_crypt

เป็นอันเรียบร้อย ไม่ต้องติดตั้ง Debian และจัดการระบบใหม่ ผมได้ระบบเหมือนเดิมทุกอย่าง พร้อมพื้นที่ที่เพิ่มขึ้น :)

Happy Hacking!