며칠 동안 노력했지만 여전히 Python 스크립트를 사용하여 HDD 드라이브의 올바른 크기를 얻는 방법을 알 수 없습니다. 내 하드 드라이브는 1Tb입니다. 내가 아는 한, Gb는 약 1000Gb이고 GiB는 약 931GiB입니다. 터미널에 입력하면 다음과 같이 lsblk
표시됩니다.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931,5G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
└─sda2 8:2 0 931G 0 part /
좋아요 그런 다음 lshw --class disk
931GiB도 표시되도록 시도했습니다 .
*-disk
description: ATA Disk
product: ST1000LM035-1RK1
physical id: 0.0.0
bus info: scsi@0:0.0.0
logical name: /dev/sda
version: SDM2
serial: WDEWEKZF
size: 931GiB (1TB)
capabilities: gpt-1.00 partitioned partitioned:gpt
configuration: ansiversion=5 guid=f166251c-436c-421f-aba8-9910d76f9fab logicalsectorsize=512 sectorsize=4096
그런 다음 Python 스크립트를 통해 크기를 얻으려고합니다.
total, used, free, percent = disk_usage('/')
print(f"Total: {total}")
print(f"Used: {used}")
print(f"Free: {free}")
total2, used2, free2, percent2 = disk_usage('/boot/efi')
print(f"Total: {total2}")
print(f"Used: {used2}")
print(f"Free: {free2}")
산출:
Total: 982900588544
Used: 118413897728
Free: 814486605824
Total: 535805952
Used: 5484544
Free: 530321408
982900588544 / 1024 / 1024 / 1024 = 915GiB.
535805952 = 500MiB.
df
명령은 다음을 표시합니다.
Filesystem 1K-blocks Used Available Use% Mounted on
udev 8092080 0 8092080 0% /dev
tmpfs 1627768 1712 1626056 1% /run
/dev/sda2 959863856 115646148 795389500 13% /
tmpfs 8138832 12368 8126464 1% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 8138832 0 8138832 0% /sys/fs/cgroup
/dev/sda1 523248 5356 517892 2% /boot/efi
tmpfs 1627764 24 1627740 1% /run/user/1000
모든 1K 블록의 합은 1Tb입니다.
그렇다면 나머지 931 - 915 = 16GiB의 HDD 공간은 어디에 있습니까? 그리고 올바른 방법으로 치수를 얻는 방법은 무엇입니까? 리눅스 민트 20.1 x64
감사해요.
답변1
ext4의 경우 파일 시스템 메타데이터(주로 inode 테이블)의 크기가 손실됩니다. 예를 들어, 다음은 /home 파티션입니다.
- 파티션 크기는 751619276800바이트(
sudo /sbin/blockdev --getsize64 /dev/mapper/Watt-home
) 입니다. - "df" 크기는 739691814912(
df --block-size=1 /home
) 입니다. - inode 수는 45875200(
df -i /home
) 입니다. - ext4의 Inode는 256바이트입니다.
따라서 계산을 하면 (751619276800-739691814912-(45875200*256))/1024^2 ≒ 175MiB입니다. 이는 파일 시스템 메타데이터(수퍼블록 등)의 나머지 부분입니다.
이것이 올바른지 확인하려면 더 낮은 inode 비율로 초기화된 파일 시스템과 비교하십시오. 한 가지 방법은 -T largefile
또는 -T largefile4
옵션을 사용하는 것입니다( /etc/mke2fs.conf
가능성은 참고자료 참조). 여기에 하나가 있습니다.
- 파티션 크기: 429496729600
- df 크기: 429229522944
- 인덱스 노드: 409600
df 크기가 파티션 크기에 얼마나 가까운지 확인하십시오(99.9% 이상). 그 이유는 inode 수가 훨씬 적기 때문입니다. 다시 계산하면 (429496729600-429229522944-(409600*256))/1024^2 ≒ 155MiB입니다.
ext4에서는 inode 수가 사용자가 가질 수 있는 파일 수에 대한 엄격한 제한이라는 점을 기억하십시오. 이 비율(또는 N 블록당 1개의 inode 비율)도 mkfs에서 한 번 설정되며 변경할 수 없습니다. 그러나 하나의 파일 시스템이 대용량 파일을 저장하는 데만 사용된다는 것을 알고 있다면 두 번째 파일 시스템에서 했던 것처럼 inode를 줄여 공간을 절약할 수 있습니다.
커널 소스 코드에서 감산된 오버헤드를 볼 수 있습니다.https://elixir.bootlin.com/linux/latest/source/fs/ext4/super.c#L6095- minixdf
이를 방지하는 마운트 옵션도 있는데, 아마도 훨씬 더 이상한 일을 일으킬 수도 있습니다. 나는 확인하지 않았으며 내가 찾은 유일한 문서는 그들이 그것을 제거하려고 시도했지만 사람들이 불평할 때 그대로 두었다는 것입니다.
참고: inode 테이블 등의 오버헤드 외에도 일반적으로 루트 디렉터리용으로 공간의 5%가 예약됩니다. 이는 전체 크기에서 차감되지 않지만 사용 가능한 공간에서는 차감됩니다. 이 양을 변경할 수 있습니다 tune2fs -m
. 다른 옵션을 사용하면 대신 블록 수를 지정하고( ) 예약된 공간을 사용할 수 있는 -r
사용자( -u
) 또는 그룹( )을 변경할 수 있습니다. -g
한 가지 이점은 사용자가 파티션을 가득 채우더라도 시스템 관리자가 복구에 사용할 수 있는 공간을 확보할 수 있다는 것입니다.
참고: ext2/ext3은 크기가 절반인 128바이트 inode를 사용합니다. 이는 소규모 파일 시스템의 경우에도 마찬가지입니다. 다음 옵션을 사용하여 실제로 mkfs 시간으로 설정할 수 있습니다 -I
. 주의 사항은 mkfs.ext4 맨페이지를 참조하세요(128로 변경하는 것을 권장하지 않음).
답변2
파일 시스템 자체에서 모든 파일 구조의 숨겨진 내부 데이터 손실을 기록하는 데 사용됩니다. 사용 중인 도구가 표시되지 않아 누락된 것으로 나타납니다.