Linux

FBCMD

เรื่องของเรื่องคือเดือนหน้า ผมมีแผนจะต้องไปเมืองจีน … ที่ที่กล่าวว่ามีกำแพงกั้น Social Media อย่าง Facebook หรือแม้กระทั่ง youtube ทำให้ผู้ที่อาศัยอยู่ในประเทศนั้นไม่สามารถเข้าเว็บดังกล่าวได้  ซึ่งนั่นก็หมายความว่า … ผมอาจจะไม่สามารถ post blog ในช่วงเวลาที่ไปเมืองจีนได้

คือจริงๆ แล้วก็ไม่ได้ซีเรียสอะไรขนาดนั้น เพราะที่ผ่านๆ มาก็ VPN กับมาเมืองไทยแล้วก็ค่อยเล่น facebook ก็ได้  (ที่จริงคือตอนไปเซี่ยงไฮ้ผมจำได้ว่าเล่น facebook ได้โดยที่ไม่ต้อง VPN ด้วยอ่ะ) แต่ประเด็นมันอยู่ที่ว่า เมืองที่ผมไปคือ Xi’an ซึ่งไม่ก็ไม่มั่นใจว่าที่พักที่ผมและเพื่อนๆ จะไปอยู่กันจะมี WIFI ฟรีให้ใช้หรือเปล่า แล้วก็ไม่อยากซื้อ SIM มือถือมาใช้แค่ช่วงเวลานั้นด้วย (เปลืองงบ)

ก็เลยมานั่งหาตัวช่วยว่า ถ้าผมจะให้มัน post blog ผมแบบอัตโนมัติ จากบ้านที่เมืองไทยเองเลยจะทำยังไงได้บ้าง ดูๆ ไปก็เลยหยิบเจ้า fbcmd มาลอง

fbcmd เป็นโปรแกรมบน command line ซึ่งผมก็จะสั่ง post อะไรใน facebook ก็ได้ผ่านไอ้เจ้านี่ โดยที่ผมไม่ต้องไปนั่งเขียนโปรแกรมเรียกใช้ Facebook API เอง

…. กระบวนการ setup , authentication , authorization ดูเพิ่มเติมได้จากเว็บนี้ http://fbcmd.dtompkins.com/

ตัวอย่างการใช้งานก็เช่น

#fbcmd  status  "Hello World"

ก็เป็นการ Update status   Hello World ที่หน้า wall ของเรา โดยมันจะขึ้นว่าเรา Post ผ่าน app ชื่อ Command Line ดังรูป (ว่าแต่ Weerasak นี่กด Like ไวมากฮะ -/\-)

snapshot137

 

ก็น่าจะพอมีทางรอดในช่วงนั้นได้ …. แต่ถ้าให้ผม Blog ล่วงหน้าได้ช่วงนั้นก็จะเป็นพระคุณมาก 555

Linux

FUSE (File system in USERSPACE)

ลองนึกถึง File system ที่เรารู้จักๆ เช่น NTFS , HFS+ , EXT3, EXT4, XFS … พวกนี้คือ file sytem จริงๆ ของ disk เวลาที่โปรแกรมต้องการอ่านข้อมูลจาก disk มันก็ต้องวิ่งผ่าน library ไปบอก kernel ให้ไปอ่านให้แล้วส่งกลับมา

ทีนี้ก็อยู่ที่ตัว kernel แล้วว่ามันรู้จัก file system นั้นๆ ไหม ดังนั้น ถ้า kernel support file system หลายๆ ตัว คนเขียน kernel อวกกันพอดีเพราะต้องมี function ประมาณว่า

EXT3_open();
EXT3_close();
EXT3_read();
EXT3_write();

EXT4_open();
EXT4_close();

XFS_open();

สารพัด file sytem ที่ต้องใส่เข้าไป เช่นเมื่อก่อน คนใช้ linux อยากจะอ่านไฟล์บน ntfs ได้ เขาก็ต้องมานั่ง compile kernel ใหม่เพื่อให้มันสามารถเข้าไปอ่าน NTFS ได้ …. ลำบากน่าดู …

และมันยิ่งเป็นปัญหามาก ถ้าโปรแกรมเราต้องการอ่านและเขียนไฟล์ คนละ file system กัน

call EXT4_read();
call XFS_write();

แล้วกลับกันก็ต้องเป็น

call XFS_read();
call EXT4_write();

“-_- นี่ถ้ามันมีซัก 8 file systems มี combination เป็นเท่าไหร่เนี่ย …โปรแกรมเราจะต้องลำบากขนาดนั้นเลยเหรอเนี่ย

VFS (Virtual File system)

พอมีเจ้านี่เข้ามาใน kernel แทนที่โปรแกรมเราจะวิ่งไปอ่าน EXT4 หรือ XFS ตรงๆ เราก็ไปอ่านผ่าน VFS แทน โปรแกรมเราก็แค่
call VFS_read();
call VFS_write();

ไม่ว่า file system จริงๆ จะเป็นอย่างไร เราก็ไม่สนจริงมะ

FUSE (File system in USERSPACE)

ปัจจุบันใน kernel เรามีไอ้เจ้า FUSE ที่ทำให้เราสามารถสร้าง file system ใน userspace ได้ แล้วผนึกกำลังกับ VFS ช่วยให้เรามี Filesystem มาใช้งานได้เยอะขึ้นเป็นดอกเห็ดโดยที่ไม่ต้องไป edit และ compile kernel ใหม่เลย

FUSE_structure

 

จากรูปจะเห็นว่า โปรแกรมเรา (สมมติว่าเป็นโปรแกรม ls) ต้องการอ่านข้อมูลจาก hello file system เราก็เปิดโปรแกรม hellofs ไว้เป็น daemon รอไว้ พอโปรแกรมต้องการอ่านข้อมูลมันก็จะวิ่งไปหา kernel ตามเดิมนั่นแหล่ะ ให้ VFS อ่านข้อมูลจาก FUSE แล้ว FUSE เองก็ไปดึงข้อมูลจาก daemon ที่อยู่บน userspace อีกที

ทีนี้ เราก็จะมีไฟล์ system ที่อยู่บน userspace ซึ่งเหล่าบรรดา programmer ก็สร้างมันขึ้นมาให้ใช้ราวกับดอกเห็ด

เอามาแนะนำกันหน่อยก็จะมี

  • WEBDrive : อันนี้เป็น commercial ที่สามารถคุยกับ WebDAV, SFTP, FTP, FTPS, Amazon S3 ได้
  • GlusterFS : เป็น Distributed file system สามารถ scale out ได้หลาย pentabytes
  • SShFS : อันนี้คุย remote file system ผ่าน SSH protocol
  • GDriveFS : ไว้ติดต่อกับ Google Drive
  • HDFS : เอาไปต่อกับ Hadoop distributed file system
  • NTFS-3G : read/write NTFS file system

…. มีอีกเยอะนะ ไล่ดูใน wiki ได้เลย http://en.wikipedia.org/wiki/Filesystem_in_Userspace

Linux

Bonding NIC Part 3

ว่ากันต่อเรื่องเดิม (แอบลากยาวนะเนี่ย) ..

Mode “3” (broadcast) 

มันจส่ง packet เดียวกันไปยัง NICs ทุกใบเลย (ผมนึกไม่ออกเหมือนกันแฮะว่าจะไปใช้ในงานไหน)

Mode “4” 802.3ad มีชื่อเรียกอีกอย่างนึงว่า Link Aggregation Control Protocol (LACP)

อันนี้จะเป็น Dynamic Link Aggregation ตามมาตรฐาน IEEE 802.3ad เลย อย่าลืมว่า Switches กับ NICs ก็ต้อง support 802.3ad ด้วยนะ แล้วก็ต้อง config switch เพื่อทำ link aggregation ด้วย

เพิ่มเติมอีกนิดคือ มันก็ทำ load balance outgoing traffic ด้วย transmit-hash-policy :

Bonding-lacp-example

Mode “5”  Adaptive transmit load balancing   (balance-tlb)

โหมดนี้มันจะ balance outgoing traffic ไม่จำเป็นที่แต่ละ Link จะต้องมี speed เท่ากันด้วย แล้วก็ไม่ต้องไป set switch ให้ยุ่งยาก  แต่ฝั่งด้านรับ(incomming) นั้นมันจะรับที่ slave ที่ถูกกำหนดให้เป็น primary เท่านั้น แต่ถ้า primary slave fail เนี่ย slave ตัวอื่นก็จะ take over MAC addr ของตัว primary แล้วรับไว้เอง

Mode “6” Adaptive load balancing (balance-alb)

อันนี้ก็คล้ายกับ balance-tlb แต่ก็เพิ่มความสามารถในการ balance incoming traffic บน IPV4 ด้วย โดยมันจะใช้เทคนิคที่เกี่ยวกับ ARP negotiation โดย  bonding driver จะดักจับ ARP reply แล้วก็ไปแอบเปลี่ยน MAC ให้เป็น MAC สักอันของ slave NICs สักตัว

  จบ…. สักที … เขียนเรื่องนี้มา 3 วัน ผมได้อะไรที่ไม่รู้มาก่อนเยอะเหมือนกันนะเนี่ย

Linux

Bonding NIC Part 2

ความเดิมตอนที่แล้วได้ยกตัวอย่างการ bonding ไว้อันเดียวคือ Load Balance – Round Robin แต่จริงๆ แล้วมันมี mode อื่นอีกตรึมเลย เอาไว้ให้เลือกใช้งานตามความเหมาะสม

(จำไม่ได้ว่าเคยอ่านที่ไหนเขาบอกว่า ส่วนใหญ่จะใช้แค่ mode 0 1 2 ประมาณนี้แหล่ะ แต่จริงๆ แล้ว mode อื่นๆ ก็มีลักษณะเฉพาะให้นำมาใช้ได้ดี)

Mode 0 (Load balance – round robin) มันใช้ชื่อในวงการว่า balance-rr 

อย่างที่อธิบายไปเมื่อวาน มันจะส่ง packet ไล่เรียงลำดับกันไป ทุกตัวก็จะได้มีการใช้งานที่ balance กัน แต่ถ้าหาก มีอันใดอันนึงพัง มันก็จะไม่ส่งผ่านอันที่พังไป อันนี้นอกจากช่วยเรื่อง load balance แล้ว มันก็ fault tolerance (แปลเป็นภาษาไทยว่าทนต่อความเสียหาย “-_-) ด้วย

อ้อ แต่สิ่งที่ไม่ค่อยมีใครพูดถึงก็คือด้วยการทำงาน balance-rr เนี่ย มันก็ส่ง packet ผ่านหลาย NIC เลยนะครับ ใน TCP connection เดียวกัน ทีนี้ได้มีมึนตึ้บกันบ้างหล่ะ packet sequence นี้มาถึงอ๊ะยัง กรูยังไม่ได้ … re-transmission กันกระจาย ดังนั้นมันก็ต้องมีการ config switch กันนิดหน่อยด้วย

Mode 1 (Active Backup) มีชื่อในวงการว่า active-backup

อันนี้ใช้ในเรื่อง fail over เป็นหลัก สมมติว่ามี slave 2 ตัว มันก็จะทำงานผ่านตัวหลักตัวเดียว แต่ถ้าตัวหลักพัง ตัวรองก็จะเข้าทำงานแทนทันที

Mode 2 (Load balance XOR)  มีชื่อในวงการว่า balance-xor

อันนี้เขาใช้ XOR Policy (อั๊ยยะ … ต้องถึงขนาดนั่งคำนวณ)  โดยมันจะคำนวณ (source MAC address XOR destination MAC address) modulo slave-count

ไม่รู้จะอธิบายวิธีการคิดยังไง .. แต่เอาหล่ะมันจะทำตาม Hashing Policies ซึ่งถ้าเข้าไปดูใน source code ของ bonding driver (ไฟล์ bonding_main.c) มันจะเขียนไว้อย่างนี้

bond_main.c
snapshot124

snapshot125

 

snapshot126

หายงงกันแล้วใช่ไหมครับ …..  แต่ผมยังอ่ะ …. มึนตึ้บเลย ขอพักแค่นี้ก่อนละกันน๊า

Linux

Linux bonding network interface

ใจจริงแล้วอยากจะไล่เรียงเรื่อง GlusterFS ไว้อ่านเอง แต่ดูแล้วท่าจะยาวเอาเรื่อง วันนี้ก็เลยเอาเรื่องง่ายๆ มาเขียนก่อนละกัน

Bonding คือการนำเอา NIC (Network Interface Card) จริงๆ มารวมกันเพื่อสร้าง Virtual NIC ขึ้นมา ซึ่งเป้าหมายในการทำก็มีหลายอย่างเช่น  ต้องการให้มัน สามารถทำงานทดแทนกันได้ทันทีเมื่ออีกอันนึงพัง หรือต้องการเพิ่ม Bandwidth

ซึ่งการ Bonding ใน Linux(ผมอ้างอิงกับ RHEL นะ) นั้นก็มีอยู่หลาย Mode  วันนี้ยกตัวอย่างง่ายๆ อันแรกคือ

mode “0” – Load Balance แบบ Round Robin

มันจะส่ง packet ผ่าน NIC ที่เป็น slave ของมันเรียงลำดับกันไป เช่น สมมติว่า bonded interface มี slave สองอัน

– packet แรก ก็จะส่งไปที่ slave ตัวแรก
– packet ที่สองก็จะส่งไปที่ slave ตัวที่สอง
– packet ที่สามก็จะกลับไปส่งผ่านทาง slave ตัวแรก

วิธีการ config ก็ง่ายๆ สมมติว่าผมมี NIC จริงๆ อยู่ 2 อันคือ eth0 กับ eth1

Continue reading

Linux

ว่าด้วยเรื่องหน่วย GB, GiB, MiB และการคำนวนง่ายๆบน Linux

ก่อนหน้านู้นในวงการ IT เราใช้หน่วยสัญลักษณ์เพื่อวัดขนาดความจุตามมาตรฐานของ SI กันแบบงงๆ

kilobytes เราก็ถือเอาว่ามันคือ 1024 bytes

ทั้งๆ ที่ความเป็นจริงแล้วข้อมูลขนาด 1 kilobytes มันควรจะเท่า 1000 bytes ต่ะหาก

 

ปลายปี 1998 International Electrotechnical Commission (IEC) ก็เลยออกหน่วยสัญลักษณ์มาให้ใหม่ จะได้ไม่งง

2^10 จะเรียกมันว่า kibi จะใช้สัญลักษณ์ Ki ซึ่งจะมีค่าเท่ากับ 1,024

2^20 จะเรียกมันว่า mebi จะใช้สัญลักษณ์ Mi ซึ่งจะมีค่าเท่ากับ 1,048,576

2^30 จะเรียกมันว่า gibi จะใช้สัญลักษณ์ Gi ซึ่งจะมีค่าเท่ากับ 1,073,741,824

 
Continue reading

Linux

ifconfig obsolete

พวกที่ใช้ Red Hat Linux Enterprise คงต้องปรับตัวกันนิดหน่อยมื่อ RHEL version หน้าจะไม่มี ifconfig ให้ใช้แล้ว

ซึ่งจริงๆ แล้วเขาขึ้นป้าย obsolete มาตั้งนานแล้ว แล้วก็อยู่ระหว่างทะยอยเลิกใช้  ก็ RHEL นี่แหล่ะ ที่ค่อนข้างออกแนวๆ หัวโบราณหน่อยๆ อะไรที่ต้องปรับเปลี่ยน RHEL ก็จะเปลี่ยนช้าที่สุดเสมอ (คน Red Hat เขาบอกว่ามันเป็นข้อดีของ RHEL) ส่วน distro อื่นเข้าเลิกใช้กันไปหมดแล้ว

ifconfig จะโดนแทนด้วย package iproute2 เรียกได้ว่า ไม่ได้มาแทนแค่ ifconfig อย่างเดียว แต่เอามาใช้แทนกลุ่มคำสั่ง net tools หลายตัวอย่างคำสั่ง apr , route ด้วย

ifconfig  จะถูกแทนด้วย  ip addr,  ip link  เช่น

  • ip addr add 69.72.169.241 dev eth1

route จะถูกแทนด้วย ip route

  • ip route show

arp  จะถูกแทนด้วย ip neigh

  • ip neigh show

คนที่เพิ่งเริ่มใช้ linux อาจจะเจอคำสั่งใหม่นี้เลย แต่คนเก่าๆ ก็ update ความรู้กันหน่อยนะครับ …

Linux

Case Study : เขาหาว่าผมส่ง spam ติด blacklist และพูดไม่รู้เรื่อง

ก่อนหน้านี้มี IT บริษัทนึงโทรมาโวยวายว่า …  user ของเขาไม่สามารถส่งเมล์มาหา user ของผม เขาเช็คทางฝั่งเขาแล้ว provider (ผู้ดูแลระบบเมล์ฝั่งเขา)  บอกว่า Mail server ของผมติด blacklist อ่ะ ให้ผมแก้ไขหน่อย

นึกตะหงิดๆ ในใจ เอ … ถ้ากรูติด blacklist มันควรจะต้องไปกรูต่ะหาก ที่ส่งไปที่อื่นไม่ได้ เพราะเขาจะไม่รับ ก็เลยขอดูเมล์ฉบับนั้นทีมันตีกลับหน่อย

เห็นเมล์แล้วก็ร้องอ๋อ จากนั้นสมาชิกในทีมผมก็อธิบายให้ IT ท่านนั้นเข้าใจว่า อันเนี้ย มันคือสิ่งที่ Mail Server ผม reject กลับไป ว่าไม่สามารถส่งต่อเมล์ของคุณได้ เพราะ Gateway คุณนั่นแหล่ะที่ติด Blacklist  พร้อมทั้งเปิด mail header อธิบายยืดยาวว่าเมล์มันเดินทางมาอย่างไร แล้วมันถูก reject อย่างไร

เหมือนจะเข้าใจตรงกันแล้ว เขาบอกว่าจะไปจัดการ provider ของเขา …

ไม่กี่วันถัดมา เขาก็กลับมาแล้วบอกว่าเขาแก้ปัญหาแล้วด้วยการ add domain ผมเข้าไปไว้ใน white list 

ห๊ะ …. อะไรนะ …. ฉิบหายแร๊ะ แสดงว่ายังไม่เข้าใจอ่ะดิ่ ถ้า add domain ผมเข้าไปใน white list ของเขา เวลาเขาส่งเมล์ผ่าน gateway ของเขา แล้ว gateway อันนั้นมันดันติด blacklist ไอ้เจ้า mail server ผมมันก็ reject อยู่ดีอ่ะดิ่ …

Continue reading

IT Book, Linux

Apress Shell Scripting Receipes : A Problem-Solution Approach

I was read this book for many times. It’s good and  I’m reading it again now. This is my note in the book :

Page 4  — You will learn about $IFS variable.

In an example in the book :

$ IFS=’ -/.’
$ set  2005-03-01
$ printf  “%s\n”  “$@”

2005
03
01

I think it’s not right. This is a command which give you a result like that.
printf  “%s\n”  $@

(not finished ….)

Linux

Execute command on other computer

If you run SSH service on remote machine, you can execute command on that computer without open new terminal and login.

Example :  You are on 192.168.0.1 machine.

[root@y-project ~]#ssh  root@192.168.0.2  “sh -c ‘/root/yp_autocheckfile.sh'”

It will run yp_autocheckfile.sh  script on 192.168.0.2.

It’s just an easy tip but very useful.

BTW, If you want run it without password prompt, you can create private and public key but do not input key phase and add them on remote machine but please keep in mind that it will make a computer security problem too.