วิธีที่ดีที่สุดในการเพิ่มพื้นที่ว่างในดิสก์จากไฟล์ที่ถูกลบซึ่งเปิดค้างไว้


28

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

$ lsof /tmp/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)

พื้นที่ดิสก์ที่ถ่ายโดยไฟล์ที่ถูกลบด้านบนทำให้เกิดปัญหาเช่นเมื่อพยายามใช้ปุ่มแท็บเพื่อเติมข้อความในเส้นทางของไฟล์โดยอัตโนมัติฉันได้รับข้อผิดพลาด bash: cannot create temp file for here-document: No space left on device

แต่หลังจากฉันเรียกใช้kill -9 1623พื้นที่สำหรับ PID นั้นได้รับการปลดปล่อยและฉันไม่ได้รับข้อผิดพลาดอีกต่อไป

คำถามของฉันคือ:

  • เหตุใดพื้นที่นี้จึงไม่ว่างทันทีเมื่อลบไฟล์ครั้งแรก
  • วิธีที่ดีที่สุดในการเรียกคืนพื้นที่ไฟล์ที่เกี่ยวข้องกับไฟล์ที่ถูกลบคืออะไร?

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

คำตอบ:


26

ใน unices ชื่อไฟล์เป็นเพียงพอยน์เตอร์ (inodes) ที่ชี้ไปยังหน่วยความจำที่ไฟล์นั้นอยู่ (ซึ่งอาจเป็นฮาร์ดไดรฟ์หรือแม้แต่ระบบไฟล์ที่ได้รับการสนับสนุนจาก RAM) แต่ละไฟล์บันทึกจำนวนลิงก์ไปที่ลิงค์: ลิงก์อาจเป็นชื่อไฟล์ (พหูพจน์หากมีหลายฮาร์ดลิงก์ไปยังไฟล์เดียวกัน) และทุกครั้งที่เปิดไฟล์กระบวนการจะเก็บ "ลิงก์" ไว้ที่ พื้นที่เดียวกัน

พื้นที่ว่างทางร่างกายเป็นอิสระเฉพาะในกรณีที่ไม่มีการเชื่อมโยงเหลืออยู่ (ดังนั้นจึงเป็นไปไม่ได้ที่จะไป) เป็นทางเลือกที่สมเหตุสมผลเพียงอย่างเดียว: ในขณะที่กำลังใช้งานไฟล์อยู่ก็ไม่สำคัญว่าจะมีคนอื่นไม่สามารถเข้าถึงได้อีกต่อไป: คุณกำลังใช้งานอยู่และจนกว่าคุณจะปิดมันคุณยังคงสามารถควบคุมได้ หายไปหรือถูกย้ายหรืออะไรก็ตาม แม้กระทั่งที่ใช้สำหรับ tempfiles: การใช้งานบางอย่างสร้างไฟล์และยกเลิกการเชื่อมโยงทันทีดังนั้นจึงไม่สามารถมองเห็นได้ในระบบไฟล์ แต่กระบวนการที่สร้างมันใช้งานได้ตามปกติ ปลั๊กอินของ Flash เป็นที่ชื่นชอบในวิธีการนี้โดยเฉพาะ: ไฟล์วิดีโอที่ดาวน์โหลดมาทั้งหมดจะเปิดขึ้น แต่ระบบไฟล์จะไม่แสดง

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


24

ไฟล์ถูกลบออกจากระบบไฟล์ที่ถูกลบการอ้างอิงใด ๆ กับ inode นี้ การอ้างอิงสามารถอยู่บนดิสก์ (ลิงก์ในไดเรกทอรีใด ๆ ) และ .. จากแอปพลิเคชันที่เปิดอยู่ หากคุณลบไฟล์ - คุณเพียงลบการอ้างอิงจากดิสก์ แต่ - ยังคงมีการอ้างอิงจากแอปพลิเคชัน

คุณสามารถ "ว่าง" พื้นที่ว่างได้สองวิธี:

  1. ตามที่ระบุไว้ข้างต้น - คุณสามารถฆ่าแอปพลิเคชันซึ่งเปิดไฟล์
  2. คุณสามารถ ... ตัดไฟล์ แม้ว่าจะถูกลบ:

ถ้าคุณรู้ pid - ดูไฟล์ที่เปิดโดย pid นี้: ls -l / proc / PID / fd คุณเห็นลิงค์ที่นี่เช่น:

undefine @ uml: ~ $ ls -l / proc / 18596 / fd
ราเซม 0
lrwx ------ 1 undefine undefine 64 lut 1 00:06 0 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:06 1 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:05 2 -> / dev / pts / 30
lr-x ------ 1 undefine undefine 64 lut 1 00:06 3 -> / home / undefine / x (ถูกลบ)
lr-x ------ 1 undefine undefine 64 lut 1 00:06 4 -> anon_inode: inotify

ตามที่เห็น - ลบ 3 fd คุณสามารถตัดมันด้วยคำสั่ง (ตัวอย่าง):

undefine @ uml: ~ $:> / proc / 18596 / fd / 3
undefine @ UML: ~ $ 

โปรดจำไว้ว่าหากแอปพลิเคชันอ่านจากไฟล์นี้ - อาจเป็นอันตรายต่อพวกเขา แต่ - หากเป็นเพียงไฟล์บันทึกคุณสามารถตัดทอนได้อย่างปลอดภัย


โปรดทราบว่าหลังจากการตัดทอนไฟล์กระบวนการดั้งเดิมที่เก็บไว้จะยังสามารถผนวกเข้ากับส่วนท้าย (ซึ่งคาดว่าจะสิ้นสุด) ผลที่ได้คือไฟล์ขนาดใหญ่ แต่กระจัดกระจายที่ใช้พื้นที่น้อยบนดิสก์ (หากระบบไฟล์รองรับไฟล์ที่กระจัดกระจาย) และพวกเขายังคงเติบโต!
törzsmókus

ใช่. หากสิ่งที่เขียนไปยังไฟล์มันจะเกิดขึ้นบนดิสก์ หลีกเลี่ยงมันได้ยากโดยไม่หยุดแอปพลิเคชันซึ่งเขียนไปยังดิสก์;)
กำหนด

8

ดังที่คนอื่น ๆ บอกว่าlsofสามารถใช้เพื่อแสดงรายการไฟล์ที่ถูกลบทั้งหมดซึ่งยังคงอยู่บนดิสก์เนื่องจากตัวอธิบายไฟล์ที่เปิดอยู่ อย่างไรก็ตามนี่อาจเป็นรายการที่ยาวมาก นี่คือคำสั่งที่แสดงรายการไฟล์เหล่านี้เรียงตามขนาดจากน้อยไปมาก:

sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n

อาจจะมีวิธีที่สั้นกว่านี้มากในการทำเช่นนี้ แต่คำสั่งข้างต้นใช้ได้ผลสำหรับฉัน


5

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


อาจเป็นประโยคที่ดีกว่า "ทำงานอย่างไร" ก็คือ "ถ้ากระบวนการยังคงใช้ไฟล์ Unix ไม่ควรพยายามกำจัดมัน"
Bratchley

จุดดี. ฉันได้เพิ่มเข้าไปในคำตอบ
John

-1

(มิ้น 17.1)

TL; DR:

  • ตรวจสอบด้วยsudo baobab(ตัววิเคราะห์การใช้งานดิสก์)
  • ล้างrootถังขยะของผู้ใช้

บริบท

ฉันติดอยู่กับพื้นที่ที่เคยลดลงในขณะที่ฉันลบไฟล์อย่างต่อเนื่อง ฉันติดตั้งtrash-cliแพคเกจเพื่อล้างถังขยะ แต่สิ่งนี้ไม่ได้ช่วย ในที่สุดฉันสังเกตเห็นว่าเมื่อฉันวิ่งbaobab(ตัววิเคราะห์การใช้งานดิสก์ใน GUI อย่างน้อยใน Mint 17.1) เพื่อตรวจสอบโครงสร้างพื้นที่ดิสก์มันเตือนว่าโฟลเดอร์บางโฟลเดอร์ไม่สามารถเข้าถึงได้ ดังนั้นผมจึงวิ่งเป็นใช้root sudo baobabสิ่งนี้เผยปัญหา ไฟล์จำนวนมากที่ถูกลบนั้นอยู่ในถังขยะของrootผู้ใช้ไม่ใช่ผู้ใช้ของฉันเอง ดังนั้นฉันไม่สามารถเพิ่มพื้นที่ว่างได้ จากนั้นฉันก็ล้างถังขยะโดยใช้เป็นรูท ( sudo trash-cli) และพื้นที่ทั้งหมดของฉันกลับมา


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