ฉันจะสร้างไดเร็กตอรี่ / dev / null ที่คล้ายกันได้อย่างไร?


81

ฉันต้องการสร้าง/dev/nullไดเรกทอรี "" (หรือไดเรกทอรี "blackhole") เพื่อให้ไฟล์ใด ๆ ที่เขียนลงไปนั้นไม่ได้ถูกเขียนขึ้นจริงๆ แต่เพิ่งหายไป

ฉันมีแอปพลิเคชันที่เขียนไฟล์ชั่วคราวขนาดใหญ่ไปยังไดเรกทอรี ฉันไม่สามารถควบคุมชื่อไฟล์และฉันไม่สนใจเนื้อหาของไฟล์เหล่านี้จริงๆ ฉันสามารถเขียนสคริปต์ที่อุดตันไฟล์เหล่านี้เป็นระยะ แต่ไฟล์นั้นเขียนออกมาอย่างรวดเร็วและเติมดิสก์ของฉัน ฉันกำลังมองหาบางสิ่งที่ฉลาดกว่า ฉันต้องการให้แอปพลิเคชัน "คิด" ว่ามันกำลังเขียนไฟล์เหล่านี้ แต่ในความเป็นจริงการเขียนจะถูกยกเลิกไปที่ส่วนอื่น ๆ

ดูหัวข้อนี้ที่เกี่ยวข้องเก่า


ดูเหมือนว่า FUSE อาจเป็นตัวเลือก: kerneltrap.org/mailarchive/linux-kernel/2008/2/15/868564/thread
Stefan Lasiewski

ฉันเพิ่งถามตัวเองคำถามเดียวกันและใช้ชื่อเดียวกันสำหรับไดเรกทอรีฉันไม่สามารถสร้าง
ixtmixilix

คำตอบ:


48

นี้ไม่ได้รับการสนับสนุนออกจากกล่องบนยูนิกซ์ใด ๆ ฉันรู้ แต่คุณสามารถทำอะไรที่สวยมากกับฟิวส์ มีอย่างน้อยหนึ่งการใช้งานของ nullfsystemเป็นระบบไฟล์ที่ทุกไฟล์มีอยู่และมีพฤติกรรมเช่น/dev/null(นี่ไม่ใช่การดำเนินการเพียงอย่างเดียวที่ฉันเคยเห็น)

¹ เพื่อไม่ให้สับสนกับnullfs * BSDซึ่งจะคล้ายคลึงกับbindfs


วิเศษมาก - ฉันใช้สิ่งนี้เป็นส่วนหนึ่งของคำตอบของ SO
Phil Lello

1
ข้อความถึงผู้ที่จบลงด้วยการรวบรวมข้อผิดพลาดในโปรแกรมนั้น: g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`ทำงานให้ฉัน
ixtmixilix

คุณช่วยชี้ฉันไปที่การใช้งานอื่น ๆ ได้ไหม? เพราะฉันหาไม่พบ
Freedo

@ เฟรโดฉันสงสัยว่าหลายคนทำแบบฝึกหัดเพื่อเรียนรู้และปล่อยให้มันไร้สี พวกเขาอาจไม่ได้อยู่บนเว็บอีกต่อไป
Gilles

7

วิธีอื่นจะเป็น wrapper LD_PRELOAD โดยทั่วไปแล้วไลบรารีที่แบ่งใช้ขนาดเล็กซึ่งโหลดก่อน libc.so และสกัดกั้นการเรียก "เปิด" ด้วยสิ่งที่ตรวจสอบเส้นทางของไฟล์ที่จะเกิดขึ้นและทดแทน "/ dev / null" ถ้ามันอยู่ในไดเรกทอรีเป้าหมาย

สิ่งนี้มีข้อดีของการเป็น (a) ในพื้นที่ผู้ใช้ทั้งหมด - ไม่จำเป็นต้องแฮ็กเคอร์เนล และ (b) ส่งผลกระทบต่อแอปพลิเคชันที่หลงทางเดียวเท่านั้น

ตัวอย่างง่ายๆคือที่http://www.noah.org/wiki/LD_PRELOAD_notesแต่ในกรณีของคุณคุณจะต้องสกัดกั้นการเรียกของระบบ "open" & "creat"


3
... สมมติว่าแอปพลิเคชันทำการโทรผ่านระบบ libc ไม่ใช่โดยตรงผ่านint 0x80/ syscall/ sysenter/ อย่างอื่น
Ruslan

1

หากโปรแกรมโง่จนไม่ยอมให้คุณปิดการบันทึกเหล่านั้นมันอาจจะไม่ตรวจสอบข้อผิดพลาดหลังจากเปิดไฟล์บันทึกหรือไม่? ฉันจะลองติดตั้งระบบไฟล์แบบอ่านอย่างเดียวจำลอง (เช่นใช้mount -o loop)


วิธีนี้ใช้ไม่ได้ผล แอปพลิเคชันจะตายหากไม่สามารถเขียนไฟล์นี้ได้
dogbane

1

คุณบอกว่าการลบไฟล์เป็นระยะ ๆ ด้วยสคริปต์นั้นไม่เร็วพอ คุณสามารถใช้งานทริกเกอร์ที่ลบไฟล์ชั่วคราวเมื่อใดก็ตามที่ใบสมัครของคุณเสร็จสิ้นการเขียนและปิดมัน ถ้าเป็นเช่นนั้นคุณอาจใช้ "inotify" API

(ดูhttp://en.wikipedia.org/wiki/Inotifyและhttps://github.com/rvoicilas/inotify-tools/wiki/ )


1
ในหลายระบบการลบไฟล์ที่กระบวนการเปิดลบรายการไดเร็กทอรี แต่ไฟล์นั้นยังคงอยู่บนดิสก์จนกว่าจะถูกปิดโดยกระบวนการล่าสุดที่ใช้ กระบวนการอาจเขียนไฟล์แล้วค้นหาไปยังจุดเริ่มต้นแล้วอ่านกลับดังนั้นระบบปฏิบัติการจึงไม่สามารถทิ้งข้อมูลไปได้
interfect

0

ฉันได้สร้างโมดูลเคอร์เนลตามตัวอย่าง ramfs ในเคอร์เนล linux นั้นเป็นระบบไฟล์ blackhole เรียกว่า nullfsvfs การนำระบบ FUSE ไปใช้จำเป็นต้องคัดลอกข้อมูลจากผู้ใช้ไปยัง kernelspace และค่อนข้างช้าเมื่อเทียบกับการนำไปใช้งานแบบตรงในฐานะเคอร์เนลโมดูล ดู:

https://github.com/abbbi/nullfsvfs


-8

เพียงแค่เชื่อมโยงไดเรกทอรีนั้นกับ /dev/null

rm -rf ~/.logs
ln -s /dev/null ~/.logs

/dev/nullไม่จำเป็นต้องเป็นไดเรกทอรี หากโปรแกรมพยายามเขียนถึงก็ยังคงไปขวาเข้า~/.logs/log1.dump ฉันทำสิ่งนี้เพื่อแคชของ Google Chrome เพราะหลังจากนั้นไม่นานมันก็จะมีขนาดใหญ่มากจน Chrome ต้องใช้เวลาเริ่มต้นสักครู่/dev/null


3
สิ่งนี้จะไม่ทำงานเพราะ symlink เป็นไฟล์ไม่ใช่ไดเรกทอรี พยายามที่จะช่วยให้echo hello > ~/.logs/log1.dump ~/.logs/log1.dump: Not a directoryอย่างไรก็ตามecho hello > ~/.logsทำงานได้เนื่องจาก .logs เป็นไฟล์
dogbane

2
คุณต้องล้อเล่นกับเรา $ ln -s /dev/null dev-null; touch dev-null/zzzให้ฉันด้วยtouch: cannot touch 'dev-null/zzz': Not a directory
alex

1
อย่างที่ฉันพูดมันใช้งานได้กับ Chrome มันป้องกันไม่ให้มันเขียนลงในแคช ถ้ามันทำให้โปรแกรมของผู้ถามเกิดข้อผิดพลาดก็ไม่ได้ตรวจสอบว่าตัวชี้ไฟล์เป็น NULL หรือไม่
jonescb

6
อาจหมายความว่า Chrome ข้ามการเขียนหากมีข้อผิดพลาดในการเปิดไฟล์ คุณสามารถบรรลุผลเช่นเดียวกันโดยการลบเขียนได้รับอนุญาตจากแฟ้มการถ่ายโอนหรือไดเรกทอรีการเขียนใน.
KeithB

จริงการเปลี่ยนแปลงสิทธิ์ของไดเรกทอรีอาจทำให้เข้าใจได้ง่ายขึ้น
jonescb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.