วันพุธที่ 21 เมษายน พ.ศ. 2553

Command for finding a word in a directory




find /start/dir -exec grep -q my_search_word {} \; -print



วันจันทร์ที่ 19 เมษายน พ.ศ. 2553

cp command reply yes

yes | cp src dest

วันจันทร์ที่ 12 เมษายน พ.ศ. 2553

Archive bit

Differential and Incremental Backups
ข้อมูลโดยส่วน ใหญ่จะไม่ค่อยเปลี่ยนแปลงแบบวันต่อวัน ดังนั้นคุณสามารถประหยัดเวลาและค่าใช้จ่าย โดยการแบ็กอัพข้อมูลเฉพาะส่วนที่เปลี่ยนแปลงเท่านั้น ระบบไฟล์สามารถติดตามการเปลี่ยนแปลงแก้ไขข้อมูลได้จากพารามิเตอร์ archive bit เมื่อไรก็ตามที่ไฟล์ถูกสร้างหรือเปลี่ยนแปลงแก้ไข ข้อมูลระบบไฟล์จะเซตค่าของ archive bit เป็น 1 เมื่อเกิดการแบ็กอัพข้อมูลซอฟต์แวร์ในการแบ็กอัพจะเคลียร์ค่า archive bit (โดยการตั้งค่ากลับเป็น 0) ในแต่ละไฟล์แบ็กอัพคุณสามารถเห็นสถานะของ archive bit ได้ โดยการคลิ้กขวาที่ filename ใน Explorer เลือกที่ properties และหา Archive check box ทางด้านล่างสุด ในการแบ็กอัพข้อมูลซึ่งมีอยู่ 3 แบบ คือ แบบ Full Backup, Differential Backup, Incremental Backup จะใช้ archive bit ในการตรวจสอบสถานะของไฟล์ก่อนแบ็กอัพข้อมูล

Full Backup มีความหมายเหมือนกับชื่อที่ตั้ง คือจะสำเนาข้อมูลทุกๆ อย่างบนฮาร์ดดิสก์แล้วเคลียร์ค่า archive bit ให้เป็นศูนย์ ในแต่ละครั้งที่มีการแบ็กอัพข้อมูล การกู้คืนข้อมูลจากการแบ็กอัพข้อมูลแบบ Full backup จะใช้เพียงขั้นตอนเดียวในการแบ็กอัพ แต่ข้อเสียคือ ขนาดของไฟล์แบ็กอัพจะมีขนาดใหญ่ และใช้เวลาในการแบ็กอัพนาน

Differential Backup จะสำเนาข้อมูล เฉพาะที่ถูกแก้ไขนับตั้งแต่การทำสำเนาข้อมูลแบบ Full backup ครั้งล่าสุด และไม่เปลี่ยนแปลงค่า archive bit ของไฟล์เหล่านั้น เพราะฉะนั้นเมื่อคุณแบ็กอัพข้อมูลแบบ Differential backup ติดกัน 2 ครั้ง ข้อมูลที่ถูกแบ็กอัพในครั้งแรกก็จะถูกแบ็กอัพซ้ำอีกครั้งในครั้งที่สองด้วย การกู้คืนข้อมูลในแบบ Differential backup ในขั้นแรกคุณต้องกู้คืนข้อมูล แบบ Full backup จากข้อมูลชุดล่าสุดก่อน ตามด้วย การกู้คืนข้อมูลจาก Differential Backup ซึ่งข้อมูล ที่ถูกแก้ไขนับตั้งแต่การทำ Full backup ครั้งล่าสุดจะ อยู่ในเทปของ Differential backup ม้วนล่าสุดทั้งหมด

Incremental Backup จะสำเนาข้อมูลเฉพาะ ที่ถูกแก้ไขนับตั้งแต่การทำสำเนาข้อมูลแบบ Full Backup ครั้งล่าสุดหรือการทำ Incremental Backup ครั้งสุดท้าย และจะเคลียร์ค่า archive bit ในทุกไฟล์ที่สำเนาไว้ให้เป็นศูนย์ เพราะฉะนั้นเมื่อคุณแบ็กอัพข้อมูลแบบ Incremental backup ติดกัน 2 ครั้ง ข้อมูลที่ถูกแบ็กอัพไว้ในครั้งแรกและไม่ได้ถูกแก้ไขเพิ่มเติมอีก ก็จะไม่ถูกแบ็กอัพซ้ำ การกู้คืนข้อมูลในขั้นแรกคุณต้องกู้คืนข้อมูล Full Backup ครั้งล่าสุดก่อน ตามด้วยการกู้คืนข้อมูลจาก Incremental Backup ตามเวลาที่ต้องการกู้คืนข้อมูล

การใช้ Differential หรือ Incremental backup จะ ลดจำนวนพื้นที่ที่ใช้จัดเก็บข้อมูลลง แต่จะเพิ่มความยุ่งยากในการทำงานมากขึ้น แผนหนึ่งที่ง่ายต่อการปฏิบัติก็คือ การทำ full backup ในวันสุดท้ายของแต่ละสัปดาห์ และทำ Differential หรือ Incremental backup ในช่วงหลังเวลาเลิกงานของแต่ละวัน และไม่ควรทำ incremental กับ differential backup ร่วมกัน เพราะจะทำให้เกิดความยุ่งยากในการจัดการ

Archive bit จะถูกตรวจสอบค่าเมื่อตอน เริ่มต้นของวัน โดยระบบ DOS จะตรวจเช็กเมื่อคุณเปิดเครื่อง แต่ค่า archive bit ก็ไม่ได้เป็นตัวบ่งชี้ถึงการเปลี่ยนแปลงแก้ไขไฟล์ที่น่าเชื่อถือเท่าใดนัก เพราะโปรแกรมใดๆ ก็ตาม สามารถเปลี่ยนแปลงค่าของมันได้ตลอด โดยเรียกใช้ฟังก์ชันง่ายๆ ของวินโดวส์ ใครก็ตามที่ต้องการแก้ไขค่า archive bit ใหม่ ก็สามารถรีเซตค่าของมันได้โดยกำหนดผ่านทาง Properties dialog นอกจากนี้ไฟล์ที่ถูกลบทิ้งระหว่างการทำ Full Backup ครั้งสุดท้าย กับการทำ Incremental / Differential backup ครั้งสุดท้ายก็จะกลับขึ้นมาปรากฏอีกครั้ง เมื่อคุณต้องกู้ข้อมูลกลับมา โปรแกรมแบ็กอัพข้อมูลบางตัว เช่น Dantz Development Corp’s Retrospect (www.retro-spect.com) จะใช้ระบบ File catalog ของโปรแกรมในการตัดสินใจว่าไฟล์อะไรที่เปลี่ยน-แปลงไป Retrospect’s Incremental plus จะมีคุณสมบัติในการอนุญาตให้โปรแกรมค้นหาว่า ไฟล์ใดบ้างที่ซ้ำซ้อนกันและจะจัดเก็บเพียงสำเนาเดียว

ในอดีตที่ผ่านมานั้นการแบ็กอัพข้อมูลของไดรฟ์ แบบเป็นไฟล์ Image ถูกใช้ในการแบ็กอัพข้อมูลแบบ Full backup เพียงอย่างเดียวมาตลอด จนกระทั่งเมื่อไม่นานมานี้ ในเวอร์ชันล่าสุดของ Symantec Ghost ได้รวมเอาคุณสมบัติของการทำ Incremental backup เข้าไว้ด้วย คุณจึงสามารถจัดเก็บข้อมูลในแบบ Full Backup พร้อมๆ กับการทำ Incremental image ได้อีกด้วย

วันพฤหัสบดีที่ 8 เมษายน พ.ศ. 2553

cache_replacement_policy

สควิดถูกออกแบบมาให้เก็บแคช ดังนั้นจึงไม่ชอบการเคลียร์แคช สควิดใช้การนำอ็อบเจ็คอื่นมาเปลี่ยนแทนที่อ็อบเจ็คเก่าด้วยอ็อบเจ็คใหม่ ตามนโยบายการแทนที่ที่ได้กำหนดใน cache_replacement_policy โดยปกติจะเป็นแบบ lru ซึ่งหมายถึงเปลี่ยนแทนที่โดยเอาของเก่าๆที่เก็บไว้นานออก
heap GDSF แบบนี้จะเอาอันที่ไม่ค่อยใช้ออก โดยเฉพาะไฟล์ใหญ่ๆ ดังนั้นไฟล์เล็กๆเยอะๆจะมีโอกาส hit บ่อย
heap LFUDA แบบนี้เอาอันที่ไม่ค่อยใช้ออก ทั้งเล็กทั้งใหญ่ๆ ดังนั้นโอกาส hit น้อยกว่าเพราะเก็บจำนวนน้อยลงแต่จะช่วยด้านแบนวิธเพราะเก็บไฟล์ใหญ่
heap LRU คล้ายแบ lru คือเอาของเก่าออกแต่จะเอาอันที่ไม่ค่อยใช้ออกด้วย

สควิดจะเริ่มทำการแทนที่ เมื่อมีขนาดแคชที่เก็บถึงขีดระดับล่างหรือที่กำหนดใน cache_swap_low ซึ่งเป็น % ของขนาด cache_dir ที่กำหนดไว้ และจะพยายามคงรักษาระดับแคชไว้ที่ระดับนี้ เมื่อมีอัตราการรับอ็อบเจ็คใหม่มากกว่าการลบของเก่าออก ขนาดของแคชจะมากขึ้น การแทนที่จะก้าวร้าวขึ้น(ลบของเก่ามากขึ้น) จนไปถึงขีดระดับบนหรือที่กำหนดใน cache_swap_high
การกำหนดขนาด cache_swap_low กับ cache_swap_high ควรพิจาณาถ้าหากขนาด cache_dir มีขนาดใหญ่มาก cache_swap_low กับ cache_swap_high ก็ไม่ควรต่างกันมาก เพราะแค่ 5% อาจหมายถึงต่างกันหลายร้อยเม็ก

อ็อบเจ็คต่างๆที่สควิดเก็บโดยปกติจะถูกลบเนื่องจากการหมดอายุ (expire) ซึ่งอาจจะถูกกำหนดจากเซิรฟเวอร์ หรือเวลากำหนดไว้จาก refresh_pattern และการ การรีเฟรชอ็อบเจ็คซึ่งคืออ็อบเจ็คเดิมแต่ปรับปรุงใหม่มาแทนที่ตัวเก่า
จะเห็นว่า สควิดไม่มีทางที่เกิดอาการที่เรียกว่า แคชเต็มแล้วต้องมาเคลียร์แคช และการเคลียร์แคชเนื่องจากการปรับแต่งสควิดที่ไม่ถูกต้องก็ไม่ใช่วิธีการ ที่ดีนักเพราะมีวิธีแก้ปัญหาอื่นๆ แต่ไม่ค้นหาวิธีแก้กัน อย่างเช่น
ถ้ามีบางเว็บไซต์นั่นมีปัญหาแสดงข้อมูลเก่าไม่แสดงข้อมูลใหม่ อาจเพราะมีบางไฟล์ ถูกกำหนดจากออฟชั่นใน refresh_pattern ไม่ให้ตรวจสอบเวลาปรับปรุงล่าสุดแต่ให้เรียกข้อมูลที่อยู่ในแคชอย่างเดียว วิธีแก้ปัญหาง่ายๆอันนี้ เราก็กำหนด refresh_pattern ใหม่เป็นเฉพาะของเวบไซต์นั้นๆใส่ไว้ในบรรทัดบนๆ ก่อนบรรทัด refresh_pattern ที่มีปัญหาก็จะสามารถแก้ให้ได้รับข้อมูลใหม่ของเว็บไซต์นั้น ตย.
refresh_pattern -i .thaicybergames.com/startgame/ucg/ 0 100% 10080 ก่อนบรรทัด
refresh_pattern -i [.]dat$ 2880 100% 20160 เนื่องจากบรรทัดนี้กำหนดให้เรียกไฟล์ .dat โดยไม่ตรวจสอบเวลาปรับปรุงขั้นต่ำสองวัน ทำให้เกิดปัญหาได้ไฟล์เก่า
เมื่อใส่บรรทัดบนแล้ว สควิดจะตรวจสอบเวลาปรับปรุงล่าสุด ถ้ายังไม่ปรับปรุงก็จะเรียกข้อมูลเก่าที่สควิดเก็บไว้(ถ้าเก็บได้) ถ้าไม่ได้เก็บก็จะไปเรียกจากเว็บมา

หมายเหตุ บางครั้งสควิดเกิดอาการหยุดทำงานไปเฉยๆ ซึ่งอาจทำให้บางท่านคิดไปว่าแคชเต็ม ซึ่งที่จริงอาจเกิดจากเมมโมรี่ไม่พอ โดยทั่วไปสควิดจะต้องใช้เมมโมรี่ส่วนหนึ่งไปใช้ในการเก็บสารบัญสำหรับค้นหา อ็อบเจ็คและข้อมุลอ็อบเจ็ค (metadata) สามารถคำนวณแบบง่ายๆโดยเทียบจากขนาดแคชที่เก็บอยู่ทั้งหมด เช่น มีแคชอยู่ 100 เม็กจะใช้เมมโมรี่ 1 เม็กในการเก็บสารบัญ ถ้าหากแคชอยู่ 5 กิ๊ก ก็จะใช้เมมโมรี่ 50 เม็กในการเก็บดัชนี หากสควิดไม่สามารถใช้เมมโมรี่มาเก็บสารบัญนี้ได้ สควิดจะหยุดทำงานทันที ทางที่ดีจึงควรคำนวนการใช้งานเมมโมรี่เผื่อไว้สำหรับเก็บดัชนีสัก 2 เท่าของ ขนาด cache_dir (MB)/100
หรือการลดขนาด cachemem ก็มาช่วยเพิ่มเนื้อที่ไว้สำหรับเก็บสารบัญนี้ได้เช่นกัน

Delay Pools Squid

เกริ่นไว้ก่อนนะครับ สำหรับท่าน Admin ที่ดูแลระบบแล้วมีปัญหาเรื่อง User ชอบดาวโหลดโน่น ดาวโหลดนี่ จนทำให้เครือข่ายท่านช้า ใช้งานอินเทอร์เน็ตกันไม่ได้เลย ก็มีวิธีแก้ไขต่าง ๆ นา ๆ แต่ที่จะนำมาให้ดูในวันนี้ก็คือเรื่องของการบีบแบนด์วิธ แบบง่าย ๆ (แต่เล่นเอางงเหมือนกัน) มาให้ดูครับ

อย่างแรกต้องทำความเข้าใจเรื่องความเร็วอินเทอร์เน็ตก่อนนะครับ สมมุติ ใช้ความเร็วอินเทอร์เน็ต 2M

2M = 2048 Kb/sec หรือ 204800 byte/s (ไบท์เปอเซ็ก)

ถ้าถามว่าเน็ต 2 M จะดาวโหลดจริง ๆ ได้ความเร็วเท่าไหร่ ให้เอา 8 ไปหารครับ (แปดมาจากไหน ?? ก็ 1 byte = 8 bit ไง)
2048/8 = 256 KB/s (เคยโหลดบิตกันใช่มั้ยครับ สงสัยมั้ยครับว่าติดเน็ต 2 M ทำไมวิ่งเต็มที่แค่ 200 กว่า ๆ นี่แหละคือสาเหตุ)

แต่หน่วยที่เราจะเอาไปกรอกใน squid จะต้องเป็นหน่วย Byte ครับ ดังนั้นให้สมมุติค่าความเร็วจริง ที่คุณต้องการไว้เลย เช่น ผมต้องการให้ดาวโหลดได้ไม่เกิน 15 KB/s ดังนั้นค่าที่จะนำไปกรอกใน squid ต้อง x ด้วย 1024 เข้าไปเพื่อจะได้หน่วยออกมาเป็น byte

15 x 1024 = 15360 byte/s

ต่อไปก็เรื่องของ pools และ class ใน squid.conf ก็มีอธิบายอยู่ ผมจะอธิบายแบบง่าย ๆ ให้ฟังนะครับ

pools ก็จำนวนเงื่อนไขที่เราจะสร้างขึ้น เช่น delay pools 3 หมายความว่ามี 3 เงื่อนไข
class เป็นเรื่องของการจำกัดแบนด์วิธ ว่าจะมีกี่แบบ (ต้องอ่านคอมเม้นใน squid.conf) มันจะทำงานคู่กับ parameter เช่น
delay_class 1 1
delay_parameters 1 5120/5120
#หมายความว่า เป็น pools ที่ 1 แบบ มีคลาสเดียว สังเกตุที่ 5120/5120 มีชุดเดียว

delay_class 3 2
delay_parameters 1 51200/51200 5120/5120
#หมายความว่า เป็น pools ที่ 3 แบบ 2 คลาส การกำหนดความเร็วจะมี 2 ชุด ***กำหนดสูงสุดได้ 3 Class เท่านั้น ***


-------------------------------------------------------------------------------------------------------------------------------------------

โจทย์
ระบบเครือข่ายแห่งนึงมีอินเทอร์เน็ท ADSL 2M ต้องการให้เครื่องลูกข่ายใช้งานได้เพียง 1M เพื่อสงวนแบนด์วิธที่เหลือไว้ใช้กับกลุ่มของ Server ที่ต่อแบบ DMZ และต้องการให้เครื่องลูกข่ายที่มีนักดาวโหลด ดาวโหลดไฟล์มัลติมีเดีย ต่าง ๆ ได้เพียงแค่ 5KB/s และไฟล์บีดอัดต่าง ๆ 15KB/s ส่วนไฟล์บีบอัดจะบีบมากก็ไม่ได้ เพราะต้องเหลือแบนบิทรวมไว้บ้าง ซึ่งบาง User อาจโหลดงาน แต่ไฟล์มาเป็น zip ดังนั้นจำเป็นต้องให้แบนด์วิธรวมไว้ที่ 48 Kb/s จะต้องทำอย่างไรบ้าง.. ?

คำนวณกันก่อนเลย
- 1M = 1024 Kb/s เมื่อหารด้วย 8 ก็จะได้ความเร็วจริง = 128 KB/s
ความเร็วที่จะเขียนลงใน squid จะได้่ 128x1024 = 131072 byte/s

- ไฟล์มัลติมีเดียร์ 5KB/s จะได้ 5 x 1024 = 5120 byte/s
- ไฟล์บีดอัดต่าง ๆ 15K/b จะได้ 15 x 1024 = 15360 byte/s



ต่อไปเป็นโค้ดที่จะเขียนลงใน squid แล้วนะครับ เครื่องหมาย # คือคอมเม้นนะครับ


อ้างถึง

acl limitdown1 url_regex -i .mp3 .ogg .wav .wma .3gp .avi .mov .mp4 .mpeg .mpg .wma .mkv .divx .vob .iso .nrg
acl limitdown2 url_regex -i .zip .rar .7z .exe .msi

#ประกาศกลุ่ม ของไฟล์ต่าง ๆ ชื่อว่า limitdown1 และ limitdown2 (ตั้งชื่ออะไรก็ได้แต่ไปใส่ด้านล่างให้ถูกด้วย) โดยมีนามสกุลต่าง ๆ เพิ่มเติมลงไปได้ตามต้องการ อย่าใส่เยอะนะครับเพราะมันทำให้ squid อาจทำงานหนักได้


# ต่อไปค้นหากลุ่มของ Delay Pools นะครับ แล้วพิมพ์คำสั่งที่เหลือต่อเลยครับ
อ้างถึง
delay_pools 3

# กำหนดให้มี 3 รูปแบบ

อ้างถึง

delay_class 1 2 #
delay_parameters 1 5120/5120 5120/5120
delay_access 1 allow limitdown1
delay_access 1 deny all

#เงื่อนไข ที่ 1 มี 2 คลาส โดยกำหนดให้ กลุ่ม acl ที่ชื่อว่า limitdown1 มีแบนด์วิธรวมทั้งเครือข่ายได้แค่ 5KB/s (โหดสาดด) และดาวโหลดสูงสุดต่อเครื่องก็ได้แค่ 5KB/s ดังนั้นถ้ามีคนโหลด mp3 ณ ช่วงเวลานั้น ๆ เพียงคนเดียวก็จะวิ่งเต็มที่ 5KB/s แต่ถ้ามีคนอื่นมาโหลดพร้อมกัน มันก็จะหารลงไปอีก จาก 5KB/s



อ้างถึง

delay_class 2 2
delay_parameters 2 49152/49152 15360/15360
delay_access 2 allow limitdown2
delay_access 2 deny all

#เงื่อนไข ที่ 2 มี 2 คลาส โดยกำหนดให้ กลุ่ม acl ที่ชื่อว่า limitdown2 มีแบนด์วิธรวมทั้งเครือข่ายได้แค่ 15KB/s และดาวโหลดสูงสุดต่อเครื่องก็ได้แค่ 15KB/s ดังนั้นถ้ามีคนโหลด .rar ณ ช่วงเวลานั้น ๆ เพียงคนเดียวก็จะวิ่งเต็มที่ 15KB/s แต่ถ้ามีคนอื่นมาโหลดพร้อมกัน ไม่เกิน 3 คน ก็จะยังวิ่งที่ 15Kb/s แต่ถ้าเกิน 3 คน ก็จะลดหลั่นกันไป (กลุ่มนี้เป็นไฟล์คาบเกี่ยวระหว่าง พวกชอบโหลดโปรแกรมมาเล่น และพวกที่โหลดงาน แต่มาเป็นไฟล์ zip หรือ rar จึงต้องยืดหยุ่นกันหน่อย)


อ้างถึง

delay_class 3 2
delay_parameters 3 131072/131072 131072/131072
delay_access 3 allow localhost
delay_access 3 deny all

#เงื่อนไข ที่ 3 มี 2 คลาสเช่นกัน โดยกำหนดให้ กลุ่ม acl ที่ชื่อว่า localhost (ปกติ squid จะประกาศเป็นค่ามาตรฐานไว้แล้ว) มีแบนท์วิธรวมในการใช้งานอินเทอร์เน็ต ที่ไม่เกี่ยวข้องกับ 2 เงื่อนไขบน วิ่งกันได้ที่ความเร็ว 128 Kb/s ต่อเครื่อง และใช้งานรวมทั้งองค์กร 128 KB/s เช่นกัน เพราะฉนั้นถ้าเล่นเน็ตอยู่คนเดียว ก็เรียกได้ว่าเร็ว สุด ๆ แต่ถ้าเล่นพร้อม ๆ กัน ก็จะแชร์ความเร็วลงไป ..


# สังเกตนะครับว่าทุก pools ผมจะกำหนดให้ใช้ delay_class แบบ 2 คลาส (สังเกตุจะมีเลข xx/xx xxx/xxx อยู่ 2 ชุด)
# ชุดแรก หมายถึง Bandwidth รวมทั้งวงเน็ตเวิร์ค ที่เราอนุญาตให้โหลด
# ชุดสอง หมายถึง Bandwidth ของแต่ละเครื่อง ที่เราอนุญาตให้โหลด


-------------------------------------------------------------------------------------------------------------------------------
เพิ่มเติมให้นิดหน่อย ในเงื่อนไขที่ 3 หากต้องการความเร็วแบบ unlimit แนะนำให้ใส่ -1/-1 ลงไปแทนการกรอกตัวเลขครับ
อ้างถึง

delay_class 3 1
delay_parameters 3 -1/-1
delay_access 3 allow localhost
delay_access 3 deny all

# หมายความว่าเงื่อนไขที่ 3 แบบ 1 คลาส ปล่อยให้เครื่องลูกดาวโหลดได้แบบ unlimit โดยไม่มีการแบ่งรายเครื่อง หรือรายเครือข่าย ซึ่งความเร็วเน็ตก็จะถูกแบ่งปันแบบอัตโนมัติครับ

อ้างถึง
# For example, if delay pool number 1 is a class 2 delay pool as in the
# above example, and is being used to strictly limit each host to 64kbps
# (plus overheads), with no overall limit, the line is:
#
#delay_parameters 1 -1/-1 8000/8000
#
# Note that the figure -1 is used to represent "unlimited".


!! ถ้าดูจากคอมเม้นของ squid อาจจะดูแย้ง ๆ กันหน่อย มันบอกว่าลิมิตสำหรับ host ไว้แค่ 64 เมื่อคิดดูแล้ว 8*8 ก็ได้ 64 จริง ที่เท่าที่ผมลองทำดูวิธีแบบที่ผมทำมันก็ได้ผลอยู่นะ !!




ขอ จบเรื่อง Delay Pools เพียงแค่นี้ละครับ ผิดพลาดประการใดต้องขออภัยมา ณ. ที่นี้ด้วย เพราะบนความนี้ผมได้ทดลองด้วยตัวเอง (จนคิดว่าชัวแล้ว) เพราะไปอ่าน ๆ มาจากหลาย ๆ สำนักก็ยัง งง เลยต้องเอามารวม ๆ ประยุกต์และปรับใช้กับความคิดผมเองเลยได้มาเป็นดังตัวอย่าง

ICP Squid

ICP คืออะไร
ICP (Internet Cache Protocol) เป็นโปรโตคอลที่ใช้สำหรับการสื่อสารระหว่าง web caches เป็น lightweight protocol ที่อยู่ในส่วนบนของ UDP โดย ICP จะถูกใช้เพื่อหาตำแหน่งของ web object ใน cache ที่อยู่ข้างเคียง (neighboring caches) การถ่ายโอน object ระหว่าง cache ส่วนใหญ่จะทำด้วย TCP-based HTTP protocol แต่การตัดสินว่าจะดึง object จากที่ไหนนั้นต้องใช้วิธีการที่ง่ายและรวดเร็ว

ใน
cache หนึ่ง ๆ การหาตำแหน่งที่ดีที่สุดที่จะดาวน์โหลด object ตัว cache จะส่ง ICP request packet ไปยัง sibling cache และ parent cache ทุกตัว แล้ว cache เหล่านี้ก็จะ ส่ง ICP ตอบกลับมาด้วย HIT code หรือ MISS code ซึ่ง HIT หมายถึง cache ตัวนี้มี object และตกลงที่จะให้บริการ ส่วน MISS หมายถึงไม่มี object ที่ต้องการ ดังนั้น cache ตัวที่เป็นผู้ร้องขอก็จะรูว่าใครมี object ที่ตัวเองต้องการและมันจะเอาข้อมูลนี้รวมกับตัวประกอบอื่น ๆ เช่น round-trip time หรือการตอบสนองในแต่ละครั้ง เพื่อที่จะเลือกได้ว่าจะร้องขอผ่าน HTTP ไปยัง cache ตัวไหน ถ้า cache ตอบกลับมาเป็น MISS packet ตัว cache ที่เป็นผู้ร้องขอก็จะทำการร้องขอ document จาก parent cache กระบวนการร้องขอและตอบกลับ ICP (ICP request/reply exchange) ควรจะเกิดขึ้นในช่วงสั้น ๆ มิฉะนั้นจะทำให้เพิ่มเวลาแฝง (latency time) ให้กับ browser
แต่เวลาตรงนี้ผู้ใช้มักจะไม่สามารถสังเกตได้

ถ้า
object ที่ได้ร้องขอผ่าน ICP มีขนาดเล็กเพียงพอ object นี้ก็สามารถถูกรวมอยู่ใน ICP HIT reply เหมือนกับ HTTP redirect แต่การทำแบบนี้ไม่ค่อยมีกันมากนัก การใช้งาน ICP ที่กล่าวมานี้จะใช้เมื่อระบบเครือข่ายเป็นแบบ multi-level cache ที่ประกอบด้วย sibling cache และ parent cache เท่านั้น ซึ่งการใช้งาน ICP ไม่มีความจำเป็นสำหรับเครือข่ายในรูปที่ 1 และ 2 ในกรณีที่มี cache เพียงตัวเดียวหรือในกรณีที่ cache มีการร้องขอ document จาก higher-lever cache ที่เหมือนกัน สิ่งที่ ICP ไม่ต้องการก็เฉพาะ overhead
เท่านั้น

การกำหนด access list ใน Squid Proxy Server ตอนที่ 2

ในตอนที่สองนี้จะอธิบายดีฟอลต์คอนฟิก acl ที่ติดตั้งมากับ Fedora 10 โดยจะแยกเป็นส่วนๆ พร้อมทั้งแนะนำวิธีการแก้ไขคอนฟิกและการ reload เซอร์วิสหลังจากการแก้ไข

ดีฟอลต์คอนฟิก acl ของ Squid เวอร์ชั่น squid-3.0.STABLE10 ที่ติดตั้งมากับ Fedora 10 จะแตกต่างจากเวอร์ชั่นก่อนๆ คือ อนุญาตเครื่องไคลเอนต์ที่มี ip address เป็น private (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) มีสิทธิใช้ proxy ซี่งแนะนำให้มีการแก้ไขก่อนนำไปใช้งานจริง


อนุญาตให้ใช้งานและจัดการเกี่ยวกับ cache_object ได้จากในเครื่องที่ติดตั้ง (localhost)

acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8

http_access allow manager localhost
http_access deny manager
http_access allow localhost

อนุญาตเครื่องไคลเอนต์ที่มี ip address เป็น private สามารถใช้งานได้

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

http_access allow localnet

แนะนำให้ปิด (comment) ทั้งสี่บรรทัด ด้านบน แล้วค่อยกำหนด ip address ของไคลเอนต์ที่มีสิทธิใช้งาน proxy ได้อีกที

ปิดการอนุญาตเครื่องไคลเอนต์ที่มี ip address เป็น private

#acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
#acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

#http_access allow localnet

ปฏิเสธการเชื่อมต่อโดยใช้พอร์ตของเว็บไซต์ ที่ไม่ใช่พอร์ต Safe_ports

เบอร์พอร์ต Safe_ports มีดังนี้ 80, 21, 443, 70, 210, 280, 488, 597, 777, 1025-65535

acl Safe_ports port 80      # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http

http_access deny !Safe_ports

ปฏิเสธการเชื่อมต่อแบบ SSL ไปยังพอร์ตที่ไม่ใช่พอร์ตเบอร์ 443

acl SSL_ports port 443
acl CONNECT method CONNECT

http_access deny CONNECT !SSL_ports

ปฏิเสธการใช้งานอื่นๆ ที่ไม่ match จาก acl ที่กำหนดไว้

http_access deny all

วิธีการแก้ไขไฟล์คอนฟิก /etc/squid/squid.conf

เพื่อสะดวกในการอ้างอิงภายหลัง การแก้ไขเพิ่มเติม acl ทั้งในส่วนกำหนดชื่อ aclname และการอนุญาตหรือปฏิเสธ ในไฟล์ /etc/squid/squid.conf ให้แก้ไขใต้บรรทัด ที่มีคำว่า

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

หลังจากแก้ไขไฟล์คอนฟิกของ squid ต้องใช้คำสั่ง service reload เซอร์วิส เพื่อให้คอนฟิกใหม่มีผล

[root@proxy ~]# service squid reload

หากมีข้อผิดพลาดในคอนฟิก จะมี error ฟ้องขึ้นมา ต้องแก้ไขให้ถูกต้อง คอนฟิกใหม่ถึงจะมีผล

ตัวอย่างการกำหนด ip address ผิดในไฟล์คอนฟิก

[root@proxy ~]# service squid reload
2009/01/17 12:58:36| aclParseIpData: Bad host/IP: '192.168.1.02-'
FATAL: Bungled squid.conf line 643: acl acl_client1 src 192.168.1.02-
Squid Cache (Version 3.0.STABLE10): Terminated abnormally.
CPU Usage: 0.005 seconds = 0.001 user + 0.004 sys
Maximum Resident Size: 0 KB
Page faults with physical i/o: 0

การกำหนด access list ใน Squid Proxy Server ตอนที่ 1

คุณสมบัติอย่างหนึ่งของ Squid Proxy Server คือสามารถกำหนดสิทธิในการใช้งาน access list ได้หลายรูปแบบ และค่อนข้างละเอียดมาก เช่นที่ยกตัวอย่างในบทความ คอนฟิก Squid Proxy Server เป็นการอนุญาตเฉพาะเครื่องไคลเอนต์ที่มี ip address ตามที่กำหนด สามารถใช้ proxy ได้

ในบทความนี้จะกล่าวถึงการกำหนดสิทธิในรูปแบบอื่นๆ ที่สามารถทำได้ ตามความต้องการ

ส่วนการคอนฟิก access list ใน Squid

ไฟล์คอนฟิกหลักของโปรแกรม Squid โดยดีฟอลต์แล้วคือไฟล์ /etc/squid/squid.conf ประกอบด้วยคอนฟิกหลายส่วน (TAG) ด้วยกัน ในบทความนี้เราจะเปลี่ยนเฉพาะในส่วน “TAG: acl” และ “TAG: http_access” เท่านั้น

คำแนะนำ สำรองไฟล์ (backup) /etc/squid/squid.conf ไว้ ก่อนการแก้ไข

การคอนฟิกจะมีสองขั้นตอนดังนี้

1) คอนฟิก TAG: acl

ขั้นแรกเพิ่มคอนฟิกในส่วน acl เพื่อกำหนดชื่อ (aclname) และชนิด (acltype) ของ access list มีรปแบบคอนฟิกดังนี้

acl    ...

คำอธิบาย

  • เป็นชื่อ acl ที่เรากำหนดเอง โดยชื่อชี้จะถูกกำหนดในขั้นตอนที่สองอีกทีว่าจะอนุญาตหรือปฏิเสธ
  • เป็นชนิด access list ที่เราจะใช้ แสดงรายละเอยดในหัวข้อถัดไป
  • เป็นค่าพารามิเตอร์ สามารถกำหนดได้หลายค่า ขึ้นอยู่กับ acltype

2) คอนฟิก TAG: http_access

ส่วนที่สองคือเพิ่มคอนฟิกในส่วน TAG: http_acces เพื่อที่จะอนุญาต (allow) หรือปฏิเสธ (deny) ชื่อ acl (aclname) ที่สร้างไว้ มีรูปแบบคอนฟิกดังนี้

http_access {allow|deny} [!] ...

คำอธิบาย

  • คอนฟิก http_access เป็นตัวกำหนดว่า aclname ที่ match ได้นั้น จะอนุญาตหรือปฏิเสธการใช้งาน
  • หากมีหลาย aclname ถูกกำหนดไว้ในบรรทัดเดียวกัน การ match ได้จะต้อง match ชื่อ aclname ทั้งหมด
  • รูปแบบการ match จะไล่เรียงตั้งแต่บรรทัดแรกจนถึงบรรทัดสุดท้ายที่ขึ้นต้นด้วย http_access
  • เครื่องหมายตกใจ ! เป็นการ match ในทางตรงกันข้าม

ชนิดของ access list

สามารถดูรายละเอียดทั้งหมดของ acltype ได้จากในไฟล์ /etc/squid/squid.conf แต่ในที่นี้ขอยกตัวอย่างมาเฉพาะที่ใช้กันบ่อยๆ ดังนี้


กำหนด ip address : src, dst

ตัวอย่าง match ไคลเอนต์ที่มี ip address อยู่ใน subnet 192.168.1.0/24 หรือ 192.168.2.0/24

acl acl_client1 src 192.168.1.0/24 192.168.2.0/24

ตัวอย่าง match ไคลเอนต์ที่มี ip address ระหว่าง 192.168.1.1 ถึง 192.168.1.10

acl acl_range1 src 192.168.1.1-192.168.1.10

ตัวอย่าง match การเข้าเว็บไซต์ที่มี ip address 10.1.0.1 หรือ 10.9.0.22

acl acl_server1 dst 10.1.0.1/32 10.9.0.22/32

กำหนดชื่อเว็บไซต์ : dstdomain

ตัวอย่าง match การเข้าเว็บไซต์ที่มีโดเมนเนมเป็น .useless-website.com

acl acl_domain1 dstdomain .useless-website.com

กำหนดพอร์ต : port

ตัวอย่างการ match การเข้าเว็บไซต์ พอร์ต 8080 หรือ พอร์ต 9000

acl acl_port1 port 8080 9000

กำหนดช่วงเวลา : time

พารามิเตอร์ที่ใช้กำหนดช่วงเวลามีสองส่วนคือ วัน และเวลา มีรูปแบบคอนฟิกดังนี้

acl aclname time [day-abbrevs] [h1:m1-h2:m2]

คำอธิบาย

  • day-abbrevs : เป็นอักษรย่อของวัน ตามด้านล่างนี้

S – Sunday
M – Monday
T – Tuesday
W – Wednesday
H – Thursday
F – Friday
A – Saturday

  • h1:m1 เวลาเริ่มต้น
  • h2:m2 เวลาสิ้นสุด
  • h1:m1 ต้องน้อยกว่า h2:m2

ตัวอย่างการ match การเข้าเว็บไซต์ระหว่างเวลา 12:00-13:00 ตั้งแต่วันจันทร์ถึงวันศุกร์

acl acl_time1 time MTWHF 12:00-13:00

refresh_pattern ใน squid proxy

squid เป็นหนึ่งในซอฟต์แวร์ที่มีค่าคอนฟิกเยอะมาก และมีเกร็ดการ fine-tune เยอะแยะไปหมด เพื่อนสมาชิกที่มีประสบการณ์ก็สามารถมาแชร์เป็นวิทยาทานกันได้นะครับ

ผมเองไม่มีประสบการณ์การ fine-tune squid มากนัก แต่เร็ว ๆ นี้ ได้ไปเจอ เคล็ดวิชา refresh pattern มา และใช้ได้ผลพอประมาณ เลยเอามาเล่าสู่กันฟัง

refresh pattern เป็นตัวกำหนดว่าจะให้อะไรเก่าอะไรใหม่สำหรับแคชและการตอบกลับ ซึ่งโดยหลักการแล้ว คุณควรจะให้ squid เชื่อตาม HTTP header ต่าง ๆ ที่เว็บเซิร์ฟเวอร์ตอบกลับมา ว่าอะไรเก่าอะไรใหม่ขนาดไหน แต่โชคไม่ดีที่ค่าต่าง ๆ เหล่านี้มักตอบมาตามค่า default ของเว็บเซิร์ฟเวอร์ ซึ่งไม่ช่วยอะไรนักสำหรับการทำแคช ดังนั้น การปรับ refresh pattern จึงช่วยได้ในเรื่องนี้

refresh pattern ใน squid.conf จะอยู่ในรูปแบบ:

refresh_pattern [-i] regex min percent max [options]
โดยที่

regex คือนิพจน์เรกิวลาร์แทน URL ที่จะเข้ากฎ โดยปกติจะ case sensitive ยกเว้นเมื่อมีตัวเลือก -i
min คืออายุที่ต่ำที่สุด (เป็นนาที) ของอ็อบเจกต์ที่จะเริ่มพิจารณาความเก่าใหม่ โดยถ้าต่ำกว่านี้จะถือว่าใหม่เสมอ (ยกเว้นว่ามีการกำหนดเวลาหมดอายุมาใน HTTP header)
max คืออายุที่สูงที่สุด (เป็นนาที) ของอ็อบเจกต์ที่จะยังคงพิจารณาความเก่าใหม่อยู่ โดยถ้าสูงกว่านี้จะถือว่าเก่าเสมอ
percent คือเปอร์เซ็นต์ของอายุในแคชของอ็อบเจกต์นับตั้งแต่ refresh ครั้งล่าสุด เทียบกับอายุจริงของอ็อบเจกต์ตามที่เว็บเซิร์ฟเวอร์รายงาน ที่จะยังคงถือว่าอ็อบเจกต์นั้นยังใหม่อยู่
options คือตัวเลือกเพิ่มเติม ซึ่งจะกล่าวถึงในภายหลัง
ตัวอย่างเช่น

refresh_pattern -i \.gif$ 1440 20% 10080
หมายความว่า:

ถ้าอ็อบเจกต์ *.gif มี header ระบุเวลาหมดอายุ ก็เชื่อถือตาม header นั้น จบ ถ้าไม่มี จึงพิจารณาต่อไป
ถ้าอ็อบเจกต์อยู่ในแคชต่ำกว่า 1440 นาที (1 วัน) ถือว่ายังใหม่อยู่ ใช้ค่าในแคชตอบกลับได้ทันที
ถ้าอ็อบเจกต์อยู่ในแคชมานานเกิน 10080 นาที (7 วัน) ถือว่าเก่าแล้ว ให้ดึงอ็อบเจกต์มาใหม่จากเว็บเซิร์ฟเวอร์
ถ้าอายุในแคชของอ็อบเจกต์อยู่ระหว่าง 1440-10080 นาที ให้พิจารณาอายุในแคช ว่าถึง 20% ของอายุจริงหรือไม่ เช่น ถ้าเว็บเซิร์ฟเวอร์รายงานมาว่าอ็อบเจกต์นี้สร้างขึ้นเมื่อ 10,000 นาทีที่แล้ว ก็พิจารณาว่าอ็อบเจกต์อยู่ในแคชมานานถึง 20% ของ 10,000 คือ 2,000 นาทีหรือไม่ ถ้ายังไม่ถึง ก็ถือว่ายังใหม่ ถ้าถึง ก็ถือว่าเก่าแล้ว
ส่วน options หรือตัวเลือกเพิ่มเติม ส่วนใหญ่จะเป็นการพยายามละเมิดมาตรฐาน HTML เพื่อเพิ่มอัตราการแคช จึงควรระมัดระวังในการใช้งาน ตัวเลือกมีดังนี้:

override-expire -- ไม่ต้องสนใจ header ระบุเวลาหมดอายุที่เว็บเซิร์ฟเวอร์บอกมา (พิจารณาตามกฎเสมอ)
override-lastmod -- ไม่สนใจ header ระบุเวลาเปลี่ยนแปลงล่าสุดที่เว็บเซิร์ฟเวอร์บอกมา (ถือว่าอ็อบเจกต์มีอายุจริงเท่ากับ min แม้จะเพิ่งเปลี่ยนแปลงใหม่)
reload-into-ims -- เปลี่ยน request "no-cache" จากลูกข่ายให้เป็น If-Modified-Since
ignore-reload -- ไม่สนใจ header "no-cache" จากลูกข่าย และจะใช้ข้อมูลในแคชถ้าทำได้
ignore-no-cache -- ไม่สนใจ header "Pragma: no-cache" และ "Cache-control: no-cache" ที่ส่งมาจากเว็บเซิร์ฟเวอร์ ซึ่ง HTTP RFC ไม่ได้อนุญาตให้เว็บเซิร์ฟเวอร์ทำ แต่ก็มักจะทำกัน
ignore-no-store -- ไม่สนใจ header "Cache-control: no-store" ที่ส่งมาจากเว็บเซิร์ฟเวอร์
ignore-private -- ไม่สนใจ header "Cache-control: private" ที่ส่งมาจากเว็บเซิร์ฟเวอร์
ignore-auth -- เก็บอ็อบเจกต์ที่ต้องผ่านการยืนยันตัวบุคคลของผู้อ่านลงแคชด้วย
refresh-ims -- ส่ง request If-Modified-Since ไปที่เว็บเซิร์ฟเวอร์เมื่อผู้ใช้ refresh หน้าเว็บ
คุณสามารถปรับ refresh pattern ให้เก็บอ็อบเจกต์ที่มักไม่มีการเปลี่ยนแปลง เช่น รูปภาพ เสียง วีดิทัศน์ แฟ้มโปรแกรม แฟ้มบีบอัด ฯลฯ ให้อยู่ในแคชนานขึ้นได้ เพื่อเพิ่มอัตราการ hit เช่น (คัดลอกมาจากบทความต้นตอ):

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ \
10080 90% 43200 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(iso|avi|wav|mp3|mp4|mpeg|swf|flv|x-flv)$ \
43200 90% 432000 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(deb|rpm|exe|zip|tar|tgz|ram|rar|bin|ppt|doc|tiff)$ \
10080 90% 43200 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.index.(html|htm)$ 0 40% 10080
refresh_pattern -i \.(html|htm|css|js)$ 1440 40% 40320
refresh_pattern . 0 40% 40320
กฎจะถูกนำมาตรวจสอบเรียงทีละกฎจากบนลงล่าง จนกว่าจะพบกฎแรกที่ตรง ก็จะใช้กฎนั้นและหยุดตรวจสอบต่อ ดังนั้น กฎสุดท้ายจึงเป็นกฎที่เอาไว้รองรับแพตเทิร์นที่เหลือโดยทั่วไป และมักจะแยกกฎสำหรับโพรโทคอลอื่นอย่างเช่น FTP และ gopher เอาไว้บนสุด เพื่อกันไม่ให้มาใช้กฎด้านล่าง

วันพฤหัสบดีที่ 1 เมษายน พ.ศ. 2553

WindowsXP File Sharing

Select the disk to be shared (for example in "My Computer") and right-click on the icon
of the disk to get the Context / popup-menu, select "Sharing and Security" :

Unlike the XP Home-Edition, where the system will display
some additional information concerning security issues,
you are as a user of Windows XP Professional expect to
know what you are doing and you have to handle yourself
any seruity issue
Sharing only folders is more
selective and not such a high
security problem :

Once you have selected the
folder to be shared, make
either a Right-click to select
"Sharing and Security..."
or select from the
"File and Folder Tasks"
(on the left side) to :
"Share this folder"
If you have installed Windows XP Professional
and you get this windows for Sharing, then your
system is configured for "Simple File Sharing"
(same method as in Sharing for Windows XP Home) :
(see also Windows XP Simple Sharing and ForceGuest of
the Windows XP Professional Resource Kit )

Your choice :
You can follow the suggestion of Microsoft
and work also on Windows XP Professional
with "Simple File Sharing", then please
follow the procedure for Sharing on
Windows XP Home.


Or you can turn off "Simple File Sharing"
and work with File-Sharing like on
Windows 2000
( shown below) .
Open "My Comuter" and select from the
menu "Tools" to Display the "Folder Options..." :


Tab : "View", section "Advanced settings" :

Look for "Use simple file sharing (Recommended"

To deactivate the "Simple File Sharing",
uncheck the option :

The process of sharing a disk or folder is identical
to the procedure used on Windows NT4 and Windows 2000.

There is already an "invisible" disk-sharing (C$, D$,...),
allowing network administrator to access the disk.

To create a share, which will be displayed in the
Network Neighborhood, create a "New Share".
Enter the name of the share, as to be used on the network
and as to be displayed in the Network Neighborhood.

You can change the "Permisisons"
By default, all users defined on your XP Professional
system will have full permisisons.
You can reduce the permissons (for example to allow
only Read-access ) and/or you could add a different
group of users to have access permisison (but then you
should delete the group "Everyone" from this list).
You can then select the different share-names from
the drop-down list, to be able to view/modify the
permissions or to remove the sharing.
Once a disk or folder is shared, the icon will show it via the "holding hand :"


On NTFS disks / partitions, you can also controll access via Security.

You can check the usage of the shared resource via the network (files used, users connected).

Access-Based Enumeration in Windows Server

You remember Access Based Enumeration right? I’m often surprised by people who didn’t know this features exists, so here’s refresher.

Access Based Enumeration is the add-on to Windows Server 2003 and included in Windows Server 2008 that controls the display of files and folders in remote shares based on user-rights. This is the tool that helps you create dynamic Start Menus for Terminal Servers or turn a user home share view from this:

ABEShareBefore

into this:

ABEShareAfter

It’s also especially good for those common file shares that everyone has access but are full of folders they can’t access.

To use ABE in Windows Server 2003, you’ll need to download and install the installer for Windows 2003 Service Pack 1 and above. You can then enabled access-based enumeration on each share:

AccessBasedEnumeration2003

For Windows Server 2008, ABE is built in and you can enable it by opening the Share and Storage Management MMC to view your list of shares, open the properties for the target share, click Advanced and add the tick to Enable access-based enumeration.

AccessBasedEnumeration2008

Nice and easy, so stop reading this post and going and enable ABE now.. Here’s more on ABE if you’re interested: