ทำไมเคอร์เนล Linux รายงานว่า“ พื้นที่ดิสก์ไม่เพียงพอ” เมื่อในความเป็นจริงมันอยู่นอก i-nodes


10

เพื่อนของฉันที่ชอบเขียนโปรแกรมในสภาพแวดล้อม Linux แต่ไม่รู้เกี่ยวกับการดูแลระบบของ Linux เมื่อเร็ว ๆ นี้พบปัญหาที่ระบบปฏิบัติการ (Ubuntu) ของเขารายงานว่า แต่เมื่อเขาไปตรวจสอบระดับเสียงยังคงมี 700 GB เหลืออยู่ หลังจากเสียเวลามากในที่สุดเขาก็สามารถคิดได้ว่าเขาออกจาก inodes (เขาเก็บข้อมูลอัปเดตที่เพิ่มขึ้นจำนวนเล็กน้อยจากระบบสำรองข้อมูลในโวลุ่มนี้และเขียนผ่าน inodes ทั้งหมดของเขา)

เขาถามฉันว่าทำไมเคอร์เนล Linux รายงานข้อความแสดงข้อผิดพลาด ("ออกจากพื้นที่ดิสก์") แทนที่จะรายงานอย่างถูกต้อง ("out of inodes") ฉันไม่รู้ดังนั้นฉันคิดว่าฉันจะถาม StackExchange

ใครรู้ว่าทำไมสิ่งนี้เกิดขึ้น? และทำไมมันไม่ได้รับการแก้ไขหลังจากหลายปีที่ผ่านมา? (ฉันจำเพื่อนคนอื่นบอกฉันเกี่ยวกับปัญหานี้ในปี 1995)

คำตอบ:


18

หมายเลขข้อผิดพลาดเดียวENOSPCใช้เพื่อรายงานสถานการณ์ทั้งสองดังนั้นข้อความแสดงข้อผิดพลาดเดียวกัน

เพื่อให้สอดคล้องกับISO CและPOSIXมาตรฐานผู้พัฒนาเคอร์เนลไม่มีทางเลือกนอกจากใช้หมายเลขข้อผิดพลาดเดียวสำหรับทั้งสองเหตุการณ์ การเพิ่มหมายเลขข้อผิดพลาดใหม่จะทำให้โปรแกรมที่มีอยู่เสียหาย

อย่างไรก็ตามเนื่องจากการเกาะติดกับข้อความแสดงข้อผิดพลาดแบบเดิมนั้นไม่ใช่ข้อบังคับของ AFAIK ดังนั้นจึงไม่มีสิ่งใดที่ห้ามให้ผู้พัฒนาทำเพื่อทำให้ข้อความเดี่ยวชัดเจนขึ้นเช่น out of disk/inode space

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

ฉันเดาว่าคุณจะไม่บ่นถ้าดิสก์ของคุณรายงานเต็มในขณะที่ยังมีสล็อต inodes ฟรี

โปรดทราบว่าระบบไฟล์ชอบJFS, XFS, ZFSและbtrfsจัดสรร inodes แบบไดนามิกเพื่อทำไม่มีการจัดแสดงเรื่องนี้อีกต่อไป


ระบบไฟล์ล่าสุดรวมถึง ext4?
Camilo Martin

@CamiloMartin ฉันไม่คิดว่ามันจะเป็นเช่นนั้น
jlliagre

@CamiloMartin แต่น่าเสียดายที่ไม่ext4ได้จัดสรร inodes ในเวลาการสร้าง fs เช่น ext2 / 3 และไม่สามารถแก้ไขได้ในภายหลัง
Matt

@mindthemonkey ยี้! นั่นอาจเป็นสิ่งที่เข้ากันได้ย้อนหลังฉันเดา ระบบไฟล์อื่น ๆ มีคุณสมบัติที่ดี แต่มีเสถียรภาพเพียงพอ (มีเสถียรภาพ btrfs)? ext4 ดูเหมือนจะเป็น "ตัวเลือกเริ่มต้น" (อย่างน้อยก็จากมุมมองสามเณรของฉัน)
Camilo Martin

1
ใช่แล้วส่วนต่อขยายของรุ่นก่อนหน้าและเข้ากันได้ตลอดเวลาดังนั้นจึงไม่มีการเปลี่ยนแปลงที่สำคัญ แต่นั่นก็หมายความว่ามันยังค่อนข้างมั่นคงและมีเสถียรภาพ ฉันทำที่เก็บข้อมูลปริมาณมากทั้งหมดของฉันในกล่อง freebsd ด้วย ZFS BTRFS นั้นยังถือว่า "ไม่เสถียร" แม้ว่าอย่างน้อยที่สุดการแจกแจงจะทำให้คุณสามารถใช้งานได้
Matt

2

ฉันคิดว่าเพื่อนของคุณกำลังใช้ ext fs เพราะมันเป็นหนึ่งในไม่กี่ fs ที่สมเหตุสมผลที่สามารถใช้งานได้หมด inodes

ดูเหมือนว่าเพื่อนของคุณจะเล่นซอกับระบบไฟล์ของเขาและทำให้มันแตกหรือมีจำนวนมากของ TB ที่น่าขัน Inodes ไม่ใช่สิ่งที่ใช้ครั้งเดียวแล้วทิ้ง ถ้าเขาหมด inodes จริงๆหมายความว่าเขามีไฟล์และไดเรกทอรีจำนวนมากอย่างน่าขัน ... ซึ่งสามารถเกิดขึ้นได้ในปริมาณ> 4TB (การศึกษาที่คาดเดา) ซึ่ง "เพียง" 700GB นั้นฟรี สำหรับตระกูล ext ของ fs จะมีการกำหนดจำนวน inodes เมื่อสร้าง fs จากmkfs.ext4หน้าคน:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

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

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

ฉันจำปัญหานี้ด้วย ext2 จากเวลาที่เคอร์เนล 2.4 นั้นค่อนข้างใหม่ ตามกฎของหัวแม่มือฉันมักจะใช้ XFS สำหรับไดรฟ์ข้อมูลที่มีขนาดใหญ่มากเมื่อเทียบกับสิ่งที่เป็นเรื่องธรรมดาในปัจจุบัน ปัจจุบันฉันเรียกทุกอย่างระหว่าง 250GB ถึง 1TB ทั่วไปสำหรับโวลุ่มเดียวและเราสามารถซื้อ HDD ขนาด 4TB ได้ ดังนั้นสำหรับทุกอย่าง> 3TB ฉันควรใช้ XFS มากกว่า ext เป็นกฎง่ายๆ แต่ยังไม่หมด inodes นาน ...


1
ฉันเกรงว่าคุณไม่ตอบคำถามที่ถาม
jlliagre

จริง ฉันกำลังพยายามตอบคำถามแบบอินไลน์แรกที่ฉันกด "ใครรู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น" แต่ไม่ใช่คำถามในชื่อ
Bananguin

ขวา. เพื่อนของฉันรู้ว่าเกิดอะไรขึ้น เขากำลังทำระบบสำรองข้อมูลบางอย่างที่มันถูกเก็บการเปลี่ยนแปลงที่เพิ่มขึ้นแบบไม่บีบอัด (หรือ TAR'd) เพื่อให้มีไฟล์เล็ก ๆ เหล่านี้ทั้งหมดที่ใช้พื้นที่ ฉันไม่คิดว่าเขาเคยมี FS ขนาดใหญ่มาก่อนดังนั้นการวิ่งออกจากไอโหนดจึงเป็นสิ่งใหม่สำหรับเขา เออร์โกเขารู้สึกหงุดหงิดเมื่อเขาพิมพ์ "df -h" และคิดว่า "ฮะฉันยังเหลือพื้นที่เหลืออีกมาก" - พูดตามตรงฉันเห็นด้วยกับเขา สำหรับเคอร์เนลที่จะพูดว่า "out of space" ในความเป็นจริงมันควรจะมีข้อความแยกต่างหาก "out of inodes" ทำให้เกิดความสับสนมาก
Pretzel

@Bananguin - คุณรู้หรือไม่ว่าอัตราส่วน byte / inode เริ่มต้นคืออะไร?
Pretzel

@Pretzel: ฉันคิดว่าฉันจำได้ว่าเริ่มต้นเป็นหนึ่งไอโหนดสำหรับแต่ละ 4k ฉันเพิ่งตรวจสอบคอมพิวเตอร์ของฉัน ( tune2fs -l /dev/sda1) และฉันมีอัตราส่วน 1 inode ต่อทุกสี่บล็อกและทุกบล็อกมีขนาด 1k เท่านี้ถือได้ว่าเป็น "ค่าเริ่มต้น" แต่ฉันไม่รู้
Bananguin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.