บอก fs เพื่อเพิ่มพื้นที่ว่างจากไฟล์ที่ถูกลบตอนนี้


73

มีวิธีบอกเคอร์เนลให้คืนพื้นที่ว่างในดิสก์หรือไม่? เช่นเขียนถึงบางสิ่งใน / proc /? ใช้ Ubuntu 11.10 กับ ext4

นี่อาจเป็นธีมเก่าและซ้ำหลายครั้ง หลังจากกดปุ่มเว้นวรรค 0 จะสังเกตเห็นเมื่อตัวแก้ไขของฉันไม่สามารถบันทึกไฟล์ซอร์สโค้ดที่ฉันเปิดได้ซึ่งตอนนี้ความสยองของฉันมีขนาด 0 ไบต์ในรายการโฟลเดอร์ฉันไปที่ความสนุกสนานในการลบ

ฉันลบไฟล์ขนาดใหญ่ 100 MB ทั้งจากผู้ใช้และจากรูทและทำการฮาร์ดลิงก์ด้วย

ก่อนหน้านี้ฉันapt-get cleanมีมากกว่า 900MB ใน / var / cache / apt / archives ตอนนี้มีเพียง 108KB:

# du
108 /var/cache/apt/archives

หนึ่งชั่วโมงต่อมายังไม่มีพื้นที่ว่างและไม่สามารถบันทึกไฟล์ที่มีค่าของฉันที่เปิดในตัวแก้ไขได้ แต่สังเกตเห็นความแตกต่างด้านล่าง:

# sync; df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4             13915072  13304004         0 100% /

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

ข้อมูลเพิ่มเติม

# dumpe2fs  /dev/sda4
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              884736
Block count:              3534300
Reserved block count:     176715
Free blocks:              422679
Free inodes:              520239
First block:              0
Block size:               4096
Fragment size:            4096

4
ระบบไฟล์เพิ่มพื้นที่ว่างทันที อย่างไรก็ตามคุณลักษณะบล็อกที่สงวนไว้ของรูทของส่วนต่อขยาย [234] และวิธีที่เคอร์เนลเก็บไฟล์ที่เปิดอยู่ซึ่งสงวนไว้อาจให้พื้นที่ที่หายไป
hhaamu

หากคุณมีระบบไฟล์หลายระบบ (patitions) การเพิ่มพื้นที่ว่างในระบบหนึ่งจะไม่สามารถทำได้ดีในระบบอื่น
vonbrand

เหตุใดฉันจึงสามารถเติมพาร์ติชันก่อนที่บล็อก 5Go ที่ "จอง" จะเรียกคืนได้เอง
Psddp

คำตอบ:


116

ตรวจสอบด้วยlsofเพื่อดูว่ามีไฟล์ที่ค้างอยู่เปิดอยู่หรือไม่ พื้นที่จะไม่ถูกปล่อยจนกว่าพวกเขาจะถูกปิด

sudo /usr/sbin/lsof | grep deleted

จะบอกให้คุณทราบว่าไฟล์ใดที่ถูกลบยังคงเปิดอยู่


ดี. แสดงให้ฉันเห็นmysqldล็อคบางอย่างใน / tmp แต่การapport-gtใช้งานจำนวนมากของไฟล์ที่สูญพันธุ์ใน / var / lib / apt / list / partial / ที่เห็นได้ชัดว่ามีการสะสม ดังนั้นฉันอาจkillall apport-gtแต่จะตรวจสอบก่อน
Marcos

1
ทำเครื่องหมายว่าเป็นคำตอบที่ใกล้เคียงที่สุดแม้ว่าจะไม่ได้ "คืน" พื้นที่ทันทีหลังจากปิดการจัดการไฟล์ / กระบวนการโดยใช้พวกเขา กำลังมองหาวิธีอื่น ๆ ที่อิงกับเคอร์เนล / proc / fs
Marcos

18
นอกจากนี้คุณยังสามารถใช้lsof +L1(เลือกเปิดไฟล์ที่ไม่ได้เชื่อมโยง)
Martin Fido

ข้อมูลในคำตอบนี้ถูกต้อง แต่ปัญหาที่ OP เกิดขึ้นนั้นอาจไม่ได้เกิดจากสิ่งนี้ แต่เกิดจากการจองพื้นที่รูท (ซึ่งเป็นคำตอบอื่น ๆ )
marcelm

37

ใช้lsofเพื่อค้นหาไฟล์ที่ถูกลบ แต่เปิดแล้วยังคงใช้พื้นที่อยู่:

lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome     3446       user  128u      REG              253,2              16400       2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)  

ค้นหารายการในไฟล์/proc/<pid>/fd/ที่สอดคล้องกับ filehandle:

ls -l /proc/3446/fd/etilqs_1IlrBRwsveCCxId
lrwx------. 1 user unix 64 Feb 11 15:31 128 -> /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

ตอนนี้เพียงcat /dev/nullเข้าไปใน fd:

cat /dev/null > /proc/3446/fd/128

โปรดทราบว่าไอโหนดยังคงเปิดอยู่ แต่ตอนนี้ความยาวเป็น 0

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

5
ใช้ฟุ่มเฟือยของcatการตัดทอน ในเชลล์เป้าหมายเพียงแค่> /proc/3446/fd/128ทำ
200_success

2
อย่าทำเช่นนี้หากโปรแกรมของคุณคาดว่าจะอ่านส่วนใด ๆ ของไฟล์อีกครั้งในอนาคตซึ่งอาจจะมีหรือไม่มีอยู่ในแคชของหน้า
Michael R. Hines

13

dfจะไม่แสดงพื้นที่ที่สงวนไว้สำหรับroot(แม้เมื่อเรียกใช้root):

# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

วิธีเปลี่ยน "เปอร์เซ็นต์บล็อกที่สงวนไว้"

  1. ลดพื้นที่สงวนลงเหลือ 4%

    # tune2fs -m4 /dev/sda4

df -h ตอนนี้แสดงให้เห็นว่าฟรี 45M

  1. บันทึกไฟล์ของฉันอย่างรวดเร็ว
  2. ใส่กลับไป 5%

    # tune2fs -m5 /dev/sda4


2
พื้นที่ที่สงวนไว้สำหรับรูทปัจจุบันมีขนาดใหญ่เกินไป คุณสามารถลดได้เพียงไม่กี่เปอร์เซ็นต์ dfแสดงพื้นที่ว่างสำหรับผู้ใช้ปกติ ในฐานะที่เป็น apt ทำงานเป็นรูทพื้นที่ที่สงวนไว้มีประโยชน์สำหรับป้องกันการเติมที่เกิดจากผู้ใช้ที่ไม่ใช่รูท (= ผู้ใช้ปกติและบริการที่มีผู้ใช้ของตนเอง)
jofel

ฉันเห็นด้วย; mkfsวันนี้ควรสำรองเช่น 5% หรือ 300MB แล้วแต่จำนวนใดจะน้อยกว่า เพิ่งปรับเซิร์ฟเวอร์ของฉันใหม่เป็น 2% และเพิ่ม GBs กลับคืน!
Marcos

3
@jofel ไม่มันไม่ใช่ เมื่อใดก็ตามที่คุณใช้ประโยชน์เกิน 90% คุณจะเริ่มได้รับการกระจายตัวเป็นจำนวนมาก คุณต้องเพิ่มพื้นที่ว่างบางส่วนไม่เรียกใช้การใช้งานให้ใกล้ 100%
psusi

@psusi คุณเป็นจริงขอบคุณสำหรับความคิดเห็นของคุณ แต่โอกาสที่จะใช้ (ชั่วคราว) เกือบทุกพื้นที่ที่มีอยู่ในฐานะผู้ใช้ทั่วไปอาจเป็นจริงและด้วย ext4 สิ่งต่าง ๆ ก็ไม่เลวอีกต่อไปดูunix.stackexchange.com/a/7965/15241
jofel

7

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

แม้หลังจากล้างถังขยะของคุณไฟล์ของคุณจะยังคงอยู่~/.local/share/Trash/expungedจนกว่าจะรีบูตและอาจนานกว่านั้น

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


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

6
sudo lsof | grep "(deleted)$" | sed -re 's/^\S+\s+(\S+)\s+\S+\s+([0-9]+).*/\1\/fd\/\2/' | while read file; do sudo bash -c ": > /proc/$file"; done

คำอธิบาย: เอาต์พุต
Grep lsofเพื่อแยกเฉพาะไฟล์ที่ถูกลบ SED แยกกระบวนการ id และ filedescriptor ID {pid}/fd/{fid}จากแต่ละบรรทัดและสร้างสตริงในรูปแบบที่ ในขณะที่วนซ้ำและไม่มีอะไรส่งออกไปยังแต่ละไฟล์ให้ตั้งค่าให้ว่างเปล่า


3
ฉันได้รับข้อผิดพลาด "ข้อผิดพลาดทางไวยากรณ์ใกล้กับโทเค็นที่ไม่คาดคิด` ('"
Majid Golshadi

5

ฉันสงสัยว่าsyncมีความช่วยเหลือใด ๆ ที่นี่ - แต่ไม่ควรเป็นเช่นเดียวกับ IIRC ในระบบส่วนใหญ่ ("มาก"?) ระบบไฟล์จะซิงค์กันทุก 30 วินาที

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

สองเหตุผล (หนึ่งในสิ่งเหล่านี้ชี้ไปที่คำถามที่คุณลิงก์) ซึ่งอาจทำให้ไฟล์ที่ถูกลบออกไม่มีที่ว่าง

  • ไฟล์ที่ไม่ได้ถูกลบจริง: คุณลบไฟล์ที่ฮาร์ดunlink()ลิงก์ไปที่อื่น (แม่นยำกว่าคุณแก้ไขไฟล์ที่มีมากกว่าหนึ่งลิงก์)
  • ไฟล์ที่ยังคงเปิดอยู่: ไฟล์ที่เปิดจะถูกทำบัญชีโดยใช้, ไฟล์, inodesเอง, ไม่ใช่รายการไดเรกทอรี, ถ้าคุณลบรายการ, inode จะยังคงอยู่ตราบเท่าที่ยังเปิดอยู่

แต่ฉันไม่ทราบสาเหตุเฉพาะที่อาจเกิดขึ้นกับไฟล์จำนวนมาก ...


syncไม่เคยช่วย สำหรับบันทึกมันเป็นระบบอูบุนตูดังนั้นมันค่อนข้างน่ารำคาญดังนั้นโดยทั่วไปมักมีเสียงดัง apportมีการปรับใช้บ่อยครั้งเนื่องจากการอัปเดตทุกครั้งที่ apt-get ล่มทุกครั้ง แต่ / var / crash มีเพียง 77MB ยังสังเกตเห็นว่าatdท่วม / var / log / syslog ด้วยบรรทัดที่ทำซ้ำเช่นatd[8892]: File a0015c0152ab76 is in wrong format - abortingอาจเป็นเพราะไฟล์ไม่กี่ไฟล์ใน / var / spool / cron / atspool มีขนาด 0 ทั้งหมดทำให้เกิดปัญหาแน่นอน
Marcos

1

CentOS 6.3 ยังทำสิ่งที่ไม่เป็นจริง - ถังขยะสามารถเมื่อคุณว่างเปล่าถังขยะ rm -rf ~/.local/share/Trash/expunged/ฉันไม่สามารถหาวิธีที่จะเรียกคืนพื้นที่จนฉันวิ่ง ทำให้เกิดรอยขีดข่วนมาก

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