ฉันจะเพิ่มจำนวนของ inodes ในระบบไฟล์ ext4 ได้อย่างไร


61

ฉันมีปัญหา (ใหม่สำหรับฉัน) เมื่อสัปดาห์ที่แล้ว ฉันมีระบบไฟล์ ext4 (Fedora 15) แอปพลิเคชันที่ทำงานบนเซิร์ฟเวอร์หยุดทำงานกะทันหัน ฉันไม่พบปัญหาตั้งแต่แรกพบ

dfแสดงพื้นที่ว่าง 50% df -iหลังจากการค้นหาประมาณหนึ่งชั่วโมงผมเห็นโพสต์ฟอรั่มที่คนใช้ ตัวเลือกนี้จะค้นหาการใช้งาน inodes ระบบหมด inodes ปัญหาง่าย ๆ ที่ฉันไม่รู้ พาร์ติชันมี inodes 3.2M เท่านั้น

ตอนนี้คำถามของฉันคือ: ฉันสามารถทำให้ระบบมี inodes เพิ่มเติมได้หรือไม่ ควร / สามารถตั้งค่าเมื่อทำการฟอร์แมตดิสก์หรือไม่ ด้วย inode 3.2M ฉันจะได้ไฟล์กี่ไฟล์?


1
ทุกไฟล์หรือไดเรกทอรีใช้หนึ่งไอโหนด ฮาร์ดลิงก์ไปยังไฟล์ไม่ได้สร้างไอโหนด en.wikipedia.org/wiki/Inode
Paul Tomblin

คำตอบ:


33

ดูเหมือนว่าคุณมีไฟล์มากกว่าที่คุณคาดไว้มาก

ฉันไม่ทราบว่ามีวิธีแก้ไขขนาดตาราง inode แบบไดนามิกหรือไม่ ฉันกลัวว่าคุณต้องสำรองข้อมูลของคุณและสร้างระบบไฟล์ใหม่และกู้คืนข้อมูลของคุณ

ในการสร้างระบบไฟล์ใหม่ด้วยตาราง inode ขนาดใหญ่คุณต้องใช้ตัวเลือก '-N' ของ mke2fs (8)

ฉันแนะนำให้ใช้ตัวเลือก '-n' ก่อน (ซึ่งไม่ได้สร้าง fs แต่แสดงข้อมูล use-ful) เพื่อที่คุณจะได้รับจำนวน inodes โดยประมาณ จากนั้นหากคุณต้องการใช้ '-N' เพื่อสร้างระบบไฟล์ของคุณด้วยหมายเลข inode ที่ระบุ


11
คุณสามารถใช้mke2fs -iเพื่อระบุจำนวน inodes เอกสารประกอบระบุว่า“ ไม่สามารถขยายจำนวน inodes บนระบบไฟล์หลังจากสร้างขึ้นได้”
Gilles

2
@piovisqui: แต่ละไฟล์ใช้กับ inode ซึ่งเป็นตัวชี้ในระบบไฟล์ หากไฟล์นั้นเป็นฮาร์ดลิงก์ไปยังไฟล์อื่นมันจะมีไอโหนดเดียวกัน
Hanan N.

6
@Gilles -iตัวเลือกจะระบุขนาดของ inode ไม่ใช่จำนวนเท่าใด -Nตัวเลือกชุด inodes จำนวน
theillien

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

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

11

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


หากคอลเลกชันที่ควรจะเป็นแบบอ่านอย่างเดียวsquashfsอาจเป็นตัวเลือก แต่มันต้องมีตัวเลือกบางอย่างที่เปิดใช้งานในเคอร์เนลและการxzบีบอัดสามารถใช้ได้สำหรับ tar เช่นเดียวกับประสิทธิภาพเดียวกัน


2
คำแนะนำที่ดี
piovisqui

11

ด้วย 3.2 ล้าน inodes คุณสามารถมี 3.2 ล้านไฟล์และไดเร็กตอรี่รวม (แต่ฮาร์ดลิงก์หลายอันไปยังไฟล์ใช้เพียงไอโหนดเดียวเท่านั้น)

ใช่สามารถตั้งค่าได้เมื่อสร้างระบบไฟล์บนพาร์ติชัน ตัวเลือก-T usage-type, -N number-of-inodesหรือ-i bytes-per-inodeทุกคนสามารถกำหนดจำนวนของ inodes ฉันมักจะใช้-iหลังจากการเปรียบเทียบผลลัพธ์du -sและfind | wc -lสำหรับคอลเลกชันที่คล้ายกันของไฟล์และอนุญาตให้หย่อนบาง

ไม่ไม่สามารถเปลี่ยนได้ในระบบไฟล์ที่มีอยู่ อย่างไรก็ตาม:

  • หากคุณกำลังเรียกใช้ LVM หรือระบบไฟล์อยู่ใน LUN ของ SAN (โดยตรงบน LUN หรือเป็นพาร์ติชันสุดท้ายของ LUN) หรือคุณมีพื้นที่ว่างบนดิสก์หลังพาร์ติชันคุณสามารถขยายพาร์ติชันแล้ว ใช้resize2fsสำหรับขยายระบบไฟล์ สิ่งนี้จะเพิ่มไอโหนดเพิ่มเติมตามสัดส่วนของพื้นที่ที่เพิ่มเข้าไปโดยประมาณ หากคุณต้องการที่จะหลีกเลี่ยงการทำงานออกจาก inodes tune2fs -mก่อนพื้นที่สมมติว่าไฟล์อนาคตโดยเฉลี่ยมีประมาณขนาดเดียวกันตั้งค่าพอที่ร้อยละบล็อกสูงสงวนไว้ใช้
  • หากคุณมีพื้นที่ว่างเพียงพอและสามารถใช้ระบบไฟล์ออฟไลน์ได้ให้ดำเนินการออฟไลน์สร้างระบบไฟล์ใหม่ด้วยไอโหนดเพิ่มเติมและคัดลอกไฟล์ทั้งหมด
  • หากมีเพียงส่วนย่อยของไฟล์ที่ใช้ inodes จำนวนมากและคุณมีพื้นที่ว่างเพียงพอให้สร้างระบบไฟล์บนอุปกรณ์วนรอบที่สนับสนุนโดยไฟล์ในระบบไฟล์สร้างระบบไฟล์ที่มี inodes มากขึ้น (และอาจมีบล็อกเล็กกว่า) ในนั้นและย้ายไดเรกทอรีที่กระทำผิดไป นั่นอาจเป็นเรื่องประสิทธิภาพและความยุ่งยากในการบำรุงรักษา แต่ก็เป็นทางเลือกอื่น
  • และแน่นอนถ้าคุณสามารถลบไฟล์ที่ไม่จำเป็นจำนวนมากออกมาก็ควรช่วยเช่นกัน

6

ฉันมีทางเลือกอื่นสำหรับสถานการณ์นี้ ให้บอกว่าคุณมี 1,000 ไอโหนดในพาร์ติชัน 10G แต่เนื่องจากข้อ จำกัด ของ inodes คุณไม่ควรใช้พื้นที่ทั้งหมดของพาร์ติชั่น แต่ในการแก้ปัญหานี้คุณจะสามารถที่จะใช้พื้นที่ที่เหลืออยู่ของพาร์ทิชันโดยไม่ต้องจัดรูปแบบมัน

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

สำหรับการติดตั้งถาวร

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
ยินดีต้อนรับสู่ U&L ฉันใช้เสรีภาพในการฟอร์แมทคำตอบของคุณเพื่อให้ได้รหัสที่เป็นปกติมากขึ้นที่นี่ใส่พรอมต์ ( $) เพื่อแยกความแตกต่างระหว่างคำสั่งและเอาท์พุทอย่างชัดเจน (ถ้าพวกเขาเป็นเพียงคำสั่งเท่านั้น ฉันเปลี่ยน SHOUTING ด้วยการเน้นช่วงตัวหนาซึ่งเป็นสิ่งที่ฉันคิดว่าคุณตั้งใจ คุณสามารถย้อนกลับการเปลี่ยนแปลงถ้าฉันแสดงสิ่งที่ผิด
Anthon

ฉันคิดว่าวิธีนี้มีตรรกะ แต่คุณต้องจัดการขนาดเมื่อใช้ dd
piovisqui

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

6

เมื่อเร็ว ๆ นี้พบปัญหานี้เมื่อใช้ apt หรือ aptitude upgrade

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

คำสั่งที่ออก:

du /|sort -k1 -n

เปิดเผยไฟล์ส่วนใหญ่อยู่ในโฟลเดอร์ย่อยสำหรับเคอร์เนลหลายรุ่นภายใน:

/usr/src/linux-headers

ลบโฟลเดอร์ย่อยและปัญหาไอโหนดเหล่านั้นได้รับการแก้ไขแล้ว

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

"du / | sort -k1 -n" แสดง inodes หรือไม่
เด็กกำพร้า

ไม่นั่นคือเพื่อเรียงลำดับไดเรกทอรีโดยแสดงว่าไฟล์ใดมีไฟล์มากที่สุดโฟลเดอร์ที่ใช้ inodes จำนวนมาก แต่ใช้พื้นที่น้อยกว่าจริง: สถานการณ์ของพื้นที่ว่างในดิสก์ 30% แต่ใช้งาน inode ได้ 100% ดังที่แสดงไว้ด้านบน
kph0x1

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

ไม่มีแฟล็กสำหรับduคำสั่ง การใช้งานสำหรับรากของระบบไฟล์ในตัวอย่างข้างต้นมองที่พื้นที่เท่านั้น เอาต์พุตถูกไพพ์เพื่อเรียงลำดับเพื่อแสดงว่าไดเร็กทอรีใดมีไฟล์มากที่สุด ไม่มีการนับในตัวอย่างด้านบนสำหรับไฟล์ส่วนของ 'จำนวนไฟล์' ของคำถามของคุณ แหล่งที่มาของเคอร์เนลคือผู้ร้ายที่แสดงในduผลลัพธ์แม้ว่า; เช่นไฟล์ขนาดเล็กหลาย ๆ โฟลเดอร์ย่อยจากการรวบรวมที่ผ่านมาสิ่งที่เหมาะอย่างยิ่งสำหรับการกำจัดเพื่อเพิ่ม inodes ยังคงมีคู่มือการตรวจสอบduผลลัพธ์ที่/usr/src/linux-headersเห็นได้ชัดของมนุษย์
kph0x1

1
du แสดงเฉพาะไบต์ - ไม่ใช่ไฟล์ และคุณกำลังไพพ์เอาต์ outout จากคำสั่ง du ลงในการเรียงลำดับเท่านั้น ดังนั้น sort -k1 -n จะเรียงลำดับเอาต์พุตอย่างไรในแบบที่คุณเสนอ? สิ่งเดียวที่ฉันเห็นคือ "du / | sort -k1 -n" เรียงลำดับทุกแถวตามขนาดเป็นไบต์เท่านั้น ไม่มีอะไรอีกแล้ว
เด็กกำพร้า

2

ลองdu -s --inodes * 2>/dev/null |sort -gแผ่นซีดีลงใน dir สุดท้ายของผลลัพธ์และทำซ้ำ

การเปิดเผยแบบเต็ม: ไม่ใช่การ--inodesตั้งค่าสถานะการสนับสนุนของระบบปฏิบัติการทั้งหมดสำหรับคำสั่ง du (Mac OS ของฉันไม่ได้) แต่มีหลายระบบปฏิบัติการที่ใช้ Linux

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