3 คะแนน โดย GN⁺ 2024-04-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • BTFS คือระบบไฟล์ BitTorrent ที่เมานต์ไฟล์ .torrent หรือ magnet link เพื่อใช้งานเหมือนเป็นไดเรกทอรีแบบอ่านอย่างเดียวในโครงสร้างไฟล์
  • เนื้อหาไฟล์จะถูก ดาวน์โหลดแบบออนดีมานด์ เมื่อแอปพลิเคชันอ่านไฟล์ และเครื่องมือทั่วไปอย่าง ls, cat, cp จะทำงานตามที่คาดไว้
  • แอปพลิเคชันอย่าง vlc, mplayer ก็สามารถทำงานได้โดยไม่ต้องแก้ไข ทำให้จัดการคอนเทนต์ทอร์เรนต์ได้เหมือนไฟล์ทั่วไป
  • มีวิธีติดตั้งแพ็กเกจสำหรับ Debian/Ubuntu, Arch Linux, Gentoo, Fedora, Fedora OSTree, OpenSUSE และ macOS
  • dependency บน Linux คือ fuse3, libtorrent, libcurl และการ build จากซอร์สใช้ลำดับ autoreconf, configure, make

BTFS ทำอะไร

  • BTFS ช่วยให้เมานต์ไฟล์ .torrent หรือ magnet link เพื่อใช้งานเหมือนเป็นไดเรกทอรีแบบอ่านอย่างเดียวภายในโครงสร้างไฟล์ได้
  • เนื้อหาไฟล์จะถูก ดาวน์โหลดแบบออนดีมานด์ เมื่อแอปพลิเคชันอ่านจริง ๆ
  • เครื่องมือระบบไฟล์ทั่วไปทำงานได้ตามเดิม
    • ls
    • cat
    • cp
  • แอปพลิเคชันก็ใช้ได้โดยไม่ต้องแก้ไข
    • vlc
    • mplayer

ขั้นตอนการใช้งานพื้นฐาน

  • สร้างไดเรกทอรีสำหรับเมานต์ เชื่อมต่อไฟล์ทอร์เรนต์ แล้วเรียกใช้ไฟล์ในไดเรกทอรีเหมือนไฟล์ทั่วไป
$ mkdir mnt
$ btfs video.torrent mnt
$ cd mnt
$ vlc video.mp4
  • การ unmount และออกจากการใช้งานทำด้วย fusermount
$ fusermount -u mnt

การติดตั้งแพ็กเกจ

  • บน Debian/Ubuntu ติดตั้งด้วย apt-get
# apt-get install btfs
  • บน Arch Linux ติดตั้งด้วย pacman
# pacman -S btfs
  • บน Gentoo ติดตั้งด้วย emerge
# emerge -av btfs
  • บน Fedora ติดตั้งแพ็กเกจ fuse-btfs ด้วย dnf
# dnf install fuse-btfs
  • บน Fedora OSTree ติดตั้ง fuse-btfs ด้วย rpm-ostree
$ rpm-ostree install fuse-btfs
  • บน OpenSUSE ติดตั้งด้วย zypper
# zypper install btfs
  • บน macOS ใช้ brew
$ brew install btfs

dependency บน Linux

  • dependency ที่จำเป็นบน Linux มีดังนี้
    • fuse3: บน Ubuntu 22.04 คือ fuse3
    • libtorrent: บน Ubuntu 22.04 คือ libtorrent-rasterbar8
    • libcurl: บน Ubuntu 22.04 คือ libcurl4

Build จากซอร์ส

  • บน Debian/Ubuntu รุ่นใหม่ ให้ติดตั้ง build dependency แล้ว clone repository จากนั้นรัน autoreconf, configure, make
$ sudo apt-get install autoconf automake libfuse3-dev libtorrent-rasterbar-dev libcurl4-openssl-dev g++
$ git clone https://github.com/johang/btfs.git btfs
$ cd btfs
$ autoreconf -i
$ ./configure
$ make
  • หากต้องการติดตั้งด้วย ให้รัน make install เพิ่มเติม
$ make install
  • การ build บน macOS ใช้ brew เพื่อติดตั้ง dependency แล้วใช้ลำดับ build เดียวกัน
$ brew install --cask macfuse libtorrent-rasterbar autoconf automake pkg-config
$ git clone https://github.com/johang/btfs.git btfs
$ cd btfs
$ autoreconf -i
$ ./configure
$ make
  • หากต้องการติดตั้งบน macOS ด้วย ให้รัน make install
$ make install

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

 
GN⁺ 2024-04-17
ความคิดเห็นจาก Hacker News
  • ถ้ามี โปรแกรมฝั่งเซิร์ฟเวอร์ ที่ทำงานคู่กันก็คงดี หมายถึงตัวที่ทำหน้าที่เป็นทั้งตัวสร้างไฟล์ทอร์เรนต์, tracker และไฟล์เซิร์ฟเวอร์แบบง่าย ๆ
    ในองค์กรขนาดใหญ่ น่าจะเอาข้อมูลสาธารณะปริมาณมหาศาลไปไว้บนเซิร์ฟเวอร์ สร้างทอร์เรนต์ทุกครั้งที่ข้อมูลเปลี่ยน ให้บริการไฟล์ .torrent ผ่าน HTTP พร้อมทำหน้าที่เป็น tracker ไปด้วยได้ ส่วนไคลเอนต์ FUSE ก็แค่ห่อด้วยลอจิกง่าย ๆ ที่คอยตรวจจับทอร์เรนต์ใหม่จากเซิร์ฟเวอร์แล้วโหลด/เมานต์ใหม่
    นานมาแล้วผมเคยทำดิสโทร Linux สำหรับธนาคารตัวหนึ่ง อิงจาก Ubuntu NetBoot ใส่เฉพาะแพ็กเกจขั้นต่ำสำหรับเดสก์ท็อปตามสาขา และเพราะที่สาขาไม่มีเซิร์ฟเวอร์ ดิสโทรจึง seed ตัวเอง ได้ ขอแค่ตั้งค่า wake-on-lan กับ PXE บนสวิตช์ไว้ เครื่องเดียวก็สามารถโคลนเครื่องหลายร้อยเครื่องในอาคารได้ในเวลาค่อนข้างสั้น และเครื่องที่โคลนใหม่ก็กลายเป็น seed ได้ด้วย
    ภายในเราใช้ nginx ให้บริการ Ubuntu repository แบบปรับแต่งเอง และรัน tftp/inetd กับ wackamole พอเครื่องติดตั้งเสร็จก็จะดาวน์โหลดทอร์เรนต์จาก “เซิร์ฟเวอร์” แล้วเพิ่มเข้า transmission และเมื่อเสร็จแล้วเครื่องนั้นก็จะกลายเป็น seed โดยเปิด wackamole, inetd, nginx, tracker ฯลฯ ตอนแรกจะ seed อย่างเสถียรให้ได้ 10 เครื่องก่อน พอทุกเครื่องขึ้นมาแล้วค่อยปลุกเครื่องเพิ่ม
    เรากระจายอิมเมจไปยังเครื่อง 8,000 เครื่องทั่วสาขาธนาคารหลายร้อยแห่งภายในไม่กี่สัปดาห์ โดยความล่าช้าส่วนใหญ่เกิดจากการจัดการการเปลี่ยนแปลงและแผน rollout เป็นระยะ ๆ สิ่งที่ยากที่สุดจริง ๆ คือการใช้ Linux build เดิมดาวน์โหลด seed แรกไปยังแต่ละสาขา แล้วให้หนึ่งในเครื่องเหล่านั้นทำหน้าที่เป็นเครื่อง seed ทำกันในกว่า 350 สาขา ด้วยลิงก์ที่จำกัด บางแห่งเป็น ISDN 256kbps

    • ฟีเจอร์ที่น่าจะน่าสนใจ แต่เท่าที่รู้เหมือนจะมีแค่ AWS S3 ที่ทำไว้: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjec...
      ไม่เคยลองใช้จริง เลยไม่รู้ว่า AWS ใส่ tracker ของตัวเองไว้ในไฟล์ .torrent ที่ได้หรือเปล่า
    • ถ้าสร้างทอร์เรนต์ใหม่ทุกครั้งที่ dataset อัปเดต ไคลเอนต์จะไม่ต้องรับส่งข้อมูลส่วนที่ไม่เปลี่ยนใหม่ด้วยหรือ?
  • เครื่องมือนี้ควรอัปเกรดให้ใช้ฟีเจอร์ใหม่ของ BitTorrent v2
    https://blog.libtorrent.org/2020/09/bittorrent-v2/
    โดยเฉพาะ Merkle hash tree ที่ทำให้มี hash tree แยกตามไฟล์และโครงสร้างไดเรกทอรีได้

    • ตั้งแต่รู้จัก BitTorrent v2 ผมก็รอให้มีดัชนีรายไฟล์บนออนไลน์มาตลอด อยากแท็กไฟล์มีเดียขนาดใหญ่ส่วนใหญ่ในไดรฟ์ของผมได้ว่า ตอนนี้มีสำเนาอยู่ใน swarm ของ BitTorrent กี่ชุด
      แบบนั้นผมจะลบไฟล์ใหญ่ ๆ ได้ง่ายขึ้น เพราะรู้ว่าภายหลังสามารถดาวน์โหลดสำเนาเดียวกันกลับมาได้ง่าย ผมเคยลองทำอะไรคล้าย ๆ กันด้วย IPFS แต่ไม่ค่อยเวิร์ก และก็หาไฟล์ซ้ำไม่เจอด้วย
  • ถ้ามี BTFS ที่ช่วยซ่อมไฟล์มีเดียที่ “เสียหาย” ได้ก็คงดี เช่น ถ้าดิสก์มีรอยจนบางส่วนหายไป หรือมีเดียที่ผมเลือกตัวเลือก codec ได้ไม่ดี ก็ให้ดาวน์โหลดเฉพาะส่วนที่เสียหายมาซ่อมให้กลับมาเนียน ๆ

    • ไม่ใช่เหมือนกันเป๊ะ แต่ทำให้นึกถึง AccurateRip ที่เคยใช้กันมากตอนสมัยริป CD ปีละหลายร้อยแผ่น
      http://www.accuraterip.com/
    • ทำไมไม่ใช้ไฟล์ซิสเต็มที่คอยดูแลเรื่องแบบนั้นล่ะ? มี ZFS อยู่แล้ว แถมพื้นที่เก็บข้อมูลก็ราคาถูก
    • อีกการใช้งานหนึ่งคือการนำมีเดียเข้าคลังของตัวเองแล้วแชร์ต่อ ถ้าสแกน hash ของมีเดียทั้งหมดที่ผมมีโดยสมัครใจได้ และไคลเอนต์ทอร์เรนต์ที่ฉลาดพอสามารถให้บริการเฉพาะไฟล์เหล่านั้นได้ ก็จะช่วย seed ไฟล์มีเดียหายากได้มาก
      เพราะผมลบไฟล์ที่ไม่จำเป็นอยู่เสมอ จึงต้องใช้รูปแบบทอร์เรนต์บางส่วน
    • ถ้าไฟล์พังแล้วจะคำนวณ hash สำหรับค้นหาได้ยังไง?
    • แจกจ่าย ไฟล์ parity ไปพร้อมกับไฟล์จริงเหมือนที่ทำกันบน Usenet ไม่ได้หรือ? ตัว Usenet เองก็แทบจะเป็นแนวนี้อยู่แล้ว
      ไม่แน่ใจว่า implementation ของไฟล์ซิสเต็ม NNTP ทำงานได้ดีไหม แต่ก็มี nzbfs อยู่: https://github.com/danielfullmer/nzbfs
  • แปลกใจที่สิ่งนี้ไม่ได้ถูกใช้มากกว่านี้เลยเอามาโพสต์ จะทำ virtual machine หรือระบบปฏิบัติการเป็น overlay บน BTFS ได้ไหม? ดูเป็นทิศทางที่น่าสนใจ

    • เพิ่งสัปดาห์ที่แล้ว ผมสร้างอิมเมจ PXE boot ด้วย Nix บนแล็ปท็อป อัปโหลดมันขึ้น IPFS แล้วบูตเซิร์ฟเวอร์ของผมที่อยู่อีกประเทศผ่านเครือข่าย โดยใช้ mirror IPFS สาธารณะ
      ตอนบูต initrd จะถูกเมานต์เป็น overlayfs แบบอ่านอย่างเดียว ผมเปิดเผยการตั้งค่าไว้ที่นี่: https://github.com/jhvst/nix-config
      ภายหลังผมมีแผนจะเขียนเอกสารกระบวนการ IPFS รวมถึงการตั้งค่าเราเตอร์ PXE ไว้ที่ https://github.com/majbacka-labs/nixos.fi และอาจเปิด build server สาธารณะขนาดเล็กสำหรับตั้งค่า Flake ให้คนที่อยากทดลองกระบวนการนี้ด้วย
    • แม้ไม่ใช่ผู้ให้บริการ overlay โดยตรง แต่ uber/kraken คือ “P2P Docker registry ที่กระจายข้อมูลระดับ TB ได้ในไม่กี่วินาที” มันใช้โปรโตคอล BitTorrent ส่ง Docker image ไปยังคลัสเตอร์ขนาดใหญ่
      https://github.com/uber/kraken
    • CVMFS เป็นตัวเลือกที่สุกงอมในพื้นที่นี้ และถูกใช้กันมากในชุมชนฟิสิกส์เพื่อกระจายซอฟต์แวร์และ container image ช่วยให้แชร์ทรัพยากรคอมพิวต์ได้อย่างเรียบง่ายและมีประสิทธิภาพ
      https://cernvm.cern.ch/fs/
    • ไม่ค่อยเข้าใจประเด็น ไฟล์ซิสเต็มแบบอ่านอย่างเดียวที่ดาวน์โหลดไฟล์แบบทันทีนั้นเจ๋งก็จริง แต่ในสถานการณ์ส่วนใหญ่ฟังดูไม่ค่อยใช้งานได้จริง
    • บางครั้งก็มีคนคิดค้น Plan 9 ของ Bell Labs ขึ้นมาใหม่
  • เป็นไคลเอนต์ที่สมบูรณ์แบบสำหรับเข้าถึงคอนเทนต์ของ Internet Archive แต่ละรายการของ IA จะมีทอร์เรนต์ที่ใส่ web seed ของ IA แนบมาให้อัตโนมัติ ลองทดสอบด้วย Big Buck Bunny ได้
    btfs https://archive.org/download/BigBuckBunny_124/BigBuckBunny_1... mountpoint

    • ไม่รู้โครงสร้างภายในของ IA และ BitTorrent แต่ถ้ารายการใน archive มีมากเกินไป ไฟล์ทอร์เรนต์จะไม่ได้ใส่ทั้งหมดไว้ข้างใน
      เห็นบ่อยในชุด ROM หรือ archive นิตยสาร ถ้ารายการเกิน 1000 รายการ ทอร์เรนต์มักจะมีแค่ ประมาณ 200 รายการแรก
    • วิธีที่ดีกว่าคือแบบนี้:
      btplay https://archive.org/download/BigBuckBunny_124/…
  • บทความที่เกี่ยวข้อง:
    BTFS – mount any .torrent file or magnet link as directory - https://news.ycombinator.com/item?id=23576063 - June 2020 (121 comments)
    BitTorrent file system - https://news.ycombinator.com/item?id=10826154 - Jan 2016 (33 comments)

  • ถ้าจะไปให้ไกลกว่านั้น ควรเก็บข้อมูลเป็นไฟล์ sqlite ที่มี ดัชนีค้นหาแบบ full-text อยู่ด้วย จะทำให้ค้นหาแบบ full-text ในทอร์เรนต์ได้เมื่อต้องการ: https://github.com/bittorrent/sqltorrent

  • การอภิปรายเมื่อ 4 ปีก่อน:
    https://news.ycombinator.com/item?id=23576063

  • คอมเมนต์ระดับบนสุดของ saurik ในเธรดก่อนหน้าปี 2020 ที่มี 121 คอมเมนต์ สรุปความรู้สึกของฉันต่อสถานการณ์นี้ได้ดี: https://news.ycombinator.com/item?id=23580334
    ประเด็นคือ BTFS เป็น IPFS เวอร์ชัน “หนึ่ง CID ต่อครั้ง”
    IPFS นั้นเจ๋ง แต่ผมคิดว่าถ้าจะให้ใช้งานได้จริงในชีวิตประจำวัน ต้องมีความก้าวหน้าครั้งใหญ่ในอย่างน้อยสามด้าน อย่างแรก ไม่ควรต้องรันพร็อกซีโหนดในเครื่อง ได้ยินมาว่า Brave มีการรองรับ WebTorrent ในตัว แต่ผมไม่ได้ใช้ Brave เลยไม่รู้ว่าเป็นแค่ชื่อ WebTorrent หรือเป็นอย่างไร
    อย่างที่สอง latency ในการ resolve swarm/peer นั้นเจ็บปวดในทำนองเดียวกับ “ของเล่นคริปโต web3” และความหน่วงนั้นทำให้การท่องดูรู้สึกเหมือนสมัยโมเด็ม 14.4k เก่า ๆ
    อย่างที่สาม IPFS เหมาะมากกับคอนเทนต์ที่เปลี่ยนไม่บ่อยแต่ได้รับความนิยมสูง เช่น Wikipedia, เกม release, คอนเทนต์ MDN แต่ถ้าคิดถึงการท่องดู repository ของ git การเปลี่ยน “tip” หรือ “main” ให้ชี้ไปยังเวอร์ชันที่อัปเดตนั้นค่อนข้างยุ่งยาก เท่าที่ผมรู้ วิธี resolve CID ล่าสุดมีแค่ IPNS และ DNS ก็มักกลายเป็นหนึ่งในหลายองค์ประกอบที่พันกันเมื่อเกิดเหตุขัดข้อง
    ผมรู้ว่าพูดถึงไฟล์ซิสเต็มอื่นที่ไม่ใช่ไฟล์ซิสเต็มที่ส่งเข้ามายาวเกินไป แต่ในขณะที่ผมคงไม่ติดตั้ง BTFS คนที่สนใจไอเดียนี้ก็น่าจะลองอ่านเรื่อง IPFS เพิ่มเติม อย่างไรก็ตาม ควรคำนึงถึงข้อจำกัดในปัจจุบันไว้ด้วย

  • https://github.com/anacrolix/torrent มี ไดรเวอร์ FUSE มาตั้งแต่ปี 2013 ตอนนี้อยู่ในช่วงเริ่มต้นของการถอดมันออก
    WebDAV, FUSE ของบุคคลที่สาม และ HTTP wrapper ต่างก็ทำสิ่งคล้ายกัน คือให้บริการ magnet link, info hash และไฟล์ทอร์เรนต์เหมือนเป็นไฟล์ซิสเต็มแบบเปลี่ยนแปลงไม่ได้ การรองรับ BitTorrent v2 ตอนนี้อยู่ใน master แล้ว