我有一个连接到服务器的 Sandisk USB SSD(我不知道确切的型号,也无法从 中找到它lsusb -v
)。每当我创建一个非零大小的文件时,根据du
.
$ echo "foobar" > test
$ du -h test
1.0M test
$ du --apparent-size -h test
7 test
我读到这与设备的块大小有关,而且块大小通常为 4096 字节或类似的值,而不是 1 MB。我正在向磁盘写入许多小得多的文件,因此 90% 的空间被浪费了。
的输出fdisk
是
sudo fdisk -l /dev/sda
Disk /dev/sda: 931.5 GiB, 1000204140544 bytes, 1953523712 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 1048576 bytes
Disklabel type: dos
Disk identifier: 0x007fa07a
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 1953523711 1953521664 931.5G 7 HPFS/NTFS/exFAT
我不知道如何解析这个;这是否意味着它是 NTFS 格式?df -T
将其报告为fuseblk
.
这只是格式化驱动器的问题吗?块大小可以选择还是始终由硬件决定?
答案1
你正在看的是分配单元大小文件系统的,也可以称为块大小在文件系统级别。但这不一定与硬件设备级别使用的块大小相同,尽管分配单元大小肯定应该是硬件块大小的某个精确倍数,否则效率会低下。
对于Linux来说,分区表指示的文件系统类型没有任何意义;通过检查分区内实际的数据来自动检测类型。但对于其他操作系统,在分区表中正确指示文件系统类型可能会有所帮助。
表示fuseblk
文件系统由 FUSE 用户空间文件系统驱动程序处理;不幸的是,NTFS ( ntfs-3g
) 和 exFAT 都存在 FUSE 驱动程序,因此它在这里不是很有帮助。至少在 Debian/Ubuntu 中,你可以运行pgrep -a mount
:如果输出看起来像
<process ID> /sbin/mount.ntfs-3g /dev/sda1 <mountpoint of the filesystem> -o <some options>
那么它正在由ntfs-3g
驱动程序处理,并且显然是 NTFS。 exFAT 的输出行应该包含/sbin/mount.exfat-fuse
或类似的内容(我手头没有实际的 exFAT 文件系统用于测试)。
话虽如此,即使是 exFAT 也不应该使用 1 MB 的分配单元大小,除非在文件系统创建时指定:据微软称,大于 32 GB 的磁盘的默认 exFAT 分配单元大小应为 128 KB。