ข้ามไปเนื้อหาหลัก

สร้าง QEMU บน Windows ด้วย MSYS2: อุปสรรคและวิธีแก้

เจาะลึกเบื้องหลังการพัฒนา AQEMU เวอร์ชัน 1.6.0 ในการพอร์ต QEMU ขึ้น Windows ทั้ง x64 และ ARM64 ผ่าน MSYS2 พร้อมวิธีแก้ปัญหาเฉพาะหน้าจากบันทึก Git

เรียบเรียงโดย AI
Inewgen
11 พ.ย. 2569ที่มา: Dev.to3 นาทีอ่าน (0 ครั้ง)
แชร์
สร้าง QEMU บน Windows ด้วย MSYS2: อุปสรรคและวิธีแก้

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ขนาดตัวอักษร
  • การพัฒนา AQEMU บน Windows มักเจอปัญหาจาก build scripts มากกว่าโค้ด
  • ปัญหาระบบ Named Pipe บน Windows ต้องแก้ด้วยการทำ QEMU patch เฉพาะกิจ
  • ความขัดแย้งของ Git และ OpenSSL ในสภาพแวดล้อม MSYS2 ส่งผลให้การโคลน dependency ล้มเหลว
  • เวอร์ชัน 1.6.0 เปิดใช้งาน WHPX สำหรับ ARM64 บน Snapdragon สำเร็จ

งานส่วนใหญ่ในการพัฒนา AQEMU ซึ่งเป็น Qt front-end สำหรับ QEMU บนระบบปฏิบัติการ Windows (ทั้ง x64 และ ARM64) และ Linux ไม่ได้อยู่ที่ตัวอินเทอร์เฟซผู้ใช้ แต่กลับอยู่สคริปต์ที่ทำหน้าที่คอมไพล์ตัว QEMU ด้วย MSYS2 และแพ็กเกจสำหรับ Microsoft Store โดยในช่วงเดือนตุลาคมที่ผ่านมา นักพัฒนาต้องเสียเวลาไปถึงหนึ่งวันเต็มกับฟีเจอร์เล็กๆ ฟีเจอร์เดียว ซึ่งปัญหาทั้งหมดเกิดจากความจุกจิกของสภาพแวดล้อม Windows ล้วนๆ

เป้าหมายในตอนนั้นคือการทำให้ VM ทั่วไปสามารถเชื่อมต่อพอร์ต QEMU guest-agent ได้ สำหรับฟีเจอร์คัดลอกไฟล์ในเวอร์ชัน 1.6.0 ซึ่งบน Linux ทำได้ง่ายผ่าน Unix socket แต่บน Windows จำเป็นต้องใช้ Named Pipe แทน

software code editor dark mode developer screen

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ความพยายามครั้งแรกทำให้ระบบ Windows guest พังทับซ้อนทันที เนื่องจาก QEMU พยายามผูกเส้นทางพอร์ตเสมือนเป็น Unix socket จนทำให้ขึ้นข้อความเตือนว่า network down และเครื่องเสมือนไม่ยอมสตาร์ท ทางแก้เบื้องต้นคือการปิดการใช้งานพอร์ต guest-agent ไปก่อนในขณะที่กำลังหาวิธีที่ถูกต้อง

การใช้ MSYS2 ร่วมกับระบบ build บน Windows มักสร้างความปวดหัวให้กับนักพัฒนาข้ามแพลตฟอร์มอยู่บ่อยครั้ง เนื่องจากความแตกต่างระหว่างสถาปัตยกรรมยูนิกซ์และวินโดวส์ในเรื่องเส้นทางไฟล์ ไลบรารี และเครื่องมือคอมไพล์ ทำให้เกิดช่องโหว่ทางเทคนิคที่เครื่องมืออัตโนมัติไม่สามารถจัดการได้เองแบบเบ็ดเสร็จ

การแก้ปัญหาที่แท้จริงคือการสร้าง patch ขนาดเล็กชื่อ third_party/patches/0001-win-lazy-named-pipe.patch เพื่อให้ QEMU สามารถฟังพอร์ตบน Windows ได้ทันทีโดยไม่ต้องรอฝั่ง client เชื่อมต่อเข้ามา ทว่าปัญหาต่อมาคือคำสั่ง patch ดั้งเดิมไม่มีอยู่ในเชลล์ที่ใช้รัน build ทำใหัขั้นตอนดังกล่าวถูกข้ามไปอย่างเงียบๆ

ไม่อยากพลาดข่าวใหม่?

สมัครรับสรุปข่าวสารใหม่ทางอีเมล ไม่บ่อยจนรำคาญ

โฆษณา

  • เปลี่ยนมาใช้คำสั่ง git apply แทนการใช้ patch
  • แก้ไขปัญหา Git for Windows ที่ดึงซอร์สโค้ดมาพร้อมกับ carriage returns
  • แปลงสคริปต์ให้อ่านและเขียนไฟล์ต้นฉบับเป็น LF ก่อนรันคำสั่ง
4จำนวนคอมมิตที่ใช้แก้ปัญหาเรื่องพอร์ต Named Pipe เดียว
195จำนวนโปรไฟล์แขกใน AQEMU เวอร์ชัน 1.6.0
29สถาปัตยกรรมที่รองรับทั้งหมด

ไม่เพียงแค่นั้น ในสัปดาห์เดียวกันยังพบปัญหาไลบรารี MinGW OpenSSL บน PATH ส่งผลให้คำสั่ง git-remote-https ล้มเหลว ทิ้งโฟลเดอร์ว่างไว้จนตัว build คอมไพล์ไฟล์เปล่าๆ ออกมา การสลับมาใช้ git ของ MSYS2 เองจึงเป็นทางออกที่ถูกต้องสำหรับปัญหานี้

"If you build anything with MSYS2 and a mixed PATH , check which git and which OpenSSL you're really getting."

Chronic Engineering

นอกจากนี้ ในเวอร์ชัน 1.6.0 ยังมีการแก้ไขปัญหาสำคัญบน Windows on Arm ที่ตัวสคริปต์ข้ามการใช้งาน WHPX ไป แม้ว่า QEMU 11 จะมีแบ็กเอนด์ ARM WHPX มาให้แล้ว ทำให้ชิป Snapdragon ต้องรันบน TCG ซึ่งเป็นซอฟต์แวร์จำลองเสมือนอย่างเดียว ปัจจุบันตัว build ฝั่ง ARM64 ได้เปิดใช้งาน WHPX เรียบร้อยแล้ว พร้อมตรวจสอบว่าโฮสต์รองรับ ARM64 หรือไม่ก่อนรัน

ที่มา: Dev.to

ความคิดเห็น

แสดงความคิดเห็น
0/2000

พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้