ฉันสามารถใช้พื้นที่ดิสก์หมดได้โดยสร้างไฟล์เปล่าจำนวนมากหรือไม่?


35

เป็นที่ทราบกันดีว่าไฟล์ข้อความว่างเปล่ามีศูนย์ไบต์:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามแต่ละของพวกเขามีเมตาดาต้าซึ่งตามการวิจัยของฉันถูกเก็บไว้ในinodesและทำพื้นที่การใช้งาน

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


ในการตรวจสอบบางอย่างฉันเรียกใช้df -iแต่สิ่งนี้แสดงให้เห็นถึง% ของ inode ที่ใช้ (?) มากกว่าที่จะชั่งน้ำหนัก

Filesystem             Inodes  IUsed    IFree IUse% Mounted on
udev                   947470    556   946914    1% /dev
tmpfs                  952593    805   951788    1% /run
/dev/sda2            28786688 667980 28118708    3% /
tmpfs                  952593     25   952568    1% /dev/shm
tmpfs                  952593      5   952588    1% /run/lock
tmpfs                  952593     16   952577    1% /sys/fs/cgroup
/dev/sda1                   0      0        0     - /boot/efi
tmpfs                  952593     25   952568    1% /run/user/1000
/home/lucho/.Private 28786688 667980 28118708    3% /home/lucho

ที่เกี่ยวข้อง: unix.stackexchange.com/q/62049
moooeeeep

คำตอบ:


40

เอาต์พุตนี้แนะนำ28786688inodes โดยรวมหลังจากความพยายามครั้งถัดไปในการสร้างไฟล์ในระบบไฟล์รูท (อุปกรณ์/dev/sda2) จะกลับมาENOSPC("ไม่มีพื้นที่เหลือบนอุปกรณ์")

คำอธิบาย: ในการออกแบบระบบไฟล์ * nix ดั้งเดิมจำนวนสูงสุดของ inodes ถูกตั้งค่าในเวลาการสร้างระบบไฟล์ มีการจัดสรรพื้นที่เฉพาะสำหรับพวกเขา คุณสามารถหมด inodes ก่อนที่จะมีพื้นที่ว่างสำหรับข้อมูลหรือในทางกลับกัน ระบบไฟล์ Linux เริ่มต้นทั่วไปext4ยังคงมีข้อ จำกัด นี้ สำหรับข้อมูลเกี่ยวกับขนาด inode บน ext4 ดูที่ manpage สำหรับ mkfs.ext4

Linux รองรับระบบไฟล์อื่น ๆ โดยไม่มีข้อ จำกัด บนbtrfsพื้นที่ถูกจัดสรรแบบไดนามิก "โครงสร้างไอโหนดมีขนาดค่อนข้างเล็กและจะไม่มีข้อมูลไฟล์ฝังตัวหรือข้อมูลแอททริบิวต์เพิ่มเติม" (ext3 / 4 จัดสรรพื้นที่ภายใน inodes สำหรับแอตทริบิวต์เพิ่มเติม ) แน่นอนว่าคุณยังสามารถใช้พื้นที่ว่างในดิสก์ได้โดยสร้างรายการเมตาดาต้า / ไดเรกทอรีมากเกินไป

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


"XFS ยังจัดสรร inodes แบบไดนามิกเช่นนั้น JFS ก็ทำเช่นนั้น / ทำใหม่เช่นนั้น F2FS ระบบไฟล์ Unix แบบดั้งเดิมจัดสรร inodes แบบคงที่ในเวลา mkfs และ FSs สมัยใหม่เช่น ext4 ที่ติดตามมรดกของพวกเขากลับ ข้อยกเว้นไม่ใช่กฎ

"BTW, XFS ช่วยให้คุณกำหนดขีด จำกัด เปอร์เซ็นต์สูงสุดของพื้นที่ที่ใช้โดย inodes ดังนั้นคุณสามารถเรียกใช้ inodes ก่อนที่จะถึงจุดที่คุณไม่สามารถผนวกไฟล์ที่มีอยู่ได้ (ค่าเริ่มต้นคือ 25% สำหรับ FSes ต่ำกว่า 1TB, 5% สำหรับระบบไฟล์สูงสุด 50TB, 1% สำหรับขนาดใหญ่กว่านั้น) อย่างไรก็ตามการใช้พื้นที่นี้ใน metadata (inodes และแผนที่ขอบเขต) จะแสดงเป็นปกติdf -h"- Peter Cordesในความคิดเห็นต่อคำตอบนี้


ดังนั้นคุณจะบอกว่าถ้าฉันสร้าง28786688-667980=28118708ไฟล์ว่างเปล่าฉันจะหมด inodes และ "ทำลายระบบของฉัน"?
luchonacho

1
XFS ยังจัดสรร inodes แบบไดนามิก JFS ก็เช่นกัน ดังนั้น / ทำใหม่ reiserfs F2FSก็เช่นกัน ระบบไฟล์ Unix แบบดั้งเดิมจัดสรร inodes แบบคงที่ในเวลา mkfs และเพื่อให้ FS ที่ทันสมัยเช่น ext4 ที่ติดตามมรดกของพวกเขากลับไปที่มัน แต่วันนี้เป็นข้อยกเว้นไม่ใช่กฎ (ยกเว้นกรณีที่คุณได้สิ่งที่น้ำหนักโดยการติดตั้งฐานซึ่งก็อาจจะมีความถูกต้องที่จะบอกว่าส่วนใหญ่ของระบบไฟล์ปัจจุบันบนดิสก์ในระบบระวัง * ในป่ามีการจัดสรรแบบคงที่ inodes.)
ปีเตอร์ Cordes

BTW, XFS ช่วยให้คุณกำหนดขีด จำกัด เปอร์เซ็นต์สูงสุดของพื้นที่ที่ใช้โดย inodes ดังนั้นคุณสามารถหมด inodes ก่อนที่จะถึงจุดที่คุณไม่สามารถต่อท้ายไฟล์ที่มีอยู่ (ค่าเริ่มต้นคือ 25% สำหรับ FSes ที่ต่ำกว่า 1TB, 5% สำหรับระบบไฟล์สูงสุด 50TB, 1% สำหรับที่ใหญ่กว่านั้น) อย่างไรก็ตามการใช้พื้นที่นี้บนเมทาดาทา (inodes และแผนที่ขอบเขต) จะแสดงเป็นปกติdf -h@luchonacho
Peter Cordes

26

การสร้างไฟล์เปล่าเกี่ยวข้องกับการใช้สิ่งต่อไปนี้:

  • inodes หนึ่งไฟล์ต่อหนึ่งไฟล์
  • รายการไดเรกทอรีเพิ่มเติมหนึ่งรายการต่อไฟล์ แต่รวมไว้ด้วย

จำนวนของ inodes ที่มีอยู่มักจะถูกกำหนดเมื่อระบบไฟล์ถูกสร้างขึ้นและไม่สามารถเปลี่ยนแปลงได้ (ระบบไฟล์บางระบบเช่น Btrfs หรือ XFS จะจัดสรร inodes แบบไดนามิก) df -iว่าสิ่งที่วัดได้โดย เมื่อคุณหมด inode คุณจะไม่สามารถสร้างไฟล์หรือไดเรกทอรีใหม่แม้ว่าคุณจะมีพื้นที่ว่างในดิสก์

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

ใช่มันเป็นไปได้ที่จะใช้พื้นที่ดิสก์หมดโดยใช้ไฟล์เปล่าเท่านั้น


ดังนั้นฉันจะต้องสร้างไฟล์ว่างเปล่าเพียงพอที่จะใช้งาน inodes ได้ 100%?
luchonacho

@ luchonacho ใช่มีประสิทธิภาพหนึ่งไฟล์ว่างต่อ inode
Stephen Kitt

นอกจากนี้ยังควรทราบคุณลักษณะเพิ่มเติมที่สามารถเพิ่มพื้นที่ว่างได้ ตัวอย่างเช่นหากไดเรกทอรีมี ACL เริ่มต้นจำนวนมากการสร้างไฟล์ในนั้นจะต้องใช้พื้นที่ในการจัดเก็บ ACL เหล่านั้น
Stéphane Chazelas

ตกลงฉันยืนแก้ไข สิ่งที่มันดูแปลกสำหรับฉันทั้งกับแบบอักษรที่แสดงผลและความกว้างคงที่ในเบราว์เซอร์ของฉัน อยากรู้อยากเห็นคุณแทรกพวกเขาได้อย่างไร แป้นพิมพ์ของคุณมีคีย์ที่แตกต่างกันสำหรับตัวละครนั้นและตัว U + 0022 ใช่หรือไม่
Stéphane Chazelas

ขอบคุณจากความอยากรู้อยากเห็นฉันตรวจสอบว่าพวกเขาอยู่ในรูปแบบแป้นพิมพ์สหราชอาณาจักรของฉันและแน่นอนพวกเขาอยู่ใน AltGr + Shift + V / B (เครื่องหมายคำพูดคู่โดยไม่ต้องกะ) ฉันจะติดกับ U + 0022
Stéphane Chazelas

7

อาร์กิวเมนต์ตรรกะบริสุทธิ์:

ชื่อไฟล์ประกอบด้วยจำนวนไบต์ที่ไม่เป็นศูนย์ ถึงแม้จะมีการบีบอัดสูงสุดทฤษฎีในระบบไฟล์สมมุติออกแบบมาเพื่อให้จำนวนเงินสูงสุดที่แน่นอนของชื่อไฟล์แต่ละชื่อไฟล์จะยังคงใช้เวลาอย่างน้อยหนึ่งบิตที่ไหนสักแห่งบนดิสก์ทางกายภาพของคุณ อาจเป็นไปได้มากขึ้น แต่ "1 บิตต่อไฟล์" เป็นขั้นต่ำเล็กน้อย

คำนวณจำนวนบิตที่อาจพอดีกับ platters ของคุณและนั่นคือจำนวนสูงสุดของไฟล์ (ว่างหรือไม่ว่าง) ในทางทฤษฎีที่คุณสามารถจัดเก็บได้

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


0

ไม่เพียง แต่คุณสามารถหมด inodes บน linux ซึ่งจะเหมือนกับการใช้พื้นที่ว่างหมด

คุณสามารถลองสิ่งนี้ในเปลือกของคุณ n=0; while :; do touch $n; let n=n+1; done

เพียงตรวจสอบให้แน่ใจว่าได้รันในเครื่องเสมือนมิฉะนั้นคุณจะหมด inodes เร็วมาก


คำสั่งนั้นกำลังทำอะไร
luchonacho

มันเริ่มต้นในขณะที่วงไม่ จำกัด จริงซึ่งในทุกเทิร์นสร้างชื่อไฟล์ที่เป็นจำนวนเต็มเริ่มต้นจาก 0 แล้ว 1 2 3 ... ในที่สุดมันจะสร้างไฟล์มากพอที่จะใช้ inodes ทั้งหมดของระบบไฟล์
in1t3r

1
หากรันคำสั่งนั้นบนพาร์ติชัน / home ของคุณหากเป็นอิสระจากนั้น / partition คุณจะไม่มีปัญหาคุณไม่สามารถเขียนไปยัง / home partition ของคุณได้อีก ข้อเสนอแนะของฉันทำไดเรกทอรีชื่อ inodetest cd ลงในนั้นแล้วเรียกใช้คำสั่งหลังจากที่คุณเห็นข้อผิดพลาดที่คุณไม่สามารถสร้างไฟล์ในระบบไฟล์กด ctrl + C อีกต่อไปและทำงานrm -fr inodetestเพื่อกำจัดไฟล์ว่างเปล่าเหล่านั้นทั้งหมดและทำงานได้ตามปกติอีกครั้ง :)
in1t3r

0

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

(คำตอบในความคิดเห็นโดย Baard Kopperud)


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