LINUX 查看和修改文件系统的block的大小

查看block的大小

tune2fs-l /dev/sda1 | grep "Block size"     #使用tune方法

这里Linux的“block size”指的是1024 bytes,Linux用1024-byte blocks 作为buffer cache的基本单位。但linux的文件系统的block确不一样。例如ext3,4系统,block size是4096。使用df命令可以查看

例如:

stat -f .       #查看本目录的信息

File:"."

    ID: a333db0bd4c06027 Namelen: 255     Type: ext2/ext3

Blocksize: 4096       Fundamental block size:4096

Blocks:Total: 2409635    Free: 2200914    Available: 2078508

Inodes: Total: 613200     Free: 589791

可以看出,blocksize是4096字节。

结论:ext3,ext4的文件系统,默认的block size是4096字节,一般不用修改。

 

修改block的大小:

创建文件系统时,可以指定块的大小。如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能。将ext2文件系统的块大小调整 为4096byte而不是缺省的1024byte,可以减少文件碎片,加快fsck扫描的速度和文件删除以及读操作的速度。另外,在ext2的文件系统 中,为根目录保留了5%的空间,对一个大的文件系统,除非用作日志文件,5%的比例有些过多。可以使用命令

mke2fs-b 4096 -m 1 /dev/hda6       #将它改为1%并以块大小4096byte创建文件系统。

    使用多大的block,要根据实际工作的需要来确认。如果很多小于4K的小文件,可以考虑修改block的大小。不过由于现在硬盘的容量已经非常的大,而且价格也不是很贵,工作中,就算是邮件服务器的话,小于4K和大于4K的文件的比例也不是很悬殊,所以一般不用去修改。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个完整的 Linux 二级文件系统是一项非常复杂的任务,需要深入了解文件系统的内部工作原理和数据结构。在这里,我只能提供一个基本的框架和一些关键的实现步骤,帮助你更好地理解如何设计一个 Linux 二级文件系统。 1. 文件系统结构 一个典型的 Linux 二级文件系统包含以下组成部分: - 引导块(boot block):存储引导程序和文件系统的基本信息。 - 超级块(super block):存储文件系统的整体信息,如大小、块大小、inode 数量等。 - inode 表(inode table):存储文件和目录的元数据信息,如文件大小、权限、创建时间等。 - 数据块区域(data block area):存储文件的实际内容。 2. 实现步骤 (1)创建一个磁盘映像文件并格式化为 ext2 文件系统。 (2)实现一个简单的解析器,用于解析用户输入的命令。 (3)实现对文件和目录的创建、读取、写入、删除等基本操作。 (4)实现对文件系统的格式化、挂载和卸载操作。 (5)实现对文件系统的扩展和收缩操作。 3. 代码示例 以下是一个简单的 C++ 代码示例,用于实现一个基本的 Linux 二级文件系统: ```c++ #include <iostream> #include <fstream> #include <vector> #include <cstring> using namespace std; // 定义 inode 结构体 struct inode { int index; // 索引号 int size; // 文件大小 int mode; // 文件模式 time_t ctime; // 创建时间 time_t mtime; // 修改时间 int block[12]; // 直接块 int indirect; // 一级间接块 }; // 定义 superblock 结构体 struct superblock { int size; // 文件系统大小 int block_size; // 块大小 int inode_count; // inode 数量 int free_block_count; // 空闲块数量 int free_inode_count; // 空闲 inode 数量 int block_bitmap_size; // 块位图大小 int inode_bitmap_size; // inode 位图大小 int inode_table_size; // inode 表大小 int inode_table_start; // inode 表起始块号 int data_block_start; // 数据块起始块号 }; // 定义文件系统类 class FileSystem { public: FileSystem(string filename, int size, int block_size, int inode_count) { // 初始化文件系统 this->filename = filename; this->size = size; this->block_size = block_size; this->inode_count = inode_count; this->block_count = size / block_size; this->block_bitmap_size = block_count / 8 + 1; this->inode_bitmap_size = inode_count / 8 + 1; this->inode_table_size = inode_count * sizeof(inode) / block_size + 1; this->inode_table_start = 2; this->data_block_start = inode_table_start + inode_table_size; this->free_block_count = block_count - data_block_start + 1; this->free_inode_count = inode_count - 1; // 创建并格式化文件系统 format(); } void format() { // 在磁盘上创建文件系统 ofstream file(filename, ios::binary); if (!file) { cerr << "Error: failed to create file system" << endl; exit(1); } // 初始化超级块 superblock sb; sb.size = size; sb.block_size = block_size; sb.inode_count = inode_count; sb.free_block_count = free_block_count; sb.free_inode_count = free_inode_count; sb.block_bitmap_size = block_bitmap_size; sb.inode_bitmap_size = inode_bitmap_size; sb.inode_table_size = inode_table_size; sb.inode_table_start = inode_table_start; sb.data_block_start = data_block_start; // 写入超级块 file.write((char *)&sb, sizeof(superblock)); // 初始化位图 vector<bool> block_bitmap(block_count, false); vector<bool> inode_bitmap(inode_count, false); block_bitmap[0] = true; inode_bitmap[0] = true; // 写入位图 file.write((char *)&block_bitmap[0], block_bitmap_size); file.write((char *)&inode_bitmap[0], inode_bitmap_size); // 初始化 inode 表 vector<inode> inode_table(inode_count, {0}); // 写入 inode 表 file.seekp(inode_table_start * block_size, ios::beg); file.write((char *)&inode_table[0], inode_table_size * block_size); // 关闭文件 file.close(); } private: string filename; // 文件名 int size; // 文件系统大小 int block_size; // 块大小 int inode_count; // inode 数量 int block_count; // 块数量 int block_bitmap_size; // 块位图大小 int inode_bitmap_size; // inode 位图大小 int inode_table_size; // inode 表大小 int inode_table_start; // inode 表起始块号 int data_block_start; // 数据块起始块号 int free_block_count; // 空闲块数量 int free_inode_count; // 空闲 inode 数量 }; int main() { FileSystem fs("filesystem.bin", 1024 * 1024, 4096, 1024); return 0; } ``` 这只是一个简单的示例,实际的文件系统实现要比这复杂得多。对于初学者来说,最好从简单的操作开始,逐步增加功能和特性,并逐步深入了解文件系统的内部工作原理和数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值