ทำไม os.stat และ du และ ls ของ python ถึงไม่เห็นด้วยกับขนาดบล็อก


0

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

เหตุใด ls และ du บอกว่าไฟล์นี้มีขนาด 16 บล็อก

#!/bin/bash                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

targetfile=/scratch/blob
rm -rf /scratch > /dev/null 2>&1
mkdir -p /scratch > /dev/null 2>&1
bs=$(dumpe2fs -h /dev/mapper/testvm-root 2> /dev/null | grep "Block size:")
bs=${bs/Block size:/}
bs=${bs// /}
echo blocksize=$bs
# create a file slightly too big for three blocks
dd if=/dev/zero of=$targetfile count=1 bs=$((bs*3+1)) > /dev/null 2>&1

echo "du says $(du $targetfile) units"
echo "du says $(du -b $targetfile) bytes:"
echo "ls says $(ls -s $targetfile) blocks"

echo "python says:"
python <(cat <<ENDMARKER
import os
import math
x = os.stat("$targetfile")
blocks=math.ceil(float(x.st_size)/float(x.st_blksize))
print("%d bytes st_blksize=%d, %d blocks " % (x.st_size,x.st_blksize,blocks))
print("blocksize=%d" % os.statvfs("$targetfile").f_bsize)
ENDMARKER
)

นี่คือสิ่งที่ฉันเห็น:

blocksize=4096
du says 16      /scratch/blob units
du says 12289   /scratch/blob bytes:
ls says 16 /scratch/blob blocks
python says:
12289 bytes st_blksize=4096, 4 blocks 
blocksize=4096

ฉันคาดว่า ls -s จะบอกว่า 4 ช่วงตึกเหมือน du-B 4096


อาจเกี่ยวข้องกับ: unix.stackexchange.com/questions/120311/…
strugee

เป็นการอ่านที่ดี แต่ไม่ตอบคำถามของฉันอย่างแน่นอน เมื่ออ่านหน้า du man อีกครั้งฉันเห็นว่าโดยค่าเริ่มต้นจะรายงานการใช้งานในหน่วยบล็อก 512- ไบต์ ฉันไม่เข้าใจว่าทำไม แต่อย่างน้อยฉันก็ได้ตัวเลขที่ฉันต้องการ
John Schmitt

คำตอบ:


2

ทั้งขนาดเริ่มต้นduและlsขนาดบล็อก 1024 ไบต์เมื่อคำนวณจำนวนบล็อก เนื่องจากระบบไฟล์ของคุณถูกกำหนดค่าด้วยบล็อก 4K และไฟล์นั้นใช้บล็อก 4K 4 บล็อกทั้งคู่จึงใช้ 16 1K-blocks ที่ใช้

du (1) manpageกล่าวถึงข้อเท็จจริงนี้ในตอนท้ายของส่วนคำอธิบายในขณะที่ls (1)ไม่ได้ระบุโดยตรง อย่างไรก็ตามทั้งสองโปรแกรมเป็นส่วนหนึ่งของชุดโปรแกรม coreutils ของ GNU และสนับสนุนตัวเลือกขนาดบล็อก -B / - เดียวกันดังนั้นฉันคิดว่าพวกเขาน่าจะใช้งานแบบเดียวกัน

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


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