給定一個文件描述符或文件名,如何知道我是否可以寫入任意位置,而不必等待介入部分在磁盤上顯式清零?如何測試是否支持稀疏文件
5
A
回答
2
您可以通過stat()
獲取文件大小和磁盤塊數量,在文件末尾尋找相對較少數量的磁盤塊,寫入已知數量的塊,然後重新統計文件。將原始磁盤塊數與最終的數字進行比較。如果文件系統不支持稀疏文件,則只需幾個磁盤塊就不會花太長時間寫入。
給定磁盤塊的原始數量和最終數量,然後嘗試確定文件系統是否支持稀疏文件。我說「嘗試」,因爲一些文件系統可能會使這很難 - 例如,啓用壓縮的ZFS。
事情是這樣的:(省略了清晰的錯誤檢查)
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int check(const char *filename)
{
struct stat sb;
long blocksize;
off_t filesize;
blkcnt_t origblocks;
char *buffer;
int fd;
fd = open(filename, O_CREAT | O_RDWR, 0644);
fstat(fd, &sb);
blocksize = sb.st_blksize;
filesize = sb.st_size;
origblocks = sb.st_blocks;
lseek(fd, 16UL * blocksize, SEEK_END);
buffer = malloc(blocksize);
memset(buffer, 0xAA, blocksize);
write(fd, buffer, blocksize);
fsync(fd);
free(buffer);
// kludge to give ZFS time to update metadata
for (;;)
{
stat(filename, &sb);
if (sb.st_blocks != origblocks)
{
break;
}
}
printf("file: %s\n filesystem: %s\n blocksize: %d\n size: %zd\n"
" blocks: %zd\n orig blocks: %zd\n disk space: %zd\n",
filename, sb.st_fstype, blocksize, sb.st_size,
(size_t) sb.st_blocks, (size_t) origblocks,
(size_t) (512UL * sb.st_blocks));
// return file to original size
ftruncate(fd, filesize);
return(0);
}
int main(int argc, char **argv)
{
for (int ii = 1; ii < argc; ii++)
{
check(argv[ ii ]);
}
return(0);
}
ZFS啓用壓縮似乎並沒有迅速更新文件元數據,因此紡紗等待變化出現。
當與所述文件asdf
(ZFS文件系統,能夠進行壓縮)/tmp/asdf
(tmpfs文件系統)在Solaris 11箱運行,並且/var/tmp/asdf
(ZFS,無壓縮),該代碼產生以下輸出:
file: asdf
filesystem: zfs
blocksize: 131072
size: 2228224
blocks: 10
orig blocks: 1
disk space: 5120
file: /tmp/asdf
filesystem: tmpfs
blocksize: 4096
size: 69632
blocks: 136
orig blocks: 0
disk space: 69632
file: /var/tmp/asdf
filesystem: zfs
blocksize: 131072
size: 2228224
blocks: 257
orig blocks: 1
disk space: 131584
從該輸出中,應該很明顯/tmp/asdf
位於不支持稀疏文件的文件系統上,而/var/tmp/asdf
位於支持此類文件的文件系統中。
而純asdf
是完全不同的地方,其中寫入128kB的數據會添加所有9個512字節的磁盤塊。由此可以推斷文件系統中存在某種壓縮。我認爲假設任何支持這種本地壓縮的文件系統也會支持稀疏文件是非常安全的。
並以最快的方式,以確定是否一個文件系統支持稀疏文件時給文件名或打開文件的描述符是調用stat()
上的文件描述符的文件名或fstat()
,從struct stat
獲得st_fstype
領域,比較文件的文件系統類型轉換爲已知支持稀疏文件的一組文件系統類型。
相關問題
- 1. Incanter是否支持稀疏矩陣?
- 2. Python中是否支持稀疏矩陣?
- 3. Java ArrayList是否支持稀疏標記?
- 4. 如何讓文件稀疏?
- 5. R中是否有對dist函數的稀疏支持?
- 6. Scipy:稀疏矩陣是否支持高級索引?
- 7. 測試矩陣是否是稀疏矩陣
- 8. 測試是否支持Three.js
- 9. R稀疏矩陣支持quantreg
- 10. 支持igraph中稀疏網絡
- 11. HDF5中的稀疏陣列支持
- 12. Python hashlib和稀疏文件
- 13. 發送稀疏文件
- 14. 複製稀疏文件
- 15. 測試是否支持命令選項
- 16. SWT測試是否支持瀏覽器
- 17. JUnit是否支持測試的屬性文件?
- 18. 測試瀏覽器是否支持多個文件上傳?
- 19. 是稀疏數據
- 20. 如何測試對象是否是映射(支持** O用法)
- 21. 檢測稀疏位模式
- 22. 如何通過命令行確定MKS沙箱是稀疏還是非稀疏?
- 23. 如何檢測是否支持clipboard.js
- 24. 如何檢測UIMotionEffect是否受支持?
- 25. 如何檢測printf是否支持%a?
- 26. 可可的NSMutableArray是否稀疏?
- 27. Node.js中JavaScript/ECMAScript數組是否「稀疏」?
- 28. Rascal單元測試框架是否支持測試夾具?
- 29. Google雲端測試實驗室是否支持Appium測試?
- 30. Boost測試框架是否支持測試依賴關係?