1 คะแนน โดย GN⁺ 2024-12-01 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Ntfs2btrfs เป็นเครื่องมือสำหรับแปลงระบบไฟล์ Microsoft NTFS ไปเป็นระบบไฟล์โอเพนซอร์ส Btrfs แบบ in-place และทำงานในลักษณะคล้ายกับ btrfs-convert สำหรับ ext2
  • ก่อนแปลง อิมเมจต้นฉบับจะถูกบันทึกไว้ที่ image/ntfs.img เป็น สำเนาแบบ reflink และหากต้องการคงผลลัพธ์การแปลงไว้ สามารถลบอิมเมจนี้เพื่อคืนพื้นที่ได้
  • บน Windows ให้รัน ntfs2btrfs.exe D:\ จาก Command Prompt แบบผู้ดูแลระบบ ส่วนบน Linux ให้รัน ntfs2btrfs /dev/sda1 ด้วยสิทธิ์ root
  • ไม่ทำงานกับไดรฟ์บูตหรือไดรฟ์ที่มี pagefile ซึ่งกำลังใช้งานอยู่ และเมื่อใช้ WinBtrfs หากต้องการลบ subvolume image ต้องปลดแฟล็ก readonly ก่อน
  • ขอบเขตที่รองรับรวมถึงไฟล์ ไดเรกทอรี symbolic link, security descriptor, alternate data stream, การ rollback ของ NTFS และการคง metadata ของ LXSS แต่ไม่รองรับไฟล์ที่เข้ารหัสและขนาดคลัสเตอร์ที่ผิดปกติ

Ntfs2btrfs ทำอะไร

  • Ntfs2btrfs เป็นเครื่องมือสำหรับ แปลงแบบ in-place จากระบบไฟล์ NTFS ไปเป็น Btrfs
  • อิมเมจต้นฉบับจะถูกบันทึกไว้ที่ image/ntfs.img เป็น สำเนาแบบ reflink
    • หากต้องการคงผลลัพธ์การแปลงไว้ สามารถลบไฟล์นี้เพื่อคืนพื้นที่ได้
  • แม้เครื่องมือจะระบุว่ามีความเสถียร แต่มีคำเตือนว่าผู้เขียนจะไม่รับผิดชอบหากเกิดปัญหา
  • มีการเชื่อมโยงไปยัง WinBtrfs ซึ่งเป็นไดรเวอร์ระบบไฟล์ Btrfs สำหรับ Windows และเป็นโปรเจกต์ที่ควรดูประกอบ
  • ใช้โค้ด ntfs-3g-system-compression ของ Eric Biggers ซึ่ง reverse engineer “WOF compressed data” ของ Windows 10

วิธีใช้งานและข้อจำกัด

  • บน Windows ให้รันจาก Command Prompt แบบผู้ดูแลระบบ
    • ntfs2btrfs.exe D:\
  • บน Linux ให้ระบุ block device ด้วย สิทธิ์ root
    • ntfs2btrfs /dev/sda1
  • บน Windows ไม่สามารถแปลงเป้าหมายต่อไปนี้ได้
    • ไดรฟ์บูต

      • ไดรฟ์ที่มี pagefile ซึ่งกำลังใช้งานอยู่
      • หากใช้ WinBtrfs เมื่อต้องการลบ subvolume image ต้องปลดแฟล็ก readonly ก่อน

ช่องทางการติดตั้ง

  • บน Windows สามารถดาวน์โหลดไฟล์ Zip ล่าสุดจาก Releases page หรือใช้ Scoop ได้
  • มีแพ็กเกจสำหรับ Linux distribution ต่าง ๆ
  • สำหรับ distribution หรือระบบปฏิบัติการอื่น ต้องคอมไพล์เอง

การคอมไพล์และ dependency

  • บน Windows ให้เปิดไดเรกทอรีซอร์สด้วย MSVC รุ่นใหม่ แล้วสั่ง Compile จาก CMakeLists.txt
  • บน Linux ให้ build ด้วย cmake และ make
    • mkdir build
    • cd build
    • cmake ..
    • make
  • การ build ต้องใช้ libfmt ซึ่งติดตั้งได้จาก package manager
  • การรองรับการบีบอัดต้องใช้ zlib, lzo, zstd
    • สามารถปิดการรองรับดังกล่าวได้ด้วยตัวเลือก CMake WITH_ZLIB, WITH_LZO, WITH_ZSTD

ฟีเจอร์ที่รองรับ

  • สามารถแปลงหรือคงรายการต่อไปนี้ไว้ได้
    • ไฟล์

    • ไดเรกทอรี

      • symbolic link
      • reparse point อื่น ๆ
      • security descriptor
      • alternate data stream
      • attribute ของ DOS
      • hidden, system เป็นต้น
      • การ rollback ไปยังอิมเมจ NTFS ต้นฉบับ
      • การคง metadata ของ LXSS

รายการที่ไม่รองรับ

  • ไม่รองรับ extended attribute แบบเก่าของ Windows
  • ไม่รองรับ alternate data stream ขนาดใหญ่ที่เกิน 16KB
  • ไม่รองรับการคงแฟล็ก case-sensitivity
  • ไม่รองรับขนาดคลัสเตอร์ที่ผิดปกติซึ่งไม่ใช่ 4KB
  • ไม่รองรับ ไฟล์ที่เข้ารหัส

การเปลี่ยนแปลงสำคัญที่เห็นจากประวัติการเปลี่ยนแปลง

  • รุ่นวันที่ 2025-06-16 แก้ปัญหาการคอมไพล์กับ GCC 15
  • รุ่นวันที่ 2024-01-15 แก้ปัญหาการคอมไพล์ที่เกิดจาก GCC 14 เปิดใช้ -Werror=incompatible-pointer-types เป็นค่าเริ่มต้น
  • รุ่นวันที่ 2023-05-01 แก้ปัญหาลำดับของ inline extent item และปัญหาค่าระดับของ metadata item
    • ทั้งสองปัญหาระบุว่าไม่สามารถวินิจฉัยได้ด้วย btrfs check
    • เปลี่ยนให้ข้าม ADS ที่มีชื่อยาวเกินไป
  • รุ่นวันที่ 2022-08-12 รวมตัวเลือก --no-datasum, การคง metadata ของ LXSS/WSL, การแก้การรู้จำ drive letter ตัวพิมพ์เล็ก และการแก้ความเสียหายเมื่อวางไฟล์ในพื้นที่ 1MB สุดท้าย เป็นต้น
  • รุ่นวันที่ 2021-09-23 เพิ่มการรองรับการบีบอัดของ Btrfs และการ rollback
    • การบีบอัดรองรับ zlib, lzo, zstd
    • hash algorithm รองรับเพิ่มเป็น xxhash, sha256, blake2
    • รองรับ security descriptor สไตล์ NT4 ด้วย
    • ปรับปรุงความเร็วการแปลงของ volume ที่มี inode จำนวนมาก
    • แก้บั๊กความเสียหายของระบบไฟล์ที่ btrfs check ตรวจจับไม่ได้ด้วย
  • รุ่นวันที่ 2021-01-05 รวมการแก้ปัญหาเกี่ยวกับการบีบอัด NTFS, “WOF compressed data” และ sparse file

กรณีบูต Windows จาก Btrfs

  • ระบุว่าสามารถบูต Windows จาก Btrfs ที่แปลงด้วยเครื่องมือนี้ได้ หากเงื่อนไขเหมาะสม
  • มีการเชื่อมโยงไปยังโปรเจกต์ที่เกี่ยวข้องคือ Quibble

1 ความคิดเห็น

 
GN⁺ 2024-12-01
ความเห็นจาก Hacker News
  • ลิงก์ฝั่ง Quibble ที่ วิศวกรรมย้อนกลับ Windows kernel bootloader แบบเปิดเผยและขยายต่อได้ น่าสนใจกว่ามาก: https://github.com/maharmstone/quibble

  • ถ้าจะทำแบบนี้บน ZFS ก็น่าจะเพิ่มเลเยอร์ที่อ่านฟอร์แมตไฟล์ซิสเต็มอื่นแล้วสังเคราะห์ ZFS block pointers ขึ้นมา
    แบบนั้น ZFS ก็จะอ่านไฟล์ซิสเต็มอื่นได้ และค่อย ๆ เขียนทับใหม่ทั้งหมดระหว่างกระบวนการเขียน หาก ZFS มีความสามารถในการเขียน block pointer ใหม่ ก็น่าจะบังคับให้มันเขียนใหม่ทั้งชุดเพื่อจบการแปลงได้ แต่ก่อนหน้านี้เคยมีคนอธิบายไว้ว่า ZFS ไม่ใช่ไฟล์ซิสเต็มแบบ content-addressable storage (CAS) ที่แท้จริง จึงไม่มีความสามารถแบบนั้นและก็ไม่น่าจะมีได้

  • ถ้ามีใครใช้ BTRFS อยู่ อยากรู้ว่าช่วงนี้เสถียรภาพเป็นยังไงบ้าง? เมื่อก่อนเห็นกรณีน่ากลัวเยอะมาก

    • มันเป็นค่าเริ่มต้นของ openSUSE เลยใช้บนพีซีหลักกับโน้ตบุ๊กมาหลายปี แล้วก็ได้รู้ว่า snapshot คือฟีเจอร์ที่ตัวเองต้องการโดยไม่เคยรู้มาก่อน
      ไม่เคยมีปัญหาเลย แต่เรื่องน่ารำคาญคือพื้นที่ว่างที่ BTRFS คิดกับที่ส่วนอื่นของระบบปฏิบัติการคิดไม่ตรงกันตลอด ถึงอย่างนั้นก็แทบไม่เคยกลายเป็นปัญหาจริง
    • ใช้ BTRFS อย่างเดียว บนโน้ตบุ๊กส่วนตัว เซิร์ฟเวอร์ และอุปกรณ์ฝังตัวมานานกว่า 10 ปี โดยไม่เคยมีปัญหาแม้แต่ครั้งเดียว
      ถ้าไม่ใช่งานโหลดฐานข้อมูล ก็แทบไม่เข้าใจเลยว่าทำไมจะต้องใช้ไฟล์ซิสเต็มอื่น มองว่ามันเป็นไฟล์ซิสเต็มตัวแทนของ Linux ไปแล้ว
    • ใช้กับอุปกรณ์ส่วนตัวและ แบ็กอัปด้วย btrbk มาหลายปีแล้ว ไม่มีปัญหา
    • ตอนยังไม่ถึง 1 ปี พอดิสก์เต็มบน Tumbleweed มันก็พัง
      พยายามเข้าไปซ่อมพาร์ทิชันที่เสียจากสภาพแวดล้อมติดตั้งแบบขนานแล้ว แต่ไม่ช่วยอะไร
    • Btrfs กำลังกัดกินข้อมูลของฉันช้า ๆ ไฟล์เล็กหรือบางเซกเตอร์ของไฟล์ใหญ่จะถูกเปลี่ยนเป็นค่า null แบบสุ่มทั้งหมด
  • ฉันต้องการสิ่งนี้เมื่อ 2 เดือนก่อน ต้องฟอร์แมตฮาร์ดดิสก์ที่มีข้อมูล มากกว่า 10TB จาก NTFS
    เป็นโปรเจกต์ที่ยอดเยี่ยม

  • ถ้ารองรับไฟล์ที่ใช้ การบีบอัด LZX ด้วยก็คงน่าทึ่งมาก
    มันไม่เหมือนการบีบอัดไฟล์สมัย Windows 2000 และเป็นฟีเจอร์ที่ต้องเปิดด้วย compact.exe /C /EXE:LZX (filename)

  • เคยลองใช้เมื่อก่อน แล้วผลออกมาเป็น ดิสก์แบบอ่านอย่างเดียว หวังว่าตอนนี้จะดีขึ้นแล้ว

  • ระดับของ ความบ้าบิ่น ที่เห็นตรงนี้ทะลุกราฟไปเลย

    • มันไม่ได้เสี่ยงอย่างที่คิด
      วิธีมาตรฐานคือจองไฟล์ขนาดใหญ่ไว้ในไฟล์ซิสเต็มเดิมสำหรับเมทาดาทาของไฟล์ซิสเต็มใหม่ จากนั้นไล่ดูทุกไฟล์ในไฟล์ซิสเต็มเดิมแล้วใช้ fiemap() เพื่อสร้าง extent ใหม่ที่ชี้ไปยังข้อมูลเดิม การเขียนจะเกิดขึ้นเฉพาะในพื้นที่ที่จองไว้
      superblock จะถูกเขียนทับเป็นอย่างสุดท้ายเท่านั้น และก่อนถึงจุดนั้นก็ตรวจสอบได้ว่าเนื้อหาของไฟล์ซิสเต็มเดิมกับใหม่ตรงกัน
    • เมื่อหลายปีก่อนมันใกล้เคียงกับการเล่นกลด้วยเลื่อยยนต์มากกว่า: https://github.com/maharmstone/ntfs2btrfs/issues/9
      ตอนนั้นฉันเคยไปยุ่งกับมันและตามเจอบั๊กแย่ ๆ อยู่หลายตัว หวังว่าตอนนี้จะเสถียรกว่าเดิม
    • Apple ก็เคยทำอะไรคล้ายกันจาก HFS+ ไป APFS บนอุปกรณ์จริงในสเกลระดับหลายพันล้านเครื่องของ OS X/iOS
      อย่างที่คนอื่นพูดกัน มันทำอย่างเป็นระบบในระดับใหญ่ได้ แต่ก็แน่นอนว่าต้องระวังมาก
    • นี่ไม่ใช่ btrfs ของ Linux
      “WinBtrfs เป็นไดรเวอร์ Windows สำหรับไฟล์ซิสเต็ม Linux รุ่นถัดไป Btrfs มันถูกเขียนขึ้นใหม่ทั้งหมดตั้งแต่ต้น ไม่มีโค้ดจาก Linux kernel และควรทำงานได้บนทุกเวอร์ชันตั้งแต่ Windows XP เป็นต้นไป อีกทั้งยังถูกรวมเป็นส่วนหนึ่งของระบบปฏิบัติการเสรี ReactOS ด้วย”
      ข้อความนี้ยกมาจากหน้าของผู้ดูแล ntfs2btrfs
      https://github.com/maharmstone/btrfs
    • ในฐานะคนที่เคยเห็น Windows พังสองรอบจากการอัปเกรดแบบทำในที่เดิม ฉันคงไปซื้อ ดิสก์ใหม่หรือคอมใหม่ แล้วเริ่มต้นใหม่ดีกว่า
      รู้ว่านี่เป็นคนละกรณี แต่เวลาที่ใส่ลงไปกับข้อมูลนั้นมีค่ามากกว่าดิสก์ใหม่เยอะ สำหรับฉันมันไม่คุ้มจะรับความเสี่ยง ถ้าข้อมูลไม่สำคัญมากหรือมีแบ็กอัปดีอยู่แล้ว และอยากช่วยจับบั๊ก ก็คงพอลองได้
  • มันเจ๋งมาก แต่คงมีคนจำนวนมากที่เพิ่งมารู้เรื่องนี้หลังจากเพิ่งจัดการ ฟอร์แมตไดรฟ์ NTFS ที่ผัดวันประกันพรุ่งมา 2 ปี เสร็จไปอย่างน้อยสักสัปดาห์แล้ว