เรามาเจาะลึกในระบบของLinuxกันครับ
FILE และ DIRECTORY
ใน Unix/Linux นั้นจะมีโครงสร้างไปในลักษณะแบบรากต้นไม้ ซึ่งภายในนั้นจะมีทั้ง directories, sub-directories, และ data files.โดยแต่ละสิ่งจะมีชื่ออยู่ในระบบไฟล์ทั้งสิ้น ซึ่งกล่าวได้ว่าทุกๆอย่างในระบบ Linux/Unix นั้นล้วนแต่ถูกมองว่าเป็นไฟล์ทั้งสิ้นนั่นเอง
File
โดยไฟล์ในระบบ Unix/Linux นั้นคือ byte ที่ร้อยเรียงต่อกันแบบไม่มีโครงสร้างอะไร โครงสร้างใดๆที่จำเป็น (เช่น database) จะถูกสร้างขึ้นโดยโปรแกรมที่จัดการไฟล์นั้นๆอีกที โดยตัว Linux เองนั้นไม่รู้อะไรเกี่ยวกับไฟล์เลย เพียงแต่เป็นตัวที่จัดการส่ง data จากไฟล์กลับไปให้โปรแกรมจัดการในรูปแบบ byte ที่ร้อยเรียงอยู่ในไฟล์เท่านั้น
โดยปกติแล้วเวลาที่ผู้ใช้ใช้งานอุปกรณ์ใดๆ (เช่น Harddisk, Network Cards, Partition, Keyboards, Printer และอื่นๆ) ในระบบ Linux การเชื่อมต่อจะผ่าน driver ตามที่ได้เรียนรู้ไปในบทก่อนหน้านี้ ซึ่งเมื่อเชื่อมต่อผ่าน driver แล้ว ระบบ Linux จะถูก list เป็นหนึ่งในไฟล์ของระบบ และเมื่อมีการใช้งานก็จะถูกมองเป็นชุดของข้อมูลซึ่งไม่ต่างจาก file อื่นๆแต่อย่างใด ยกตัวอย่างเช่น
โดยปกติแล้วเวลาที่ผู้ใช้ใช้งานอุปกรณ์ใดๆ (เช่น Harddisk, Network Cards, Partition, Keyboards, Printer และอื่นๆ) ในระบบ Linux การเชื่อมต่อจะผ่าน driver ตามที่ได้เรียนรู้ไปในบทก่อนหน้านี้ ซึ่งเมื่อเชื่อมต่อผ่าน driver แล้ว ระบบ Linux จะถูก list เป็นหนึ่งในไฟล์ของระบบ และเมื่อมีการใช้งานก็จะถูกมองเป็นชุดของข้อมูลซึ่งไม่ต่างจาก file อื่นๆแต่อย่างใด ยกตัวอย่างเช่น
- Memory ของเครื่อง จะถูกอ้างอิงเป็น /dev/mem
- Harddisk จะถูกอ้างอิงเป็น /dev/sda
- Terminal (Keyboard + screen) จะถูกอ้างอิงเป็น /dev/tty1
เป็นต้น

Directory
Directory ก็เปรียบเสมือนแฟ้มที่เก็บไฟล์ไว้ภายในหรืออาจจะเก็บ directory ซ้อนใน directory (sub-directory) ก็ทำได้เช่นกัน
การตั้งชื่อไฟล์และ Directory
การตั้งชื่อใน file และ Directory ในระบบ Linux นั้นมีกฏในการตั้งชื่อดังต่อไปนี้
1. ชื่อทุกๆชื่อนั้นเป็น case sensitive กล่าวคือ secplayground.txt กับ Secplayground.txt นั้นจะถือว่าคนละไฟล์ เพราะตัวอักษรไม่เหมือนกัน
2. เราสามารถใช้ตัวอักษรทั้งใหญ่และเล็กและ . (dot) ได้ รวมถึงสามารถใช้อักขระพิเศษเป็นส่วนประกอบในชื่อได้ไม่ว่าจะเป็น ‘ ‘(space), <, >, |, \, :, (, ), &, ;, และ _ ในการตั้งชื่อได้ แต่เมื่อถูกอ้างอิงจะต้องใส่ \ นำหน้า เช่น test\ space จะหมายถึง “test space” เป็นต้น
3. ส่วนที่บ่งบอกว่าไฟล์นั้นๆเป็นไฟล์ประเภทไหน ไม่เกี่ยวกับนามสกุลไฟล์ (file extension) ที่เรากำหนดในไฟล์ แต่มักจะทำเพื่อให้แยกแยะได้ง่ายขึ้นมากกว่าว่าไฟล์ไหนเป็นไฟล์ประเภทอะไรมากกว่า
4. ใน Linux และ UNIX สมัยใหม่ส่วนใหญ่จะกำหนดให้ไฟล์มีชื่อได้ไม่เกิน 255 ตัวอักษร (255 Bytes) อย่างไรก็ตามใน Linux/Unix เก่าๆนั้นจะจำกัดอยู่เพียง 14 ตัวอักษรเท่านั้น
5. หากมีการตั้งชื่อไฟล์หรือ directory ขึ้นต้นด้วย .(dot) จะทำให้เมื่อใช้คำสั่ง ls แล้วไม่ปรากฏในผลของคำสั่ง จำเป็นต้องใช้
1. ชื่อทุกๆชื่อนั้นเป็น case sensitive กล่าวคือ secplayground.txt กับ Secplayground.txt นั้นจะถือว่าคนละไฟล์ เพราะตัวอักษรไม่เหมือนกัน
2. เราสามารถใช้ตัวอักษรทั้งใหญ่และเล็กและ . (dot) ได้ รวมถึงสามารถใช้อักขระพิเศษเป็นส่วนประกอบในชื่อได้ไม่ว่าจะเป็น ‘ ‘(space), <, >, |, \, :, (, ), &, ;, และ _ ในการตั้งชื่อได้ แต่เมื่อถูกอ้างอิงจะต้องใส่ \ นำหน้า เช่น test\ space จะหมายถึง “test space” เป็นต้น
3. ส่วนที่บ่งบอกว่าไฟล์นั้นๆเป็นไฟล์ประเภทไหน ไม่เกี่ยวกับนามสกุลไฟล์ (file extension) ที่เรากำหนดในไฟล์ แต่มักจะทำเพื่อให้แยกแยะได้ง่ายขึ้นมากกว่าว่าไฟล์ไหนเป็นไฟล์ประเภทอะไรมากกว่า
4. ใน Linux และ UNIX สมัยใหม่ส่วนใหญ่จะกำหนดให้ไฟล์มีชื่อได้ไม่เกิน 255 ตัวอักษร (255 Bytes) อย่างไรก็ตามใน Linux/Unix เก่าๆนั้นจะจำกัดอยู่เพียง 14 ตัวอักษรเท่านั้น
5. หากมีการตั้งชื่อไฟล์หรือ directory ขึ้นต้นด้วย .(dot) จะทำให้เมื่อใช้คำสั่ง ls แล้วไม่ปรากฏในผลของคำสั่ง จำเป็นต้องใช้
ls -a
เพื่อให้ file หรือ directory นั้นปรากฏขึ้นมา
Index Nodes (Inodes)
จริงๆแล้ว file system นั้นมิได้ถูกเก็บไว้ใน disk แบบชื่อแต่อย่างใดๆ แต่จริงๆถูกเก็บในลักษณะโครงสร้างข้อมูลแบบตัวเลข หรือที่เรียกว่าinode
ทุกๆอย่างที่เก็บใน Linux/Unix ไม่ว่าจะเป็น file, directory, file system, และอื่นๆ นั้นจะมีหมายเลข inode (inode number) บ่งบอกอยู่ ซึ่งจะใช้ชี้ว่าเก็บที่ใดและคุณลักษณะของไฟล์ (attributes) ซึ่ง inode number นั้นจะไม่มีการซ้ำกันโดยเด็ดขาด เราสามารถดูว่า inode ของไฟล์นั้นๆ โดยใช้คำสั่ง
ทุกๆอย่างที่เก็บใน Linux/Unix ไม่ว่าจะเป็น file, directory, file system, และอื่นๆ นั้นจะมีหมายเลข inode (inode number) บ่งบอกอยู่ ซึ่งจะใช้ชี้ว่าเก็บที่ใดและคุณลักษณะของไฟล์ (attributes) ซึ่ง inode number นั้นจะไม่มีการซ้ำกันโดยเด็ดขาด เราสามารถดูว่า inode ของไฟล์นั้นๆ โดยใช้คำสั่ง
ls -i
จากที่เห็นจะพบว่าแม้จะมีไฟล์ gcc หลายไฟล์ แต่แต่ละไฟล์ก็ไม่ไดีมีการเก็บที่ inode เรียงกันแต่อย่างใด โดยจากตัวอย่างจะเห็นว่า /usr/bin/gcc จะมี inode number เป็น 702 เมื่อเรามีการพยายามเข้าใช้งาน /usr/bin/gcc ตัวระบบจะหาว่าอยู่ที่ไหน จากนั้นจะเช็คว่าไฟล์นั้นมี inode number เป็นอะไร เมื่อพบว่าไฟล์ดังกล่าวมี inode number เป็น 702 ตัวระบบก็จะเรียกไปยังพื้นที่ใดๆใน harddisk ที่เก็บ inode หมายเลข 702 ไว้ เพื่อจะเข้าถึง /usr/bin/gcc นั่นเอง
Inode ที่ใช้ในหลายไฟล์
Inode number นั้นในตอนต้น ได้บอกไปว่าใน inode number นั้นจะไม่ซ้ำกันเลย แต่ก็มีความเป็นไปได้ที่ไฟล์ 2 ไฟล์นั้นจะมี inode number เดียวกันเช่นกัน

จากในภาพจะเห็นว่า python3.4 และ python3.4m นั้นมี inode number เป็น 180 ซึ่งเป็นหมายเลขเดียวกัน หรือก็คือ inode number นั้นจะไม่ซ้ำกัน แต่จะมีหลายชื่อได้นั่นเอง
จากในภาพจะเห็นว่า python3.4 และ python3.4m นั้นมี inode number เป็น 180 ซึ่งเป็นหมายเลขเดียวกัน หรือก็คือ inode number นั้นจะไม่ซ้ำกัน แต่จะมีหลายชื่อได้นั่นเอง
Inode เก็บการอ้างอิงไปยัง disk block และคุณสมบัติ
จากที่กล่าวไปข้างต้นว่า inode นั้นใช้ในการจัดการพื้นที่ของ harddisk ของไฟล์หรือ directory โดย inode จะเก็บตำแหน่ง pointer ของ disk block ที่เก็บข้อมูลของไฟล์หรือ directory ไว้
ยิ่ง file , directory นั้นใหญ่แค่ไหน ก็ยิ่งต้องใช้ disk block pointer ใน inode มากขึ้นเท่านั้น
นอกเหนือจากนั้น inode ยังเก็บคุณสมบัติ (attributes) ของไฟล์ไว้อีกด้วย ซึ่ง attributes นั้นมีทั้ง permission, เจ้าของไฟล์, กลุ่มของไฟล์, เวลาของไฟล์ (timestamp), ขนาด, และอื่นๆ ส่วน attributes ของ directory นั้นจะเป็นแค่ข้อมูลของ directory เหมือนๆกับไฟล์ ไม่มีการระบุว่าไฟล์ใดๆหรือ directory ใดๆที่อยู่ภายใน directory ที่ inode นั้นอ้างอิงถึงแต่อย่างใด
ยิ่ง file , directory นั้นใหญ่แค่ไหน ก็ยิ่งต้องใช้ disk block pointer ใน inode มากขึ้นเท่านั้น
นอกเหนือจากนั้น inode ยังเก็บคุณสมบัติ (attributes) ของไฟล์ไว้อีกด้วย ซึ่ง attributes นั้นมีทั้ง permission, เจ้าของไฟล์, กลุ่มของไฟล์, เวลาของไฟล์ (timestamp), ขนาด, และอื่นๆ ส่วน attributes ของ directory นั้นจะเป็นแค่ข้อมูลของ directory เหมือนๆกับไฟล์ ไม่มีการระบุว่าไฟล์ใดๆหรือ directory ใดๆที่อยู่ภายใน directory ที่ inode นั้นอ้างอิงถึงแต่อย่างใด
ตรวจสอบจำนวนของ inode ภายในเครื่อง
ในระบบที่มีการสร้างไฟล์จำนวนมากอย่าง Log System นั้นจะมีปัญหาเรื่องของจำนวน inodes เต็มได้ (Harddisk พื้นที่ยังเหลือแต่สร้างไฟล์เพิ่มไม่ได้เนื่องด้วยพื้นที่ในการสร้าง inode เต็ม) ดังนั้นต้องคอยลบไฟล์ที่ไม่จำเป็นอีกต่อไป เพื่อที่จะลบ inodes ที่ไม่มีการใช้งานแล้วด้วยนั่นเอง ซึ่งเราสามารถตรวจสอบได้ว่าเครื่องเรามีการใช้งาน inode ไปเท่าไหร่แล้ว โดยใช้คำสั่งเป็น
df -i
จากภาพจะเห็นว่า inode ใน / นั้นถูกใช้ไป 245264 และใช้งานได้อีก 3943736 นั่นเอง หากต้องการหาว่า directory ไหนนั้นมี file เยอะ สามารถใช้คำสั่งเป็น
for i in /*; do echo $i; find $i |wc -l; done
จากนั้นค่อยลบไฟล์ใน directory ที่มีจำนวน inodes เยอะอีกที ซึ่งต้องแน่ใจด้วยว่าไฟล์ใน directory นั้นไม่จำเป็นต้องใช้อีกต่อไปแล้ว
Comments
Post a Comment