Sunday, March 06, 2005

รื้อฟื้นแชร์ไฟล์ผ่าน NFS กับ​Linux

อดีต

สมัยยังเรียนอยู่ มีหน้าที่ช่วยคุมคอมพิวเตอร์ในแล็บด้วย อาจารย์ไม่ได้สั่งหรอก ปกติก็ช่วยๆกันทำ แต่อาสาไปทำบ่อยๆจนกลายเป็นหน้าที่ประจำ ตอนนั้นส่วนมากที่ใช้ก็เป็น​SunOS, Digital Unix และก็​SGI IRIX Windows แทบไม่มีเลยเพราะ ศ. ไม่ชอบ จะมีบ้างก็แมค

รายชื่อผู้ใช้และ​Account ของสมาชิกแล็บก็จะอยู่บนเครื่อง SUN ไฟล์/Home ของแต่ละคนก็อยู่บน SGI ส่วน Digital ตอนนั้น Alpha มาแรง MHz สูงมาก เอาไว้ทำ Simulation

ข้อมูลพวกนี้แชร์กันผ่านทาง NIS (รายชื่อ account) และ NFS (ไฟล์) ที่ต้องใช้ทั้งสองอย่างก็เพราะบน NFS ชื่อและ uid ของผู้ใช้แต่ละคน จะต้องเหมือนกันทุกๆเครื่อง

ระยะหลังนี้สภาพแวดล้อมเปลี่ยนไป ไม่ได้ใช้ NFS มาหลายปีมาก ส่วนมากก็เล่นแต่ Windows กับ Linux แชร์ไฟล์กันก็ใช้ samba แม้แต่ Mac ก็ยังใช้ samba เรียกได้ว่าลืมรายละเอียดการตั้งค่า ฯลฯ ของ NFS ไปเกือบหมดแล้ว

ลองดูอีกที

พอดีเครื่อง lsx ที่มาใหม่ มีดิสก์เหลือแยะ ก็เลยกะว่าจะแบ่งสัก 500GB เอาไปแชร์ผ่าน NFS ให้เครื่องเซิร์ฟเวอร์ตัวเดิม longdo ใช้บ้าง เพราะไม่กี่สัปดาห์ก่อนเห็น home เพิ่งจะเต็ม ต้องโยกย้ายไฟล์หาที่ว่างกัน

เป็น Debian Linux (KNOPPIX) และ Kernel 2.6.* ทั้งคู่ ไม่น่าจะลำบาก มีผู้ใช้ไม่กี่คน เขียน /etc/password ให้ UID เหมือนๆกันเองเลยก็แล้วกัน จะได้ไม่ต้องใช้ NIS ลืมคำสั่งพวก yp* ของ NIS ไปหมดแล้ว

นั่งลองอยู่พักหนึ่ง สรุปว่าขั้นตอนเป็นดังนี้

  1. ติดตั้งแพคเกจชื่อ nfs-common ทั้งสองเครื่อง และเปิดใช้งาน

  2. ติดตั้งแพคเกจชื่อ nfs-kernel-server บนเครื่อง lsx และเปิดใช้งาน

  3. แก้ไฟล์ /etc/hosts บน lsx ให้รู้จัก longdo และกลับกัน แก้ไฟล์ /etc/hosts บน longdo ให้รู้จัก lsx

    อันนี้ค่อนข้างสำคัญ เพราะเวลาระบุชื่อเครื่องใน NFS มันจะไปหาจากไฟล์นี้ตลอด ระบุเป็น IP หรือชื่อบน DNS ไม่ได้ เพราะมันไม่เคยไปหากับ DNS เอง

  4. สมมติว่าโฟล์เดอร์บน lsx ที่จะแชร์ให้ longdo ใช้ คือ /share ต้องไปแก้ไฟล์ /etc/exports บน lsx โดยเพิ่มบรรทัด
    /share  longdo(rw,no_root_squash)
    
    แล้วสั่ง exportfs -r ให้มันอ่านไฟล์นี้ใหม่ ตัวเลือก no_root_squash เป็นการระบุว่า อนุญาตให้้ root ของเครื่อง longdo มีสิทธิ์เทียบเท่า root ของเครื่อง lsx นี้เองในการอ่านเขียนโฟลเดอร์ /share นี้

    จะได้สร้างโฟลเดอร์สำหรับผู้ใช้แต่ละคนจากเครื่อง longdo ได้เลย ไม่ต้อง Login เข้ามาสร้างบน lsx

  5. บน longdo ทำการ mount โดย (สมมติว่าจะ mount ไว้ที่ /lsx)
    # mkdir /lsx
    # mount -t nfs lsx:/share /lsx
    
    หรือไปแก้ไฟล์ /etc/fstab จะได้เมาท์เองทุกครั้งที่บูท
ตกลงใช้งานได้ดี แต่ลองคัดลอกไฟล์โตๆแล้ว พบว่า ช้าาาาาาา...สุดๆๆๆๆๆๆๆ คือ ได้ความเร็วประมาณ 0.5 MBytes/sec ทั้งๆที่เชื่อมต่อกันอยู่บน 100Mbits LAN เดียวกัน

ปรับตัวเลือกเพื่อความเร็ว

  1. อ่านเจอบนเว็บหลายแห่ง เขาบอกว่าให้กำหนดตัวเลือก rsize=8192,wsize=8192 ตอนเมาท์บนเครื่อง longdo ทำดูแล้วไม่ได้ผล ความเร็วไม่เปลี่ยนแปลงเท่าไร ไม่รู้ว่าเป็นเพราะว่า kernel 2.6.* มันใช้ค่าที่สูงอยู่แล้วหรือเปล่า ที่อ่านเจอส่วนมากพูดถึงกรณีของ kernel เก่าๆ ว่า ค่าเดิมจะเป็น 1024 ถ้าไม่กำหนดเอง

  2. ไปเจอใน man exports ว่ามีตัวเลือก async ที่กำหนดให้ NFS Server ทำการแหกกฏ บางอย่างของ NFS เพื่อเพิ่มประสิทธิภาพในการรับส่งข้อมูล ก็เลยไปแก้ /etc/exports บน lsx เป็น
    /share  longdo(rw,no_root_squash,async)
    
    แล้วสั่ง exportfs -r อีกที คราวนี้ได้ผลแฮะ ความเร็วในการคัดลอกไฟล์ข้ามเครื่อง พุ่งกระฉูดเป็นกว่า 10MBytes/sec !!
เดี๋ยวย้ายไปอยู่ห้องเดียวกัน ต่อกันโดยตรงเลยดีกว่า เพราะมีการ์ด 1000Base เหลือทั้งคู่ น่าจะเร็วกว่าผ่าน 100Base Hub ตอนนี้

No comments: