Skip to content

เอกสารปกขาว ​

เอกสารนี้เจาะลึกถึงการออกแบบสถาปัตยกรรม การเลือกใช้เทคโนโลยี และตรรกะการทำงานระดับล่างของฟีเจอร์สำคัญของ WSL Dashboard มุ่งให้มุมมองเชิงเทคนิคเชิงลึกแก่นักพัฒนาและผู้ใช้ระดับสูง

1. ภาพรวมสถาปัตยกรรม ​

WSL Dashboard ใช้สถาปัตยกรรมแบบคลาสสิก UI เชิงตอบสนองเป็นตัวขับเคลื่อน + งานเบื้องหลังแบบอะซิงโครนัส ใช้ระบบชนิด (type system) และโมเดลความเป็นเจ้าของ (ownership) ของภาษา Rust เพื่อรับประกันความปลอดภัยของหน่วยความจำและประสิทธิภาพการทำงานพร้อมกันสูง

คอมโพเนนต์หลัก ​

  • Frontend (UI): อินเทอร์เฟซแบบประกาศ (declarative) บนพื้นฐาน Slint เธรด UI รับผิดชอบการเรนเดอร์และการโต้ตอบกับผู้ใช้
  • Backend (Runtime): รันไทม์แบบอะซิงโครนัสบนพื้นฐาน Tokio รับผิดชอบการแจกจ่ายและรันคำสั่งระบบ (CLI), I/O ไฟล์ และการฟังเครือข่าย
  • Communication: เธรด UI และงานอะซิงโครนัสสื่อสารกันอย่างมีประสิทธิภาพและปลอดภัยต่อเธรดผ่าน Channel (MPSC) และ Shared State (Arc/Mutex/RwLock)

2. เหตุผลการเลือกเทคโนโลยี ​

ทำไมต้องเลือก Rust? ​

  • ประสิทธิภาพ: แอ็บสแตรกชันต้นทุนศูนย์ คอมไพล์เป็นโค้ดเครื่องแบบ native ไม่มี GC jitter
  • ความปลอดภัยของหน่วยความจำ: กำจัดบัฟเฟอร์โอเวอร์โฟลว์และการแข่งข้อมูลในเวลาคอมไพล์ สำคัญอย่างยิ่งสำหรับเครื่องมือที่เกี่ยวข้องกับการทำงานระดับระบบ (เช่น การย้ายดิสก์ การกำหนดค่าเครือข่าย)
  • ขนาดไบนารี: ลิงก์ทุกไลบรารีแบบสถิต ให้โปรแกรมปฏิบัติการแบบพกพาไฟล์เดียว

ทำไมต้องเลือก Slint + Skia? ​

  • ไวยากรณ์แบบประกาศ: การอธิบายอินเทอร์เฟซแยกจากตรรกะ โค้ดดูแลรักษาง่าย
  • การเรนเดอร์ Skia: ใช้ประโยชน์จาก GPU acceleration โดยตรง (ผ่านเอ็นจิน Skia) ให้ความคมชัดระดับซับพิกเซลของตัวอักษรและเอฟเฟกต์แอนิเมชันลื่นไหล
  • โอเวอร์เฮดต่ำ: เทียบกับ Electron หรือ WPF โอเวอร์เฮดรันไทม์ของ Slint เล็กมาก

3. การใช้งานทางเทคนิคที่สำคัญ ​

3.1 การตรวจจับและแยกวิเคราะห์อินสแตนซ์ WSL ​

แอปดึงสถานะอินสแตนซ์แบบเรียลไทม์โดยเรียก wsl.exe --list --verbose และแยกวิเคราะห์ผลลัพธ์ (จัดการการเข้ารหัส UTF-16)

  • การถอดรหัสระดับล่าง: ตัวถอดรหัสการเข้ารหัสที่มีประสิทธิภาพซึ่งพัฒนาขึ้นเอง รับประกันการแยกวิเคราะห์ผลลัพธ์ที่ถูกต้องในสภาพแวดล้อม Windows ที่มี locale ต่างกัน
  • การซิงค์สถานะ: ใช้กลไกซิงค์คู่คือการโพลล์ตามรอบ + การทริกเกอร์จากการดำเนินการ

3.2 การย้ายอิมเมจดิสก์ (VHDX Move) ​

ฟีเจอร์การย้ายใช้กลไกนำเข้า-ส่งออกของ WSL แต่มีการแอ็บสแตรกชันระดับสูงและการประมวลผลแบบอะตอมิก

  • การรับประกันเชิงธุรกรรม: ก่อนเริ่มการย้าย แอปจะล็อกดิสทริบิวชันเป้าหมายผ่าน Mutex ป้องกันข้อมูลเสียหายจากการทำงานพร้อมกัน
  • การลงทะเบียนอัตโนมัติ: หลังการย้ายเสร็จ แอปจะเปลี่ยนพาธ VHDX และลงทะเบียนดิสทริบิวชันใหม่โดยอัตโนมัติ ผู้ใช้ไม่ต้องจัดการด้วยตนเอง

3.3 การส่งต่อพอร์ตและการทำงานไฟร์วอลล์อัตโนมัติ ​

ฟีเจอร์เครือข่ายไม่ใช่แค่การเรียก netsh interface portproxy ธรรมดา

  • การจัดการวงจรชีวิตกฎ: แอปตรวจจับกฎไฟร์วอลล์ที่มีอยู่โดยอัตโนมัติ เมื่อผู้ใช้สร้างการส่งต่อ แอปจะใช้ Windows API หรือ CLI สร้างกฎข้อยกเว้นขาเข้าพร้อมกัน
  • การดึง IP อัตโนมัติ: ผ่านการแยกวิเคราะห์ผลลัพธ์ wsl hostname -I แมป IP เครือข่ายเสมือนระหว่างโฮสต์กับอินสแตนซ์โดยอัตโนมัติ

3.4 การผสานรวม USBIP ​

ใช้ส่วนติดต่อบรรทัดคำสั่งของ usbipd-win

  • การจัดการยกระดับสิทธิ์: การผูก (bind) ต้องใช้สิทธิ์ผู้ดูแลระบบ ตรรกะเบื้องหลังมีการส่งต่อคำขอยกระดับ UAC อย่างมีระดับ
  • สเตตแมชชีนสถานะ: รักษาสเตตแมชชีนการเชื่อมต่ออุปกรณ์ USB ภายใน เพื่อรับประกันการตรวจสอบย้อนกลับของกระบวนการ Attach/Detach

3.5 การตรวจสอบทรัพยากรและความเบา ​

แอปตรวจสอบการใช้ทรัพยากรของตัวเองโดยเรียก Windows native APIs (เช่น GetProcessMemoryInfo)

  • เบาสุด ๆ: ในโหมดเงียบของ tray แอปจะปลดปล่อยทรัพยากร UI ที่ไม่จำเป็นโดยเชิงรุก สำหรับชุดอักขระมาตรฐานเช่นภาษาอังกฤษ การใช้หน่วยความจำต่ำถึง 10MB; สำหรับชุดอักขระซับซ้อนเช่นจีน-ญี่ปุ่น-เกาหลี เนื่องจากต้องโหลดแคชเรนเดอร์ฟอนต์ขนาดใหญ่ การใช้อยู่ประมาณ 38MB

4. ตัวชี้วัดการปรับปรุงประสิทธิภาพ ​

ตัวชี้วัดเป้าหมาย/ที่วัดได้วิธีการปรับปรุง
ความเร็วเริ่มต้น< 500msคอมไพล์อินเทอร์เฟซ Slint ล่วงหน้า ลดการแยกวิเคราะห์ตอนรันไทม์
หน่วยความจำพื้นฐาน (tray)~10MBลดความถี่การโพลล์เบื้องหลัง ปลดปล่อยแคชเรนเดอร์ตามความต้องการ
การใช้งาน CPU (นิ่ง)< 0.1%ใช้โมเดลขับเคลื่อนด้วยอีเวนต์ของ Windows หลีกเลี่ยงการโพลล์ลูปเปล่า
เฟรมเรตการเรนเดอร์60 FPSเร่ง GPU ด้วย Skia เรนเดอร์แอนตี้เอเลียสซิ่งระดับซับพิกเซล

5. ตรรกะการแจกจ่ายงานเบื้องหลัง ​

เพื่อรับประกันความลื่นไหลของ UI การทำงานหนักทั้งหมด (เช่น การส่งออก VHDX) จะถูกแจกจ่ายผ่านงานอะซิงโครนัส:

  1. การห่อคำขอ: เธรด UI ห่อการทำงานของผู้ใช้เป็นข้อความ Command
  2. ช่องข้อความ: ส่งไปยังตัวจัดการงานเบื้องหลังผ่าน tokio::sync::mpsc
  3. การส่งคืนสถานะ: หลังงานเบื้องหลังเสร็จ อัปเดต UI ผ่านคอลแบ็กหรือสถานะร่วม การออกแบบนี้รับประกันว่าแม้ประมวลผลงานสำรองขนาดหลาย GB อินเทอร์เฟซยังตอบสนองการคลิกของผู้ใช้แบบเรียลไทม์

6. ข้อพิจารณาด้านความปลอดภัย ​

  • การทำงานแบบอะตอมิก: สำหรับการยกเลิกการลงทะเบียนและการย้ายอินสแตนซ์ที่สำคัญ มีการตรวจสอบล่วงหน้า
  • การจัดการยกระดับ UAC: ขอสิทธิ์เฉพาะเมื่อจำเป็น (เช่น การผูกอุปกรณ์ USB) ตามหลักสิทธิ์น้อยที่สุด
  • การจัดเก็บในเครื่อง: ค่ากำหนดถูกเก็บในเครื่องที่ ~\.wsldashboard เท่านั้น ไม่มีการซิงค์คลาวด์ใด ๆ ปกป้องความเป็นส่วนตัวของผู้ใช้