เซิร์ฟเวอร์ Linux ออกจากพื้นที่


31

ฉันถูกถามคำถามนี้ในการสัมภาษณ์สองครั้งติดต่อกัน แต่หลังจากการวิจัยและการตรวจสอบกับผู้ดูแลระบบหลายคนฉันไม่ได้รับคำตอบที่ดี ฉันสงสัยว่ามีคนช่วยฉันที่นี่หรือไม่

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


3
คุณต้องพูดคุยกับผู้ดูแลระบบที่ดีขึ้น นี่คือสิ่งเล็กน้อย
womble

2
จิ๊บจ๊อย แต่สถานการณ์และคำถามขึ้นมามักจะพอ ...
ewwhite

OP จะสามารถยอมรับสิ่งนี้ได้หรือไม่?
ewwhite

5
เล็กน้อยหรือไม่สำหรับคนที่ไม่พูด * ระวังอย่างคล่องแคล่ว (เช่นผู้ดูแลระบบ Windows เป็นหลัก) นี่เป็นสิ่งที่ดีที่จะเรียนรู้
John Gardeniers

คำตอบ:


56

นี่เป็นคำถามสัมภาษณ์ทั่วไปและสถานการณ์ที่เกิดขึ้นในสภาพแวดล้อมการผลิตที่หลากหลาย

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

ส่วนอื่น ๆ ของคำถามอาจเป็น "คุณจะล้างไฟล์ที่ถูกเขียนไปโดยไม่ฆ่ากระบวนการได้อย่างไร" ตามหลักแล้วคุณจะ"ล็อก" หรือ "ตัด" ไฟล์บันทึกด้วยบางสิ่งเช่น: > /var/log/logfileแทนที่จะลบไฟล์


1
... fuserหรือ
Steven Monday

1
การขยายบิต: จนกระทั่งการอ้างอิงทั้งหมดไปยังไฟล์บนดิสก์หายไปพื้นที่อื่นนั้นไม่สามารถใช้งานได้ ที่มีการจัดการไฟล์ ที่ยังช่วยให้เคล็ดลับนี้ทำงาน: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland

1
หากคุณได้no-clobberตั้งค่าลอง:>| /var/log/logfile
Belmin Fernandez

2
ฉันถามคำถามนี้หลายครั้งในการสัมภาษณ์ทุกครั้ง: "คุณได้รับข้อความเต็มดิสก์dfกล่าวว่าคุณหมดพื้นที่แล้วduบอกว่าคุณแทบจะไม่ได้ใช้อะไรสาเหตุอะไรและทำไมทั้งสองเครื่องมือจึงไม่เห็นด้วย"
voretaq7

จะทำอย่างไรถ้า> /var/log/fileพื้นที่บนดิสก์ยังคงอยู่ที่ 100%? ดูเหมือนว่าไฟล์บันทึกจะว่างเปล่า ... แต่หลังจากรีสตาร์ทโปรแกรมที่เขียนลงในไฟล์บันทึกนี้แล้วพื้นที่จะถูกกู้คืน มีวิธีการกู้คืนพื้นที่ว่างในดิสก์โดยไม่ต้องเริ่มโปรแกรมใหม่หรือไม่?
alemani

14

ยังคงมีลิงก์อื่นไปยังไฟล์ (ฮาร์ดลิงก์หรือตัวจัดการไฟล์ที่เปิด) การลบไฟล์จะลบรายการไดเรกทอรีเท่านั้น ข้อมูลไฟล์และ inode จะวนไปเรื่อย ๆ จนกว่าการอ้างอิงครั้งสุดท้ายจะถูกลบทิ้ง

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

ภายใต้ Linux คุณสามารถเข้าถึงไฟล์ที่ถูกลบเหล่านี้ได้อย่าง/proc/<pid>/fd/<filenumber>สะดวก


8

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


2

คำตอบทางเลือกหนึ่งนอกเหนือจากคำตอบฮาร์ดลิงก์ / ไฟล์เปิดที่ชัดเจน: ไฟล์นั้นเป็นไฟล์ที่กระจัดกระจาย (มาก) เช่น/var/log/lastlogบน RHEL ที่ไม่ได้ใช้พื้นที่มากขนาดนั้น การลบมันมีผลกระทบน้อยมากดังนั้นคุณต้องดูไฟล์ที่ใหญ่ที่สุดต่อไป


1

หากกระบวนการเขียนไฟล์เป็นรูทกระบวนการจะเขียนลงในพื้นที่ไฟล์ที่สงวนไว้ของ superuser ระบบไฟล์มีพื้นที่นี้เพื่อให้ระบบทำงานได้ในกรณีที่งานของผู้ใช้เติมดิสก์ พื้นที่นี้ (imho ต่อ 5% เริ่มต้น) จะมองไม่เห็นเครื่องมือมากมาย

lsof สามารถแสดงให้คุณเห็นว่ากระบวนการใดที่ล็อกไฟล์ Ergo กำลังเขียนลงไป


1
นอกจากนี้คุณยังสามารถปรับเปอร์เซ็นต์สำรองนี้โดยใช้ tune2fs นี่เป็นวิธีที่รวดเร็วในการอนุญาตให้เซิร์ฟเวอร์ทำงานต่อไปในขณะที่คุณเพิ่มพื้นที่ว่างในดิสก์
sjbotha

1

นอกจากไฟล์ถูกเปิดโดยกระบวนการที่เป็นกรณีที่ 2 คือเมื่อคุณมีระบบไฟล์ที่สนับสนุนภาพรวมเหมือนหรือbtrfsZFS

ตัวอย่างเช่นคุณถ่ายภาพโดยมีไฟล์บันทึกขนาดใหญ่นั้นมีอยู่ หากคุณลบไฟล์ตอนนี้คุณจะลบเฉพาะเดลต้า และเดลต้าจะถูกลบเฉพาะเมื่อไฟล์ไม่ได้ใช้งาน

ดูสิ่งนี้ด้วย:

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

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