เมื่อกล่าวถึงวิธีการรับส่งไฟล์หรือการจัดเก็บแลกเปลี่ยนไฟล์ระหว่างโฮสต์ผ่านระบบเครือข่าย โดยทั่วไปเรามักจะนึกถึงบริการพื้นฐานของยูนิกซ์อย่างเช่น NFS หรืออาจจะเป็นบริการของเครือข่ายอินเตอร์เน็ตอย่างเช่น FTP หากเป็นเครือข่ายที่ใช้ร่วมกับระบบปฏิบัติการวินโดวส์ก็คงจะหนีไม่พ้นการแชร์โฟลเดอร์ด้วยโปรโตคอล SMB/CIFS
หากพิจารณาในส่วนที่คล้ายกันก็จะเห็นว่า งานบริการไฟล์ในระบบเครือข่ายเหล่านี้จะต้องใช้โปรแกรมบริการ หรือเซอร์วิส (services) ที่เป็นโปรแกรมประยุกต์ทำงานบนระบบปฏิบัติการลีนุกซ์อีกชั้นหนึ่ง โดยมีลักษณะเป็น Daemon ที่ปรากฏเป็นโปรเซส จึงไม่ได้เป็นส่วนหนึ่งของระบบปฏิบัติการอย่างแท้จริง
ตัวอย่างเช่น บริการ NFS ก็จะต้องมีโปรแกรม nfsd และ RPC port mapper รันเอาไว้ บริการ FTP ก็ต้องมีโปรแกรมประเภท FTP Server รันเอาไว้ หากจะแลกเปลี่ยนไฟล์กับระบบปฏิบัติการวินโดวส์ก็ต้องรันโปรแกรม SAMBA Server
การที่ต้องอาศัยโปรแกรมภายนอกมาทำงานบนระบบปฏิบัติการลีนุกซ์เช่นนี้ย่อมเกิดการใช้ทรัพยากร เช่น หน่วยความจำและการประมวลผลของโปรเซสเซอร์เป็นอย่างมาก รวมไปถึงจะต้องมีการสื่อสารเกิดขึ้นหลายขั้นตอนในแต่ละรอบของการทำงาน นั่นย่อมหมายถึงประสิทธิภาพที่ลดลงไปและเป็นการใช้พลังของระบบปฏิบัติการที่ไม่คุ้มค่า แนวคิดที่จะนำระบบบริการในเครือข่ายมาทำงานในระดับเคอร์เนล ในรูปแบบของเคอร์เนลโมดูลจึงเกิดขึ้น

รูปที่ 1 ส่วนประกอบเบื้องต้นในระบบเครือข่ายของ NBD
NBD : Network Block Device
NBD คือ เคอร์เนลโมดูลของลีนุกซ์ ที่สามารถนำมาใช้งานในการให้บริการไฟล์ผ่านระบบเครือข่าย โดยใช้วิธีการทำนองเดียวกันกับการจัดการอุปกรณ์จัดเก็บข้อมูลประเภท Block Device ทั่วไป เช่น ฮาร์ดดิสก์ต่างๆ (/dev/hda ,/dev/sda) หน่วยความจำแรม (/dev/ram0) เพียงแต่อุปกรณ์หรือเนื้อที่จัดเก็บข้อมูลนั้นไปอยู่ในโฮสต์ที่ห่างไกลออกไปในระบบเครือข่าย (Remote) มิได้อยู่ภายในโฮสต์เดียวกัน (Local)
โครงสร้างการทำงานของ NBD นั้นจะเป็นเคอร์เนลโมดูลที่ทำงานใกล้ชิดกับเคอร์เนลของลีนุกซ์มากที่สุด ดังนั้นจึงมีความเร็วสูง ในกรณีที่ทำงานเป็นเซิร์ฟเวอร์จะทำหน้าที่เป็นตัวกลางระหว่างอุปกรณ์จัดเก็บข้อมูลจริงกับการให้บริการออกไปยังระบบเครือข่าย TCP/IP (โดยกำหนดหมายเลขพอร์ตขึ้นเพื่อใช้อ้างอิง) ส่วนการทำงานในฐานะเครื่องลูกข่ายนั้น NBD จะเชื่อมโยงบริการจากเซิร์ฟเวอร์แล้วแปลงให้อยู่ในรูปของ Block Device ตัวหนึ่ง (/dev/nbd0) เพื่อให้ระบบปฏิบัติการฝั่งลูกข่ายสามารถฟอร์แมตและเม้าต์ใช้งานได้เสมือนเป็นดิสก์ภายในเครื่องของตนเอง หากตัดการติดต่อไปแล้วกลับมาเชื่อมต่ออีกครั้งหนึ่งก็จะยังคงใช้งานได้เหมือนเดิมทุกประการ ส่วนประกอบของ NBD นี้เป็นดังรูปที่ 1
ประโยชน์และการประยุกต์ใช้งานของ NBD นี้ จะปรากฏในงานหลายประเภท ตั้งแต่งานเกี่ยวกับเครื่องไคลเอ้นต์ที่ปราศจากดิสก์ในตัวเอง (Diskless Clients) ระบบจัดเก็บข้อมูลในเครือข่ายหรือ SAN (Storage Area Networks) ไปจนถึงระบบคอมพิวเตอร์ประมวลผลร่วมกันแบบคลัสเตอร์ (Cluster Computing)
เทคโนโลยี NBD นี้ ยังได้พัฒนาต่อยอดไปอีกหลายโครงการ ได้แก่
ANBD (Another Network Block Device) ที่ขยายการสนับสนุนการทำงานแบบ Multithreading และมีการแจ้งข้อความผิดพลาดต่างๆ ที่ดียิ่งขึ้น
ENBD (Enhanced Network Block Device) ได้เพิ่มคุณสมบัติการเชื่อมต่อใหม่โดยอัตโนมัติ การพิสูจน์สิทธิผู้ใช้งาน และสนับสนุนอุปกรณ์ชนิด Removable
DNBD (Distributed Network Block Device) เปลี่ยนไปใช้โปรโตคอลชนิด UDP ในการรับส่งข้อมูลและสนับสนุน Multicast การมีแคชในฝั่งเครื่องลูกข่าย การทำ Server Redundancy
GNBD (Global Network Block Device) ซึ่งเป็นฐานของการพัฒนาไปสู่ GFS (Global File System)
ลงมือปฏิบัติกับ NBD
ในการทดสอบใช้งาน NBD นี้ ผู้เขียนใช้ Fedora Core 5 เป็นหลัก ซึ่งเคอร์เนลรุ่น 2.6.15 ที่มาพร้อมกันนี้ได้สนับสนุนอยู่แล้วแบบโมดูลภายนอก (LKM : Loadable Kernel Module) สามารถตรวจสอบได้ดังนี้
หากใช้คำสั่ง locate nbd จะพบว่ามีไฟล์ nbd.ko และ nbd.h พร้อมอยู่แล้วในระบบ
หากใช้คำสั่ง grep -i nbd /boot/config-2.6.15-1.2054_FC5 จะเห็นข้อความว่า CONFIG_BLK_DEV_NBD = m
ก่อนใช้งานจึงต้องโหลดโมดูลนี้เสียก่อนด้วยคำสั่ง modprobe nbd
ตรวจสอบการโหลดโมดูลด้วยคำสั่ง lsmod | head
ติดตั้งเครื่องมือสนับสนุน NBD
ถึงแม้ว่าจะมีเคอร์เนลโมดูลสนับสนุน NBD แล้วก็ตาม แต่ในการใช้งานนั้นจะต้องมีเครื่องมือสนับสนุนการใช้งานของผู้ใช้หรือ User space tools เพิ่มเติมอีกเล็กน้อยจึงจะสามารถใช้งานได้จริง ดังนั้นจึงต้องมีขั้นตอนการคอมไพล์และติดตั้งโปรแกรมสนับสนุนดังนี้
ดาวน์โหลดไฟล์โปรแกรมต้นฉบับชื่อ nbd-2.8.8.tar.bz2 จากเว็บไซต์ http://sourceforge.net/projects/nbd
แตกไฟล์แล้วเข้าไปในไดเร็คทอรี่ที่เกิดขึ้น (nbd-2.8.8) เพื่อเตรียมการคอมไพล์
สำเนาไฟล์ /usr/include/linux/nbd.h มาไว้ที่นี่
เพิ่มข้อความต่อไปนี้ ภายในไฟล์ nbd.h (จะต้องแทรกข้อความภายในขอบเขตของโปรแกรมตามรูปแบบของภาษาซี ในที่นี้ควรอยู่เหนือคำว่า endif )
enum {
NBD_CMD_READ = 0,
NBD_CMD_WRITE = 1,
NBD_CMD_DISC = 2
};
เริ่มทำการคอมไพล์ และติดตั้งโปรแกรม ดังชุดคำสั่งต่อไปนี้
# ./configure
# make
# make install
จะได้ผลลัพธ์เป็นโปรแกรมคำสั่ง nbd-server อยู่ที่ /usr/local/bin และโปรแกรมคำสั่ง nbd-client อยู่ที่ /usr/local/sbin นอกจากนั้นจะเป็นเอกสาร Man Page ต่างๆ อีกจำนวนหนึ่ง ต่อจากนี้ไปจะสามารถใช้ทั้งสองคำสั่งนี้ในการใช้งาน NBD ต่อไป
ขั้นตอนการทดสอบใช้งาน NBD
เมื่อระบบของเรามีทั้งเคอร์เนลโมดูลและโปรแกรมสนับสนุนการใช้งานพร้อมแล้ว การใช้งาน NBD จะแบ่งออกเป็น 2 ส่วน คือ ฝั่ง NBD Server กับฝั่ง NBD Client
ฝั่ง NBD Server จะทำการสร้างพาร์ทิชั่นหรือไฟล์อิมเมจที่จะใช้เป็นสื่อบันทึกข้อมูลขึ้น แล้วฟอร์แมตเพื่อให้สามารถจัดเก็บข้อมูลได้ จากนั้นจึงใช้โปรแกรม nbd-server ทำการ Export สื่อบันทึกข้อมูลนี้ออกไปทางระบบเครือข่าย TCP ด้วยหมายเลขพอร์ตที่สามารถกำหนดได้ตามต้องการ
# mkdir /exports
# dd if=/dev/zero of=/exports/network-media.img bs=1024 count=100000
# mke2fs /exports/network-media.img
ชุดคำสั่งข้างบนนี้เป็นการสร้างไฟล์ขนาดประมาณ 102 MB ขึ้น แล้วฟอร์แมตเป็นระบบไฟล์แบบ ext2 ขณะที่ฟอร์แมตจะปรากฏคำถามขึ้นว่า Continue anyway? (y/n) ให้ตอบ y
# nbd-server 5000 /exports/network-media.img
# netstat -lntp | grep nbd-server
ต่อจากนั้นให้รันคำสั่ง nbd-server โดยให้บริการที่พอร์ต TCP/5000 โดย Export ระบบไฟล์ที่สร้างขึ้นออกไปในระบบเครือข่าย
ส่วนการเชื่อมต่อกับ NBD Server ด้วยโปรแกรม nbd-client มีขั้นตอนที่จะใช้ประโยชน์จากเคอร์เนลโมดูล nbd.ko โดยรันโปรแกรมชื่อ nbd-client เพื่อเชื่อมต่อบริการไปยัง NBD Server ตามพอร์ตที่ให้บริการ แล้วนำมาอ้างอิงด้วยชื่ออุปกรณ์ Block Device ของ NBD เช่น /dev/nbd0 หากการเชื่อมต่อสำเร็จ ผู้ใช้งานฝั่งไคลเอ้นต์นี้จะสามารถนำ Block Device นี้ไปใช้งานได้เช่นเดียวกับ Block Device ในแบบโลคอลธรรมดาได้ทันที ดังตัวอย่างต่อไปนี้ (สามารถทดสอบได้ในโฮสต์เดียวกันกับโฮสต์ที่ทำหน้าที่เป็น NBD Server)
# modprobe nbd
# nbd-client 127.0.0.1 5000 /dev/nbd0
# mkdir /mnt/net
# mount /dev/nbd0 /mnt/net
# ls -l /mnt/net
# df -h
# dd if=/dev/zero of=/mnt/net/test.dat count=8192 bs=1024
# ls -l /mnt/net
# df -h
ขั้นตอนข้างต้นเป็นการโหลดเคอร์เนลโมดูล nbd ก่อนที่จะเริ่มใช้งาน จากนั้นจึงเชื่อมต่อกับเซิร์ฟเวอร์(ในโฮสต์เดียวกัน) ที่พอร์ต 5000 ให้อ้างอิงด้วย /dev/nbd0 แล้วทำการเม้าต์มาใช้งานที่ /mnt/net โดยทดลองสร้างไฟล์ขนาด 8MB ขึ้นเพื่อทดสอบการบันทึกข้อมูล หากต้องการตัดการเชื่อมต่อกับ NBD Server จะต้องทำการ unmount เสียก่อนแล้วจึงใช้อ๊อปชั่น -d เพื่อ disconnect การเชื่อมต่อออกไป
# umount /mnt/net
# nbd-client -d /dev/nbd0
ใช้งาน NBD Server กับวินโดวส์เอ็กซ์พี
นอกจากจะสามารถใช้งานโฮสต์ลีนุกซ์เป็น NBD Server ได้แล้ว เรายังสามารถใช้โฮสต์วินโดวส์เอ็กพีให้ทำหน้าที่เป็น NBD Server ได้อีกด้วย ยิ่งเพิ่มความยืดหยุ่นในการใช้งาน NBD มากขึ้นอีกทางหนึ่ง อย่างไรก็ตามเราจะต้องดาวน์โหลดโปรแกรม NBD Server ที่คอมไพล์ไว้แล้วมาใช้งานจะสะดวกมากกว่าต้องคอมไพล์เอง โดยสามารถดาวน์โหลดได้จาก http://www.vanheusden.com/windows/nbdsrvr/ เป็นไฟล์ที่บีบอัดไว้ชื่อ nbdsrvr-0.2.zip เมื่อแตกไฟล์นี้ออกมาแล้วจะได้ไฟล์โปรแกรมชื่อ nbdsrvr.exe ให้นำมาไว้ที่ C:\
ขั้นตอนการใช้งานจะคล้ายกับกรณีที่เป็นโฮสต์ลีนุกซ์ คือ จะต้องสร้างไฟล์อิมเมจไว้เสียก่อน ขั้นตอนการสร้างไฟล์อิมเมจ ให้ทำดังนี้
เปิดหน้าต่างแบบคอมมานด์ไลน์ของดอสโดยพิมพ์ cmd ในกรอบ Run.. จากปุ่ม Start
ที่ C Prompt ให้พิมพ์ cd \ เพื่อไปที่ Root Directory
พิมพ์คำสั่ง echo 1 > image.dat
พิมพ์คำสั่ง dir จะเห็นไฟล์ image.dat ขนาด 4 byte
สร้างชุดคำสั่งต่อไปนี้เพื่อเพิ่มขนาดของไฟล์ image.dat ให้มีขนาดเพิ่มขึ้นเป็น 16 MB
C:\> FOR /L %i IN (1,1,22) DO type image.dat >> image.dat
เมื่อได้ไฟล์ image.dat ขึ้นแล้ว สังเกตว่าภายในไฟล์นี้จะยังไม่ได้ฟอร์แมตให้มีระบบไฟล์ใดๆ อยู่ภายใน เหมือนอย่างที่เป็นในกรณีของโฮสต์ลีนุกซ์ และในขณะที่อยู่ในดอสเช่นนี้เราก็ไม่สามารถจะฟอร์แมตได้อีกด้วย อย่างไรก็ตามเราสามารถสั่งฟอร์แมตในภายหลังได้ หลังจากเชื่อมต่อด้วย NBD ไปที่โฮสต์ลีนุกซ์แล้ว
การรัน NBD Server ที่ฝั่งโฮสต์วินโดวส์เอ็กพี จะใช้ไฟล์โปรแกรม EXE ที่ดาวน์โหลดมา โดย Export ไฟล์อิมเมจ ออกไปทาง TCP พอร์ตหมายเลข 5001 ดังนี้
C:\> nbdsrvr image.dat 5001
ทางฝั่งโฮสต์ลีนุกซ์ เราจะสามารถเชื่อมต่อกับ NBD Server ที่เป็นวินโดวส์ได้เช่นเดียวกับที่กระทำกับNBD Server ที่เป็นโฮสต์ลีนุกซ์ แต่ในจะเพิ่มขั้นตอนในการฟอร์แมต Network Block Device ก่อนการใช้งาน (ฟอร์แมตครั้งแรกเพียงครั้งเดียว) มีขั้นตอนตัวอย่างดังนี้
# modprobe nbd
# nbd-client 192.168.100.200 5001 /dev/nbd1
# mke2fs /dev/nbd1
# tune2fs -j /dev/nbd1
# mkdir /mnt/winbd
# mount /dev/nbd1 /mnt/winbd
# mount
# ls -l /mnt/winbd
# df -h
# cp /usr/share/sounds/*.wav /mnt/winbd
# ls -l /mnt/winbd
# df -h
# umount /mnt/winbd
# nbd-client -d /dev/nbd1
จากขั้นตอนตัวอย่างเป็นการเชื่อมต่อไปยัง NBD Server หมายเลขไอพี 192.168.100.200 ที่เป็นโฮสต์วินโดวส์ โดยอ้างอิงเป็นดีไวซ์ /dev/nbd1 ทำการฟอร์แมต เม้าต์ระบบไฟล์มาที่ /mnt/winbd และทดสอบการสำเนาไฟล์ไปเก็บที่เม้าต์พ้อยต์ดังกล่าว จากนั้นจึงยกเลิกการติดต่อใช้งานเป็นขั้นตอนสุดท้าย
ความพิเศษของ NBD
เราได้เห็นวิธีการใช้งาน NBD หรือ Network Block Device กันไปบ้างแล้ว คงทำให้สังเกตเห็นว่ามีลักษณะคล้ายกับการใช้งาน NFS ค่อนข้างมาก จะต่างกันก็ตรงที่มีประสิทธิภาพสูงกว่าเพราะทำงานจากระดับเคอร์เนล นอกจากนี้ยังมีสิ่งหนึ่งที่ต่างออกไปคือ หากนำไปใช้ในเครือข่ายที่มีเครื่องลูกข่ายจำนวนมากจะสามารถกำหนดหมายเลขพอร์ต TCP ขึ้นได้เองโดยอาจแยกตามแหล่งบันทึกข้อมูล
แต่ถ้าใช้แหล่งข้อมูลหรือไฟล์อิมเมจเดียวแล้วอนุญาตให้เครื่องลูกข่ายทุกตัวมาใช้เนื้อที่ร่วมกัน NBD จะไม่ยอมให้ผู้ใช้คนอื่นที่ไม่ได้เป็นเจ้าของไฟล์มองเห็นหรือทำการใดๆ กับไฟล์ที่ไม่ใช่ของตนเอง จึงมีความแตกต่างจากบริการ NFS และช่วยให้แน่ใจได้ว่าไฟล์ของผู้ใช้งานแต่ละคนจะไม่มีความเกี่ยวข้องกันเลย นับว่าเป็นเอกลักษณ์เฉพาะของ NBD ที่เห็นได้ชัดมาก และผู้ที่จะนำ NBD ไปใช้จะต้องเข้าใจในคุณสมบัติสำคัญนี้ด้วย
|