文件名的长度如何影响磁盘上剩余的存储空间?
我意识到这是依赖于文件系统的.特别是我在考虑EXT系列文件系统.我不完全了解inode如何影响磁盘空间以及文件名本身的存储方式.很难获得这个问题的相关搜索结果.这就是我在这里问的原因.在linux上,最大文件名长度通常为255或256个字符.创建文件系统时,每个文件名的"保留"空间量是多少?换句话说,磁盘存储是否不受实际文件名的影响,因为已经使用了最大值?还是比这更复杂?
假设我有一个名为"joe.txt"的文件并将其重命名为"joe2.txt".此后可用磁盘空间量是否减少了?那些更长的名字如"joe_version.txt"或"joe_original_version_with_bug_that_Jim_solved.txt"呢?我担心8,16,32,64等字符的阈值.我将存储数百万张图片.我之前从未担心过这样的问题,所以我不能完全确定它是如何工作的.
虽然EXT是我正在使用的唯一文件系统,但讨论FAT和其他可能对其他有类似问题的人有用.
在pgsql在文件系统上每个表存储1个文件并在pg_catalog中搜索每个查询以进行查询计划时,单个pgsql数据库中的最大表数是多少,同时仍然保持良好的性能?
EG:pgsql可以处理单个数据库中的100万个表吗?假设使用的文件系统是ext4,并且每个表包含的数据非常少,因此超量磁盘存储大小不是问题.问题实际上来自(1)文件系统上有100万个文件的影响,以及(2)pg_catalog中有100万个条目的影响.
从这个线程(2005年),http://postgresql.1045698.n5.nabble.com/GENERAL-Maximum-number-of-tables-per-database-and-slowness-td1853836.html - 它在下面说(但我不要这些天仍然适用多少):
Benjamin Arai写道:
每个数据库当前的最大表数是多少?此外,是否有更多的表以任何方式降低性能?
对于大多数情况,答案是否定的.然而,一旦你接近6个数字表计数,pg_catalog最终会非常庞大.问题是查询计划程序必须为每个查询检查pg_catalog以查看可用的索引,统计信息和值分布是什么等,以便构建最佳计划.在某些时候,一个非常大的pg_catalog会开始让你的系统陷入困境.
...
William Yu <[hidden email]>写道:
Benjamin Arai写道:
每个数据库当前的最大表数是多少?此外,是否有更多的表以任何方式降低性能?
对于大多数情况,答案是否定的.然而,一旦你接近6个数字表计数,pg_catalog最终会非常庞大.
您还必须考虑在数据库目录中包含数万个文件的性能影响.虽然一些较新的文件系统并没有特别担心,但是当目录中有超过几千个条目时,很多人都会陷入查找困境.
最近我安装了Ubuntu 13.04并为其分配了20 GB.系统安装空间小于10 GB.现在,我可以将其缩小到10 GB而不进行格式化吗?这就是说,我不希望在分区中有大的空白空间.
我目前正在为学术目的修补Ext4(只有linux/fs/ext4/*,如file.c,ioctl.c,ext4.h).我正在研究QEMU虚拟机,为了加快整个过程,我选择Ext4作为内核模块进行编译.在测试新的更改时会出现问题,因为即使我运行make modules ARCH=x86 && make modules_install ARCH=x86并重新启动计算机(/是Ext4),除非我重新编译整个内核,否则它们不可见.这有点奇怪,因为我有各种迹象表明Ext4已被编译为模块:
它被配置为:
$ grep EXT4 .config
CONFIG_EXT4_FS=m
Run Code Online (Sandbox Code Playgroud)它确实编译为一个模块:
$ make modules ARCH=x86
(...)
CC [M] fs/ext4/ioctl.o
LD [M] fs/ext4/ext4.o
Building modules, stage 2.
MODPOST 3 modules
LD [M] fs/ext4/ext4.ko
Run Code Online (Sandbox Code Playgroud)后$ make modules_install ARCH=x86在/lib/modules/3.13.3/kernel/fs/文件有适当的时间戳.
最后:
$ lsmod
Module Size Used by
ext4 340817 1
(...)
Run Code Online (Sandbox Code Playgroud)出于某种原因,我必须这样做$ make all ARCH=x86才能看到我的更改出现在运行时中.我错过了什么?谢谢!
我有一个禁用写入缓存的SATA硬盘:
hdparm -W0 /dev/foo
Run Code Online (Sandbox Code Playgroud)
我正在ext4使用这些挂载选项(以及其他)的分区上运行:
data=ordered
auto_da_alloc
Run Code Online (Sandbox Code Playgroud)
Linux内核版本是2.6.32-5-686.
现在,我有一个我无法修改的外部程序,但我知道以下列方式创建一个文件:
int fd = open(path);
write(fd, data, data_size);
close(fd);
Run Code Online (Sandbox Code Playgroud)
即它在关闭之前不会fsync.所以在这一点上,数据可能在RAM中,在kernel/fs缓存中的某个地方.
注意:元数据还不是一个问题:在我确保数据已经到达磁盘盘片之后,最终的元数据将被写入并保存.数据本身就是问题所在.
所以问题是,我如何帮助数据到达实际的磁盘盘片?
我之后想过运行这个单独的程序:
int fd = open(path);
fsync(fd);
close(fd);
Run Code Online (Sandbox Code Playgroud)
这有助于刷新数据,还是应该使用不同的方法?
我在这样的 Linux Ubuntu 14.04-LTS 机器上有一个开发树,具有三个相同的分支:
main -+-- leonardo --- project --- htdocs -+- panel --- index.php
| |
| +- config.php
|
+-- federico --- project --- htdocs -+- panel --- index.php
| |
| +- config.php
|
+-- carlo ------ project --- htdocs -+- panel --- index.php
| |
| +- config.php
..... (you get my drift).
Run Code Online (Sandbox Code Playgroud)
有没有软链接,也没有硬链接。该config.php文件在 svn-ignore 中,并且在所有分支之间都不同
有一个 Apache 服务器,每个开发人员都有一个 virtualHost,所以我可以在http://leonardo.project.local或 Federico 的http://federico.project.local 上看到我的开发版本。
在调查当前的怪异时,这两个文件是:
<?php // this …Run Code Online (Sandbox Code Playgroud) 假设我们有一个FILE_SIZE字节文件,并且:
FILE_SIZE <= min(page_size, physical_block_size);truncate()或追加write());文件只能通过使用以下方法完全覆盖其内容来修改:
pwrite(fd, buf, FILE_SIZE, 0);
是否保证ext4:
对于系统崩溃,此类写入是事务性的吗?
(即,崩溃后文件的内容完全来自先前的写入,我们永远不会看到部分写入或空文件)
第二个是真的吗:
data=ordered?用data=journal或者用单个文件日志启用?
(使用ioctl(fd, EXT4_IOC_SETFLAGS, EXT4_JOURNAL_DATA_FL))
什么时候physical_block_size < FILE_SIZE <= page_size?
2。我看到Perl Time::HiRes模块报告的时间戳有些奇怪的行为.
我有一个获得三个时间戳的脚本:
Time::HiRes::timeTime::HiRes::statTime::HiRes::time我希望订购时间戳1 < 2 < 3,但情况并非总是如此; 通常(但不总是),stat在2.中报告的时间是在 1 之前的时间戳之前.
我在Ext4文件系统上.这是一个实验:
use Time::HiRes qw/ time stat /;
while( 1 ){
# t0
my $t0 = time;
# Create a file
my $f = '/tmp/dummy.test';
open(my $fh, '>', $f) || die;
print $fh "hi\n";
close($fh) || die;
# FS: file modification time, according to the filestystem
my $fs = (stat($f))[9];
# t1
my $t1 = …Run Code Online (Sandbox Code Playgroud) 如何在不需要我的程序等待慢速物理媒体(例如 with fsync)的情况下自动更新文件?
我希望操作系统可以在 RAM 中“缓冲”典型fsync和rename操作,然后在方便时以正确的顺序将它们写入磁盘。
我正在开发在带有ext4文件系统的自定义嵌入式 Linux 环境中运行的软件。该程序定期更新磁盘上的文件。我需要在不牺牲应用程序性能的情况下保持该文件的完整性。
根据我的阅读,安全更新文件的公认做法如下:
fsync() 临时文件 fsync() 包含目录这个过程对我来说很有意义,但在我的特定应用程序中,我想避免对fsync(). 我不在乎数据何时写入磁盘,只要文件始终处于有效状态即可。如果文件已过期,那没关系。
似乎已经有相当多的讨论ext4和正确使用fsync. 如果我理解正确,我可能可以放弃使用fsyncif auto_da_allocis enabled for my filesystem ( link ),但我不相信这是最好的解决方案。
我正在尝试从原始 .img 中解压 android 11 图像/获取信息以获取 selinux 信息、符号链接等。
我正在使用这个很棒的工具:https : //github.com/cubinator/ext4/blob/master/ext4.py35.py
我的代码如下所示:
#!/usr/bin/env python3
import argparse
import sys
import os
import ext4
parser = argparse.ArgumentParser(description='Read <modes, symlinks, contexts and capabilities> from an ext4 image')
parser.add_argument('ext4_image', help='Path to ext4 image to process')
args = parser.parse_args()
exists = os.path.isfile(args.ext4_image)
if not exists:
print("Error: input file " f"[{args.ext4_image}]" " was not found")
sys.exit(1)
file = open(args.ext4_image, "rb")
volume = ext4.Volume(file)
def scan_dir (root_inode, root_path = ""):
for entry_name, entry_inode_idx, entry_type in root_inode.open_dir(): …Run Code Online (Sandbox Code Playgroud) ext4 ×10
linux ×6
filesystems ×4
fsync ×2
linux-kernel ×2
c ×1
diskspace ×1
ext3 ×1
filenames ×1
max ×1
perl ×1
php ×1
postgresql ×1
python ×1
python-3.x ×1
qemu ×1
sata ×1
timestamp ×1
unix ×1