私は数日間試しましたが、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スペースはどこにありますか?そして正しい方法で寸法を取得する方法は? Linux Mint 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比で初期化されたファイルシステムと比較してください。 1つの方法はまたは-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で一度設定され、変更することはできません。ただし、1つのファイルシステムが大容量ファイルを保存するためにのみ使用されることがわかっている場合は、2番目のファイルシステムで行ったようにinodeを減らすことでスペースを節約できます。
カーネルソースコードから減算されたオーバーヘッドを見ることができます。https://elixir.bootlin.com/linux/latest/source/fs/ext4/super.c#L6095-minixdf
これを防ぐためのマウントオプションもありますが、おそらくはるかに奇妙なことを引き起こす可能性があります。私は確認しておらず、私が見つけた唯一の文書は、彼らがそれを削除しようとしましたが、人々が文句を言ったときにそのままにしたことです。
注:inodeテーブルなどのオーバーヘッドに加えて、通常はルートディレクトリ用にスペースの5%が予約されています。これはフルサイズでは差し引かれませんが、利用可能なスペースでは差し引かれます。この量を変更できますtune2fs -m
。他のオプションを使用すると、代わりにブロック数を指定し()、予約済みスペースを使用できる-r
ユーザー(-u
)またはグループ()を変更できます。-g
1つの利点は、ユーザーがパーティションをいっぱいにしても、システム管理者が回復に使用できるスペースを確保できることです。
注:ext2 / ext3は、半分のサイズの128バイトinodeを使用します。これは、小規模ファイルシステムの場合も同様です。次のオプションを使用して、実際にmkfs時間に設定できます-I
。注意事項はmkfs.ext4のマンページを参照してください(128に変更することはお勧めできません)。
答え2
ファイルシステム自体からすべてのファイル構造の隠された内部データ損失を記録するために使用されます。使用中のツールが表示されないため、欠落しているように見えます。