การใช้งานคำสั่ง DD บน Ubuntu - Linux
เขียนโดย อ.จักรกฤษณ์ แสงแก้ว สาขาสารสนเทศศาสตร์ คณะวิทยาการสารสนเทศ มหาวิทยาลัยมหาสารคาม
เขียน 18:43 น. วันที่ 27 ธันวาคม 2555
บทนำ
คำสั่ง DD เป็นคำสั่งที่ทำงานในระดับ Low Level ที่มีประสิทธิภาพสูงมาก ในการคัดลอกไฟล์
พัฒนาโดยคุณ Paul Rubin, David MacKenzie และ Stuart Kemp เป็นคำสั่งที่มาพร้อมกับระบบปฏิบัติการยูนิกส์และลินุกซ์
ย่อจากคำว่า "Data Description"
วัตถุประสงค์
- อธิบายการใช้คำสั่ง DD เพื่อจัดการสำรองข้อมูลภายใน Partition ของ Harddisk ได้
- อธิบายการใช้คำสั่ง DD เพื่อสำรองข้อมูลภายใน Partition ของ USB Flash Drive
ได้
- สามารถสร้าง ISO Image (การสำรองมาตรฐาน ISO) จากข้อมูลภายใน Harddisk ได้
- สามารถตรวจสอบสถานะปัจจุบันของการคัดลอกข้อมูลด้วยคำสั่ง watch ได้
รูปแบบการใช้งานของคำสั่ง
DD
dd if=[INPUT]
io=[OUTPUT] bs=[BYTE_SIZE] conv=[CONVERSION_TYPE]
เมื่อ
- if คือ input file
- of คือ output file
- bs คือ ขนาดของไบต์ สามารถกำหนดเป็น 1MB หากท่านให้ขนาดการัดลอก 1 ล้านตัวอักษรต่อการคัดลอก
- conv คือ ประเภทของการแปลง
ท่านสามารถใช้ไฟล์พื้นฐาน 3 แบบ คือ null, zero และ urandom ได้ดังนี้
/dev/null เป็นการทำลายข้อมูล คล้ายหลุมดำ ข้อมูลสามารถไปอยู่ที่นั่นได้แต่ไม่มีอะไรเป็น
output ออกมาเลย ใช้ในกรณีต้องการลบ standard output เพื่อไม่แสดงผลข้อความเตือนต่าง
ๆ เป็นต้น ตัวอย่าง ถ้าใช้ /dev/null เป็น input ของไฟล์ ใด ๆ จะทำให้ไฟล์นั้นว่างเปล่าทันที
/dev/urandom และ /dev/random เป็นการใช้ร่วมกับหมายเลขของ random number ที่สร้างและใช้ในไฟล์
/dev/zero เป็นการไม่ดำเนินการใด ๆ แต่มีค่าเป็นศูนย์
ประเภทการใช้งานคำสั่ง
dd
การเคลียส์ฮาร์ดดีสก์
dd if=/dev/zero of=/dev/sdb bs=1M
คำอธิบาย : การใช้คำสั่ง dd เพื่อแทนข้อมูลที่อยู่ในพาทิชั่น /dev/sdb
ด้วยเลข 0 ขนาด 1MB ถ้าท่านต้องการขายฮาร์ดิส์เพื่อไม่ให้เห็นข้อมูลในอดีตสามารถใช้คำสั่งนี้ได้
การเคลียส์ฮาร์ดดีสก์แบบสุ่มเดาเพื่อความปลอดภัย
dd if=/dev/urandom of=/dev/sda bs=1M
คำอธิบาย : เหมือนตัวอย่างด้านบนแต่แทนข้อมูลทั้งหมดในฮาร์ดดีสก์ด้วยข้อมูลสุ่มจาก
/dev/random ลบพาทิชั่นเดียวโดยการต่อพาทิชั่นด้วยอุปกรณ์อื่น
dd if=/dev/urandom of=/dev/sda2 bs=1M
คำอธิบาย : ใช้ในกรณีที่ท่านไม่ต้องการให้ใช้ Master Boot Record (MBR)
เดิมได้ เพราะเขียนทับด้วยค่าสุ่ม
การลบ Master
Boot Record (MBR)
dd if=/dev/zero of=/dev/sda bs=446 count=1
คำอธิบาย : ลบไบต์แรกจำนวน 443 bytes ของไดรว์ /dev/sda ซึ่งเป็นขนาดและตำแหน่งของ
master boot record
การสร้างอิมเมจของ
CD .iso จากพาทิชั่น
dd if=/dev/sdb1 of=/home/user/my-partition.iso bs=2048 conv=notrunc
คำอธิบาย : เซกเตอร์ของ CD sectors มีความยาว 2048 bytes ดังนั้นวิธีการนี้เป็นการคัดลอกเซกเตอร์/เซกเตอร์ของพาทิชั่น
และท่านต้องใช้ โปรแกรม Brasero เพื่อเขียน ISO Image ลงในแผ่น CD
การกู้คืนไฟล์จาก
ISO มาไปยังพาทิชั่น
dd if=/home/user/my-partition.iso of=/dev/sdb2 bs=2048 conv=notrunc
การคัดลอกข้อมูลใน
RAM ไปยังไฟล์
dd if=/dev/mem of=/root/memory-dump.bin bs=1024
การทำให้ไฟล์
1024 ไบต์แบบสุ่ม
dd if=/dev/urandom of=/home/user/random-bytes.bin bs=1 count=1024
การโคลนนิ่งพาทิชั่น
dd if=/dev/sda1 of=/dev/sdb1 bs=4096 conv=noerror
การบันทึกข้ัอมูลจากพาทิชั่นไปยังไฟล์
dd if=/dev/sdb1 of=/home/user/my-partition.img bs=4096 conv=notrunc,noerror
การกู้คืนพาทิชั่น
จากไฟล์ที่สำรองไว้
dd if=/home/user/partition.img of=/dev/sdb1 bs=4096 conv=notrunc,noerror
การสร้าง
ISO image สำหรับแผ่น CD
dd if=/dev/cdrom of=/home/user/my-music-CD.iso bs=2048 conv=sync
คำอธิบาย : นอกจากนั้นท่านสามารถใช้ dd สำหรับไฟล์ที่เป็นอุปกรณ์ชนิดอื่น
ๆ ได้ด้วย เช่น /proc ซึ่งเป็น real-time interface ระหว่าง system kernel(ส่วนของระบบปฏิบัติการที่ติดต่อกับฮาร์ดแวร์)
การตรวจดูข้อมูลภายใน
virtual memory
dd if=/proc/kcore | hexdump -C | less
คำอธิบาย : เป็นการใช้ if (input file) ที่ชื่อว่า /proc/kcore และแสดงผลลัพธ์เลขฐาน
16
การตรวจดูรายการ
interrupt table
dd if=/proc/interrupts | hexdump -C | less
คำอธิบาย : เป็นการแสดงไฟล์อินเตอร์รัป และส่งต่อข้อมูลให้คำสั่ง hexdump
และส่งต่อข้อมูลให้คำสั่ง less
การแปลงข้อมูลในไฟล์เป็นตัวพิมพ์ใหญ่ทั้งหมด
dd if=/home/user/data-lower.txt of=/home/user/data-uppper.txt conv=ucase
การตรวจสอบสถานะปัจจุบันของการคัดลอกข้อมูลของโปรแกรม
DD ด้วยคำสั่ง watch
เนื่องจากการคัดลอกด้วยคำสั่ง dd จะไม่แสดงสถานะในขณะที่กำลังคัดลอก จนกว่าโปรแกรมจะดำเนินงานจนแล้วเสร็จ
ดังนั้น ท่านสามารถใช้เทคนิคเพื่อกระตุ้นให้โปรแกรม dd แสดงปริมาณการคัดลอกข้อมูลได้
ด้วยขั้นตอน ดังนี้
1. เปิด Terminal ขึ้นมาใหม่ เพื่อตรวจสอบหมายเลข Process ID ของ คำสั่ง dd ที่กำลังทำงานด้วยคำสั่ง
ps ดังนี้
$ ps -e | grep 'dd'
เมื่อคำสั่ง ps สำหรับตรวจสอบหมายเลข process ที่กำลังทำงานในปัจจุบัน
เมื่อคำสั่ง grep คือ คำสั่งที่ตรวจจับรูปแบบอักษร ในตัวอย่างนี้ให้จับหาบรรทัดที่มีคำว่า
'dd' (ปกติคำสั่ง ps มีผลลัพธ์หลายบรรทัด แต่เราใช้ grep เพื่อกรองเอาเฉพาะบรรทัดที่มีคำว่า
'dd' ออกมาเท่านั้น เพื่อตรวจสอบดูหมายเลข Process ID)
2. เรียกใช้คำสั่ง watch เพื่อกระตุ้นให้โปรแกรม dd แสดงสถานะปัจจุบันการคัดลอกข้อมูล
ดังนี้
$ sudo watch -n 20 kill -USR1 [PROCESSID]
เมื่อเลข 20 คือ จำนวนวินาที ที่ส่งสัญญาณไปกระตุ้นคำสั่ง dd ซึ่งกำหนดจากหมายเลข
Process ID
3. ที่หน้า Terminal ที่ท่านใช้คำสั่ง dd จะแสดงสถานะปริมาณการคัดลอกให้ท่านเห็น
การสร้าง Image และเพิ่มลบไฟล์/ไดเร็คทอรี่ภายใน
Image
ขั้นที่ 1 : สร้าง Image ไฟล์เปล่า
$ dd if=/dev/zero of=test.img bs=1M count=2
ขั้น 2 : กำหนด Image เป็น DOS File System
$ mkdosfs test.img
ขั้น 3 : แสดงรายชื่อไฟล์ใน Image
$ mdir -i test.img
เมื่อ -i คือ image file
ขั้น 4 : คัดลอกไฟล์ใส่ลงไปใน Image
$ mcopy -i test.img filename.zip ::/newfilename.zip
ปล.ตัวอย่างนี้ใช้ไฟล์ชื่อ filename.zip
ขั้น 5 : สร้างไดเร็คทอรี่ใน Image
$ mmd -i test.img newdir
ขั้น 6 : คัดลอกไฟล์จาก Image มายังเครื่องคอมพิวเตอร์
$ mcopy -i test.img ::/filename.zip filename.zip
สรุป
ในบทความนี้ ท่านได้เห็นถึงความสามารถของคำสั่ง dd และหวังว่าจะช่วยให้ท่านได้แนวความคิดสำหรับสคริตป์ภาษาต่าง
ๆ โดยเฉพาะ Bash Script เพื่อติดต่อ IO และส่งต่อข้อมูลยังคำสั่งอื่น ๆ เพื่อประมวลผลตามที่ท่านต้องการได้อย่างมีประสิทธิภาพ
พบกันใหม่โอกาสหน้า สำหรับวันนี้.. สวัสดีครับ..
20.19 น. วันที่ 27 ธันวาคม 2555