ป้ายกำกับ

วันอาทิตย์ที่ 20 พฤษภาคม พ.ศ. 2555

เทคนิการแก้ไข image ไฟล์ของ Linux

Ubuntu 12.04 LTS ได้ถูกปล่อยออกมาแล้ว ผมก็เลยได้มีโอกาสทดลองติดตั้ง Private Cloud ดู แต่ปรากฏว่ายังติดปัญหาอยู่หลายเรื่อง แต่วันนี้ไม่ได้มาเล่าถึงปัญหาของการทำ Cloud หรอกนะครับ เพราะผมเองก็ยังแก้ปัญหานั้นยังไม่ได้ แต่อยากจะเล่าเทคนิคเล็กๆน้อยๆ สำหรับบันทึกไว้เตือนความจำตัวเองด้วย และอาจจะมีบางคนได้ใช้ประโยชน์

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

ปัญหาที่ผมเจอตอนนี้ คือ image ไฟล์ที่เขาสร้างไว้นั้น ยังมีบั๊กอยู่ ทำให้การติดตั้ง Cloud สะดุด ไม่สามารถติดตั้งโหนดลูกได้สมบูรณ์ เขาแนะนำว่าต้องเพิ่มโปรแกรมบางอย่างลงไป ซึ่งตอนนี้ถ้าเรารอได้ ก็รอให้เขาทำ image ไฟล์ตัวใหม่ออกมา แล้วเราก็แค่ update แต่ถ้ารอไม่ได้ก็ต้องทำ image ไฟล์ใหม่เอง ตามขั้นตอนที่เขาแนะนำ
ผมก็เลยทำตามขั้นตอนที่เขาแนะนำ และก็เลยคิดว่าควรจะบันทึกวิธีการหลักๆไว้ เพราะมีประโยชน์ในการนำไปใช้แก้ไข Firmware ต่างๆของเครื่องที่ใช้ระบบ Linux เช่น Firmware ของ Android เป็นต้น

หมายเหตุ: ขั้นตอนต่อไปนี้อาจจะต้องใช้สิทธิ์ของ root ในการสั่งงาน

ขั้นตอนแรก คือ mount image ไฟล์นั้นๆเข้ามาก่อน เช่น สมมติว่าเรามีไฟล์อยู่ที่ /home/test/amd64-boot.img อาจจะสั่ง mount ไปไว้ที่ /mnt ดังนี้
mount /home/test/amd64-boot.img /mnt

จากนั้น ใช้คำสั่ง chroot ซึ่งจะเปลี่ยนสภาพแวดล้อมการทำงานให้เรา เสมือนว่าเราทำงานอยู่บนอีกเครื่องหนึ่งที่มี root โฟลเดอร์อยู่ตรงที่ที่เราต้องการ เช่นในกรณีนี้ เราจะทำงานเสมือนว่าเราเปิดเครื่องมามีฮาร์ดดิสต์อยู่ที่ image ไฟล์ที่เรา mount ไว้แล้วที่ /mnt ดังนี้
chroot /mnt

เมื่อเราเสมือนว่าทำงานอยู่ที่ฮาร์ดดิสต์ตัวใหม่แล้ว เราก็สามารถแก้ไขข้อมูลต่างๆภายในได้ หรือแม้แต่รันโปรแกรมต่างๆ ก็จะเสมือนรันอยู่ที่เครื่องนั้น (จะต้องเป็นเครื่องที่มีสถาปัตยกรรมเหมือนกันกับเครื่องจริงที่กำลังทำงานอยู่) แต่ปัญหาของผมก็คือ ผมจะติดตั้งโปรแกรมโดยใช้คำสั่ง apt-get install แล้วเกิดปัญหาว่า ไม่สามารถติดต่อกับเน็ตเวอร์กได้ ทั้งๆที่เครื่องที่ทำงานอยู่ สามารถใช้เครือข่ายได้ตามปกติ สาเหตุก็คือ เราจะต้อง mount โฟลเดอร์พิเศษของระบบเข้ามาให้ถูกต้องด้วย นั่นคือโฟลเดอร์ /dev, /proc, /sys ซึ่งจะต้องเรียกก่อนที่จะใช้คำสั่ง chroot ดังนี้
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt

เท่านี้ เราก็สามารถใช้คำสั่ง apt-get install เพื่อติดตั้งโปรแกรมต่างๆลงใน image ไฟล์ที่เราต้องการได้ จากนั้นเมื่อทำการแก้ไขเสร็จแล้ว ให้ออกโดยอย่าลืม umount ด้วยดังนี้
exit
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt

5 ความคิดเห็น:

  1. Dr.Somchai ครับ ผมเป็นนักศึกษาปี 4 จะต้องแก้ไข Images ไฟล์ของ Ubuntu 12.04 เพื่อเพิ่มการ Install บางส่วนลงในไฟล์ ผมลองทำตามขั้นต้นของ Dr.Somchai แล้วขั้นตอนเเรก มันขึ้นว่า mount: you must specify the filesystem type ผมต้องทำยังไงต่ออะครับ

    ตอบลบ
    คำตอบ
    1. ปกติแล้ว คำสั่ง mount จะตรวจสอบชนิดของไฟล์ได้อัตโนมัติ ผมจึงไม่ได้ระบุชนิดไว้ ในกรณีที่คำสั่ง mount ไม่สามารถตรวจสอบชนิดของไฟล์ได้ เราจะต้องระบุให้มันด้วย option -t แล้วตามด้วยชนิด เช่น
      mount -t iso9660
      สำหรับ ISO ไฟล์
      mount -t udf

      ลบ
    2. mount -t udf
      สำหรับไฟล์ ISO ที่สร้างเป็น DVD รุ่นใหม่ๆ

      ลบ
  2. Dr.Somchai ครับ ผมต้องการนำไฟล์ Ubuntu-desktop-12.04LTS.img มาทำการแก้ไขไฟล์ โดยการติดตั้งโปรแกรมเพิ่ม เพื่อที่เวลานำไฟล์ที่ผมแก้ไขไปติดตั้งกับเครื่องอืนจะได้ทำให้เครื่องที่นำไฟล์ Images ได้รับโปรแกรมที่ผมได้ติดลงไปด้วยอ่าครับ อาจารย์พอจะแนะนำวิธีการทำได้ไหมครับ

    ตอบลบ