ป้ายกำกับ

แสดงบทความที่มีป้ายกำกับ Linux แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Linux แสดงบทความทั้งหมด

วันอังคารที่ 19 สิงหาคม พ.ศ. 2557

Restore Files from deja-dup

เวลาใช้ระบบ Backup ของ Ubuntu นั้น GUI ที่มีอยู่บน Ubuntu 12.04 หรือ 14.04 จะ ทำการ restore ไฟล์ทั้งหมดเท่านั้น ซึ่งหากเรามีข้อมูลจำนวนมาก ก็จะใช้เวลานาน หากมีข้อมูลที่เราต้องการ restore เฉพาะบางไฟล์ จะต้องใช้ command-line คือ

Usage:
  deja-dup [OPTION...]
  deja-dup --backup
  deja-dup --restore [FILES…]
  deja-dup --restore-missing DIRECTORY

Déjà Dup is a simple backup tool.  It hides the complexity of backing up
the Right Way (encrypted, off-site, and regular) and uses duplicity as
the backend.

Help Options:
  -h, --help               Show help options
  --help-all               Show all help options
  --help-gtk               Show GTK+ Options

Application Options:
  --version                Show version
  --restore                Restore given files
  --backup                 Immediately start a backup
  --restore-missing        Restore deleted files
  --display=DISPLAY        X display to use

โดยต้องไปต้้งค่าต่างๆด้วย GUI ให้เรียบร้อยก่อน เช่นค่า Storage location

วันอังคารที่ 17 มิถุนายน พ.ศ. 2557

HBase 0.96.2 Debian Package

เมื่อสองวันก่อนผมได้เขียนแนะนำการใช้งาน Hadoop Debian Package ที่ผมได้นำมาจัดการแก้ไขข้อผิดพลาดและทำ package ขึ้นมาใหม่ไว้แล้ว เพราะต้องการเผยแพร่ให้กับนักศึกษาของผม วันนี้ผมก็ได้ทำ Debian Package ของ HBase ขึ้นมาอีกไฟล์หนึ่ง เนื่องจาก HBase นั้นไม่มี Debian Package ให้ การจัดสภาพแวดล้อมและการตั้งค่าต่างๆ ยังไม่ค่อยจะสอดคล้องกับระบบของ Debian/Ubuntu มากนัก ผมจึงจำเป็นต้องแก้ไข ก็เลยจัดทำเป็น Debian Package ซะเลย จึงต้องการเผยแพร่และเขียนบันทึกแนะนำการใช้งานไว้ ณ. ที่นี้

Download

ไฟล์ที่ได้จัดทำขึ้นนี้เป็น HBase รุ่น 0.96.2 สามารถดาวโหลดได้ที่ Google Drive (md5sum) ซึ่งเป็นรุ่นที่ทำไว้สำหรับใช้งานร่วมกับ Hadoop 1.x สามารถดาวโหลดได้ที่ Google Drive (md5sum) เช่นกัน

Installation

เมื่อดาวโหลดมาแล้ว จะต้องติดตั้ง Hadoop 1.x ให้เรียบร้อยเสียก่อนนะครับ ซึ่งสามารถอ่านรายละเอียดวิธีการติดตั้งได้จากบทความเก่าที่เขียนไว้ จากนั้น สำหรับผู้ที่ใช้ GUI จะสามารถ Double-Click ที่ไฟล์และทำการติดตั้งได้เหมือนโปรแกรมอื่นๆตามปกติ แต่สำหรับผู้ที่ใช้ command-line interface สามารถติดตั้งได้ด้วยคำสั่ง
sudo dpkg -i hbase_0.96.2-hadoop1-SNORM_all.deb
โปรแกรมติดตั้งจะทำการสร้างกุญแจรหัสสำหรับใช้ในการเชื่อมต่อระหว่าง HBase กับ Hadoop โดยกุญแจรหัสนี้ จะสร้างไว้ในนามของ user hdfs จากนั้น จะทำการสร้างโฟลเดอร์ /hbase และโครงสร้างต่างๆสำหรับเก็บข้อมูลบนระบบไฟล์ HDFS ของ Hadoop แล้วจึงตั้งค่าให้บริการต่างๆทำงานอัตโนมัติ ไฟล์และโฟลเดอร์ที่ติดตั้งลงในเครื่องมีดังนี้
  1. /etc/hbase เป็นโฟลเดอร์ที่เก็บ configuration ไฟล์ต่างๆ เช่น hbase-env.sh ซึ่งเป็นไฟล์สำหรับตั้งค่าสภาพแวดล้อมสำคัญๆที่จำเป็น เช่น JAVA_HOME และ HBASE_CONF_DIR เป็นต้น และไฟล์ hbase-site.xml เป็นต้น
  2. /usr/bin และ /usr/sbin เก็บไฟล์โปรแกรม hbase, start-hbase.sh และ stop-hbase.sh
  3. /usr/share/doc/hbase เป็นโฟลเดอร์ที่เก็บเอกสาร คู่มือของ HBase
  4. /usr/share/hbase เป็นโฟลเดอร์ที่เก็บโปรแกรม HBase
  5. /var/log/hadoop/hbase เป็นโฟลเดอร์ที่เก็บ log ไฟล์ของ hbase ใช้ตรวจสอบการทำงานต่างๆหากมีปัญหา
เมื่อเสร็จสิ้นการติดตั้งแล้ว บริการต่างๆจะถูกสั่งให้ start ไว้แล้ว เราก็สามารถตรวจสอบระบบได้ว่ามีบริการต่างๆทำงานอยู่หรือไม่ ซึ่งทำได้ด้วยคำสั่ง
sudo jps
ซึ่งเป็นคำสั่งตรวจสอบ process ของโปรแกรมภาษา Java ทำงานคล้ายกับคำสั่ง ps ของ Unix นะครับ โดยผลลัพธ์จะต้องปรากฏชื่อบริการที่รันอยู่ทั้งหมด 3 บริการคือ
  1. hbase-zookeeper ชื่อที่แสดงคือ HQuorumPeer
  2. hbase-master ชื่อที่แสดงคือ HMaster เปิดเว็บดูได้ที่เว็บ http://localhost:60010
  3. hbase-regionserver ชื่อที่แสดงคือ HRegionServer เปิดเว็บดูได้ที่เว็บ http://localhost:60030
หากมีบริการครบถ้วน แสดงว่าการติดตั้งสำเร็จ แต่หากไม่ครบถ้วน สามารถตรวจสอบข้อผิดพลาดได้ที่ log ไฟล์นะครับ

Start/Stop Service

หากมีปัญหา ต้องการหยุดบริการเพื่อแก้ไขปัญหา และสั่งให้ทำงานใหม่ สามารถสั่งได้ด้วยคำสั่งดังนี้
  • สำหรับ start บริการทั้งหมดคือ zookeeper master และ regionserver ตามลำดับ
sudo start-hbase
  •  สำหรับ stop บริการทั้งหมด
sudo stop-hbase
แต่หากต้องการ start/stop บริการทีละตัวก็สามารถทำได้ด้วยคำสั่ง
  • สำหรับ start บริการทีละตัว
sudo service ชื่อบริการ start
  • สำหรับ stop บริการทีละตัว
sudo service ชื่อบริการ stop
สำหรับชื่อบริการของ HBase นั้น ใช้ชื่อจากหัวข้อที่แล้วนะครับ และบริการเหล่านี้ควรจะ start ตามลำดับที่เรียงไว้ 1-3 และเวลา stop ก็ควรย้อนลำดับกลับ 3-1

Usage

การใช้งานหลักๆคือคำสั่ง hbase หากสั่งโดยไม่ใส่ค่าใดๆจะแสดงข้อความแนะนำการใช้งานดังนี้
Usage: hbase [<options>] <command> [<args>]
Options:
  --config DIR    Configuration direction to use. Default: ./conf
  --hosts HOSTS   Override the list in 'regionservers' file
Commands:
Some commands take arguments. Pass no args or -h for usage.
  shell           Run the HBase shell
  hbck            Run the hbase 'fsck' tool
  hlog            Write-ahead-log analyzer
  hfile           Store file analyzer
  zkcli           Run the ZooKeeper shell
  upgrade         Upgrade hbase
  master          Run an HBase HMaster node
  regionserver    Run an HBase HRegionServer node
  zookeeper       Run a Zookeeper server
  rest            Run an HBase REST server
  thrift          Run the HBase Thrift server
  thrift2         Run the HBase Thrift2 server
  clean           Run the HBase clean up script
  classpath       Dump hbase CLASSPATH
  mapredcp        Dump CLASSPATH entries required by mapreduce
  version         Print the version
  CLASSNAME       Run the class named CLASSNAME
คำสั่งที่ใช้ประจำคือคำสั่ง hbase shell เพื่อเข้าไปจัดการฐานข้อมูล รายละเอียดการใช้งานอื่นๆสามารถศึกษาเพิ่มเติมได้จาก document ที่ /usr/share/doc/hbase/docs นะครับ

วันเสาร์ที่ 14 มิถุนายน พ.ศ. 2557

Hadoop 1.x Debian Re-Package

นานมาแล้ว ผมได้เคยเขียนถึงปัญหาในการติดตั้ง Hadoop 1.x บน Ubuntu โดยใช้ Debian Package ซึ่งตอนนั้นผมเองก็ได้แก้ปัญหาหลายๆอย่างไปเรียบร้อยแล้ว และได้จัดการ repackage ใหม่ คือทำไฟล์ .deb ขึ้นมาใหม่ที่แก้ไขแล้ว แต่ผมก็ไม่ได้เผยแพร่ให้ใครใช้ เพราะไม่แน่ใจว่าจะมีใครต้องการบ้าง จนมาถึงวันนี้ ผมต้องการให้นักศีกษาของผมได้นำไปใช้ จึงคิดว่าน่าจะเขียนแนะนำไว้ตรงนี้เลยจะดีกว่า จึงเป็นที่มาของบันทึกนี้

Download

ไฟล์ที่ได้ทำการแก้ไขแล้ว สามารถดาวโหลดได้ที่ Google Drive (md5sum)

Installation

เมื่อดาวโหลดมาแล้ว สำหรับผู้ที่ใช้ GUI จะสามารถ Double-Click ที่ไฟล์และทำการติดตั้งได้เหมือนโปรแกรมอื่นๆตามปกติ แต่สำหรับผู้ที่ใช้ command-line interface สามารถติดตั้งได้ด้วยคำสั่ง
sudo dpkg -i hadoop_1.2.1-SNORM_amd64.deb
โปรแกรมติดตั้งจะทำการสร้าง group ชื่อ hadoop และ user ชื่อ mapred และ hdfs ขึ้นมา โดยแบ่งหน้าที่ให้ hdfs ใช้จัดการกับระบบไฟล์ HDFS ส่วน mapred ใช้จัดการกับ job และ task นอกจากนี้ ไฟล์และโฟลเดอร์ที่ติดตั้งลงในเครื่องมีดังนี้
  1. /etc/default/hadoop-env.sh เป็นไฟล์สำหรับตั้งค่าสภาพแวดล้อมสำหรับรัน hadoop ซึ่งตัวแปรสำคัญที่จำเป็น เช่น JAVA_HOME และ HADOOP_CONF_DIR เป็นต้น
  2. /etc/hadoop เป็นโฟลเดอร์ที่เก็บ configuration ไฟล์ต่างๆ เช่น core-site.xml และ mapred-site.xml เป็นต้น
  3. /usr/share/doc/hadoop เป็นโฟลเดอร์ที่เก็บเอกสาร คู่มือของ Hadoop
  4. /usr/share/hadoop เป็นโฟลเดอร์ที่เก็บโปรแกรม hadoop
  5. /var/lib/hadoop เป็นโฟลเดอร์ที่เก็บข้อมูลของ hadoop (ระบบไฟล์ HDFS)
  6. /var/log/hadoop เป็นโฟลเดอร์ที่เก็บ log ไฟล์ของ hadoop ใช้ตรวจสอบการทำงานต่างๆหากมีปัญหา

Setup Single-Node Mode

เมื่อติดตั้งเสร็จแล้ว จะยังไม่สามารถใช้งานได้ทันที เนื่องจากเราจะต้องทำการตั้งค่า Configuration อีกหลายอย่าง รวมทั้งการ Format ระบบไฟล์ HDFS ขึ้นมาก่อน (เสมือนการ Format Harddisk) ซึ่งหากยังไม่คุ้นเคยกับ Hadoop มากนัก ผมขอแนะนำให้ใช้ค่า default คือการตั้งค่าให้ Hadoop ทำงานในโหมด Single Node (ทำงานอยู่บนเครื่องเดียว) โดยใช้คำสั่งดังนี้
sudo hadoop-setup-singlenode.sh
คำสั่งนี้จะแสดงหัวข้อให้เลือกว่าจะทำอะไรบ้าง นั่นคือ
  1. ถามว่าจะใช้ค่า default ของ single-node หรือไม่
  2. ถามว่าจะ format HDFS หรือไม่
  3. ถามว่าจะให้สร้างโครงสร้าง directory ต่างๆบน HDFS ด้วยหรือไม่
  4. ถามว่าจะให้รัน Hadoop ด้วยเลยหรือไม่
  5. ถามว่าจะให้ตั้งค่าให้รัน Hadoop เมื่อ reboot เครื่องด้วยหรือไม่
ให้ตอบ y ทั้งหมดเลย และเนื่องจากในข้อ 4 ระบุให้รัน Hadoop เลย เมื่อเสร็จสิ้นการ setup นี้แล้ว ดังนั้น เมื่อเสร็จสิ้นการ setup เราก็สามารถตรวจสอบระบบได้ว่า มี Hadoop ทำงานอยู่หรือไม่ ซึ่งทำได้ด้วยคำสั่ง
sudo jps
ซึ่งเป็นคำสั่งตรวจสอบ process ของโปรแกรมภาษา Java ทำงานคล้ายกับคำสั่ง ps ของ Unix นะครับ โดยผลลัพธ์จะต้องปรากฏชื่อบริการที่รันอยู่ทั้งหมด 4 บริการคือ
  1. hadoop-namenode ชื่อที่แสดงคือ NameNode เปิดเว็บดูได้ที่เว็บ http://localhost:50070
  2. hadoop-datanode ชื่อที่แสดงคือ DataNode
  3. hadoop-jobtracker ชื่อที่แสดงคือ JobTracker เปิดเว็บดูได้ที่เว็บ http://localhost:50030
  4. hadoop-tasktracker ชื่อที่แสดงคือ TaskTracker
หากมีบริการครบถ้วน แสดงว่าการติดตั้งสำเร็จ

Start/Stop Service

หากเลือกให้บริการต่างๆทำงานอัตโนมัติตอนเปิดเครื่องเลย (ตอบ y ข้อ 5) เราก็ไม่จำเป็นต้องสั่งให้บริการทำงานด้วยตัวเองแต่อย่างใด แต่หากมีปัญหา ต้องการหยุดบริการเพื่อแก้ไขปัญหา และสั่งให้ทำงานใหม่ สามารถสั่งได้ด้วยคำสั่งดังนี้
  • Start Services
sudo service ชื่อบริการ start
  • Stop Services
sudo service ชื่อบริการ stop
สำหรับชื่อบริการของ Hadoop นั้น ใช้ชื่อจากหัวข้อที่แล้วนะครับ และบริการเหล่านี้ควรจะ start ตามลำดับที่เรียงไว้ 1-4 และเวลา stop ก็ควรย้อนลำดับกลับ 4-1

นอกจากนี้ ผมได้เขียน script สำหรับ start/stop ไว้เพื่อให้สะดวกต่อการใช้งานไว้ด้วย คือคำสั่ง start-hadoop และ stop-hadoop ซึ่งสามารถเรียกใช้ได้เลย

Hadoop File System

เมื่อบริการทุกอย่างทำงานได้เรียบร้อยแล้ว และได้ Format HDFS เรียบร้อยแล้ว ซึ่งจะสามารถเข้าไปจัดการไฟล์ต่างๆในระบบได้ด้วยคำสั่ง hadoop แต่เนื่องจากตอนที่เรา Format และมีการเตรียมโครงสร้างไฟล์ต่างๆไว้ในเบื้องต้นนั้น โปรแกรม hadoop-setup-singlenode.sh ได้ใช้ user hdfs เป็นผู้สร้างโครงสร้างไฟล์ทั้งหมด ทำให้สิทธิ์ในการเข้าถึงไฟล์และโฟลเดอร์ต่างๆเป็นของ hdfs ดังนั้น เราควรจะใช้ user hdfs นี้จัดการ ซึ่งสามารถทำได้หลายแบบ เช่น ใช้คำสั่ง
sudo su hdfs
เป็นการเปลี่ยนไปใช้ user hdfs  เสมือนว่าเรา login ด้วย hdfs เมื่อเสร็จงานแล้ว เราจะต้องสั่ง exit เพื่อกลับออกมาเป็น user เดิม

หรืออีกวิธีหนึ่งคือใช้คำสั่ง sudo -u hdfs นำหน้าคำสั่งที่ต้องการทุกครั้ง ซึ่งหากพิมพ์คำสั่ง
sudo -u hdfs hadoop
โดยไม่ระบุค่าใดๆ โปรแกรมจะแสดงข้อความแนะนำการใช้งานดังนี้
Usage: hadoop [--config confdir] COMMAND
where COMMAND is one of:
  namenode -format     format the DFS filesystem
  secondarynamenode    run the DFS secondary namenode
  namenode             run the DFS namenode
  datanode             run a DFS datanode
  dfsadmin             run a DFS admin client
  mradmin              run a Map-Reduce admin client
  fsck                 run a DFS filesystem checking utility
  fs                   run a generic filesystem user client
  balancer             run a cluster balancing utility
  oiv                  apply the offline fsimage viewer to an fsimage
  fetchdt              fetch a delegation token from the NameNode
  jobtracker           run the MapReduce job Tracker node
  pipes                run a Pipes job
  tasktracker          run a MapReduce task Tracker node
  historyserver        run job history servers as a standalone daemon
  job                  manipulate MapReduce jobs
  queue                get information regarding JobQueues
  version              print the version
  jar <jar>            run a jar file
  distcp <srcurl> <desturl> copy file or directories recursively
  distcp2 <srcurl> <desturl> DistCp version 2
  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
  classpath            prints the class path needed to get the
                       Hadoop jar and the required libraries
  daemonlog            get/set the log level for each daemon
 or
  CLASSNAME            run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
คำสั่งที่มักใช้บ่อยก็คือ fs ซึ่งจะใช้สำหรับจัดการไฟล์บนระบบ HDFS และมีคำสั่งย่อยซึ่่งจะคล้ายๆกับคำสั่งของ Unix เช่น ls,  mv, cp, chmod, chown ฯลฯ เป็นต้น โดยเมื่อเราสั่ง hadoop fs โดยไม่ระบุค่าใดๆ จะแสดงข้อความแนะนำคำสั่งของ fs ดังนี้
 Usage: java FsShell
           [-ls <path>]
           [-lsr <path>]
           [-du <path>]
           [-dus <path>]
           [-count[-q] <path>]
           [-mv <src> <dst>]
           [-cp <src> <dst>]
           [-rm [-skipTrash] <path>]
           [-rmr [-skipTrash] <path>]
           [-expunge]
           [-put <localsrc> ... <dst>]
           [-copyFromLocal <localsrc> ... <dst>]
           [-moveFromLocal <localsrc> ... <dst>]
           [-get [-ignoreCrc] [-crc] <src> <localdst>]
           [-getmerge <src> <localdst> [addnl]]
           [-cat <src>]
           [-text <src>]
           [-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>]
           [-moveToLocal [-crc] <src> <localdst>]
           [-mkdir <path>]
           [-setrep [-R] [-w] <rep> <path/file>]
           [-touchz <path>]
           [-test -[ezd] <path>]
           [-stat [format] <path>]
           [-tail [-f] <file>]
           [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
           [-chown [-R] [OWNER][:[GROUP]] PATH...]
           [-chgrp [-R] GROUP PATH...]
           [-help [cmd]]
Generic options supported are
-conf <configuration file>     specify an application configuration file
-D <property=value>            use value for given property
-fs <local|namenode:port>      specify a namenode
-jt <local|jobtracker:port>    specify a job tracker
-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.
The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]
เช่น หากเราต้องการแสดงรายชื่อไฟล์และโฟลเดอร์ต่างๆที่โฟลเดอร์ root เหมือนคำสั่ง ls / สามารถสั่งได้ดังนี้
sudo -u hdfs hadoop fs -l /
หากต้องการอัพโหลดไฟล์จากเครื่องเข้าสู่ระบบ สามารถใช้คำสั่ง -put เช่น
sudo -u hdfs hadoop fs -put local.txt /tmp/hdfs.txt
หมายถึงการอัพโหลดไฟล์ชื่อ local-test.txt จากเครื่องของเรา เข้าสู่ระบบที่โฟลเดอร์ /tmp โดยเปลี่ยนเป็นชื่อ hdfs.txt เป็นต้น
หากต้องการดาวโหลดไฟล์จากระบบมาที่เครื่อง สามารถใช้คำสั่ง -get เช่น
sudo -u hdfs hadoop fs -get /tmp/hdfs.txt hdfs2.txt
หมายถึงการดาวโหลดไฟล์ชื่อ hdfs.txt ที่โฟลเดอร์ /tmp จากระบบมาสู่เครื่อง โดยเปลี่ยนชื่อเป็น hdfs2.txt เป็นต้น
sudo -u hdfs hadoop fs -rm /tmp/hdfs.txt
หมายถึงการลบไฟล์ /tmp/hdfs.txt บนระบบ เป็นต้น ส่วนคำสั่งอื่นๆก็ใช้งานลักษณะเดียวกัน

วันเสาร์ที่ 11 มกราคม พ.ศ. 2557

การแก้ไข Debian Package

วันนี้ผมมีปัญหากับการติดตั้ง Hadoop บน Ubuntu ซึ่งติดตั้งจาก Debian Package (.deb ไฟล์) แต่เนื่องจากภายใน package มีสคริปท์ที่เขียนไว้สำหรับติดตั้งมีปัญหาบางอย่าง จึงทำให้การติดตั้งไม่สมบูรณ์ ผมจึงอยากจะแก้ไข จึงค้นหาวิธีการมาฝากดังนี้

Debian Package File Format

สำหรับโครงสร้างไฟล์นั้น เป็น Archive ไฟล์แบบหนึ่ง (ไฟล์บีบอัด) เราสามารถใช้โปรแกรม Archive Manager เปิดดูไฟล์ภายในได้ หรือแม้แต่ใช้โปรแกรม Package Installer ก็สามารถดูข้อมูลภายในได้เช่นกัน สามารถแตกไฟล์ออกมาได้ แต่ถ้าเรามีไฟล์อยู่แล้วต้องการจะรวมเป็น Debian Package เขาแนะนำให้ใช้โปรแกรม dpkg-deb จะสะดวกมากครับ

Control Files

โดยโครงสร้างซึ่งเป็นไฟล์แบบบีบอัด ดังนั้น โปรแกรมของเราจะมีไฟล์อะไรบ้าง เราก็เตรียมไว้ให้มีโครงสร้างเป็นโฟลเดอร์ต่างๆตามแบบของ Debian เช่น Configuration ต่างๆควรอยู่ที่ /etc ส่วนโปรแกรมเฉพาะส่วนที่เป็น read-only ควรอยู่ที่ /usr และข้อมูลอื่นๆที่เปลี่ยนแปลงบ่อยๆก็ควรอยู่ที่ /var  เป็นต้น (อ่านรายละเอียดได้จากเรื่อง  Filesystem Hierarchy Standard)

นอกจากนี้ยังมีโฟลเดอร์พิเศษชื่อ DEBIAN สำหรับเก็บไฟล์ที่สำคัญของการติดตั้ง Package ซึ่งประกอบไปด้วยไฟล์ดังนี้ (อ้างอิง How to create a Debian .deb package)

  1. control - เก็บข้อมูลหลักของ package เช่น ชื่อ package, รุ่น, สถาปัตยกรรม ฯลฯ
  2. conffiles - เก็บรายชื่อ config ไฟล์ ที่จะไม่ลบทิ้งเมื่อ uninstall เนื่องจากผู้ใช้อาจจะต้องการลงโปรแกรมใหม่ด้วยค่า config เดิม
  3. md5sums - เก็บค่า md5sum ของทุกๆไฟล์ใน package เพื่อใช้ตรวจสอบความถูกต้องของข้อมูล
  4. preinst - เป็นสคริปท์ที่จะถูกเรียกหลังจากที่แตกไฟล์ต่างๆเสร็จแล้ว และก่อนที่จะทำการติดตั้งใดๆ เช่น สคริปท์สำหรับสร้าง user/group เป็นต้น
  5. postinst - เป็นสคริปท์ที่จะถูกเรียกหลังจากที่รัน preinst เสร็จแล้ว เพื่อติดตั้งค่าต่างๆรวมทั้ง init สคริปท์ต่างๆสำหรับให้โปรแกรมทำงานในสภาวะต่างๆ
  6. prerm - เป็นสคริปท์ที่จะถูกเรียกก่อนที่จะลบโปรแกม เพื่อยกเลิกการทำงานที่ค้างอยู่ ลบข้อมูลบางอย่างที่ถูกสร้างขึ้นจาก postinst
  7. postrm - เป็นสคริปท์ที่จะถูกเรียกหลังจากที่รัน prerm เสร็จแล้ว เพื่อลบสิ่งที่สร้างขึ้นจาก preinst

Extract Debian Package

สมมติว่าไฟล์ต่างๆที่เราจะแตกออกมา เราจะไปไว้ในโฟลเดอร์ชื่อ tmp โดยใช้คำสั่ง dpkg-deb เช่น สมมติว่า package ที่ต้องการจะแก้ไขชื่อ application.deb ใช้ -x เพื่อแตกไฟล์โปรแกรม ส่วน -e เพื่อแตก Control ไฟล์ ซึ่งจะต้องอยู่ในโฟลเดอร์ชื่อ DEBIAN นะครับ
dpkg-deb -x /path/to/application.deb tmp
dpkg-deb -e /path/to/application.deb tmp/DEBIAN
จากนั้นก็แก้ไขไฟล์ตามที่ต้องการได้เลย

Rebuild Package

เมื่อแก้ไขทุกอย่างเรียบร้อยแล้ว เราก็สามารถใช้ -b เพื่อที่จะ build Package ใหม่ดังนี้
dpkg-deb -b tmp /path/to/application-new.deb
ก็จะได้ Debian Package ใหม่ตามที่ต้องการ

วันอาทิตย์ที่ 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